// 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 &(*ucontext)(c.ctxt).uc_mcontext }
func (c *sigctxt) eax() uint32       { return c.regs().eax }
func (c *sigctxt) ebx() uint32       { return c.regs().ebx }
func (c *sigctxt) ecx() uint32       { return c.regs().ecx }
func (c *sigctxt) edx() uint32       { return c.regs().edx }
func (c *sigctxt) edi() uint32       { return c.regs().edi }
func (c *sigctxt) esi() uint32       { return c.regs().esi }
func (c *sigctxt) ebp() uint32       { return c.regs().ebp }
func (c *sigctxt) esp() uint32       { return c.regs().esp }
func (c *sigctxt) eip() uint32       { return c.regs().eip }
func (c *sigctxt) eflags() uint32    { return c.regs().eflags }
func (c *sigctxt) cs() uint32        { return uint32(c.regs().cs) }
func (c *sigctxt) fs() uint32        { return uint32(c.regs().fs) }
func (c *sigctxt) gs() uint32        { return uint32(c.regs().gs) }
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_eip(x uint32)     { c.regs().eip = x }
func (c *sigctxt) set_esp(x uint32)     { c.regs().esp = 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*ptrSize)) = uintptr(x)
}
