1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include "config.h"
21: #ifdef CONFIG_USER_ONLY
22: #include <stdlib.h>
23: #include <stdio.h>
24: #include <stdarg.h>
25: #include <string.h>
26: #include <errno.h>
27: #include <unistd.h>
28: #include <fcntl.h>
29:
30: #include "qemu.h"
31: #else
32: #include "qemu-common.h"
33: #include "qemu-char.h"
34: #include "sysemu.h"
35: #include "gdbstub.h"
36: #endif
37:
38: #include "qemu_socket.h"
39: #ifdef _WIN32
40:
41: #ifndef SIGTRAP
42: #define SIGTRAP 5
43: #endif
44: #ifndef SIGINT
45: #define SIGINT 2
46: #endif
47: #else
48: #include <signal.h>
49: #endif
50:
51:
52:
53: enum RSState {
54: RS_IDLE,
55: RS_GETLINE,
56: RS_CHKSUM1,
57: RS_CHKSUM2,
58: RS_SYSCALL,
59: };
60: typedef struct GDBState {
61: CPUState *env;
62: enum RSState state;
63: char line_buf[4096];
64: int line_buf_index;
65: int line_csum;
66: uint8_t last_packet[4100];
67: int last_packet_len;
68: #ifdef CONFIG_USER_ONLY
69: int fd;
70: int running_state;
71: #else
72: CharDriverState *chr;
73: #endif
74: } GDBState;
75:
76: #ifdef CONFIG_USER_ONLY
77:
78: static int gdbserver_fd = -1;
79:
80:
81: static GDBState gdbserver_state;
82:
83: static int get_char(GDBState *s)
84: {
85: uint8_t ch;
86: int ret;
87:
88: for(;;) {
89: ret = recv(s->fd, &ch, 1, 0);
90: if (ret < 0) {
91: if (errno != EINTR && errno != EAGAIN)
92: return -1;
93: } else if (ret == 0) {
94: return -1;
95: } else {
96: break;
97: }
98: }
99: return ch;
100: }
101: #endif
102:
103:
104: static GDBState *gdb_syscall_state;
105: static gdb_syscall_complete_cb gdb_current_syscall_cb;
106:
107: enum {
108: GDB_SYS_UNKNOWN,
109: GDB_SYS_ENABLED,
110: GDB_SYS_DISABLED,
111: } gdb_syscall_mode;
112:
113:
114:
115: int use_gdb_syscalls(void)
116: {
117: if (gdb_syscall_mode == GDB_SYS_UNKNOWN) {
118: gdb_syscall_mode = (gdb_syscall_state ? GDB_SYS_ENABLED
119: : GDB_SYS_DISABLED);
120: }
121: return gdb_syscall_mode == GDB_SYS_ENABLED;
122: }
123:
124: static void put_buffer(GDBState *s, const uint8_t *buf, int len)
125: {
126: #ifdef CONFIG_USER_ONLY
127: int ret;
128:
129: while (len > 0) {
130: ret = send(s->fd, buf, len, 0);
131: if (ret < 0) {
132: if (errno != EINTR && errno != EAGAIN)
133: return;
134: } else {
135: buf += ret;
136: len -= ret;
137: }
138: }
139: #else
140: qemu_chr_write(s->chr, buf, len);
141: #endif
142: }
143:
144: static inline int fromhex(int v)
145: {
146: if (v >= '0' && v <= '9')
147: return v - '0';
148: else if (v >= 'A' && v <= 'F')
149: return v - 'A' + 10;
150: else if (v >= 'a' && v <= 'f')
151: return v - 'a' + 10;
152: else
153: return 0;
154: }
155:
156: static inline int tohex(int v)
157: {
158: if (v < 10)
159: return v + '0';
160: else
161: return v - 10 + 'a';
162: }
163:
164: static void memtohex(char *buf, const uint8_t *mem, int len)
165: {
166: int i, c;
167: char *q;
168: q = buf;
169: for(i = 0; i < len; i++) {
170: c = mem[i];
171: *q++ = tohex(c >> 4);
172: *q++ = tohex(c & 0xf);
173: }
174: *q = '\0';
175: }
176:
177: static void hextomem(uint8_t *mem, const char *buf, int len)
178: {
179: int i;
180:
181: for(i = 0; i < len; i++) {
182: mem[i] = (fromhex(buf[0]) << 4) | fromhex(buf[1]);
183: buf += 2;
184: }
185: }
186:
187:
188: static int put_packet(GDBState *s, char *buf)
189: {
190: int len, csum, i;
191: uint8_t *p;
192:
193: #ifdef DEBUG_GDB
194: printf("reply='%s'\n", buf);
195: #endif
196:
197: for(;;) {
198: p = s->last_packet;
199: *(p++) = '$';
200: len = strlen(buf);
201: memcpy(p, buf, len);
202: p += len;
203: csum = 0;
204: for(i = 0; i < len; i++) {
205: csum += buf[i];
206: }
207: *(p++) = '#';
208: *(p++) = tohex((csum >> 4) & 0xf);
209: *(p++) = tohex((csum) & 0xf);
210:
211: s->last_packet_len = p - s->last_packet;
212: put_buffer(s, (uint8_t *)s->last_packet, s->last_packet_len);
213:
214: #ifdef CONFIG_USER_ONLY
215: i = get_char(s);
216: if (i < 0)
217: return -1;
218: if (i == '+')
219: break;
220: #else
221: break;
222: #endif
223: }
224: return 0;
225: }
226:
227: #if defined(TARGET_I386)
228:
229: static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
230: {
231: int i, fpus;
232: uint32_t *registers = (uint32_t *)mem_buf;
233:
234: #ifdef TARGET_X86_64
235:
236: uint64_t *registers64 = (uint64_t *)mem_buf;
237:
238: if (env->hflags & HF_CS64_MASK) {
239: registers64[0] = tswap64(env->regs[R_EAX]);
240: registers64[1] = tswap64(env->regs[R_EBX]);
241: registers64[2] = tswap64(env->regs[R_ECX]);
242: registers64[3] = tswap64(env->regs[R_EDX]);
243: registers64[4] = tswap64(env->regs[R_ESI]);
244: registers64[5] = tswap64(env->regs[R_EDI]);
245: registers64[6] = tswap64(env->regs[R_EBP]);
246: registers64[7] = tswap64(env->regs[R_ESP]);
247: for(i = 8; i < 16; i++) {
248: registers64[i] = tswap64(env->regs[i]);
249: }
250: registers64[16] = tswap64(env->eip);
251:
252: registers = (uint32_t *)®isters64[17];
253: registers[0] = tswap32(env->eflags);
254: registers[1] = tswap32(env->segs[R_CS].selector);
255: registers[2] = tswap32(env->segs[R_SS].selector);
256: registers[3] = tswap32(env->segs[R_DS].selector);
257: registers[4] = tswap32(env->segs[R_ES].selector);
258: registers[5] = tswap32(env->segs[R_FS].selector);
259: registers[6] = tswap32(env->segs[R_GS].selector);
260:
261: for(i = 0; i < 8; i++) {
262: memcpy(mem_buf + 16 * 8 + 7 * 4 + i * 10, &env->fpregs[i], 10);
263: }
264: registers[27] = tswap32(env->fpuc);
265: fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
266: registers[28] = tswap32(fpus);
267: registers[29] = 0;
268: registers[30] = 0;
269: registers[31] = 0;
270: registers[32] = 0;
271: registers[33] = 0;
272: registers[34] = 0;
273: for(i = 0; i < 16; i++) {
274: memcpy(mem_buf + 16 * 8 + 35 * 4 + i * 16, &env->xmm_regs[i], 16);
275: }
276: registers[99] = tswap32(env->mxcsr);
277:
278: return 8 * 17 + 4 * 7 + 10 * 8 + 4 * 8 + 16 * 16 + 4;
279: }
280: #endif
281:
282: for(i = 0; i < 8; i++) {
283: registers[i] = env->regs[i];
284: }
285: registers[8] = env->eip;
286: registers[9] = env->eflags;
287: registers[10] = env->segs[R_CS].selector;
288: registers[11] = env->segs[R_SS].selector;
289: registers[12] = env->segs[R_DS].selector;
290: registers[13] = env->segs[R_ES].selector;
291: registers[14] = env->segs[R_FS].selector;
292: registers[15] = env->segs[R_GS].selector;
293:
294: for(i = 0; i < 8; i++) {
295: memcpy(mem_buf + 16 * 4 + i * 10, &env->fpregs[i], 10);
296: }
297: registers[36] = env->fpuc;
298: fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
299: registers[37] = fpus;
300: registers[38] = 0;
301: registers[39] = 0;
302: registers[40] = 0;
303: registers[41] = 0;
304: registers[42] = 0;
305: registers[43] = 0;
306:
307: for(i = 0; i < 16; i++)
308: tswapls(®isters[i]);
309: for(i = 36; i < 44; i++)
310: tswapls(®isters[i]);
311: return 44 * 4;
312: }
313:
314: static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
315: {
316: uint32_t *registers = (uint32_t *)mem_buf;
317: int i;
318:
319: for(i = 0; i < 8; i++) {
320: env->regs[i] = tswapl(registers[i]);
321: }
322: env->eip = tswapl(registers[8]);
323: env->eflags = tswapl(registers[9]);
324: #if defined(CONFIG_USER_ONLY)
325: #define LOAD_SEG(index, sreg)\
326: if (tswapl(registers[index]) != env->segs[sreg].selector)\
327: cpu_x86_load_seg(env, sreg, tswapl(registers[index]));
328: LOAD_SEG(10, R_CS);
329: LOAD_SEG(11, R_SS);
330: LOAD_SEG(12, R_DS);
331: LOAD_SEG(13, R_ES);
332: LOAD_SEG(14, R_FS);
333: LOAD_SEG(15, R_GS);
334: #endif
335: }
336:
337: #elif defined (TARGET_PPC)
338: static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
339: {
340: uint32_t *registers = (uint32_t *)mem_buf, tmp;
341: int i;
342:
343:
344: for(i = 0; i < 32; i++) {
345: registers[i] = tswapl(env->gpr[i]);
346: }
347:
348: for (i = 0; i < 32; i++) {
349: registers[(i * 2) + 32] = tswapl(*((uint32_t *)&env->fpr[i]));
350: registers[(i * 2) + 33] = tswapl(*((uint32_t *)&env->fpr[i] + 1));
351: }
352:
353: registers[96] = tswapl(env->nip);
354: registers[97] = tswapl(env->msr);
355: tmp = 0;
356: for (i = 0; i < 8; i++)
357: tmp |= env->crf[i] << (32 - ((i + 1) * 4));
358: registers[98] = tswapl(tmp);
359: registers[99] = tswapl(env->lr);
360: registers[100] = tswapl(env->ctr);
361: registers[101] = tswapl(ppc_load_xer(env));
362: registers[102] = 0;
363:
364: return 103 * 4;
365: }
366:
367: static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
368: {
369: uint32_t *registers = (uint32_t *)mem_buf;
370: int i;
371:
372:
373: for (i = 0; i < 32; i++) {
374: env->gpr[i] = tswapl(registers[i]);
375: }
376:
377: for (i = 0; i < 32; i++) {
378: *((uint32_t *)&env->fpr[i]) = tswapl(registers[(i * 2) + 32]);
379: *((uint32_t *)&env->fpr[i] + 1) = tswapl(registers[(i * 2) + 33]);
380: }
381:
382: env->nip = tswapl(registers[96]);
383: ppc_store_msr(env, tswapl(registers[97]));
384: registers[98] = tswapl(registers[98]);
385: for (i = 0; i < 8; i++)
386: env->crf[i] = (registers[98] >> (32 - ((i + 1) * 4))) & 0xF;
387: env->lr = tswapl(registers[99]);
388: env->ctr = tswapl(registers[100]);
389: ppc_store_xer(env, tswapl(registers[101]));
390: }
391: #elif defined (TARGET_SPARC)
392: static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
393: {
394: target_ulong *registers = (target_ulong *)mem_buf;
395: int i;
396:
397:
398: for(i = 0; i < 8; i++) {
399: registers[i] = tswapl(env->gregs[i]);
400: }
401:
402: for(i = 0; i < 24; i++) {
403: registers[i + 8] = tswapl(env->regwptr[i]);
404: }
405: #ifndef TARGET_SPARC64
406:
407: for (i = 0; i < 32; i++) {
408: registers[i + 32] = tswapl(*((uint32_t *)&env->fpr[i]));
409: }
410:
411: registers[64] = tswapl(env->y);
412: {
413: target_ulong tmp;
414:
415: tmp = GET_PSR(env);
416: registers[65] = tswapl(tmp);
417: }
418: registers[66] = tswapl(env->wim);
419: registers[67] = tswapl(env->tbr);
420: registers[68] = tswapl(env->pc);
421: registers[69] = tswapl(env->npc);
422: registers[70] = tswapl(env->fsr);
423: registers[71] = 0;
424: registers[72] = 0;
425: return 73 * sizeof(target_ulong);
426: #else
427:
428: for (i = 0; i < 64; i += 2) {
429: uint64_t tmp;
430:
431: tmp = ((uint64_t)*(uint32_t *)&env->fpr[i]) << 32;
432: tmp |= *(uint32_t *)&env->fpr[i + 1];
433: registers[i / 2 + 32] = tswap64(tmp);
434: }
435: registers[64] = tswapl(env->pc);
436: registers[65] = tswapl(env->npc);
437: registers[66] = tswapl(((uint64_t)GET_CCR(env) << 32) |
438: ((env->asi & 0xff) << 24) |
439: ((env->pstate & 0xfff) << 8) |
440: GET_CWP64(env));
441: registers[67] = tswapl(env->fsr);
442: registers[68] = tswapl(env->fprs);
443: registers[69] = tswapl(env->y);
444: return 70 * sizeof(target_ulong);
445: #endif
446: }
447:
448: static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
449: {
450: target_ulong *registers = (target_ulong *)mem_buf;
451: int i;
452:
453:
454: for(i = 0; i < 7; i++) {
455: env->gregs[i] = tswapl(registers[i]);
456: }
457:
458: for(i = 0; i < 24; i++) {
459: env->regwptr[i] = tswapl(registers[i + 8]);
460: }
461: #ifndef TARGET_SPARC64
462:
463: for (i = 0; i < 32; i++) {
464: *((uint32_t *)&env->fpr[i]) = tswapl(registers[i + 32]);
465: }
466:
467: env->y = tswapl(registers[64]);
468: PUT_PSR(env, tswapl(registers[65]));
469: env->wim = tswapl(registers[66]);
470: env->tbr = tswapl(registers[67]);
471: env->pc = tswapl(registers[68]);
472: env->npc = tswapl(registers[69]);
473: env->fsr = tswapl(registers[70]);
474: #else
475: for (i = 0; i < 64; i += 2) {
476: uint64_t tmp;
477:
478: tmp = tswap64(registers[i / 2 + 32]);
479: *((uint32_t *)&env->fpr[i]) = tmp >> 32;
480: *((uint32_t *)&env->fpr[i + 1]) = tmp & 0xffffffff;
481: }
482: env->pc = tswapl(registers[64]);
483: env->npc = tswapl(registers[65]);
484: {
485: uint64_t tmp = tswapl(registers[66]);
486:
487: PUT_CCR(env, tmp >> 32);
488: env->asi = (tmp >> 24) & 0xff;
489: env->pstate = (tmp >> 8) & 0xfff;
490: PUT_CWP64(env, tmp & 0xff);
491: }
492: env->fsr = tswapl(registers[67]);
493: env->fprs = tswapl(registers[68]);
494: env->y = tswapl(registers[69]);
495: #endif
496: }
497: #elif defined (TARGET_ARM)
498: static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
499: {
500: int i;
501: uint8_t *ptr;
502:
503: ptr = mem_buf;
504:
505: for (i = 0; i < 16; i++)
506: {
507: *(uint32_t *)ptr = tswapl(env->regs[i]);
508: ptr += 4;
509: }
510:
511:
512: memset (ptr, 0, 8 * 12 + 4);
513: ptr += 8 * 12 + 4;
514:
515: *(uint32_t *)ptr = tswapl (cpsr_read(env));
516: ptr += 4;
517:
518: return ptr - mem_buf;
519: }
520:
521: static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
522: {
523: int i;
524: uint8_t *ptr;
525:
526: ptr = mem_buf;
527:
528: for (i = 0; i < 16; i++)
529: {
530: env->regs[i] = tswapl(*(uint32_t *)ptr);
531: ptr += 4;
532: }
533:
534: ptr += 8 * 12 + 4;
535: cpsr_write (env, tswapl(*(uint32_t *)ptr),