From patchwork Tue Apr 4 07:00:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 78873 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp2823860vqo; Tue, 4 Apr 2023 00:01:44 -0700 (PDT) X-Google-Smtp-Source: AKy350ZAAavdQlq4VvDvV8ijY0eclzHXB+tssQ6KYy9z7P+us2yYrJcC2UrRI9rLMSuinUy7Igvi X-Received: by 2002:a17:906:600c:b0:93d:78e:d21d with SMTP id o12-20020a170906600c00b0093d078ed21dmr1136511ejj.64.1680591704413; Tue, 04 Apr 2023 00:01:44 -0700 (PDT) Received: from sourceware.org (server2.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id c2-20020a17090618a200b009337bae35c1si688899ejf.237.2023.04.04.00.01.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Apr 2023 00:01:44 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=NC1q1lP9; arc=fail (signature failed); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DAB67385480D for ; Tue, 4 Apr 2023 07:01:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DAB67385480D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1680591661; bh=FWjaKqYe8S76QlzIymrz53DMJlSMKHK0xLFpLwLUbfU=; h=Date:Subject:To:Cc:References:In-Reply-To:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=NC1q1lP9MVN/fnst8681V4hb1RqaR08w/A6F+NY+ISQP9KEP9A6arB2StHEmLe+vs cQdDvCIXjpVlJCmuR09GK8AbzP6L4QbFvzqNsiijU0CuI8qdR4T13gNz8WCMkmX10I 5D2LS+III98StrSQ3OTL/j003Jr1qrVwLIh7wXgQ= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from EUR02-VI1-obe.outbound.protection.outlook.com (mail-vi1eur02on2042.outbound.protection.outlook.com [40.107.241.42]) by sourceware.org (Postfix) with ESMTPS id 2FAF83858020 for ; Tue, 4 Apr 2023 07:00:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 2FAF83858020 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IgTFBEMz4yxSEnfZOWQh5njxBUoaqRB4svI4DrYsjElzLdVnft7uQf2wH8SoKsQajt7nyE/6yNuhLa2gf2WrJ0YLvOccbvRORmy/lze5xgiYo3c1988M6yUhPvG9fuXeY2J0snabXBV1/mS1Igf7IqXY7UVfFH0oRC99yQqb+5rxqgmf/5F9ko6UeP6kRndQLn/sWucS9cF1h7SSr9z9g4Kd1KuT4J11MxLOQBtHHA6pbkwp1ZHfQIpKBb3tGXH5jleH4K6hxW+ksMsn5c5PNyDqNM+VT0wEVBUbpUb2mvOKe0wJzU7ViJzNWQqHcKEe0p+yVgI9wI+JmwCfXwsJQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=FWjaKqYe8S76QlzIymrz53DMJlSMKHK0xLFpLwLUbfU=; b=DrsYpLPAeVENm6zFQgq5zlPVfhOgXMDFPfUteBTQYdxr3sGLHczgbJrDUmrefLfV7spkpxwNJ6prgB4El1XmqzLfsTn4JuZciYPKTRDJGsQLIernJOFbyiAVJg53zRKW++tuN3HwomO/X8kRhRxqtuckKiNPKwioyP6Jzh1Zzz7i9UNiHN7VKc9mLLIQ85vvKHZyUuz8+zRALHps1oSEHfcCUTggD+xioOOvM/S1/9FvBg+k0112SzMg+Xl2igjNsoSB7PMIh0HChqMaMT6wIBxNI8BKRTZ7zrXE0fFNBDGBNXFrsEQZQg1PHCYjp/ec8sfHZ9IepEUZYtCD8mv0Aw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by AS8PR04MB8609.eurprd04.prod.outlook.com (2603:10a6:20b:424::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6254.35; Tue, 4 Apr 2023 07:00:49 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::154e:166d:ec25:531b]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::154e:166d:ec25:531b%6]) with mapi id 15.20.6254.035; Tue, 4 Apr 2023 07:00:48 +0000 Message-ID: Date: Tue, 4 Apr 2023 09:00:46 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.9.1 Subject: [PATCH 6/8] x86: change fetch error handling for get() Content-Language: en-US To: Binutils Cc: "H.J. Lu" , Alan Modra References: <5dac45a8-cd5f-ee4d-52fc-7d283fc29ec4@suse.com> In-Reply-To: <5dac45a8-cd5f-ee4d-52fc-7d283fc29ec4@suse.com> X-ClientProxiedBy: FR3P281CA0188.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a4::20) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|AS8PR04MB8609:EE_ X-MS-Office365-Filtering-Correlation-Id: 0ec12cd0-bce4-4dd3-fc1c-08db34da5184 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Kmh76Z5Z0oD8Oi4k3IanSUnKwwLO8//xRBZqIJFcH+H7LLVf214xugUgdiEnkoUiOyLuo1VI3+PsvbbgFseJDKiDZykkpqfD1tzROENg6qU17kKhZbR8NAA8hoZjb8+NI7PWQ8IO1u5N6sSQQuOhlKHALZKbwVRufg57gHrzipZ9ycMq08s6p8tTxsI+/krO0cRmgXQ3pkFH+U3/yxRc8hLa922c9hNO0blozV4I65IPndU7bqk3nUTpwEIBOGZlIoKleAwpvqqveLI57A9H9Ua3Edmmvnr7vTWVfiuds96Cp9M6LzovjX5Y5v4mFMHvNK2qAsoRzhcQdkbqx07yfuNs0ArWvy6lkXHgaucgyVBBBzNxA6Fw38wDVKIhujPx6RErv9XLsrO9h1nrSkeubkKHYSxkEwUy8nKBr+eWLjS5xF9PEnFRc7nx+wvJba+VTGEA65GIMhkt2DvBAEZ/Aila8KaggoNFunmkCPavQNbXoBwQGrlmaCRG9npI9CUUiAEhC6OvUwPuafWTzgUpK2fK5fEvFACWwnXzCnOFFJruVP3s2rnjmuDIMdDQWDy6v5vQQfXEjAbcclNKpwVkv58RYcJn/IWA6xlo+lPlNUfJFd6qP8T535/hH3Nn6w4oSx7GFYDaSV3+qalVx/oQ2g== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VE1PR04MB6560.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(39860400002)(136003)(376002)(366004)(346002)(396003)(451199021)(31686004)(6486002)(54906003)(66476007)(66556008)(66946007)(8676002)(41300700001)(6916009)(4326008)(31696002)(36756003)(478600001)(316002)(86362001)(38100700002)(6506007)(6512007)(186003)(2616005)(8936002)(2906002)(5660300002)(26005)(30864003)(43740500002)(45980500001); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?zKomzmHMlr2gO7vflcd7oxdug7cz?= =?utf-8?q?C3AsnstZdtmeHpfzfOjes6mQx8v/wGHX0HPohPpBS2AifQiU7ywqkVJuRUJHCFYoc?= =?utf-8?q?NpLfwsVW610uUP1LqWIEUR3MMwRCppRuczGIx30/i31dFHlyGVdslwfzeBjClUMSr?= =?utf-8?q?QFDv1odRbFEIOzRWywHxvkH2D+TTziFHZViYFnU8+892myuC8kt1xeyQqk7eU7G2T?= =?utf-8?q?VpYy0JaEbVVvdatTmmCNmCZqt9sSIIkK9nJtZiICMC2PJT3v4qm9HSbcGZj0HWF1c?= =?utf-8?q?2g41MB4InQ5zn1QKZ/26p3jJ0rCXWnrALljve7gOEAYoKWtDoDR8cvafqkuO+p4nM?= =?utf-8?q?+B2H5mRH/PdBichHMDrzK9k5zI4biEKEvdNwolx9o8qggL/rZ65xOijq00b6kfg4Y?= =?utf-8?q?13WSkg+fik/sglP0k5fo/QCj1aB1JuOc/vSNb7MeTgQRzY+Z35HA7M0kMG5YNpdiU?= =?utf-8?q?GWR+niZal5DOqzXLktyXxE/jI7fMa9kHZT+GOGAJ5RxWHrLj53rpmPEIYe72P3Bbt?= =?utf-8?q?37pZtY8PKWFQz7W975VDl+WRRrOaTPDHyp3MezwASXNJkEFX5yc4ZGnC189OYH6v/?= =?utf-8?q?tVSPOoyL9kiwCHDuZRjNklUpvp6rh0CIXe6HaUwHWQzM4dJFNDTkTlpII1HIcwWAm?= =?utf-8?q?26tdOx7ggPAHhQ6QfnEOczG5DAFG7Ko7OCYEkCXxSMwxWGShT/sUHrz9+WwoUli7N?= =?utf-8?q?rkejQFkRbe6QPPygWZir48G0f8kkcRumiw08hpuWF+bNEHbOMUcL6YVmlChmBeAhh?= =?utf-8?q?DrU0Y+jutcs8G4xh/6a20rEzmB9s88Bj6Z0iTBUGsEe/b0PiXbFSiYS8FTpRR4yVz?= =?utf-8?q?a+Uxzr0h2X5s2Lip+jHzQywSK5SExKdpuJ9uXKkH9Gc7uccPD88BiASi8JC9HejJS?= =?utf-8?q?kO3Pme3fjjEzYhX12M28I/H0r1LMi4W4BvNOznR7OzrU3ogQu2p6sN0ua5nE0fgtw?= =?utf-8?q?N+zmx7XuL6nNqtarqkWcLxS4d2+dzwcsPM5ppd4jgeIFeV8lAlLgYqcP7Zj5SW6s+?= =?utf-8?q?kA6BAqSKPfqDN0n8vrOWiqdMluVkJyIJ3M5lKUfxrcAjAnnX45hyASI8HdI8s8ZwY?= =?utf-8?q?/igztwl173dCdJ0W/XFaN4lfIIlv+0+LT1Ca2cwxKTg2ivBEv3xkpcIa7gj7qxznf?= =?utf-8?q?xCkTwJZ1N/6KFknGkzJ2CSOUqIhZctFiQ6DLUX7U88lFPs6U2F33ZE7UOCE9ycLSB?= =?utf-8?q?lxJwuNTgEkC9/Mw6lqZx4mUmRKXKsMvxTEcE5gwsEj9mZLpdZ0dIkBAAKP5XWF9jN?= =?utf-8?q?8cdGgWrAdGyPZUjZILQAdapIXEjAahVD2JgAgZvFeIgA4hoew8EOtaRG7h2p+p9NL?= =?utf-8?q?NIS57TjylgPKeuKvFomaldGK2i4cNTf814bAR5PzNkQa7/L7IwMEB3NQBp5xwLG1m?= =?utf-8?q?KNsTjegdVUozi+hqobihAQUzLm/+SkQQTiHsbxehzWz//XIAV2nnCZ4kgqgc6j95J?= =?utf-8?q?psX9qHHIeCbnZdroX9Pu6nSxJvjCOX5GoT7fW1KwyRhuZbHFWuuvQGbesGXqkrIKW?= =?utf-8?q?PBVc3wzJCMl3?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0ec12cd0-bce4-4dd3-fc1c-08db34da5184 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Apr 2023 07:00:47.9831 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Jdb4QalVO0BXj1kyTmwygtiluJWorvci+5J9cPoo+6iu8ExuN1XfDf6KxZN0Jx6RwYursHUMxMQcOupJJ2RUng== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR04MB8609 X-Spam-Status: No, score=-3028.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jan Beulich via Binutils From: Jan Beulich Reply-To: Jan Beulich Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1762228126713788848?= X-GMAIL-MSGID: =?utf-8?q?1762228126713788848?= Make them return boolean and convert FETCH_DATA() uses to fetch_code(). With this no further users of FETCH_DATA() remain, so the macro and its backing function are dropped as well. Leave value types as they were for the helper functions, even if I don't think that beyond get64() use of bfd_{,signed_}vma is really necessary. With type change of "disp" in OP_E_memory(), change the 2nd parameter of print_displacement() to a signed type as well, though (eliminating the need for a local variable of signed type). This also eliminates the need for custom printing of '-' in Intel syntax displacement expressions. While there drop forward declarations which aren't really needed. --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -48,10 +48,8 @@ static void oappend_with_style (instr_in enum disassembler_style); static void oappend (instr_info *, const char *); static void append_seg (instr_info *); -static bfd_vma get64 (instr_info *); -static bfd_signed_vma get32 (instr_info *); -static bfd_signed_vma get32s (instr_info *); -static int get16 (instr_info *); +static bool get32s (instr_info *, bfd_signed_vma *); +static bool get16 (instr_info *, int *); static void set_op (instr_info *, bfd_vma, bool); static bool OP_E (instr_info *, int, int); @@ -295,41 +293,8 @@ struct instr_info #define PREFIX_FWAIT 0x800 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) - to ADDR (exclusive) are valid. Returns 1 for success, longjmps + to ADDR (exclusive) are valid. Returns true for success, false on error. */ -#define FETCH_DATA(info, addr) \ - ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \ - ? 1 : fetch_data ((info), (addr))) - -static int -fetch_data (struct disassemble_info *info, bfd_byte *addr) -{ - int status; - struct dis_private *priv = (struct dis_private *) info->private_data; - bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer); - - if (addr <= priv->the_buffer + MAX_MNEM_SIZE) - status = (*info->read_memory_func) (start, - priv->max_fetched, - addr - priv->max_fetched, - info); - else - status = -1; - if (status != 0) - { - /* If we did manage to read at least one byte, then - print_insn_i386 will do something sensible. Otherwise, print - an error. We do that here because this is where we know - STATUS. */ - if (priv->max_fetched == priv->the_buffer) - (*info->memory_error_func) (status, start, info); - OPCODES_SIGLONGJMP (priv->bailout, 1); - } - else - priv->max_fetched = addr; - return 1; -} - static bool fetch_code (struct disassemble_info *info, bfd_byte *until) { @@ -11412,15 +11377,14 @@ oappend_immediate (instr_info *ins, bfd_ /* Put DISP in BUF as signed hex number. */ static void -print_displacement (instr_info *ins, bfd_vma disp) +print_displacement (instr_info *ins, bfd_signed_vma val) { - bfd_signed_vma val = disp; char tmp[30]; if (val < 0) { oappend_char_with_style (ins, '-', dis_style_address_offset); - val = -disp; + val = (bfd_vma) 0 - val; /* Check for possible overflow. */ if (val < 0) @@ -11830,7 +11794,6 @@ print_register (instr_info *ins, unsigne static bool OP_E_memory (instr_info *ins, int bytemode, int sizeflag) { - bfd_vma disp = 0; int add = (ins->rex & REX_B) ? 8 : 0; int riprel = 0; int shift; @@ -11939,6 +11902,7 @@ OP_E_memory (instr_info *ins, int bytemo if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit) { /* 32/64 bit address mode */ + bfd_signed_vma disp = 0; int havedisp; int havebase; int needindex; @@ -12030,7 +11994,8 @@ OP_E_memory (instr_info *ins, int bytemo havebase = 0; if (ins->address_mode == mode_64bit && !ins->has_sib) riprel = 1; - disp = get32s (ins); + if (!get32s (ins, &disp)) + return false; if (riprel && bytemode == v_bndmk_mode) { oappend (ins, "(bad)"); @@ -12048,7 +12013,8 @@ OP_E_memory (instr_info *ins, int bytemo disp <<= shift; break; case 2: - disp = get32s (ins); + if (!get32s (ins, &disp)) + return false; break; } @@ -12154,14 +12120,8 @@ OP_E_memory (instr_info *ins, int bytemo if (ins->intel_syntax && (disp || ins->modrm.mod != 0 || base == 5)) { - if (!havedisp || (bfd_signed_vma) disp >= 0) + if (!havedisp || disp >= 0) oappend_char (ins, '+'); - else if (ins->modrm.mod != 1 && disp != -disp) - { - oappend_char (ins, '-'); - disp = -disp; - } - if (havedisp) print_displacement (ins, disp); else @@ -12209,13 +12169,17 @@ OP_E_memory (instr_info *ins, int bytemo else { /* 16 bit address mode */ + int disp = 0; + ins->used_prefixes |= ins->prefixes & PREFIX_ADDR; switch (ins->modrm.mod) { case 0: if (ins->modrm.rm == 6) { - disp = get16 (ins); + case 2: + if (!get16 (ins, &disp)) + return false; if ((disp & 0x8000) != 0) disp -= 0x10000; } @@ -12229,11 +12193,6 @@ OP_E_memory (instr_info *ins, int bytemo if (ins->vex.evex && shift > 0) disp <<= shift; break; - case 2: - disp = get16 (ins); - if ((disp & 0x8000) != 0) - disp -= 0x10000; - break; } if (!ins->intel_syntax) @@ -12248,14 +12207,8 @@ OP_E_memory (instr_info *ins, int bytemo if (ins->intel_syntax && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6)) { - if ((bfd_signed_vma) disp >= 0) + if (disp >= 0) oappend_char (ins, '+'); - else if (ins->modrm.mod != 1) - { - oappend_char (ins, '-'); - disp = -disp; - } - print_displacement (ins, disp); } @@ -12382,14 +12335,14 @@ OP_G (instr_info *ins, int bytemode, int } #ifdef BFD64 -static bfd_vma -get64 (instr_info *ins) +static bool +get64 (instr_info *ins, bfd_vma *res) { - bfd_vma x; unsigned int a; unsigned int b; - FETCH_DATA (ins->info, ins->codep + 8); + if (!fetch_code (ins->info, ins->codep + 8)) + return false; a = *ins->codep++ & 0xff; a |= (*ins->codep++ & 0xff) << 8; a |= (*ins->codep++ & 0xff) << 16; @@ -12398,56 +12351,49 @@ get64 (instr_info *ins) b |= (*ins->codep++ & 0xff) << 8; b |= (*ins->codep++ & 0xff) << 16; b |= (*ins->codep++ & 0xffu) << 24; - x = a + ((bfd_vma) b << 32); - return x; + *res = a + ((bfd_vma) b << 32); + return true; } #else -static bfd_vma -get64 (instr_info *ins ATTRIBUTE_UNUSED) +static bool +get64 (instr_info *ins ATTRIBUTE_UNUSED, bfd_vma *res ATTRIBUTE_UNUSED) { abort (); - return 0; + return false; } #endif -static bfd_signed_vma -get32 (instr_info *ins) +static bool +get32 (instr_info *ins, bfd_signed_vma *res) { - bfd_vma x = 0; - - FETCH_DATA (ins->info, ins->codep + 4); - x = *ins->codep++ & (bfd_vma) 0xff; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 8; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 16; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 24; - return x; + if (!fetch_code (ins->info, ins->codep + 4)) + return false; + *res = *ins->codep++ & (bfd_vma) 0xff; + *res |= (*ins->codep++ & (bfd_vma) 0xff) << 8; + *res |= (*ins->codep++ & (bfd_vma) 0xff) << 16; + *res |= (*ins->codep++ & (bfd_vma) 0xff) << 24; + return true; } -static bfd_signed_vma -get32s (instr_info *ins) +static bool +get32s (instr_info *ins, bfd_signed_vma *res) { - bfd_vma x = 0; - - FETCH_DATA (ins->info, ins->codep + 4); - x = *ins->codep++ & (bfd_vma) 0xff; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 8; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 16; - x |= (*ins->codep++ & (bfd_vma) 0xff) << 24; + if (!get32 (ins, res)) + return false; - x = (x ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31); + *res = (*res ^ ((bfd_vma) 1 << 31)) - ((bfd_vma) 1 << 31); - return x; + return true; } -static int -get16 (instr_info *ins) +static bool +get16 (instr_info *ins, int *res) { - int x = 0; - - FETCH_DATA (ins->info, ins->codep + 2); - x = *ins->codep++ & 0xff; - x |= (*ins->codep++ & 0xff) << 8; - return x; + if (!fetch_code (ins->info, ins->codep + 2)) + return false; + *res = *ins->codep++ & 0xff; + *res |= (*ins->codep++ & 0xff) << 8; + return true; } static void @@ -12587,30 +12533,32 @@ OP_I (instr_info *ins, int bytemode, int case v_mode: USED_REX (REX_W); if (ins->rex & REX_W) - op = get32s (ins); + { + if (!get32s (ins, &op)) + return false; + } else { + ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); if (sizeflag & DFLAG) { - op = get32 (ins); + case d_mode: + if (!get32 (ins, &op)) + return false; mask = 0xffffffff; } else { - op = get16 (ins); + int num; + + case w_mode: + if (!get16 (ins, &num)) + return false; + op = num; mask = 0xfffff; } - ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); } break; - case d_mode: - mask = 0xffffffff; - op = get32 (ins); - break; - case w_mode: - mask = 0xfffff; - op = get16 (ins); - break; case const_1_mode: if (ins->intel_syntax) oappend (ins, "1"); @@ -12628,13 +12576,18 @@ OP_I (instr_info *ins, int bytemode, int static bool OP_I64 (instr_info *ins, int bytemode, int sizeflag) { + bfd_vma op; + if (bytemode != v_mode || ins->address_mode != mode_64bit || !(ins->rex & REX_W)) return OP_I (ins, bytemode, sizeflag); USED_REX (REX_W); - oappend_immediate (ins, get64 (ins)); + if (!get64 (ins, &op)) + return false; + + oappend_immediate (ins, op); return true; } @@ -12677,10 +12630,16 @@ OP_sI (instr_info *ins, int bytemode, in break; case v_mode: /* The operand-size prefix is overridden by a REX prefix. */ - if ((sizeflag & DFLAG) || (ins->rex & REX_W)) - op = get32s (ins); - else - op = get16 (ins); + if (!(sizeflag & DFLAG) && !(ins->rex & REX_W)) + { + int val; + + if (!get16 (ins, &val)) + return false; + op = val; + } + else if (!get32s (ins, &op)) + return false; break; default: oappend (ins, INTERNAL_DISASSEMBLER_ERROR); @@ -12713,12 +12672,19 @@ OP_J (instr_info *ins, int bytemode, int || (ins->address_mode == mode_64bit && ((ins->isa64 == intel64 && bytemode != dqw_mode) || (ins->rex & REX_W)))) - disp = get32s (ins); + { + bfd_signed_vma val; + + if (!get32s (ins, &val)) + return false; + disp = val; + } else { - disp = get16 (ins); - if ((disp & 0x8000) != 0) - disp -= 0x10000; + int val; + + get16 (ins, &val); + disp = val & 0x8000 ? val - 0x10000 : val; /* In 16bit mode, address is wrapped around at 64k within the same segment. Otherwise, a data16 prefix on a jump instruction means that the pc is masked to 16 bits after @@ -12762,14 +12728,16 @@ OP_DIR (instr_info *ins, int dummy ATTRI if (sizeflag & DFLAG) { - offset = get32 (ins); - seg = get16 (ins); - } - else - { - offset = get16 (ins); - seg = get16 (ins); + bfd_signed_vma val; + + if (!get32 (ins, &val)) + return false;; + offset = val; } + else if (!get16 (ins, &offset)) + return false; + if (!get16 (ins, &seg)) + return false;; ins->used_prefixes |= (ins->prefixes & PREFIX_DATA); res = snprintf (scratch, ARRAY_SIZE (scratch), @@ -12791,9 +12759,21 @@ OP_OFF (instr_info *ins, int bytemode, i append_seg (ins); if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit) - off = get32 (ins); + { + bfd_signed_vma val; + + if (!get32 (ins, &val)) + return false; + off = val; + } else - off = get16 (ins); + { + int val; + + if (!get16 (ins, &val)) + return false; + off = val; + } if (ins->intel_syntax) { @@ -12820,7 +12800,8 @@ OP_OFF64 (instr_info *ins, int bytemode, intel_operand_size (ins, bytemode, sizeflag); append_seg (ins); - off = get64 (ins); + if (!get64 (ins, &off)) + return false; if (ins->intel_syntax) {