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;
 }
