# 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;