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

func (c *sigctxt) set_pc(x uint64)  { c.regs().pc = x }
func (c *sigctxt) set_sp(x uint64)  { c.regs().sp = x }
func (c *sigctxt) set_lr(x uint64)  { c.regs().regs[30] = x }
func (c *sigctxt) set_r28(x uint64) { c.regs().regs[28] = x }

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