// Copyright 2020 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

// Needed for go:linkname.
import _ "unsafe"

type sigctxt struct {
	regs generalRegs
}

func (c *sigctxt) r0() uint64  { return c.regs.r[0] }
func (c *sigctxt) r1() uint64  { return c.regs.r[1] }
func (c *sigctxt) r2() uint64  { return c.regs.r[2] }
func (c *sigctxt) r3() uint64  { return c.regs.r[3] }
func (c *sigctxt) r4() uint64  { return c.regs.r[4] }
func (c *sigctxt) r5() uint64  { return c.regs.r[5] }
func (c *sigctxt) r6() uint64  { return c.regs.r[6] }
func (c *sigctxt) r7() uint64  { return c.regs.r[7] }
func (c *sigctxt) r8() uint64  { return c.regs.r[8] }
func (c *sigctxt) r9() uint64  { return c.regs.r[9] }
func (c *sigctxt) r10() uint64 { return c.regs.r[10] }
func (c *sigctxt) r11() uint64 { return c.regs.r[11] }
func (c *sigctxt) r12() uint64 { return c.regs.r[12] }
func (c *sigctxt) r13() uint64 { return c.regs.r[13] }
func (c *sigctxt) r14() uint64 { return c.regs.r[14] }
func (c *sigctxt) r15() uint64 { return c.regs.r[15] }
func (c *sigctxt) r16() uint64 { return c.regs.r[16] }
func (c *sigctxt) r17() uint64 { return c.regs.r[17] }
func (c *sigctxt) r18() uint64 { return c.regs.r[18] }
func (c *sigctxt) r19() uint64 { return c.regs.r[19] }
func (c *sigctxt) r20() uint64 { return c.regs.r[20] }
func (c *sigctxt) r21() uint64 { return c.regs.r[21] }
func (c *sigctxt) r22() uint64 { return c.regs.r[22] }
func (c *sigctxt) r23() uint64 { return c.regs.r[23] }
func (c *sigctxt) r24() uint64 { return c.regs.r[24] }
func (c *sigctxt) r25() uint64 { return c.regs.r[25] }
func (c *sigctxt) r26() uint64 { return c.regs.r[26] }
func (c *sigctxt) r27() uint64 { return c.regs.r[27] }
func (c *sigctxt) r28() uint64 { return c.regs.r[28] }
func (c *sigctxt) r29() uint64 { return c.regs.r[29] }
func (c *sigctxt) lr() uint64  { return c.regs.lr }
func (c *sigctxt) sp() uint64  { return c.regs.sp }

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

// TODO brunodalbo these only seem to be used to dump regs, what's the right
// value here?
func (c *sigctxt) pstate() uint64  { return 0 }
func (c *sigctxt) fault() uintptr  { return 0 }
func (c *sigctxt) sigcode() uint64 { return 0 }
func (c *sigctxt) sigaddr() uint64 { return 0 }

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.lr = x }
func (c *sigctxt) set_r28(x uint64) { c.regs.r[28] = x }

//go:linkname xx_panicmem xx_panicmem
func xx_panicmem()

func (c *sigctxt) prepareExceptionPanic() {
	//	R1 - LR at moment of fault
	//	R2 - PC at moment of fault
	c.regs.r[1] = c.lr()
	c.regs.r[2] = c.pc()
	c.pushCall(funcPC(xx_panicmem), uintptr(c.pc()))
}

//go:nosplit
//go:linkname setsigsegv
func setsigsegv(pc uintptr) {
	g := getg()
	g.sig = 0
	g.sigpc = pc
	g.sigcode0 = 0
	g.sigcode1 = 0 // TODO: emulate si_addr
}
