]> Cypherpunks repositories - gostls13.git/commitdiff
safety checks, waiting for gri's real tracking of PC and SP
authorRob Pike <r@golang.org>
Tue, 24 Jun 2008 03:12:39 +0000 (20:12 -0700)
committerRob Pike <r@golang.org>
Tue, 24 Jun 2008 03:12:39 +0000 (20:12 -0700)
extant code is too fragile

SVN=124223

src/runtime/rt0_amd64_darwin.s
src/runtime/rt1_amd64_darwin.c

index 16592b90ae28c565def384971ebc0ba41c337fb9..fcd86b9879c760d301f38fb201714a125c9783af 100644 (file)
@@ -64,7 +64,7 @@ TEXT  sys_sigaction(SB),1,$-8
        CALL    notok(SB)
        RET
 
-TEXT sigtramp(SB),1,$-24
+TEXT sigtramp(SB),1,$24
        MOVL    DX,0(SP)
        MOVQ    CX,8(SP)
        MOVQ    R8,16(SP)
index c24b40fae5bb53dc649df0e3dbe04ffaacd05320..94d27ee70e10ce15167e696b2b865c8e9413d679 100644 (file)
@@ -39,6 +39,7 @@ typedef struct  sigaction {
 void
 sighandler(int32 sig, siginfo* info, void** context) {
        int32 i;
+       void *pc, *sp;
 
        if(sig < 0 || sig >= NSIG){
                prints("Signal ");
@@ -46,14 +47,18 @@ sighandler(int32 sig, siginfo* info, void** context) {
        }else{
                prints(sigtab[sig].name);
        }
+
        prints("\nFaulting address: 0x");
        sys_printpointer(info->si_addr);
        prints("\nPC: 0x");
-       sys_printpointer(((void**)((&sig)+1))[22]);
+       pc = ((void**)((&sig)+1))[22];
+       sys_printpointer(pc);
        prints("\nSP: 0x");
-       sys_printpointer(((void**)((&sig)+1))[13]);
+       sp = ((void**)((&sig)+1))[13];
+       sys_printpointer(sp);
        prints("\n");
-       traceback(((void**)((&sig)+1))[22], ((void**)((&sig)+1))[13]);  /* empirically discovered locations */
+       if (pc != 0 && sp != 0)
+               traceback(pc, sp);      /* empirically discovered locations */
        sys_exit(2);
 }