Bell 32V release
[unix-history] / usr / src / cmd / sdb / xeq.c
CommitLineData
d449853c
TL
1#include "head.h"
2#include <a.out.h>
3struct user u;
4#include <stdio.h>
5INT signo;
6INT adrflg;
7INT pid;
8L_INT cntval;
9
10
11/* service routines for sub process control */
12
13
14/*
15 * single step until loc with descriptor format d is modified
16 * return its new value.
17 */
18monex(loc, d)
19ADDR loc; char d; {
20 register ADDR oldval;
21
22 oldval = getval(loc, d);
23 do {
24 subpcs('s');
25 } while (oldval == getval(loc, d));
26 return(getval(loc, d));
27}
28
29/* single step count source stmts */
30singstep(count) {
31 register int thisline, curline;
32 register ADDR dot;
33 register struct proct *thisproc;
34
35 dot = *(ADDR *) (((ADDR) &u) + PC);
36 thisproc = adrtoprocp(dot);
37 thisline = adrtolineno(dot);
38 if (count == 0) count = 1;
39 for(; count; count--) {
40 do {
41 subpcs('s');
42 dot = *(ADDR *) (((ADDR) &u) + PC);
43 curline = adrtolineno(dot);
44 } while (!signo &&
45 ((thisproc == adrtoprocp(dot) && thisline == curline) ||
46 curline == -1));
47 if (signo) return;
48 }
49}
50
51doscall() {
52 int subargs[NUMARGS]; /* subargs[0] = address,
53 subargs[1] = number of arguments
54 subargs[2:NUMARGS] = actual arguments */
55 union {
56 struct {
57 int w[128-NUMARGS];
58 };
59 struct {
60 char c[4*(128-NUMARGS)];
61 };
62 }substr;
63
64 register int i, numchars, *subargp;
65 register char ch;
66 ADDR straddr, adr, praddr;
67 ADDR j;
68
69 praddr = extaddr(proc);
70 if (praddr == -1) {
71 printf("Cannot find %s\n", proc);
72 return;
73 }
74 straddr = extaddr("_dbargs");
75 if (straddr == -1) {
76 error("Program not loaded with -lg");
77 return;
78 }
79
80 numchars = 0;
81 subargp = subargs;
82 argsp++;
83 *subargp++ = praddr;
84 subargp++;
85
86 for (i=0; i<NUMARGS - 2; i++) { /* process an argument */
87 ch = *argsp;
88 if (ch == '\'') {
89 *subargp++ = *(argsp+1);
90 argsp += 2;
91 } else if (ch == '"') {
92 *subargp++ = straddr + sizeof subargs + numchars;
93 argsp++;
94 for (;;) {
95 substr.c[numchars++] = ch = *argsp++;
96 if (ch == '"') {
97 substr.c[numchars-1] = '\0';
98 break;
99 }
100 if (ch == '\0') {
101 error("Unterminated string constant");
102 return;
103 }
104 if (numchars > sizeof substr.c) {
105 error("Too many string constants");
106 return;
107 }
108 }
109 } else if ((ch >= '0' && ch <= '9') || ch == '-') {
110 *subargp++ = readint(&argsp);
111 } else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
112 ch == '_') {
113 cpname(var, argsp);
114 j = varaddr(curproc()->pname, var);
115 if (j == -1) {
116 printf("Unknown variable: %s\n", argsp);
117 return;
118 }
119 *subargp++ = getval(j, typetodesc(sl_type, 0)[0]);
120 do {
121 argsp++;
122 } while (varchar(*argsp) || number(*argsp));
123 } else if (ch != ')') {
124 printf("Unexpected character %c\n", ch);
125 return;
126 }
127
128 do {
129 ch = *argsp++;
130 } while(ch == ' ');
131 if (ch == ')') {
132 dot = *(ADDR *)(((ADDR)&u)+PC) = extaddr("_dbsubc");
133 if (dot == -1) {
134 error("Internal error - cannot find _dbsubc");
135 return;
136 }
137 adrflg = 1;
138 cntval = 1;
139 if (pid == 0 || signo) subpcs('r');
140 subargs[1] = (subargp - subargs) - 2;
141 adr = straddr;
142 for (j=0; j<=(subargp-subargs); j++) {
143 put(adr, DSP, subargs[j]);
144 adr += WORDSIZE;
145 }
146 adr = straddr + sizeof subargs;
147 for (j=0; j<(numchars+WORDSIZE-1)/WORDSIZE; j++) {
148 put(adr, DSP, substr.w[j]);
149 adr += WORDSIZE;
150 }
151 errflg = 0;
152 subpcs('c');
153 dot = *(ADDR *)(((ADDR)&u)+PC);
154 if (dot != extaddr("_dbsubn")) {
155 if (!signo) printf("Breakpoint\n");
156 else printf(" at\n");
157 return;
158 }
159 if (*argsp++ == '/') {
160 dispf((ADDR) 0, *argsp ? *argsp : 'd', N_RSYM, 0, 0);
161 }
162 else
163 printf("Procedure returned normally\n");
164 reset();
165 }
166 while (*argsp == ' ' || *argsp == ',')
167 argsp++;
168 }
169
170 error ("Too many arguments");
171
172}