]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: record current PC for SIGPROF on non-Go thread
authorIan Lance Taylor <iant@golang.org>
Tue, 4 Oct 2016 14:11:55 +0000 (07:11 -0700)
committerIan Lance Taylor <iant@golang.org>
Tue, 11 Oct 2016 12:56:15 +0000 (12:56 +0000)
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: Dmitry Vyukov <dvyukov@google.com>
38 files changed:
src/runtime/crash_cgo_test.go
src/runtime/defs_plan9_386.go
src/runtime/defs_plan9_amd64.go
src/runtime/defs_plan9_arm.go
src/runtime/proc.go
src/runtime/signal_386.go
src/runtime/signal_amd64x.go
src/runtime/signal_arm.go
src/runtime/signal_arm64.go
src/runtime/signal_darwin_386.go
src/runtime/signal_darwin_amd64.go
src/runtime/signal_darwin_arm.go
src/runtime/signal_darwin_arm64.go
src/runtime/signal_dragonfly_amd64.go
src/runtime/signal_freebsd_386.go
src/runtime/signal_freebsd_amd64.go
src/runtime/signal_freebsd_arm.go
src/runtime/signal_linux_386.go
src/runtime/signal_linux_amd64.go
src/runtime/signal_linux_arm.go
src/runtime/signal_linux_arm64.go
src/runtime/signal_linux_mips64x.go
src/runtime/signal_linux_ppc64x.go
src/runtime/signal_linux_s390x.go
src/runtime/signal_mips64x.go
src/runtime/signal_nacl_386.go
src/runtime/signal_nacl_amd64p32.go
src/runtime/signal_nacl_arm.go
src/runtime/signal_netbsd_386.go
src/runtime/signal_netbsd_amd64.go
src/runtime/signal_netbsd_arm.go
src/runtime/signal_openbsd_386.go
src/runtime/signal_openbsd_amd64.go
src/runtime/signal_openbsd_arm.go
src/runtime/signal_ppc64x.go
src/runtime/signal_solaris_amd64.go
src/runtime/signal_unix.go
src/runtime/testdata/testprogcgo/threadpprof.go

index 2642c28f0d9e57638fa016f17542bdd89dca2462..34d1f0594a3c98d86c4f5b1d63c9afde7ccb29bd 100644 (file)
@@ -311,6 +311,10 @@ func TestCgoPprofThread(t *testing.T) {
        testCgoPprof(t, "", "CgoPprofThread")
 }
 
+func TestCgoPprofThreadNoTraceback(t *testing.T) {
+       testCgoPprof(t, "", "CgoPprofThreadNoTraceback")
+}
+
 func TestRaceProf(t *testing.T) {
        if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" {
                t.Skipf("not yet supported on %s/%s", runtime.GOOS, runtime.GOARCH)
index 54ace4871e57c71dee3f97d43f80b35e7b82cb25..220169d2803cc9354a6f5a0da330e5dea11f1334 100644 (file)
@@ -28,7 +28,10 @@ type sigctxt struct {
        u *ureg
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) pc() uintptr { return uintptr(c.u.pc) }
+
 func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) }
 func (c *sigctxt) lr() uintptr { return uintptr(0) }
 
index 1633ec1e0b1c1995f487403c0763e6dc143f7746..29a2643c3a91801f490dc03aeaaf38f2c2546bd7 100644 (file)
@@ -37,7 +37,10 @@ type sigctxt struct {
        u *ureg
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) pc() uintptr { return uintptr(c.u.ip) }
+
 func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) }
 func (c *sigctxt) lr() uintptr { return uintptr(0) }
 
index 9c700ae1c0b8aafbd57825b1600d60cee1857776..1adc16e47f9be0e0bf8bdcb0f46171fa5f6a4361 100644 (file)
@@ -31,7 +31,10 @@ type sigctxt struct {
        u *ureg
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) pc() uintptr { return uintptr(c.u.pc) }
+
 func (c *sigctxt) sp() uintptr { return uintptr(c.u.sp) }
 func (c *sigctxt) lr() uintptr { return uintptr(c.u.link) }
 
index 2c50fb5afe3c41adeb6da34f8e0633ae0d6696e1..b74cb88506489897eabd52c71aae2d2d1d229b2b 100644 (file)
@@ -3194,7 +3194,8 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
 var sigprofCallers cgoCallers
 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.
 // g is nil, and what we can do is very limited.
 //go:nosplit
@@ -3207,17 +3208,41 @@ func sigprofNonGo() {
                }
 
                // Simple cas-lock to coordinate with setcpuprofilerate.
