bool vcpu_handle_pt_violation(struct registers *guest_regs,
struct vcpu_pf_intercept *pf);
+bool vcpu_handle_msr_read(struct registers *guest_regs);
+bool vcpu_handle_msr_write(struct registers *guest_regs);
+
#endif
struct per_cpu *cpu_data)
{
switch (guest_regs->rcx) {
- case MSR_X2APIC_BASE ... MSR_X2APIC_END:
- x2apic_handle_read(guest_regs);
- break;
case MSR_IA32_PAT:
guest_regs->rax = cpu_data->vmcb.g_pat & 0xffffffff;
guest_regs->rdx = cpu_data->vmcb.g_pat >> 32;
break;
default:
- panic_printk("FATAL: Unhandled MSR read: %x\n",
- guest_regs->rcx);
- return false;
+ return vcpu_handle_msr_read(guest_regs);
}
vcpu_skip_emulated_instruction(X86_INST_LEN_RDMSR);
unsigned long efer, val;
switch (guest_regs->rcx) {
- case MSR_X2APIC_BASE ... MSR_X2APIC_END:
- if (!x2apic_handle_write(guest_regs, cpu_data))
- return false;
- break;
case MSR_IA32_PAT:
vmcb->g_pat = (guest_regs->rax & 0xffffffff) |
(guest_regs->rdx << 32);
write_msr(MSR_IA32_PAT, 0);
break;
default:
- panic_printk("FATAL: Unhandled MSR write: %x\n",
- guest_regs->rcx);
- return false;
+ return vcpu_handle_msr_write(guest_regs);
}
vcpu_skip_emulated_instruction(X86_INST_LEN_WRMSR);
pf->is_write ? "write" : "read", pf->phys_addr);
return false;
}
+
+bool vcpu_handle_msr_read(struct registers *guest_regs)
+{
+ switch (guest_regs->rcx) {
+ case MSR_X2APIC_BASE ... MSR_X2APIC_END:
+ x2apic_handle_read(guest_regs);
+ break;
+ default:
+ panic_printk("FATAL: Unhandled MSR read: %x\n",
+ guest_regs->rcx);
+ return false;
+ }
+
+ vcpu_skip_emulated_instruction(X86_INST_LEN_WRMSR);
+ return true;
+}
+
+bool vcpu_handle_msr_write(struct registers *guest_regs)
+{
+ switch (guest_regs->rcx) {
+ case MSR_X2APIC_BASE ... MSR_X2APIC_END:
+ if (!x2apic_handle_write(guest_regs, this_cpu_data()))
+ return false;
+ break;
+ default:
+ panic_printk("FATAL: Unhandled MSR write: %x\n",
+ guest_regs->rcx);
+ return false;
+ }
+
+ vcpu_skip_emulated_instruction(X86_INST_LEN_WRMSR);
+ return true;
+}
break;
case EXIT_REASON_MSR_READ:
cpu_data->stats[JAILHOUSE_CPU_STAT_VMEXITS_MSR]++;
- if (guest_regs->rcx >= MSR_X2APIC_BASE &&
- guest_regs->rcx <= MSR_X2APIC_END) {
- vcpu_skip_emulated_instruction(X86_INST_LEN_RDMSR);
- x2apic_handle_read(guest_regs);
+ if (vcpu_handle_msr_read(guest_regs))
return;
- }
- panic_printk("FATAL: Unhandled MSR read: %08x\n",
- guest_regs->rcx);
break;
case EXIT_REASON_MSR_WRITE:
cpu_data->stats[JAILHOUSE_CPU_STAT_VMEXITS_MSR]++;
- if (guest_regs->rcx >= MSR_X2APIC_BASE &&
- guest_regs->rcx <= MSR_X2APIC_END) {
- if (!x2apic_handle_write(guest_regs, cpu_data))
- break;
- vcpu_skip_emulated_instruction(X86_INST_LEN_WRMSR);
- return;
- } else if (guest_regs->rcx == MSR_IA32_PERF_GLOBAL_CTRL) {
+ if (guest_regs->rcx == MSR_IA32_PERF_GLOBAL_CTRL) {
/* ignore writes */
vcpu_skip_emulated_instruction(X86_INST_LEN_WRMSR);
return;
- }
- panic_printk("FATAL: Unhandled MSR write: %08x\n",
- guest_regs->rcx);
+ } else if (vcpu_handle_msr_write(guest_regs))
+ return;
break;
case EXIT_REASON_APIC_ACCESS:
cpu_data->stats[JAILHOUSE_CPU_STAT_VMEXITS_XAPIC]++;