5 char *vmxroot = "/n/vmx";
18 sysfatal("malloc: %r");
20 setmalloctag(v, getcallerpc(&sz));
30 if(c < 0) sysfatal("Bgetc: %r");
43 while(eBgetc(bin) != '$')
52 while(c = eBgetc(bin)){
54 if(c == '$') goto repeat;
59 if(c == '$') goto repeat;
64 pkt = realloc(pkt, npkt + 64);
68 pkt = realloc(pkt, npkt + 1);
71 if(buf[0] == '$') goto repeat;
73 if(buf[1] == '$') goto repeat;
76 csum2 = strtol(buf, &p, 16);
77 if(p != &buf[2] || csum != csum2){
86 bflush(Biobufhdr *, void *v, long n)
89 return read(bin->fid, v, n);
98 fprint(2, "-> %s\n", p0);
105 case '$': case '#': case '{': case '*':
107 Bputc(bout, *p ^ 0x20);
108 csum += '{' + (*p ^ 0x20);
114 Bprint(bout, "#%.2uX", csum);
119 case '-': goto again;
120 case '$': Bungetc(bin); return;
124 static char *regname[] = {
125 "ax", "cx", "dx", "bx",
126 "sp", "bp", "si", "di",
127 "pc", "flags", "cs", "ss",
128 "ds", "es", "fs", "gs",
142 l = 4 * nelem(regname);
143 buf = emalloc(2 * l + 1);
144 memset(buf, 'x', 2 * l);
145 rc = pread(regsfd, rbuf, sizeof(rbuf)-1, 0);
156 if(tokenize(p, f, nelem(f)) < 2) continue;
157 v = strtoull(f[1], nil, 0);
159 for(i = 0; i < nelem(regname); i++){
160 if(strcmp(f[0], regname[i]) == 0)
164 if(i == nelem(regname)) continue;
165 if(f[0][1] == 's' && f[0][2] == 0) v = 0;
168 sprint(tbuf, "%.2ux", (u8int)v);
169 ((u16int*)buf)[pos++] = *(u16int*)tbuf;
185 addr = strtoull(p, &q, 16);
186 if(p == q || *q != ',') return strdup("E99");
187 count = strtoull(q + 1, &p, 16);
188 if(q+1 == p || *p != 0) return strdup("E99");
189 if(count > 65536) count = 65536;
190 buf = emalloc(2*count+4);
191 rc = pread(memfd, buf, count, addr);
192 if(rc <= 0) return strcpy(buf, "E01");
193 for(i = rc; --i >= 0; ){
194 sprint(tbuf, "%.2ux", (uchar)buf[i]);
195 ((u16int*)buf)[i] = *(u16int*)tbuf;
205 bin = Bfdopen(0, OREAD);
206 if(bin == nil) sysfatal("Bfdopen: %r");
207 bout = Bfdopen(1, OWRITE);
208 if(bout == nil) sysfatal("Bfdpen: %r");
211 p = smprint("%s/mem", vmxroot);
212 memfd = open(p, OREAD);
214 if(memfd < 0) sysfatal("open: %r");
216 p = smprint("%s/regs", vmxroot);
217 regsfd = open(p, OREAD);
219 if(regsfd < 0) sysfatal("open: %r");
223 fprint(2, "<- %s\n", msg);
240 if(strncmp(msg, "qSupported", 10) == 0 && (msg[10] == ':' || msg[10] == 0)){
241 wpack("PacketSize=4096;QStartNoAckMode+");
246 if(strcmp(msg, "QStartNoAckMode") == 0){
255 default: no: wpack(""); break;