struct v3_msr {
union {
- ullong_t value;
+ uint64_t value;
struct {
- uint_t lo;
- uint_t hi;
+ uint32_t lo;
+ uint32_t hi;
} __attribute__((packed));
} __attribute__((packed));
} __attribute__((packed));
struct v3_msr_hook * v3_get_msr_hook(struct guest_info * info, uint_t msr);
+void v3_refresh_msr_map(struct guest_info * info);
+
void v3_print_msr_map(struct guest_info * info);
int v3_handle_msr_write(struct guest_info * info);
list_add(&(hook->link), &(msr_map->hook_list));
- msr_map->update_map(info, msr,
- (read == NULL) ? 0 : 1,
- (write == NULL) ? 0 : 1);
+ if (msr_map->update_map) {
+ 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) {
+ PrintError("Unhooking MSRs currently not supported\n");
return -1;
}
}
+void v3_refresh_msr_map(struct guest_info * info) {
+ struct v3_msr_map * msr_map = &(info->msr_map);
+ struct v3_msr_hook * hook = NULL;
+
+ if (msr_map->update_map == NULL) {
+ PrintError("Trying to refresh an MSR map with no backend\n");
+ return;
+ }
+
+ list_for_each_entry(hook, &(msr_map->hook_list), link) {
+ msr_map->update_map(info, hook->msr,
+ (hook->read == NULL) ? 0 : 1,
+ (hook->write == NULL) ? 0 : 1);
+ }
+}
+
void v3_print_msr_map(struct guest_info * info) {
struct v3_msr_map * msr_map = &(info->msr_map);
struct v3_msr_hook * hook = NULL;
}
int v3_init_vmx_msr_map(struct guest_info * info) {
- struct v3_msr_map * msr_map = &(info->msr_map);
+ struct v3_msr_map * msr_map = &(info->msr_map);
- msr_map->update_map = update_map;
-
- msr_map->arch_data = V3_VAddr(V3_AllocPages(1));
- memset(msr_map->arch_data, 0, PAGE_SIZE_4KB);
-
- return 0;
+ msr_map->update_map = update_map;
+
+ msr_map->arch_data = V3_VAddr(V3_AllocPages(1));
+ memset(msr_map->arch_data, 0, PAGE_SIZE_4KB);
+
+ v3_refresh_msr_map(info);
+
+ return 0;
}