1 
2 #include <stdio.h>
3 
4 
5 #define COMPILER_BARRIER  __asm__ __volatile("":::"cc","memory")
6 
7 /* force the kernel to map in 15k below SP, so we can safely poke
8    around there. */
9 __attribute__((noinline)) void make_below_sp_safe ( void )
10 {
11    const int N = 15000;
12    unsigned char a[N];
13    int i;
14 
15    for (i = 0; i < N; i++) {
16       a[i] = i & 0xFF;
17    }
18 
19    COMPILER_BARRIER;
20 
21    unsigned int r = 0;
22    for (i = 0; i < N; i++) {
23       r = (r << 1) | (r >> 31);
24       r ^= (unsigned int)a[i];
25    }
26    fprintf(stderr, "Checksum: %08x\n", r);
27 }
28 
29 
30 int main ( void )
31 {
32    make_below_sp_safe();
33 
34    unsigned int res;
35    __asm__ __volatile__("movl -8192(%%rsp), %0"
36                         : "=r"(res) : : "memory","cc");
37    fprintf(stderr, "Got %08x\n", res);
38    return 0;
39 }
40