1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package runtime
6
7const _CONTEXT_CONTROL = 0x10001
8
9type floatingsavearea struct {
10	controlword   uint32
11	statusword    uint32
12	tagword       uint32
13	erroroffset   uint32
14	errorselector uint32
15	dataoffset    uint32
16	dataselector  uint32
17	registerarea  [80]uint8
18	cr0npxstate   uint32
19}
20
21type context struct {
22	contextflags      uint32
23	dr0               uint32
24	dr1               uint32
25	dr2               uint32
26	dr3               uint32
27	dr6               uint32
28	dr7               uint32
29	floatsave         floatingsavearea
30	seggs             uint32
31	segfs             uint32
32	seges             uint32
33	segds             uint32
34	edi               uint32
35	esi               uint32
36	ebx               uint32
37	edx               uint32
38	ecx               uint32
39	eax               uint32
40	ebp               uint32
41	eip               uint32
42	segcs             uint32
43	eflags            uint32
44	esp               uint32
45	segss             uint32
46	extendedregisters [512]uint8
47}
48
49func (c *context) ip() uintptr { return uintptr(c.eip) }
50func (c *context) sp() uintptr { return uintptr(c.esp) }
51
52// 386 does not have link register, so this returns 0.
53func (c *context) lr() uintptr      { return 0 }
54func (c *context) set_lr(x uintptr) {}
55
56func (c *context) set_ip(x uintptr) { c.eip = uint32(x) }
57func (c *context) set_sp(x uintptr) { c.esp = uint32(x) }
58
59// 386 does not have frame pointer register.
60func (c *context) set_fp(x uintptr) {}
61
62func prepareContextForSigResume(c *context) {
63	c.edx = c.esp
64	c.ecx = c.eip
65}
66
67func dumpregs(r *context) {
68	print("eax     ", hex(r.eax), "\n")
69	print("ebx     ", hex(r.ebx), "\n")
70	print("ecx     ", hex(r.ecx), "\n")
71	print("edx     ", hex(r.edx), "\n")
72	print("edi     ", hex(r.edi), "\n")
73	print("esi     ", hex(r.esi), "\n")
74	print("ebp     ", hex(r.ebp), "\n")
75	print("esp     ", hex(r.esp), "\n")
76	print("eip     ", hex(r.eip), "\n")
77	print("eflags  ", hex(r.eflags), "\n")
78	print("cs      ", hex(r.segcs), "\n")
79	print("fs      ", hex(r.segfs), "\n")
80	print("gs      ", hex(r.seggs), "\n")
81}
82
83// _DISPATCHER_CONTEXT is not defined on 386.
84type _DISPATCHER_CONTEXT struct{}
85
86func (c *_DISPATCHER_CONTEXT) ctx() *context {
87	return nil
88}
89