qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/6] target-i386:do some cleanups
@ 2013-04-19  2:52 liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP liguang
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: liguang @ 2013-04-19  2:52 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: blauwirbel, pbonzini, aliguori, afaerber, liguang

here are some cleanups

Li Guang (6)
	 target-i386/seg_helper: replace env->eip with EIP
	 target-i386/smm_helper: replace env->eip with EIP
	 target-i386/svm_helper: replace env->eip with EIP
	 target-i386/svm_helper: remove redundant assignment
	 target-i386/seg_helper: refactor 4 helper functions
	 target-i386/seg_helper: define names for code/data segment types

target-i386/seg_helper.c | 296 +++++++++++++++++++++++-----------------------
target-i386/smm_helper.c | 10 +++++-----
target-i386/svm_helper.c | 6 +++---
3 files changed, 139 insertions(+), 174 deletions(-)

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

* [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP
  2013-04-19  2:52 [Qemu-devel] [PATCH 0/6] target-i386:do some cleanups liguang
@ 2013-04-19  2:52 ` liguang
  2013-04-19  7:48   ` Richard Henderson
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 2/6] target-i386/smm_helper: " liguang
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: liguang @ 2013-04-19  2:52 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: blauwirbel, pbonzini, aliguori, afaerber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 target-i386/seg_helper.c |   46 +++++++++++++++++++++++-----------------------
 1 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
