URI: 
       tprocess control - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 7468541674bc7bfe8c741a6ea997faab1b7b78ba
   DIR parent 88c6062214c07dabeb7e9625aaccb3d45ed5d71c
  HTML Author: rsc <devnull@localhost>
       Date:   Mon, 28 Nov 2005 00:40:31 +0000
       
       process control
       
       Diffstat:
         M acid/386                            |      35 +++++++++++++++++++++++++++----
         M acid/port                           |      33 ++++++++++++++++++++++++++-----
       
       2 files changed, 59 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/acid/386 b/acid/386
       t@@ -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;
   DIR diff --git a/acid/port b/acid/port
       t@@ -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");
       t@@ -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
        }
        
       t@@ -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
       t@@ -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