| // Copyright 2014 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" | |
| type mOS struct { | |
| waitsemacount uint32 | |
| notesig *int8 | |
| errstr *byte | |
| } | |
| func closefd(fd int32) int32 | |
| //go:noescape | |
| func open(name *byte, mode, perm int32) int32 | |
| //go:noescape | |
| func pread(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32 | |
| //go:noescape | |
| func pwrite(fd int32, buf unsafe.Pointer, nbytes int32, offset int64) int32 | |
| func seek(fd int32, offset int64, whence int32) int64 | |
| //go:noescape | |
| func exits(msg *byte) | |
| //go:noescape | |
| func brk_(addr unsafe.Pointer) int32 | |
| func sleep(ms int32) int32 | |
| func rfork(flags int32) int32 | |
| //go:noescape | |
| func plan9_semacquire(addr *uint32, block int32) int32 | |
| //go:noescape | |
| func plan9_tsemacquire(addr *uint32, ms int32) int32 | |
| //go:noescape | |
| func plan9_semrelease(addr *uint32, count int32) int32 | |
| //go:noescape | |
| func notify(fn unsafe.Pointer) int32 | |
| func noted(mode int32) int32 | |
| //go:noescape | |
| func nsec(*int64) int64 | |
| //go:noescape | |
| func sigtramp(ureg, msg unsafe.Pointer) | |
| func setfpmasks() | |
| //go:noescape | |
| func tstart_plan9(newm *m) | |
| func errstr() string | |
| type _Plink uintptr | |
| //go:linkname os_sigpipe os.sigpipe | |
| func os_sigpipe() { | |
| throw("too many writes on closed pipe") | |
| } | |
| func sigpanic() { | |
| g := getg() | |
| if !canpanic(g) { | |
| throw("unexpected signal during runtime execution") | |
| } | |
| note := gostringnocopy((*byte)(unsafe.Pointer(g.m.notesig))) | |
| switch g.sig { | |
| case _SIGRFAULT, _SIGWFAULT: | |
| addr := note[index(note, "addr=")+5:] | |
| g.sigcode1 = uintptr(atolwhex(addr)) | |
| if g.sigcode1 < 0x1000 || g.paniconfault { | |
| panicmem() | |
| } | |
| print("unexpected fault address ", hex(g.sigcode1), "\n") | |
| throw("fault") | |
| case _SIGTRAP: | |
| if g.paniconfault { | |
| panicmem() | |
| } | |
| throw(note) | |
| case _SIGINTDIV: | |
| panicdivide() | |
| case _SIGFLOAT: | |
| panicfloat() | |
| default: | |
| panic(errorString(note)) | |
| } | |
| } | |
| func atolwhex(p string) int64 { | |
| for hasprefix(p, " ") || hasprefix(p, "\t") { | |
| p = p[1:] | |
| } | |
| neg := false | |
| if hasprefix(p, "-") || hasprefix(p, "+") { | |
| neg = p[0] == '-' | |
| p = p[1:] | |
| for hasprefix(p, " ") || hasprefix(p, "\t") { | |
| p = p[1:] | |
| } | |
| } | |
| var n int64 | |
| switch { | |
| case hasprefix(p, "0x"), hasprefix(p, "0X"): | |
| p = p[2:] | |
| for ; len(p) > 0; p = p[1:] { | |
| if '0' <= p[0] && p[0] <= '9' { | |
| n = n*16 + int64(p[0]-'0') | |
| } else if 'a' <= p[0] && p[0] <= 'f' { | |
| n = n*16 + int64(p[0]-'a'+10) | |
| } else if 'A' <= p[0] && p[0] <= 'F' { | |
| n = n*16 + int64(p[0]-'A'+10) | |
| } else { | |
| break | |
| } | |
| } | |
| case hasprefix(p, "0"): | |
| for ; len(p) > 0 && '0' <= p[0] && p[0] <= '7'; p = p[1:] { | |
| n = n*8 + int64(p[0]-'0') | |
| } | |
| default: | |
| for ; len(p) > 0 && '0' <= p[0] && p[0] <= '9'; p = p[1:] { | |
| n = n*10 + int64(p[0]-'0') | |
| } | |
| } | |
| if neg { | |
| n = -n | |
| } | |
| return n | |
| } |