// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package runtime

import 

type sigctxt struct {
	info *siginfo
	ctxt unsafe.Pointer
}

//go:nosplit
//go:nowritebarrierrec
func ( *sigctxt) () *regs64 { return &(*ucontext)(.ctxt).uc_mcontext.ss }

func ( *sigctxt) () uint64  { return .regs().x[0] }
func ( *sigctxt) () uint64  { return .regs().x[1] }
func ( *sigctxt) () uint64  { return .regs().x[2] }
func ( *sigctxt) () uint64  { return .regs().x[3] }
func ( *sigctxt) () uint64  { return .regs().x[4] }
func ( *sigctxt) () uint64  { return .regs().x[5] }
func ( *sigctxt) () uint64  { return .regs().x[6] }
func ( *sigctxt) () uint64  { return .regs().x[7] }
func ( *sigctxt) () uint64  { return .regs().x[8] }
func ( *sigctxt) () uint64  { return .regs().x[9] }
func ( *sigctxt) () uint64 { return .regs().x[10] }
func ( *sigctxt) () uint64 { return .regs().x[11] }
func ( *sigctxt) () uint64 { return .regs().x[12] }
func ( *sigctxt) () uint64 { return .regs().x[13] }
func ( *sigctxt) () uint64 { return .regs().x[14] }
func ( *sigctxt) () uint64 { return .regs().x[15] }
func ( *sigctxt) () uint64 { return .regs().x[16] }
func ( *sigctxt) () uint64 { return .regs().x[17] }
func ( *sigctxt) () uint64 { return .regs().x[18] }
func ( *sigctxt) () uint64 { return .regs().x[19] }
func ( *sigctxt) () uint64 { return .regs().x[20] }
func ( *sigctxt) () uint64 { return .regs().x[21] }
func ( *sigctxt) () uint64 { return .regs().x[22] }
func ( *sigctxt) () uint64 { return .regs().x[23] }
func ( *sigctxt) () uint64 { return .regs().x[24] }
func ( *sigctxt) () uint64 { return .regs().x[25] }
func ( *sigctxt) () uint64 { return .regs().x[26] }
func ( *sigctxt) () uint64 { return .regs().x[27] }
func ( *sigctxt) () uint64 { return .regs().x[28] }
func ( *sigctxt) () uint64 { return .regs().fp }
func ( *sigctxt) () uint64  { return .regs().lr }
func ( *sigctxt) () uint64  { return .regs().sp }

//go:nosplit
//go:nowritebarrierrec
func ( *sigctxt) () uint64 { return .regs().pc }

func ( *sigctxt) () uintptr { return uintptr(unsafe.Pointer(.info.si_addr)) }

func ( *sigctxt) () uint64 { return uint64(.info.si_code) }
func ( *sigctxt) () uint64 { return uint64(uintptr(unsafe.Pointer(.info.si_addr))) }

func ( *sigctxt) ( uint64)  { .regs().pc =  }
func ( *sigctxt) ( uint64)  { .regs().sp =  }
func ( *sigctxt) ( uint64)  { .regs().lr =  }
func ( *sigctxt) ( uint64) { .regs().x[28] =  }

func ( *sigctxt) ( uint64) { .info.si_code = int32() }
func ( *sigctxt) ( uint64) {
	.info.si_addr = (*byte)(unsafe.Pointer(uintptr()))
}

//go:nosplit
func ( *sigctxt) ( uint32) {
	switch  {
	case _SIGTRAP:
		// OS X sets c.sigcode() == TRAP_BRKPT unconditionally for all SIGTRAPs,
		// leaving no way to distinguish a breakpoint-induced SIGTRAP
		// from an asynchronous signal SIGTRAP.
		// They all look breakpoint-induced by default.
		// Try looking at the code to see if it's a breakpoint.
		// The assumption is that we're very unlikely to get an
		// asynchronous SIGTRAP at just the moment that the
		// PC started to point at unmapped memory.
		 := uintptr(.pc())
		// OS X will leave the pc just after the instruction.
		 := (*uint32)(unsafe.Pointer( - 4))
		if * != 0xd4200000 {
			// SIGTRAP on something other than breakpoint.
			.set_sigcode(_SI_USER)
		}
	}
}