target/i386: Added MXCSR register, fixed writing to FPUCW. (#1059)

* Added MXCSR register for reading and writing
* Changed writing for fpucw register, now the qemu rounding status is updated as well

Backports commit 256e7782ceafb1f8915da167040d5368c38f9585 from unicorn
This commit is contained in:
dmarxn 2019-02-28 16:27:35 -05:00 committed by Lioncash
parent 2b5d424ded
commit cdcd026413
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7
2 changed files with 14 additions and 2 deletions

View file

@ -88,7 +88,7 @@ typedef enum uc_x86_reg {
UC_X86_REG_IDTR, UC_X86_REG_GDTR, UC_X86_REG_LDTR, UC_X86_REG_TR, UC_X86_REG_FPCW, UC_X86_REG_IDTR, UC_X86_REG_GDTR, UC_X86_REG_LDTR, UC_X86_REG_TR, UC_X86_REG_FPCW,
UC_X86_REG_FPTAG, UC_X86_REG_FPTAG,
UC_X86_REG_MSR, // Model-Specific Register UC_X86_REG_MSR, // Model-Specific Register
UC_X86_REG_MXCSR,
UC_X86_REG_ENDING // <-- mark the end of the list of registers UC_X86_REG_ENDING // <-- mark the end of the list of registers
} uc_x86_reg; } uc_x86_reg;

View file

@ -240,7 +240,7 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
} }
continue; continue;
case UC_X86_REG_FPCW: case UC_X86_REG_FPCW:
*(uint16_t*) value = state->fpuc; cpu_set_fpuc(&X86_CPU(uc, mycpu)->env, *(uint16_t *)value);
continue; continue;
case UC_X86_REG_FPTAG: case UC_X86_REG_FPTAG:
{ {
@ -472,6 +472,9 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
case UC_X86_REG_MSR: case UC_X86_REG_MSR:
x86_msr_read(uc, (uc_x86_msr *)value); x86_msr_read(uc, (uc_x86_msr *)value);
break; break;
case UC_X86_REG_MXCSR:
*(uint32_t *)value = X86_CPU(uc, mycpu)->env.mxcsr;
break;
} }
break; break;
@ -754,6 +757,9 @@ int x86_reg_read(struct uc_struct *uc, unsigned int *regs, void **vals, int coun
case UC_X86_REG_MSR: case UC_X86_REG_MSR:
x86_msr_read(uc, (uc_x86_msr *)value); x86_msr_read(uc, (uc_x86_msr *)value);
break; break;
case UC_X86_REG_MXCSR:
*(uint32_t *)value = X86_CPU(uc, mycpu)->env.mxcsr;
break;
} }
break; break;
#endif #endif
@ -1019,6 +1025,9 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
case UC_X86_REG_MSR: case UC_X86_REG_MSR:
x86_msr_write(uc, (uc_x86_msr *)value); x86_msr_write(uc, (uc_x86_msr *)value);
break; break;
case UC_X86_REG_MXCSR:
cpu_set_mxcsr(&X86_CPU(uc, mycpu)->env, *(uint32_t *)value);
break;
} }
break; break;
@ -1311,6 +1320,9 @@ int x86_reg_write(struct uc_struct *uc, unsigned int *regs, void *const *vals, i
case UC_X86_REG_MSR: case UC_X86_REG_MSR:
x86_msr_write(uc, (uc_x86_msr *)value); x86_msr_write(uc, (uc_x86_msr *)value);
break; break;
case UC_X86_REG_MXCSR:
cpu_set_mxcsr(&X86_CPU(uc, mycpu)->env, *(uint32_t *)value);
break;
} }
break; break;
#endif #endif