Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


added ability to partially hook MSRs
Jack Lange [Fri, 28 Oct 2011 01:43:12 +0000 (21:43 -0400)]
palacios/include/palacios/vmm_msr.h
palacios/src/palacios/svm.c
palacios/src/palacios/vmm_msr.c

index 87a8a7e..f8cbd4e 100644 (file)
@@ -93,6 +93,9 @@ int v3_hook_msr(struct v3_vm_info * vm, uint32_t msr,
                void * priv_data);
 
 
+int v3_msr_unhandled_read(struct guest_info * core, uint32_t msr, struct v3_msr * dst, void * priv_data);
+int v3_msr_unhandled_write(struct guest_info * core, uint32_t msr, struct v3_msr src, void * priv_data);
+
 struct v3_msr_hook * v3_get_msr_hook(struct v3_vm_info * vm, uint32_t msr);
 
 void v3_refresh_msr_map(struct v3_vm_info * vm);
@@ -100,7 +103,6 @@ void v3_refresh_msr_map(struct v3_vm_info * vm);
 void v3_print_msr_map(struct v3_vm_info * vm);
 
 int v3_handle_msr_write(struct guest_info * info);
-
 int v3_handle_msr_read(struct guest_info * info);
 
 
index f61fadf..cbb680b 100644 (file)
@@ -314,6 +314,8 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info * core) {
 
 
     {
+#define INT_PENDING_AMD_MSR            0xc0010055
+
        v3_hook_msr(core->vm_info, IA32_STAR_MSR, NULL, NULL, NULL);
        v3_hook_msr(core->vm_info, IA32_LSTAR_MSR, NULL, NULL, NULL);
        v3_hook_msr(core->vm_info, IA32_FMASK_MSR, NULL, NULL, NULL);
@@ -323,6 +325,9 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info * core) {
        v3_hook_msr(core->vm_info, SYSENTER_CS_MSR, NULL, NULL, NULL);
        v3_hook_msr(core->vm_info, SYSENTER_ESP_MSR, NULL, NULL, NULL);
        v3_hook_msr(core->vm_info, SYSENTER_EIP_MSR, NULL, NULL, NULL);
+
+       // Passthrough read operations are ok.
+       v3_hook_msr(core->vm_info, INT_PENDING_AMD_MSR, NULL, v3_msr_unhandled_write, NULL);
     }
 }
 
index 290398e..bb1b062 100644 (file)
@@ -59,7 +59,7 @@ int v3_handle_msr_write(struct guest_info * info) {
     hook = v3_get_msr_hook(info->vm_info, msr_num);
 
     if (hook == NULL) {
-        PrintError("Write to unhooked MSR 0x%x\n", msr_num);
+       v3_msr_unhandled_write(info, msr_num, msr_val, NULL);
     } else {
        msr_val.lo = info->vm_regs.rax;
        msr_val.hi = info->vm_regs.rdx;
@@ -86,7 +86,7 @@ int v3_handle_msr_read(struct guest_info * info) {
     hook = v3_get_msr_hook(info->vm_info, msr_num);
     
     if (hook == NULL) {
-        PrintError("Read from unhooked MSR 0x%x\n", msr_num);  
+       v3_msr_unhandled_read(info, msr_num, &msr_val, NULL);
     } else {
        if (hook->read(info, msr_num, &msr_val, hook->priv_data) == -1) {
            PrintError("Error in MSR hook Read\n");
@@ -101,6 +101,19 @@ int v3_handle_msr_read(struct guest_info * info) {
     return 0;
 }
 
+
+
+int v3_msr_unhandled_read(struct guest_info * core, uint32_t msr, struct v3_msr * dst, void * priv_data) {
+    V3_Print("Palacios: Unhandled MSR Read (MSR=0x%x)\n", msr);
+    return 0;
+}
+
+int v3_msr_unhandled_write(struct guest_info * core, uint32_t msr, struct v3_msr src, void * priv_data) {
+    V3_Print("Palacios: Unhandled MSR Write (MSR=0x%x)\n", msr);
+    return 0;
+}
+
+
 int v3_hook_msr(struct v3_vm_info * vm, uint32_t msr, 
                int (*read)(struct guest_info * core, uint32_t msr, struct v3_msr * dst, void * priv_data),
                int (*write)(struct guest_info * core, uint32_t msr, struct v3_msr src, void * priv_data),
@@ -134,6 +147,10 @@ int v3_hook_msr(struct v3_vm_info * vm, uint32_t msr,
     return 0;
 }
 
+
+
+
+
 static int free_hook(struct v3_vm_info * vm, struct v3_msr_hook * hook) {
     list_del(&(hook->link));