]> Cypherpunks repositories - gostls13.git/commitdiff
- dump registers in case of signal (linux)
authorRobert Griesemer <gri@golang.org>
Thu, 26 Jun 2008 00:07:22 +0000 (17:07 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 26 Jun 2008 00:07:22 +0000 (17:07 -0700)
SVN=124702

src/runtime/rt1_amd64_darwin.c
src/runtime/rt1_amd64_linux.c
test/golden.out

index 4603b792cf97e6b1829298f2452ed7d8bbb03723..b39c298ee75a4f6993f3b35b2a5dcc982f2933ed 100644 (file)
@@ -8,7 +8,7 @@
 
 typedef uint64 __uint64_t;
 
-// From /usr/include/mach/i386/_structs.h
+/* From /usr/include/mach/i386/_structs.h */
 #define        _STRUCT_X86_THREAD_STATE64      struct __darwin_x86_thread_state64
 _STRUCT_X86_THREAD_STATE64
 {
@@ -64,7 +64,7 @@ print_thread_state(_STRUCT_X86_THREAD_STATE64* ss)
 }
 
 
-/* Code generated via: g++ -m64 signals.cc && a.out */
+/* Code generated via: g++ -m64 gen_signals_support.cc && a.out */
 
 static void *adr_at(void *ptr, int32 offs) {
   return (void *)((uint8 *)ptr + offs);
@@ -119,16 +119,18 @@ typedef struct siginfo {
        /* more stuff here */
 } siginfo;
 
+
 typedef struct  sigaction {
        union {
-               void    (*sa_handler)(int32);
-               void    (*sa_sigaction)(int32, siginfo *, void *);
-       } u;                 /* signal handler */
-       void    (*sa_trampoline)(void); /* kernel callback point; calls sighandler() */
-       uint8 sa_mask[4];                    /* signal mask to apply */
-       int32     sa_flags;                  /* see signal options below */
+               void (*sa_handler)(int32);
+               void (*sa_sigaction)(int32, siginfo *, void *);
+       } u;                            /* signal handler */
+       void (*sa_trampoline)(void);    /* kernel callback point; calls sighandler() */
+       uint8 sa_mask[4];               /* signal mask to apply */
+       int32 sa_flags;                 /* see signal options below */
 } sigaction;
 
+
 void
 sighandler(int32 sig, siginfo *info, void *context)
 {
@@ -152,6 +154,7 @@ sighandler(int32 sig, siginfo *info, void *context)
        sys·exit(2);
 }
 
+
 sigaction a;
 extern void sigtramp(void);
 
index 6c187a44efffbc9947d4b79fcdd262f03dbaddbf..e7dfbc79b45e5a014f817f5fbfd69a300459338f 100644 (file)
@@ -5,6 +5,101 @@
 #include "runtime.h"
 #include "signals.h"
 
+/* From /usr/include/asm-x86_64/sigcontext.h */
+struct _fpstate {
+  uint16   cwd;
+  uint16   swd;
+  uint16   twd;    /* Note this is not the same as the 32bit/x87/FSAVE twd */
+  uint16   fop;
+  uint64   rip;
+  uint32   rdp;
+  uint32   mxcsr;
+  uint32   mxcsr_mask;
+  uint32   st_space[32];   /* 8*16 bytes for each FP-reg */
+  uint32   xmm_space[64];  /* 16*16 bytes for each XMM-reg  */
+  uint32   reserved2[24];
+};
+
+struct sigcontext {
+  uint64 r8;
+  uint64 r9;
+  uint64 r10;
+  uint64 r11;
+  uint64 r12;
+  uint64 r13;
+  uint64 r14;
+  uint64 r15;
+  uint64 rdi;
+  uint64 rsi;
+  uint64 rbp;
+  uint64 rbx;
+  uint64 rdx;
+  uint64 rax;
+  uint64 rcx;
+  uint64 rsp;
+  uint64 rip;
+  uint64 eflags;           /* RFLAGS */
+  uint16 cs;
+  uint16 gs;
+  uint16 fs;
+  uint16 __pad0;
+  uint64 err;
+  uint64 trapno;
+  uint64 oldmask;
+  uint64 cr2;
+  struct _fpstate *fpstate;       /* zero when no FPU context */
+  uint64 reserved1[8];
+};
+
+
+/* From /usr/include/asm-x86_64/signal.h */
+typedef struct sigaltstack {
+       void /*__user*/ *ss_sp;
+       int32 ss_flags;
+       uint64 ss_size;
+} stack_t;
+
+typedef uint64 sigset_t;
+
+
+/* From /usr/include/asm-x86_64/ucontext.h */
+struct ucontext {
+  uint64            uc_flags;
+  struct ucontext  *uc_link;
+  stack_t           uc_stack;
+  struct sigcontext uc_mcontext;
+  sigset_t          uc_sigmask;   /* mask last for extensibility */
+};
+
+
+void
+print_sigcontext(struct sigcontext *sc)
+{
+       prints("\nrax     0x");  sys·printpointer((void*)sc->rax);
+       prints("\nrbx     0x");  sys·printpointer((void*)sc->rbx);
+       prints("\nrcx     0x");  sys·printpointer((void*)sc->rcx);
+       prints("\nrdx     0x");  sys·printpointer((void*)sc->rdx);
+       prints("\nrdi     0x");  sys·printpointer((void*)sc->rdi);
+       prints("\nrsi     0x");  sys·printpointer((void*)sc->rsi);
+       prints("\nrbp     0x");  sys·printpointer((void*)sc->rbp);
+       prints("\nrsp     0x");  sys·printpointer((void*)sc->rsp);
+       prints("\nr8      0x");  sys·printpointer((void*)sc->r8 );
+       prints("\nr9      0x");  sys·printpointer((void*)sc->r9 );
+       prints("\nr10     0x");  sys·printpointer((void*)sc->r10);
+       prints("\nr11     0x");  sys·printpointer((void*)sc->r11);
+       prints("\nr12     0x");  sys·printpointer((void*)sc->r12);
+       prints("\nr13     0x");  sys·printpointer((void*)sc->r13);
+       prints("\nr14     0x");  sys·printpointer((void*)sc->r14);
+       prints("\nr15     0x");  sys·printpointer((void*)sc->r15);
+       prints("\nrip     0x");  sys·printpointer((void*)sc->rip);
+       prints("\nrflags  0x");  sys·printpointer((void*)sc->eflags);
+       prints("\ncs      0x");  sys·printpointer((void*)sc->cs);
+       prints("\nfs      0x");  sys·printpointer((void*)sc->fs);
+       prints("\ngs      0x");  sys·printpointer((void*)sc->gs);
+       prints("\n");
+}
+
+
 /*
  * This assembler routine takes the args from registers, puts them on the stack,
  * and calls sighandler().
@@ -15,6 +110,7 @@ extern void sigtramp();
  * Rudimentary reverse-engineered definition of signal interface.
  * You'd think it would be documented.
  */
+/* From /usr/include/bits/siginfo.h */
 typedef struct siginfo {
        int32   si_signo;               /* signal number */
        int32   si_errno;               /* errno association */
@@ -24,18 +120,23 @@ typedef struct siginfo {
        /* more stuff here */
 } siginfo;
 
-typedef struct  sigaction {
+
+/* From /usr/include/bits/sigaction.h */
+/* (gri) Is this correct? See e.g. /usr/include/asm-x86_64/signal.h */
+typedef struct sigaction {
        union {
-               void    (*sa_handler)(int32);
-               void    (*sa_sigaction)(int32, siginfo *, void *);
-       } u;                 /* signal handler */
-       uint8 sa_mask[128];                  /* signal mask to apply. 128? are they MORONS? */
-       int32     sa_flags;                  /* see signal options below */
+               void (*sa_handler)(int32);
+               void (*sa_sigaction)(int32, siginfo *, void *);
+       } u;                            /* signal handler */
+       uint8 sa_mask[128];             /* signal mask to apply. 128? are they MORONS? */
+       int32 sa_flags;                 /* see signal options below */
        void (*sa_restorer) (void);     /* unused here; needed to return from trap? */
 } sigaction;
 
+
 void
-sighandler(int32 sig, siginfo* info, void** context) {
+sighandler(int32 sig, siginfo* info, void** context)
+{
        int32 i;
 
        if(sig < 0 || sig >= NSIG){
@@ -44,18 +145,21 @@ 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(context[21]);
-       prints("\nSP: 0x");
-       sys·printpointer(context[20]);
-       prints("\n");
-       traceback(context[21], context[20]);    /* empirically discovered locations */
+        
+        struct sigcontext *sc = &(((struct ucontext *)context)->uc_mcontext);
+        
+        prints("\nFaulting address: 0x");  sys·printpointer(info->si_addr);
+        prints("\npc: 0x");  sys·printpointer((void *)sc->rip);
+        prints("\n\n");
+        
+       traceback((void *)sc->rip, (void *)sc->rsp);
+        print_sigcontext(sc);
+
        sys·breakpoint();
        sys·exit(2);
 }
 
+
 sigaction a;
 
 void
@@ -63,11 +167,11 @@ initsig(void)
 {
        int32 i;
        a.u.sa_sigaction = (void*)sigtramp;
-       a.sa_flags |= 0x04;  /* SA_SIGINFO */
+       a.sa_flags = 0x04;  /* SA_SIGINFO */
        for(i=0; i<sizeof(a.sa_mask); i++)
                a.sa_mask[i] = 0xFF;
 
-       for(i = 0; i <NSIG; i++)
+       for(i = 0; i<NSIG; i++)
                if(sigtab[i].catch){
                        sys·rt_sigaction(i, &a, (void*)0, 8);
                }
index 0533f86bc1d56f3f71d6470a1cb0dffdb6dfecaf..072522f2e40b82f1088c759c3ef0217e2f061338 100644 (file)
@@ -1,5 +1,11 @@
 
 =========== ./args.go
+argc
+panic on line 171 PC=0x150c
+0x150c?zi
+       mainM-BM-7main(0, 0, 0, ...)
+       mainM-BM-7main(0x0, 0x0, 0x3, ...)
+0x12e5?zi
 
 =========== ./char_lit.go
 
@@ -170,7 +176,7 @@ bugs/bug025.go:7: fatal error: dumpexportvar: oname nil: Foo
 BUG: known to fail incorrectly or at least with a bad message
 
 =========== bugs/bug026.go
-traceback: main·sigs_I: not defined
+traceback: mainM-BM-7sigs_I: not defined
 BUG: known to fail incorrectly
 
 =========== bugs/bug027.go
@@ -262,6 +268,36 @@ bugs/bug051.go:10: fatal error: too many errors
 BUG: infinite loop in error reporting
 
 =========== bugs/bug052.go
+SIGSEGV: segmentation violation
+Faulting address: 0x1
+pc: 0x152c
+
+0x152c?zi
+       mainM-BM-7main(0, 0, 0, ...)
+       mainM-BM-7main(0x0, 0x0, 0x1, ...)
+0x12e5?zi
+
+rax     0x1
+rbx     0x7
+rcx     0x7fffffffe8f8
+rdx     0x3
+rdi     0x7fffffffe920
+rsi     0x5b00
+rbp     0x7fffffffe938
+rsp     0x7fffffffe8f0
+r8      0x0
+r9      0x0
+r10     0x8
+r11     0x202
+r12     0x0
+r13     0x0
+r14     0x0
+r15     0x0
+rip     0x152c
+rflags  0x10202
+cs      0x33
+fs      0x0
+gs      0x0
 BUG: incorrect code for division
 
 =========== bugs/bug053.go