From: Peter Dinda Date: Wed, 2 Jul 2008 17:58:24 +0000 (+0000) Subject: Updated to include improved 8254 X-Git-Tag: boot386puppy-26-to-ide~3 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=c3b81025fc7957141b1bc8d790f5850f008cc289 Updated to include improved 8254 This can now boot 386puppy-2.6.iso to the ide driver --- diff --git a/palacios/build/Makefile b/palacios/build/Makefile index d871a38..812d4c9 100644 --- a/palacios/build/Makefile +++ b/palacios/build/Makefile @@ -1,6 +1,6 @@ # Makefile for GeekOS kernel, userspace, and tools # Copyright (c) 2004,2005 David H. Hovemeyer -# $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 diff --git a/palacios/src/devices/nvram.c b/palacios/src/devices/nvram.c index 5002134..355e607 100644 --- a/palacios/src/devices/nvram.c +++ b/palacios/src/devices/nvram.c @@ -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; } diff --git a/palacios/src/geekos/vm.c b/palacios/src/geekos/vm.c index 141eedf..7fc48a8 100644 --- a/palacios/src/geekos/vm.c +++ b/palacios/src/geekos/vm.c @@ -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)); diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index 4dba737..4b0ff65 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -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; } diff --git a/palacios/src/palacios/vmm_shadow_paging.c b/palacios/src/palacios/vmm_shadow_paging.c index 90ca141..dbc4c61 100644 --- a/palacios/src/palacios/vmm_shadow_paging.c +++ b/palacios/src/palacios/vmm_shadow_paging.c @@ -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) { diff --git a/palacios/src/vmboot/rombios/rombios.c b/palacios/src/vmboot/rombios/rombios.c index 081eedd..93654a2 100644 --- a/palacios/src/vmboot/rombios/rombios.c +++ b/palacios/src/vmboot/rombios/rombios.c @@ -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;