-               if atomic.Cas(&prof.lock, 0, 1) {
-                       if prof.hz != 0 {
-                               cpuprof.addNonGo(sigprofCallers[:n])
-                       }
-                       atomic.Store(&prof.lock, 0)
+               for !atomic.Cas(&prof.lock, 0, 1) {
+                       osyield()
                }
+               if prof.hz != 0 {
+                       cpuprof.addNonGo(sigprofCallers[:n])
+               }
+               atomic.Store(&prof.lock, 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
 // to an absolute value. Important that
 // we don't traceback when these are at the bottom
index 502d502e6f99983b670846c936b6f2d983582cd3..8807552da220833e96cc76832349adb476cd8414 100644 (file)
@@ -27,7 +27,10 @@ func dumpregs(c *sigctxt) {
        print("gs     ", hex(c.gs()), "\n")
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) sigpc() uintptr { return uintptr(c.eip()) }
+
 func (c *sigctxt) sigsp() uintptr { return uintptr(c.esp()) }
 func (c *sigctxt) siglr() uintptr { return 0 }
 func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
index 78afb5a9f46dd7b7d8c5b92969c2d6f2d68153b5..c8a6513261d28d303b0be11dc7d845215c10a885 100644 (file)
@@ -36,7 +36,10 @@ func dumpregs(c *sigctxt) {
        print("gs     ", hex(c.gs()), "\n")
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) sigpc() uintptr { return uintptr(c.rip()) }
+
 func (c *sigctxt) sigsp() uintptr { return uintptr(c.rsp()) }
 func (c *sigctxt) siglr() uintptr { return 0 }
 func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
index 0733ec0042989997cb1f1083c97693db04d71007..9748544e0e2cf4183fdc3ad1fb1860fca5a3909d 100644 (file)
@@ -32,7 +32,10 @@ func dumpregs(c *sigctxt) {
        print("fault   ", hex(c.fault()), "\n")
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
+
 func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
 func (c *sigctxt) siglr() uintptr { return uintptr(c.lr()) }
 
index 8f0a6a540be975a6475bf6379014e752f625182e..4c6df425d82dc9007f04072eb2043705e7057af2 100644 (file)
@@ -48,7 +48,10 @@ func dumpregs(c *sigctxt) {
        print("fault   ", hex(c.fault()), "\n")
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
+
 func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
 func (c *sigctxt) siglr() uintptr { return uintptr(c.lr()) }
 
index 056f09ab1ee17841b5efd07b3f13fef7c427b862..c162959c12d06d64041c3e64ddb3875196cb1440 100644 (file)
@@ -11,16 +11,23 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
-func (c *sigctxt) regs() *regs32   { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
-func (c *sigctxt) eax() uint32     { return c.regs().eax }
-func (c *sigctxt) ebx() uint32     { return c.regs().ebx }
-func (c *sigctxt) ecx() uint32     { return c.regs().ecx }
-func (c *sigctxt) edx() uint32     { return c.regs().edx }
-func (c *sigctxt) edi() uint32     { return c.regs().edi }
-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 }
-func (c *sigctxt) eip() uint32     { return c.regs().eip }
+//go:nosplit
+//go:nowritebarrierrec
+func (c *sigctxt) regs() *regs32 { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
+
+func (c *sigctxt) eax() uint32 { return c.regs().eax }
+func (c *sigctxt) ebx() uint32 { return c.regs().ebx }
+func (c *sigctxt) ecx() uint32 { return c.regs().ecx }
+func (c *sigctxt) edx() uint32 { return c.regs().edx }
+func (c *sigctxt) edi() uint32 { return c.regs().edi }
+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) cs() uint32      { return c.regs().cs }
 func (c *sigctxt) fs() uint32      { return c.regs().fs }
index 3551b0d63c71d9f06346cc2c64334bbe5d0421d6..40de4812b88927bee168f0662f5733548c533a8e 100644 (file)
@@ -11,24 +11,31 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
-func (c *sigctxt) regs() *regs64   { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
-func (c *sigctxt) rax() uint64     { return c.regs().rax }
-func (c *sigctxt) rbx() uint64     { return c.regs().rbx }
-func (c *sigctxt) rcx() uint64     { return c.regs().rcx }
-func (c *sigctxt) rdx() uint64     { return c.regs().rdx }
-func (c *sigctxt) rdi() uint64     { return c.regs().rdi }
-func (c *sigctxt) rsi() uint64     { return c.regs().rsi }
-func (c *sigctxt) rbp() uint64     { return c.regs().rbp }
-func (c *sigctxt) rsp() uint64     { return c.regs().rsp }
-func (c *sigctxt) r8() uint64      { return c.regs().r8 }
-func (c *sigctxt) r9() uint64      { return c.regs().r9 }
-func (c *sigctxt) r10() uint64     { return c.regs().r10 }
-func (c *sigctxt) r11() uint64     { return c.regs().r11 }
-func (c *sigctxt) r12() uint64     { return c.regs().r12 }
-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 }
-func (c *sigctxt) rip() uint64     { return c.regs().rip }
+//go:nosplit
+//go:nowritebarrierrec
+func (c *sigctxt) regs() *regs64 { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
+
+func (c *sigctxt) rax() uint64 { return c.regs().rax }
+func (c *sigctxt) rbx() uint64 { return c.regs().rbx }
+func (c *sigctxt) rcx() uint64 { return c.regs().rcx }
+func (c *sigctxt) rdx() uint64 { return c.regs().rdx }
+func (c *sigctxt) rdi() uint64 { return c.regs().rdi }
+func (c *sigctxt) rsi() uint64 { return c.regs().rsi }
+func (c *sigctxt) rbp() uint64 { return c.regs().rbp }
+func (c *sigctxt) rsp() uint64 { return c.regs().rsp }
+func (c *sigctxt) r8() uint64  { return c.regs().r8 }
+func (c *sigctxt) r9() uint64  { return c.regs().r9 }
+func (c *sigctxt) r10() uint64 { return c.regs().r10 }
+func (c *sigctxt) r11() uint64 { return c.regs().r11 }
+func (c *sigctxt) r12() uint64 { return c.regs().r12 }
+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) cs() uint64      { return c.regs().cs }
 func (c *sigctxt) fs() uint64      { return c.regs().fs }
index 82c7c936a7fbcbd73999de46f47d908003d95073..c88b90c5e2699f59181e33a22253469480e79e24 100644 (file)
@@ -11,23 +11,30 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
-func (c *sigctxt) regs() *regs32   { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
-func (c *sigctxt) r0() uint32      { return c.regs().r[0] }
-func (c *sigctxt) r1() uint32      { return c.regs().r[1] }
-func (c *sigctxt) r2() uint32      { return c.regs().r[2] }
-func (c *sigctxt) r3() uint32      { return c.regs().r[3] }
-func (c *sigctxt) r4() uint32      { return c.regs().r[4] }
-func (c *sigctxt) r5() uint32      { return c.regs().r[5] }
-func (c *sigctxt) r6() uint32      { return c.regs().r[6] }
-func (c *sigctxt) r7() uint32      { return c.regs().r[7] }
-func (c *sigctxt) r8() uint32      { return c.regs().r[8] }
-func (c *sigctxt) r9() uint32      { return c.regs().r[9] }
-func (c *sigctxt) r10() uint32     { return c.regs().r[10] }
-func (c *sigctxt) fp() uint32      { return c.regs().r[11] }
-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 }
-func (c *sigctxt) pc() uint32      { return c.regs().pc }
+//go:nosplit
+//go:nowritebarrierrec
+func (c *sigctxt) regs() *regs32 { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
+
+func (c *sigctxt) r0() uint32  { return c.regs().r[0] }
+func (c *sigctxt) r1() uint32  { return c.regs().r[1] }
+func (c *sigctxt) r2() uint32  { return c.regs().r[2] }
+func (c *sigctxt) r3() uint32  { return c.regs().r[3] }
+func (c *sigctxt) r4() uint32  { return c.regs().r[4] }
+func (c *sigctxt) r5() uint32  { return c.regs().r[5] }
+func (c *sigctxt) r6() uint32  { return c.regs().r[6] }
+func (c *sigctxt) r7() uint32  { return c.regs().r[7] }
+func (c *sigctxt) r8() uint32  { return c.regs().r[8] }
+func (c *sigctxt) r9() uint32  { return c.regs().r[9] }
+func (c *sigctxt) r10() uint32 { return c.regs().r[10] }
+func (c *sigctxt) fp() uint32  { return c.regs().r[11] }
+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) fault() uint32   { return c.info.si_addr }
 func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
index 12fa52096fe12087985495f961a3e0752d4d1870..b14b9f1e50f6247a43bea70e2a74804dc7d070f9 100644 (file)
@@ -11,40 +11,47 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) r2() uint64    { return c.regs().x[2] }
-func (c *sigctxt) r3() uint64    { return c.regs().x[3] }
-func (c *sigctxt) r4() uint64    { return c.regs().x[4] }
-func (c *sigctxt) r5() uint64    { return c.regs().x[5] }
-func (c *sigctxt) r6() uint64    { return c.regs().x[6] }
-func (c *sigctxt) r7() uint64    { return c.regs().x[7] }
-func (c *sigctxt) r8() uint64    { return c.regs().x[8] }
-func (c *sigctxt) r9() uint64    { return c.regs().x[9] }
-func (c *sigctxt) r10() uint64   { return c.regs().x[10] }
-func (c *sigctxt) r11() uint64   { return c.regs().x[11] }
-func (c *sigctxt) r12() uint64   { return c.regs().x[12] }
-func (c *sigctxt) r13() uint64   { return c.regs().x[13] }
-func (c *sigctxt) r14() uint64   { return c.regs().x[14] }
-func (c *sigctxt) r15() uint64   { return c.regs().x[15] }
-func (c *sigctxt) r16() uint64   { return c.regs().x[16] }
-func (c *sigctxt) r17() uint64   { return c.regs().x[17] }
-func (c *sigctxt) r18() uint64   { return c.regs().x[18] }
-func (c *sigctxt) r19() uint64   { return c.regs().x[19] }
-func (c *sigctxt) r20() uint64   { return c.regs().x[20] }
-func (c *sigctxt) r21() uint64   { return c.regs().x[21] }
-func (c *sigctxt) r22() uint64   { return c.regs().x[22] }
-func (c *sigctxt) r23() uint64   { return c.regs().x[23] }
-func (c *sigctxt) r24() uint64   { return c.regs().x[24] }
-func (c *sigctxt) r25() uint64   { return c.regs().x[25] }
-func (c *sigctxt) r26() uint64   { return c.regs().x[26] }
-func (c *sigctxt) r27() uint64   { return c.regs().x[27] }
-func (c *sigctxt) r28() uint64   { return c.regs().x[28] }
-func (c *sigctxt) r29() uint64   { return c.regs().fp }
-func (c *sigctxt) lr() uint64    { return c.regs().lr }
-func (c *sigctxt) sp() uint64    { return c.regs().sp }
-func (c *sigctxt) pc() uint64    { return c.regs().pc }
+
+func (c *sigctxt) r0() uint64  { return c.regs().x[0] }
+func (c *sigctxt) r1() uint64  { return c.regs().x[1] }
+func (c *sigctxt) r2() uint64  { return c.regs().x[2] }
+func (c *sigctxt) r3() uint64  { return c.regs().x[3] }
+func (c *sigctxt) r4() uint64  { return c.regs().x[4] }
+func (c *sigctxt) r5() uint64  { return c.regs().x[5] }
+func (c *sigctxt) r6() uint64  { return c.regs().x[6] }
+func (c *sigctxt) r7() uint64  { return c.regs().x[7] }
+func (c *sigctxt) r8() uint64  { return c.regs().x[8] }
+func (c *sigctxt) r9() uint64  { return c.regs().x[9] }
+func (c *sigctxt) r10() uint64 { return c.regs().x[10] }
+func (c *sigctxt) r11() uint64 { return c.regs().x[11] }
+func (c *sigctxt) r12() uint64 { return c.regs().x[12] }
+func (c *sigctxt) r13() uint64 { return c.regs().x[13] }
+func (c *sigctxt) r14() uint64 { return c.regs().x[14] }
+func (c *sigctxt) r15() uint64 { return c.regs().x[15] }
+func (c *sigctxt) r16() uint64 { return c.regs().x[16] }
+func (c *sigctxt) r17() uint64 { return c.regs().x[17] }
+func (c *sigctxt) r18() uint64 { return c.regs().x[18] }
+func (c *sigctxt) r19() uint64 { return c.regs().x[19] }
+func (c *sigctxt) r20() uint64 { return c.regs().x[20] }
+func (c *sigctxt) r21() uint64 { return c.regs().x[21] }
+func (c *sigctxt) r22() uint64 { return c.regs().x[22] }
+func (c *sigctxt) r23() uint64 { return c.regs().x[23] }
+func (c *sigctxt) r24() uint64 { return c.regs().x[24] }
+func (c *sigctxt) r25() uint64 { return c.regs().x[25] }
+func (c *sigctxt) r26() uint64 { return c.regs().x[26] }
+func (c *sigctxt) r27() uint64 { return c.regs().x[27] }
+func (c *sigctxt) r28() uint64 { return c.regs().x[28] }
+func (c *sigctxt) r29() uint64 { return c.regs().fp }
+func (c *sigctxt) lr() uint64  { return c.regs().lr }
+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) sigcode() uint64 { return uint64(c.info.si_code) }
index b32df29d2852fbae93260fed9f3f6793481c6f28..c473eddb6d4e4c9fc12b453d0bed73f4b9e6e77e 100644 (file)
@@ -11,26 +11,33 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *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) rcx() uint64     { return c.regs().mc_rcx }
-func (c *sigctxt) rdx() uint64     { return c.regs().mc_rdx }
-func (c *sigctxt) rdi() uint64     { return c.regs().mc_rdi }
-func (c *sigctxt) rsi() uint64     { return c.regs().mc_rsi }
-func (c *sigctxt) rbp() uint64     { return c.regs().mc_rbp }
-func (c *sigctxt) rsp() uint64     { return c.regs().mc_rsp }
-func (c *sigctxt) r8() uint64      { return c.regs().mc_r8 }
-func (c *sigctxt) r9() uint64      { return c.regs().mc_r9 }
-func (c *sigctxt) r10() uint64     { return c.regs().mc_r10 }
-func (c *sigctxt) r11() uint64     { return c.regs().mc_r11 }
-func (c *sigctxt) r12() uint64     { return c.regs().mc_r12 }
-func (c *sigctxt) r13() uint64     { return c.regs().mc_r13 }
-func (c *sigctxt) r14() uint64     { return c.regs().mc_r14 }
-func (c *sigctxt) r15() uint64     { return c.regs().mc_r15 }
-func (c *sigctxt) rip() uint64     { return c.regs().mc_rip }
+
+func (c *sigctxt) rax() uint64 { return c.regs().mc_rax }
+func (c *sigctxt) rbx() uint64 { return c.regs().mc_rbx }
+func (c *sigctxt) rcx() uint64 { return c.regs().mc_rcx }
+func (c *sigctxt) rdx() uint64 { return c.regs().mc_rdx }
+func (c *sigctxt) rdi() uint64 { return c.regs().mc_rdi }
+func (c *sigctxt) rsi() uint64 { return c.regs().mc_rsi }
+func (c *sigctxt) rbp() uint64 { return c.regs().mc_rbp }
+func (c *sigctxt) rsp() uint64 { return c.regs().mc_rsp }
+func (c *sigctxt) r8() uint64  { return c.regs().mc_r8 }
+func (c *sigctxt) r9() uint64  { return c.regs().mc_r9 }
+func (c *sigctxt) r10() uint64 { return c.regs().mc_r10 }
+func (c *sigctxt) r11() uint64 { return c.regs().mc_r11 }
+func (c *sigctxt) r12() uint64 { return c.regs().mc_r12 }
+func (c *sigctxt) r13() uint64 { return c.regs().mc_r13 }
+func (c *sigctxt) r14() uint64 { return c.regs().mc_r14 }
+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) cs() uint64      { return c.regs().mc_cs }
 func (c *sigctxt) fs() uint64      { return c.regs().mc_ss }
