Skip to content

Commit bc46203

Browse files
author
Stanislav Shwartsman
committed
continue implementation
1 parent edab831 commit bc46203

File tree

4 files changed

+32
-29
lines changed

4 files changed

+32
-29
lines changed

bochs/cpu/fred.cc

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@
2828

2929
#if BX_SUPPORT_X86_64 && BX_SUPPORT_FRED
3030

31-
// FIXME: long_mode64 requirement must be handled through opcode tables attributes
32-
3331
void BX_CPU_C::FRED_EventDelivery(Bit8u vector, unsigned type, Bit16u error_code)
3432
{
3533
#if BX_SUPPORT_VMX || BX_SUPPORT_SVM
@@ -121,7 +119,7 @@ void BX_CPU_C::FRED_EventDelivery(Bit8u vector, unsigned type, Bit16u error_code
121119
}
122120
#endif
123121

124-
// ESTABLISH NEW CONTEXT OLD STATE WILL BE RESTORED IF THERE IS A SUBSEQUENT EXCEPTION -> FIXME: HOW ???
122+
// ESTABLISH NEW CONTEXT: OLD STATE WILL BE RESTORED IF THERE IS A SUBSEQUENT EXCEPTION -> FIXME: HOW ???
125123

126124
// update segment registers if event occurred in ring 3
127125
if (CPL == 3) {
@@ -170,22 +168,24 @@ void BX_CPU_C::FRED_EventDelivery(Bit8u vector, unsigned type, Bit16u error_code
170168
write_new_stack_qword(new_RSP - 64, 0, error_code);
171169

172170
#if BX_SUPPORT_CET
173-
if (ShadowStackEnabled(0)) {
174-
if (old_CPL == 0) {
175-
shadow_stack_write_dword(new_SSP - 4, CPL, 0); // store 4 bytes of zeros to SSP-4
176-
new_SSP &= ~BX_CONST64(0x7);
177-
shadow_stack_write_qword(new_SSP - 8, CPL, old_CS);
178-
shadow_stack_write_qword(new_SSP - 16, CPL, old_RIP);
179-
shadow_stack_write_qword(new_SSP - 24, CPL, old_SSP);
180-
new_SSP -= 24;
171+
if (BX_CPU_THIS_PTR cr4.get_CET()) {
172+
if (ShadowStackEnabled(0)) {
173+
if (old_CPL == 0) {
174+
shadow_stack_write_dword(new_SSP - 4, CPL, 0); // store 4 bytes of zeros to SSP-4
175+
new_SSP &= ~BX_CONST64(0x7);
176+
shadow_stack_write_qword(new_SSP - 8, CPL, old_CS);
177+
shadow_stack_write_qword(new_SSP - 16, CPL, old_RIP);
178+
shadow_stack_write_qword(new_SSP - 24, CPL, old_SSP);
179+
new_SSP -= 24;
180+
}
181+
SSP = new_SSP;
182+
}
183+
184+
if (ShadowStackEnabled(3) && old_CPL == 3) {
185+
BX_CPU_THIS_PTR msr.ia32_pl_ssp[3] = CanonicalizeAddress(BX_CPU_THIS_PTR msr.ia32_pl_ssp[3]);
181186
}
182-
SSP = new_SSP;
183-
}
184187

185-
if (ShadowStackEnabled(3) && old_CPL == 3) {
186-
BX_CPU_THIS_PTR msr.ia32_pl_ssp[3] = CanonicalizeAddress(BX_CPU_THIS_PTR msr.ia32_pl_ssp[3]);
187-
//if IA32_S_CET.ENDBR_EN = 1
188-
// THEN IA32_S_CET[11:10] = 0; // IDLE with SUPPRESS = 0 FIXME
188+
reset_endbranch_tracker(0);
189189
}
190190
#endif
191191

bochs/cpu/init.cc

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,13 +1096,15 @@ void BX_CPU_C::reset(unsigned source)
10961096
#endif
10971097

10981098
#if BX_SUPPORT_FRED
1099-
BX_CPU_THIS_PTR msr.ia32_fred_cfg = 0;
1100-
BX_CPU_THIS_PTR msr.ia32_fred_stack_levels = 0;
1101-
for (n=0;n<4;n++) {
1099+
if (source == BX_RESET_HARDWARE) {
1100+
BX_CPU_THIS_PTR msr.ia32_fred_cfg = 0;
1101+
BX_CPU_THIS_PTR msr.ia32_fred_stack_levels = 0;
1102+
for (n=0;n<4;n++) {
11021103
#if BX_SUPPORT_CET
1103-
BX_CPU_THIS_PTR msr.ia32_fred_ssp[n] = 0;
1104+
BX_CPU_THIS_PTR msr.ia32_fred_ssp[n] = 0;
11041105
#endif
1105-
BX_CPU_THIS_PTR msr.ia32_fred_rsp[n] = 0;
1106+
BX_CPU_THIS_PTR msr.ia32_fred_rsp[n] = 0;
1107+
}
11061108
}
11071109
#endif
11081110
#endif // BX_CPU_LEVEL >= 6

bochs/cpu/vmx.cc

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,13 +1021,13 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
10211021

10221022
#if BX_SUPPORT_FRED
10231023
if (is_cpu_extension_supported(BX_ISA_FRED)) {
1024-
if (vm->vmentry_interr_info & 0x7fffe000) {
1024+
if (vm->vmentry_interr_info & 0x7fffd000) { // unmask bit [13]
10251025
BX_ERROR(("VMFAIL: VMENTRY broken interruption info field"));
10261026
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
10271027
}
10281028

10291029
// with FRED, allow bit [13] to be set indicating injection of nested hardware exception
1030-
if ((vm->vmentry_interr_info & 0x00001000) != 0 && event_type != BX_HARDWARE_EXCEPTION) {
1030+
if ((vm->vmentry_interr_info & 0x00002000) != 0 && event_type != BX_HARDWARE_EXCEPTION) {
10311031
BX_ERROR(("VMFAIL: VMENTRY injecting nested exception for event type != 3"));
10321032
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
10331033
}
@@ -1070,9 +1070,10 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
10701070
}
10711071
break;
10721072

1073-
case BX_EVENT_OTHER: /* MTF or FRED */
1073+
case BX_EVENT_OTHER: { /* MTF or FRED */
10741074
#if BX_SUPPORT_FRED
1075-
if (is_cpu_extension_supported(BX_ISA_FRED)) {
1075+
unsigned fred_guest = VMread_natural(VMCS_GUEST_CR4) & BX_CR4_FRED_MASK;
1076+
if (fred_guest) {
10761077
if (vector > 1) {
10771078
BX_ERROR(("VMFAIL: VMENTRY FRED SYSCALL/SYSENTER event injection with vector=%d", vector));
10781079
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
@@ -1096,7 +1097,7 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
10961097
}
10971098
}
10981099
// fall through
1099-
1100+
}
11001101
default:
11011102
BX_ERROR(("VMFAIL: VMENTRY bad injected event type %d", event_type));
11021103
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
@@ -3084,7 +3085,7 @@ void BX_CPU_C::VMexit(Bit32u reason, Bit64u qualification)
30843085
VMwrite32(VMCS_32BIT_IDT_VECTORING_INFO, vm->idt_vector_info | 0x80000000);
30853086
VMwrite32(VMCS_32BIT_IDT_VECTORING_ERR_CODE, vm->idt_vector_error_code);
30863087
#if BX_SUPPORT_FRED
3087-
if (is_cpu_extension_supported(BX_ISA_FRED)) {
3088+
if (BX_CPU_THIS_PTR cr4.get_FRED()) {
30883089
VMwrite64(VMCS_64BIT_ORIGINAL_EVENT_DATA, BX_CPU_THIS_PTR fred_event_data);
30893090
}
30903091
#endif

bochs/cpu/vmx.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ enum {
570570
((VMCS_FIELD_WIDTH(encoding) << 2) + VMCS_FIELD_TYPE(encoding))
571571

572572
#define VMX_HIGHEST_16BIT_VMCS_ENCODING (0x20)
573-
#define VMX_HIGHEST_64BIT_VMCS_ENCODING (0x50)
573+
#define VMX_HIGHEST_64BIT_VMCS_ENCODING (0x54)
574574
#define VMX_HIGHEST_32BIT_VMCS_ENCODING (0x30)
575575
#define VMX_HIGHEST_NATURAL_WIDTH_VMCS_ENCODING (0x30)
576576

0 commit comments

Comments
 (0)