...
Source file src/runtime/os3_plan9.go
1
2
3
4
5 package runtime
6
7 import (
8 "runtime/internal/sys"
9 "unsafe"
10 )
11
12
13
14
15 func sighandler(_ureg *ureg, note *byte, gp *g) int {
16 _g_ := getg()
17 var t sigTabT
18 var docrash bool
19 var sig int
20 var flags int
21 var level int32
22
23 c := &sigctxt{_ureg}
24 notestr := gostringnocopy(note)
25
26
27
28 if _ureg == nil || note == nil {
29 print("sighandler: ureg ", _ureg, " note ", note, "\n")
30 goto Throw
31 }
32
33
34 if len(notestr) > _ERRMAX-1 {
35 print("sighandler: note is longer than ERRMAX\n")
36 goto Throw
37 }
38 if isAbortPC(c.pc()) {
39
40 goto Throw
41 }
42
43
44
45 flags = _SigNotify
46 for sig, t = range sigtable {
47 if hasPrefix(notestr, t.name) {
48 flags = t.flags
49 break
50 }
51 }
52 if flags&_SigPanic != 0 && gp.throwsplit {
53
54
55 flags = (flags &^ _SigPanic) | _SigThrow
56 }
57 if flags&_SigGoExit != 0 {
58 exits((*byte)(add(unsafe.Pointer(note), 9)))
59 }
60 if flags&_SigPanic != 0 {
61
62
63 memmove(unsafe.Pointer(_g_.m.notesig), unsafe.Pointer(note), uintptr(len(notestr)+1))
64 gp.sig = uint32(sig)
65 gp.sigpc = c.pc()
66
67 pc := c.pc()
68 sp := c.sp()
69
70
71
72
73
74 if pc != 0 && !findfunc(pc).valid() && findfunc(*(*uintptr)(unsafe.Pointer(sp))).valid() {
75 pc = 0
76 }
77
78
79
80
81
82
83 if usesLR {
84 c.savelr(c.lr())
85 }
86
87
88
89
90
91 if pc != 0 {
92 if usesLR {
93 c.setlr(pc)
94 } else {
95 if sys.RegSize > sys.PtrSize {
96 sp -= sys.PtrSize
97 *(*uintptr)(unsafe.Pointer(sp)) = 0
98 }
99 sp -= sys.PtrSize
100 *(*uintptr)(unsafe.Pointer(sp)) = pc
101 c.setsp(sp)
102 }
103 }
104 if usesLR {
105 c.setpc(funcPC(sigpanictramp))
106 } else {
107 c.setpc(funcPC(sigpanic))
108 }
109 return _NCONT
110 }
111 if flags&_SigNotify != 0 {
112 if ignoredNote(note) {
113 return _NCONT
114 }
115 if sendNote(note) {
116 return _NCONT
117 }
118 }
119 if flags&_SigKill != 0 {
120 goto Exit
121 }
122 if flags&_SigThrow == 0 {
123 return _NCONT
124 }
125 Throw:
126 _g_.m.throwing = 1
127 _g_.m.caughtsig.set(gp)
128 startpanic_m()
129 print(notestr, "\n")
130 print("PC=", hex(c.pc()), "\n")
131 print("\n")
132 level, _, docrash = gotraceback()
133 if level > 0 {
134 goroutineheader(gp)
135 tracebacktrap(c.pc(), c.sp(), c.lr(), gp)
136 tracebackothers(gp)
137 print("\n")
138 dumpregs(_ureg)
139 }
140 if docrash {
141 crash()
142 }
143 Exit:
144 goexitsall(note)
145 exits(note)
146 return _NDFLT
147 }
148
149 func sigenable(sig uint32) {
150 }
151
152 func sigdisable(sig uint32) {
153 }
154
155 func sigignore(sig uint32) {
156 }
157
158 func setProcessCPUProfiler(hz int32) {
159 }
160
161 func setThreadCPUProfiler(hz int32) {
162
163 getg().m.profilehz = hz
164 }
165
166
167 type gsignalStack struct{}
168
View as plain text