1
0
mirror of https://github.com/golang/go synced 2024-11-25 03:27:58 -07:00

FreeBSD's mcontext isn't exactly the same as sigcontext, so

we can't use them interchangably.

R=rsc, wjosephson
CC=golang-dev
https://golang.org/cl/156113
This commit is contained in:
Devon H. O'Dell 2009-11-20 13:08:16 -08:00 committed by Russ Cox
parent 7763345379
commit 7ada6018a7
5 changed files with 43 additions and 122 deletions

View File

@ -124,37 +124,4 @@ struct Ucontext {
int32 __spare__[4]; int32 __spare__[4];
byte pad0[12]; byte pad0[12];
}; };
typedef struct Sigcontext Sigcontext;
struct Sigcontext {
Sigset sc_mask;
int32 sc_onstack;
int32 sc_gs;
int32 sc_fs;
int32 sc_es;
int32 sc_ds;
int32 sc_edi;
int32 sc_esi;
int32 sc_ebp;
int32 sc_isp;
int32 sc_ebx;
int32 sc_edx;
int32 sc_ecx;
int32 sc_eax;
int32 sc_trapno;
int32 sc_err;
int32 sc_eip;
int32 sc_cs;
int32 sc_efl;
int32 sc_esp;
int32 sc_ss;
int32 sc_len;
int32 sc_fpformat;
int32 sc_ownedfp;
int32 sc_spare1[1];
int32 sc_fpstate[128];
int32 sc_fsbase;
int32 sc_gsbase;
int32 sc_spare2[6];
};
#pragma pack off #pragma pack off

View File

