# 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".
                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
 
 
  
 
   // 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;
   // 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;
 
 }
 
   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;
 }
 
 
 
       //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));
 
 
          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");
 
 
        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;
        }
     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);
       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;
 
     } 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;
   }
 
       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;
   }
 
 
       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) {
 
 //  -*- 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.
 
 #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)
          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;