index 906e4f3..5f7f99d 100644
--- a/target-i386/seg_helper.c
+++ b/target-i386/seg_helper.c
@@ -388,7 +388,7 @@ static void switch_tss(CPUX86State *env, int tss_selector,
 
     /* load all registers without an exception, then reload them with
        possible exception */
-    env->eip = new_eip;
+    EIP = new_eip;
     eflags_mask = TF_MASK | AC_MASK | ID_MASK |
         IF_MASK | IOPL_MASK | VM_MASK | RF_MASK | NT_MASK;
     if (!(type & 8)) {
@@ -567,7 +567,7 @@ static void do_interrupt_protected(CPUX86State *env, int intno, int is_int,
     if (is_int) {
         old_eip = next_eip;
     } else {
-        old_eip = env->eip;
+        old_eip = EIP;
     }
 
     dt = &env->idt;
@@ -755,7 +755,7 @@ static void do_interrupt_protected(CPUX86State *env, int intno, int is_int,
                    get_seg_limit(e1, e2),
                    e2);
     cpu_x86_set_cpl(env, dpl);
-    env->eip = offset;
+    EIP = offset;
 
     /* interrupt gate clear IF mask */
     if ((type & 1) == 0) {
@@ -815,7 +815,7 @@ static void do_interrupt64(CPUX86State *env, int intno, int is_int,
     if (is_int) {
         old_eip = next_eip;
     } else {
-        old_eip = env->eip;
+        old_eip = EIP;
     }
 
     dt = &env->idt;
@@ -919,7 +919,7 @@ static void do_interrupt64(CPUX86State *env, int intno, int is_int,
                    get_seg_limit(e1, e2),
                    e2);
     cpu_x86_set_cpl(env, dpl);
-    env->eip = offset;
+    EIP = offset;
 
     /* interrupt gate clear IF mask */
     if ((type & 1) == 0) {
@@ -934,7 +934,7 @@ static void do_interrupt64(CPUX86State *env, int intno, int is_int,
 void helper_syscall(CPUX86State *env, int next_eip_addend)
 {
     env->exception_index = EXCP_SYSCALL;
-    env->exception_next_eip = env->eip + next_eip_addend;
+    env->exception_next_eip = EIP + next_eip_addend;
     cpu_loop_exit(env);
 }
 #else
@@ -949,7 +949,7 @@ void helper_syscall(CPUX86State *env, int next_eip_addend)
     if (env->hflags & HF_LMA_MASK) {
         int code64;
 
-        ECX = env->eip + next_eip_addend;
+        ECX = EIP + next_eip_addend;
         env->regs[11] = cpu_compute_eflags(env);
 
         code64 = env->hflags & HF_CS64_MASK;
@@ -969,12 +969,12 @@ void helper_syscall(CPUX86State *env, int next_eip_addend)
         env->eflags &= ~env->fmask;
         cpu_load_eflags(env, env->eflags, 0);
         if (code64) {
-            env->eip = env->lstar;
+            EIP = env->lstar;
         } else {
-            env->eip = env->cstar;
+            EIP = env->cstar;
         }
     } else {
-        ECX = (uint32_t)(env->eip + next_eip_addend);
+        ECX = (uint32_t)(EIP + next_eip_addend);
 
         cpu_x86_set_cpl(env, 0);
         cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc,
@@ -988,7 +988,7 @@ void helper_syscall(CPUX86State *env, int next_eip_addend)
                                DESC_S_MASK |
                                DESC_W_MASK | DESC_A_MASK);
         env->eflags &= ~(IF_MASK | RF_MASK | VM_MASK);
-        env->eip = (uint32_t)env->star;
+        EIP = (uint32_t)env->star;
     }
 }
 #endif
@@ -1015,14 +1015,14 @@ void helper_sysret(CPUX86State *env, int dflag)
                                    DESC_S_MASK | (3 << DESC_DPL_SHIFT) |
                                    DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK |
                                    DESC_L_MASK);
-            env->eip = ECX;
+            EIP = ECX;
         } else {
             cpu_x86_load_seg_cache(env, R_CS, selector | 3,
                                    0, 0xffffffff,
                                    DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
                                    DESC_S_MASK | (3 << DESC_DPL_SHIFT) |
                                    DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK);
-            env->eip = (uint32_t)ECX;
+            EIP = (uint32_t)ECX;
         }
         cpu_x86_load_seg_cache(env, R_SS, selector + 8,
                                0, 0xffffffff,
@@ -1039,7 +1039,7 @@ void helper_sysret(CPUX86State *env, int dflag)
                                DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
                                DESC_S_MASK | (3 << DESC_DPL_SHIFT) |
                                DESC_CS_MASK | DESC_R_MASK | DESC_A_MASK);
-        env->eip = (uint32_t)ECX;
+        EIP = (uint32_t)ECX;
         cpu_x86_load_seg_cache(env, R_SS, selector + 8,
                                0, 0xffffffff,
                                DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
@@ -1074,7 +1074,7 @@ static void do_interrupt_real(CPUX86State *env, int intno, int is_int,
     if (is_int) {
         old_eip = next_eip;
     } else {
-        old_eip = env->eip;
+        old_eip = EIP;
     }
     old_cs = env->segs[R_CS].selector;
     /* XXX: use SS segment size? */
@@ -1084,7 +1084,7 @@ static void do_interrupt_real(CPUX86State *env, int intno, int is_int,
 
     /* update processor state */
     ESP = (ESP & ~0xffff) | (esp & 0xffff);
-    env->eip = offset;
+    EIP = offset;
     env->segs[R_CS].selector = selector;
     env->segs[R_CS].base = (selector << 4);
     env->eflags &= ~(IF_MASK | TF_MASK | AC_MASK | RF_MASK);
@@ -1185,7 +1185,7 @@ static void do_interrupt_all(CPUX86State *env, int intno, int is_int,
                 target_ulong ptr;
 
                 qemu_log("       code=");
-                ptr = env->segs[R_CS].base + env->eip;
+                ptr = env->segs[R_CS].base + EIP;
                 for (i = 0; i < 16; i++) {
                     qemu_log(" %02x", ldub(ptr + i));
                 }
@@ -1596,7 +1596,7 @@ void helper_ljmp_protected(CPUX86State *env, int new_cs, target_ulong new_eip,
             if (dpl < cpl || dpl < rpl) {
                 raise_exception_err(env, EXCP0D_GPF, new_cs & 0xfffc);
             }
-            next_eip = env->eip + next_eip_addend;
+            next_eip = EIP + next_eip_addend;
             switch_tss(env, new_cs, e1, e2, SWITCH_TSS_JMP, next_eip);
             CC_OP = CC_OP_EFLAGS;
             break;
@@ -1665,7 +1665,7 @@ void helper_lcall_real(CPUX86State *env, int new_cs, target_ulong new_eip1,
     }
 
     SET_ESP(esp, esp_mask);
-    env->eip = new_eip;
+    EIP = new_eip;
     env->segs[R_CS].selector = new_cs;
     env->segs[R_CS].base = (new_cs << 4);
 }
@@ -1680,7 +1680,7 @@ void helper_lcall_protected(CPUX86State *env, int new_cs, target_ulong new_eip,
     uint32_t val, limit, old_sp_mask;
     target_ulong ssp, old_ssp, next_eip;
 
-    next_eip = env->eip + next_eip_addend;
+    next_eip = EIP + next_eip_addend;
     LOG_PCALL("lcall %04x:%08x s=%d\n", new_cs, (uint32_t)new_eip, shift);
     LOG_PCALL_STATE(env);
     if ((new_cs & 0xfffc) == 0) {
@@ -1922,7 +1922,7 @@ void helper_iret_real(CPUX86State *env, int shift)
     ESP = (ESP & ~sp_mask) | (sp & sp_mask);
     env->segs[R_CS].selector = new_cs;
     env->segs[R_CS].base = (new_cs << 4);
-    env->eip = new_eip;
+    EIP = new_eip;
     if (env->eflags & VM_MASK) {
         eflags_mask = TF_MASK | AC_MASK | ID_MASK | IF_MASK | RF_MASK |
             NT_MASK;
@@ -2140,7 +2140,7 @@ static inline void helper_ret_protected(CPUX86State *env, int shift,
         sp += addend;
     }
     SET_ESP(sp, sp_mask);
-    env->eip = new_eip;
+    EIP = new_eip;
     if (is_iret) {
         /* NOTE: 'cpl' is the _old_ CPL */
         eflags_mask = TF_MASK | AC_MASK | ID_MASK | RF_MASK | NT_MASK;
@@ -2178,7 +2178,7 @@ static inline void helper_ret_protected(CPUX86State *env, int shift,
     load_seg_vm(env, R_FS, new_fs & 0xffff);
     load_seg_vm(env, R_GS, new_gs & 0xffff);
 
-    env->eip = new_eip & 0xffff;
+    EIP = new_eip & 0xffff;
     ESP = new_esp;
 }
 
-- 
1.7.2.5

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

* [Qemu-devel] [PATCH 2/6] target-i386/smm_helper: replace env->eip with EIP
  2013-04-19  2:52 [Qemu-devel] [PATCH 0/6] target-i386:do some cleanups liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP liguang
@ 2013-04-19  2:52 ` liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 3/6] target-i386/svm_helper: " liguang
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-04-19  2:52 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: blauwirbel, pbonzini, aliguori, afaerber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 target-i386/smm_helper.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/target-i386/smm_helper.c b/target-i386/smm_helper.c
index eea2fe9..ba79075 100644
--- a/target-i386/smm_helper.c
+++ b/target-i386/smm_helper.c
@@ -93,7 +93,7 @@ void do_smm_enter(CPUX86State *env)
     for (i = 8; i < 16; i++) {
         stq_phys(sm_state + 0x7ff8 - i * 8, env->regs[i]);
     }
-    stq_phys(sm_state + 0x7f78, env->eip);
+    stq_phys(sm_state + 0x7f78, EIP);
     stl_phys(sm_state + 0x7f70, cpu_compute_eflags(env));
     stl_phys(sm_state + 0x7f68, env->dr[6]);
     stl_phys(sm_state + 0x7f60, env->dr[7]);
@@ -108,7 +108,7 @@ void do_smm_enter(CPUX86State *env)
     stl_phys(sm_state + 0x7ffc, env->cr[0]);
     stl_phys(sm_state + 0x7ff8, env->cr[3]);
     stl_phys(sm_state + 0x7ff4, cpu_compute_eflags(env));
-    stl_phys(sm_state + 0x7ff0, env->eip);
+    stl_phys(sm_state + 0x7ff0, EIP);
     stl_phys(sm_state + 0x7fec, EDI);
     stl_phys(sm_state + 0x7fe8, ESI);
     stl_phys(sm_state + 0x7fe4, EBP);
@@ -160,7 +160,7 @@ void do_smm_enter(CPUX86State *env)
 #endif
     cpu_load_eflags(env, 0, ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C |
                               DF_MASK));
-    env->eip = 0x00008000;
+    EIP = 0x00008000;
     cpu_x86_load_seg_cache(env, R_CS, (env->smbase >> 4) & 0xffff, env->smbase,
                            0xffffffff, 0);
     cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffffffff, 0);
@@ -224,7 +224,7 @@ void helper_rsm(CPUX86State *env)
     for (i = 8; i < 16; i++) {
         env->regs[i] = ldq_phys(sm_state + 0x7ff8 - i * 8);
     }
-    env->eip = ldq_phys(sm_state + 0x7f78);
+    EIP = ldq_phys(sm_state + 0x7f78);
     cpu_load_eflags(env, ldl_phys(sm_state + 0x7f70),
                     ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
     env->dr[6] = ldl_phys(sm_state + 0x7f68);
@@ -243,7 +243,7 @@ void helper_rsm(CPUX86State *env)
     cpu_x86_update_cr3(env, ldl_phys(sm_state + 0x7ff8));
     cpu_load_eflags(env, ldl_phys(sm_state + 0x7ff4),
                     ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
-    env->eip = ldl_phys(sm_state + 0x7ff0);
+    EIP = ldl_phys(sm_state + 0x7ff0);
     EDI = ldl_phys(sm_state + 0x7fec);
     ESI = ldl_phys(sm_state + 0x7fe8);
     EBP = ldl_phys(sm_state + 0x7fe4);
-- 
1.7.2.5

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

* [Qemu-devel] [PATCH 3/6] target-i386/svm_helper: replace env->eip with EIP
  2013-04-19  2:52 [Qemu-devel] [PATCH 0/6] target-i386:do some cleanups liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 2/6] target-i386/smm_helper: " liguang
@ 2013-04-19  2:52 ` liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 4/6] target-i386/svm_helper: remove redundant assignment liguang
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-04-19  2:52 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: blauwirbel, pbonzini, aliguori, afaerber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 target-i386/svm_helper.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/target-i386/svm_helper.c b/target-i386/svm_helper.c
index c46a213..f9ffd18 100644
--- a/target-i386/svm_helper.c
+++ b/target-i386/svm_helper.c
@@ -249,7 +249,7 @@ void helper_vmrun(CPUX86State *env, int aflag, int next_eip_addend)
                        R_DS);
 
     EIP = ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rip));
-    env->eip = EIP;
+    EIP = EIP;
     ESP = ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rsp));
     EAX = ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rax));
     env->dr[7] = ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.dr7));
@@ -541,7 +541,7 @@ void helper_svm_check_io(CPUX86State *env, uint32_t port, uint32_t param,
         if (lduw_phys(addr + port / 8) & (mask << (port & 7))) {
             /* next EIP */
             stq_phys(env->vm_vmcb + offsetof(struct vmcb, control.exit_info_2),
-                     env->eip + next_eip_addend);
+                     EIP + next_eip_addend);
             helper_vmexit(env, SVM_EXIT_IOIO, param | (port << 16));
         }
     }
