All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] target/i386: hax: Move hax_setup_qemu_emulator.
@ 2018-01-10  6:47 Tao Wu
  2018-01-10 13:27 ` Paolo Bonzini
  2018-01-10 19:50 ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Tao Wu
  0 siblings, 2 replies; 7+ messages in thread
From: Tao Wu @ 2018-01-10  6:47 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, rth, ehabkost, Tao Wu

hax_setup_qemu_emulator reference env->efer which is updated in
hax_get_msrs, so it has to be called after hax_get_msrs. This fix
the bug that sometimes dump_state show 32 bits regs even in 64 bits
mode.

Signed-off-by: Tao Wu <lepton@google.com>
---
 target/i386/hax-all.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c
index 3ce6950296..a933bd462d 100644
--- a/target/i386/hax-all.c
+++ b/target/i386/hax-all.c
@@ -887,9 +887,6 @@ static int hax_sync_vcpu_register(CPUArchState *env, int set)
             return -1;
         }
     }
-    if (!set) {
-        hax_setup_qemu_emulator(env);
-    }
     return 0;
 }
 
@@ -1070,6 +1067,7 @@ static int hax_arch_get_registers(CPUArchState *env)
         return ret;
     }
 
+    hax_setup_qemu_emulator(env);
     return 0;
 }
 
-- 
2.16.0.rc1.238.g530d649a79-goog

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH] target/i386: hax: Move hax_setup_qemu_emulator.
  2018-01-10  6:47 [Qemu-devel] [PATCH] target/i386: hax: Move hax_setup_qemu_emulator Tao Wu
@ 2018-01-10 13:27 ` Paolo Bonzini
  2018-01-10 18:05   ` Tao Wu(吴涛@Eng)
  2018-01-10 19:50 ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Tao Wu
  1 sibling, 1 reply; 7+ messages in thread
From: Paolo Bonzini @ 2018-01-10 13:27 UTC (permalink / raw)
  To: Tao Wu, qemu-devel; +Cc: rth, ehabkost

On 10/01/2018 07:47, Tao Wu wrote:
> hax_setup_qemu_emulator reference env->efer which is updated in
> hax_get_msrs, so it has to be called after hax_get_msrs. This fix
> the bug that sometimes dump_state show 32 bits regs even in 64 bits
> mode.
> 
> Signed-off-by: Tao Wu <lepton@google.com>
> ---
>  target/i386/hax-all.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
> 
> diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c
> index 3ce6950296..a933bd462d 100644
> --- a/target/i386/hax-all.c
> +++ b/target/i386/hax-all.c
> @@ -887,9 +887,6 @@ static int hax_sync_vcpu_register(CPUArchState *env, int set)
>              return -1;
>          }
>      }
> -    if (!set) {
> -        hax_setup_qemu_emulator(env);
> -    }
>      return 0;
>  }
>  
> @@ -1070,6 +1067,7 @@ static int hax_arch_get_registers(CPUArchState *env)
>          return ret;
>      }
>  
> +    hax_setup_qemu_emulator(env);
>      return 0;
>  }
>  
> 

Queued, thanks.

Please look into sharing the similar code in target/i386/kvm.c
(kvm_get_sregs), since the HAX code has some bugs (for example,
HF_CPL_MASK should be SS.DPL, not CS.DPL).

Paolo

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH] target/i386: hax: Move hax_setup_qemu_emulator.
  2018-01-10 13:27 ` Paolo Bonzini
@ 2018-01-10 18:05   ` Tao Wu(吴涛@Eng)
  0 siblings, 0 replies; 7+ messages in thread
From: Tao Wu(吴涛@Eng) @ 2018-01-10 18:05 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: QEMU, rth, ehabkost

Thanks. Then it seems I should put this piece of code in a common
function first and then update this CL.

On Wed, Jan 10, 2018 at 5:27 AM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> On 10/01/2018 07:47, Tao Wu wrote:
>> hax_setup_qemu_emulator reference env->efer which is updated in
>> hax_get_msrs, so it has to be called after hax_get_msrs. This fix
>> the bug that sometimes dump_state show 32 bits regs even in 64 bits
>> mode.
>>
>> Signed-off-by: Tao Wu <lepton@google.com>
>> ---
>>  target/i386/hax-all.c | 4 +---
>>  1 file changed, 1 insertion(+), 3 deletions(-)
>>
>> diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c
>> index 3ce6950296..a933bd462d 100644
>> --- a/target/i386/hax-all.c
>> +++ b/target/i386/hax-all.c
>> @@ -887,9 +887,6 @@ static int hax_sync_vcpu_register(CPUArchState *env, int set)
>>              return -1;
>>          }
>>      }
>> -    if (!set) {
>> -        hax_setup_qemu_emulator(env);
>> -    }
>>      return 0;
>>  }
>>
>> @@ -1070,6 +1067,7 @@ static int hax_arch_get_registers(CPUArchState *env)
>>          return ret;
>>      }
>>
>> +    hax_setup_qemu_emulator(env);
>>      return 0;
>>  }
>>
>>
>
> Queued, thanks.
>
> Please look into sharing the similar code in target/i386/kvm.c
> (kvm_get_sregs), since the HAX code has some bugs (for example,
> HF_CPL_MASK should be SS.DPL, not CS.DPL).
>
> Paolo

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function
  2018-01-10  6:47 [Qemu-devel] [PATCH] target/i386: hax: Move hax_setup_qemu_emulator Tao Wu
  2018-01-10 13:27 ` Paolo Bonzini
