From patchwork Thu Jan 10 12:17:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 155141 Delivered-To: patch@linaro.org Received: by 2002:a02:48:0:0:0:0:0 with SMTP id 69csp1835040jaa; Thu, 10 Jan 2019 04:24:47 -0800 (PST) X-Google-Smtp-Source: ALg8bN5ClgoLgkig4zEZkkagTqIyOxRTE6l11DKDBMJwpTArJy/3vhKpgi2j/XrHYLfKe0cFfg7G X-Received: by 2002:a1c:8acf:: with SMTP id m198mr10316470wmd.143.1547123086992; Thu, 10 Jan 2019 04:24:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547123086; cv=none; d=google.com; s=arc-20160816; b=XAEcDAS+JD37yuA/8Ai8UkHnvKtnrqBewlcykrYu9BDezBrx0KW+loyCuOKgUeh0N9 +qzWaBy5eCgiEKYEJUiqWvgUXX/cdPVcC/cSIIOAwYXaT+m5kvt/GVebbQewh94XyPxQ zDY+PBs7xcJ/BN+ESdNWZJlp3Ij0DHzm/oail5tUiOpDmh67ISOM31cnTKhaDhenh0Vp dEXuWOmO6caaz8G+pmmk6Ls5FtN7KuAfpCEEkeRrfNKHQv2XWYFIJWsrzzUYq1cHUhwF rAwtuFD7YIwkhITy+3AKYK5ig6/QGAkMHPZyxEyd1RxtdWg76cA+F5PLd/l0TEp00Nj2 QEeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:to:from:dkim-signature; bh=PRWaIbFhaCG50KtAhIfgw4/3zpMsZFNNO0ITZ9DcBeA=; b=pZHq52lPvtQDKMhHHakStHq97l7MSm6y8/sn91iJ+C4DuBGzJ2R/gIFjAWCRs9Mcq1 S0G7uSCx0dVOh6xJmvyiKIjOv1J85D7VLkAz3+bTd7tor5wdhEbjyMzaC0AmL8uU8lQ6 bo2k4IF0U37xUkA5W1IO8qP7UrTU9yQZG+OrqY7Rjyw0kG7NuPc74PQZWOor+CuoLFQO Et2JJZUDFl6D9QHLdgpl1ALOkLTuHNgiB9lkzkyzgpvjfq4rMJ5Z/HXvdn5+3qFAsgcM LaxwNnWKtiaCm+6rgq2sRX0dMNrBdoRtarf6ilAlKFzkU2JI3Z1/ADXzbo+uXvxUqDlp dfYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=NzarwsFO; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id j5si23621208wrn.140.2019.01.10.04.24.46 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 10 Jan 2019 04:24:46 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=NzarwsFO; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([127.0.0.1]:57522 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghZO9-0000AD-Sx for patch@linaro.org; Thu, 10 Jan 2019 07:24:45 -0500 Received: from eggs.gnu.org ([209.51.188.92]:56112) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ghZHf-0004bc-Mj for qemu-devel@nongnu.org; Thu, 10 Jan 2019 07:18:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ghZHe-0007he-PN for qemu-devel@nongnu.org; Thu, 10 Jan 2019 07:18:03 -0500 Received: from mail-pf1-x42d.google.com ([2607:f8b0:4864:20::42d]:45642) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ghZHe-0007gy-Ir for qemu-devel@nongnu.org; Thu, 10 Jan 2019 07:18:02 -0500 Received: by mail-pf1-x42d.google.com with SMTP id g62so5212170pfd.12 for ; Thu, 10 Jan 2019 04:18:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=PRWaIbFhaCG50KtAhIfgw4/3zpMsZFNNO0ITZ9DcBeA=; b=NzarwsFOGde2+MjQqUPVg6cvBcCLs77h03WkxcnrLtGvYjPr5NedwlCyHwbH0bP6i6 MQhxNcH2TCOEQJzoJOAs4ONEK6rvceU3jr68kNE62UTtGnJOZla/mOuLAi3yCApg+ozr TlTdt3RyQrRhWOG9dmxKCm9kkbDmygsbfZMSg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=PRWaIbFhaCG50KtAhIfgw4/3zpMsZFNNO0ITZ9DcBeA=; b=supVwv2XXS65utpM4i6ys7LeRbKv6rXxRgtcPVLqlUs5T9mUpTVtZRlgINi6PJ5qAK PCVHw0a54ikKP5pfCTsFd5e0sCtUjXaYZHgtTmZ/GXNbvSHCZgXhk5CStvrSq/ypYgN4 huSkLrHo/NHiNmdHbFX2LMQ2zLS7tc0d8+acPTe4rWMHZUMK44Ea5wx5PpMY4cTjzd93 wJecE2G0JlRfkSSXuRggIjoZacwJ4EfsI16QRYIzwUmtq84JBkPS9h4tuv5vhzq8uWft OAwnqmpmVIfsXiouk2YFEaRkl5a7H2bSDrId5qyZwxitGuBdcnN0+91Pn7mWUbNwUUMz 33OQ== X-Gm-Message-State: AJcUukd74Cbyb/dpH2leTmPEOUCLvbT4PymbrrDPiOjCzWqCe4sDtRde aYV7sKaUHgAghDDIr0IE4UgWvCDsZLVBQg== X-Received: by 2002:a62:710a:: with SMTP id m10mr9977016pfc.69.1547122681193; Thu, 10 Jan 2019 04:18:01 -0800 (PST) Received: from cloudburst.twiddle.net (c220-239-117-135.belrs4.nsw.optusnet.com.au. [220.239.117.135]) by smtp.gmail.com with ESMTPSA id h74sm140934699pfd.35.2019.01.10.04.17.59 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 10 Jan 2019 04:18:00 -0800 (PST) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 10 Jan 2019 23:17:32 +1100 Message-Id: <20190110121736.23448-8-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190110121736.23448-1-richard.henderson@linaro.org> References: <20190110121736.23448-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::42d Subject: [Qemu-devel] [PATCH 07/11] target/arm: Set btype for indirect branches X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- target/arm/translate-a64.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) -- 2.17.2 Reviewed-by: Peter Maydell diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index f319fa000e..5f0ecb297f 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -138,6 +138,19 @@ static void reset_btype(DisasContext *s) } } +static void set_btype(DisasContext *s, int val) +{ + TCGv_i32 tcg_val; + + /* BTYPE is a 2-bit field, and 0 should be done with reset_btype. */ + tcg_debug_assert(val >= 1 && val <= 3); + + tcg_val = tcg_const_i32(val); + tcg_gen_st_i32(tcg_val, cpu_env, offsetof(CPUARMState, btype)); + tcg_temp_free_i32(tcg_val); + s->btype = -1; +} + void aarch64_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf, int flags) { @@ -1985,6 +1998,7 @@ static void disas_exc(DisasContext *s, uint32_t insn) static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) { unsigned int opc, op2, op3, rn, op4; + unsigned btype_mod = 2; TCGv_i64 dst; TCGv_i64 modifier; @@ -2002,6 +2016,7 @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) case 0: /* BR */ case 1: /* BLR */ case 2: /* RET */ + btype_mod = opc; switch (op3) { case 0: /* BR, BLR, RET */ @@ -2045,7 +2060,6 @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) default: goto do_unallocated; } - gen_a64_set_pc(s, dst); /* BLR also needs to load return address */ if (opc == 1) { @@ -2061,6 +2075,7 @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) if (op3 != 2 || op3 != 3) { goto do_unallocated; } + btype_mod = opc & 1; if (s->pauth_active) { dst = new_tmp_a64(s); modifier = cpu_reg_sp(s, op4); @@ -2144,6 +2159,26 @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) return; } + switch (btype_mod) { + case 0: /* BR */ + if (dc_isar_feature(aa64_bti, s)) { + /* BR to {x16,x17} or !guard -> 1, else 3. */ + set_btype(s, rn == 16 || rn == 17 || !s->guarded_page ? 1 : 3); + } + break; + + case 1: /* BLR */ + if (dc_isar_feature(aa64_bti, s)) { + /* BLR sets BTYPE to 2, regardless of source guarded page. */ + set_btype(s, 2); + } + break; + + default: /* RET or none of the above. */ + /* BTYPE will be set to 0 by normal end-of-insn processing. */ + break; + } + s->base.is_jmp = DISAS_JUMP; }