Commit 8e33c08c84b9f418dee69f79e7b579c59e77814b
1 parent
197ea35a
MIPS FPU support for the gdb stub, by Daniel Jacobowitz.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2242 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
48 additions
and
0 deletions
gdbstub.c
... | ... | @@ -532,11 +532,37 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
532 | 532 | *(uint32_t *)ptr = tswapl(env->PC); |
533 | 533 | ptr += 4; |
534 | 534 | |
535 | +#ifdef MIPS_USES_FPU | |
536 | + for (i = 0; i < 32; i++) | |
537 | + { | |
538 | + *(uint32_t *)ptr = tswapl(FPR_W (env, i)); | |
539 | + ptr += 4; | |
540 | + } | |
541 | + | |
542 | + *(uint32_t *)ptr = tswapl(env->fcr31); | |
543 | + ptr += 4; | |
544 | + | |
545 | + *(uint32_t *)ptr = tswapl(env->fcr0); | |
546 | + ptr += 4; | |
547 | +#endif | |
548 | + | |
535 | 549 | /* 32 FP registers, fsr, fir, fp. Not yet implemented. */ |
550 | + /* what's 'fp' mean here? */ | |
536 | 551 | |
537 | 552 | return ptr - mem_buf; |
538 | 553 | } |
539 | 554 | |
555 | +/* convert MIPS rounding mode in FCR31 to IEEE library */ | |
556 | +static unsigned int ieee_rm[] = | |
557 | + { | |
558 | + float_round_nearest_even, | |
559 | + float_round_to_zero, | |
560 | + float_round_up, | |
561 | + float_round_down | |
562 | + }; | |
563 | +#define RESTORE_ROUNDING_MODE \ | |
564 | + set_float_rounding_mode(ieee_rm[env->fcr31 & 3], &env->fp_status) | |
565 | + | |
540 | 566 | static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
541 | 567 | { |
542 | 568 | int i; |
... | ... | @@ -566,6 +592,28 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
566 | 592 | |
567 | 593 | env->PC = tswapl(*(uint32_t *)ptr); |
568 | 594 | ptr += 4; |
595 | + | |
596 | +#ifdef MIPS_USES_FPU | |
597 | + for (i = 0; i < 32; i++) | |
598 | + { | |
599 | + FPR_W (env, i) = tswapl(*(uint32_t *)ptr); | |
600 | + ptr += 4; | |
601 | + } | |
602 | + | |
603 | + env->fcr31 = tswapl(*(uint32_t *)ptr) & 0x0183FFFF; | |
604 | + ptr += 4; | |
605 | + | |
606 | + env->fcr0 = tswapl(*(uint32_t *)ptr); | |
607 | + ptr += 4; | |
608 | + | |
609 | + /* set rounding mode */ | |
610 | + RESTORE_ROUNDING_MODE; | |
611 | + | |
612 | +#ifndef CONFIG_SOFTFLOAT | |
613 | + /* no floating point exception for native float */ | |
614 | + SET_FP_ENABLE(env->fcr31, 0); | |
615 | +#endif | |
616 | +#endif | |
569 | 617 | } |
570 | 618 | #elif defined (TARGET_SH4) |
571 | 619 | static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) | ... | ... |