// Copyright 2013 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() *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) sigcode() uint32 { return uint32(c.info._code) }
func (c *sigctxt) sigaddr() uint32 { return uint32(c.info._reason) }

func (c *sigctxt) set_pc(x uint32)  { c.regs().__gregs[_REG_R15] = x }
func (c *sigctxt) set_sp(x uint32)  { c.regs().__gregs[_REG_R13] = x }
func (c *sigctxt) set_lr(x uint32)  { c.regs().__gregs[_REG_R14] = x }
func (c *sigctxt) set_r10(x uint32) { c.regs().__gregs[_REG_R10] = x }

func (c *sigctxt) set_sigcode(x uint32) { c.info._code = int32(x) }
func (c *sigctxt) set_sigaddr(x uint32) {
	c.info._reason = uintptr(x)
}
