X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmm_msr.c;h=5fe5ffdcc7106294935e176451242fffd00cef70;hb=29056b18227989f85d7cc6ba4cbb3165e78be3b5;hp=434fc9d03bf36b8b7506830b90b5801cc6cd9c76;hpb=62406cf6b87a27a62921ce09a0aa44780ea25c06;p=palacios.git diff --git a/palacios/src/palacios/vmm_msr.c b/palacios/src/palacios/vmm_msr.c index 434fc9d..5fe5ffd 100644 --- a/palacios/src/palacios/vmm_msr.c +++ b/palacios/src/palacios/vmm_msr.c @@ -24,10 +24,13 @@ void v3_init_msr_map(struct guest_info * info) { - struct v3_msr_map * msr_map = &(info->msr_map); + struct v3_msr_map * msr_map = &(info->msr_map); - INIT_LIST_HEAD(&(msr_map->hook_list)); - msr_map->num_hooks = 0; + INIT_LIST_HEAD(&(msr_map->hook_list)); + msr_map->num_hooks = 0; + + msr_map->arch_data = NULL; + msr_map->update_map = NULL; } @@ -36,54 +39,58 @@ int v3_hook_msr(struct guest_info * info, uint_t msr, int (*write)(uint_t msr, struct v3_msr src, void * priv_data), void * priv_data) { - struct v3_msr_map * msr_map = &(info->msr_map); - struct v3_msr_hook * hook = NULL; + struct v3_msr_map * msr_map = &(info->msr_map); + struct v3_msr_hook * hook = NULL; - hook = (struct v3_msr_hook *)V3_Malloc(sizeof(struct v3_msr_hook)); - if (hook == NULL) { - PrintError("Could not allocate msr hook for MSR %d\n", msr); - return -1; - } + hook = (struct v3_msr_hook *)V3_Malloc(sizeof(struct v3_msr_hook)); + + if (hook == NULL) { + PrintError("Could not allocate msr hook for MSR %d\n", msr); + return -1; + } - hook->read = read; - hook->write = write; - hook->msr = msr; - hook->priv_data = priv_data; + hook->read = read; + hook->write = write; + hook->msr = msr; + hook->priv_data = priv_data; - msr_map->num_hooks++; + msr_map->num_hooks++; - list_add(&(hook->link), &(msr_map->hook_list)); + list_add(&(hook->link), &(msr_map->hook_list)); - return 0; + msr_map->update_map(info, msr, + (read == NULL) ? 0 : 1, + (write == NULL) ? 0 : 1); + return 0; } int v3_unhook_msr(struct guest_info * info, uint_t msr) { - return -1; + return -1; } struct v3_msr_hook * v3_get_msr_hook(struct guest_info * info, uint_t msr) { - struct v3_msr_map * msr_map = &(info->msr_map); - struct v3_msr_hook * hook = NULL; + struct v3_msr_map * msr_map = &(info->msr_map); + struct v3_msr_hook * hook = NULL; - list_for_each_entry(hook, &(msr_map->hook_list), link) { - if (hook->msr == msr) { - return hook; + list_for_each_entry(hook, &(msr_map->hook_list), link) { + if (hook->msr == msr) { + return hook; + } } - } - return NULL; + return NULL; } void v3_print_msr_map(struct guest_info * info) { - struct v3_msr_map * msr_map = &(info->msr_map); - struct v3_msr_hook * hook = NULL; + struct v3_msr_map * msr_map = &(info->msr_map); + struct v3_msr_hook * hook = NULL; - list_for_each_entry(hook, &(msr_map->hook_list), link) { - PrintDebug("MSR HOOK (MSR=%d) (read=0x%p) (write=0x%p)\n", - hook->msr, hook->read, hook->write); - } + list_for_each_entry(hook, &(msr_map->hook_list), link) { + PrintDebug("MSR HOOK (MSR=%d) (read=0x%p) (write=0x%p)\n", + hook->msr, hook->read, hook->write); + } }