[PATCH] kvm: allow tpr patching to write to write-protected vapic option rom

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Now that we allow the bios to write protect option roms, we need to allow
the tpr patching code to write to this write protected memory.  This means
using cpu_physical_memory_write_rom() instead of the usual APIs.

Fixes Windows XP without flexpriority.

Signed-off-by: Avi Kivity <avi@xxxxxxxxxx>
---
 kvm-tpr-opt.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/kvm-tpr-opt.c b/kvm-tpr-opt.c
index 46890e2..c929fc8 100644
--- a/kvm-tpr-opt.c
+++ b/kvm-tpr-opt.c
@@ -73,7 +73,7 @@ static uint8_t read_byte_virt(CPUState *env, target_ulong virt)
 
 static void write_byte_virt(CPUState *env, target_ulong virt, uint8_t b)
 {
-    stb_phys(map_addr(env, virt, NULL), b);
+    cpu_physical_memory_write_rom(map_addr(env, virt, NULL), &b, 1);
 }
 
 struct vapic_bios {
@@ -107,7 +107,7 @@ static void update_vbios_real_tpr(void)
     cpu_physical_memory_rw(vbios_desc_phys, (void *)&vapic_bios, sizeof vapic_bios, 0);
     vapic_bios.real_tpr = real_tpr;
     vapic_bios.vcpu_shift = 7;
-    cpu_physical_memory_rw(vbios_desc_phys, (void *)&vapic_bios, sizeof vapic_bios, 1);
+    cpu_physical_memory_write_rom(vbios_desc_phys, (void *)&vapic_bios, sizeof vapic_bios);
 }
 
 static unsigned modrm_reg(uint8_t modrm)
@@ -174,6 +174,7 @@ static int bios_is_mapped(CPUState *env, uint64_t rip)
     unsigned perms;
     uint32_t i;
     uint32_t offset, fixup, start = vapic_bios_addr ? : 0xe0000;
+    uint32_t patch;
 
     if (bios_enabled)
 	return 1;
@@ -198,7 +199,8 @@ static int bios_is_mapped(CPUState *env, uint64_t rip)
     for (i = vapic_bios.fixup_start; i < vapic_bios.fixup_end; i += 4) {
 	offset = ldl_phys(phys + i - vapic_bios.virt_base);
 	fixup = phys + offset;
-	stl_phys(fixup, ldl_phys(fixup) + bios_addr - vapic_bios.virt_base);
+        patch = ldl_phys(fixup) + bios_addr - vapic_bios.virt_base;
+        cpu_physical_memory_write_rom(fixup, (uint8_t *)&patch, 4);
     }
     vapic_phys = vapic_bios.vapic - vapic_bios.virt_base + phys;
     return 1;
@@ -225,7 +227,7 @@ int kvm_tpr_enable_vapic(CPUState *env)
 	    return 0;
 
     kvm_enable_vapic(env, vapic_phys + (pcr_cpu << 7));
-    cpu_physical_memory_rw(vapic_phys + (pcr_cpu << 7) + 4, &one, 1, 1);
+    cpu_physical_memory_write_rom(vapic_phys + (pcr_cpu << 7) + 4, &one, 1);
     env->kvm_vcpu_update_vapic = 0;
     bios_enabled = 1;
     return 1;
-- 
1.7.2.3

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux