1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
#if SIZEOF_LONG == 4
#if defined(__PPC__)
#define SET_STACK_POINTER "addi %%r1,%0,0\n\t"
#elif defined(__m68k__)
#define SET_STACK_POINTER "movel %0,%%sp\n\t"
#elif defined(__i386__)
#define SET_STACK_POINTER "mov %0,%%esp\n\t"
#elif defined(__ILP32__) && defined(__x86_64__)
#define SET_STACK_POINTER "mov %0,%%esp\n\t"
#elif defined(__arm__)
#define SET_STACK_POINTER "mov %%sp,%0\n\t"
#elif defined(__hppa__)
#define SET_STACK_POINTER "copy %0,%%sp\n\t"
#elif defined(__SH4__)
#define SET_STACK_POINTER "mov %0,r15\n\t"
#endif
#define FIXED_STACK (1UL<<23)/*FIXME configure?*/
#if defined(__SH4__)/*FIXME is this just due to qemu?*/
#define CTOP (void *)0x80000000
#define SS FIXED_STACK
#elif defined(__gnu_hurd__)
#define CTOP (void *)0xc0000000
#define SS FIXED_STACK
#define MAP_GROWSDOWN 0
#define MAP_STACK 0
#else
#define CTOP (void *)0xc0000000/*FIXME configure?*/
#define SS getpagesize()
#endif
#ifdef SET_STACK_POINTER
{
void *p,*p1,*b,*s;
int a,f=MAP_FIXED|MAP_PRIVATE|MAP_ANON|MAP_STACK;
int ss=
#ifdef CHECK_FOR_QEMU
qemu_p() ? FIXED_STACK :
#endif
SS;
p=alloca(1);
p1=alloca(1);
b=CTOP-(p1<p ? ss : FIXED_STACK);
a=p1<p ? p-p1 : p1-p;
a<<=2;
s=p1<p ? CTOP-a : b+a;
if (p1<p) f|=MAP_GROWSDOWN;
if (p > CTOP || p < b) {
if (mmap(b,ss,PROT_READ|PROT_WRITE|PROT_EXEC,f,-1,0)!=(void *)-1) {
stack_map_base=b;
asm volatile (SET_STACK_POINTER::"r" (s):"memory");
if (p1>p)
mmap(CTOP,getpagesize(),PROT_NONE,f,-1,0);/*guard page*/
}
}
}
#endif
#endif
|