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.


Updated to include improved 8254
Peter Dinda [Wed, 2 Jul 2008 17:58:24 +0000 (17:58 +0000)]
This can now boot 386puppy-2.6.iso to the ide driver

palacios/build/Makefile
palacios/src/devices/nvram.c
palacios/src/geekos/vm.c
palacios/src/palacios/vmm_ctrl_regs.c
palacios/src/palacios/vmm_shadow_paging.c
palacios/src/vmboot/rombios/rombios.c

index d871a38..812d4c9 100644 (file)
@@ -1,6 +1,6 @@
 # Makefile for GeekOS kernel, userspace, and tools
 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
-# $Revision: 1.39 $
+# $Revision: 1.40 $
 
 # This is free software.  You are permitted to use,
 # redistribute, and modify it as specified in the file "COPYING".
@@ -127,6 +127,7 @@ VMM_C_SRCS :=   vm_guest.c \
                vmm_intr.c vmm_time.c\
                vmm_shadow_paging.c vm_guest_mem.c  \
                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
+                svm_halt.c 
 #\
 #              vmx.c vmcs_gen.c vmcs.c
 
index 5002134..355e607 100644 (file)
@@ -103,7 +103,8 @@ static int set_nvram_defaults(struct vm_device *dev)
  
 
   // Set equipment byte to note 2 floppies, vga display, keyboard,math,floppy
-  nvram_state->mem_state[NVRAM_REG_EQUIPMENT_BYTE]= 0x4f;
+  //nvram_state->mem_state[NVRAM_REG_EQUIPMENT_BYTE]= 0x4f;
+  nvram_state->mem_state[NVRAM_REG_EQUIPMENT_BYTE] = 
 
   // Set conventional memory to 640K
   nvram_state->mem_state[NVRAM_REG_BASE_MEMORY_HIGH]= 0x02;
@@ -126,6 +127,23 @@ static int set_nvram_defaults(struct vm_device *dev)
   // This is the harddisk type.... Set accordingly...
   nvram_state->mem_state[NVRAM_IBM_HD_DATA] = 0x20;
 
+  // Set the shutdown status gently
+  // soft reset
+  nvram_state->mem_state[NVRAM_REG_SHUTDOWN_STATUS] = 0x0;
+
+
+  // RTC status A
+  // time update in progress, default timebase (32KHz, default interrupt rate 1KHz)
+  // 10100110
+  nvram_state->mem_state[NVRAM_REG_STAT_A] = 0xa6;
+
+  // RTC status B
+  // time updates, default timebase (32KHz, default interrupt rate 1KHz)
+  // 10100110
+  //nvram_state->mem_state[NVRAM_REG_STAT_B] = 0xa6;
+  
+
+
   return 0;
 
 }
@@ -194,6 +212,12 @@ int nvram_read_data_port(ushort_t port,
 
   PrintDebug("nvram_read_data_port(0x%x)=0x%x\n", data->thereg, data->mem_state[data->thereg]);
 
+  // hack
+  if (data->thereg==NVRAM_REG_STAT_A) { 
+    data->mem_state[data->thereg] ^= 0x80;  // toggle Update in progess
+  }
+
+
   return 1;
 }
 