index 092e6dff228ac1bff7ebb1595152864323cd2b74..f7cc0df6a344f38cdeb70e7388a9d547f89dcdbe 100644 (file)
@@ -11,16 +11,23 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) ecx() uint32     { return c.regs().mc_ecx }
-func (c *sigctxt) edx() uint32     { return c.regs().mc_edx }
-func (c *sigctxt) edi() uint32     { return c.regs().mc_edi }
-func (c *sigctxt) esi() uint32     { return c.regs().mc_esi }
-func (c *sigctxt) ebp() uint32     { return c.regs().mc_ebp }
-func (c *sigctxt) esp() uint32     { return c.regs().mc_esp }
-func (c *sigctxt) eip() uint32     { return c.regs().mc_eip }
+
+func (c *sigctxt) eax() uint32 { return c.regs().mc_eax }
+func (c *sigctxt) ebx() uint32 { return c.regs().mc_ebx }
+func (c *sigctxt) ecx() uint32 { return c.regs().mc_ecx }
+func (c *sigctxt) edx() uint32 { return c.regs().mc_edx }
+func (c *sigctxt) edi() uint32 { return c.regs().mc_edi }
+func (c *sigctxt) esi() uint32 { return c.regs().mc_esi }
+func (c *sigctxt) ebp() uint32 { return c.regs().mc_ebp }
+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) cs() uint32      { return c.regs().mc_cs }
 func (c *sigctxt) fs() uint32      { return c.regs().mc_fs }
index a0b4a72ed5f131530d47be146954fcb32364e171..20b86e7f32eff376c5ab16cec504b6640befab3a 100644 (file)
@@ -11,26 +11,33 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *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) rcx() uint64     { return c.regs().mc_rcx }
-func (c *sigctxt) rdx() uint64     { return c.regs().mc_rdx }
-func (c *sigctxt) rdi() uint64     { return c.regs().mc_rdi }
-func (c *sigctxt) rsi() uint64     { return c.regs().mc_rsi }
-func (c *sigctxt) rbp() uint64     { return c.regs().mc_rbp }
-func (c *sigctxt) rsp() uint64     { return c.regs().mc_rsp }
-func (c *sigctxt) r8() uint64      { return c.regs().mc_r8 }
-func (c *sigctxt) r9() uint64      { return c.regs().mc_r9 }
-func (c *sigctxt) r10() uint64     { return c.regs().mc_r10 }
-func (c *sigctxt) r11() uint64     { return c.regs().mc_r11 }
-func (c *sigctxt) r12() uint64     { return c.regs().mc_r12 }
-func (c *sigctxt) r13() uint64     { return c.regs().mc_r13 }
-func (c *sigctxt) r14() uint64     { return c.regs().mc_r14 }
-func (c *sigctxt) r15() uint64     { return c.regs().mc_r15 }
-func (c *sigctxt) rip() uint64     { return c.regs().mc_rip }
+
+func (c *sigctxt) rax() uint64 { return c.regs().mc_rax }
+func (c *sigctxt) rbx() uint64 { return c.regs().mc_rbx }
+func (c *sigctxt) rcx() uint64 { return c.regs().mc_rcx }
+func (c *sigctxt) rdx() uint64 { return c.regs().mc_rdx }
+func (c *sigctxt) rdi() uint64 { return c.regs().mc_rdi }
+func (c *sigctxt) rsi() uint64 { return c.regs().mc_rsi }
+func (c *sigctxt) rbp() uint64 { return c.regs().mc_rbp }
+func (c *sigctxt) rsp() uint64 { return c.regs().mc_rsp }
+func (c *sigctxt) r8() uint64  { return c.regs().mc_r8 }
+func (c *sigctxt) r9() uint64  { return c.regs().mc_r9 }
+func (c *sigctxt) r10() uint64 { return c.regs().mc_r10 }
+func (c *sigctxt) r11() uint64 { return c.regs().mc_r11 }
+func (c *sigctxt) r12() uint64 { return c.regs().mc_r12 }
+func (c *sigctxt) r13() uint64 { return c.regs().mc_r13 }
+func (c *sigctxt) r14() uint64 { return c.regs().mc_r14 }
+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) cs() uint64      { return c.regs().mc_cs }
 func (c *sigctxt) fs() uint64      { return uint64(c.regs().mc_fs) }
index 035730480c06c3cba9c0dbf2ec14721869ce9c62..960137011225298136e39c1dd6efc0ba720bb32a 100644 (file)
@@ -11,23 +11,30 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) r2() uint32      { return c.regs().__gregs[2] }
-func (c *sigctxt) r3() uint32      { return c.regs().__gregs[3] }
-func (c *sigctxt) r4() uint32      { return c.regs().__gregs[4] }
-func (c *sigctxt) r5() uint32      { return c.regs().__gregs[5] }
-func (c *sigctxt) r6() uint32      { return c.regs().__gregs[6] }
-func (c *sigctxt) r7() uint32      { return c.regs().__gregs[7] }
-func (c *sigctxt) r8() uint32      { return c.regs().__gregs[8] }
-func (c *sigctxt) r9() uint32      { return c.regs().__gregs[9] }
-func (c *sigctxt) r10() uint32     { return c.regs().__gregs[10] }
-func (c *sigctxt) fp() uint32      { return c.regs().__gregs[11] }
-func (c *sigctxt) ip() uint32      { return c.regs().__gregs[12] }
-func (c *sigctxt) sp() uint32      { return c.regs().__gregs[13] }
-func (c *sigctxt) lr() uint32      { return c.regs().__gregs[14] }
-func (c *sigctxt) pc() uint32      { return c.regs().__gregs[15] }
+
+func (c *sigctxt) r0() uint32  { return c.regs().__gregs[0] }
+func (c *sigctxt) r1() uint32  { return c.regs().__gregs[1] }
+func (c *sigctxt) r2() uint32  { return c.regs().__gregs[2] }
+func (c *sigctxt) r3() uint32  { return c.regs().__gregs[3] }
+func (c *sigctxt) r4() uint32  { return c.regs().__gregs[4] }
+func (c *sigctxt) r5() uint32  { return c.regs().__gregs[5] }
+func (c *sigctxt) r6() uint32  { return c.regs().__gregs[6] }
+func (c *sigctxt) r7() uint32  { return c.regs().__gregs[7] }
+func (c *sigctxt) r8() uint32  { return c.regs().__gregs[8] }
+func (c *sigctxt) r9() uint32  { return c.regs().__gregs[9] }
+func (c *sigctxt) r10() uint32 { return c.regs().__gregs[10] }
+func (c *sigctxt) fp() uint32  { return c.regs().__gregs[11] }
+func (c *sigctxt) ip() uint32  { return c.regs().__gregs[12] }
+func (c *sigctxt) sp() uint32  { return c.regs().__gregs[13] }
+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) fault() uint32   { return uint32(c.info.si_addr) }
 func (c *sigctxt) trap() uint32    { return 0 }
index 415f361ed1569f7f3aa4f9b6e0b8a0d1bb7bb2b0..13d9df407102e5fc366fc598d7988fc6127c1547 100644 (file)
@@ -14,22 +14,29 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) ecx() uint32       { return c.regs().ecx }
-func (c *sigctxt) edx() uint32       { return c.regs().edx }
-func (c *sigctxt) edi() uint32       { return c.regs().edi }
-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 }
-func (c *sigctxt) eip() uint32       { return c.regs().eip }
-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) eax() uint32 { return c.regs().eax }
+func (c *sigctxt) ebx() uint32 { return c.regs().ebx }
+func (c *sigctxt) ecx() uint32 { return c.regs().ecx }
+func (c *sigctxt) edx() uint32 { return c.regs().edx }
+func (c *sigctxt) edi() uint32 { return c.regs().edi }
+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) 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_esp(x uint32)     { c.regs().esp = x }
index 433747f0e4275402bd5cac2a3a516ac88d55c299..210e8967e5da299c473920af3cee344e77eaf084 100644 (file)
@@ -14,26 +14,33 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *sigcontext {
        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) rcx() uint64     { return c.regs().rcx }
-func (c *sigctxt) rdx() uint64     { return c.regs().rdx }
-func (c *sigctxt) rdi() uint64     { return c.regs().rdi }
-func (c *sigctxt) rsi() uint64     { return c.regs().rsi }
-func (c *sigctxt) rbp() uint64     { return c.regs().rbp }
-func (c *sigctxt) rsp() uint64     { return c.regs().rsp }
-func (c *sigctxt) r8() uint64      { return c.regs().r8 }
-func (c *sigctxt) r9() uint64      { return c.regs().r9 }
-func (c *sigctxt) r10() uint64     { return c.regs().r10 }
-func (c *sigctxt) r11() uint64     { return c.regs().r11 }
-func (c *sigctxt) r12() uint64     { return c.regs().r12 }
-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 }
-func (c *sigctxt) rip() uint64     { return c.regs().rip }
+
+func (c *sigctxt) rax() uint64 { return c.regs().rax }
+func (c *sigctxt) rbx() uint64 { return c.regs().rbx }
+func (c *sigctxt) rcx() uint64 { return c.regs().rcx }
+func (c *sigctxt) rdx() uint64 { return c.regs().rdx }
+func (c *sigctxt) rdi() uint64 { return c.regs().rdi }
+func (c *sigctxt) rsi() uint64 { return c.regs().rsi }
+func (c *sigctxt) rbp() uint64 { return c.regs().rbp }
+func (c *sigctxt) rsp() uint64 { return c.regs().rsp }
+func (c *sigctxt) r8() uint64  { return c.regs().r8 }
+func (c *sigctxt) r9() uint64  { return c.regs().r9 }
+func (c *sigctxt) r10() uint64 { return c.regs().r10 }
+func (c *sigctxt) r11() uint64 { return c.regs().r11 }
+func (c *sigctxt) r12() uint64 { return c.regs().r12 }
+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().eflags }
 func (c *sigctxt) cs() uint64      { return uint64(c.regs().cs) }
 func (c *sigctxt) fs() uint64      { return uint64(c.regs().fs) }
