291 |
|
|
292 |
#ifdef AV |
#ifdef AV |
293 |
|
|
294 |
cs_limit = cs_base + CSTACK_DIRECTION * cssize/sizeof(*cs_base); |
cs_limit = (void *)CSTACK_ADDRESS + CSTACK_DIRECTION * cssize; |
295 |
#endif |
#endif |
296 |
|
|
297 |
|
|
644 |
FEerror("Invocation history stack overflow.", 0); |
FEerror("Invocation history stack overflow.", 0); |
645 |
} |
} |
646 |
|
|
647 |
|
|
648 |
void |
void |
649 |
segmentation_catcher(int i, long code, void *scp, char *addr) { |
segmentation_catcher(int i, long code, void *scp, char *addr) { |
650 |
|
|
651 |
void *faddr; |
void *faddr; |
652 |
faddr=((siginfo_t *)code)->si_addr; |
faddr=GET_FAULT_ADDR(sig,code,scp,addr); |
653 |
|
|
654 |
#if CSTACK_DIRECTION == -1 |
#if CSTACK_DIRECTION == -1 |
655 |
if (faddr < (void *)cs_limit) /*FIXME, perhaps bound by nearest page here.*/ |
if (faddr < (void *)cs_limit && (void *)cs_limit-faddr <= PAGESIZE) /*FIXME, perhaps bound by nearest page here.*/ |
656 |
#else |
#else |
657 |
if (faddr > (void *)cs_limit) |
if (faddr > (void *)cs_limit && faddr-(void *)cs_limit <= PAGESIZE) |
658 |
#endif |
#endif |
659 |
FEerror("Control stack overflow.",0); /*FIXME -- provide getrlimit here.*/ |
FEerror("Control stack overflow.",0); /*FIXME -- provide getrlimit here.*/ |
660 |
else |
else |
764 |
#else |
#else |
765 |
if (&arg < cs_base + cssize/sizeof(*cs_base) - 16) |
if (&arg < cs_base + cssize/sizeof(*cs_base) - 16) |
766 |
#endif |
#endif |
767 |
cs_limit = cs_base + CSTACK_DIRECTION * cssize/sizeof(*cs_base); |
cs_limit = (void *)CSTACK_ADDRESS + CSTACK_DIRECTION * cssize; |
768 |
else |
else |
769 |
error ( "can't reset cs_limit" ); |
error ( "can't reset cs_limit" ); |
770 |
} |
} |