index 141eedf..7fc48a8 100644 (file)
@@ -314,7 +314,10 @@ int RunVMM(struct Boot_Info * bootInfo) {
 
       //add_shadow_region_passthrough(&vm_info, 0x100000, 0x2000000, (addr_t)Allocate_VMM_Pages(8192));
       add_shadow_region_passthrough(&vm_info, 0x100000, 0x1000000, (addr_t)Allocate_VMM_Pages(4096));
-      add_shadow_region_passthrough(&vm_info, 0xc0000000, 0xffffffff, 0xc0000000);
+
+      // test - give linux accesss to PCI space - PAD
+      add_shadow_region_passthrough(&vm_info, 0xc0000000,0xffffffff,0xc0000000);
+
 
       print_shadow_map(&(vm_info.mem_map));
 
index 4dba737..4b0ff65 100644 (file)
@@ -146,6 +146,12 @@ int handle_cr0_write(struct guest_info * info) {
          info->cpu_mode = PROTECTED;
        }
 
+       if (new_cr0->pe == 0) { 
+         PrintDebug("Entering Real Mode\n");
+         info->cpu_mode = REAL;
+       }
+         
+
        if (new_cr0->pg == 1) {
          PrintDebug("Paging is already turned on in switch to protected mode in CR0 write\n");
 
@@ -483,6 +489,9 @@ int handle_cr0_read(struct guest_info * info) {
 
        if (info->shdw_pg_mode == SHADOW_PAGING) {
          *virt_cr0 = *(struct cr0_32 *)&(info->shdw_pg_state.guest_cr0);
+         if (info->cpu_mode==PROTECTED) {
+           virt_cr0->pg=0; // clear the pg bit because guest doesn't think it's on
+         }
        } else {
          *virt_cr0 = *real_cr0;
        }
@@ -526,10 +535,14 @@ int handle_cr3_write(struct guest_info * info) {
     int ret;
     char instr[15];
 
+    PrintDebug("Protected %s mode write to CR3 at %s 0x%x\n",
+              info->cpu_mode==PROTECTED ? "" : "Paged", 
+              info->cpu_mode==PROTECTED ? "guest physical" : "guest virtual",
+              get_addr_linear(info,info->rip,&(info->segments.cs)));
 
     // We need to read the instruction, which is at CS:IP, but that 
     // linear address is guest physical without PG and guest virtual with PG
-    if (info->cpu_mode == PHYSICAL_MEM) { 
+    if (info->mem_mode == PHYSICAL_MEM) { 
       // The real rip address is actually a combination of the rip + CS base 
       PrintDebug("Writing Guest CR3 Write (Physical Address)\n");
       ret = read_guest_pa_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr);
@@ -539,7 +552,6 @@ int handle_cr3_write(struct guest_info * info) {
       ret = read_guest_va_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr);
     }
 
-
     if (ret != 15) {
       PrintDebug("Could not read instruction (ret=%d)\n", ret);
       return -1;
@@ -612,10 +624,11 @@ int handle_cr3_write(struct guest_info * info) {
 
     } else {
       PrintDebug("Unknown Instruction\n");
+      SerialMemDump(instr,15);
       return -1;
     }
   } else {
-    PrintDebug("Invalid operating Mode\n");
+    PrintDebug("Invalid operating Mode (0x%x)\n", info->cpu_mode);
     return -1;
   }
 
@@ -679,10 +692,11 @@ int handle_cr3_read(struct guest_info * info) {
       info->rip += index;
     } else {
       PrintDebug("Unknown Instruction\n");
+      SerialMemDump(instr,15);
       return -1;
     }
   } else {
-    PrintDebug("Invalid operating Mode\n");
+    PrintDebug("Invalid operating Mode (0x%x)\n", info->cpu_mode);
     return -1;
   }
 
index 90ca141..dbc4c61 100644 (file)
@@ -275,6 +275,10 @@ int handle_shadow_pte32_fault(struct guest_info * info,
       raise_exception(info, MC_EXCEPTION);
 
       PrintDebug("Invalid Guest Address in page table (0x%x)\n", guest_pa);
+      PrintDebug("fault_addr=0x%x next are guest and shadow ptes \n",fault_addr);
+      PrintPTE32(fault_addr,guest_pte);
+      PrintPTE32(fault_addr,shadow_pte);
+      PrintDebug("Done.\n");
       return 0;
 
     } else if (host_page_type == HOST_REGION_PHYSICAL_MEMORY) {
index 081eedd..93654a2 100644 (file)
@@ -1,6 +1,6 @@
 //  -*- fundamental -*-
 /////////////////////////////////////////////////////////////////////////
-// $Id: rombios.c,v 1.8 2008/06/23 17:15:19 pdinda Exp $
+// $Id: rombios.c,v 1.9 2008/07/02 17:58:44 pdinda Exp $
 /////////////////////////////////////////////////////////////////////////
 //
 //  Copyright (C) 2002  MandrakeSoft S.A.
@@ -945,10 +945,10 @@ Bit16u cdrom_boot();
 
 #endif // BX_ELTORITO_BOOT
 
-static char bios_cvs_version_string[] = "$Revision: 1.8 $";
-static char bios_date_string[] = "$Date: 2008/06/23 17:15:19 $";
+static char bios_cvs_version_string[] = "$Revision: 1.9 $";
+static char bios_date_string[] = "$Date: 2008/07/02 17:58:44 $";
 
-static char CVSID[] = "$Id: rombios.c,v 1.8 2008/06/23 17:15:19 pdinda Exp $";
+static char CVSID[] = "$Id: rombios.c,v 1.9 2008/07/02 17:58:44 pdinda Exp $";
 
 /* Offset to skip the CVS $Id: prefix */ 
 #define bios_version_string  (CVSID + 4)
@@ -4169,7 +4169,7 @@ ASM_END
          case 0x20: // coded by osmaker aka K.J.
             if(regs.u.r32.edx == 0x534D4150) /* SMAP */
             {
-#if defined(HVMASSIST) && 1
+#if defined(HVMASSIST) && 0
                if ((regs.u.r16.bx / 0x14) * 0x14 == regs.u.r16.bx) {
 
                    Bit16u e820_table_size = read_word(0xe000, 0x8) * 0x14;