Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


bug fixes for:
[palacios.git] / palacios / src / devices / apic.c
index 8f4b8fe..f899419 100644 (file)
 #include <palacios/vmm_msr.h>
 
 #define BASE_ADDR_MSR 0x0000001B
+#define DEFAULT_BASE_ADDR 0xfee00000
 
 
+struct apic_base_addr_reg {
+  uchar_t rsvd;
+  uint_t bsc           : 1;
+  uint_t rsvd2         : 2;
+  uint_t apic_enable   : 1;
+  ullong_t base_addr   : 40;
+  uint_t rsvd3         : 12;
+} __attribute__((packed));
+
 struct apic_state {
+  addr_t base_addr;
+
   v3_msr_t base_addr_reg;
 
+  
+
 };
 
 
-static int read_base_addr(uint_t msr, v3_msr_t * dst, void * priv_data) {
+static int read_apic_msr(uint_t msr, v3_msr_t * dst, void * priv_data) {
   struct vm_device * dev = (struct vm_device *)priv_data;
   struct apic_state * apic = (struct apic_state *)dev->private_data;
   PrintDebug("READING APIC BASE ADDR: HI=%x LO=%x\n", apic->base_addr_reg.hi, apic->base_addr_reg.lo);
@@ -40,7 +54,7 @@ static int read_base_addr(uint_t msr, v3_msr_t * dst, void * priv_data) {
 }
 
 
-static int write_base_addr(uint_t msr, v3_msr_t src, void * priv_data) {
+static int write_apic_msr(uint_t msr, v3_msr_t src, void * priv_data) {
   //  struct vm_device * dev = (struct vm_device *)priv_data;
   //  struct apic_state * apic = (struct apic_state *)dev->private_data;
 
@@ -50,6 +64,18 @@ static int write_base_addr(uint_t msr, v3_msr_t src, void * priv_data) {
 }
 
 
+static int apic_read(addr_t guest_addr, void * dst, uint_t length, void * priv_data) {
+  PrintDebug("Read from apic address space\n");
+  return -1;
+}
+
+
+static int apic_write(addr_t guest_addr, void * dst, uint_t length, void * priv_data) {
+  PrintDebug("Write to apic address space\n");
+  return -1;
+}
+
+
 static int apic_deinit(struct vm_device * dev) {
   struct guest_info * info = dev->vm;
 
@@ -61,8 +87,13 @@ static int apic_deinit(struct vm_device * dev) {
 
 static int apic_init(struct vm_device * dev) {
   struct guest_info * info = dev->vm;
+  struct apic_state * apic = (struct apic_state *)(dev->private_data);
+
+  apic->base_addr = DEFAULT_BASE_ADDR;
+
+  v3_hook_msr(info, BASE_ADDR_MSR, read_apic_msr, write_apic_msr, dev);
 
-  v3_hook_msr(info, BASE_ADDR_MSR, read_base_addr, write_base_addr, dev);
+  v3_hook_full_mem(info, DEFAULT_BASE_ADDR, DEFAULT_BASE_ADDR + PAGE_SIZE_4KB, apic_read, apic_write, dev);
 
   return 0;
 }