// 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 (
	"runtime/internal/sys"
	"unsafe"
)

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

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) sigcode() uint32 { return uint32(c.info.si_code) }
func (c *sigctxt) sigaddr() uint32 { return c.info.si_addr }

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().r10 = x }

func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
func (c *sigctxt) set_sigaddr(x uint32) {
	*(*uintptr)(add(unsafe.Pointer(c.info), 2*sys.PtrSize)) = uintptr(x)
}