index cd6a0d7c2db2a0d2aae8eb3b466a27801b381ffd..06a57b83b9157fa0b70892459a42395fcbe7b32b 100644 (file)
@@ -14,28 +14,35 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) r2() uint32        { return c.regs().r2 }
-func (c *sigctxt) r3() uint32        { return c.regs().r3 }
-func (c *sigctxt) r4() uint32        { return c.regs().r4 }
-func (c *sigctxt) r5() uint32        { return c.regs().r5 }
-func (c *sigctxt) r6() uint32        { return c.regs().r6 }
-func (c *sigctxt) r7() uint32        { return c.regs().r7 }
-func (c *sigctxt) r8() uint32        { return c.regs().r8 }
-func (c *sigctxt) r9() uint32        { return c.regs().r9 }
-func (c *sigctxt) r10() uint32       { return c.regs().r10 }
-func (c *sigctxt) fp() uint32        { return c.regs().fp }
-func (c *sigctxt) ip() uint32        { return c.regs().ip }
-func (c *sigctxt) sp() uint32        { return c.regs().sp }
-func (c *sigctxt) lr() uint32        { return c.regs().lr }
-func (c *sigctxt) pc() uint32        { return c.regs().pc }
-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) r0() uint32  { return c.regs().r0 }
+func (c *sigctxt) r1() uint32  { return c.regs().r1 }
+func (c *sigctxt) r2() uint32  { return c.regs().r2 }
+func (c *sigctxt) r3() uint32  { return c.regs().r3 }
+func (c *sigctxt) r4() uint32  { return c.regs().r4 }
+func (c *sigctxt) r5() uint32  { return c.regs().r5 }
+func (c *sigctxt) r6() uint32  { return c.regs().r6 }
+func (c *sigctxt) r7() uint32  { return c.regs().r7 }
+func (c *sigctxt) r8() uint32  { return c.regs().r8 }
+func (c *sigctxt) r9() uint32  { return c.regs().r9 }
+func (c *sigctxt) r10() uint32 { return c.regs().r10 }
+func (c *sigctxt) fp() uint32  { return c.regs().fp }
+func (c *sigctxt) ip() uint32  { return c.regs().ip }
+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) 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) sigaddr() uint32 { return c.info.si_addr }
index 4964e7b0286ce8a14af5ec903bf693e4a0edecfd..f3d4d384e5b22dba139fa25720443833947dd8fd 100644 (file)
@@ -14,42 +14,49 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) r2() uint64        { return c.regs().regs[2] }
-func (c *sigctxt) r3() uint64        { return c.regs().regs[3] }
-func (c *sigctxt) r4() uint64        { return c.regs().regs[4] }
-func (c *sigctxt) r5() uint64        { return c.regs().regs[5] }
-func (c *sigctxt) r6() uint64        { return c.regs().regs[6] }
-func (c *sigctxt) r7() uint64        { return c.regs().regs[7] }
-func (c *sigctxt) r8() uint64        { return c.regs().regs[8] }
-func (c *sigctxt) r9() uint64        { return c.regs().regs[9] }
-func (c *sigctxt) r10() uint64       { return c.regs().regs[10] }
-func (c *sigctxt) r11() uint64       { return c.regs().regs[11] }
-func (c *sigctxt) r12() uint64       { return c.regs().regs[12] }
-func (c *sigctxt) r13() uint64       { return c.regs().regs[13] }
-func (c *sigctxt) r14() uint64       { return c.regs().regs[14] }
-func (c *sigctxt) r15() uint64       { return c.regs().regs[15] }
-func (c *sigctxt) r16() uint64       { return c.regs().regs[16] }
-func (c *sigctxt) r17() uint64       { return c.regs().regs[17] }
-func (c *sigctxt) r18() uint64       { return c.regs().regs[18] }
-func (c *sigctxt) r19() uint64       { return c.regs().regs[19] }
-func (c *sigctxt) r20() uint64       { return c.regs().regs[20] }
-func (c *sigctxt) r21() uint64       { return c.regs().regs[21] }
-func (c *sigctxt) r22() uint64       { return c.regs().regs[22] }
-func (c *sigctxt) r23() uint64       { return c.regs().regs[23] }
-func (c *sigctxt) r24() uint64       { return c.regs().regs[24] }
-func (c *sigctxt) r25() uint64       { return c.regs().regs[25] }
-func (c *sigctxt) r26() uint64       { return c.regs().regs[26] }
-func (c *sigctxt) r27() uint64       { return c.regs().regs[27] }
-func (c *sigctxt) r28() uint64       { return c.regs().regs[28] }
-func (c *sigctxt) r29() uint64       { return c.regs().regs[29] }
-func (c *sigctxt) lr() uint64        { return c.regs().regs[30] }
-func (c *sigctxt) sp() uint64        { return c.regs().sp }
-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) r0() uint64  { return c.regs().regs[0] }
+func (c *sigctxt) r1() uint64  { return c.regs().regs[1] }
+func (c *sigctxt) r2() uint64  { return c.regs().regs[2] }
+func (c *sigctxt) r3() uint64  { return c.regs().regs[3] }
+func (c *sigctxt) r4() uint64  { return c.regs().regs[4] }
+func (c *sigctxt) r5() uint64  { return c.regs().regs[5] }
+func (c *sigctxt) r6() uint64  { return c.regs().regs[6] }
+func (c *sigctxt) r7() uint64  { return c.regs().regs[7] }
+func (c *sigctxt) r8() uint64  { return c.regs().regs[8] }
+func (c *sigctxt) r9() uint64  { return c.regs().regs[9] }
+func (c *sigctxt) r10() uint64 { return c.regs().regs[10] }
+func (c *sigctxt) r11() uint64 { return c.regs().regs[11] }
+func (c *sigctxt) r12() uint64 { return c.regs().regs[12] }
+func (c *sigctxt) r13() uint64 { return c.regs().regs[13] }
+func (c *sigctxt) r14() uint64 { return c.regs().regs[14] }
+func (c *sigctxt) r15() uint64 { return c.regs().regs[15] }
+func (c *sigctxt) r16() uint64 { return c.regs().regs[16] }
+func (c *sigctxt) r17() uint64 { return c.regs().regs[17] }
+func (c *sigctxt) r18() uint64 { return c.regs().regs[18] }
+func (c *sigctxt) r19() uint64 { return c.regs().regs[19] }
+func (c *sigctxt) r20() uint64 { return c.regs().regs[20] }
+func (c *sigctxt) r21() uint64 { return c.regs().regs[21] }
+func (c *sigctxt) r22() uint64 { return c.regs().regs[22] }
+func (c *sigctxt) r23() uint64 { return c.regs().regs[23] }
+func (c *sigctxt) r24() uint64 { return c.regs().regs[24] }
+func (c *sigctxt) r25() uint64 { return c.regs().regs[25] }
+func (c *sigctxt) r26() uint64 { return c.regs().regs[26] }
+func (c *sigctxt) r27() uint64 { return c.regs().regs[27] }
+func (c *sigctxt) r28() uint64 { return c.regs().regs[28] }
+func (c *sigctxt) r29() uint64 { return c.regs().regs[29] }
+func (c *sigctxt) lr() uint64  { return c.regs().regs[30] }
+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) 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) sigaddr() uint64 { return c.info.si_addr }
index 0f590e49eab6ee9c702105be3ef0ca935cfac448..9e0cf42c706ae05191875d5a78b28a7d32d8cf9e 100644 (file)
@@ -17,44 +17,51 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) r2() uint64        { return c.regs().sc_regs[2] }
-func (c *sigctxt) r3() uint64        { return c.regs().sc_regs[3] }
-func (c *sigctxt) r4() uint64        { return c.regs().sc_regs[4] }
-func (c *sigctxt) r5() uint64        { return c.regs().sc_regs[5] }
-func (c *sigctxt) r6() uint64        { return c.regs().sc_regs[6] }
-func (c *sigctxt) r7() uint64        { return c.regs().sc_regs[7] }
-func (c *sigctxt) r8() uint64        { return c.regs().sc_regs[8] }
-func (c *sigctxt) r9() uint64        { return c.regs().sc_regs[9] }
-func (c *sigctxt) r10() uint64       { return c.regs().sc_regs[10] }
-func (c *sigctxt) r11() uint64       { return c.regs().sc_regs[11] }
-func (c *sigctxt) r12() uint64       { return c.regs().sc_regs[12] }
-func (c *sigctxt) r13() uint64       { return c.regs().sc_regs[13] }
-func (c *sigctxt) r14() uint64       { return c.regs().sc_regs[14] }
-func (c *sigctxt) r15() uint64       { return c.regs().sc_regs[15] }
-func (c *sigctxt) r16() uint64       { return c.regs().sc_regs[16] }
-func (c *sigctxt) r17() uint64       { return c.regs().sc_regs[17] }
-func (c *sigctxt) r18() uint64       { return c.regs().sc_regs[18] }
-func (c *sigctxt) r19() uint64       { return c.regs().sc_regs[19] }
-func (c *sigctxt) r20() uint64       { return c.regs().sc_regs[20] }
-func (c *sigctxt) r21() uint64       { return c.regs().sc_regs[21] }
-func (c *sigctxt) r22() uint64       { return c.regs().sc_regs[22] }
-func (c *sigctxt) r23() uint64       { return c.regs().sc_regs[23] }
-func (c *sigctxt) r24() uint64       { return c.regs().sc_regs[24] }
-func (c *sigctxt) r25() uint64       { return c.regs().sc_regs[25] }
-func (c *sigctxt) r26() uint64       { return c.regs().sc_regs[26] }
-func (c *sigctxt) r27() uint64       { return c.regs().sc_regs[27] }
-func (c *sigctxt) r28() uint64       { return c.regs().sc_regs[28] }
-func (c *sigctxt) r29() uint64       { return c.regs().sc_regs[29] }
-func (c *sigctxt) r30() uint64       { return c.regs().sc_regs[30] }
-func (c *sigctxt) r31() uint64       { return c.regs().sc_regs[31] }
-func (c *sigctxt) sp() uint64        { return c.regs().sc_regs[29] }
-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) r0() uint64  { return c.regs().sc_regs[0] }
+func (c *sigctxt) r1() uint64  { return c.regs().sc_regs[1] }
+func (c *sigctxt) r2() uint64  { return c.regs().sc_regs[2] }
+func (c *sigctxt) r3() uint64  { return c.regs().sc_regs[3] }
+func (c *sigctxt) r4() uint64  { return c.regs().sc_regs[4] }
+func (c *sigctxt) r5() uint64  { return c.regs().sc_regs[5] }
+func (c *sigctxt) r6() uint64  { return c.regs().sc_regs[6] }
+func (c *sigctxt) r7() uint64  { return c.regs().sc_regs[7] }
+func (c *sigctxt) r8() uint64  { return c.regs().sc_regs[8] }
+func (c *sigctxt) r9() uint64  { return c.regs().sc_regs[9] }
+func (c *sigctxt) r10() uint64 { return c.regs().sc_regs[10] }
+func (c *sigctxt) r11() uint64 { return c.regs().sc_regs[11] }
+func (c *sigctxt) r12() uint64 { return c.regs().sc_regs[12] }
+func (c *sigctxt) r13() uint64 { return c.regs().sc_regs[13] }
+func (c *sigctxt) r14() uint64 { return c.regs().sc_regs[14] }
+func (c *sigctxt) r15() uint64 { return c.regs().sc_regs[15] }
+func (c *sigctxt) r16() uint64 { return c.regs().sc_regs[16] }
+func (c *sigctxt) r17() uint64 { return c.regs().sc_regs[17] }
+func (c *sigctxt) r18() uint64 { return c.regs().sc_regs[18] }
+func (c *sigctxt) r19() uint64 { return c.regs().sc_regs[19] }
+func (c *sigctxt) r20() uint64 { return c.regs().sc_regs[20] }
+func (c *sigctxt) r21() uint64 { return c.regs().sc_regs[21] }
+func (c *sigctxt) r22() uint64 { return c.regs().sc_regs[22] }
+func (c *sigctxt) r23() uint64 { return c.regs().sc_regs[23] }
+func (c *sigctxt) r24() uint64 { return c.regs().sc_regs[24] }
+func (c *sigctxt) r25() uint64 { return c.regs().sc_regs[25] }
+func (c *sigctxt) r26() uint64 { return c.regs().sc_regs[26] }
+func (c *sigctxt) r27() uint64 { return c.regs().sc_regs[27] }
+func (c *sigctxt) r28() uint64 { return c.regs().sc_regs[28] }
+func (c *sigctxt) r29() uint64 { return c.regs().sc_regs[29] }
+func (c *sigctxt) r30() uint64 { return c.regs().sc_regs[30] }
+func (c *sigctxt) r31() uint64 { return c.regs().sc_regs[31] }
+func (c *sigctxt) sp() uint64  { return c.regs().sc_regs[29] }
+
+//go:nosplit
+//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) sigaddr() uint64 { return c.info.si_addr }
index 95835ca4d5538a2c61c152873f3284f234337275..b6831bc22dc939bae038ed2fd8bc45066a3e4047 100644 (file)
@@ -17,46 +17,53 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) r2() uint64    { return c.regs().gpr[2] }
-func (c *sigctxt) r3() uint64    { return c.regs().gpr[3] }
-func (c *sigctxt) r4() uint64    { return c.regs().gpr[4] }
-func (c *sigctxt) r5() uint64    { return c.regs().gpr[5] }
-func (c *sigctxt) r6() uint64    { return c.regs().gpr[6] }
-func (c *sigctxt) r7() uint64    { return c.regs().gpr[7] }
-func (c *sigctxt) r8() uint64    { return c.regs().gpr[8] }
-func (c *sigctxt) r9() uint64    { return c.regs().gpr[9] }
-func (c *sigctxt) r10() uint64   { return c.regs().gpr[10] }
-func (c *sigctxt) r11() uint64   { return c.regs().gpr[11] }
-func (c *sigctxt) r12() uint64   { return c.regs().gpr[12] }
-func (c *sigctxt) r13() uint64   { return c.regs().gpr[13] }
-func (c *sigctxt) r14() uint64   { return c.regs().gpr[14] }
-func (c *sigctxt) r15() uint64   { return c.regs().gpr[15] }
-func (c *sigctxt) r16() uint64   { return c.regs().gpr[16] }
-func (c *sigctxt) r17() uint64   { return c.regs().gpr[17] }
-func (c *sigctxt) r18() uint64   { return c.regs().gpr[18] }
-func (c *sigctxt) r19() uint64   { return c.regs().gpr[19] }
-func (c *sigctxt) r20() uint64   { return c.regs().gpr[20] }
-func (c *sigctxt) r21() uint64   { return c.regs().gpr[21] }
-func (c *sigctxt) r22() uint64   { return c.regs().gpr[22] }
-func (c *sigctxt) r23() uint64   { return c.regs().gpr[23] }
-func (c *sigctxt) r24() uint64   { return c.regs().gpr[24] }
-func (c *sigctxt) r25() uint64   { return c.regs().gpr[25] }
-func (c *sigctxt) r26() uint64   { return c.regs().gpr[26] }
-func (c *sigctxt) r27() uint64   { return c.regs().gpr[27] }
-func (c *sigctxt) r28() uint64   { return c.regs().gpr[28] }
-func (c *sigctxt) r29() uint64   { return c.regs().gpr[29] }
-func (c *sigctxt) r30() uint64   { return c.regs().gpr[30] }
-func (c *sigctxt) r31() uint64   { return c.regs().gpr[31] }
-func (c *sigctxt) sp() uint64    { return c.regs().gpr[1] }
-func (c *sigctxt) pc() uint64    { return c.regs().nip }
-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) r0() uint64  { return c.regs().gpr[0] }
+func (c *sigctxt) r1() uint64  { return c.regs().gpr[1] }
+func (c *sigctxt) r2() uint64  { return c.regs().gpr[2] }
+func (c *sigctxt) r3() uint64  { return c.regs().gpr[3] }
+func (c *sigctxt) r4() uint64  { return c.regs().gpr[4] }
+func (c *sigctxt) r5() uint64  { return c.regs().gpr[5] }
+func (c *sigctxt) r6() uint64  { return c.regs().gpr[6] }
+func (c *sigctxt) r7() uint64  { return c.regs().gpr[7] }
+func (c *sigctxt) r8() uint64  { return c.regs().gpr[8] }
+func (c *sigctxt) r9() uint64  { return c.regs().gpr[9] }
+func (c *sigctxt) r10() uint64 { return c.regs().gpr[10] }
+func (c *sigctxt) r11() uint64 { return c.regs().gpr[11] }
+func (c *sigctxt) r12() uint64 { return c.regs().gpr[12] }
+func (c *sigctxt) r13() uint64 { return c.regs().gpr[13] }
+func (c *sigctxt) r14() uint64 { return c.regs().gpr[14] }
+func (c *sigctxt) r15() uint64 { return c.regs().gpr[15] }
+func (c *sigctxt) r16() uint64 { return c.regs().gpr[16] }
+func (c *sigctxt) r17() uint64 { return c.regs().gpr[17] }
+func (c *sigctxt) r18() uint64 { return c.regs().gpr[18] }
+func (c *sigctxt) r19() uint64 { return c.regs().gpr[19] }
+func (c *sigctxt) r20() uint64 { return c.regs().gpr[20] }
+func (c *sigctxt) r21() uint64 { return c.regs().gpr[21] }
+func (c *sigctxt) r22() uint64 { return c.regs().gpr[22] }
+func (c *sigctxt) r23() uint64 { return c.regs().gpr[23] }
+func (c *sigctxt) r24() uint64 { return c.regs().gpr[24] }
+func (c *sigctxt) r25() uint64 { return c.regs().gpr[25] }
+func (c *sigctxt) r26() uint64 { return c.regs().gpr[26] }
+func (c *sigctxt) r27() uint64 { return c.regs().gpr[27] }
+func (c *sigctxt) r28() uint64 { return c.regs().gpr[28] }
+func (c *sigctxt) r29() uint64 { return c.regs().gpr[29] }
+func (c *sigctxt) r30() uint64 { return c.regs().gpr[30] }
+func (c *sigctxt) r31() uint64 { return c.regs().gpr[31] }
+func (c *sigctxt) sp() uint64  { return c.regs().gpr[1] }
+
+//go:nosplit
+//go:nowritebarrierrec
+func (c *sigctxt) pc() uint64 { return c.regs().nip }
+
+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) sigaddr() uint64 { return c.info.si_addr }
index 04f06d04415a7512e4393bdc083690f5c68828b6..de71ee950d3bb0e46991bf8444619689c05e3037 100644 (file)
@@ -14,28 +14,35 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *sigcontext {
        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) r2() uint64      { return c.regs().gregs[2] }
