All of lore.kernel.org
 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 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.