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); |