-func (c *sigctxt) r3() uint64      { return c.regs().gregs[3] }
-func (c *sigctxt) r4() uint64      { return c.regs().gregs[4] }
-func (c *sigctxt) r5() uint64      { return c.regs().gregs[5] }
-func (c *sigctxt) r6() uint64      { return c.regs().gregs[6] }
-func (c *sigctxt) r7() uint64      { return c.regs().gregs[7] }
-func (c *sigctxt) r8() uint64      { return c.regs().gregs[8] }
-func (c *sigctxt) r9() uint64      { return c.regs().gregs[9] }
-func (c *sigctxt) r10() uint64     { return c.regs().gregs[10] }
-func (c *sigctxt) r11() uint64     { return c.regs().gregs[11] }
-func (c *sigctxt) r12() uint64     { return c.regs().gregs[12] }
-func (c *sigctxt) r13() uint64     { return c.regs().gregs[13] }
-func (c *sigctxt) r14() uint64     { return c.regs().gregs[14] }
-func (c *sigctxt) r15() uint64     { return c.regs().gregs[15] }
-func (c *sigctxt) link() uint64    { return c.regs().gregs[14] }
-func (c *sigctxt) sp() uint64      { return c.regs().gregs[15] }
-func (c *sigctxt) pc() uint64      { return c.regs().psw_addr }
+
+func (c *sigctxt) r0() uint64   { return c.regs().gregs[0] }
+func (c *sigctxt) r1() uint64   { return c.regs().gregs[1] }
+func (c *sigctxt) r2() uint64   { return c.regs().gregs[2] }
+func (c *sigctxt) r3() uint64   { return c.regs().gregs[3] }
+func (c *sigctxt) r4() uint64   { return c.regs().gregs[4] }
+func (c *sigctxt) r5() uint64   { return c.regs().gregs[5] }
+func (c *sigctxt) r6() uint64   { return c.regs().gregs[6] }
+func (c *sigctxt) r7() uint64   { return c.regs().gregs[7] }
+func (c *sigctxt) r8() uint64   { return c.regs().gregs[8] }
+func (c *sigctxt) r9() uint64   { return c.regs().gregs[9] }
+func (c *sigctxt) r10() uint64  { return c.regs().gregs[10] }
+func (c *sigctxt) r11() uint64  { return c.regs().gregs[11] }
+func (c *sigctxt) r12() uint64  { return c.regs().gregs[12] }
+func (c *sigctxt) r13() uint64  { return c.regs().gregs[13] }
+func (c *sigctxt) r14() uint64  { return c.regs().gregs[14] }
+func (c *sigctxt) r15() uint64  { return c.regs().gregs[15] }
+func (c *sigctxt) link() uint64 { return c.regs().gregs[14] }
+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) sigaddr() uint64 { return c.info.si_addr }
 
