Commit 6f970bd90ec4ee73cf7a27616d44f1a1e0056532
1 parent
89984cd2
MIPS support and memory access error reporting (Daniel Jacobowitz)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1685 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
72 additions
and
4 deletions
gdbstub.c
@@ -421,6 +421,72 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) | @@ -421,6 +421,72 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) | ||
421 | ptr += 8 * 12 + 4; | 421 | ptr += 8 * 12 + 4; |
422 | cpsr_write (env, tswapl(*(uint32_t *)ptr), 0xffffffff); | 422 | cpsr_write (env, tswapl(*(uint32_t *)ptr), 0xffffffff); |
423 | } | 423 | } |
424 | +#elif defined (TARGET_MIPS) | ||
425 | +static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) | ||
426 | +{ | ||
427 | + int i; | ||
428 | + uint8_t *ptr; | ||
429 | + | ||
430 | + ptr = mem_buf; | ||
431 | + for (i = 0; i < 32; i++) | ||
432 | + { | ||
433 | + *(uint32_t *)ptr = tswapl(env->gpr[i]); | ||
434 | + ptr += 4; | ||
435 | + } | ||
436 | + | ||
437 | + *(uint32_t *)ptr = tswapl(env->CP0_Status); | ||
438 | + ptr += 4; | ||
439 | + | ||
440 | + *(uint32_t *)ptr = tswapl(env->LO); | ||
441 | + ptr += 4; | ||
442 | + | ||
443 | + *(uint32_t *)ptr = tswapl(env->HI); | ||
444 | + ptr += 4; | ||
445 | + | ||
446 | + *(uint32_t *)ptr = tswapl(env->CP0_BadVAddr); | ||
447 | + ptr += 4; | ||
448 | + | ||
449 | + *(uint32_t *)ptr = tswapl(env->CP0_Cause); | ||
450 | + ptr += 4; | ||
451 | + | ||
452 | + *(uint32_t *)ptr = tswapl(env->PC); | ||
453 | + ptr += 4; | ||
454 | + | ||
455 | + /* 32 FP registers, fsr, fir, fp. Not yet implemented. */ | ||
456 | + | ||
457 | + return ptr - mem_buf; | ||
458 | +} | ||
459 | + | ||
460 | +static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) | ||
461 | +{ | ||
462 | + int i; | ||
463 | + uint8_t *ptr; | ||
464 | + | ||
465 | + ptr = mem_buf; | ||
466 | + for (i = 0; i < 32; i++) | ||
467 | + { | ||
468 | + env->gpr[i] = tswapl(*(uint32_t *)ptr); | ||
469 | + ptr += 4; | ||
470 | + } | ||
471 | + | ||
472 | + env->CP0_Status = tswapl(*(uint32_t *)ptr); | ||
473 | + ptr += 4; | ||
474 | + | ||
475 | + env->LO = tswapl(*(uint32_t *)ptr); | ||
476 | + ptr += 4; | ||
477 | + | ||
478 | + env->HI = tswapl(*(uint32_t *)ptr); | ||
479 | + ptr += 4; | ||
480 | + | ||
481 | + env->CP0_BadVAddr = tswapl(*(uint32_t *)ptr); | ||
482 | + ptr += 4; | ||
483 | + | ||
484 | + env->CP0_Cause = tswapl(*(uint32_t *)ptr); | ||
485 | + ptr += 4; | ||
486 | + | ||
487 | + env->PC = tswapl(*(uint32_t *)ptr); | ||
488 | + ptr += 4; | ||
489 | +} | ||
424 | #else | 490 | #else |
425 | static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) | 491 | static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
426 | { | 492 | { |
@@ -511,10 +577,12 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | @@ -511,10 +577,12 @@ static int gdb_handle_packet(GDBState *s, CPUState *env, const char *line_buf) | ||
511 | if (*p == ',') | 577 | if (*p == ',') |
512 | p++; | 578 | p++; |
513 | len = strtoul(p, NULL, 16); | 579 | len = strtoul(p, NULL, 16); |
514 | - if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) | ||
515 | - memset(mem_buf, 0, len); | ||
516 | - memtohex(buf, mem_buf, len); | ||
517 | - put_packet(s, buf); | 580 | + if (cpu_memory_rw_debug(env, addr, mem_buf, len, 0) != 0) { |
581 | + put_packet (s, "E14"); | ||
582 | + } else { | ||
583 | + memtohex(buf, mem_buf, len); | ||
584 | + put_packet(s, buf); | ||
585 | + } | ||
518 | break; | 586 | break; |
519 | case 'M': | 587 | case 'M': |
520 | addr = strtoul(p, (char **)&p, 16); | 588 | addr = strtoul(p, (char **)&p, 16); |