@@ -605,7 +605,7 @@ void helper_vmexit(CPUX86State *env, uint32_t exit_code, uint64_t exit_info_1)
     stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rflags),
              cpu_compute_eflags(env));
     stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rip),
-             env->eip);
+             EIP);
     stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rsp), ESP);
     stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rax), EAX);
     stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.dr7), env->dr[7]);
-- 
1.7.2.5

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

* [Qemu-devel] [PATCH 4/6] target-i386/svm_helper: remove redundant assignment
  2013-04-19  2:52 [Qemu-devel] [PATCH 0/6] target-i386:do some cleanups liguang
                   ` (2 preceding siblings ...)
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 3/6] target-i386/svm_helper: " liguang
@ 2013-04-19  2:52 ` liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 5/6] target-i386/seg_helper: refactor 4 helper functions liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 6/6] target-i386/seg_helper: define names for code/data segment types liguang
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-04-19  2:52 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: blauwirbel, pbonzini, aliguori, afaerber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 target-i386/svm_helper.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/target-i386/svm_helper.c b/target-i386/svm_helper.c
index f9ffd18..393b126 100644
--- a/target-i386/svm_helper.c
+++ b/target-i386/svm_helper.c
@@ -249,7 +249,6 @@ void helper_vmrun(CPUX86State *env, int aflag, int next_eip_addend)
                        R_DS);
 
     EIP = ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rip));