@@ -70,7 +77,10 @@ func dumpregs(c *sigctxt) {
        print("link ", hex(c.link()), "\n")
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
+
 func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
 func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) }
 func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
index 900009e957806f360db5eecaeff91ed0c1a73f79..973ec2dc36335d96b1f56959d37e7a1810cfa154 100644 (file)
@@ -51,7 +51,10 @@ func dumpregs(c *sigctxt) {
        print("hi   ", hex(c.hi()), "\n")
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
+
 func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
 func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) }
 func (c *sigctxt) fault() uintptr { return uintptr(c.sigaddr()) }
index 1f4859085b4382d80cf45db32635583d28936ea2..1a30a89c76763f77849376c4ddbb561d46905543 100644 (file)
@@ -11,22 +11,29 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) ecx() uint32       { return c.regs().ecx }
-func (c *sigctxt) edx() uint32       { return c.regs().edx }
-func (c *sigctxt) edi() uint32       { return c.regs().edi }
-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 }
-func (c *sigctxt) eip() uint32       { return c.regs().eip }
-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) eax() uint32 { return c.regs().eax }
+func (c *sigctxt) ebx() uint32 { return c.regs().ebx }
+func (c *sigctxt) ecx() uint32 { return c.regs().ecx }
+func (c *sigctxt) edx() uint32 { return c.regs().edx }
+func (c *sigctxt) edi() uint32 { return c.regs().edi }
+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) 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_esp(x uint32)     { c.regs().esp = x }
index cb72dd07172a1b00a771a7abcf5e567efa620bed..6d656fe14b848b8c8bedf318cf5b9d7b5e4a7f5f 100644 (file)
@@ -11,26 +11,33 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *excregsamd64 {
        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) rcx() uint64     { return c.regs().rcx }
-func (c *sigctxt) rdx() uint64     { return c.regs().rdx }
-func (c *sigctxt) rdi() uint64     { return c.regs().rdi }
-func (c *sigctxt) rsi() uint64     { return c.regs().rsi }
-func (c *sigctxt) rbp() uint64     { return c.regs().rbp }
-func (c *sigctxt) rsp() uint64     { return c.regs().rsp }
-func (c *sigctxt) r8() uint64      { return c.regs().r8 }
-func (c *sigctxt) r9() uint64      { return c.regs().r9 }
-func (c *sigctxt) r10() uint64     { return c.regs().r10 }
-func (c *sigctxt) r11() uint64     { return c.regs().r11 }
-func (c *sigctxt) r12() uint64     { return c.regs().r12 }
-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 }
-func (c *sigctxt) rip() uint64     { return c.regs().rip }
+
+func (c *sigctxt) rax() uint64 { return c.regs().rax }
+func (c *sigctxt) rbx() uint64 { return c.regs().rbx }
+func (c *sigctxt) rcx() uint64 { return c.regs().rcx }
+func (c *sigctxt) rdx() uint64 { return c.regs().rdx }
+func (c *sigctxt) rdi() uint64 { return c.regs().rdi }
+func (c *sigctxt) rsi() uint64 { return c.regs().rsi }
+func (c *sigctxt) rbp() uint64 { return c.regs().rbp }
+func (c *sigctxt) rsp() uint64 { return c.regs().rsp }
+func (c *sigctxt) r8() uint64  { return c.regs().r8 }
+func (c *sigctxt) r9() uint64  { return c.regs().r9 }
+func (c *sigctxt) r10() uint64 { return c.regs().r10 }
+func (c *sigctxt) r11() uint64 { return c.regs().r11 }
+func (c *sigctxt) r12() uint64 { return c.regs().r12 }
+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 uint64(c.regs().rflags) }
 func (c *sigctxt) cs() uint64      { return ^uint64(0) }
 func (c *sigctxt) fs() uint64      { return ^uint64(0) }
index b99827c5f24fb0e72ee6855e22cf3b191eef42c8..959dbfbab15e8eadd0553e742bc090f807cec56d 100644 (file)
@@ -11,24 +11,30 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *excregsarm { return &(*exccontext)(c.ctxt).regs }
 
-func (c *sigctxt) r0() uint32      { return c.regs().r0 }
-func (c *sigctxt) r1() uint32      { return c.regs().r1 }
-func (c *sigctxt) r2() uint32      { return c.regs().r2 }
-func (c *sigctxt) r3() uint32      { return c.regs().r3 }
-func (c *sigctxt) r4() uint32      { return c.regs().r4 }
-func (c *sigctxt) r5() uint32      { return c.regs().r5 }
-func (c *sigctxt) r6() uint32      { return c.regs().r6 }
-func (c *sigctxt) r7() uint32      { return c.regs().r7 }
-func (c *sigctxt) r8() uint32      { return c.regs().r8 }
-func (c *sigctxt) r9() uint32      { return c.regs().r9 }
-func (c *sigctxt) r10() uint32     { return c.regs().r10 }
-func (c *sigctxt) fp() uint32      { return c.regs().r11 }
-func (c *sigctxt) ip() uint32      { return c.regs().r12 }
-func (c *sigctxt) sp() uint32      { return c.regs().sp }
-func (c *sigctxt) lr() uint32      { return c.regs().lr }
-func (c *sigctxt) pc() uint32      { return c.regs().pc }
+func (c *sigctxt) r0() uint32  { return c.regs().r0 }
+func (c *sigctxt) r1() uint32  { return c.regs().r1 }
+func (c *sigctxt) r2() uint32  { return c.regs().r2 }
+func (c *sigctxt) r3() uint32  { return c.regs().r3 }
+func (c *sigctxt) r4() uint32  { return c.regs().r4 }
+func (c *sigctxt) r5() uint32  { return c.regs().r5 }
+func (c *sigctxt) r6() uint32  { return c.regs().r6 }
+func (c *sigctxt) r7() uint32  { return c.regs().r7 }
+func (c *sigctxt) r8() uint32  { return c.regs().r8 }
+func (c *sigctxt) r9() uint32  { return c.regs().r9 }
+func (c *sigctxt) r10() uint32 { return c.regs().r10 }
+func (c *sigctxt) fp() uint32  { return c.regs().r11 }
+func (c *sigctxt) ip() uint32  { return c.regs().r12 }
+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) fault() uint32   { return ^uint32(0) }
 func (c *sigctxt) trap() uint32    { return ^uint32(0) }
index af49d5dec0124cb1e0f87df958359c6998466a70..845a5752684caa7396464229647d3d4750b481f6 100644 (file)
@@ -11,21 +11,28 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) ecx() uint32      { return c.regs().__gregs[_REG_ECX] }
-func (c *sigctxt) edx() uint32      { return c.regs().__gregs[_REG_EDX] }
-func (c *sigctxt) edi() uint32      { return c.regs().__gregs[_REG_EDI] }
-func (c *sigctxt) esi() uint32      { return c.regs().__gregs[_REG_ESI] }
-func (c *sigctxt) ebp() uint32      { return c.regs().__gregs[_REG_EBP] }
-func (c *sigctxt) esp() uint32      { return c.regs().__gregs[_REG_UESP] }
-func (c *sigctxt) eip() uint32      { return c.regs().__gregs[_REG_EIP] }
-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) eax() uint32 { return c.regs().__gregs[_REG_EAX] }
+func (c *sigctxt) ebx() uint32 { return c.regs().__gregs[_REG_EBX] }
+func (c *sigctxt) ecx() uint32 { return c.regs().__gregs[_REG_ECX] }
+func (c *sigctxt) edx() uint32 { return c.regs().__gregs[_REG_EDX] }
+func (c *sigctxt) edi() uint32 { return c.regs().__gregs[_REG_EDI] }
+func (c *sigctxt) esi() uint32 { return c.regs().__gregs[_REG_ESI] }
+func (c *sigctxt) ebp() uint32 { return c.regs().__gregs[_REG_EBP] }
+func (c *sigctxt) esp() uint32 { return c.regs().__gregs[_REG_UESP] }
+
+//go:nosplit
+//go:nowritebarrierrec
+func (c *sigctxt) eip() uint32 { return c.regs().__gregs[_REG_EIP] }
+
+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 {
        return *(*uint32)(unsafe.Pointer(&c.info._reason[0]))
 }
