From patchwork Wed Jun 12 21:41:37 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Roth X-Patchwork-Id: 250905 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 504662C007E for ; Thu, 13 Jun 2013 08:25:11 +1000 (EST) Received: from localhost ([::1]:50725 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Umsy3-0004Z0-Me for incoming@patchwork.ozlabs.org; Wed, 12 Jun 2013 17:52:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40472) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Umsrw-00078E-I4 for qemu-devel@nongnu.org; Wed, 12 Jun 2013 17:46:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Umsrv-0001Mo-2s for qemu-devel@nongnu.org; Wed, 12 Jun 2013 17:46:16 -0400 Received: from mail-ie0-x235.google.com ([2607:f8b0:4001:c03::235]:44319) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Umsru-0001Ma-Tu; Wed, 12 Jun 2013 17:46:15 -0400 Received: by mail-ie0-f181.google.com with SMTP id x12so6210086ief.40 for ; Wed, 12 Jun 2013 14:46:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=9s2qWzmJgsCRyBWKgDkTJCrORqlmobSCFfK+6A5AYsE=; b=eygDIbJrLbZfy7vsdcYZjLzA1AlyMPZxd0bpJwpi/7obqLgoz+I4HimGWuPqbx77kc mYlHxFjDO0yytWJnbiOK/D6jtNnlWOPsfWy/VM4zp3/uR5vjvfkG9/07CPGLCmw6QF3b M2/xlmuDlDZNpBDdPs/xBY4fjbHr0VNS6ybsQzyalBYVZCMKflW4Vhx1/8pY25x9aqtu uStqXwbcS8o7r3OBUSWwkcMkVZ/jzUi1tPAUP6QxmCPlvStiTIZ/tvGCD6qa+ZuqnTYZ GQFB8/I/LAX3fB0Yp0dYw4VNs+9H27dwcUyWkaMquXhM1x9zVFT5pefvP/qqELsbtcdA JX9w== X-Received: by 10.50.22.37 with SMTP id a5mr4434099igf.78.1371073574222; Wed, 12 Jun 2013 14:46:14 -0700 (PDT) Received: from localhost ([32.97.110.51]) by mx.google.com with ESMTPSA id gz1sm4255542igb.5.2013.06.12.14.46.12 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 12 Jun 2013 14:46:13 -0700 (PDT) From: Michael Roth To: qemu-devel@nongnu.org Date: Wed, 12 Jun 2013 16:41:37 -0500 Message-Id: <1371073298-14519-26-git-send-email-mdroth@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1371073298-14519-1-git-send-email-mdroth@linux.vnet.ibm.com> References: <1371073298-14519-1-git-send-email-mdroth@linux.vnet.ibm.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4001:c03::235 Cc: qemu-stable@nongnu.org Subject: [Qemu-devel] [PATCH 25/26] target-i386: Fix aflag logic for CODE64 and the 0x67 prefix 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 From: Richard Henderson The code reorganization in commit 4a6fd938 broke handling of PREFIX_ADR. While fixing this, tidy and comment the code so that it's more obvious what's going on in setting both aflag and dflag. The TARGET_X86_64 ifdef can be eliminated because CODE64 expands to the constant zero when TARGET_X86_64 is undefined. Cc: Paolo Bonzini Reported-by: Laszlo Ersek Signed-off-by: Richard Henderson Reviewed-by: Paolo Bonzini Message-id: 1369855851-21400-1-git-send-email-rth@twiddle.net Signed-off-by: Anthony Liguori (cherry picked from commit dec3fc9657e0682637de4d5a29d947284d01985c) Signed-off-by: Michael Roth --- target-i386/translate.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/target-i386/translate.c b/target-i386/translate.c index 0aeccdb..14b0298 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -4677,8 +4677,6 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } s->pc = pc_start; prefixes = 0; - aflag = s->code32; - dflag = s->code32; s->override = -1; rex_w = -1; rex_r = 0; @@ -4801,23 +4799,25 @@ static target_ulong disas_insn(CPUX86State *env, DisasContext *s, } /* Post-process prefixes. */ - if (prefixes & PREFIX_DATA) { - dflag ^= 1; - } - if (prefixes & PREFIX_ADR) { - aflag ^= 1; - } -#ifdef TARGET_X86_64 if (CODE64(s)) { - if (rex_w == 1) { - /* 0x66 is ignored if rex.w is set */ - dflag = 2; + /* In 64-bit mode, the default data size is 32-bit. Select 64-bit + data with rex_w, and 16-bit data with 0x66; rex_w takes precedence + over 0x66 if both are present. */ + dflag = (rex_w > 0 ? 2 : prefixes & PREFIX_DATA ? 0 : 1); + /* In 64-bit mode, 0x67 selects 32-bit addressing. */ + aflag = (prefixes & PREFIX_ADR ? 1 : 2); + } else { + /* In 16/32-bit mode, 0x66 selects the opposite data size. */ + dflag = s->code32; + if (prefixes & PREFIX_DATA) { + dflag ^= 1; } - if (!(prefixes & PREFIX_ADR)) { - aflag = 2; + /* In 16/32-bit mode, 0x67 selects the opposite addressing. */ + aflag = s->code32; + if (prefixes & PREFIX_ADR) { + aflag ^= 1; } } -#endif s->prefix = prefixes; s->aflag = aflag;