1 /* $Id: atlin.c,v 1.2 1994/06/24 13:33:22 ceriel Exp $ */
9 static int nbp; /* # of breakpoints */
10 static char *bp[MAXBP];
13 char *begin_trace, *end_trace;
14 } trace_buf[MAXTRACE];
16 static struct message_hdr ok_message;
19 #define SS 1 /* single stepping */
20 #define SSF 2 /* single stepping, counting functions
21 as single statements */
30 for (i = PS; i>0; i--) {
31 l = (l << 8) | (*p++ & 0377);
43 for (i = LS; i>0; i--) {
44 l = (l << 8) | (*p++ & 0377);
55 register long l = (long) cp;
58 for (i = PS; i > 0; i--) {
72 for (i = LS; i > 0; i--) {
78 static int single_stepping = OFF;
80 static int step_count = 0;
82 static int break_flag = 0;
83 static int reading = 0;
88 extern char *__Get_LB();
89 extern char *__Get_Hol0();
90 extern char *__Get_PC();
91 extern char *__Cvt_LB_AB();
92 extern char *__Get_HP();
98 #define check_ptr(c) (((c) >= (char *)&etext && (c) <= currbrk) || (c) >= LB)
112 while (c >= 0x1000) {
113 i = _read(IN_FD, p, 0x1000);
114 if (i == 0) return 0;
125 i = _read(IN_FD, p, (int)c);
126 if (i == 0) return 0;
147 while (c >= 0x1000) {
148 i = _write(OUT_FD, p, 0x1000);
156 i = _write(OUT_FD, p, (int)c);
168 struct message_hdr *message;
170 if (! ureceive((char *) message, (long) sizeof(struct message_hdr))) {
178 struct message_hdr *message;
180 if (! usend((char *) message, (long) sizeof(struct message_hdr))) {
188 struct message_hdr *m;
192 if (! uputm(m) || ! (sz && p ? usend(p, sz) : 1)) {
201 /* obtain a request from the debugger and perform it */
207 struct message_hdr message;
210 if (! ugetm(&message)) {
211 /* failed to get a message. Something is wrong. Let process continue */
215 if (message.m_type & M_DB_SS) db_ss = 1;
216 message.m_type &= 0177;
217 switch(message.m_type) {
219 /* sometimes sent to child to see if it lives */
222 /* set a breakpoint */
227 bp[nbp++] = BUFTOA(message.m_buf+1);
230 if (ntrace == MAXTRACE) {
234 trace_buf[ntrace].begin_trace = BUFTOA(message.m_buf+1);
235 trace_buf[ntrace++].end_trace = BUFTOA(message.m_buf+(PS+1));
239 c = BUFTOA(message.m_buf+1);
240 while (i < nbp && bp[i] != c) {
256 c = BUFTOA(message.m_buf+1);
257 c1 = BUFTOA(message.m_buf+(PS+1));
259 trace_buf[i].begin_trace != c &&
260 trace_buf[i].end_trace != c1){
265 trace_buf[i] = trace_buf[i+1];
275 single_stepping = SS;
276 step_count = BUFTOL(message.m_buf+1);
279 single_stepping = OFF;
282 savedlb = __Get_LB(2);
283 step_count = BUFTOL(message.m_buf+1);
284 single_stepping = SSF;
287 message.m_type = M_DATA;
288 sz = BUFTOL(message.m_buf+1);
289 c = BUFTOA(message.m_buf+(LS+1));
291 if (! check_ptr(c) || ! check_ptr(c+sz-1)) {
295 return sendreply(&message, c, sz)
300 sz = BUFTOL(message.m_buf+1);
301 c1 = c = BUFTOA(message.m_buf+(LS+1));
305 if (c - c1 + 1 >= sz) break;
307 if (! check_ptr(c)) {
315 message.m_type = M_DATA;
317 LTOBUF(message.m_buf+1, sz);
318 return sendreply(&message, c1, sz)
323 if (! ureceive(BUFTOA(message.m_buf+(LS+1)), BUFTOL(message.m_buf+1))) {
329 i = BUFTOL(message.m_buf+1);
330 c = __Get_LB(i+2); /* local base */
331 c1 = __Get_LB(i+1); /* needed to find PC and SP */
332 ATOBUF(message.m_buf+LB_OFF, c);
333 ATOBUF(message.m_buf+AB_OFF, __Cvt_LB_AB(c));
334 ATOBUF(message.m_buf+PC_OFF, __Get_PC(c1));
335 ATOBUF(message.m_buf+HP_OFF, __Get_HP());
336 ATOBUF(message.m_buf+SP_OFF, __Cvt_LB_AB(c1));
337 return sendreply(&message, (char *) 0, 0L) ? 0 : -1;
340 /* actually, only the program counter is settable */
341 i = BUFTOL(message.m_buf+1);
343 __Set_PC(c, BUFTOA(message.m_buf+PC_OFF));
353 message.m_type = M_DGLOB;
355 LTOBUF(message.m_buf+1, sz);
356 ATOBUF(message.m_buf + HP_OFF, __Get_HP());
357 ATOBUF(message.m_buf + PC_OFF, __Get_PC(__Get_LB(1)));
358 ATOBUF(message.m_buf + LB_OFF, c1);
360 sendreply(&message, c, sz);
361 if (! ___topsave()) {
362 /* we get here after a ___topload() ! */
373 _brk(BUFTOA(message.m_buf + LB_OFF));
374 __Set_HP(BUFTOA(message.m_buf+HP_OFF));
375 if (! ureceive(__Get_Hol0(), BUFTOL(message.m_buf+1))) {}
376 ___topload(BUFTOA(message.m_buf + SP_OFF));
379 send_ok(fail ? M_FAIL : M_OK);
380 return fail ? -1 : 0;
383 ___sendtop(addr, SP, sz)
387 struct message_hdr m;
390 LTOBUF(m.m_buf+1, (long) sz);
391 ATOBUF(m.m_buf+SP_OFF, SP);
392 sendreply(&m, addr, (long)sz);
398 struct message_hdr m;
401 if (! ureceive(SP, BUFTOL(m.m_buf+1))) {}
408 if (reading) send_ok(M_INTR);
418 for (i = 0; i < nbp; i++) {
419 if (bp[i] == retaddr) {
431 for (i = 0; i < ntrace; i++) {
432 if (trace_buf[i].begin_trace <= retaddr &&
433 trace_buf[i].end_trace >= retaddr) {
445 ok_message.m_type = type;
446 LTOBUF(ok_message.m_buf+1, (long) retaddr);
452 /* This function must be called after every LIN and LNI */
458 /* not the first time ... */
459 retaddr = __Get_PC(LB);
461 /* first, adjust step_count when single stepping
463 if (single_stepping == SS) step_count--;
464 else if (single_stepping == SSF) {
465 char *lb = __Get_LB(1);
466 if (!((char *) &lb < lb && lb >= savedlb ||
467 (char *) &lb > lb && lb <= savedlb)) {
475 if (single_stepping != OFF && step_count <= 0) {
477 single_stepping = OFF;
479 else if (break_flag) status = M_INTR;
483 retaddr = __Get_PC(LB);
487 if (status == M_CONT) {
488 if ((nbp != 0 && check_bp() != 0) ||
489 (ntrace != 0 && check_trace() != 0)) {
492 else if (break_flag) status = M_INTR;
497 while (do_request() <= 0) /* nothing */;
499 if (break_flag) status = M_INTR;
507 while (do_request() <= 0) /* nothing */;