]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
x86: Add AMD-V hypercall handler
authorValentine Sinitsyn <valentine.sinitsyn@gmail.com>
Sun, 28 Sep 2014 08:44:47 +0000 (14:44 +0600)
committerJan Kiszka <jan.kiszka@siemens.com>
Sat, 1 Nov 2014 19:10:09 +0000 (20:10 +0100)
Provide a way for guests to call into Jailhouse on AMD-V systems. Real work
is delegated to generic vcpu_handle_hypercall() handler.

Signed-off-by: Valentine Sinitsyn <valentine.sinitsyn@gmail.com>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/x86/svm.c

index 5f7e59e11cd05305e8c87d0f0e6dc988b202e983..a952d84f0ed9c2a56e38670f0d1248c54b4bd248 100644 (file)
@@ -463,6 +463,7 @@ static void dump_guest_regs(struct registers *guest_regs, struct vmcb *vmcb)
 void vcpu_handle_exit(struct registers *guest_regs, struct per_cpu *cpu_data)
 {
        struct vmcb *vmcb = &cpu_data->vmcb;
+       struct vcpu_execution_state x_state;
 
        /* Restore GS value expected by per_cpu data accessors */
        write_msr(MSR_GS_BASE, (unsigned long)cpu_data);
@@ -477,6 +478,10 @@ void vcpu_handle_exit(struct registers *guest_regs, struct per_cpu *cpu_data)
        case VMEXIT_CPUID:
                /* FIXME: We are not intercepting CPUID now */
                return;
+       case VMEXIT_VMMCALL:
+               vcpu_vendor_get_execution_state(&x_state);
+               vcpu_handle_hypercall(guest_regs, &x_state);
+               return;
        default:
                panic_printk("FATAL: Unexpected #VMEXIT, exitcode %x, "
                             "exitinfo1 %p exitinfo2 %p\n",
@@ -538,5 +543,10 @@ void vcpu_vendor_get_cell_io_bitmap(struct cell *cell,
 
 void vcpu_vendor_get_execution_state(struct vcpu_execution_state *x_state)
 {
-       /* TODO: Implement */
+       struct per_cpu *cpu_data = this_cpu_data();
+
+       x_state->efer = cpu_data->vmcb.efer;
+       x_state->rflags = cpu_data->vmcb.rflags;
+       x_state->cs = cpu_data->vmcb.cs.selector;
+       x_state->rip = cpu_data->vmcb.rip;
 }