@ 2018-01-10 19:50 ` Tao Wu
  2018-01-10 19:50   ` [Qemu-devel] [PATCH v2 2/3] target/i386: hax: change to use x86_update_hflags Tao Wu
                     ` (2 more replies)
  1 sibling, 3 replies; 7+ messages in thread
From: Tao Wu @ 2018-01-10 19:50 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, rth, ehabkost, Tao Wu

We will share the same code for hax/kvm.

Signed-off-by: Tao Wu <lepton@google.com>
---
 target/i386/Makefile.objs |  2 +-
 target/i386/common_i386.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++
 target/i386/common_i386.h | 14 +++++++++++++
 target/i386/kvm.c         | 41 ++------------------------------------
 4 files changed, 67 insertions(+), 40 deletions(-)
 create mode 100644 target/i386/common_i386.c
 create mode 100644 target/i386/common_i386.h

diff --git a/target/i386/Makefile.objs b/target/i386/Makefile.objs
index 44103a693b..072d502954 100644
--- a/target/i386/Makefile.objs
+++ b/target/i386/Makefile.objs
@@ -1,4 +1,4 @@
-obj-y += helper.o cpu.o gdbstub.o xsave_helper.o
+obj-y += helper.o cpu.o gdbstub.o xsave_helper.o common_i386.o
 obj-$(CONFIG_TCG) += translate.o
 obj-$(CONFIG_TCG) += bpt_helper.o cc_helper.o excp_helper.o fpu_helper.o
 obj-$(CONFIG_TCG) += int_helper.o mem_helper.o misc_helper.o mpx_helper.o
diff --git a/target/i386/common_i386.c b/target/i386/common_i386.c
new file mode 100644
index 0000000000..285d8bfa48
--- /dev/null
+++ b/target/i386/common_i386.c
@@ -0,0 +1,50 @@
+/*
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "common_i386.h"
+
+void x86_update_hflags(CPUX86State *env)
+{
+   uint32_t hflags;
+#define HFLAG_COPY_MASK \
+    ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
+       HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
+       HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
+       HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
+
+    hflags = env->hflags & HFLAG_COPY_MASK;
+    hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
+    hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
+    hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
+                (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
+    hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
+
+    if (env->cr[4] & CR4_OSFXSR_MASK) {
+        hflags |= HF_OSFXSR_MASK;
+    }
+
+    if (env->efer & MSR_EFER_LMA) {
+        hflags |= HF_LMA_MASK;
+    }
+
+    if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
+        hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
+    } else {
+        hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
+                    (DESC_B_SHIFT - HF_CS32_SHIFT);
+        hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
+                    (DESC_B_SHIFT - HF_SS32_SHIFT);
+        if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
+            !(hflags & HF_CS32_MASK)) {
+            hflags |= HF_ADDSEG_MASK;
+        } else {
+            hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
+                        env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
+        }
+    }
+    env->hflags = hflags;
+
+    return;
+}
diff --git a/target/i386/common_i386.h b/target/i386/common_i386.h
new file mode 100644
index 0000000000..ed2471de62
--- /dev/null
+++ b/target/i386/common_i386.h
@@ -0,0 +1,14 @@
+/* 
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef TARGET_I386_COMMON_I386_H
+#define TARGET_I386_COMMON_I386_H
+
+#include "qemu/osdep.h"
+#include "cpu.h"
+
+void x86_update_hflags(CPUX86State* env);
+
+#endif
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 6f69e2fcfd..f197eaf5c6 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -25,6 +25,7 @@
 #include "sysemu/sysemu.h"
 #include "sysemu/hw_accel.h"
 #include "sysemu/kvm_int.h"
+#include "common_i386.h"
 #include "kvm_i386.h"
 #include "hyperv.h"
 #include "hyperv-proto.h"
@@ -1877,7 +1878,6 @@ static int kvm_get_sregs(X86CPU *cpu)
 {
     CPUX86State *env = &cpu->env;
     struct kvm_sregs sregs;
-    uint32_t hflags;
     int bit, i, ret;
 
     ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_SREGS, &sregs);
@@ -1919,44 +1919,7 @@ static int kvm_get_sregs(X86CPU *cpu)
     env->efer = sregs.efer;
 
     /* changes to apic base and cr8/tpr are read back via kvm_arch_post_run */
-
-#define HFLAG_COPY_MASK \
-    ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
-       HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
-       HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
-       HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
-
-    hflags = env->hflags & HFLAG_COPY_MASK;
-    hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
-    hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
-    hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
-                (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
-    hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
-
-    if (env->cr[4] & CR4_OSFXSR_MASK) {
-        hflags |= HF_OSFXSR_MASK;
-    }
-
-    if (env->efer & MSR_EFER_LMA) {
-        hflags |= HF_LMA_MASK;
-    }
-
-    if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
-        hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
-    } else {
-        hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
-                    (DESC_B_SHIFT - HF_CS32_SHIFT);
-        hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
-                    (DESC_B_SHIFT - HF_SS32_SHIFT);
-        if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
-            !(hflags & HF_CS32_MASK)) {
-            hflags |= HF_ADDSEG_MASK;
-        } else {
-            hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
-                        env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
-        }
-    }
-    env->hflags = hflags;
+    x86_update_hflags(env);
 
     return 0;
 }
-- 
2.16.0.rc1.238.g530d649a79-goog

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [Qemu-devel] [PATCH v2 2/3] target/i386: hax: change to use x86_update_hflags
  2018-01-10 19:50 ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Tao Wu
@ 2018-01-10 19:50   ` Tao Wu
  2018-01-10 19:50   ` [Qemu-devel] [PATCH v2 3/3] target/i386: hax: Move x86_update_hflags Tao Wu
  2018-01-11 13:16   ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Paolo Bonzini
  2 siblings, 0 replies; 7+ messages in thread
From: Tao Wu @ 2018-01-10 19:50 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, rth, ehabkost, Tao Wu

Change to use x86_update_hflags instead of keeping another copy
at hax side. This also fix bug like HF_CPL_MASK should be SS.DPL,
not CS.DPL.

Signed-off-by: Tao Wu <lepton@google.com>
---
 target/i386/hax-all.c | 53 ++-------------------------------------------------
 1 file changed, 2 insertions(+), 51 deletions(-)

diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c
index 3ce6950296..dc379373f7 100644
--- a/target/i386/hax-all.c
+++ b/target/i386/hax-all.c
@@ -31,6 +31,7 @@
 
 #include "qemu-common.h"
 #include "strings.h"
+#include "common_i386.h"
 #include "hax-i386.h"
 #include "sysemu/accel.h"
 #include "sysemu/sysemu.h"
@@ -782,56 +783,6 @@ static int hax_set_segments(CPUArchState *env, struct vcpu_state_t *sregs)
     return 0;
 }
 
-/*
- * After get the state from the kernel module, some
- * qemu emulator state need be updated also
- */
-static int hax_setup_qemu_emulator(CPUArchState *env)
-{
-
-#define HFLAG_COPY_MASK (~( \
-  HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
-  HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
-  HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
-  HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK))
-
-    uint32_t hflags;
-
-    hflags = (env->segs[R_CS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
-    hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
-    hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
-        (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
-    hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
-    hflags |= (env->cr[4] & CR4_OSFXSR_MASK) <<
-              (HF_OSFXSR_SHIFT - CR4_OSFXSR_SHIFT);
-
-    if (env->efer & MSR_EFER_LMA) {
-        hflags |= HF_LMA_MASK;
-    }
-
-    if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
-        hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
-    } else {
-        hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
-            (DESC_B_SHIFT - HF_CS32_SHIFT);
-        hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
-            (DESC_B_SHIFT - HF_SS32_SHIFT);
-        if (!(env->cr[0] & CR0_PE_MASK) ||
-            (env->eflags & VM_MASK) || !(hflags & HF_CS32_MASK)) {
-            hflags |= HF_ADDSEG_MASK;
-        } else {
-            hflags |= ((env->segs[R_DS].base |
-                        env->segs[R_ES].base |
-                        env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
-        }
-    }
-
-    hflags &= ~HF_SMM_MASK;
-
-    env->hflags = (env->hflags & HFLAG_COPY_MASK) | hflags;
-    return 0;
-}
-
 static int hax_sync_vcpu_register(CPUArchState *env, int set)
 {
     struct vcpu_state_t regs;
@@ -888,7 +839,7 @@ static int hax_sync_vcpu_register(CPUArchState *env, int set)
         }
     }
     if (!set) {
-        hax_setup_qemu_emulator(env);
+        x86_update_hflags(env);
     }
     return 0;
 }
-- 
2.16.0.rc1.238.g530d649a79-goog

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [Qemu-devel] [PATCH v2 3/3] target/i386: hax: Move x86_update_hflags.
  2018-01-10 19:50 ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Tao Wu
  2018-01-10 19:50   ` [Qemu-devel] [PATCH v2 2/3] target/i386: hax: change to use x86_update_hflags Tao Wu
