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;
}
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;
- list_add(&(hook->link), &(msr_map->hook_list));
+ msr_map->num_hooks++;
- return 0;
+ list_add(&(hook->link), &(msr_map->hook_list));
+
+ 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);
+ }
}