diff options
| author | Jordan Rhee <jordanrh@microsoft.com> | 2018-08-08 14:44:42 -0700 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2018-09-18 22:18:23 +0000 |
| commit | d24ec86e4f64302e91d8062eabfcd21296bb9b04 (patch) | |
| tree | 93618b9bd00376df7529db6c4fd8785a91dcc41f /src/runtime/syscall_windows.go | |
| parent | 37db664c6cd480b578d6114854bc20c2bc3cddcd (diff) | |
| download | go-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.go | 24 |
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 |
