shithub: riscv

Download patch

ref: ca2f1c07f2a6bb48582b990868976b45d3663605
parent: fbf29fc6951da196b0ce155dd0af86c6d7fde7bf
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Thu Sep 12 11:28:04 EDT 2019

acid/kernel: for stacktraces, try to use context from error stack when process is not sleeping

when a process state has not been saved (Proc.mach != nil)
then the contents of Proc.sched should be considered invalid.

to approximate a stacktrace in this case, we use the error
stack and get a stacktrace from the last waserror() call.

--- a/sys/lib/acid/kernel
+++ b/sys/lib/acid/kernel
@@ -271,12 +271,23 @@
 
 defn procstk(p) {
 	complex Proc p;
+	local l, n;
 
 	if p.state != 0 then {	// 0 is Dead
+		if p.mach == 0 then {
+			l = p.sched;
+		} else {
+			n = p.nerrlab;
+			if n == 0 then {
+				return 0;
+			}
+			l = p.errlab + (n-1)*sizeofLabel;
+		}
+		complex Label l;
 		if objtype=="386" || objtype=="amd64" then
-			_stk(gotolabel, p.sched.sp, linkreg(0), 0);
+			_stk(gotolabel, l.sp, linkreg(0), 0);
 		else
-			_stk(p.sched.pc, p.sched.sp, linkreg(0), 0);
+			_stk(l.pc, l.sp, linkreg(0), 0);
 	}
 }