* [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.