From patchwork Mon Apr 22 03:44:12 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: liguang X-Patchwork-Id: 238303 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id E4C4D2C0119 for ; Mon, 22 Apr 2013 13:46:30 +1000 (EST) Received: from localhost ([::1]:41560 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UU7i1-0003UA-54 for incoming@patchwork.ozlabs.org; Sun, 21 Apr 2013 23:46:29 -0400 Received: from eggs.gnu.org ([208.118.235.92]:41088) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UU7hh-0003Te-Ay for qemu-devel@nongnu.org; Sun, 21 Apr 2013 23:46:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UU7hg-0001HQ-3H for qemu-devel@nongnu.org; Sun, 21 Apr 2013 23:46:09 -0400 Received: from [222.73.24.84] (port=46748 helo=song.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UU7hf-0001Gs-8L for qemu-devel@nongnu.org; Sun, 21 Apr 2013 23:46:08 -0400 X-IronPort-AV: E=Sophos;i="4.87,523,1363104000"; d="scan'208";a="7109129" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 22 Apr 2013 11:43:23 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id r3M3k5J8026709; Mon, 22 Apr 2013 11:46:05 +0800 Received: from liguang.fnst.cn.fujitsu.com ([10.167.233.147]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013042211443500-715873 ; Mon, 22 Apr 2013 11:44:35 +0800 From: liguang To: qemu-devel@nongnu.org Date: Mon, 22 Apr 2013 11:44:12 +0800 Message-Id: <1366602253-15974-1-git-send-email-lig.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.7.2.5 X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/04/22 11:44:35, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/04/22 11:44:35, Serialize complete at 2013/04/22 11:44:35 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 222.73.24.84 Cc: blauwirbel@gmail.com, pbonzini@redhat.com, afaerber@suse.de, lig.fnst@cn.fujitsu.com Subject: [Qemu-devel] [PATCH 1/2] target-i386/seg_helper: refactor 4 helper functions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- 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)