From 7468541674bc7bfe8c741a6ea997faab1b7b78ba Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 28 Nov 2005 00:40:31 +0000 Subject: process control --- acid/386 | 35 +++++++++++++++++++++++++++++++---- acid/port | 33 ++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 9 deletions(-) (limited to 'acid') diff --git a/acid/386 b/acid/386 index 29842b65..e9b2f036 100644 --- a/acid/386 +++ b/acid/386 @@ -67,17 +67,44 @@ defn mmregs() print("MM6\t", *MM6, " MM7\t", *MM7, "\n"); } +defn pfixstop(pid) +{ + if *fmt(*PC-1, 'b') == 0xCC then { + // Linux stops us after the breakpoint, not at it + *PC = *PC-1; + } +} + + defn pstop(pid) { local l; local pc; + local why; pc = *PC; - print(pid,": ", reason(*TRAP), "\t"); - print(fmt(pc, 'a'), "\t", *fmt(pc, 'i'), "\n"); - - if notes then { + // FIgure out why we stopped. + if *fmt(pc, 'b') == 0xCC then { + why = "breakpoint"; + + // fix up instruction for print; will put back later + *pc = @pc; + } else if *(pc-2\x) == 0x80CD then { + pc = pc-2; + why = "system call"; + } else + why = "stopped"; + + if printstopped then { + print(pid,": ", why, "\t"); + print(fmt(pc, 'a'), "\t", *fmt(pc, 'i'), "\n"); + } + + if why == "breakpoint" then + *fmt(pc, bpfmt) = bpinst; + + if printstopped && notes then { if notes[0] != "sys: breakpoint" then { print("Notes pending:\n"); l = notes; diff --git a/acid/port b/acid/port index 9cd2f760..c6bf9056 100644 --- a/acid/port +++ b/acid/port @@ -326,6 +326,16 @@ defn bpdel(addr) // delete a breakpoint { local n, pc, nbplist; + if addr == 0 then { + while bplist do { + pc = head bplist; + pc = fmt(pc, bpfmt); + *pc = @pc; + bplist = tail bplist; + } + return {}; + } + n = match(addr, bplist); if n < 0 then { print("no breakpoint at ", fmt(addr, 'a'), "\n"); @@ -360,6 +370,7 @@ defn cont() // continue execution defn stopped(pid) // called from acid when a process changes state { + pfixstop(pid); pstop(pid); // stub so this is easy to replace } @@ -472,14 +483,22 @@ defn win2() stopped(npid); } +printstopped = 1; defn new() { + local a; + bplist = {}; newproc(progargs); - // Dont miss the delay slot calls - bpset(follow(main)[0]); - cont(); - bpdel(*PC); + a = var("p9main"); + if a == {} then + a = var("main"); + if a == {} then + return {}; + bpset(a); + while *PC != a do + cont(); + bpdel(a); } defn stmnt() // step one statement @@ -517,10 +536,14 @@ defn func() // step until we leave the current function defn next() { - local sp, bound; + local sp, bound, pc; sp = *SP; bound = fnbound(*PC); + if bound == {} then { + print("cannot locate text symbol\n"); + return {}; + } stmnt(); pc = *PC; if pc >= bound[0] && pc < bound[1] then -- cgit v1.2.3