Patchwork [3/3] kvm: allow qemu to set EPT identity mapping address

login
register
mail settings
Submitter Marcelo Tosatti
Date March 9, 2010, 1:53 a.m.
Message ID <20100309015644.272624611@redhat.com>
Download mbox | patch
Permalink /patch/47146/
State New
Headers show

Comments

Marcelo Tosatti - March 9, 2010, 1:53 a.m.
From: Sheng Yang <sheng@linux.intel.com>

If we use larger BIOS image than current 256KB, we would need move reserved
TSS and EPT identity mapping pages. Currently TSS support this, but not
EPT.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Avi Kivity - March 11, 2010, 8:42 a.m.
On 03/09/2010 03:53 AM, Marcelo Tosatti wrote:
> From: Sheng Yang<sheng@linux.intel.com>
>
> If we use larger BIOS image than current 256KB, we would need move reserved
> TSS and EPT identity mapping pages. Currently TSS support this, but not
> EPT.
>
> Signed-off-by: Marcelo Tosatti<mtosatti@redhat.com>
>
> Index: qemu-kvm/target-i386/kvm.c
> ===================================================================
> --- qemu-kvm.orig/target-i386/kvm.c
> +++ qemu-kvm/target-i386/kvm.c
> @@ -341,6 +341,24 @@ static int kvm_has_msr_star(CPUState *en
>       return 0;
>   }
>
> +static int kvm_init_identity_map_page(KVMState *s)
> +{
> +#ifdef KVM_CAP_SET_IDENTITY_MAP_ADDR
> +    int ret;
> +    uint64_t addr = 0xfffbc000;
> +
> +    if (!kvm_check_extension(s, KVM_CAP_SET_IDENTITY_MAP_ADDR))
> +        return 0;
>    

{ braces }

> +
> +    ret = kvm_vm_ioctl(s, KVM_SET_IDENTITY_MAP_ADDR,&addr);
> +    if (ret<  0) {
> +        fprintf(stderr, "kvm_set_identity_map_addr: %s\n", strerror(ret));
> +        return ret;
> +    }
> +#endif
> +    return 0;
> +}
> +
>   int kvm_arch_init(KVMState *s, int smp_cpus)
>   {
>       int ret;
> @@ -368,7 +386,11 @@ int kvm_arch_init(KVMState *s, int smp_c
>           perror("e820_add_entry() table is full");
>           exit(1);
>       }
> -    return kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, 0xfffbd000);
> +    ret = kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, 0xfffbd000);
> +    if (ret<  0)
> +        return ret;
>    

{ }

> +
> +    return kvm_init_identity_map_page(s);
>   }
>
>   static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

Patch

Index: qemu-kvm/target-i386/kvm.c
===================================================================
--- qemu-kvm.orig/target-i386/kvm.c
+++ qemu-kvm/target-i386/kvm.c
@@ -341,6 +341,24 @@  static int kvm_has_msr_star(CPUState *en
     return 0;
 }
 
+static int kvm_init_identity_map_page(KVMState *s)
+{
+#ifdef KVM_CAP_SET_IDENTITY_MAP_ADDR
+    int ret;
+    uint64_t addr = 0xfffbc000;
+
+    if (!kvm_check_extension(s, KVM_CAP_SET_IDENTITY_MAP_ADDR))
+        return 0;
+
+    ret = kvm_vm_ioctl(s, KVM_SET_IDENTITY_MAP_ADDR, &addr);
+    if (ret < 0) {
+        fprintf(stderr, "kvm_set_identity_map_addr: %s\n", strerror(ret));
+        return ret;
+    }
+#endif
+    return 0;
+}
+
 int kvm_arch_init(KVMState *s, int smp_cpus)
 {
     int ret;
@@ -368,7 +386,11 @@  int kvm_arch_init(KVMState *s, int smp_c
         perror("e820_add_entry() table is full");
         exit(1);
     }
-    return kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, 0xfffbd000);
+    ret = kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, 0xfffbd000);
+    if (ret < 0)
+        return ret;
+
+    return kvm_init_identity_map_page(s);
 }
                     
 static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs)