From: Kevin Pedretti Date: Thu, 30 Jun 2011 00:23:34 +0000 (-0600) Subject: Fix bug setting bits in MSR bitmap for MSRs >= 0xC0000000 X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=361b55b7eb2d33b092c7be0e5abf86ab6e0905e1 Fix bug setting bits in MSR bitmap for MSRs >= 0xC0000000 This fix allows EFER (MSR 0xC0000080) to be hooked successfully. --- 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; }