void v3_init_msr_map(struct v3_vm_info * vm) {
struct v3_msr_map * msr_map = &(vm->msr_map);
- PrintDebug("Initializing MSR map.\n");
+ PrintDebug(vm, VCORE_NONE, "Initializing MSR map.\n");
INIT_LIST_HEAD(&(msr_map->hook_list));
msr_map->num_hooks = 0;
msr_val.value = 0;
- PrintDebug("MSR write for msr 0x%x\n", msr_num);
+ PrintDebug(info->vm_info, info, "MSR write for msr 0x%x\n", msr_num);
hook = v3_get_msr_hook(info->vm_info, msr_num);
if (hook->write) {
if (hook->write(info, msr_num, msr_val, hook->priv_data) == -1) {
- PrintError("Error in MSR hook Write\n");
+ PrintError(info->vm_info, info, "Error in MSR hook Write\n");
return -1;
}
} else {
- PrintError("No write hook exists for msr 0x%x\n",msr_num);
+ PrintError(info->vm_info, info, "No write hook exists for 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");
+ PrintError(info->vm_info, info, "Error in MSR hook Read\n");
return -1;
}
}
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);
+ V3_Print(core->vm_info, core, "Palacios: Unhandled MSR Read (MSR=0x%x) - returning zero\n", msr);
+
+#ifdef V3_CONFIG_STRICT_MSR_SEMANTICS
+ v3_raise_exception(core,GPF_EXCEPTION);
+#else
+ dst->value = 0;
+#endif
+
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);
+ V3_Print(core->vm_info, core, "Palacios: Unhandled MSR Write (MSR=0x%x) - ignored\n", msr);
+
+#ifdef V3_CONFIG_STRICT_MSR_SEMANTICS
+ v3_raise_exception(core,GPF_EXCEPTION);
+#else
+ // write ignored
+#endif
+
return 0;
}
hook = (struct v3_msr_hook *)V3_Malloc(sizeof(struct v3_msr_hook));
if (hook == NULL) {
- PrintError("Could not allocate msr hook for MSR 0x%x\n", msr);
+ PrintError(vm, VCORE_NONE,"Could not allocate msr hook for MSR 0x%x\n", msr);
return -1;
}
struct v3_msr_hook * hook = v3_get_msr_hook(vm, msr);
if (hook == NULL) {
- PrintError("Could not find MSR to unhook %u (0x%x)\n", msr, msr);
+ PrintError(vm, VCORE_NONE,"Could not find MSR to unhook %u (0x%x)\n", msr, msr);
return -1;
}
struct v3_msr_hook * hook = NULL;
if (msr_map->update_map == NULL) {
- PrintError("Trying to refresh an MSR map with no backend\n");
+ PrintError(vm, VCORE_NONE, "Trying to refresh an MSR map with no backend\n");
return;
}
list_for_each_entry(hook, &(msr_map->hook_list), link) {
- PrintDebug("updating MSR map for msr 0x%x\n", hook->msr);
+ PrintDebug(vm, VCORE_NONE, "updating MSR map for msr 0x%x\n", hook->msr);
msr_map->update_map(vm, hook->msr,
(hook->read == NULL) ? 0 : 1,
(hook->write == NULL) ? 0 : 1);
struct v3_msr_hook * hook = NULL;
list_for_each_entry(hook, &(msr_map->hook_list), link) {
- V3_Print("MSR HOOK (MSR=0x%x) (read=0x%p) (write=0x%p)\n",
+ V3_Print(vm, VCORE_NONE, "MSR HOOK (MSR=0x%x) (read=0x%p) (write=0x%p)\n",
hook->msr, hook->read, hook->write);
}
}