Blame


1 84114f06 2004-04-19 devnull /*
2 84114f06 2004-04-19 devnull *
3 84114f06 2004-04-19 devnull * debugger
4 84114f06 2004-04-19 devnull *
5 84114f06 2004-04-19 devnull */
6 84114f06 2004-04-19 devnull
7 84114f06 2004-04-19 devnull #include "defs.h"
8 84114f06 2004-04-19 devnull #include "fns.h"
9 84114f06 2004-04-19 devnull
10 84114f06 2004-04-19 devnull char NOPCS[] = "no process";
11 84114f06 2004-04-19 devnull
12 84114f06 2004-04-19 devnull /* sub process control */
13 84114f06 2004-04-19 devnull
14 84114f06 2004-04-19 devnull void
15 84114f06 2004-04-19 devnull subpcs(int modif)
16 84114f06 2004-04-19 devnull {
17 84114f06 2004-04-19 devnull int check;
18 84114f06 2004-04-19 devnull int runmode;
19 84114f06 2004-04-19 devnull int keepnote;
20 84114f06 2004-04-19 devnull int n, r;
21 84114f06 2004-04-19 devnull ulong line, curr;
22 84114f06 2004-04-19 devnull BKPT *bk;
23 84114f06 2004-04-19 devnull char *comptr;
24 84114f06 2004-04-19 devnull
25 84114f06 2004-04-19 devnull runmode=SINGLE;
26 84114f06 2004-04-19 devnull r = 0;
27 84114f06 2004-04-19 devnull keepnote=0;
28 84114f06 2004-04-19 devnull loopcnt=cntval;
29 84114f06 2004-04-19 devnull switch (modif) {
30 84114f06 2004-04-19 devnull
31 84114f06 2004-04-19 devnull /* delete breakpoint */
32 fa325e9b 2020-01-10 cross case 'd':
33 84114f06 2004-04-19 devnull case 'D':
34 84114f06 2004-04-19 devnull if ((bk=scanbkpt(dot)) == 0)
35 84114f06 2004-04-19 devnull error("no breakpoint set");
36 84114f06 2004-04-19 devnull bk->flag=BKPTCLR;
37 84114f06 2004-04-19 devnull return;
38 84114f06 2004-04-19 devnull
39 84114f06 2004-04-19 devnull /* set breakpoint */
40 fa325e9b 2020-01-10 cross case 'b':
41 84114f06 2004-04-19 devnull case 'B':
42 84114f06 2004-04-19 devnull if (bk=scanbkpt(dot))
43 84114f06 2004-04-19 devnull bk->flag=BKPTCLR;
44 84114f06 2004-04-19 devnull for (bk=bkpthead; bk; bk=bk->nxtbkpt)
45 84114f06 2004-04-19 devnull if (bk->flag == BKPTCLR)
46 84114f06 2004-04-19 devnull break;
47 84114f06 2004-04-19 devnull if (bk==0) {
48 84114f06 2004-04-19 devnull bk = (BKPT *)malloc(sizeof(*bk));
49 84114f06 2004-04-19 devnull if (bk == 0)
50 84114f06 2004-04-19 devnull error("too many breakpoints");
51 84114f06 2004-04-19 devnull bk->nxtbkpt=bkpthead;
52 84114f06 2004-04-19 devnull bkpthead=bk;
53 84114f06 2004-04-19 devnull }
54 84114f06 2004-04-19 devnull bk->loc = dot;
55 84114f06 2004-04-19 devnull bk->initcnt = bk->count = cntval;
56 84114f06 2004-04-19 devnull bk->flag = modif == 'b' ? BKPTSET : BKPTTMP;
57 84114f06 2004-04-19 devnull check=MAXCOM-1;
58 84114f06 2004-04-19 devnull comptr=bk->comm;
59 84114f06 2004-04-19 devnull rdc();
60 84114f06 2004-04-19 devnull reread();
61 84114f06 2004-04-19 devnull do {
62 84114f06 2004-04-19 devnull *comptr++ = readchar();
63 84114f06 2004-04-19 devnull } while (check-- && lastc!=EOR);
64 84114f06 2004-04-19 devnull *comptr=0;
65 84114f06 2004-04-19 devnull if(bk->comm[0] != EOR && cntflg == FALSE)
66 84114f06 2004-04-19 devnull bk->initcnt = bk->count = HUGEINT;
67 84114f06 2004-04-19 devnull reread();
68 84114f06 2004-04-19 devnull if (check)
69 84114f06 2004-04-19 devnull return;
70 84114f06 2004-04-19 devnull error("bkpt command too long");
71 84114f06 2004-04-19 devnull
72 84114f06 2004-04-19 devnull /* exit */
73 84114f06 2004-04-19 devnull case 'k' :
74 84114f06 2004-04-19 devnull case 'K':
75 84114f06 2004-04-19 devnull if (pid == 0)
76 84114f06 2004-04-19 devnull error(NOPCS);
77 84114f06 2004-04-19 devnull dprint("%d: killed", pid);
78 84114f06 2004-04-19 devnull pcsactive = 1; /* force 'kill' ctl */
79 84114f06 2004-04-19 devnull endpcs();
80 84114f06 2004-04-19 devnull return;
81 84114f06 2004-04-19 devnull
82 84114f06 2004-04-19 devnull /* run program */
83 fa325e9b 2020-01-10 cross case 'r':
84 84114f06 2004-04-19 devnull case 'R':
85 84114f06 2004-04-19 devnull endpcs();
86 84114f06 2004-04-19 devnull setup();
87 84114f06 2004-04-19 devnull runmode = CONTIN;
88 84114f06 2004-04-19 devnull break;
89 84114f06 2004-04-19 devnull
90 84114f06 2004-04-19 devnull /* single step */
91 fa325e9b 2020-01-10 cross case 's':
92 84114f06 2004-04-19 devnull if (pid == 0) {
93 84114f06 2004-04-19 devnull setup();
94 84114f06 2004-04-19 devnull loopcnt--;
95 84114f06 2004-04-19 devnull }
96 84114f06 2004-04-19 devnull runmode=SINGLE;
97 84114f06 2004-04-19 devnull keepnote=defval(1);
98 84114f06 2004-04-19 devnull break;
99 84114f06 2004-04-19 devnull case 'S':
100 84114f06 2004-04-19 devnull if (pid == 0) {
101 84114f06 2004-04-19 devnull setup();
102 84114f06 2004-04-19 devnull loopcnt--;
103 84114f06 2004-04-19 devnull }
104 84114f06 2004-04-19 devnull keepnote=defval(1);
105 84114f06 2004-04-19 devnull if(pc2line(dbrget(cormap, mach->pc), &line) < 0)
106 84114f06 2004-04-19 devnull error("%r");
107 84114f06 2004-04-19 devnull n = loopcnt;
108 84114f06 2004-04-19 devnull dprint("%s: running\n", symfil);
109 84114f06 2004-04-19 devnull flush();
110 84114f06 2004-04-19 devnull for (loopcnt = 1; n > 0; loopcnt = 1) {
111 84114f06 2004-04-19 devnull r = runpcs(SINGLE, keepnote);
112 84114f06 2004-04-19 devnull if(pc2line(dot, &curr) < 0)
113 84114f06 2004-04-19 devnull error("%r");
114 84114f06 2004-04-19 devnull if (line != curr) { /* on a new line of c */
115 84114f06 2004-04-19 devnull line = curr;
116 84114f06 2004-04-19 devnull n--;
117 84114f06 2004-04-19 devnull }
118 84114f06 2004-04-19 devnull }
119 84114f06 2004-04-19 devnull loopcnt = 0;
120 84114f06 2004-04-19 devnull break;
121 84114f06 2004-04-19 devnull /* continue with optional note */
122 fa325e9b 2020-01-10 cross case 'c':
123 fa325e9b 2020-01-10 cross case 'C':
124 84114f06 2004-04-19 devnull if (pid==0)
125 84114f06 2004-04-19 devnull error(NOPCS);
126 84114f06 2004-04-19 devnull runmode=CONTIN;
127 84114f06 2004-04-19 devnull keepnote=defval(1);
128 84114f06 2004-04-19 devnull break;
129 84114f06 2004-04-19 devnull
130 84114f06 2004-04-19 devnull case 'n': /* deal with notes */
131 84114f06 2004-04-19 devnull if (pid==0)
132 84114f06 2004-04-19 devnull error(NOPCS);
133 84114f06 2004-04-19 devnull n=defval(-1);
134 84114f06 2004-04-19 devnull if(n>=0 && n<nnote){
135 84114f06 2004-04-19 devnull nnote--;
136 84114f06 2004-04-19 devnull memmove(note[n], note[n+1], (nnote-n)*sizeof(note[0]));
137 84114f06 2004-04-19 devnull }
138 84114f06 2004-04-19 devnull notes();
139 84114f06 2004-04-19 devnull return;
140 84114f06 2004-04-19 devnull
141 84114f06 2004-04-19 devnull case 'h': /* halt the current process */
142 84114f06 2004-04-19 devnull if (adrflg && adrval == 0) {
143 84114f06 2004-04-19 devnull if (pid == 0)
144 84114f06 2004-04-19 devnull error(NOPCS);
145 84114f06 2004-04-19 devnull ungrab();
146 84114f06 2004-04-19 devnull }
147 84114f06 2004-04-19 devnull else {
148 84114f06 2004-04-19 devnull grab();
149 84114f06 2004-04-19 devnull dprint("stopped at%16t");
150 84114f06 2004-04-19 devnull goto Return;
151 84114f06 2004-04-19 devnull }
152 84114f06 2004-04-19 devnull return;
153 84114f06 2004-04-19 devnull
154 84114f06 2004-04-19 devnull case 'x': /* continue executing the current process */
155 84114f06 2004-04-19 devnull if (pid == 0)
156 84114f06 2004-04-19 devnull error(NOPCS);
157 84114f06 2004-04-19 devnull ungrab();
158 84114f06 2004-04-19 devnull return;
159 84114f06 2004-04-19 devnull
160 84114f06 2004-04-19 devnull default:
161 84114f06 2004-04-19 devnull error("bad `:' command");
162 84114f06 2004-04-19 devnull }
163 84114f06 2004-04-19 devnull
164 84114f06 2004-04-19 devnull if (loopcnt>0) {
165 84114f06 2004-04-19 devnull dprint("%s: running\n", symfil);
166 84114f06 2004-04-19 devnull flush();
167 84114f06 2004-04-19 devnull r = runpcs(runmode,keepnote);
168 84114f06 2004-04-19 devnull }
169 84114f06 2004-04-19 devnull if (r)
170 84114f06 2004-04-19 devnull dprint("breakpoint%16t");
171 84114f06 2004-04-19 devnull else
172 84114f06 2004-04-19 devnull dprint("stopped at%16t");
173 84114f06 2004-04-19 devnull Return:
174 84114f06 2004-04-19 devnull delbp();
175 84114f06 2004-04-19 devnull printpc();
176 84114f06 2004-04-19 devnull notes();
177 84114f06 2004-04-19 devnull }