@ -15,21 +15,21 @@ typedef struct sigaction {
} Sigaction; } Sigaction;
void void
dumpregs(Sigcontext *r) dumpregs(Mcontext *r)
{ {
printf("eax %x\n", r->sc_eax); printf("eax %x\n", r->mc_eax);
printf("ebx %x\n", r->sc_ebx); printf("ebx %x\n", r->mc_ebx);
printf("ecx %x\n", r->sc_ecx); printf("ecx %x\n", r->mc_ecx);
printf("edx %x\n", r->sc_edx); printf("edx %x\n", r->mc_edx);
printf("edi %x\n", r->sc_edi); printf("edi %x\n", r->mc_edi);
printf("esi %x\n", r->sc_esi); printf("esi %x\n", r->mc_esi);
printf("ebp %x\n", r->sc_ebp); printf("ebp %x\n", r->mc_ebp);
printf("esp %x\n", r->sc_esp); printf("esp %x\n", r->mc_esp);
printf("eip %x\n", r->sc_eip); printf("eip %x\n", r->mc_eip);
printf("eflags %x\n", r->sc_efl); printf("eflags %x\n", r->mc_eflags);
printf("cs %x\n", r->sc_cs); printf("cs %x\n", r->mc_cs);
printf("fs %x\n", r->sc_fsbase); printf("fs %x\n", r->mc_fs);
printf("gs %x\n", r->sc_gsbase); printf("gs %x\n", r->mc_gs);
} }
void void
@ -37,7 +37,6 @@ sighandler(int32 sig, Siginfo* info, void* context)
{ {
Ucontext *uc; Ucontext *uc;
Mcontext *mc; Mcontext *mc;
Sigcontext *sc;
if(panicking) // traceback already printed if(panicking) // traceback already printed
exit(2); exit(2);
@ -45,7 +44,6 @@ sighandler(int32 sig, Siginfo* info, void* context)
uc = context; uc = context;
mc = &uc->uc_mcontext; mc = &uc->uc_mcontext;
sc = (Sigcontext*)mc; // same layout, more conveient names
if(sig < 0 || sig >= NSIG) if(sig < 0 || sig >= NSIG)
printf("Signal %d\n", sig); printf("Signal %d\n", sig);
@ -53,13 +51,13 @@ sighandler(int32 sig, Siginfo* info, void* context)
printf("%s\n", sigtab[sig].name); printf("%s\n", sigtab[sig].name);
printf("Faulting address: %p\n", info->si_addr); printf("Faulting address: %p\n", info->si_addr);
printf("PC=%X\n", sc->sc_eip); printf("PC=%X\n", mc->mc_eip);
printf("\n"); printf("\n");
if(gotraceback()){ if(gotraceback()){
traceback((void*)sc->sc_eip, (void*)sc->sc_esp, m->curg); traceback((void*)sc->sc_eip, (void*)mc->mc_esp, m->curg);
tracebackothers(m->curg); tracebackothers(m->curg);
dumpregs(sc); dumpregs(mc);
} }
breakpoint(); breakpoint();

View File

@ -135,45 +135,4 @@ struct Ucontext {
int32 __spare__[4]; int32 __spare__[4];
byte pad0[12]; byte pad0[12];
}; };
typedef struct Sigcontext Sigcontext;
struct Sigcontext {
Sigset sc_mask;
int64 sc_onstack;
int64 sc_rdi;
int64 sc_rsi;
int64 sc_rdx;
int64 sc_rcx;
int64 sc_r8;
int64 sc_r9;
int64 sc_rax;
int64 sc_rbx;
int64 sc_rbp;
int64 sc_r10;
int64 sc_r11;
int64 sc_r12;
int64 sc_r13;
int64 sc_r14;
int64 sc_r15;
int32 sc_trapno;
int16 sc_fs;
int16 sc_gs;
int64 sc_addr;
int32 sc_flags;
int16 sc_es;
int16 sc_ds;
int64 sc_err;
int64 sc_rip;
int64 sc_cs;
int64 sc_rflags;
int64 sc_rsp;
int64 sc_ss;
int64 sc_len;
int64 sc_fpformat;
int64 sc_ownedfp;
int64 sc_fpstate[64];
int64 sc_fsbase;
int64 sc_gsbase;
int64 sc_spare[6];
};
#pragma pack off #pragma pack off

View File

@ -15,29 +15,29 @@ typedef struct sigaction {
} Sigaction; } Sigaction;
void void
dumpregs(Sigcontext *r) dumpregs(Mcontext *r)
{ {
printf("rax %X\n", r->sc_rax); printf("rax %X\n", r->mc_rax);
printf("rbx %X\n", r->sc_rbx); printf("rbx %X\n", r->mc_rbx);
printf("rcx %X\n", r->sc_rcx); printf("rcx %X\n", r->mc_rcx);
printf("rdx %X\n", r->sc_rdx); printf("rdx %X\n", r->mc_rdx);
printf("rdi %X\n", r->sc_rdi); printf("rdi %X\n", r->mc_rdi);
printf("rsi %X\n", r->sc_rsi); printf("rsi %X\n", r->mc_rsi);
printf("rbp %X\n", r->sc_rbp); printf("rbp %X\n", r->mc_rbp);
printf("rsp %X\n", r->sc_rsp); printf("rsp %X\n", r->mc_rsp);
printf("r8 %X\n", r->sc_r8 ); printf("r8 %X\n", r->mc_r8 );
printf("r9 %X\n", r->sc_r9 ); printf("r9 %X\n", r->mc_r9 );
printf("r10 %X\n", r->sc_r10); printf("r10 %X\n", r->mc_r10);
printf("r11 %X\n", r->sc_r11); printf("r11 %X\n", r->mc_r11);
printf("r12 %X\n", r->sc_r12); printf("r12 %X\n", r->mc_r12);
printf("r13 %X\n", r->sc_r13); printf("r13 %X\n", r->mc_r13);
printf("r14 %X\n", r->sc_r14); printf("r14 %X\n", r->mc_r14);
printf("r15 %X\n", r->sc_r15); printf("r15 %X\n", r->mc_r15);
printf("rip %X\n", r->sc_rip); printf("rip %X\n", r->mc_rip);
printf("rflags %X\n", r->sc_flags); printf("rflags %X\n", r->mc_flags);
printf("cs %X\n", (uint64)r->sc_cs); printf("cs %X\n", r->mc_cs);
printf("fs %X\n", (uint64)r->sc_fsbase); printf("fs %X\n", r->mc_fs);
printf("gs %X\n", (uint64)r->sc_gsbase); printf("gs %X\n", r->mc_gs);
} }
void void
@ -45,7 +45,6 @@ sighandler(int32 sig, Siginfo* info, void* context)
{ {
Ucontext *uc; Ucontext *uc;
Mcontext *mc; Mcontext *mc;
Sigcontext *sc;
if(panicking) // traceback already printed if(panicking) // traceback already printed
exit(2); exit(2);
@ -53,7 +52,6 @@ sighandler(int32 sig, Siginfo* info, void* context)
uc = context; uc = context;
mc = &uc->uc_mcontext; mc = &uc->uc_mcontext;
sc = (Sigcontext*)mc; // same layout, more conveient names
if(sig < 0 || sig >= NSIG) if(sig < 0 || sig >= NSIG)
printf("Signal %d\n", sig); printf("Signal %d\n", sig);
@ -61,13 +59,13 @@ sighandler(int32 sig, Siginfo* info, void* context)
printf("%s\n", sigtab[sig].name); printf("%s\n", sigtab[sig].name);
printf("Faulting address: %p\n", info->si_addr); printf("Faulting address: %p\n", info->si_addr);
printf("PC=%X\n", sc->sc_rip); printf("PC=%X\n", mc->mc_rip);
printf("\n"); printf("\n");
if(gotraceback()){ if(gotraceback()){
traceback((void*)sc->sc_rip, (void*)sc->sc_rsp, (void*)sc->sc_r15); traceback((void*)mc->mc_rip, (void*)mc->mc_rsp, (void*)mc->mc_r15);
tracebackothers((void*)sc->sc_r15); tracebackothers((void*)mc->mc_r15);
dumpregs(sc); dumpregs(mc);
} }
breakpoint(); breakpoint();

View File

@ -50,4 +50,3 @@ typedef siginfo_t $Siginfo;
typedef mcontext_t $Mcontext; typedef mcontext_t $Mcontext;
typedef ucontext_t $Ucontext; typedef ucontext_t $Ucontext;
typedef struct sigcontext $Sigcontext;