From: Lei Xia Date: Thu, 30 Jun 2011 21:27:12 +0000 (-0500) Subject: Merge branch 'devel' of palacios@newskysaw.cs.northwestern.edu:/home/palacios/palacio... X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=f549b22853dfed86175cdf110e9f56bbdb934271;hp=cd265a5242baa89c2149b5c5cbf0ed00cfa83892;p=palacios.git Merge branch 'devel' of palacios@newskysaw.cs.northwestern.edu:/home/palacios/palacios into devel --- diff --git a/palacios/src/devices/nvram.c b/palacios/src/devices/nvram.c index 86ca02e..cda167e 100644 --- a/palacios/src/devices/nvram.c +++ b/palacios/src/devices/nvram.c @@ -484,46 +484,44 @@ static void set_memory_size(struct nvram_internal * nvram, addr_t bytes) { // 1. Conventional Mem: 0-640k in K // 2. Extended Mem: 0-16MB in K // 3. Big Mem: 0-4G in 64K + uint16_t memk; + uint16_t mem_chunks; + // at most 640K of conventional memory if (bytes > 640 * 1024) { - set_memory(nvram, NVRAM_REG_BASE_MEMORY_HIGH, 0x02); - set_memory(nvram, NVRAM_REG_BASE_MEMORY_LOW, 0x80); - - // nvram->mem_state[NVRAM_REG_BASE_MEMORY_HIGH] = 0x02; - // nvram->mem_state[NVRAM_REG_BASE_MEMORY_LOW] = 0x80; + memk=640; } else { - uint16_t memk = bytes * 1024; - set_memory(nvram, NVRAM_REG_BASE_MEMORY_HIGH, (memk >> 8) & 0x00ff); - set_memory(nvram, NVRAM_REG_BASE_MEMORY_LOW, memk & 0x00ff); - - return; + memk = bytes/1024; } - if (bytes > (16 * 1024 * 1024)) { - // Set extended memory to 15 MB - set_memory(nvram, NVRAM_REG_EXT_MEMORY_HIGH, 0x3C); - set_memory(nvram, NVRAM_REG_EXT_MEMORY_LOW, 0x00); - set_memory(nvram, NVRAM_REG_EXT_MEMORY_2ND_HIGH, 0x3C); - set_memory(nvram, NVRAM_REG_EXT_MEMORY_2ND_LOW, 0x00); + set_memory(nvram, NVRAM_REG_BASE_MEMORY_HIGH, (memk >> 8) & 0x00ff); + set_memory(nvram, NVRAM_REG_BASE_MEMORY_LOW, memk & 0x00ff); + + // set extended memory - first 1 MB is lost to 640K chunk + // extended memory is min(0MB, bytes-1MB) + if (bytes < 1024*1024) { + // no extended memory + memk = 0; } else { - uint16_t memk = bytes * 1024; - - set_memory(nvram, NVRAM_REG_EXT_MEMORY_HIGH, (memk >> 8) & 0x00ff); - set_memory(nvram, NVRAM_REG_EXT_MEMORY_LOW, memk & 0x00ff); - set_memory(nvram, NVRAM_REG_EXT_MEMORY_2ND_HIGH, (memk >> 8) & 0x00ff); - set_memory(nvram, NVRAM_REG_EXT_MEMORY_2ND_LOW, memk & 0x00ff); - - return; + memk = (bytes - 1024 * 1024 ) / 1024; } - { - // Set the extended memory beyond 16 MB in 64k chunks - uint16_t mem_chunks = (bytes - (1024 * 1024 * 16)) / (1024 * 64); - - set_memory(nvram, NVRAM_REG_AMI_BIG_MEMORY_HIGH, (mem_chunks >> 8) & 0x00ff); - set_memory(nvram, NVRAM_REG_AMI_BIG_MEMORY_LOW, mem_chunks & 0x00ff); + set_memory(nvram, NVRAM_REG_EXT_MEMORY_HIGH, (memk >> 8) & 0x00ff); + set_memory(nvram, NVRAM_REG_EXT_MEMORY_LOW, memk & 0x00ff); + set_memory(nvram, NVRAM_REG_EXT_MEMORY_2ND_HIGH, (memk >> 8) & 0x00ff); + set_memory(nvram, NVRAM_REG_EXT_MEMORY_2ND_LOW, memk & 0x00ff); + + // Set the extended memory beyond 16 MB in 64k chunks + // this is min(0, bytes-16MB) + if (bytes<(1024*1024*16)) { + mem_chunks=0; + } else { + mem_chunks = (bytes - (1024 * 1024 * 16)) / (1024 * 64); } + set_memory(nvram, NVRAM_REG_AMI_BIG_MEMORY_HIGH, (mem_chunks >> 8) & 0x00ff); + set_memory(nvram, NVRAM_REG_AMI_BIG_MEMORY_LOW, mem_chunks & 0x00ff); + return; } @@ -732,17 +730,9 @@ static int nvram_read_data_port(struct guest_info * core, uint16_t port, addr_t irq_state = v3_lock_irqsave(data->nvram_lock); if (get_memory(data, data->thereg, (uint8_t *)dst) == -1) { - PrintError("nvram: Register %d (0x%x) Not set\n", data->thereg, data->thereg); - - v3_unlock_irqrestore(data->nvram_lock, irq_state); + PrintError("nvram: Register %d (0x%x) Not set - POSSIBLE BUG IN MACHINE INIT - CONTINUING\n", data->thereg, data->thereg); - /* allow guest to query checksummed bytes; warn but read zero rather than fail in this case */ - if ((data->thereg >= CHECKSUM_REGION_FIRST_BYTE) && (data->thereg <= CHECKSUM_REGION_LAST_BYTE)) { - return 1; - } else { - return -1; - } - } + } PrintDebug("nvram: nvram_read_data_port(0x%x) = 0x%x\n", data->thereg, *(uint8_t *)dst); diff --git a/palacios/src/palacios/vmx_msr.c b/palacios/src/palacios/vmx_msr.c index bf0e79f..e1ba86f 100644 --- a/palacios/src/palacios/vmx_msr.c +++ b/palacios/src/palacios/vmx_msr.c @@ -34,7 +34,7 @@ static int get_bitmap_index(uint_t msr) if( (msr >= LOW_MSR_START) && msr <= LOW_MSR_END) { return LOW_MSR_INDEX + msr; } else if (( msr >= HIGH_MSR_START ) && (msr <= HIGH_MSR_END)) { - return HIGH_MSR_INDEX + (msr - HIGH_MSR_START); + return (HIGH_MSR_INDEX * 8) + (msr - HIGH_MSR_START); } else { PrintError("MSR out of range: 0x%x\n", msr); return -1; @@ -43,7 +43,6 @@ static int get_bitmap_index(uint_t msr) /* Same as SVM */ static int update_map(struct v3_vm_info * vm, uint_t msr, int hook_reads, int hook_writes) { - int index = get_bitmap_index(msr); uint_t major = index / 8; uint_t minor = (index % 8); @@ -52,14 +51,12 @@ static int update_map(struct v3_vm_info * vm, uint_t msr, int hook_reads, int ho uint8_t write_val = (hook_writes) ? 0x1 : 0x0; uint8_t * bitmap = (uint8_t *)(vm->msr_map.arch_data); - *(bitmap + major) &= ~(mask << minor); *(bitmap + major) |= (read_val << minor); - *(bitmap + 2048 + major) &= ~(mask << minor); *(bitmap + 2048 + major) |= (write_val << minor); - + return 0; }