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 = 0x100001
8
9type m128a struct {
10	low  uint64
11	high int64
12}
13
14type context struct {
15	p1home               uint64
16	p2home               uint64
17	p3home               uint64
18	p4home               uint64
19	p5home               uint64
20	p6home               uint64
21	contextflags         uint32
22	mxcsr                uint32
23	segcs                uint16
24	segds                uint16
25	seges                uint16
26	segfs                uint16
27	seggs                uint16
28	segss                uint16
29	eflags               uint32
30	dr0                  uint64
31	dr1                  uint64
32	dr2                  uint64
33	dr3                  uint64
34	dr6                  uint64
35	dr7                  uint64
36	rax                  uint64
37	rcx                  uint64
38	rdx                  uint64
39	rbx                  uint64
40	rsp                  uint64
41	rbp                  uint64
42	rsi                  uint64
43	rdi                  uint64
44	r8                   uint64
45	r9                   uint64
46	r10                  uint64
47	r11                  uint64
48	r12                  uint64
49	r13                  uint64
50	r14                  uint64
51	r15                  uint64
52	rip                  uint64
53	anon0                [512]byte
54	vectorregister       [26]m128a
55	vectorcontrol        uint64
56	debugcontrol         uint64
57	lastbranchtorip      uint64
58	lastbranchfromrip    uint64
59	lastexceptiontorip   uint64
60	lastexceptionfromrip uint64
61}
62
63func (c *context) ip() uintptr { return uintptr(c.rip) }
64func (c *context) sp() uintptr { return uintptr(c.rsp) }
65
66// AMD64 does not have link register, so this returns 0.
67func (c *context) lr() uintptr      { return 0 }
68func (c *context) set_lr(x uintptr) {}
69
70func (c *context) set_ip(x uintptr) { c.rip = uint64(x) }
71func (c *context) set_sp(x uintptr) { c.rsp = uint64(x) }
72func (c *context) set_fp(x uintptr) { c.rbp = uint64(x) }
73
74func prepareContextForSigResume(c *context) {
75	c.r8 = c.rsp
76	c.r9 = c.rip
77}
78
79func dumpregs(r *context) {
80	print("rax     ", hex(r.rax), "\n")
81	print("rbx     ", hex(r.rbx), "\n")
82	print("rcx     ", hex(r.rcx), "\n")
83	print("rdx     ", hex(r.rdx), "\n")
84	print("rdi     ", hex(r.rdi), "\n")
85	print("rsi     ", hex(r.rsi), "\n")
86	print("rbp     ", hex(r.rbp), "\n")
87	print("rsp     ", hex(r.rsp), "\n")
88	print("r8      ", hex(r.r8), "\n")
89	print("r9      ", hex(r.r9), "\n")
90	print("r10     ", hex(r.r10), "\n")
91	print("r11     ", hex(r.r11), "\n")
92	print("r12     ", hex(r.r12), "\n")
93	print("r13     ", hex(r.r13), "\n")
94	print("r14     ", hex(r.r14), "\n")
95	print("r15     ", hex(r.r15), "\n")
96	print("rip     ", hex(r.rip), "\n")
97	print("rflags  ", hex(r.eflags), "\n")
98	print("cs      ", hex(r.segcs), "\n")
99	print("fs      ", hex(r.segfs), "\n")
100	print("gs      ", hex(r.seggs), "\n")
101}
102
103type _DISPATCHER_CONTEXT struct {
104	controlPc        uint64
105	imageBase        uint64
106	functionEntry    uintptr
107	establisherFrame uint64
108	targetIp         uint64
109	context          *context
110	languageHandler  uintptr
111	handlerData      uintptr
112}
113
114func (c *_DISPATCHER_CONTEXT) ctx() *context {
115	return c.context
116}
117