// Copyright 2014 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 "unsafe"

type sigctxt struct {
	info *siginfo
	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 }
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) }
func (c *sigctxt) trap() uint32    { return 0 }
func (c *sigctxt) error() uint32   { return 0 }
func (c *sigctxt) oldmask() uint32 { return 0 }

func (c *sigctxt) set_pc(x uint32)  { c.regs().pc = x }
func (c *sigctxt) set_sp(x uint32)  { c.regs().sp = x }
func (c *sigctxt) set_lr(x uint32)  { c.regs().lr = x }
func (c *sigctxt) set_r10(x uint32) { c.regs().r[10] = x }

func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
func (c *sigctxt) set_sigaddr(x uint32) { c.info.si_addr = x }

func (c *sigctxt) fixsigcode(sig uint32) {
	switch sig {
	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.
		pc := uintptr(c.pc())
		// OS X will leave the pc just after the instruction.
		code := (*uint32)(unsafe.Pointer(pc - 4))
		if *code != 0xe7f001f0 {
			// SIGTRAP on something other than breakpoint.
			c.set_sigcode(_SI_USER)
		}
	}
}
