lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// Copyright 2018 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
 
const (
   _PROT_NONE  = 0
   _PROT_READ  = 1
   _PROT_WRITE = 2
   _PROT_EXEC  = 4
 
   _MAP_ANON    = 1
   _MAP_PRIVATE = 2
 
   _DUPLICATE_SAME_ACCESS   = 0x2
   _THREAD_PRIORITY_HIGHEST = 0x2
 
   _SIGINT           = 0x2
   _CTRL_C_EVENT     = 0x0
   _CTRL_BREAK_EVENT = 0x1
 
   _CONTEXT_CONTROL = 0x10001
   _CONTEXT_FULL    = 0x10007
 
   _EXCEPTION_ACCESS_VIOLATION     = 0xc0000005
   _EXCEPTION_BREAKPOINT           = 0x80000003
   _EXCEPTION_FLT_DENORMAL_OPERAND = 0xc000008d
   _EXCEPTION_FLT_DIVIDE_BY_ZERO   = 0xc000008e
   _EXCEPTION_FLT_INEXACT_RESULT   = 0xc000008f
   _EXCEPTION_FLT_OVERFLOW         = 0xc0000091
   _EXCEPTION_FLT_UNDERFLOW        = 0xc0000093
   _EXCEPTION_INT_DIVIDE_BY_ZERO   = 0xc0000094
   _EXCEPTION_INT_OVERFLOW         = 0xc0000095
 
   _INFINITE     = 0xffffffff
   _WAIT_TIMEOUT = 0x102
 
   _EXCEPTION_CONTINUE_EXECUTION = -0x1
   _EXCEPTION_CONTINUE_SEARCH    = 0x0
)
 
type systeminfo struct {
   anon0                       [4]byte
   dwpagesize                  uint32
   lpminimumapplicationaddress *byte
   lpmaximumapplicationaddress *byte
   dwactiveprocessormask       uint32
   dwnumberofprocessors        uint32
   dwprocessortype             uint32
   dwallocationgranularity     uint32
   wprocessorlevel             uint16
   wprocessorrevision          uint16
}
 
type exceptionrecord struct {
   exceptioncode        uint32
   exceptionflags       uint32
   exceptionrecord      *exceptionrecord
   exceptionaddress     *byte
   numberparameters     uint32
   exceptioninformation [15]uint32
}
 
type neon128 struct {
   low  uint64
   high int64
}
 
type context struct {
   contextflags uint32
   r0           uint32
   r1           uint32
   r2           uint32
   r3           uint32
   r4           uint32
   r5           uint32
   r6           uint32
   r7           uint32
   r8           uint32
   r9           uint32
   r10          uint32
   r11          uint32
   r12          uint32
 
   spr  uint32
   lrr  uint32
   pc   uint32
   cpsr uint32
 
   fpscr   uint32
   padding uint32
 
   floatNeon [16]neon128
 
   bvr      [8]uint32
   bcr      [8]uint32
   wvr      [1]uint32
   wcr      [1]uint32
   padding2 [2]uint32
}
 
func (c *context) ip() uintptr { return uintptr(c.pc) }
func (c *context) sp() uintptr { return uintptr(c.spr) }
func (c *context) lr() uintptr { return uintptr(c.lrr) }
 
func (c *context) set_ip(x uintptr) { c.pc = uint32(x) }
func (c *context) set_sp(x uintptr) { c.spr = uint32(x) }
func (c *context) set_lr(x uintptr) { c.lrr = uint32(x) }
 
func dumpregs(r *context) {
   print("r0   ", hex(r.r0), "\n")
   print("r1   ", hex(r.r1), "\n")
   print("r2   ", hex(r.r2), "\n")
   print("r3   ", hex(r.r3), "\n")
   print("r4   ", hex(r.r4), "\n")
   print("r5   ", hex(r.r5), "\n")
   print("r6   ", hex(r.r6), "\n")
   print("r7   ", hex(r.r7), "\n")
   print("r8   ", hex(r.r8), "\n")
   print("r9   ", hex(r.r9), "\n")
   print("r10  ", hex(r.r10), "\n")
   print("r11  ", hex(r.r11), "\n")
   print("r12  ", hex(r.r12), "\n")
   print("sp   ", hex(r.spr), "\n")
   print("lr   ", hex(r.lrr), "\n")
   print("pc   ", hex(r.pc), "\n")
   print("cpsr ", hex(r.cpsr), "\n")
}
 
type overlapped struct {
   internal     uint32
   internalhigh uint32
   anon0        [8]byte
   hevent       *byte
}
 
type memoryBasicInformation struct {
   baseAddress       uintptr
   allocationBase    uintptr
   allocationProtect uint32
   regionSize        uintptr
   state             uint32
   protect           uint32
   type_             uint32
}
 
func stackcheck() {
   // TODO: not implemented on ARM
}