// 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() *sigcontext {
	return (*sigcontext)(c.ctxt)
}

func (c *sigctxt) rax() uint64     { return c.regs().sc_rax }
func (c *sigctxt) rbx() uint64     { return c.regs().sc_rbx }
func (c *sigctxt) rcx() uint64     { return c.regs().sc_rcx }
func (c *sigctxt) rdx() uint64     { return c.regs().sc_rdx }
func (c *sigctxt) rdi() uint64     { return c.regs().sc_rdi }
func (c *sigctxt) rsi() uint64     { return c.regs().sc_rsi }
func (c *sigctxt) rbp() uint64     { return c.regs().sc_rbp }
func (c *sigctxt) rsp() uint64     { return c.regs().sc_rsp }
func (c *sigctxt) r8() uint64      { return c.regs().sc_r8 }
func (c *sigctxt) r9() uint64      { return c.regs().sc_r9 }
func (c *sigctxt) r10() uint64     { return c.regs().sc_r10 }
func (c *sigctxt) r11() uint64     { return c.regs().sc_r11 }
func (c *sigctxt) r12() uint64     { return c.regs().sc_r12 }
func (c *sigctxt) r13() uint64     { return c.regs().sc_r13 }
func (c *sigctxt) r14() uint64     { return c.regs().sc_r14 }
func (c *sigctxt) r15() uint64     { return c.regs().sc_r15 }
func (c *sigctxt) rip() uint64     { return c.regs().sc_rip }
func (c *sigctxt) rflags() uint64  { return c.regs().sc_rflags }
func (c *sigctxt) cs() uint64      { return c.regs().sc_cs }
func (c *sigctxt) fs() uint64      { return c.regs().sc_fs }
func (c *sigctxt) gs() uint64      { return c.regs().sc_gs }
func (c *sigctxt) sigcode() uint64 { return uint64(c.info.si_code) }
func (c *sigctxt) sigaddr() uint64 {
	return *(*uint64)(add(unsafe.Pointer(c.info), 16))
}

func (c *sigctxt) set_rip(x uint64)     { c.regs().sc_rip = x }
func (c *sigctxt) set_rsp(x uint64)     { c.regs().sc_rsp = x }
func (c *sigctxt) set_sigcode(x uint64) { c.info.si_code = int32(x) }
func (c *sigctxt) set_sigaddr(x uint64) {
	*(*uint64)(add(unsafe.Pointer(c.info), 16)) = x
}