index db230f8ac068b2676d67f3e63a5754dcc1d2a9b9..67fe4377fd60e9d9872410119e1a3b3685ccc140 100644 (file)
@@ -11,26 +11,33 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *mcontextt {
        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) rcx() uint64     { return c.regs().__gregs[_REG_RCX] }
-func (c *sigctxt) rdx() uint64     { return c.regs().__gregs[_REG_RDX] }
-func (c *sigctxt) rdi() uint64     { return c.regs().__gregs[_REG_RDI] }
-func (c *sigctxt) rsi() uint64     { return c.regs().__gregs[_REG_RSI] }
-func (c *sigctxt) rbp() uint64     { return c.regs().__gregs[_REG_RBP] }
-func (c *sigctxt) rsp() uint64     { return c.regs().__gregs[_REG_RSP] }
-func (c *sigctxt) r8() uint64      { return c.regs().__gregs[_REG_R8] }
-func (c *sigctxt) r9() uint64      { return c.regs().__gregs[_REG_R8] }
-func (c *sigctxt) r10() uint64     { return c.regs().__gregs[_REG_R10] }
-func (c *sigctxt) r11() uint64     { return c.regs().__gregs[_REG_R11] }
-func (c *sigctxt) r12() uint64     { return c.regs().__gregs[_REG_R12] }
-func (c *sigctxt) r13() uint64     { return c.regs().__gregs[_REG_R13] }
-func (c *sigctxt) r14() uint64     { return c.regs().__gregs[_REG_R14] }
-func (c *sigctxt) r15() uint64     { return c.regs().__gregs[_REG_R15] }
-func (c *sigctxt) rip() uint64     { return c.regs().__gregs[_REG_RIP] }
+
+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) rcx() uint64 { return c.regs().__gregs[_REG_RCX] }
+func (c *sigctxt) rdx() uint64 { return c.regs().__gregs[_REG_RDX] }
+func (c *sigctxt) rdi() uint64 { return c.regs().__gregs[_REG_RDI] }
+func (c *sigctxt) rsi() uint64 { return c.regs().__gregs[_REG_RSI] }
+func (c *sigctxt) rbp() uint64 { return c.regs().__gregs[_REG_RBP] }
+func (c *sigctxt) rsp() uint64 { return c.regs().__gregs[_REG_RSP] }
+func (c *sigctxt) r8() uint64  { return c.regs().__gregs[_REG_R8] }
+func (c *sigctxt) r9() uint64  { return c.regs().__gregs[_REG_R8] }
+func (c *sigctxt) r10() uint64 { return c.regs().__gregs[_REG_R10] }
+func (c *sigctxt) r11() uint64 { return c.regs().__gregs[_REG_R11] }
+func (c *sigctxt) r12() uint64 { return c.regs().__gregs[_REG_R12] }
+func (c *sigctxt) r13() uint64 { return c.regs().__gregs[_REG_R13] }
+func (c *sigctxt) r14() uint64 { return c.regs().__gregs[_REG_R14] }
+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) cs() uint64      { return c.regs().__gregs[_REG_CS] }
 func (c *sigctxt) fs() uint64      { return c.regs().__gregs[_REG_FS] }
index 4e58d3ba301bb0062bfd408a278c28012222d57a..64cfffae5a425e4c500012a57bfeb875a2fa50f3 100644 (file)
@@ -11,28 +11,35 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 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) r2() uint32       { return c.regs().__gregs[_REG_R2] }
-func (c *sigctxt) r3() uint32       { return c.regs().__gregs[_REG_R3] }
-func (c *sigctxt) r4() uint32       { return c.regs().__gregs[_REG_R4] }
-func (c *sigctxt) r5() uint32       { return c.regs().__gregs[_REG_R5] }
-func (c *sigctxt) r6() uint32       { return c.regs().__gregs[_REG_R6] }
-func (c *sigctxt) r7() uint32       { return c.regs().__gregs[_REG_R7] }
-func (c *sigctxt) r8() uint32       { return c.regs().__gregs[_REG_R8] }
-func (c *sigctxt) r9() uint32       { return c.regs().__gregs[_REG_R9] }
-func (c *sigctxt) r10() uint32      { return c.regs().__gregs[_REG_R10] }
-func (c *sigctxt) fp() uint32       { return c.regs().__gregs[_REG_R11] }
-func (c *sigctxt) ip() uint32       { return c.regs().__gregs[_REG_R12] }
-func (c *sigctxt) sp() uint32       { return c.regs().__gregs[_REG_R13] }
-func (c *sigctxt) lr() uint32       { return c.regs().__gregs[_REG_R14] }
-func (c *sigctxt) pc() uint32       { return c.regs().__gregs[_REG_R15] }
-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) r0() uint32  { return c.regs().__gregs[_REG_R0] }
+func (c *sigctxt) r1() uint32  { return c.regs().__gregs[_REG_R1] }
+func (c *sigctxt) r2() uint32  { return c.regs().__gregs[_REG_R2] }
+func (c *sigctxt) r3() uint32  { return c.regs().__gregs[_REG_R3] }
+func (c *sigctxt) r4() uint32  { return c.regs().__gregs[_REG_R4] }
+func (c *sigctxt) r5() uint32  { return c.regs().__gregs[_REG_R5] }
+func (c *sigctxt) r6() uint32  { return c.regs().__gregs[_REG_R6] }
+func (c *sigctxt) r7() uint32  { return c.regs().__gregs[_REG_R7] }
+func (c *sigctxt) r8() uint32  { return c.regs().__gregs[_REG_R8] }
+func (c *sigctxt) r9() uint32  { return c.regs().__gregs[_REG_R9] }
+func (c *sigctxt) r10() uint32 { return c.regs().__gregs[_REG_R10] }
+func (c *sigctxt) fp() uint32  { return c.regs().__gregs[_REG_R11] }
+func (c *sigctxt) ip() uint32  { return c.regs().__gregs[_REG_R12] }
+func (c *sigctxt) sp() uint32  { return c.regs().__gregs[_REG_R13] }
+func (c *sigctxt) lr() uint32  { return c.regs().__gregs[_REG_R14] }
+
+//go:nosplit
+//go:nowritebarrierrec
+func (c *sigctxt) pc() uint32 { return c.regs().__gregs[_REG_R15] }
+
+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) sigaddr() uint32 { return uint32(c.info._reason) }
index dbbb2c8a5cbb41d3c69ac14c7e35d44774c4c399..2fc4b1dcb2f357877ad42abf4ed1dc940a4b0cb9 100644 (file)
@@ -11,19 +11,25 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *sigcontext {
        return (*sigcontext)(c.ctxt)
 }
 
-func (c *sigctxt) eax() uint32     { return c.regs().sc_eax }
-func (c *sigctxt) ebx() uint32     { return c.regs().sc_ebx }
-func (c *sigctxt) ecx() uint32     { return c.regs().sc_ecx }
-func (c *sigctxt) edx() uint32     { return c.regs().sc_edx }
-func (c *sigctxt) edi() uint32     { return c.regs().sc_edi }
-func (c *sigctxt) esi() uint32     { return c.regs().sc_esi }
-func (c *sigctxt) ebp() uint32     { return c.regs().sc_ebp }
-func (c *sigctxt) esp() uint32     { return c.regs().sc_esp }
-func (c *sigctxt) eip() uint32     { return c.regs().sc_eip }
+func (c *sigctxt) eax() uint32 { return c.regs().sc_eax }
+func (c *sigctxt) ebx() uint32 { return c.regs().sc_ebx }
+func (c *sigctxt) ecx() uint32 { return c.regs().sc_ecx }
+func (c *sigctxt) edx() uint32 { return c.regs().sc_edx }
+func (c *sigctxt) edi() uint32 { return c.regs().sc_edi }
+func (c *sigctxt) esi() uint32 { return c.regs().sc_esi }
+func (c *sigctxt) ebp() uint32 { return c.regs().sc_ebp }
+func (c *sigctxt) esp() uint32 { return c.regs().sc_esp }
+
+//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) cs() uint32      { return c.regs().sc_cs }
 func (c *sigctxt) fs() uint32      { return c.regs().sc_fs }
index 5631ab440895973841ac67c836f7830ada416c9c..091a88a54a013d233a008e4f5151cc8e21b31ef2 100644 (file)
@@ -11,27 +11,33 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *sigcontext {
        return (*sigcontext)(c.ctxt)
 }
 
