qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions
@ 2013-04-22  3:44 liguang
  2013-04-22  3:44 ` [Qemu-devel] [PATCH 2/2] target-i386/seg_helper: define names for code/data segment types liguang
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: liguang @ 2013-04-22  3:44 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, pbonzini, afaerber, lig.fnst

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 906e4f3..419efd8 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] 8+ messages in thread

* [Qemu-devel] [PATCH 2/2] target-i386/seg_helper: define names for code/data segment types
  2013-04-22  3:44 [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions liguang
@ 2013-04-22  3:44 ` liguang
  2013-04-30  3:21 ` [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions li guang
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 8+ messages in thread
From: liguang @ 2013-04-22  3:44 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, pbonzini, afaerber, lig.fnst

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 419efd8..6b35b7c 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] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions
  2013-04-22  3:44 [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions liguang
  2013-04-22  3:44 ` [Qemu-devel] [PATCH 2/2] target-i386/seg_helper: define names for code/data segment types liguang
@ 2013-04-30  3:21 ` li guang
  2013-04-30  7:16 ` Peter Maydell
  2013-05-23  8:35 ` li guang
  3 siblings, 0 replies; 8+ messages in thread
From: li guang @ 2013-04-30  3:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, pbonzini, afaerber

ping ...

在 2013-04-22一的 11:44 +0800,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 906e4f3..419efd8 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)

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

* Re: [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions
  2013-04-22  3:44 [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions liguang
  2013-04-22  3:44 ` [Qemu-devel] [PATCH 2/2] target-i386/seg_helper: define names for code/data segment types liguang
  2013-04-30  3:21 ` [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions li guang
@ 2013-04-30  7:16 ` Peter Maydell
  2013-04-30  7:27   ` li guang
  2013-05-23  8:35 ` li guang
  3 siblings, 1 reply; 8+ messages in thread
From: Peter Maydell @ 2013-04-30  7:16 UTC (permalink / raw)
  To: liguang; +Cc: blauwirbel, pbonzini, qemu-devel, afaerber

On 22 April 2013 04:44, liguang <lig.fnst@cn.fujitsu.com> wrote:
> 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 906e4f3..419efd8 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)

This function really needs a better (more specific) name...

thanks
-- PMM

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

* Re: [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions
  2013-04-30  7:16 ` Peter Maydell
@ 2013-04-30  7:27   ` li guang
  0 siblings, 0 replies; 8+ messages in thread
From: li guang @ 2013-04-30  7:27 UTC (permalink / raw)
  To: Peter Maydell; +Cc: blauwirbel, pbonzini, qemu-devel, afaerber

在 2013-04-30二的 08:16 +0100,Peter Maydell写道:
> On 22 April 2013 04:44, liguang <lig.fnst@cn.fujitsu.com> wrote:
> > 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 906e4f3..419efd8 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)
> 
> This function really needs a better (more specific) name...
> 

Sorry, I'm hesitating to ask what will be the proper name?
this function is just a helper of other 4 functions,
seems its function can hardly be described by a name.

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

* Re: [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions
  2013-04-22  3:44 [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions liguang
                   ` (2 preceding siblings ...)
  2013-04-30  7:16 ` Peter Maydell
@ 2013-05-23  8:35 ` li guang
  2013-05-23  9:24   ` Peter Maydell
  3 siblings, 1 reply; 8+ messages in thread
From: li guang @ 2013-05-23  8:35 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, pbonzini, afaerber

ping ... again.

在 2013-04-22一的 11:44 +0800,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 906e4f3..419efd8 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)

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

* Re: [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions
  2013-05-23  8:35 ` li guang
@ 2013-05-23  9:24   ` Peter Maydell
  2013-05-24  0:17     ` li guang
  0 siblings, 1 reply; 8+ messages in thread
From: Peter Maydell @ 2013-05-23  9:24 UTC (permalink / raw)
  To: li guang; +Cc: blauwirbel, pbonzini, qemu-devel, afaerber

On 23 May 2013 09:35, li guang <lig.fnst@cn.fujitsu.com> wrote:
> ping ... again.

misc_check_helper is still a terrible function name.

-- PMM

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

* Re: [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions
  2013-05-23  9:24   ` Peter Maydell
@ 2013-05-24  0:17     ` li guang
  0 siblings, 0 replies; 8+ messages in thread
From: li guang @ 2013-05-24  0:17 UTC (permalink / raw)
  To: Peter Maydell; +Cc: blauwirbel, pbonzini, qemu-devel, afaerber

在 2013-05-23四的 10:24 +0100,Peter Maydell写道:
> On 23 May 2013 09:35, li guang <lig.fnst@cn.fujitsu.com> wrote:
> > ping ... again.
> 
> misc_check_helper is still a terrible function name.
> 

Oh, sorry, I ping the obsolete one,
I've sent a v2 for your comment:
v2: change misc_check_helper to privilege_check
http://lists.gnu.org/archive/html/qemu-devel/2013-05/msg00554.html

I'll ping it.

Thanks! 

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

end of thread, other threads:[~2013-05-24  0:18 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-22  3:44 [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions liguang
2013-04-22  3:44 ` [Qemu-devel] [PATCH 2/2] target-i386/seg_helper: define names for code/data segment types liguang
2013-04-30  3:21 ` [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions li guang
2013-04-30  7:16 ` Peter Maydell
2013-04-30  7:27   ` li guang
2013-05-23  8:35 ` li guang
2013-05-23  9:24   ` Peter Maydell
2013-05-24  0:17     ` li guang

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).