aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/syscall_windows.go
diff options
context:
space:
mode:
authorJordan Rhee <jordanrh@microsoft.com>2018-08-08 14:44:42 -0700
committerIan Lance Taylor <iant@golang.org>2018-09-18 22:18:23 +0000
commitd24ec86e4f64302e91d8062eabfcd21296bb9b04 (patch)
tree93618b9bd00376df7529db6c4fd8785a91dcc41f /src/runtime/syscall_windows.go
parent37db664c6cd480b578d6114854bc20c2bc3cddcd (diff)
downloadgo-d24ec86e4f64302e91d8062eabfcd21296bb9b04.tar.xz
runtime: support windows/arm
Updates #26148 Change-Id: I8f68b2c926c7b11dc86c9664ed7ff2d2f78b64b4 Reviewed-on: https://go-review.googlesource.com/128715 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/syscall_windows.go')
-rw-r--r--src/runtime/syscall_windows.go24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/runtime/syscall_windows.go b/src/runtime/syscall_windows.go
index 8264070569..0858efaf61 100644
--- a/src/runtime/syscall_windows.go
+++ b/src/runtime/syscall_windows.go
@@ -25,18 +25,32 @@ func (c *wincallbackcontext) setCleanstack(cleanstack bool) {
var (
cbs callbacks
cbctxts **wincallbackcontext = &cbs.ctxt[0] // to simplify access to cbs.ctxt in sys_windows_*.s
-
- callbackasm byte // type isn't really byte, it's code in runtime
)
+func callbackasm()
+
// callbackasmAddr returns address of runtime.callbackasm
// function adjusted by i.
-// runtime.callbackasm is just a series of CALL instructions
-// (each is 5 bytes long), and we want callback to arrive at
+// On x86 and amd64, runtime.callbackasm is a series of CALL instructions,
+// and we want callback to arrive at
// correspondent call instruction instead of start of
// runtime.callbackasm.
+// On ARM, runtime.callbackasm is a series of mov and branch instructions.
+// R12 is loaded with the callback index. Each entry is two instructions,
+// hence 8 bytes.
func callbackasmAddr(i int) uintptr {
- return uintptr(add(unsafe.Pointer(&callbackasm), uintptr(i*5)))
+ var entrySize int
+ switch GOARCH {
+ default:
+ panic("unsupported architecture")
+ case "386", "amd64":
+ entrySize = 5
+ case "arm":
+ // On ARM, each entry is a MOV instruction
+ // followed by a branch instruction
+ entrySize = 8
+ }
+ return funcPC(callbackasm) + uintptr(i*entrySize)
}
//go:linkname compileCallback syscall.compileCallback