@ 2018-01-10 19:50   ` Tao Wu
  2018-01-11 13:16   ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Paolo Bonzini
  2 siblings, 0 replies; 7+ messages in thread
From: Tao Wu @ 2018-01-10 19:50 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, rth, ehabkost, Tao Wu

x86_update_hflags reference env->efer which is updated in hax_get_msrs,
so it has to be called after hax_get_msrs. This fix the bug that sometimes
dump_state show 32 bits regs even in 64 bits mode.

Signed-off-by: Tao Wu <lepton@google.com>
---
 target/i386/hax-all.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/target/i386/hax-all.c b/target/i386/hax-all.c
index dc379373f7..5a4a5025b9 100644
--- a/target/i386/hax-all.c
+++ b/target/i386/hax-all.c
@@ -838,9 +838,6 @@ static int hax_sync_vcpu_register(CPUArchState *env, int set)
             return -1;
         }
     }
-    if (!set) {
-        x86_update_hflags(env);
-    }
     return 0;
 }
 
@@ -1021,6 +1018,7 @@ static int hax_arch_get_registers(CPUArchState *env)
         return ret;
     }
 
+    x86_update_hflags(env);
     return 0;
 }
 
-- 
2.16.0.rc1.238.g530d649a79-goog

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function
  2018-01-10 19:50 ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Tao Wu
  2018-01-10 19:50   ` [Qemu-devel] [PATCH v2 2/3] target/i386: hax: change to use x86_update_hflags Tao Wu
  2018-01-10 19:50   ` [Qemu-devel] [PATCH v2 3/3] target/i386: hax: Move x86_update_hflags Tao Wu
@ 2018-01-11 13:16   ` Paolo Bonzini
  2 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2018-01-11 13:16 UTC (permalink / raw)
  To: Tao Wu, qemu-devel; +Cc: rth, ehabkost

