aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/sys_arm.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2014-11-11 17:09:09 -0500
committerRuss Cox <rsc@golang.org>2014-11-11 17:09:09 -0500
commit9204821731bfdcbef0bd4af0c4d40acde23ec7ab (patch)
tree1f2160f2e7a2aa30efdbbaade148f45423d9d4f4 /src/runtime/sys_arm.go
parente785e3acf8a4845ada7bed96f1a88355b1e0cde3 (diff)
downloadgo-9204821731bfdcbef0bd4af0c4d40acde23ec7ab.tar.gz
go-9204821731bfdcbef0bd4af0c4d40acde23ec7ab.zip
[dev.cc] runtime: convert arch-specific .c and .h files to Go
The conversion was done with an automated tool and then modified only as necessary to make it compile and run. vlrt.c was only called from C. Pure delete. [This CL is part of the removal of C code from package runtime. See golang.org/s/dev.cc for an overview.] LGTM=r R=r, austin CC=dvyukov, golang-codereviews, iant, khr https://golang.org/cl/174860043
Diffstat (limited to 'src/runtime/sys_arm.go')
-rw-r--r--src/runtime/sys_arm.go35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/runtime/sys_arm.go b/src/runtime/sys_arm.go
new file mode 100644
index 0000000000..81777c7106
--- /dev/null
+++ b/src/runtime/sys_arm.go
@@ -0,0 +1,35 @@
+// Copyright 2013 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
+
+import "unsafe"
+
+// adjust Gobuf as if it executed a call to fn with context ctxt
+// and then did an immediate Gosave.
+func gostartcall(buf *gobuf, fn, ctxt unsafe.Pointer) {
+ if buf.lr != 0 {
+ gothrow("invalid use of gostartcall")
+ }
+ buf.lr = buf.pc
+ buf.pc = uintptr(fn)
+ buf.ctxt = ctxt
+}
+
+// Called to rewind context saved during morestack back to beginning of function.
+// To help us, the linker emits a jmp back to the beginning right after the
+// call to morestack. We just have to decode and apply that jump.
+func rewindmorestack(buf *gobuf) {
+ var inst uint32
+ if buf.pc&3 == 0 && buf.pc != 0 {
+ inst = *(*uint32)(unsafe.Pointer(buf.pc))
+ if inst>>24 == 0x9a {
+ buf.pc += uintptr(int32(inst<<8)>>6) + 8
+ return
+ }
+ }
+
+ print("runtime: pc=", hex(buf.pc), " ", hex(inst), "\n")
+ gothrow("runtime: misuse of rewindmorestack")
+}