// 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.

// +build linux
// +build ppc64 ppc64le

package runtime

import (
	"runtime/internal/sys"
	"unsafe"
)

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

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

func (c *sigctxt) sigcode() uint32 { return uint32(c.info.si_code) }
func (c *sigctxt) sigaddr() uint64 { return c.info.si_addr }
func (c *sigctxt) fault() uint64   { return c.regs().dar }

func (c *sigctxt) set_r0(x uint64)   { c.regs().gpr[0] = x }
func (c *sigctxt) set_r12(x uint64)  { c.regs().gpr[12] = x }
func (c *sigctxt) set_r30(x uint64)  { c.regs().gpr[30] = x }
func (c *sigctxt) set_pc(x uint64)   { c.regs().nip = x }
func (c *sigctxt) set_sp(x uint64)   { c.regs().gpr[1] = x }
func (c *sigctxt) set_link(x uint64) { c.regs().link = x }

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