Home | History | Annotate | Download | only in amd64-linux
      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