-    EIP = EIP;
     ESP = ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rsp));
     EAX = ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rax));
     env->dr[7] = ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.dr7));
-- 
1.7.2.5

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

* [Qemu-devel] [PATCH 5/6] target-i386/seg_helper: refactor 4 helper functions
  2013-04-19  2:52 [Qemu-devel] [PATCH 0/6] target-i386:do some cleanups liguang
                   ` (3 preceding siblings ...)
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 4/6] target-i386/svm_helper: remove redundant assignment liguang
@ 2013-04-19  2:52 ` liguang
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 6/6] target-i386/seg_helper: define names for code/data segment types liguang
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-04-19  2:52 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: blauwirbel, pbonzini, aliguori, afaerber, liguang

for helper_{lsl, lar, verr, verw}, there are
common parts, so move them outside, and then
call this new helper-helper function.

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 target-i386/seg_helper.c |  179 ++++++++++++++-------------------------------
 1 files changed, 56 insertions(+), 123 deletions(-)

diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
index 5f7f99d..635c5ab 100644
--- a/target-i386/seg_helper.c
+++ b/target-i386/seg_helper.c
@@ -2292,9 +2292,10 @@ void helper_sysexit(CPUX86State *env, int dflag)
     EIP = EDX;
 }
 
-target_ulong helper_lsl(CPUX86State *env, target_ulong selector1)
+
+static target_ulong misc_check_helper(CPUX86State *env, target_ulong selector1,
+                                      int inst)
 {
-    unsigned int limit;
     uint32_t e1, e2, eflags, selector;
     int rpl, dpl, cpl, type;
 
@@ -2306,14 +2307,30 @@ target_ulong helper_lsl(CPUX86State *env, target_ulong selector1)
     if (load_segment(env, &e1, &e2, selector) != 0) {
         goto fail;
     }
+
+    CC_SRC = eflags & ~CC_Z;
+
     rpl = selector & 3;
     dpl = (e2 >> DESC_DPL_SHIFT) & 3;
     cpl = env->hflags & HF_CPL_MASK;
+
     if (e2 & DESC_S_MASK) {
-        if ((e2 & DESC_CS_MASK) && (e2 & DESC_C_MASK)) {
-            /* conforming */
-        } else {
-            if (dpl < cpl || dpl < rpl) {
+        if (e2 & DESC_CS_MASK) {
+            switch (inst) {
+            case 1:
+                goto fail;
+            case 2:
+                if (!(e2 & (DESC_R_MASK | DESC_C_MASK))) {
+                    goto fail;
+                }
+                break;
+            case 3:
+            case 4:
+                if (!(e2 & DESC_C_MASK)) {
+                    goto check_pl;
+                }
+                break;
+            default:
                 goto fail;
             }
         }
@@ -2325,140 +2342,56 @@ target_ulong helper_lsl(CPUX86State *env, target_ulong selector1)
         case 3:
         case 9:
         case 11:
-            break;
+            if (inst == 3) {
+                break;
+            }
+        case 5:
+        case 12:
+            if (inst == 4) {
+                break;
+            }
         default:
             goto fail;
         }
-        if (dpl < cpl || dpl < rpl) {
-        fail:
-            CC_SRC = eflags & ~CC_Z;
-            return 0;
-        }
+        goto check_pl;
+    }
+
+    if (inst == 3) {
+        e2 &= 0x00f0ff00;
     }
-    limit = get_seg_limit(e1, e2);
+    if (inst == 4) {
+        e2 = get_seg_limit(e1, e2);
+    }
+
     CC_SRC = eflags | CC_Z;
-    return limit;
+
+check_pl:
+    if (dpl < cpl || dpl < rpl) {
+        goto fail;
+    }
+
+fail:
+    return e2;
 }
 
-target_ulong helper_lar(CPUX86State *env, target_ulong selector1)
+target_ulong helper_lsl(CPUX86State *env, target_ulong selector1)
 {
-    uint32_t e1, e2, eflags, selector;
-    int rpl, dpl, cpl, type;
+    return misc_check_helper(env, selector1, 4);
+}
 
-    selector = selector1 & 0xffff;
-    eflags = cpu_cc_compute_all(env, CC_OP);
-    if ((selector & 0xfffc) == 0) {
-        goto fail;
-    }
-    if (load_segment(env, &e1, &e2, selector) != 0) {
-        goto fail;
-    }
-    rpl = selector & 3;
-    dpl = (e2 >> DESC_DPL_SHIFT) & 3;
-    cpl = env->hflags & HF_CPL_MASK;
-    if (e2 & DESC_S_MASK) {
-        if ((e2 & DESC_CS_MASK) && (e2 & DESC_C_MASK)) {
-            /* conforming */
-        } else {
-            if (dpl < cpl || dpl < rpl) {
-                goto fail;
-            }
-        }
-    } else {
-        type = (e2 >> DESC_TYPE_SHIFT) & 0xf;
-        switch (type) {
-        case 1:
-        case 2:
-        case 3:
-        case 4:
-        case 5:
-        case 9:
-        case 11:
-        case 12:
-            break;
-        default:
-            goto fail;
-        }
-        if (dpl < cpl || dpl < rpl) {
-        fail:
-            CC_SRC = eflags & ~CC_Z;
-            return 0;
-        }
-    }
-    CC_SRC = eflags | CC_Z;
-    return e2 & 0x00f0ff00;
+target_ulong helper_lar(CPUX86State *env, target_ulong selector1)
+{
+    return misc_check_helper(env, selector1, 3);
 }
 
 void helper_verr(CPUX86State *env, target_ulong selector1)
 {
-    uint32_t e1, e2, eflags, selector;
-    int rpl, dpl, cpl;
-
-    selector = selector1 & 0xffff;
-    eflags = cpu_cc_compute_all(env, CC_OP);
-    if ((selector & 0xfffc) == 0) {
-        goto fail;
-    }
-    if (load_segment(env, &e1, &e2, selector) != 0) {
-        goto fail;
-    }
-    if (!(e2 & DESC_S_MASK)) {
-        goto fail;
-    }
-    rpl = selector & 3;
-    dpl = (e2 >> DESC_DPL_SHIFT) & 3;
-    cpl = env->hflags & HF_CPL_MASK;
-    if (e2 & DESC_CS_MASK) {
-        if (!(e2 & DESC_R_MASK)) {
-            goto fail;
-        }
-        if (!(e2 & DESC_C_MASK)) {
-            if (dpl < cpl || dpl < rpl) {
-                goto fail;
-            }
-        }
-    } else {
-        if (dpl < cpl || dpl < rpl) {
-        fail:
-            CC_SRC = eflags & ~CC_Z;
-            return;
-        }
-    }
-    CC_SRC = eflags | CC_Z;
+    misc_check_helper(env, selector1, 2);
 }
 
 void helper_verw(CPUX86State *env, target_ulong selector1)
 {
-    uint32_t e1, e2, eflags, selector;
-    int rpl, dpl, cpl;
-
-    selector = selector1 & 0xffff;
-    eflags = cpu_cc_compute_all(env, CC_OP);
-    if ((selector & 0xfffc) == 0) {
-        goto fail;
-    }
-    if (load_segment(env, &e1, &e2, selector) != 0) {
-        goto fail;
-    }
-    if (!(e2 & DESC_S_MASK)) {
-        goto fail;
-    }
-    rpl = selector & 3;
-    dpl = (e2 >> DESC_DPL_SHIFT) & 3;
-    cpl = env->hflags & HF_CPL_MASK;
-    if (e2 & DESC_CS_MASK) {
-        goto fail;
-    } else {
-        if (dpl < cpl || dpl < rpl) {
-            goto fail;
-        }
-        if (!(e2 & DESC_W_MASK)) {
-        fail:
-            CC_SRC = eflags & ~CC_Z;
-            return;
-        }
-    }
-    CC_SRC = eflags | CC_Z;
+    misc_check_helper(env, selector1, 1);
 }
 
 #if defined(CONFIG_USER_ONLY)
-- 
1.7.2.5

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

* [Qemu-devel] [PATCH 6/6] target-i386/seg_helper: define names for code/data segment types
  2013-04-19  2:52 [Qemu-devel] [PATCH 0/6] target-i386:do some cleanups liguang
                   ` (4 preceding siblings ...)
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 5/6] target-i386/seg_helper: refactor 4 helper functions liguang
@ 2013-04-19  2:52 ` liguang
  5 siblings, 0 replies; 10+ messages in thread
From: liguang @ 2013-04-19  2:52 UTC (permalink / raw)
  To: qemu-devel, peter.maydell
  Cc: blauwirbel, pbonzini, aliguori, afaerber, liguang

Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
---
 target-i386/seg_helper.c |   71 +++++++++++++++++++++++++++++++++------------
 1 files changed, 52 insertions(+), 19 deletions(-)

diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
index 635c5ab..aed5499 100644
--- a/target-i386/seg_helper.c
+++ b/target-i386/seg_helper.c
@@ -2292,6 +2292,39 @@ void helper_sysexit(CPUX86State *env, int dflag)
     EIP = EDX;
 }
 
