Commit d03e8b22 authored by Ian Lance Taylor's avatar Ian Lance Taylor

runtime: record current PC for SIGPROF on non-Go thread

If we get a SIGPROF on a non-Go thread, and the program has not called
runtime.SetCgoTraceback so we have no way to collect a stack trace, then
record a profile that is just the PC where the signal occurred. That
will at least point the user to the right area.

Retrieving the PC from the sigctxt in a signal handler on a non-G thread
required marking a number of trivial sigctxt methods as nosplit, and,
for extra safety, nowritebarrierrec.

The test shows that the existing test CgoPprofThread test does not test
the stack trace, just the profile signal. Leaving that for later.

Change-Id: I8f8f3ff09ac099fc9d9df94b5a9d210ffc20c4ab
Reviewed-on: https://go-review.googlesource.com/30252
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
parent c24cc400
...@@ -311,6 +311,10 @@ func TestCgoPprofThread(t *testing.T) { ...@@ -311,6 +311,10 @@ func TestCgoPprofThread(t *testing.T) {
testCgoPprof(t, "", "CgoPprofThread") testCgoPprof(t, "", "CgoPprofThread")
} }
func TestCgoPprofThreadNoTraceback(t *testing.T) {
testCgoPprof(t, "", "CgoPprofThreadNoTraceback")
}
func TestRaceProf(t *testing.T) { func TestRaceProf(t *testing.T) {
if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH) t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH)
......
...@@ -28,7 +28,10 @@ type sigctxt struct { ...@@ -28,7 +28,10 @@ type sigctxt struct {
u *ureg u *ureg
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uintptr { return uintptr(c.u.pc) } func (c *sigctxt) pc() uintptr { return uintptr(c.u.pc) }
func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) } func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) }
func (c *sigctxt) lr() uintptr { return uintptr(0) } func (c *sigctxt) lr() uintptr { return uintptr(0) }
......
...@@ -37,7 +37,10 @@ type sigctxt struct { ...@@ -37,7 +37,10 @@ type sigctxt struct {
u *ureg u *ureg
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uintptr { return uintptr(c.u.ip) } func (c *sigctxt) pc() uintptr { return uintptr(c.u.ip) }
func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) } func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) }
func (c *sigctxt) lr() uintptr { return uintptr(0) } func (c *sigctxt) lr() uintptr { return uintptr(0) }
......
...@@ -31,7 +31,10 @@ type sigctxt struct { ...@@ -31,7 +31,10 @@ type sigctxt struct {
u *ureg u *ureg
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uintptr { return uintptr(c.u.pc) } func (c *sigctxt) pc() uintptr { return uintptr(c.u.pc) }
func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) } func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) }
func (c *sigctxt) lr() uintptr { return uintptr(c.u.link) } func (c *sigctxt) lr() uintptr { return uintptr(c.u.link) }
......
...@@ -3194,7 +3194,8 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) { ...@@ -3194,7 +3194,8 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
var sigprofCallers cgoCallers var sigprofCallers cgoCallers
var sigprofCallersUse uint32 var sigprofCallersUse uint32
// Called if we receive a SIGPROF signal on a non-Go thread. // sigprofNonGo is called if we receive a SIGPROF signal on a non-Go thread,
// and the signal handler collected a stack trace in sigprofCallers.
// When this is called, sigprofCallersUse will be non-zero. // When this is called, sigprofCallersUse will be non-zero.
// g is nil, and what we can do is very limited. // g is nil, and what we can do is very limited.
//go:nosplit //go:nosplit
...@@ -3207,17 +3208,41 @@ func sigprofNonGo() { ...@@ -3207,17 +3208,41 @@ func sigprofNonGo() {
} }
// Simple cas-lock to coordinate with setcpuprofilerate. // Simple cas-lock to coordinate with setcpuprofilerate.
if atomic.Cas(&prof.lock, 0, 1) { for !atomic.Cas(&prof.lock, 0, 1) {
if prof.hz != 0 { osyield()
cpuprof.addNonGo(sigprofCallers[:n])
}
atomic.Store(&prof.lock, 0)
} }
if prof.hz != 0 {
cpuprof.addNonGo(sigprofCallers[:n])
}
atomic.Store(&prof.lock, 0)
} }
atomic.Store(&sigprofCallersUse, 0) atomic.Store(&sigprofCallersUse, 0)
} }
// sigprofNonGoPC is called when a profiling signal arrived on a
// non-Go thread and we have a single PC value, not a stack trace.
// g is nil, and what we can do is very limited.
//go:nosplit
//go:nowritebarrierrec
func sigprofNonGoPC(pc uintptr) {
if prof.hz != 0 {
pc := []uintptr{
pc,
funcPC(_ExternalCode) + sys.PCQuantum,
}
// Simple cas-lock to coordinate with setcpuprofilerate.
for !atomic.Cas(&prof.lock, 0, 1) {
osyield()
}
if prof.hz != 0 {
cpuprof.addNonGo(pc)
}
atomic.Store(&prof.lock, 0)
}
}
// Reports whether a function will set the SP // Reports whether a function will set the SP
// to an absolute value. Important that // to an absolute value. Important that
// we don't traceback when these are at the bottom // we don't traceback when these are at the bottom
......
...@@ -27,7 +27,10 @@ func dumpregs(c *sigctxt) { ...@@ -27,7 +27,10 @@ func dumpregs(c *sigctxt) {
print("gs ", hex(c.gs()), "\n") print("gs ", hex(c.gs()), "\n")
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) sigpc() uintptr { return uintptr(c.eip()) } func (c *sigctxt) sigpc() uintptr { return uintptr(c.eip()) }
func (c *sigctxt) sigsp() uintptr { return uintptr(c.esp()) } func (c *sigctxt) sigsp() uintptr { return uintptr(c.esp()) }
func (c *sigctxt) siglr() uintptr { return 0 } func (c *sigctxt) siglr() uintptr { return 0 }
func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) } func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
......
...@@ -36,7 +36,10 @@ func dumpregs(c *sigctxt) { ...@@ -36,7 +36,10 @@ func dumpregs(c *sigctxt) {
print("gs ", hex(c.gs()), "\n") print("gs ", hex(c.gs()), "\n")
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) sigpc() uintptr { return uintptr(c.rip()) } func (c *sigctxt) sigpc() uintptr { return uintptr(c.rip()) }
func (c *sigctxt) sigsp() uintptr { return uintptr(c.rsp()) } func (c *sigctxt) sigsp() uintptr { return uintptr(c.rsp()) }
func (c *sigctxt) siglr() uintptr { return 0 } func (c *sigctxt) siglr() uintptr { return 0 }
func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) } func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
......
...@@ -32,7 +32,10 @@ func dumpregs(c *sigctxt) { ...@@ -32,7 +32,10 @@ func dumpregs(c *sigctxt) {
print("fault ", hex(c.fault()), "\n") print("fault ", hex(c.fault()), "\n")
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) } func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) } func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
func (c *sigctxt) siglr() uintptr { return uintptr(c.lr()) } func (c *sigctxt) siglr() uintptr { return uintptr(c.lr()) }
......
...@@ -48,7 +48,10 @@ func dumpregs(c *sigctxt) { ...@@ -48,7 +48,10 @@ func dumpregs(c *sigctxt) {
print("fault ", hex(c.fault()), "\n") print("fault ", hex(c.fault()), "\n")
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) } func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) } func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
func (c *sigctxt) siglr() uintptr { return uintptr(c.lr()) } func (c *sigctxt) siglr() uintptr { return uintptr(c.lr()) }
......
...@@ -11,16 +11,23 @@ type sigctxt struct { ...@@ -11,16 +11,23 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
func (c *sigctxt) regs() *regs32 { return &(*ucontext)(c.ctxt).uc_mcontext.ss } //go:nosplit
func (c *sigctxt) eax() uint32 { return c.regs().eax } //go:nowritebarrierrec
func (c *sigctxt) ebx() uint32 { return c.regs().ebx } func (c *sigctxt) regs() *regs32 { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
func (c *sigctxt) ecx() uint32 { return c.regs().ecx }
func (c *sigctxt) edx() uint32 { return c.regs().edx } func (c *sigctxt) eax() uint32 { return c.regs().eax }
func (c *sigctxt) edi() uint32 { return c.regs().edi } func (c *sigctxt) ebx() uint32 { return c.regs().ebx }
func (c *sigctxt) esi() uint32 { return c.regs().esi } func (c *sigctxt) ecx() uint32 { return c.regs().ecx }
func (c *sigctxt) ebp() uint32 { return c.regs().ebp } func (c *sigctxt) edx() uint32 { return c.regs().edx }
func (c *sigctxt) esp() uint32 { return c.regs().esp } func (c *sigctxt) edi() uint32 { return c.regs().edi }
func (c *sigctxt) eip() uint32 { return c.regs().eip } func (c *sigctxt) esi() uint32 { return c.regs().esi }
func (c *sigctxt) ebp() uint32 { return c.regs().ebp }
func (c *sigctxt) esp() uint32 { return c.regs().esp }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) eip() uint32 { return c.regs().eip }
func (c *sigctxt) eflags() uint32 { return c.regs().eflags } func (c *sigctxt) eflags() uint32 { return c.regs().eflags }
func (c *sigctxt) cs() uint32 { return c.regs().cs } func (c *sigctxt) cs() uint32 { return c.regs().cs }
func (c *sigctxt) fs() uint32 { return c.regs().fs } func (c *sigctxt) fs() uint32 { return c.regs().fs }
......
...@@ -11,24 +11,31 @@ type sigctxt struct { ...@@ -11,24 +11,31 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
func (c *sigctxt) regs() *regs64 { return &(*ucontext)(c.ctxt).uc_mcontext.ss } //go:nosplit
func (c *sigctxt) rax() uint64 { return c.regs().rax } //go:nowritebarrierrec
func (c *sigctxt) rbx() uint64 { return c.regs().rbx } func (c *sigctxt) regs() *regs64 { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
func (c *sigctxt) rcx() uint64 { return c.regs().rcx }
func (c *sigctxt) rdx() uint64 { return c.regs().rdx } func (c *sigctxt) rax() uint64 { return c.regs().rax }
func (c *sigctxt) rdi() uint64 { return c.regs().rdi } func (c *sigctxt) rbx() uint64 { return c.regs().rbx }
func (c *sigctxt) rsi() uint64 { return c.regs().rsi } func (c *sigctxt) rcx() uint64 { return c.regs().rcx }
func (c *sigctxt) rbp() uint64 { return c.regs().rbp } func (c *sigctxt) rdx() uint64 { return c.regs().rdx }
func (c *sigctxt) rsp() uint64 { return c.regs().rsp } func (c *sigctxt) rdi() uint64 { return c.regs().rdi }
func (c *sigctxt) r8() uint64 { return c.regs().r8 } func (c *sigctxt) rsi() uint64 { return c.regs().rsi }
func (c *sigctxt) r9() uint64 { return c.regs().r9 } func (c *sigctxt) rbp() uint64 { return c.regs().rbp }
func (c *sigctxt) r10() uint64 { return c.regs().r10 } func (c *sigctxt) rsp() uint64 { return c.regs().rsp }
func (c *sigctxt) r11() uint64 { return c.regs().r11 } func (c *sigctxt) r8() uint64 { return c.regs().r8 }
func (c *sigctxt) r12() uint64 { return c.regs().r12 } func (c *sigctxt) r9() uint64 { return c.regs().r9 }
func (c *sigctxt) r13() uint64 { return c.regs().r13 } func (c *sigctxt) r10() uint64 { return c.regs().r10 }
func (c *sigctxt) r14() uint64 { return c.regs().r14 } func (c *sigctxt) r11() uint64 { return c.regs().r11 }
func (c *sigctxt) r15() uint64 { return c.regs().r15 } func (c *sigctxt) r12() uint64 { return c.regs().r12 }
func (c *sigctxt) rip() uint64 { return c.regs().rip } func (c *sigctxt) r13() uint64 { return c.regs().r13 }
func (c *sigctxt) r14() uint64 { return c.regs().r14 }
func (c *sigctxt) r15() uint64 { return c.regs().r15 }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) rip() uint64 { return c.regs().rip }
func (c *sigctxt) rflags() uint64 { return c.regs().rflags } func (c *sigctxt) rflags() uint64 { return c.regs().rflags }
func (c *sigctxt) cs() uint64 { return c.regs().cs } func (c *sigctxt) cs() uint64 { return c.regs().cs }
func (c *sigctxt) fs() uint64 { return c.regs().fs } func (c *sigctxt) fs() uint64 { return c.regs().fs }
......
...@@ -11,23 +11,30 @@ type sigctxt struct { ...@@ -11,23 +11,30 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
func (c *sigctxt) regs() *regs32 { return &(*ucontext)(c.ctxt).uc_mcontext.ss } //go:nosplit
func (c *sigctxt) r0() uint32 { return c.regs().r[0] } //go:nowritebarrierrec
func (c *sigctxt) r1() uint32 { return c.regs().r[1] } func (c *sigctxt) regs() *regs32 { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
func (c *sigctxt) r2() uint32 { return c.regs().r[2] }
func (c *sigctxt) r3() uint32 { return c.regs().r[3] } func (c *sigctxt) r0() uint32 { return c.regs().r[0] }
func (c *sigctxt) r4() uint32 { return c.regs().r[4] } func (c *sigctxt) r1() uint32 { return c.regs().r[1] }
func (c *sigctxt) r5() uint32 { return c.regs().r[5] } func (c *sigctxt) r2() uint32 { return c.regs().r[2] }
func (c *sigctxt) r6() uint32 { return c.regs().r[6] } func (c *sigctxt) r3() uint32 { return c.regs().r[3] }
func (c *sigctxt) r7() uint32 { return c.regs().r[7] } func (c *sigctxt) r4() uint32 { return c.regs().r[4] }
func (c *sigctxt) r8() uint32 { return c.regs().r[8] } func (c *sigctxt) r5() uint32 { return c.regs().r[5] }
func (c *sigctxt) r9() uint32 { return c.regs().r[9] } func (c *sigctxt) r6() uint32 { return c.regs().r[6] }
func (c *sigctxt) r10() uint32 { return c.regs().r[10] } func (c *sigctxt) r7() uint32 { return c.regs().r[7] }
func (c *sigctxt) fp() uint32 { return c.regs().r[11] } func (c *sigctxt) r8() uint32 { return c.regs().r[8] }
func (c *sigctxt) ip() uint32 { return c.regs().r[12] } func (c *sigctxt) r9() uint32 { return c.regs().r[9] }
func (c *sigctxt) sp() uint32 { return c.regs().sp } func (c *sigctxt) r10() uint32 { return c.regs().r[10] }
func (c *sigctxt) lr() uint32 { return c.regs().lr } func (c *sigctxt) fp() uint32 { return c.regs().r[11] }
func (c *sigctxt) pc() uint32 { return c.regs().pc } func (c *sigctxt) ip() uint32 { return c.regs().r[12] }
func (c *sigctxt) sp() uint32 { return c.regs().sp }
func (c *sigctxt) lr() uint32 { return c.regs().lr }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uint32 { return c.regs().pc }
func (c *sigctxt) cpsr() uint32 { return c.regs().cpsr } func (c *sigctxt) cpsr() uint32 { return c.regs().cpsr }
func (c *sigctxt) fault() uint32 { return c.info.si_addr } func (c *sigctxt) fault() uint32 { return c.info.si_addr }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) } func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
......
...@@ -11,40 +11,47 @@ type sigctxt struct { ...@@ -11,40 +11,47 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *regs64 { return &(*ucontext)(c.ctxt).uc_mcontext.ss } func (c *sigctxt) regs() *regs64 { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
func (c *sigctxt) r0() uint64 { return c.regs().x[0] }
func (c *sigctxt) r1() uint64 { return c.regs().x[1] } func (c *sigctxt) r0() uint64 { return c.regs().x[0] }
func (c *sigctxt) r2() uint64 { return c.regs().x[2] } func (c *sigctxt) r1() uint64 { return c.regs().x[1] }
func (c *sigctxt) r3() uint64 { return c.regs().x[3] } func (c *sigctxt) r2() uint64 { return c.regs().x[2] }
func (c *sigctxt) r4() uint64 { return c.regs().x[4] } func (c *sigctxt) r3() uint64 { return c.regs().x[3] }
func (c *sigctxt) r5() uint64 { return c.regs().x[5] } func (c *sigctxt) r4() uint64 { return c.regs().x[4] }
func (c *sigctxt) r6() uint64 { return c.regs().x[6] } func (c *sigctxt) r5() uint64 { return c.regs().x[5] }
func (c *sigctxt) r7() uint64 { return c.regs().x[7] } func (c *sigctxt) r6() uint64 { return c.regs().x[6] }
func (c *sigctxt) r8() uint64 { return c.regs().x[8] } func (c *sigctxt) r7() uint64 { return c.regs().x[7] }
func (c *sigctxt) r9() uint64 { return c.regs().x[9] } func (c *sigctxt) r8() uint64 { return c.regs().x[8] }
func (c *sigctxt) r10() uint64 { return c.regs().x[10] } func (c *sigctxt) r9() uint64 { return c.regs().x[9] }
func (c *sigctxt) r11() uint64 { return c.regs().x[11] } func (c *sigctxt) r10() uint64 { return c.regs().x[10] }
func (c *sigctxt) r12() uint64 { return c.regs().x[12] } func (c *sigctxt) r11() uint64 { return c.regs().x[11] }
func (c *sigctxt) r13() uint64 { return c.regs().x[13] } func (c *sigctxt) r12() uint64 { return c.regs().x[12] }
func (c *sigctxt) r14() uint64 { return c.regs().x[14] } func (c *sigctxt) r13() uint64 { return c.regs().x[13] }
func (c *sigctxt) r15() uint64 { return c.regs().x[15] } func (c *sigctxt) r14() uint64 { return c.regs().x[14] }
func (c *sigctxt) r16() uint64 { return c.regs().x[16] } func (c *sigctxt) r15() uint64 { return c.regs().x[15] }
func (c *sigctxt) r17() uint64 { return c.regs().x[17] } func (c *sigctxt) r16() uint64 { return c.regs().x[16] }
func (c *sigctxt) r18() uint64 { return c.regs().x[18] } func (c *sigctxt) r17() uint64 { return c.regs().x[17] }
func (c *sigctxt) r19() uint64 { return c.regs().x[19] } func (c *sigctxt) r18() uint64 { return c.regs().x[18] }
func (c *sigctxt) r20() uint64 { return c.regs().x[20] } func (c *sigctxt) r19() uint64 { return c.regs().x[19] }
func (c *sigctxt) r21() uint64 { return c.regs().x[21] } func (c *sigctxt) r20() uint64 { return c.regs().x[20] }
func (c *sigctxt) r22() uint64 { return c.regs().x[22] } func (c *sigctxt) r21() uint64 { return c.regs().x[21] }
func (c *sigctxt) r23() uint64 { return c.regs().x[23] } func (c *sigctxt) r22() uint64 { return c.regs().x[22] }
func (c *sigctxt) r24() uint64 { return c.regs().x[24] } func (c *sigctxt) r23() uint64 { return c.regs().x[23] }
func (c *sigctxt) r25() uint64 { return c.regs().x[25] } func (c *sigctxt) r24() uint64 { return c.regs().x[24] }
func (c *sigctxt) r26() uint64 { return c.regs().x[26] } func (c *sigctxt) r25() uint64 { return c.regs().x[25] }
func (c *sigctxt) r27() uint64 { return c.regs().x[27] } func (c *sigctxt) r26() uint64 { return c.regs().x[26] }
func (c *sigctxt) r28() uint64 { return c.regs().x[28] } func (c *sigctxt) r27() uint64 { return c.regs().x[27] }
func (c *sigctxt) r29() uint64 { return c.regs().fp } func (c *sigctxt) r28() uint64 { return c.regs().x[28] }
func (c *sigctxt) lr() uint64 { return c.regs().lr } func (c *sigctxt) r29() uint64 { return c.regs().fp }
func (c *sigctxt) sp() uint64 { return c.regs().sp } func (c *sigctxt) lr() uint64 { return c.regs().lr }
func (c *sigctxt) pc() uint64 { return c.regs().pc } func (c *sigctxt) sp() uint64 { return c.regs().sp }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uint64 { return c.regs().pc }
func (c *sigctxt) fault() uint64 { return uint64(uintptr(unsafe.Pointer(c.info.si_addr))) } func (c *sigctxt) fault() uint64 { return uint64(uintptr(unsafe.Pointer(c.info.si_addr))) }
func (c *sigctxt) sigcode() uint64 { return uint64(c.info.si_code) } func (c *sigctxt) sigcode() uint64 { return uint64(c.info.si_code) }
......
...@@ -11,26 +11,33 @@ type sigctxt struct { ...@@ -11,26 +11,33 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *mcontext { func (c *sigctxt) regs() *mcontext {
return (*mcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext)) return (*mcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext))
} }
func (c *sigctxt) rax() uint64 { return c.regs().mc_rax }
func (c *sigctxt) rbx() uint64 { return c.regs().mc_rbx } func (c *sigctxt) rax() uint64 { return c.regs().mc_rax }
func (c *sigctxt) rcx() uint64 { return c.regs().mc_rcx } func (c *sigctxt) rbx() uint64 { return c.regs().mc_rbx }
func (c *sigctxt) rdx() uint64 { return c.regs().mc_rdx } func (c *sigctxt) rcx() uint64 { return c.regs().mc_rcx }
func (c *sigctxt) rdi() uint64 { return c.regs().mc_rdi } func (c *sigctxt) rdx() uint64 { return c.regs().mc_rdx }
func (c *sigctxt) rsi() uint64 { return c.regs().mc_rsi } func (c *sigctxt) rdi() uint64 { return c.regs().mc_rdi }
func (c *sigctxt) rbp() uint64 { return c.regs().mc_rbp } func (c *sigctxt) rsi() uint64 { return c.regs().mc_rsi }
func (c *sigctxt) rsp() uint64 { return c.regs().mc_rsp } func (c *sigctxt) rbp() uint64 { return c.regs().mc_rbp }
func (c *sigctxt) r8() uint64 { return c.regs().mc_r8 } func (c *sigctxt) rsp() uint64 { return c.regs().mc_rsp }
func (c *sigctxt) r9() uint64 { return c.regs().mc_r9 } func (c *sigctxt) r8() uint64 { return c.regs().mc_r8 }
func (c *sigctxt) r10() uint64 { return c.regs().mc_r10 } func (c *sigctxt) r9() uint64 { return c.regs().mc_r9 }
func (c *sigctxt) r11() uint64 { return c.regs().mc_r11 } func (c *sigctxt) r10() uint64 { return c.regs().mc_r10 }
func (c *sigctxt) r12() uint64 { return c.regs().mc_r12 } func (c *sigctxt) r11() uint64 { return c.regs().mc_r11 }
func (c *sigctxt) r13() uint64 { return c.regs().mc_r13 } func (c *sigctxt) r12() uint64 { return c.regs().mc_r12 }
func (c *sigctxt) r14() uint64 { return c.regs().mc_r14 } func (c *sigctxt) r13() uint64 { return c.regs().mc_r13 }
func (c *sigctxt) r15() uint64 { return c.regs().mc_r15 } func (c *sigctxt) r14() uint64 { return c.regs().mc_r14 }
func (c *sigctxt) rip() uint64 { return c.regs().mc_rip } func (c *sigctxt) r15() uint64 { return c.regs().mc_r15 }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) rip() uint64 { return c.regs().mc_rip }
func (c *sigctxt) rflags() uint64 { return c.regs().mc_rflags } func (c *sigctxt) rflags() uint64 { return c.regs().mc_rflags }
func (c *sigctxt) cs() uint64 { return c.regs().mc_cs } func (c *sigctxt) cs() uint64 { return c.regs().mc_cs }
func (c *sigctxt) fs() uint64 { return c.regs().mc_ss } func (c *sigctxt) fs() uint64 { return c.regs().mc_ss }
......
...@@ -11,16 +11,23 @@ type sigctxt struct { ...@@ -11,16 +11,23 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *mcontext { return &(*ucontext)(c.ctxt).uc_mcontext } func (c *sigctxt) regs() *mcontext { return &(*ucontext)(c.ctxt).uc_mcontext }
func (c *sigctxt) eax() uint32 { return c.regs().mc_eax }
func (c *sigctxt) ebx() uint32 { return c.regs().mc_ebx } func (c *sigctxt) eax() uint32 { return c.regs().mc_eax }
func (c *sigctxt) ecx() uint32 { return c.regs().mc_ecx } func (c *sigctxt) ebx() uint32 { return c.regs().mc_ebx }
func (c *sigctxt) edx() uint32 { return c.regs().mc_edx } func (c *sigctxt) ecx() uint32 { return c.regs().mc_ecx }
func (c *sigctxt) edi() uint32 { return c.regs().mc_edi } func (c *sigctxt) edx() uint32 { return c.regs().mc_edx }
func (c *sigctxt) esi() uint32 { return c.regs().mc_esi } func (c *sigctxt) edi() uint32 { return c.regs().mc_edi }
func (c *sigctxt) ebp() uint32 { return c.regs().mc_ebp } func (c *sigctxt) esi() uint32 { return c.regs().mc_esi }
func (c *sigctxt) esp() uint32 { return c.regs().mc_esp } func (c *sigctxt) ebp() uint32 { return c.regs().mc_ebp }
func (c *sigctxt) eip() uint32 { return c.regs().mc_eip } func (c *sigctxt) esp() uint32 { return c.regs().mc_esp }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) eip() uint32 { return c.regs().mc_eip }
func (c *sigctxt) eflags() uint32 { return c.regs().mc_eflags } func (c *sigctxt) eflags() uint32 { return c.regs().mc_eflags }
func (c *sigctxt) cs() uint32 { return c.regs().mc_cs } func (c *sigctxt) cs() uint32 { return c.regs().mc_cs }
func (c *sigctxt) fs() uint32 { return c.regs().mc_fs } func (c *sigctxt) fs() uint32 { return c.regs().mc_fs }
......
...@@ -11,26 +11,33 @@ type sigctxt struct { ...@@ -11,26 +11,33 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *mcontext { func (c *sigctxt) regs() *mcontext {
return (*mcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext)) return (*mcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext))
} }
func (c *sigctxt) rax() uint64 { return c.regs().mc_rax }
func (c *sigctxt) rbx() uint64 { return c.regs().mc_rbx } func (c *sigctxt) rax() uint64 { return c.regs().mc_rax }
func (c *sigctxt) rcx() uint64 { return c.regs().mc_rcx } func (c *sigctxt) rbx() uint64 { return c.regs().mc_rbx }
func (c *sigctxt) rdx() uint64 { return c.regs().mc_rdx } func (c *sigctxt) rcx() uint64 { return c.regs().mc_rcx }
func (c *sigctxt) rdi() uint64 { return c.regs().mc_rdi } func (c *sigctxt) rdx() uint64 { return c.regs().mc_rdx }
func (c *sigctxt) rsi() uint64 { return c.regs().mc_rsi } func (c *sigctxt) rdi() uint64 { return c.regs().mc_rdi }
func (c *sigctxt) rbp() uint64 { return c.regs().mc_rbp } func (c *sigctxt) rsi() uint64 { return c.regs().mc_rsi }
func (c *sigctxt) rsp() uint64 { return c.regs().mc_rsp } func (c *sigctxt) rbp() uint64 { return c.regs().mc_rbp }
func (c *sigctxt) r8() uint64 { return c.regs().mc_r8 } func (c *sigctxt) rsp() uint64 { return c.regs().mc_rsp }
func (c *sigctxt) r9() uint64 { return c.regs().mc_r9 } func (c *sigctxt) r8() uint64 { return c.regs().mc_r8 }
func (c *sigctxt) r10() uint64 { return c.regs().mc_r10 } func (c *sigctxt) r9() uint64 { return c.regs().mc_r9 }
func (c *sigctxt) r11() uint64 { return c.regs().mc_r11 } func (c *sigctxt) r10() uint64 { return c.regs().mc_r10 }
func (c *sigctxt) r12() uint64 { return c.regs().mc_r12 } func (c *sigctxt) r11() uint64 { return c.regs().mc_r11 }
func (c *sigctxt) r13() uint64 { return c.regs().mc_r13 } func (c *sigctxt) r12() uint64 { return c.regs().mc_r12 }
func (c *sigctxt) r14() uint64 { return c.regs().mc_r14 } func (c *sigctxt) r13() uint64 { return c.regs().mc_r13 }
func (c *sigctxt) r15() uint64 { return c.regs().mc_r15 } func (c *sigctxt) r14() uint64 { return c.regs().mc_r14 }
func (c *sigctxt) rip() uint64 { return c.regs().mc_rip } func (c *sigctxt) r15() uint64 { return c.regs().mc_r15 }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) rip() uint64 { return c.regs().mc_rip }
func (c *sigctxt) rflags() uint64 { return c.regs().mc_rflags } func (c *sigctxt) rflags() uint64 { return c.regs().mc_rflags }
func (c *sigctxt) cs() uint64 { return c.regs().mc_cs } func (c *sigctxt) cs() uint64 { return c.regs().mc_cs }
func (c *sigctxt) fs() uint64 { return uint64(c.regs().mc_fs) } func (c *sigctxt) fs() uint64 { return uint64(c.regs().mc_fs) }
......
...@@ -11,23 +11,30 @@ type sigctxt struct { ...@@ -11,23 +11,30 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *mcontext { return &(*ucontext)(c.ctxt).uc_mcontext } func (c *sigctxt) regs() *mcontext { return &(*ucontext)(c.ctxt).uc_mcontext }
func (c *sigctxt) r0() uint32 { return c.regs().__gregs[0] }
func (c *sigctxt) r1() uint32 { return c.regs().__gregs[1] } func (c *sigctxt) r0() uint32 { return c.regs().__gregs[0] }
func (c *sigctxt) r2() uint32 { return c.regs().__gregs[2] } func (c *sigctxt) r1() uint32 { return c.regs().__gregs[1] }
func (c *sigctxt) r3() uint32 { return c.regs().__gregs[3] } func (c *sigctxt) r2() uint32 { return c.regs().__gregs[2] }
func (c *sigctxt) r4() uint32 { return c.regs().__gregs[4] } func (c *sigctxt) r3() uint32 { return c.regs().__gregs[3] }
func (c *sigctxt) r5() uint32 { return c.regs().__gregs[5] } func (c *sigctxt) r4() uint32 { return c.regs().__gregs[4] }
func (c *sigctxt) r6() uint32 { return c.regs().__gregs[6] } func (c *sigctxt) r5() uint32 { return c.regs().__gregs[5] }
func (c *sigctxt) r7() uint32 { return c.regs().__gregs[7] } func (c *sigctxt) r6() uint32 { return c.regs().__gregs[6] }
func (c *sigctxt) r8() uint32 { return c.regs().__gregs[8] } func (c *sigctxt) r7() uint32 { return c.regs().__gregs[7] }
func (c *sigctxt) r9() uint32 { return c.regs().__gregs[9] } func (c *sigctxt) r8() uint32 { return c.regs().__gregs[8] }
func (c *sigctxt) r10() uint32 { return c.regs().__gregs[10] } func (c *sigctxt) r9() uint32 { return c.regs().__gregs[9] }
func (c *sigctxt) fp() uint32 { return c.regs().__gregs[11] } func (c *sigctxt) r10() uint32 { return c.regs().__gregs[10] }
func (c *sigctxt) ip() uint32 { return c.regs().__gregs[12] } func (c *sigctxt) fp() uint32 { return c.regs().__gregs[11] }
func (c *sigctxt) sp() uint32 { return c.regs().__gregs[13] } func (c *sigctxt) ip() uint32 { return c.regs().__gregs[12] }
func (c *sigctxt) lr() uint32 { return c.regs().__gregs[14] } func (c *sigctxt) sp() uint32 { return c.regs().__gregs[13] }
func (c *sigctxt) pc() uint32 { return c.regs().__gregs[15] } func (c *sigctxt) lr() uint32 { return c.regs().__gregs[14] }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uint32 { return c.regs().__gregs[15] }
func (c *sigctxt) cpsr() uint32 { return c.regs().__gregs[16] } func (c *sigctxt) cpsr() uint32 { return c.regs().__gregs[16] }
func (c *sigctxt) fault() uint32 { return uint32(c.info.si_addr) } func (c *sigctxt) fault() uint32 { return uint32(c.info.si_addr) }
func (c *sigctxt) trap() uint32 { return 0 } func (c *sigctxt) trap() uint32 { return 0 }
......
...@@ -14,22 +14,29 @@ type sigctxt struct { ...@@ -14,22 +14,29 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { return &(*ucontext)(c.ctxt).uc_mcontext } func (c *sigctxt) regs() *sigcontext { return &(*ucontext)(c.ctxt).uc_mcontext }
func (c *sigctxt) eax() uint32 { return c.regs().eax }
func (c *sigctxt) ebx() uint32 { return c.regs().ebx } func (c *sigctxt) eax() uint32 { return c.regs().eax }
func (c *sigctxt) ecx() uint32 { return c.regs().ecx } func (c *sigctxt) ebx() uint32 { return c.regs().ebx }
func (c *sigctxt) edx() uint32 { return c.regs().edx } func (c *sigctxt) ecx() uint32 { return c.regs().ecx }
func (c *sigctxt) edi() uint32 { return c.regs().edi } func (c *sigctxt) edx() uint32 { return c.regs().edx }
func (c *sigctxt) esi() uint32 { return c.regs().esi } func (c *sigctxt) edi() uint32 { return c.regs().edi }
func (c *sigctxt) ebp() uint32 { return c.regs().ebp } func (c *sigctxt) esi() uint32 { return c.regs().esi }
func (c *sigctxt) esp() uint32 { return c.regs().esp } func (c *sigctxt) ebp() uint32 { return c.regs().ebp }
func (c *sigctxt) eip() uint32 { return c.regs().eip } func (c *sigctxt) esp() uint32 { return c.regs().esp }
func (c *sigctxt) eflags() uint32 { return c.regs().eflags }
func (c *sigctxt) cs() uint32 { return uint32(c.regs().cs) } //go:nosplit
func (c *sigctxt) fs() uint32 { return uint32(c.regs().fs) } //go:nowritebarrierrec
func (c *sigctxt) gs() uint32 { return uint32(c.regs().gs) } func (c *sigctxt) eip() uint32 { return c.regs().eip }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
func (c *sigctxt) sigaddr() uint32 { return c.info.si_addr } func (c *sigctxt) eflags() uint32 { return c.regs().eflags }
func (c *sigctxt) cs() uint32 { return uint32(c.regs().cs) }
func (c *sigctxt) fs() uint32 { return uint32(c.regs().fs) }
func (c *sigctxt) gs() uint32 { return uint32(c.regs().gs) }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
func (c *sigctxt) sigaddr() uint32 { return c.info.si_addr }
func (c *sigctxt) set_eip(x uint32) { c.regs().eip = x } func (c *sigctxt) set_eip(x uint32) { c.regs().eip = x }
func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x } func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x }
......
...@@ -14,26 +14,33 @@ type sigctxt struct { ...@@ -14,26 +14,33 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { func (c *sigctxt) regs() *sigcontext {
return (*sigcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext)) return (*sigcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext))
} }
func (c *sigctxt) rax() uint64 { return c.regs().rax }
func (c *sigctxt) rbx() uint64 { return c.regs().rbx } func (c *sigctxt) rax() uint64 { return c.regs().rax }
func (c *sigctxt) rcx() uint64 { return c.regs().rcx } func (c *sigctxt) rbx() uint64 { return c.regs().rbx }
func (c *sigctxt) rdx() uint64 { return c.regs().rdx } func (c *sigctxt) rcx() uint64 { return c.regs().rcx }
func (c *sigctxt) rdi() uint64 { return c.regs().rdi } func (c *sigctxt) rdx() uint64 { return c.regs().rdx }
func (c *sigctxt) rsi() uint64 { return c.regs().rsi } func (c *sigctxt) rdi() uint64 { return c.regs().rdi }
func (c *sigctxt) rbp() uint64 { return c.regs().rbp } func (c *sigctxt) rsi() uint64 { return c.regs().rsi }
func (c *sigctxt) rsp() uint64 { return c.regs().rsp } func (c *sigctxt) rbp() uint64 { return c.regs().rbp }
func (c *sigctxt) r8() uint64 { return c.regs().r8 } func (c *sigctxt) rsp() uint64 { return c.regs().rsp }
func (c *sigctxt) r9() uint64 { return c.regs().r9 } func (c *sigctxt) r8() uint64 { return c.regs().r8 }
func (c *sigctxt) r10() uint64 { return c.regs().r10 } func (c *sigctxt) r9() uint64 { return c.regs().r9 }
func (c *sigctxt) r11() uint64 { return c.regs().r11 } func (c *sigctxt) r10() uint64 { return c.regs().r10 }
func (c *sigctxt) r12() uint64 { return c.regs().r12 } func (c *sigctxt) r11() uint64 { return c.regs().r11 }
func (c *sigctxt) r13() uint64 { return c.regs().r13 } func (c *sigctxt) r12() uint64 { return c.regs().r12 }
func (c *sigctxt) r14() uint64 { return c.regs().r14 } func (c *sigctxt) r13() uint64 { return c.regs().r13 }
func (c *sigctxt) r15() uint64 { return c.regs().r15 } func (c *sigctxt) r14() uint64 { return c.regs().r14 }
func (c *sigctxt) rip() uint64 { return c.regs().rip } func (c *sigctxt) r15() uint64 { return c.regs().r15 }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) rip() uint64 { return c.regs().rip }
func (c *sigctxt) rflags() uint64 { return c.regs().eflags } func (c *sigctxt) rflags() uint64 { return c.regs().eflags }
func (c *sigctxt) cs() uint64 { return uint64(c.regs().cs) } func (c *sigctxt) cs() uint64 { return uint64(c.regs().cs) }
func (c *sigctxt) fs() uint64 { return uint64(c.regs().fs) } func (c *sigctxt) fs() uint64 { return uint64(c.regs().fs) }
......
...@@ -14,28 +14,35 @@ type sigctxt struct { ...@@ -14,28 +14,35 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { return &(*ucontext)(c.ctxt).uc_mcontext } func (c *sigctxt) regs() *sigcontext { return &(*ucontext)(c.ctxt).uc_mcontext }
func (c *sigctxt) r0() uint32 { return c.regs().r0 }
func (c *sigctxt) r1() uint32 { return c.regs().r1 } func (c *sigctxt) r0() uint32 { return c.regs().r0 }
func (c *sigctxt) r2() uint32 { return c.regs().r2 } func (c *sigctxt) r1() uint32 { return c.regs().r1 }
func (c *sigctxt) r3() uint32 { return c.regs().r3 } func (c *sigctxt) r2() uint32 { return c.regs().r2 }
func (c *sigctxt) r4() uint32 { return c.regs().r4 } func (c *sigctxt) r3() uint32 { return c.regs().r3 }
func (c *sigctxt) r5() uint32 { return c.regs().r5 } func (c *sigctxt) r4() uint32 { return c.regs().r4 }
func (c *sigctxt) r6() uint32 { return c.regs().r6 } func (c *sigctxt) r5() uint32 { return c.regs().r5 }
func (c *sigctxt) r7() uint32 { return c.regs().r7 } func (c *sigctxt) r6() uint32 { return c.regs().r6 }
func (c *sigctxt) r8() uint32 { return c.regs().r8 } func (c *sigctxt) r7() uint32 { return c.regs().r7 }
func (c *sigctxt) r9() uint32 { return c.regs().r9 } func (c *sigctxt) r8() uint32 { return c.regs().r8 }
func (c *sigctxt) r10() uint32 { return c.regs().r10 } func (c *sigctxt) r9() uint32 { return c.regs().r9 }
func (c *sigctxt) fp() uint32 { return c.regs().fp } func (c *sigctxt) r10() uint32 { return c.regs().r10 }
func (c *sigctxt) ip() uint32 { return c.regs().ip } func (c *sigctxt) fp() uint32 { return c.regs().fp }
func (c *sigctxt) sp() uint32 { return c.regs().sp } func (c *sigctxt) ip() uint32 { return c.regs().ip }
func (c *sigctxt) lr() uint32 { return c.regs().lr } func (c *sigctxt) sp() uint32 { return c.regs().sp }
func (c *sigctxt) pc() uint32 { return c.regs().pc } func (c *sigctxt) lr() uint32 { return c.regs().lr }
func (c *sigctxt) cpsr() uint32 { return c.regs().cpsr }
func (c *sigctxt) fault() uint32 { return c.regs().fault_address } //go:nosplit
func (c *sigctxt) trap() uint32 { return c.regs().trap_no } //go:nowritebarrierrec
func (c *sigctxt) error() uint32 { return c.regs().error_code } func (c *sigctxt) pc() uint32 { return c.regs().pc }
func (c *sigctxt) oldmask() uint32 { return c.regs().oldmask }
func (c *sigctxt) cpsr() uint32 { return c.regs().cpsr }
func (c *sigctxt) fault() uint32 { return c.regs().fault_address }
func (c *sigctxt) trap() uint32 { return c.regs().trap_no }
func (c *sigctxt) error() uint32 { return c.regs().error_code }
func (c *sigctxt) oldmask() uint32 { return c.regs().oldmask }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) } func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
func (c *sigctxt) sigaddr() uint32 { return c.info.si_addr } func (c *sigctxt) sigaddr() uint32 { return c.info.si_addr }
......
...@@ -14,42 +14,49 @@ type sigctxt struct { ...@@ -14,42 +14,49 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { return &(*ucontext)(c.ctxt).uc_mcontext } func (c *sigctxt) regs() *sigcontext { return &(*ucontext)(c.ctxt).uc_mcontext }
func (c *sigctxt) r0() uint64 { return c.regs().regs[0] }
func (c *sigctxt) r1() uint64 { return c.regs().regs[1] } func (c *sigctxt) r0() uint64 { return c.regs().regs[0] }
func (c *sigctxt) r2() uint64 { return c.regs().regs[2] } func (c *sigctxt) r1() uint64 { return c.regs().regs[1] }
func (c *sigctxt) r3() uint64 { return c.regs().regs[3] } func (c *sigctxt) r2() uint64 { return c.regs().regs[2] }
func (c *sigctxt) r4() uint64 { return c.regs().regs[4] } func (c *sigctxt) r3() uint64 { return c.regs().regs[3] }
func (c *sigctxt) r5() uint64 { return c.regs().regs[5] } func (c *sigctxt) r4() uint64 { return c.regs().regs[4] }
func (c *sigctxt) r6() uint64 { return c.regs().regs[6] } func (c *sigctxt) r5() uint64 { return c.regs().regs[5] }
func (c *sigctxt) r7() uint64 { return c.regs().regs[7] } func (c *sigctxt) r6() uint64 { return c.regs().regs[6] }
func (c *sigctxt) r8() uint64 { return c.regs().regs[8] } func (c *sigctxt) r7() uint64 { return c.regs().regs[7] }
func (c *sigctxt) r9() uint64 { return c.regs().regs[9] } func (c *sigctxt) r8() uint64 { return c.regs().regs[8] }
func (c *sigctxt) r10() uint64 { return c.regs().regs[10] } func (c *sigctxt) r9() uint64 { return c.regs().regs[9] }
func (c *sigctxt) r11() uint64 { return c.regs().regs[11] } func (c *sigctxt) r10() uint64 { return c.regs().regs[10] }
func (c *sigctxt) r12() uint64 { return c.regs().regs[12] } func (c *sigctxt) r11() uint64 { return c.regs().regs[11] }
func (c *sigctxt) r13() uint64 { return c.regs().regs[13] } func (c *sigctxt) r12() uint64 { return c.regs().regs[12] }
func (c *sigctxt) r14() uint64 { return c.regs().regs[14] } func (c *sigctxt) r13() uint64 { return c.regs().regs[13] }
func (c *sigctxt) r15() uint64 { return c.regs().regs[15] } func (c *sigctxt) r14() uint64 { return c.regs().regs[14] }
func (c *sigctxt) r16() uint64 { return c.regs().regs[16] } func (c *sigctxt) r15() uint64 { return c.regs().regs[15] }
func (c *sigctxt) r17() uint64 { return c.regs().regs[17] } func (c *sigctxt) r16() uint64 { return c.regs().regs[16] }
func (c *sigctxt) r18() uint64 { return c.regs().regs[18] } func (c *sigctxt) r17() uint64 { return c.regs().regs[17] }
func (c *sigctxt) r19() uint64 { return c.regs().regs[19] } func (c *sigctxt) r18() uint64 { return c.regs().regs[18] }
func (c *sigctxt) r20() uint64 { return c.regs().regs[20] } func (c *sigctxt) r19() uint64 { return c.regs().regs[19] }
func (c *sigctxt) r21() uint64 { return c.regs().regs[21] } func (c *sigctxt) r20() uint64 { return c.regs().regs[20] }
func (c *sigctxt) r22() uint64 { return c.regs().regs[22] } func (c *sigctxt) r21() uint64 { return c.regs().regs[21] }
func (c *sigctxt) r23() uint64 { return c.regs().regs[23] } func (c *sigctxt) r22() uint64 { return c.regs().regs[22] }
func (c *sigctxt) r24() uint64 { return c.regs().regs[24] } func (c *sigctxt) r23() uint64 { return c.regs().regs[23] }
func (c *sigctxt) r25() uint64 { return c.regs().regs[25] } func (c *sigctxt) r24() uint64 { return c.regs().regs[24] }
func (c *sigctxt) r26() uint64 { return c.regs().regs[26] } func (c *sigctxt) r25() uint64 { return c.regs().regs[25] }
func (c *sigctxt) r27() uint64 { return c.regs().regs[27] } func (c *sigctxt) r26() uint64 { return c.regs().regs[26] }
func (c *sigctxt) r28() uint64 { return c.regs().regs[28] } func (c *sigctxt) r27() uint64 { return c.regs().regs[27] }
func (c *sigctxt) r29() uint64 { return c.regs().regs[29] } func (c *sigctxt) r28() uint64 { return c.regs().regs[28] }
func (c *sigctxt) lr() uint64 { return c.regs().regs[30] } func (c *sigctxt) r29() uint64 { return c.regs().regs[29] }
func (c *sigctxt) sp() uint64 { return c.regs().sp } func (c *sigctxt) lr() uint64 { return c.regs().regs[30] }
func (c *sigctxt) pc() uint64 { return c.regs().pc } func (c *sigctxt) sp() uint64 { return c.regs().sp }
func (c *sigctxt) pstate() uint64 { return c.regs().pstate }
func (c *sigctxt) fault() uint64 { return c.regs().fault_address } //go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uint64 { return c.regs().pc }
func (c *sigctxt) pstate() uint64 { return c.regs().pstate }
func (c *sigctxt) fault() uint64 { return c.regs().fault_address }
func (c *sigctxt) sigcode() uint64 { return uint64(c.info.si_code) } func (c *sigctxt) sigcode() uint64 { return uint64(c.info.si_code) }
func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr } func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr }
......
...@@ -17,44 +17,51 @@ type sigctxt struct { ...@@ -17,44 +17,51 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { return &(*ucontext)(c.ctxt).uc_mcontext } func (c *sigctxt) regs() *sigcontext { return &(*ucontext)(c.ctxt).uc_mcontext }
func (c *sigctxt) r0() uint64 { return c.regs().sc_regs[0] }
func (c *sigctxt) r1() uint64 { return c.regs().sc_regs[1] } func (c *sigctxt) r0() uint64 { return c.regs().sc_regs[0] }
func (c *sigctxt) r2() uint64 { return c.regs().sc_regs[2] } func (c *sigctxt) r1() uint64 { return c.regs().sc_regs[1] }
func (c *sigctxt) r3() uint64 { return c.regs().sc_regs[3] } func (c *sigctxt) r2() uint64 { return c.regs().sc_regs[2] }
func (c *sigctxt) r4() uint64 { return c.regs().sc_regs[4] } func (c *sigctxt) r3() uint64 { return c.regs().sc_regs[3] }
func (c *sigctxt) r5() uint64 { return c.regs().sc_regs[5] } func (c *sigctxt) r4() uint64 { return c.regs().sc_regs[4] }
func (c *sigctxt) r6() uint64 { return c.regs().sc_regs[6] } func (c *sigctxt) r5() uint64 { return c.regs().sc_regs[5] }
func (c *sigctxt) r7() uint64 { return c.regs().sc_regs[7] } func (c *sigctxt) r6() uint64 { return c.regs().sc_regs[6] }
func (c *sigctxt) r8() uint64 { return c.regs().sc_regs[8] } func (c *sigctxt) r7() uint64 { return c.regs().sc_regs[7] }
func (c *sigctxt) r9() uint64 { return c.regs().sc_regs[9] } func (c *sigctxt) r8() uint64 { return c.regs().sc_regs[8] }
func (c *sigctxt) r10() uint64 { return c.regs().sc_regs[10] } func (c *sigctxt) r9() uint64 { return c.regs().sc_regs[9] }
func (c *sigctxt) r11() uint64 { return c.regs().sc_regs[11] } func (c *sigctxt) r10() uint64 { return c.regs().sc_regs[10] }
func (c *sigctxt) r12() uint64 { return c.regs().sc_regs[12] } func (c *sigctxt) r11() uint64 { return c.regs().sc_regs[11] }
func (c *sigctxt) r13() uint64 { return c.regs().sc_regs[13] } func (c *sigctxt) r12() uint64 { return c.regs().sc_regs[12] }
func (c *sigctxt) r14() uint64 { return c.regs().sc_regs[14] } func (c *sigctxt) r13() uint64 { return c.regs().sc_regs[13] }
func (c *sigctxt) r15() uint64 { return c.regs().sc_regs[15] } func (c *sigctxt) r14() uint64 { return c.regs().sc_regs[14] }
func (c *sigctxt) r16() uint64 { return c.regs().sc_regs[16] } func (c *sigctxt) r15() uint64 { return c.regs().sc_regs[15] }
func (c *sigctxt) r17() uint64 { return c.regs().sc_regs[17] } func (c *sigctxt) r16() uint64 { return c.regs().sc_regs[16] }
func (c *sigctxt) r18() uint64 { return c.regs().sc_regs[18] } func (c *sigctxt) r17() uint64 { return c.regs().sc_regs[17] }
func (c *sigctxt) r19() uint64 { return c.regs().sc_regs[19] } func (c *sigctxt) r18() uint64 { return c.regs().sc_regs[18] }
func (c *sigctxt) r20() uint64 { return c.regs().sc_regs[20] } func (c *sigctxt) r19() uint64 { return c.regs().sc_regs[19] }
func (c *sigctxt) r21() uint64 { return c.regs().sc_regs[21] } func (c *sigctxt) r20() uint64 { return c.regs().sc_regs[20] }
func (c *sigctxt) r22() uint64 { return c.regs().sc_regs[22] } func (c *sigctxt) r21() uint64 { return c.regs().sc_regs[21] }
func (c *sigctxt) r23() uint64 { return c.regs().sc_regs[23] } func (c *sigctxt) r22() uint64 { return c.regs().sc_regs[22] }
func (c *sigctxt) r24() uint64 { return c.regs().sc_regs[24] } func (c *sigctxt) r23() uint64 { return c.regs().sc_regs[23] }
func (c *sigctxt) r25() uint64 { return c.regs().sc_regs[25] } func (c *sigctxt) r24() uint64 { return c.regs().sc_regs[24] }
func (c *sigctxt) r26() uint64 { return c.regs().sc_regs[26] } func (c *sigctxt) r25() uint64 { return c.regs().sc_regs[25] }
func (c *sigctxt) r27() uint64 { return c.regs().sc_regs[27] } func (c *sigctxt) r26() uint64 { return c.regs().sc_regs[26] }
func (c *sigctxt) r28() uint64 { return c.regs().sc_regs[28] } func (c *sigctxt) r27() uint64 { return c.regs().sc_regs[27] }
func (c *sigctxt) r29() uint64 { return c.regs().sc_regs[29] } func (c *sigctxt) r28() uint64 { return c.regs().sc_regs[28] }
func (c *sigctxt) r30() uint64 { return c.regs().sc_regs[30] } func (c *sigctxt) r29() uint64 { return c.regs().sc_regs[29] }
func (c *sigctxt) r31() uint64 { return c.regs().sc_regs[31] } func (c *sigctxt) r30() uint64 { return c.regs().sc_regs[30] }
func (c *sigctxt) sp() uint64 { return c.regs().sc_regs[29] } func (c *sigctxt) r31() uint64 { return c.regs().sc_regs[31] }
func (c *sigctxt) pc() uint64 { return c.regs().sc_pc } func (c *sigctxt) sp() uint64 { return c.regs().sc_regs[29] }
func (c *sigctxt) link() uint64 { return c.regs().sc_regs[31] }
func (c *sigctxt) lo() uint64 { return c.regs().sc_mdlo } //go:nosplit
func (c *sigctxt) hi() uint64 { return c.regs().sc_mdhi } //go:nowritebarrierrec
func (c *sigctxt) pc() uint64 { return c.regs().sc_pc }
func (c *sigctxt) link() uint64 { return c.regs().sc_regs[31] }
func (c *sigctxt) lo() uint64 { return c.regs().sc_mdlo }
func (c *sigctxt) hi() uint64 { return c.regs().sc_mdhi }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) } func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr } func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr }
......
...@@ -17,46 +17,53 @@ type sigctxt struct { ...@@ -17,46 +17,53 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *ptregs { return (*ucontext)(c.ctxt).uc_mcontext.regs } func (c *sigctxt) regs() *ptregs { return (*ucontext)(c.ctxt).uc_mcontext.regs }
func (c *sigctxt) r0() uint64 { return c.regs().gpr[0] }
func (c *sigctxt) r1() uint64 { return c.regs().gpr[1] } func (c *sigctxt) r0() uint64 { return c.regs().gpr[0] }
func (c *sigctxt) r2() uint64 { return c.regs().gpr[2] } func (c *sigctxt) r1() uint64 { return c.regs().gpr[1] }
func (c *sigctxt) r3() uint64 { return c.regs().gpr[3] } func (c *sigctxt) r2() uint64 { return c.regs().gpr[2] }
func (c *sigctxt) r4() uint64 { return c.regs().gpr[4] } func (c *sigctxt) r3() uint64 { return c.regs().gpr[3] }
func (c *sigctxt) r5() uint64 { return c.regs().gpr[5] } func (c *sigctxt) r4() uint64 { return c.regs().gpr[4] }
func (c *sigctxt) r6() uint64 { return c.regs().gpr[6] } func (c *sigctxt) r5() uint64 { return c.regs().gpr[5] }
func (c *sigctxt) r7() uint64 { return c.regs().gpr[7] } func (c *sigctxt) r6() uint64 { return c.regs().gpr[6] }
func (c *sigctxt) r8() uint64 { return c.regs().gpr[8] } func (c *sigctxt) r7() uint64 { return c.regs().gpr[7] }
func (c *sigctxt) r9() uint64 { return c.regs().gpr[9] } func (c *sigctxt) r8() uint64 { return c.regs().gpr[8] }
func (c *sigctxt) r10() uint64 { return c.regs().gpr[10] } func (c *sigctxt) r9() uint64 { return c.regs().gpr[9] }
func (c *sigctxt) r11() uint64 { return c.regs().gpr[11] } func (c *sigctxt) r10() uint64 { return c.regs().gpr[10] }
func (c *sigctxt) r12() uint64 { return c.regs().gpr[12] } func (c *sigctxt) r11() uint64 { return c.regs().gpr[11] }
func (c *sigctxt) r13() uint64 { return c.regs().gpr[13] } func (c *sigctxt) r12() uint64 { return c.regs().gpr[12] }
func (c *sigctxt) r14() uint64 { return c.regs().gpr[14] } func (c *sigctxt) r13() uint64 { return c.regs().gpr[13] }
func (c *sigctxt) r15() uint64 { return c.regs().gpr[15] } func (c *sigctxt) r14() uint64 { return c.regs().gpr[14] }
func (c *sigctxt) r16() uint64 { return c.regs().gpr[16] } func (c *sigctxt) r15() uint64 { return c.regs().gpr[15] }
func (c *sigctxt) r17() uint64 { return c.regs().gpr[17] } func (c *sigctxt) r16() uint64 { return c.regs().gpr[16] }
func (c *sigctxt) r18() uint64 { return c.regs().gpr[18] } func (c *sigctxt) r17() uint64 { return c.regs().gpr[17] }
func (c *sigctxt) r19() uint64 { return c.regs().gpr[19] } func (c *sigctxt) r18() uint64 { return c.regs().gpr[18] }
func (c *sigctxt) r20() uint64 { return c.regs().gpr[20] } func (c *sigctxt) r19() uint64 { return c.regs().gpr[19] }
func (c *sigctxt) r21() uint64 { return c.regs().gpr[21] } func (c *sigctxt) r20() uint64 { return c.regs().gpr[20] }
func (c *sigctxt) r22() uint64 { return c.regs().gpr[22] } func (c *sigctxt) r21() uint64 { return c.regs().gpr[21] }
func (c *sigctxt) r23() uint64 { return c.regs().gpr[23] } func (c *sigctxt) r22() uint64 { return c.regs().gpr[22] }
func (c *sigctxt) r24() uint64 { return c.regs().gpr[24] } func (c *sigctxt) r23() uint64 { return c.regs().gpr[23] }
func (c *sigctxt) r25() uint64 { return c.regs().gpr[25] } func (c *sigctxt) r24() uint64 { return c.regs().gpr[24] }
func (c *sigctxt) r26() uint64 { return c.regs().gpr[26] } func (c *sigctxt) r25() uint64 { return c.regs().gpr[25] }
func (c *sigctxt) r27() uint64 { return c.regs().gpr[27] } func (c *sigctxt) r26() uint64 { return c.regs().gpr[26] }
func (c *sigctxt) r28() uint64 { return c.regs().gpr[28] } func (c *sigctxt) r27() uint64 { return c.regs().gpr[27] }
func (c *sigctxt) r29() uint64 { return c.regs().gpr[29] } func (c *sigctxt) r28() uint64 { return c.regs().gpr[28] }
func (c *sigctxt) r30() uint64 { return c.regs().gpr[30] } func (c *sigctxt) r29() uint64 { return c.regs().gpr[29] }
func (c *sigctxt) r31() uint64 { return c.regs().gpr[31] } func (c *sigctxt) r30() uint64 { return c.regs().gpr[30] }
func (c *sigctxt) sp() uint64 { return c.regs().gpr[1] } func (c *sigctxt) r31() uint64 { return c.regs().gpr[31] }
func (c *sigctxt) pc() uint64 { return c.regs().nip } func (c *sigctxt) sp() uint64 { return c.regs().gpr[1] }
func (c *sigctxt) trap() uint64 { return c.regs().trap }
func (c *sigctxt) ctr() uint64 { return c.regs().ctr } //go:nosplit
func (c *sigctxt) link() uint64 { return c.regs().link } //go:nowritebarrierrec
func (c *sigctxt) xer() uint64 { return c.regs().xer } func (c *sigctxt) pc() uint64 { return c.regs().nip }
func (c *sigctxt) ccr() uint64 { return c.regs().ccr }
func (c *sigctxt) trap() uint64 { return c.regs().trap }
func (c *sigctxt) ctr() uint64 { return c.regs().ctr }
func (c *sigctxt) link() uint64 { return c.regs().link }
func (c *sigctxt) xer() uint64 { return c.regs().xer }
func (c *sigctxt) ccr() uint64 { return c.regs().ccr }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) } func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr } func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr }
......
...@@ -14,28 +14,35 @@ type sigctxt struct { ...@@ -14,28 +14,35 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { func (c *sigctxt) regs() *sigcontext {
return (*sigcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext)) return (*sigcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext))
} }
func (c *sigctxt) r0() uint64 { return c.regs().gregs[0] }
func (c *sigctxt) r1() uint64 { return c.regs().gregs[1] } func (c *sigctxt) r0() uint64 { return c.regs().gregs[0] }
func (c *sigctxt) r2() uint64 { return c.regs().gregs[2] } func (c *sigctxt) r1() uint64 { return c.regs().gregs[1] }
func (c *sigctxt) r3() uint64 { return c.regs().gregs[3] } func (c *sigctxt) r2() uint64 { return c.regs().gregs[2] }
func (c *sigctxt) r4() uint64 { return c.regs().gregs[4] } func (c *sigctxt) r3() uint64 { return c.regs().gregs[3] }
func (c *sigctxt) r5() uint64 { return c.regs().gregs[5] } func (c *sigctxt) r4() uint64 { return c.regs().gregs[4] }
func (c *sigctxt) r6() uint64 { return c.regs().gregs[6] } func (c *sigctxt) r5() uint64 { return c.regs().gregs[5] }
func (c *sigctxt) r7() uint64 { return c.regs().gregs[7] } func (c *sigctxt) r6() uint64 { return c.regs().gregs[6] }
func (c *sigctxt) r8() uint64 { return c.regs().gregs[8] } func (c *sigctxt) r7() uint64 { return c.regs().gregs[7] }
func (c *sigctxt) r9() uint64 { return c.regs().gregs[9] } func (c *sigctxt) r8() uint64 { return c.regs().gregs[8] }
func (c *sigctxt) r10() uint64 { return c.regs().gregs[10] } func (c *sigctxt) r9() uint64 { return c.regs().gregs[9] }
func (c *sigctxt) r11() uint64 { return c.regs().gregs[11] } func (c *sigctxt) r10() uint64 { return c.regs().gregs[10] }
func (c *sigctxt) r12() uint64 { return c.regs().gregs[12] } func (c *sigctxt) r11() uint64 { return c.regs().gregs[11] }
func (c *sigctxt) r13() uint64 { return c.regs().gregs[13] } func (c *sigctxt) r12() uint64 { return c.regs().gregs[12] }
func (c *sigctxt) r14() uint64 { return c.regs().gregs[14] } func (c *sigctxt) r13() uint64 { return c.regs().gregs[13] }
func (c *sigctxt) r15() uint64 { return c.regs().gregs[15] } func (c *sigctxt) r14() uint64 { return c.regs().gregs[14] }
func (c *sigctxt) link() uint64 { return c.regs().gregs[14] } func (c *sigctxt) r15() uint64 { return c.regs().gregs[15] }
func (c *sigctxt) sp() uint64 { return c.regs().gregs[15] } func (c *sigctxt) link() uint64 { return c.regs().gregs[14] }
func (c *sigctxt) pc() uint64 { return c.regs().psw_addr } func (c *sigctxt) sp() uint64 { return c.regs().gregs[15] }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uint64 { return c.regs().psw_addr }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) } func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr } func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr }
...@@ -70,7 +77,10 @@ func dumpregs(c *sigctxt) { ...@@ -70,7 +77,10 @@ func dumpregs(c *sigctxt) {
print("link ", hex(c.link()), "\n") print("link ", hex(c.link()), "\n")
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) } func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) } func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) } func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) }
func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) } func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
......
...@@ -51,7 +51,10 @@ func dumpregs(c *sigctxt) { ...@@ -51,7 +51,10 @@ func dumpregs(c *sigctxt) {
print("hi ", hex(c.hi()), "\n") print("hi ", hex(c.hi()), "\n")
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) } func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) } func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) } func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) }
func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) } func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
......
...@@ -11,22 +11,29 @@ type sigctxt struct { ...@@ -11,22 +11,29 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *excregs386 { return &(*exccontext)(c.ctxt).regs } func (c *sigctxt) regs() *excregs386 { return &(*exccontext)(c.ctxt).regs }
func (c *sigctxt) eax() uint32 { return c.regs().eax }
func (c *sigctxt) ebx() uint32 { return c.regs().ebx } func (c *sigctxt) eax() uint32 { return c.regs().eax }
func (c *sigctxt) ecx() uint32 { return c.regs().ecx } func (c *sigctxt) ebx() uint32 { return c.regs().ebx }
func (c *sigctxt) edx() uint32 { return c.regs().edx } func (c *sigctxt) ecx() uint32 { return c.regs().ecx }
func (c *sigctxt) edi() uint32 { return c.regs().edi } func (c *sigctxt) edx() uint32 { return c.regs().edx }
func (c *sigctxt) esi() uint32 { return c.regs().esi } func (c *sigctxt) edi() uint32 { return c.regs().edi }
func (c *sigctxt) ebp() uint32 { return c.regs().ebp } func (c *sigctxt) esi() uint32 { return c.regs().esi }
func (c *sigctxt) esp() uint32 { return c.regs().esp } func (c *sigctxt) ebp() uint32 { return c.regs().ebp }
func (c *sigctxt) eip() uint32 { return c.regs().eip } func (c *sigctxt) esp() uint32 { return c.regs().esp }
func (c *sigctxt) eflags() uint32 { return c.regs().eflags }
func (c *sigctxt) cs() uint32 { return ^uint32(0) } //go:nosplit
func (c *sigctxt) fs() uint32 { return ^uint32(0) } //go:nowritebarrierrec
func (c *sigctxt) gs() uint32 { return ^uint32(0) } func (c *sigctxt) eip() uint32 { return c.regs().eip }
func (c *sigctxt) sigcode() uint32 { return ^uint32(0) }
func (c *sigctxt) sigaddr() uint32 { return 0 } func (c *sigctxt) eflags() uint32 { return c.regs().eflags }
func (c *sigctxt) cs() uint32 { return ^uint32(0) }
func (c *sigctxt) fs() uint32 { return ^uint32(0) }
func (c *sigctxt) gs() uint32 { return ^uint32(0) }
func (c *sigctxt) sigcode() uint32 { return ^uint32(0) }
func (c *sigctxt) sigaddr() uint32 { return 0 }
func (c *sigctxt) set_eip(x uint32) { c.regs().eip = x } func (c *sigctxt) set_eip(x uint32) { c.regs().eip = x }
func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x } func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x }
......
...@@ -11,26 +11,33 @@ type sigctxt struct { ...@@ -11,26 +11,33 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *excregsamd64 { func (c *sigctxt) regs() *excregsamd64 {
return &(*exccontext)(c.ctxt).regs return &(*exccontext)(c.ctxt).regs
} }
func (c *sigctxt) rax() uint64 { return c.regs().rax }
func (c *sigctxt) rbx() uint64 { return c.regs().rbx } func (c *sigctxt) rax() uint64 { return c.regs().rax }
func (c *sigctxt) rcx() uint64 { return c.regs().rcx } func (c *sigctxt) rbx() uint64 { return c.regs().rbx }
func (c *sigctxt) rdx() uint64 { return c.regs().rdx } func (c *sigctxt) rcx() uint64 { return c.regs().rcx }
func (c *sigctxt) rdi() uint64 { return c.regs().rdi } func (c *sigctxt) rdx() uint64 { return c.regs().rdx }
func (c *sigctxt) rsi() uint64 { return c.regs().rsi } func (c *sigctxt) rdi() uint64 { return c.regs().rdi }
func (c *sigctxt) rbp() uint64 { return c.regs().rbp } func (c *sigctxt) rsi() uint64 { return c.regs().rsi }
func (c *sigctxt) rsp() uint64 { return c.regs().rsp } func (c *sigctxt) rbp() uint64 { return c.regs().rbp }
func (c *sigctxt) r8() uint64 { return c.regs().r8 } func (c *sigctxt) rsp() uint64 { return c.regs().rsp }
func (c *sigctxt) r9() uint64 { return c.regs().r9 } func (c *sigctxt) r8() uint64 { return c.regs().r8 }
func (c *sigctxt) r10() uint64 { return c.regs().r10 } func (c *sigctxt) r9() uint64 { return c.regs().r9 }
func (c *sigctxt) r11() uint64 { return c.regs().r11 } func (c *sigctxt) r10() uint64 { return c.regs().r10 }
func (c *sigctxt) r12() uint64 { return c.regs().r12 } func (c *sigctxt) r11() uint64 { return c.regs().r11 }
func (c *sigctxt) r13() uint64 { return c.regs().r13 } func (c *sigctxt) r12() uint64 { return c.regs().r12 }
func (c *sigctxt) r14() uint64 { return c.regs().r14 } func (c *sigctxt) r13() uint64 { return c.regs().r13 }
func (c *sigctxt) r15() uint64 { return c.regs().r15 } func (c *sigctxt) r14() uint64 { return c.regs().r14 }
func (c *sigctxt) rip() uint64 { return c.regs().rip } func (c *sigctxt) r15() uint64 { return c.regs().r15 }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) rip() uint64 { return c.regs().rip }
func (c *sigctxt) rflags() uint64 { return uint64(c.regs().rflags) } func (c *sigctxt) rflags() uint64 { return uint64(c.regs().rflags) }
func (c *sigctxt) cs() uint64 { return ^uint64(0) } func (c *sigctxt) cs() uint64 { return ^uint64(0) }
func (c *sigctxt) fs() uint64 { return ^uint64(0) } func (c *sigctxt) fs() uint64 { return ^uint64(0) }
......
...@@ -11,24 +11,30 @@ type sigctxt struct { ...@@ -11,24 +11,30 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *excregsarm { return &(*exccontext)(c.ctxt).regs } func (c *sigctxt) regs() *excregsarm { return &(*exccontext)(c.ctxt).regs }
func (c *sigctxt) r0() uint32 { return c.regs().r0 } func (c *sigctxt) r0() uint32 { return c.regs().r0 }
func (c *sigctxt) r1() uint32 { return c.regs().r1 } func (c *sigctxt) r1() uint32 { return c.regs().r1 }
func (c *sigctxt) r2() uint32 { return c.regs().r2 } func (c *sigctxt) r2() uint32 { return c.regs().r2 }
func (c *sigctxt) r3() uint32 { return c.regs().r3 } func (c *sigctxt) r3() uint32 { return c.regs().r3 }
func (c *sigctxt) r4() uint32 { return c.regs().r4 } func (c *sigctxt) r4() uint32 { return c.regs().r4 }
func (c *sigctxt) r5() uint32 { return c.regs().r5 } func (c *sigctxt) r5() uint32 { return c.regs().r5 }
func (c *sigctxt) r6() uint32 { return c.regs().r6 } func (c *sigctxt) r6() uint32 { return c.regs().r6 }
func (c *sigctxt) r7() uint32 { return c.regs().r7 } func (c *sigctxt) r7() uint32 { return c.regs().r7 }
func (c *sigctxt) r8() uint32 { return c.regs().r8 } func (c *sigctxt) r8() uint32 { return c.regs().r8 }
func (c *sigctxt) r9() uint32 { return c.regs().r9 } func (c *sigctxt) r9() uint32 { return c.regs().r9 }
func (c *sigctxt) r10() uint32 { return c.regs().r10 } func (c *sigctxt) r10() uint32 { return c.regs().r10 }
func (c *sigctxt) fp() uint32 { return c.regs().r11 } func (c *sigctxt) fp() uint32 { return c.regs().r11 }
func (c *sigctxt) ip() uint32 { return c.regs().r12 } func (c *sigctxt) ip() uint32 { return c.regs().r12 }
func (c *sigctxt) sp() uint32 { return c.regs().sp } func (c *sigctxt) sp() uint32 { return c.regs().sp }
func (c *sigctxt) lr() uint32 { return c.regs().lr } func (c *sigctxt) lr() uint32 { return c.regs().lr }
func (c *sigctxt) pc() uint32 { return c.regs().pc }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uint32 { return c.regs().pc }
func (c *sigctxt) cpsr() uint32 { return c.regs().cpsr } func (c *sigctxt) cpsr() uint32 { return c.regs().cpsr }
func (c *sigctxt) fault() uint32 { return ^uint32(0) } func (c *sigctxt) fault() uint32 { return ^uint32(0) }
func (c *sigctxt) trap() uint32 { return ^uint32(0) } func (c *sigctxt) trap() uint32 { return ^uint32(0) }
......
...@@ -11,21 +11,28 @@ type sigctxt struct { ...@@ -11,21 +11,28 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *mcontextt { return &(*ucontextt)(c.ctxt).uc_mcontext } func (c *sigctxt) regs() *mcontextt { return &(*ucontextt)(c.ctxt).uc_mcontext }
func (c *sigctxt) eax() uint32 { return c.regs().__gregs[_REG_EAX] }
func (c *sigctxt) ebx() uint32 { return c.regs().__gregs[_REG_EBX] } func (c *sigctxt) eax() uint32 { return c.regs().__gregs[_REG_EAX] }
func (c *sigctxt) ecx() uint32 { return c.regs().__gregs[_REG_ECX] } func (c *sigctxt) ebx() uint32 { return c.regs().__gregs[_REG_EBX] }
func (c *sigctxt) edx() uint32 { return c.regs().__gregs[_REG_EDX] } func (c *sigctxt) ecx() uint32 { return c.regs().__gregs[_REG_ECX] }
func (c *sigctxt) edi() uint32 { return c.regs().__gregs[_REG_EDI] } func (c *sigctxt) edx() uint32 { return c.regs().__gregs[_REG_EDX] }
func (c *sigctxt) esi() uint32 { return c.regs().__gregs[_REG_ESI] } func (c *sigctxt) edi() uint32 { return c.regs().__gregs[_REG_EDI] }
func (c *sigctxt) ebp() uint32 { return c.regs().__gregs[_REG_EBP] } func (c *sigctxt) esi() uint32 { return c.regs().__gregs[_REG_ESI] }
func (c *sigctxt) esp() uint32 { return c.regs().__gregs[_REG_UESP] } func (c *sigctxt) ebp() uint32 { return c.regs().__gregs[_REG_EBP] }
func (c *sigctxt) eip() uint32 { return c.regs().__gregs[_REG_EIP] } func (c *sigctxt) esp() uint32 { return c.regs().__gregs[_REG_UESP] }
func (c *sigctxt) eflags() uint32 { return c.regs().__gregs[_REG_EFL] }
func (c *sigctxt) cs() uint32 { return c.regs().__gregs[_REG_CS] } //go:nosplit
func (c *sigctxt) fs() uint32 { return c.regs().__gregs[_REG_FS] } //go:nowritebarrierrec
func (c *sigctxt) gs() uint32 { return c.regs().__gregs[_REG_GS] } func (c *sigctxt) eip() uint32 { return c.regs().__gregs[_REG_EIP] }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info._code) }
func (c *sigctxt) eflags() uint32 { return c.regs().__gregs[_REG_EFL] }
func (c *sigctxt) cs() uint32 { return c.regs().__gregs[_REG_CS] }
func (c *sigctxt) fs() uint32 { return c.regs().__gregs[_REG_FS] }
func (c *sigctxt) gs() uint32 { return c.regs().__gregs[_REG_GS] }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info._code) }
func (c *sigctxt) sigaddr() uint32 { func (c *sigctxt) sigaddr() uint32 {
return *(*uint32)(unsafe.Pointer(&c.info._reason[0])) return *(*uint32)(unsafe.Pointer(&c.info._reason[0]))
} }
......
...@@ -11,26 +11,33 @@ type sigctxt struct { ...@@ -11,26 +11,33 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *mcontextt { func (c *sigctxt) regs() *mcontextt {
return (*mcontextt)(unsafe.Pointer(&(*ucontextt)(c.ctxt).uc_mcontext)) return (*mcontextt)(unsafe.Pointer(&(*ucontextt)(c.ctxt).uc_mcontext))
} }
func (c *sigctxt) rax() uint64 { return c.regs().__gregs[_REG_RAX] }
func (c *sigctxt) rbx() uint64 { return c.regs().__gregs[_REG_RBX] } func (c *sigctxt) rax() uint64 { return c.regs().__gregs[_REG_RAX] }
func (c *sigctxt) rcx() uint64 { return c.regs().__gregs[_REG_RCX] } func (c *sigctxt) rbx() uint64 { return c.regs().__gregs[_REG_RBX] }
func (c *sigctxt) rdx() uint64 { return c.regs().__gregs[_REG_RDX] } func (c *sigctxt) rcx() uint64 { return c.regs().__gregs[_REG_RCX] }
func (c *sigctxt) rdi() uint64 { return c.regs().__gregs[_REG_RDI] } func (c *sigctxt) rdx() uint64 { return c.regs().__gregs[_REG_RDX] }
func (c *sigctxt) rsi() uint64 { return c.regs().__gregs[_REG_RSI] } func (c *sigctxt) rdi() uint64 { return c.regs().__gregs[_REG_RDI] }
func (c *sigctxt) rbp() uint64 { return c.regs().__gregs[_REG_RBP] } func (c *sigctxt) rsi() uint64 { return c.regs().__gregs[_REG_RSI] }
func (c *sigctxt) rsp() uint64 { return c.regs().__gregs[_REG_RSP] } func (c *sigctxt) rbp() uint64 { return c.regs().__gregs[_REG_RBP] }
func (c *sigctxt) r8() uint64 { return c.regs().__gregs[_REG_R8] } func (c *sigctxt) rsp() uint64 { return c.regs().__gregs[_REG_RSP] }
func (c *sigctxt) r9() uint64 { return c.regs().__gregs[_REG_R8] } func (c *sigctxt) r8() uint64 { return c.regs().__gregs[_REG_R8] }
func (c *sigctxt) r10() uint64 { return c.regs().__gregs[_REG_R10] } func (c *sigctxt) r9() uint64 { return c.regs().__gregs[_REG_R8] }
func (c *sigctxt) r11() uint64 { return c.regs().__gregs[_REG_R11] } func (c *sigctxt) r10() uint64 { return c.regs().__gregs[_REG_R10] }
func (c *sigctxt) r12() uint64 { return c.regs().__gregs[_REG_R12] } func (c *sigctxt) r11() uint64 { return c.regs().__gregs[_REG_R11] }
func (c *sigctxt) r13() uint64 { return c.regs().__gregs[_REG_R13] } func (c *sigctxt) r12() uint64 { return c.regs().__gregs[_REG_R12] }
func (c *sigctxt) r14() uint64 { return c.regs().__gregs[_REG_R14] } func (c *sigctxt) r13() uint64 { return c.regs().__gregs[_REG_R13] }
func (c *sigctxt) r15() uint64 { return c.regs().__gregs[_REG_R15] } func (c *sigctxt) r14() uint64 { return c.regs().__gregs[_REG_R14] }
func (c *sigctxt) rip() uint64 { return c.regs().__gregs[_REG_RIP] } func (c *sigctxt) r15() uint64 { return c.regs().__gregs[_REG_R15] }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) rip() uint64 { return c.regs().__gregs[_REG_RIP] }
func (c *sigctxt) rflags() uint64 { return c.regs().__gregs[_REG_RFLAGS] } func (c *sigctxt) rflags() uint64 { return c.regs().__gregs[_REG_RFLAGS] }
func (c *sigctxt) cs() uint64 { return c.regs().__gregs[_REG_CS] } func (c *sigctxt) cs() uint64 { return c.regs().__gregs[_REG_CS] }
func (c *sigctxt) fs() uint64 { return c.regs().__gregs[_REG_FS] } func (c *sigctxt) fs() uint64 { return c.regs().__gregs[_REG_FS] }
......
...@@ -11,28 +11,35 @@ type sigctxt struct { ...@@ -11,28 +11,35 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *mcontextt { return &(*ucontextt)(c.ctxt).uc_mcontext } func (c *sigctxt) regs() *mcontextt { return &(*ucontextt)(c.ctxt).uc_mcontext }
func (c *sigctxt) r0() uint32 { return c.regs().__gregs[_REG_R0] }
func (c *sigctxt) r1() uint32 { return c.regs().__gregs[_REG_R1] } func (c *sigctxt) r0() uint32 { return c.regs().__gregs[_REG_R0] }
func (c *sigctxt) r2() uint32 { return c.regs().__gregs[_REG_R2] } func (c *sigctxt) r1() uint32 { return c.regs().__gregs[_REG_R1] }
func (c *sigctxt) r3() uint32 { return c.regs().__gregs[_REG_R3] } func (c *sigctxt) r2() uint32 { return c.regs().__gregs[_REG_R2] }
func (c *sigctxt) r4() uint32 { return c.regs().__gregs[_REG_R4] } func (c *sigctxt) r3() uint32 { return c.regs().__gregs[_REG_R3] }
func (c *sigctxt) r5() uint32 { return c.regs().__gregs[_REG_R5] } func (c *sigctxt) r4() uint32 { return c.regs().__gregs[_REG_R4] }
func (c *sigctxt) r6() uint32 { return c.regs().__gregs[_REG_R6] } func (c *sigctxt) r5() uint32 { return c.regs().__gregs[_REG_R5] }
func (c *sigctxt) r7() uint32 { return c.regs().__gregs[_REG_R7] } func (c *sigctxt) r6() uint32 { return c.regs().__gregs[_REG_R6] }
func (c *sigctxt) r8() uint32 { return c.regs().__gregs[_REG_R8] } func (c *sigctxt) r7() uint32 { return c.regs().__gregs[_REG_R7] }
func (c *sigctxt) r9() uint32 { return c.regs().__gregs[_REG_R9] } func (c *sigctxt) r8() uint32 { return c.regs().__gregs[_REG_R8] }
func (c *sigctxt) r10() uint32 { return c.regs().__gregs[_REG_R10] } func (c *sigctxt) r9() uint32 { return c.regs().__gregs[_REG_R9] }
func (c *sigctxt) fp() uint32 { return c.regs().__gregs[_REG_R11] } func (c *sigctxt) r10() uint32 { return c.regs().__gregs[_REG_R10] }
func (c *sigctxt) ip() uint32 { return c.regs().__gregs[_REG_R12] } func (c *sigctxt) fp() uint32 { return c.regs().__gregs[_REG_R11] }
func (c *sigctxt) sp() uint32 { return c.regs().__gregs[_REG_R13] } func (c *sigctxt) ip() uint32 { return c.regs().__gregs[_REG_R12] }
func (c *sigctxt) lr() uint32 { return c.regs().__gregs[_REG_R14] } func (c *sigctxt) sp() uint32 { return c.regs().__gregs[_REG_R13] }
func (c *sigctxt) pc() uint32 { return c.regs().__gregs[_REG_R15] } func (c *sigctxt) lr() uint32 { return c.regs().__gregs[_REG_R14] }
func (c *sigctxt) cpsr() uint32 { return c.regs().__gregs[_REG_CPSR] }
func (c *sigctxt) fault() uint32 { return uint32(c.info._reason) } //go:nosplit
func (c *sigctxt) trap() uint32 { return 0 } //go:nowritebarrierrec
func (c *sigctxt) error() uint32 { return 0 } func (c *sigctxt) pc() uint32 { return c.regs().__gregs[_REG_R15] }
func (c *sigctxt) oldmask() uint32 { return 0 }
func (c *sigctxt) cpsr() uint32 { return c.regs().__gregs[_REG_CPSR] }
func (c *sigctxt) fault() uint32 { return uint32(c.info._reason) }
func (c *sigctxt) trap() uint32 { return 0 }
func (c *sigctxt) error() uint32 { return 0 }
func (c *sigctxt) oldmask() uint32 { return 0 }
func (c *sigctxt) sigcode() uint32 { return uint32(c.info._code) } func (c *sigctxt) sigcode() uint32 { return uint32(c.info._code) }
func (c *sigctxt) sigaddr() uint32 { return uint32(c.info._reason) } func (c *sigctxt) sigaddr() uint32 { return uint32(c.info._reason) }
......
...@@ -11,19 +11,25 @@ type sigctxt struct { ...@@ -11,19 +11,25 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { func (c *sigctxt) regs() *sigcontext {
return (*sigcontext)(c.ctxt) return (*sigcontext)(c.ctxt)
} }
func (c *sigctxt) eax() uint32 { return c.regs().sc_eax } func (c *sigctxt) eax() uint32 { return c.regs().sc_eax }
func (c *sigctxt) ebx() uint32 { return c.regs().sc_ebx } func (c *sigctxt) ebx() uint32 { return c.regs().sc_ebx }
func (c *sigctxt) ecx() uint32 { return c.regs().sc_ecx } func (c *sigctxt) ecx() uint32 { return c.regs().sc_ecx }
func (c *sigctxt) edx() uint32 { return c.regs().sc_edx } func (c *sigctxt) edx() uint32 { return c.regs().sc_edx }
func (c *sigctxt) edi() uint32 { return c.regs().sc_edi } func (c *sigctxt) edi() uint32 { return c.regs().sc_edi }
func (c *sigctxt) esi() uint32 { return c.regs().sc_esi } func (c *sigctxt) esi() uint32 { return c.regs().sc_esi }
func (c *sigctxt) ebp() uint32 { return c.regs().sc_ebp } func (c *sigctxt) ebp() uint32 { return c.regs().sc_ebp }
func (c *sigctxt) esp() uint32 { return c.regs().sc_esp } func (c *sigctxt) esp() uint32 { return c.regs().sc_esp }
func (c *sigctxt) eip() uint32 { return c.regs().sc_eip }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) eip() uint32 { return c.regs().sc_eip }
func (c *sigctxt) eflags() uint32 { return c.regs().sc_eflags } func (c *sigctxt) eflags() uint32 { return c.regs().sc_eflags }
func (c *sigctxt) cs() uint32 { return c.regs().sc_cs } func (c *sigctxt) cs() uint32 { return c.regs().sc_cs }
func (c *sigctxt) fs() uint32 { return c.regs().sc_fs } func (c *sigctxt) fs() uint32 { return c.regs().sc_fs }
......
...@@ -11,27 +11,33 @@ type sigctxt struct { ...@@ -11,27 +11,33 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { func (c *sigctxt) regs() *sigcontext {
return (*sigcontext)(c.ctxt) return (*sigcontext)(c.ctxt)
} }
func (c *sigctxt) rax() uint64 { return c.regs().sc_rax } func (c *sigctxt) rax() uint64 { return c.regs().sc_rax }
func (c *sigctxt) rbx() uint64 { return c.regs().sc_rbx } func (c *sigctxt) rbx() uint64 { return c.regs().sc_rbx }
func (c *sigctxt) rcx() uint64 { return c.regs().sc_rcx } func (c *sigctxt) rcx() uint64 { return c.regs().sc_rcx }
func (c *sigctxt) rdx() uint64 { return c.regs().sc_rdx } func (c *sigctxt) rdx() uint64 { return c.regs().sc_rdx }
func (c *sigctxt) rdi() uint64 { return c.regs().sc_rdi } func (c *sigctxt) rdi() uint64 { return c.regs().sc_rdi }
func (c *sigctxt) rsi() uint64 { return c.regs().sc_rsi } func (c *sigctxt) rsi() uint64 { return c.regs().sc_rsi }
func (c *sigctxt) rbp() uint64 { return c.regs().sc_rbp } func (c *sigctxt) rbp() uint64 { return c.regs().sc_rbp }
func (c *sigctxt) rsp() uint64 { return c.regs().sc_rsp } func (c *sigctxt) rsp() uint64 { return c.regs().sc_rsp }
func (c *sigctxt) r8() uint64 { return c.regs().sc_r8 } func (c *sigctxt) r8() uint64 { return c.regs().sc_r8 }
func (c *sigctxt) r9() uint64 { return c.regs().sc_r9 } func (c *sigctxt) r9() uint64 { return c.regs().sc_r9 }
func (c *sigctxt) r10() uint64 { return c.regs().sc_r10 } func (c *sigctxt) r10() uint64 { return c.regs().sc_r10 }
func (c *sigctxt) r11() uint64 { return c.regs().sc_r11 } func (c *sigctxt) r11() uint64 { return c.regs().sc_r11 }
func (c *sigctxt) r12() uint64 { return c.regs().sc_r12 } func (c *sigctxt) r12() uint64 { return c.regs().sc_r12 }
func (c *sigctxt) r13() uint64 { return c.regs().sc_r13 } func (c *sigctxt) r13() uint64 { return c.regs().sc_r13 }
func (c *sigctxt) r14() uint64 { return c.regs().sc_r14 } func (c *sigctxt) r14() uint64 { return c.regs().sc_r14 }
func (c *sigctxt) r15() uint64 { return c.regs().sc_r15 } func (c *sigctxt) r15() uint64 { return c.regs().sc_r15 }
func (c *sigctxt) rip() uint64 { return c.regs().sc_rip }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) rip() uint64 { return c.regs().sc_rip }
func (c *sigctxt) rflags() uint64 { return c.regs().sc_rflags } func (c *sigctxt) rflags() uint64 { return c.regs().sc_rflags }
func (c *sigctxt) cs() uint64 { return c.regs().sc_cs } func (c *sigctxt) cs() uint64 { return c.regs().sc_cs }
func (c *sigctxt) fs() uint64 { return c.regs().sc_fs } func (c *sigctxt) fs() uint64 { return c.regs().sc_fs }
......
...@@ -11,26 +11,32 @@ type sigctxt struct { ...@@ -11,26 +11,32 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *sigcontext { func (c *sigctxt) regs() *sigcontext {
return (*sigcontext)(c.ctxt) return (*sigcontext)(c.ctxt)
} }
func (c *sigctxt) r0() uint32 { return c.regs().sc_r0 } func (c *sigctxt) r0() uint32 { return c.regs().sc_r0 }
func (c *sigctxt) r1() uint32 { return c.regs().sc_r1 } func (c *sigctxt) r1() uint32 { return c.regs().sc_r1 }
func (c *sigctxt) r2() uint32 { return c.regs().sc_r2 } func (c *sigctxt) r2() uint32 { return c.regs().sc_r2 }
func (c *sigctxt) r3() uint32 { return c.regs().sc_r3 } func (c *sigctxt) r3() uint32 { return c.regs().sc_r3 }
func (c *sigctxt) r4() uint32 { return c.regs().sc_r4 } func (c *sigctxt) r4() uint32 { return c.regs().sc_r4 }
func (c *sigctxt) r5() uint32 { return c.regs().sc_r5 } func (c *sigctxt) r5() uint32 { return c.regs().sc_r5 }
func (c *sigctxt) r6() uint32 { return c.regs().sc_r6 } func (c *sigctxt) r6() uint32 { return c.regs().sc_r6 }
func (c *sigctxt) r7() uint32 { return c.regs().sc_r7 } func (c *sigctxt) r7() uint32 { return c.regs().sc_r7 }
func (c *sigctxt) r8() uint32 { return c.regs().sc_r8 } func (c *sigctxt) r8() uint32 { return c.regs().sc_r8 }
func (c *sigctxt) r9() uint32 { return c.regs().sc_r9 } func (c *sigctxt) r9() uint32 { return c.regs().sc_r9 }
func (c *sigctxt) r10() uint32 { return c.regs().sc_r10 } func (c *sigctxt) r10() uint32 { return c.regs().sc_r10 }
func (c *sigctxt) fp() uint32 { return c.regs().sc_r11 } func (c *sigctxt) fp() uint32 { return c.regs().sc_r11 }
func (c *sigctxt) ip() uint32 { return c.regs().sc_r12 } func (c *sigctxt) ip() uint32 { return c.regs().sc_r12 }
func (c *sigctxt) sp() uint32 { return c.regs().sc_usr_sp } func (c *sigctxt) sp() uint32 { return c.regs().sc_usr_sp }
func (c *sigctxt) lr() uint32 { return c.regs().sc_usr_lr } func (c *sigctxt) lr() uint32 { return c.regs().sc_usr_lr }
func (c *sigctxt) pc() uint32 { return c.regs().sc_pc }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) pc() uint32 { return c.regs().sc_pc }
func (c *sigctxt) cpsr() uint32 { return c.regs().sc_spsr } func (c *sigctxt) cpsr() uint32 { return c.regs().sc_spsr }
func (c *sigctxt) fault() uint32 { return c.sigaddr() } func (c *sigctxt) fault() uint32 { return c.sigaddr() }
func (c *sigctxt) trap() uint32 { return 0 } func (c *sigctxt) trap() uint32 { return 0 }
......
...@@ -53,7 +53,10 @@ func dumpregs(c *sigctxt) { ...@@ -53,7 +53,10 @@ func dumpregs(c *sigctxt) {
print("trap ", hex(c.trap()), "\n") print("trap ", hex(c.trap()), "\n")
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) } func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) } func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) } func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) }
......
...@@ -11,26 +11,33 @@ type sigctxt struct { ...@@ -11,26 +11,33 @@ type sigctxt struct {
ctxt unsafe.Pointer ctxt unsafe.Pointer
} }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) regs() *mcontext { func (c *sigctxt) regs() *mcontext {
return (*mcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext)) return (*mcontext)(unsafe.Pointer(&(*ucontext)(c.ctxt).uc_mcontext))
} }
func (c *sigctxt) rax() uint64 { return uint64(c.regs().gregs[_REG_RAX]) }
func (c *sigctxt) rbx() uint64 { return uint64(c.regs().gregs[_REG_RBX]) } func (c *sigctxt) rax() uint64 { return uint64(c.regs().gregs[_REG_RAX]) }
func (c *sigctxt) rcx() uint64 { return uint64(c.regs().gregs[_REG_RCX]) } func (c *sigctxt) rbx() uint64 { return uint64(c.regs().gregs[_REG_RBX]) }
func (c *sigctxt) rdx() uint64 { return uint64(c.regs().gregs[_REG_RDX]) } func (c *sigctxt) rcx() uint64 { return uint64(c.regs().gregs[_REG_RCX]) }
func (c *sigctxt) rdi() uint64 { return uint64(c.regs().gregs[_REG_RDI]) } func (c *sigctxt) rdx() uint64 { return uint64(c.regs().gregs[_REG_RDX]) }
func (c *sigctxt) rsi() uint64 { return uint64(c.regs().gregs[_REG_RSI]) } func (c *sigctxt) rdi() uint64 { return uint64(c.regs().gregs[_REG_RDI]) }
func (c *sigctxt) rbp() uint64 { return uint64(c.regs().gregs[_REG_RBP]) } func (c *sigctxt) rsi() uint64 { return uint64(c.regs().gregs[_REG_RSI]) }
func (c *sigctxt) rsp() uint64 { return uint64(c.regs().gregs[_REG_RSP]) } func (c *sigctxt) rbp() uint64 { return uint64(c.regs().gregs[_REG_RBP]) }
func (c *sigctxt) r8() uint64 { return uint64(c.regs().gregs[_REG_R8]) } func (c *sigctxt) rsp() uint64 { return uint64(c.regs().gregs[_REG_RSP]) }
func (c *sigctxt) r9() uint64 { return uint64(c.regs().gregs[_REG_R9]) } func (c *sigctxt) r8() uint64 { return uint64(c.regs().gregs[_REG_R8]) }
func (c *sigctxt) r10() uint64 { return uint64(c.regs().gregs[_REG_R10]) } func (c *sigctxt) r9() uint64 { return uint64(c.regs().gregs[_REG_R9]) }
func (c *sigctxt) r11() uint64 { return uint64(c.regs().gregs[_REG_R11]) } func (c *sigctxt) r10() uint64 { return uint64(c.regs().gregs[_REG_R10]) }
func (c *sigctxt) r12() uint64 { return uint64(c.regs().gregs[_REG_R12]) } func (c *sigctxt) r11() uint64 { return uint64(c.regs().gregs[_REG_R11]) }
func (c *sigctxt) r13() uint64 { return uint64(c.regs().gregs[_REG_R13]) } func (c *sigctxt) r12() uint64 { return uint64(c.regs().gregs[_REG_R12]) }
func (c *sigctxt) r14() uint64 { return uint64(c.regs().gregs[_REG_R14]) } func (c *sigctxt) r13() uint64 { return uint64(c.regs().gregs[_REG_R13]) }
func (c *sigctxt) r15() uint64 { return uint64(c.regs().gregs[_REG_R15]) } func (c *sigctxt) r14() uint64 { return uint64(c.regs().gregs[_REG_R14]) }
func (c *sigctxt) rip() uint64 { return uint64(c.regs().gregs[_REG_RIP]) } func (c *sigctxt) r15() uint64 { return uint64(c.regs().gregs[_REG_R15]) }
//go:nosplit
//go:nowritebarrierrec
func (c *sigctxt) rip() uint64 { return uint64(c.regs().gregs[_REG_RIP]) }
func (c *sigctxt) rflags() uint64 { return uint64(c.regs().gregs[_REG_RFLAGS]) } func (c *sigctxt) rflags() uint64 { return uint64(c.regs().gregs[_REG_RFLAGS]) }
func (c *sigctxt) cs() uint64 { return uint64(c.regs().gregs[_REG_CS]) } func (c *sigctxt) cs() uint64 { return uint64(c.regs().gregs[_REG_CS]) }
func (c *sigctxt) fs() uint64 { return uint64(c.regs().gregs[_REG_FS]) } func (c *sigctxt) fs() uint64 { return uint64(c.regs().gregs[_REG_FS]) }
......
...@@ -202,15 +202,12 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) { ...@@ -202,15 +202,12 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
} }
g := getg() g := getg()
if g == nil { if g == nil {
c := &sigctxt{info, ctx}
if sig == _SIGPROF { if sig == _SIGPROF {
// Ignore profiling signals that arrive on sigprofNonGoPC(c.sigpc())
// non-Go threads. On some systems they will
// be handled directly by the signal handler,
// by calling sigprofNonGo, in which case we won't
// get here anyhow.
return return
} }
badsignal(uintptr(sig), &sigctxt{info, ctx}) badsignal(uintptr(sig), c)
return return
} }
......
...@@ -80,11 +80,19 @@ import ( ...@@ -80,11 +80,19 @@ import (
func init() { func init() {
register("CgoPprofThread", CgoPprofThread) register("CgoPprofThread", CgoPprofThread)
register("CgoPprofThreadNoTraceback", CgoPprofThreadNoTraceback)
} }
func CgoPprofThread() { func CgoPprofThread() {
runtime.SetCgoTraceback(0, unsafe.Pointer(C.pprofCgoThreadTraceback), nil, nil) runtime.SetCgoTraceback(0, unsafe.Pointer(C.pprofCgoThreadTraceback), nil, nil)
pprofThread()
}
func CgoPprofThreadNoTraceback() {
pprofThread()
}
func pprofThread() {
f, err := ioutil.TempFile("", "prof") f, err := ioutil.TempFile("", "prof")
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err) fmt.Fprintln(os.Stderr, err)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment