[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 31/52] target/i386: move hflags update code to a func
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 31/52] target/i386: move hflags update code to a function |
Date: |
Fri, 12 Jan 2018 12:30:55 +0100 |
From: Tao Wu <address@hidden>
We will share the same code for hax/kvm.
Signed-off-by: Tao Wu <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
target/i386/cpu.c | 42 ++++++++++++++++++++++++++++++++++++++++++
target/i386/cpu.h | 2 ++
target/i386/kvm.c | 40 +---------------------------------------
3 files changed, 45 insertions(+), 39 deletions(-)
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 3818d72..ad8196b 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -4147,6 +4147,48 @@ static void x86_disas_set_info(CPUState *cs,
disassemble_info *info)
info->cap_insn_split = 8;
}
+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;
+}
+
static Property x86_cpu_properties[] = {
#ifdef CONFIG_USER_ONLY
/* apic_id = 0 by default for *-user, see commit 9886e834 */
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index 62c4742..f64e5ed 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -1778,4 +1778,6 @@ bool cpu_is_bsp(X86CPU *cpu);
void x86_cpu_xrstor_all_areas(X86CPU *cpu, const X86XSaveArea *buf);
void x86_cpu_xsave_all_areas(X86CPU *cpu, X86XSaveArea *buf);
+void x86_update_hflags(CPUX86State* env);
+
#endif /* I386_CPU_H */
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index d23127c..825aea5 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -1891,7 +1891,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);
@@ -1933,44 +1932,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;
}
--
1.8.3.1
- [Qemu-devel] [PULL 23/52] ucontext: annotate coroutine stack for ASAN, (continued)
- [Qemu-devel] [PULL 23/52] ucontext: annotate coroutine stack for ASAN, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 25/52] mips: fix potential fopen(NULL,...), Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 21/52] qemu-config: fix leak in query-command-line-options, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 22/52] tests: fix qmp-test leak, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 26/52] disas/s390: fix global-buffer-overflow, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 27/52] scsi-disk: release AioContext in unaligned WRITE SAME case, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 24/52] tests: fix coroutine leak in /basic/entered, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 28/52] tests/boot-serial-test: Add tests for microblaze boards, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 29/52] tests/boot-serial-test: Add a test for the moxiesim machine, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 32/52] target/i386: hax: change to use x86_update_hflags, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 31/52] target/i386: move hflags update code to a function,
Paolo Bonzini <=
- [Qemu-devel] [PULL 35/52] scripts/qemu-gdb: add simple tcg lock status helper, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 34/52] target-i386: update hflags on Hypervisor.framework, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 36/52] scripts/qemu-gdb/timers.py: new helper to dump timer state, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 33/52] target/i386: hax: Move x86_update_hflags., Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 30/52] tests/boot-serial-test: Add support for the raspi2 machine, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 37/52] icount: fixed saving/restoring of icount warp timers, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 43/52] chardev: Clean up previous patch indentation, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 38/52] cpus: unify qemu_*_wait_io_event, Paolo Bonzini, 2018/01/12
- [Qemu-devel] [PULL 39/52] irq: fix memory leak, Paolo Bonzini, 2018/01/12