+/*
+ * for data segment types
+ * RO -- read-only, A -- accessed,
+ * W -- write, E -- expand-down
+ */
+#define DESC_DSEG_RO 0
+#define DESC_DSEG_ROA 1
+#define DESC_DSEG_RW 2
+#define DESC_DSEG_RWA 3
+#define DESC_DSEG_ROE 4
+#define DESC_DSEG_ROEA 5
+#define DESC_DSEG_RWE 6
+#define DESC_DSEG_RWEA 7
+
+/*
+ * for code segment types
+ * EO -- execute-only, A -- accessed,
+ * C -- conforming, E -- expand-down, R -- read
+ */
+
+#define DESC_CSEG_EO 8
+#define DESC_CSEG_EOA 9
+#define DESC_CSEG_ER 10
+#define DESC_CSEG_ERA 11
+#define DESC_CSEG_EOC 12
+#define DESC_CSEG_EOCA 13
+#define DESC_CSEG_ERC 14
+#define DESC_CSEG_ERCA 15
+
+#define FUNC_LSL 4
+#define FUNC_LAR 3
+#define FUNC_VERR 2
+#define FUNC_VERW 1
 
 static target_ulong misc_check_helper(CPUX86State *env, target_ulong selector1,
                                       int inst)
@@ -2317,15 +2350,15 @@ static target_ulong misc_check_helper(CPUX86State *env, target_ulong selector1,
     if (e2 & DESC_S_MASK) {
         if (e2 & DESC_CS_MASK) {
             switch (inst) {
-            case 1:
+            case FUNC_VERW:
                 goto fail;
-            case 2:
+            case FUNC_VERR:
                 if (!(e2 & (DESC_R_MASK | DESC_C_MASK))) {
                     goto fail;
                 }
                 break;
-            case 3:
-            case 4:
+            case FUNC_LAR:
+            case FUNC_LSL:
                 if (!(e2 & DESC_C_MASK)) {
                     goto check_pl;
                 }
@@ -2337,17 +2370,17 @@ static target_ulong misc_check_helper(CPUX86State *env, target_ulong selector1,
     } else {
         type = (e2 >> DESC_TYPE_SHIFT) & 0xf;
         switch (type) {
-        case 1:
-        case 2:
-        case 3:
-        case 9:
-        case 11:
-            if (inst == 3) {
+        case DESC_DSEG_ROA:
+        case DESC_DSEG_RW:
+        case DESC_DSEG_RWA:
+        case DESC_CSEG_EOA:
+        case  DESC_CSEG_ERA:
+            if (inst == FUNC_LAR) {
                 break;
             }
-        case 5:
-        case 12:
-            if (inst == 4) {
+        case DESC_DSEG_ROEA:
+        case DESC_CSEG_EOC:
+            if (inst == FUNC_LSL) {
                 break;
             }
         default:
@@ -2356,10 +2389,10 @@ static target_ulong misc_check_helper(CPUX86State *env, target_ulong selector1,
         goto check_pl;
     }
 
-    if (inst == 3) {
+    if (inst == FUNC_LAR) {
         e2 &= 0x00f0ff00;
     }
-    if (inst == 4) {
+    if (inst == FUNC_LSL) {
         e2 = get_seg_limit(e1, e2);
     }
 
@@ -2376,22 +2409,22 @@ fail:
 
 target_ulong helper_lsl(CPUX86State *env, target_ulong selector1)
 {
-    return misc_check_helper(env, selector1, 4);
+    return misc_check_helper(env, selector1, FUNC_LSL);
 }
 
 target_ulong helper_lar(CPUX86State *env, target_ulong selector1)
 {
-    return misc_check_helper(env, selector1, 3);
+    return misc_check_helper(env, selector1, FUNC_LAR);
 }
 
 void helper_verr(CPUX86State *env, target_ulong selector1)
 {
-    misc_check_helper(env, selector1, 2);
+    misc_check_helper(env, selector1, FUNC_VERR);
 }
 
 void helper_verw(CPUX86State *env, target_ulong selector1)
 {
-    misc_check_helper(env, selector1, 1);
+    misc_check_helper(env, selector1, FUNC_VERW);
 }
 
 #if defined(CONFIG_USER_ONLY)
-- 
1.7.2.5

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

* Re: [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP
  2013-04-19  2:52 ` [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP liguang
@ 2013-04-19  7:48   ` Richard Henderson
  2013-04-19  7:55     ` li guang
  0 siblings, 1 reply; 10+ messages in thread
From: Richard Henderson @ 2013-04-19  7:48 UTC (permalink / raw)
  To: liguang; +Cc: peter.maydell, aliguori, qemu-devel, blauwirbel, pbonzini,
	afaerber

On 2013-04-19 04:52, liguang wrote:
> Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
> ---
>   target-i386/seg_helper.c |   46 +++++++++++++++++++++++-----------------------
>   1 files changed, 23 insertions(+), 23 deletions(-)
>
> diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
> index 906e4f3..5f7f99d 100644
> --- a/target-i386/seg_helper.c
> +++ b/target-i386/seg_helper.c
> @@ -388,7 +388,7 @@ static void switch_tss(CPUX86State *env, int tss_selector,
>
>       /* load all registers without an exception, then reload them with
>          possible exception */
> -    env->eip = new_eip;
> +    EIP = new_eip;

IMO this is not a cleanup, and we should in fact be doing the exact opposite,
getting rid of those silly macros.


r~

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

* Re: [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP
  2013-04-19  7:48   ` Richard Henderson
@ 2013-04-19  7:55     ` li guang
  2013-04-19  8:08       ` Richard Henderson
  0 siblings, 1 reply; 10+ messages in thread
From: li guang @ 2013-04-19  7:55 UTC (permalink / raw)
  To: Richard Henderson
  Cc: peter.maydell, aliguori, qemu-devel, blauwirbel, pbonzini,
	afaerber

在 2013-04-19五的 09:48 +0200,Richard Henderson写道:
> On 2013-04-19 04:52, liguang wrote:
> > Signed-off-by: liguang <lig.fnst@cn.fujitsu.com>
> > ---
> >   target-i386/seg_helper.c |   46 +++++++++++++++++++++++-----------------------
> >   1 files changed, 23 insertions(+), 23 deletions(-)
> >
> > diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
> > index 906e4f3..5f7f99d 100644
> > --- a/target-i386/seg_helper.c
> > +++ b/target-i386/seg_helper.c
> > @@ -388,7 +388,7 @@ static void switch_tss(CPUX86State *env, int tss_selector,
> >
> >       /* load all registers without an exception, then reload them with
> >          possible exception */
> > -    env->eip = new_eip;
> > +    EIP = new_eip;
> 
> IMO this is not a cleanup, and we should in fact be doing the exact opposite,
> getting rid of those silly macros.
> 

Yes, I have the same feeling.
do you think we can also get rid of ESP, EBP, ...?

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

* Re: [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP
  2013-04-19  7:55     ` li guang
@ 2013-04-19  8:08       ` Richard Henderson
  0 siblings, 0 replies; 10+ messages in thread
From: Richard Henderson @ 2013-04-19  8:08 UTC (permalink / raw)
  To: li guang
  Cc: peter.maydell, aliguori, qemu-devel, blauwirbel, pbonzini,
	afaerber

On 2013-04-19 09:55, li guang wrote:
> do you think we can also get rid of ESP, EBP, ...?

I don't see why not...


r~

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

end of thread, other threads:[~2013-04-19  8:08 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-19  2:52 [Qemu-devel] [PATCH 0/6] target-i386:do some cleanups liguang
2013-04-19  2:52 ` [Qemu-devel] [PATCH 1/6] target-i386/seg_helper: replace env->eip with EIP liguang
2013-04-19  7:48   ` Richard Henderson
2013-04-19  7:55     ` li guang
2013-04-19  8:08       ` Richard Henderson
2013-04-19  2:52 ` [Qemu-devel] [PATCH 2/6] target-i386/smm_helper: " liguang
2013-04-19  2:52 ` [Qemu-devel] [PATCH 3/6] target-i386/svm_helper: " liguang
2013-04-19  2:52 ` [Qemu-devel] [PATCH 4/6] target-i386/svm_helper: remove redundant assignment liguang
2013-04-19  2:52 ` [Qemu-devel] [PATCH 5/6] target-i386/seg_helper: refactor 4 helper functions liguang
2013-04-19  2:52 ` [Qemu-devel] [PATCH 6/6] target-i386/seg_helper: define names for code/data segment types liguang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).