aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/sys_x86.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_x86.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_x86.go')
-rw-r--r--src/runtime/sys_x86.go54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/runtime/sys_x86.go b/src/runtime/sys_x86.go
new file mode 100644
index 0000000000..086af8ff10
--- /dev/null
+++ b/src/runtime/sys_x86.go
@@ -0,0 +1,54 @@
+// 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.
+
+// +build amd64 amd64p32 386
+
+package runtime
+
+import "unsafe"
+
+// adjust Gobuf as it if executed a call to fn with context ctxt
+// and then did an immediate gosave.
+func gostartcall(buf *gobuf, fn, ctxt unsafe.Pointer) {
+ sp := buf.sp
+ if regSize > ptrSize {
+ sp -= ptrSize
+ *(*uintptr)(unsafe.Pointer(sp)) = 0
+ }
+ sp -= ptrSize
+ *(*uintptr)(unsafe.Pointer(sp)) = buf.pc
+ buf.sp = sp
+ 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) {
+ pc := (*[8]byte)(unsafe.Pointer(buf.pc))
+ if pc[0] == 0xe9 { // jmp 4-byte offset
+ buf.pc = buf.pc + 5 + uintptr(int64(*(*int32)(unsafe.Pointer(&pc[1]))))
+ return
+ }
+ if pc[0] == 0xeb { // jmp 1-byte offset
+ buf.pc = buf.pc + 2 + uintptr(int64(*(*int8)(unsafe.Pointer(&pc[1]))))
+ return
+ }
+ if pc[0] == 0xcc {
+ // This is a breakpoint inserted by gdb. We could use
+ // runtime·findfunc to find the function. But if we
+ // do that, then we will continue execution at the
+ // function entry point, and we will not hit the gdb
+ // breakpoint. So for this case we don't change
+ // buf.pc, so that when we return we will execute
+ // the jump instruction and carry on. This means that
+ // stack unwinding may not work entirely correctly
+ // (http://golang.org/issue/5723) but the user is
+ // running under gdb anyhow.
+ return
+ }
+ print("runtime: pc=", pc, " ", hex(pc[0]), " ", hex(pc[1]), " ", hex(pc[2]), " ", hex(pc[3]), " ", hex(pc[4]), "\n")
+ gothrow("runtime: misuse of rewindmorestack")
+}