On 10/01/2018 20:50, Tao Wu wrote:
> We will share the same code for hax/kvm.
> 
> Signed-off-by: Tao Wu <lepton@google.com>

Merged, thanks.

Paolo

> ---
>  target/i386/Makefile.objs |  2 +-
>  target/i386/common_i386.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++
>  target/i386/common_i386.h | 14 +++++++++++++
>  target/i386/kvm.c         | 41 ++------------------------------------
>  4 files changed, 67 insertions(+), 40 deletions(-)
>  create mode 100644 target/i386/common_i386.c
>  create mode 100644 target/i386/common_i386.h
> 
> diff --git a/target/i386/Makefile.objs b/target/i386/Makefile.objs
> index 44103a693b..072d502954 100644
> --- a/target/i386/Makefile.objs
> +++ b/target/i386/Makefile.objs
> @@ -1,4 +1,4 @@
> -obj-y += helper.o cpu.o gdbstub.o xsave_helper.o
> +obj-y += helper.o cpu.o gdbstub.o xsave_helper.o common_i386.o
>  obj-$(CONFIG_TCG) += translate.o
>  obj-$(CONFIG_TCG) += bpt_helper.o cc_helper.o excp_helper.o fpu_helper.o
>  obj-$(CONFIG_TCG) += int_helper.o mem_helper.o misc_helper.o mpx_helper.o
> diff --git a/target/i386/common_i386.c b/target/i386/common_i386.c
> new file mode 100644
> index 0000000000..285d8bfa48
> --- /dev/null
> +++ b/target/i386/common_i386.c
> @@ -0,0 +1,50 @@
> +/*
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#include "common_i386.h"
> +
> +void x86_update_hflags(CPUX86State *env)
> +{
> +   uint32_t hflags;
> +#define HFLAG_COPY_MASK \
> +    ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
> +       HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
> +       HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
> +       HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
> +
> +    hflags = env->hflags & HFLAG_COPY_MASK;
> +    hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
> +    hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
> +    hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
> +                (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
> +    hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
> +
> +    if (env->cr[4] & CR4_OSFXSR_MASK) {
> +        hflags |= HF_OSFXSR_MASK;
> +    }
> +
> +    if (env->efer & MSR_EFER_LMA) {
> +        hflags |= HF_LMA_MASK;
> +    }
> +
> +    if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
> +        hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
> +    } else {
> +        hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
> +                    (DESC_B_SHIFT - HF_CS32_SHIFT);
> +        hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
> +                    (DESC_B_SHIFT - HF_SS32_SHIFT);
> +        if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
> +            !(hflags & HF_CS32_MASK)) {
> +            hflags |= HF_ADDSEG_MASK;
> +        } else {
> +            hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
> +                        env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
> +        }
> +    }
> +    env->hflags = hflags;
> +
> +    return;
> +}
> diff --git a/target/i386/common_i386.h b/target/i386/common_i386.h
> new file mode 100644
> index 0000000000..ed2471de62
> --- /dev/null
> +++ b/target/i386/common_i386.h
> @@ -0,0 +1,14 @@
> +/* 
> + * This work is licensed under the terms of the GNU GPL, version 2 or later.
> + * See the COPYING file in the top-level directory.
> + */
> +
> +#ifndef TARGET_I386_COMMON_I386_H
> +#define TARGET_I386_COMMON_I386_H
> +
> +#include "qemu/osdep.h"
> +#include "cpu.h"
> +
> +void x86_update_hflags(CPUX86State* env);
> +
> +#endif
> diff --git a/target/i386/kvm.c b/target/i386/kvm.c
> index 6f69e2fcfd..f197eaf5c6 100644
> --- a/target/i386/kvm.c
> +++ b/target/i386/kvm.c
> @@ -25,6 +25,7 @@
>  #include "sysemu/sysemu.h"
>  #include "sysemu/hw_accel.h"
>  #include "sysemu/kvm_int.h"
> +#include "common_i386.h"
>  #include "kvm_i386.h"
>  #include "hyperv.h"
>  #include "hyperv-proto.h"
> @@ -1877,7 +1878,6 @@ static int kvm_get_sregs(X86CPU *cpu)
>  {
>      CPUX86State *env = &cpu->env;
>      struct kvm_sregs sregs;
> -    uint32_t hflags;
>      int bit, i, ret;
>  
>      ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_SREGS, &sregs);
> @@ -1919,44 +1919,7 @@ static int kvm_get_sregs(X86CPU *cpu)
>      env->efer = sregs.efer;
>  
>      /* changes to apic base and cr8/tpr are read back via kvm_arch_post_run */
> -
> -#define HFLAG_COPY_MASK \
> -    ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
> -       HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
> -       HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
> -       HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
> -
> -    hflags = env->hflags & HFLAG_COPY_MASK;
> -    hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
> -    hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
> -    hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
> -                (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
> -    hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
> -
> -    if (env->cr[4] & CR4_OSFXSR_MASK) {
> -        hflags |= HF_OSFXSR_MASK;
> -    }
> -
> -    if (env->efer & MSR_EFER_LMA) {
> -        hflags |= HF_LMA_MASK;
> -    }
> -
> -    if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
> -        hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
> -    } else {
> -        hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
> -                    (DESC_B_SHIFT - HF_CS32_SHIFT);
> -        hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
> -                    (DESC_B_SHIFT - HF_SS32_SHIFT);
> -        if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
> -            !(hflags & HF_CS32_MASK)) {
> -            hflags |= HF_ADDSEG_MASK;
> -        } else {
> -            hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
> -                        env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
> -        }
> -    }
> -    env->hflags = hflags;
> +    x86_update_hflags(env);
>  
>      return 0;
>  }
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-01-11 13:17 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-10  6:47 [Qemu-devel] [PATCH] target/i386: hax: Move hax_setup_qemu_emulator Tao Wu
2018-01-10 13:27 ` Paolo Bonzini
2018-01-10 18:05   ` Tao Wu(吴涛@Eng)
2018-01-10 19:50 ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Tao Wu
2018-01-10 19:50   ` [Qemu-devel] [PATCH v2 2/3] target/i386: hax: change to use x86_update_hflags Tao Wu
2018-01-10 19:50   ` [Qemu-devel] [PATCH v2 3/3] target/i386: hax: Move x86_update_hflags Tao Wu
2018-01-11 13:16   ` [Qemu-devel] [PATCH v2 1/3] target/i386: move hflags update code to a function Paolo Bonzini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.