#include <palacios/vmm.h>
#include <palacios/vmm_cpuid.h>
#include <palacios/vmm_lowlevel.h>
+#include <palacios/vm_guest.h>
-
-void v3_init_cpuid_map(struct guest_info * info) {
- info->cpuid_map.map.rb_node = NULL;
+void v3_init_cpuid_map(struct v3_vm_info * vm) {
+ vm->cpuid_map.map.rb_node = NULL;
}
-static inline struct v3_cpuid_hook * __insert_cpuid_hook(struct guest_info * info, struct v3_cpuid_hook * hook) {
- struct rb_node ** p = &(info->cpuid_map.map.rb_node);
+static inline struct v3_cpuid_hook * __insert_cpuid_hook(struct v3_vm_info * vm, struct v3_cpuid_hook * hook) {
+ struct rb_node ** p = &(vm->cpuid_map.map.rb_node);
struct rb_node * parent = NULL;
struct v3_cpuid_hook * tmp_hook = NULL;
}
-static inline struct v3_cpuid_hook * insert_cpuid_hook(struct guest_info * info, struct v3_cpuid_hook * hook) {
+static inline struct v3_cpuid_hook * insert_cpuid_hook(struct v3_vm_info * vm, struct v3_cpuid_hook * hook) {
struct v3_cpuid_hook * ret;
- if ((ret = __insert_cpuid_hook(info, hook))) {
+ if ((ret = __insert_cpuid_hook(vm, hook))) {
return ret;
}
- v3_rb_insert_color(&(hook->tree_node), &(info->cpuid_map.map));
+ v3_rb_insert_color(&(hook->tree_node), &(vm->cpuid_map.map));
return NULL;
}
-static struct v3_cpuid_hook * get_cpuid_hook(struct guest_info * info, uint32_t cpuid) {
- struct rb_node * n = info->cpuid_map.map.rb_node;
+static struct v3_cpuid_hook * get_cpuid_hook(struct v3_vm_info * vm, uint32_t cpuid) {
+ struct rb_node * n = vm->cpuid_map.map.rb_node;
struct v3_cpuid_hook * hook = NULL;
while (n) {
}
-int v3_unhook_cpuid(struct guest_info * info, uint32_t cpuid) {
- struct v3_cpuid_hook * hook = get_cpuid_hook(info, cpuid);
+int v3_unhook_cpuid(struct v3_vm_info * vm, uint32_t cpuid) {
+ struct v3_cpuid_hook * hook = get_cpuid_hook(vm, cpuid);
if (hook == NULL) {
PrintError("Could not find cpuid to unhook (0x%x)\n", cpuid);
return -1;
}
- v3_rb_erase(&(hook->tree_node), &(info->cpuid_map.map));
+ v3_rb_erase(&(hook->tree_node), &(vm->cpuid_map.map));
V3_Free(hook);
return 0;
}
-int v3_hook_cpuid(struct guest_info * info, uint32_t cpuid,
+int v3_hook_cpuid(struct v3_vm_info * vm, uint32_t cpuid,
int (*hook_fn)(struct guest_info * info, uint32_t cpuid, \
uint32_t * eax, uint32_t * ebx, \
uint32_t * ecx, uint32_t * edx, \
hook->private_data = private_data;
hook->hook_fn = hook_fn;
- if (insert_cpuid_hook(info, hook)) {
+ if (insert_cpuid_hook(vm, hook)) {
PrintError("Could not hook cpuid 0x%x (already hooked)\n", cpuid);
V3_Free(hook);
return -1;
int v3_handle_cpuid(struct guest_info * info) {
uint32_t cpuid = info->vm_regs.rax;
- struct v3_cpuid_hook * hook = get_cpuid_hook(info, cpuid);
+ struct v3_cpuid_hook * hook = get_cpuid_hook(info->vm_info, cpuid);
+
+ //PrintDebug("CPUID called for 0x%x\n", cpuid);
if (hook == NULL) {
+ //PrintDebug("Calling passthrough handler\n");
// call the passthrough handler
v3_cpuid(cpuid,
(uint32_t *)&(info->vm_regs.rax),
(uint32_t *)&(info->vm_regs.rcx),
(uint32_t *)&(info->vm_regs.rdx));
} else {
+ // PrintDebug("Calling hook function\n");
+
if (hook->hook_fn(info, cpuid,
(uint32_t *)&(info->vm_regs.rax),
(uint32_t *)&(info->vm_regs.rbx),
}
}
+ // PrintDebug("Cleaning up register contents\n");
+
info->vm_regs.rax &= 0x00000000ffffffffLL;
info->vm_regs.rbx &= 0x00000000ffffffffLL;
info->vm_regs.rcx &= 0x00000000ffffffffLL;