-func (c *sigctxt) rax() uint64     { return c.regs().sc_rax }
-func (c *sigctxt) rbx() uint64     { return c.regs().sc_rbx }
-func (c *sigctxt) rcx() uint64     { return c.regs().sc_rcx }
-func (c *sigctxt) rdx() uint64     { return c.regs().sc_rdx }
-func (c *sigctxt) rdi() uint64     { return c.regs().sc_rdi }
-func (c *sigctxt) rsi() uint64     { return c.regs().sc_rsi }
-func (c *sigctxt) rbp() uint64     { return c.regs().sc_rbp }
-func (c *sigctxt) rsp() uint64     { return c.regs().sc_rsp }
-func (c *sigctxt) r8() uint64      { return c.regs().sc_r8 }
-func (c *sigctxt) r9() uint64      { return c.regs().sc_r9 }
-func (c *sigctxt) r10() uint64     { return c.regs().sc_r10 }
-func (c *sigctxt) r11() uint64     { return c.regs().sc_r11 }
-func (c *sigctxt) r12() uint64     { return c.regs().sc_r12 }
-func (c *sigctxt) r13() uint64     { return c.regs().sc_r13 }
-func (c *sigctxt) r14() uint64     { return c.regs().sc_r14 }
-func (c *sigctxt) r15() uint64     { return c.regs().sc_r15 }
-func (c *sigctxt) rip() uint64     { return c.regs().sc_rip }
+func (c *sigctxt) rax() uint64 { return c.regs().sc_rax }
+func (c *sigctxt) rbx() uint64 { return c.regs().sc_rbx }
+func (c *sigctxt) rcx() uint64 { return c.regs().sc_rcx }
+func (c *sigctxt) rdx() uint64 { return c.regs().sc_rdx }
+func (c *sigctxt) rdi() uint64 { return c.regs().sc_rdi }
+func (c *sigctxt) rsi() uint64 { return c.regs().sc_rsi }
+func (c *sigctxt) rbp() uint64 { return c.regs().sc_rbp }
+func (c *sigctxt) rsp() uint64 { return c.regs().sc_rsp }
+func (c *sigctxt) r8() uint64  { return c.regs().sc_r8 }
+func (c *sigctxt) r9() uint64  { return c.regs().sc_r9 }
+func (c *sigctxt) r10() uint64 { return c.regs().sc_r10 }
+func (c *sigctxt) r11() uint64 { return c.regs().sc_r11 }
+func (c *sigctxt) r12() uint64 { return c.regs().sc_r12 }
+func (c *sigctxt) r13() uint64 { return c.regs().sc_r13 }
+func (c *sigctxt) r14() uint64 { return c.regs().sc_r14 }
+func (c *sigctxt) r15() uint64 { return c.regs().sc_r15 }
+
+//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) cs() uint64      { return c.regs().sc_cs }
 func (c *sigctxt) fs() uint64      { return c.regs().sc_fs }
index 3158a4e57db204123d5146b95b76ac801f267bc6..66aea934f172a0b486417fcea04a576020ecbe7a 100644 (file)
@@ -11,26 +11,32 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *sigcontext {
        return (*sigcontext)(c.ctxt)
 }
 
-func (c *sigctxt) r0() uint32      { return c.regs().sc_r0 }
-func (c *sigctxt) r1() uint32      { return c.regs().sc_r1 }
-func (c *sigctxt) r2() uint32      { return c.regs().sc_r2 }
-func (c *sigctxt) r3() uint32      { return c.regs().sc_r3 }
-func (c *sigctxt) r4() uint32      { return c.regs().sc_r4 }
-func (c *sigctxt) r5() uint32      { return c.regs().sc_r5 }
-func (c *sigctxt) r6() uint32      { return c.regs().sc_r6 }
-func (c *sigctxt) r7() uint32      { return c.regs().sc_r7 }
-func (c *sigctxt) r8() uint32      { return c.regs().sc_r8 }
-func (c *sigctxt) r9() uint32      { return c.regs().sc_r9 }
-func (c *sigctxt) r10() uint32     { return c.regs().sc_r10 }
-func (c *sigctxt) fp() uint32      { return c.regs().sc_r11 }
-func (c *sigctxt) ip() uint32      { return c.regs().sc_r12 }
-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) pc() uint32      { return c.regs().sc_pc }
+func (c *sigctxt) r0() uint32  { return c.regs().sc_r0 }
+func (c *sigctxt) r1() uint32  { return c.regs().sc_r1 }
+func (c *sigctxt) r2() uint32  { return c.regs().sc_r2 }
+func (c *sigctxt) r3() uint32  { return c.regs().sc_r3 }
+func (c *sigctxt) r4() uint32  { return c.regs().sc_r4 }
+func (c *sigctxt) r5() uint32  { return c.regs().sc_r5 }
+func (c *sigctxt) r6() uint32  { return c.regs().sc_r6 }
+func (c *sigctxt) r7() uint32  { return c.regs().sc_r7 }
+func (c *sigctxt) r8() uint32  { return c.regs().sc_r8 }
+func (c *sigctxt) r9() uint32  { return c.regs().sc_r9 }
+func (c *sigctxt) r10() uint32 { return c.regs().sc_r10 }
+func (c *sigctxt) fp() uint32  { return c.regs().sc_r11 }
+func (c *sigctxt) ip() uint32  { return c.regs().sc_r12 }
+func (c *sigctxt) sp() uint32  { return c.regs().sc_usr_sp }
+func (c *sigctxt) lr() uint32  { return c.regs().sc_usr_lr }
+
+//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) fault() uint32   { return c.sigaddr() }
 func (c *sigctxt) trap() uint32    { return 0 }
index 73ce09172ac50e6b3ba989379bfbe19aceacf29c..f09f890aeee9030f147d7d8b801ac158914ffa42 100644 (file)
@@ -53,7 +53,10 @@ func dumpregs(c *sigctxt) {
        print("trap ", hex(c.trap()), "\n")
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) sigpc() uintptr { return uintptr(c.pc()) }
+
 func (c *sigctxt) sigsp() uintptr { return uintptr(c.sp()) }
 func (c *sigctxt) siglr() uintptr { return uintptr(c.link()) }
 
index a577c8c1994b2667d965394446de85be7189fcc8..b1da3139ed9ab0815b053d09e2cb1ec89f732707 100644 (file)
@@ -11,26 +11,33 @@ type sigctxt struct {
        ctxt unsafe.Pointer
 }
 
+//go:nosplit
+//go:nowritebarrierrec
 func (c *sigctxt) regs() *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) rcx() uint64     { return uint64(c.regs().gregs[_REG_RCX]) }
-func (c *sigctxt) rdx() uint64     { return uint64(c.regs().gregs[_REG_RDX]) }
-func (c *sigctxt) rdi() uint64     { return uint64(c.regs().gregs[_REG_RDI]) }
-func (c *sigctxt) rsi() uint64     { return uint64(c.regs().gregs[_REG_RSI]) }
-func (c *sigctxt) rbp() uint64     { return uint64(c.regs().gregs[_REG_RBP]) }
-func (c *sigctxt) rsp() uint64     { return uint64(c.regs().gregs[_REG_RSP]) }
-func (c *sigctxt) r8() uint64      { return uint64(c.regs().gregs[_REG_R8]) }
-func (c *sigctxt) r9() uint64      { return uint64(c.regs().gregs[_REG_R9]) }
-func (c *sigctxt) r10() uint64     { return uint64(c.regs().gregs[_REG_R10]) }
-func (c *sigctxt) r11() uint64     { return uint64(c.regs().gregs[_REG_R11]) }
-func (c *sigctxt) r12() uint64     { return uint64(c.regs().gregs[_REG_R12]) }
-func (c *sigctxt) r13() uint64     { return uint64(c.regs().gregs[_REG_R13]) }
-func (c *sigctxt) r14() uint64     { return uint64(c.regs().gregs[_REG_R14]) }
-func (c *sigctxt) r15() uint64     { return uint64(c.regs().gregs[_REG_R15]) }
-func (c *sigctxt) rip() uint64     { return uint64(c.regs().gregs[_REG_RIP]) }
+
+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) rcx() uint64 { return uint64(c.regs().gregs[_REG_RCX]) }
+func (c *sigctxt) rdx() uint64 { return uint64(c.regs().gregs[_REG_RDX]) }
+func (c *sigctxt) rdi() uint64 { return uint64(c.regs().gregs[_REG_RDI]) }
+func (c *sigctxt) rsi() uint64 { return uint64(c.regs().gregs[_REG_RSI]) }
+func (c *sigctxt) rbp() uint64 { return uint64(c.regs().gregs[_REG_RBP]) }
+func (c *sigctxt) rsp() uint64 { return uint64(c.regs().gregs[_REG_RSP]) }
+func (c *sigctxt) r8() uint64  { return uint64(c.regs().gregs[_REG_R8]) }
+func (c *sigctxt) r9() uint64  { return uint64(c.regs().gregs[_REG_R9]) }
+func (c *sigctxt) r10() uint64 { return uint64(c.regs().gregs[_REG_R10]) }
+func (c *sigctxt) r11() uint64 { return uint64(c.regs().gregs[_REG_R11]) }
+func (c *sigctxt) r12() uint64 { return uint64(c.regs().gregs[_REG_R12]) }
+func (c *sigctxt) r13() uint64 { return uint64(c.regs().gregs[_REG_R13]) }
+func (c *sigctxt) r14() uint64 { return uint64(c.regs().gregs[_REG_R14]) }
+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) cs() uint64      { return uint64(c.regs().gregs[_REG_CS]) }
 func (c *sigctxt) fs() uint64      { return uint64(c.regs().gregs[_REG_FS]) }
index f0c27cedbfff39b8577aeb6607d21c91a2503181..6b85490f759f4c758150388b1ac13792eb3e0580 100644 (file)
@@ -202,15 +202,12 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
        }
        g := getg()
        if g == nil {
+               c := &sigctxt{info, ctx}
                if sig == _SIGPROF {
-                       // Ignore profiling signals that arrive on
-                       // 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.
+                       sigprofNonGoPC(c.sigpc())
                        return
                }
-               badsignal(uintptr(sig), &sigctxt{info, ctx})
+               badsignal(uintptr(sig), c)
                return
        }
 
index 81965831a718e83cf7257d821a9ecba3eaf2d683..5f16e2526f53e4adcbcd5d3e44e3c7d867d4d4e3 100644 (file)
@@ -80,11 +80,19 @@ import (
 
 func init() {
        register("CgoPprofThread", CgoPprofThread)
+       register("CgoPprofThreadNoTraceback", CgoPprofThreadNoTraceback)
 }
 
 func CgoPprofThread() {
        runtime.SetCgoTraceback(0, unsafe.Pointer(C.pprofCgoThreadTraceback), nil, nil)
+       pprofThread()
+}
+
+func CgoPprofThreadNoTraceback() {
+       pprofThread()
+}
 
+func pprofThread() {
        f, err := ioutil.TempFile("", "prof")
        if err != nil {
                fmt.Fprintln(os.Stderr, err)