48 lines
1 KiB
Text
48 lines
1 KiB
Text
|
Relax siginfo_t si_addr check, sparc64 only provides page granularity.
|
||
|
|
||
|
Index: EnginePl/try_sigaction.c
|
||
|
--- EnginePl/try_sigaction.c.orig
|
||
|
+++ EnginePl/try_sigaction.c
|
||
|
@@ -51,6 +51,7 @@
|
||
|
* si_addr is wrong for SIGBUS :-(
|
||
|
*/
|
||
|
#define BAD_ADDR ((int *) 0x2EA4F0)
|
||
|
+int *bad_addr;
|
||
|
|
||
|
void
|
||
|
SIGSEGV_Handler(int sig, siginfo_t * sip)
|
||
|
@@ -59,7 +60,7 @@ SIGSEGV_Handler(int sig, siginfo_t * sip)
|
||
|
#if 0
|
||
|
printf("bad addr: %p\n", addr);
|
||
|
#endif
|
||
|
- _exit(addr != BAD_ADDR);
|
||
|
+ _exit(addr != bad_addr);
|
||
|
}
|
||
|
|
||
|
|
||
|
@@ -68,6 +69,7 @@ int
|
||
|
main(int argc, char *argv[])
|
||
|
{
|
||
|
struct sigaction act;
|
||
|
+ long page_size;
|
||
|
|
||
|
act.sa_handler = NULL;
|
||
|
act.sa_sigaction = (void (*)()) SIGSEGV_Handler;
|
||
|
@@ -79,7 +81,15 @@ main(int argc, char *argv[])
|
||
|
sigaction(SIGBUS, &act, NULL);
|
||
|
#endif
|
||
|
|
||
|
- *BAD_ADDR = 128;
|
||
|
+ bad_addr = BAD_ADDR;
|
||
|
+ /*
|
||
|
+ * some architectures can't provide more then page-level
|
||
|
+ * granularity.
|
||
|
+ */
|
||
|
+ if ((page_size = sysconf(_SC_PAGESIZE)) != -1L)
|
||
|
+ bad_addr = (int *)((long)BAD_ADDR & ~(page_size - 1));
|
||
|
+
|
||
|
+ *bad_addr = 128;
|
||
|
|
||
|
return 1;
|
||
|
}
|