// 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() *regs32   { return &(*ucontext)(c.ctxt).uc_mcontext.ss }
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 c.regs().cs }
func (c *sigctxt) fs() uint32      { return c.regs().fs }
func (c *sigctxt) gs() uint32      { return 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) { c.info.si_addr = x }
