From patchwork Tue Mar 12 22:49:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 160185 Delivered-To: patch@linaro.org Received: by 2002:a02:5cc1:0:0:0:0:0 with SMTP id w62csp13641726jad; Tue, 12 Mar 2019 15:51:09 -0700 (PDT) X-Google-Smtp-Source: APXvYqzDfpEaTskd74cA0VIdIHmIXsvJ3bGUwWynhk9PfInqQFreb9PbhGRgvJm3Wr7zOIm/ZMYS X-Received: by 2002:a0d:e24f:: with SMTP id l76mr8280562ywe.414.1552431069472; Tue, 12 Mar 2019 15:51:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552431069; cv=none; d=google.com; s=arc-20160816; b=mmCj8VqD7wtaqwH2T7tn0Y3wKcTPugTR3fOTL/R7YC7dK0oPwIi6uq6b9xXcdXM7V/ AuFYuEci7HmOIXg57VvfAotBBG0kG2S2Dc6bcxhlL953Vv1RiugthkCESvpdv2x9dPsX 77j7/F1hWzunQFoMkqiz5PUqcHmF+Uu2FrPSYOjrLOPw55ajb2ibrw6zNFJ6xWZWV2XO /kCYxTrUOiaNOjocldJ7q7H1Ol9vWBk7IgFfNuwMkYteqbjKLVEr1pDgcrwp9FQfuzzs C/czPQPPKglzPYSOmWb4jmF0TDHYckK3U+njnl/Y9rwpJkCzUCFSsgABg3rkt+RNWYOZ 3sqw== 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:message-id:date:to:from :dkim-signature; bh=MP9dTGtxIACoxNzrJmiyDyvmhMxgDXj0R3gTdaRZako=; b=rek9eivbwGa4GwwO+575OjxW3eekurGmXFdsVhJtu/69S0bwhOJR+TEV/SvM5/W7Rc ERasJSZQ4qGs2yxXHmoOskeYMFqZEQ6YZcZ8rUx3ZnRyAnMY5qGwbO+uuq7oMA5+HZDs YgDlc3/HuNPHNKAPCX3f8CrzU2ft8EOiIGPPvg56+pV9iZXeUOApcgxgeL3mqiUzdnmk EphE2MMffCkm0V7ncrQ/3GV6ZzkAgHaqx8r+zD2LatX3DsHZsDU/AiY0/aY8RFUaEQVd augToZn8CngFK3fnXEr68ryaBB7SWdMuS/BiG1UHQayuxa+BUVacDiHxxjnAEDg7/9bA Whqg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=lIOEbEMV; 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 n17si5778066ybd.267.2019.03.12.15.51.09 for (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 12 Mar 2019 15:51:09 -0700 (PDT) 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=lIOEbEMV; 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]:34614 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3qEn-00086E-30 for patch@linaro.org; Tue, 12 Mar 2019 18:51:09 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47432) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h3qDB-0007AM-FH for qemu-devel@nongnu.org; Tue, 12 Mar 2019 18:49:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h3qDA-0000dI-HB for qemu-devel@nongnu.org; Tue, 12 Mar 2019 18:49:29 -0400 Received: from mail-pf1-x443.google.com ([2607:f8b0:4864:20::443]:37525) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h3qDA-0000cP-2i for qemu-devel@nongnu.org; Tue, 12 Mar 2019 18:49:28 -0400 Received: by mail-pf1-x443.google.com with SMTP id s22so2889526pfh.4 for ; Tue, 12 Mar 2019 15:49:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=MP9dTGtxIACoxNzrJmiyDyvmhMxgDXj0R3gTdaRZako=; b=lIOEbEMVRvNxd7QHtC5Nw7A4tBmAW0031YEVY9iLh+Cf6WMj/xCftwAMp6+4W25cLE 2t4l8S8a7W6bPvwM0luuWallsV5ctkr4+Byo+5ucRIHayRIT/H46WPrRWOqCBatlzeHC WRdqW0Bt9hf3+XN3Ts2iiXyN72iHuropKk/ny+MX4By3lomKVqZwOVkEbMtIX6CMj6av t+hIDACVaK/vhtGROyHfdZsT9Ssmx6Lrzf6Ppf0k24uwVLFrNESlwT0TtxuUDg+Reb+B LENhElnr9OYhrlsroPBvPmYvMNIOn1dEd6NaxLQkNwkdfBrEQbzC7sbv2L0CHmdn9Jtz fWfw== 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; bh=MP9dTGtxIACoxNzrJmiyDyvmhMxgDXj0R3gTdaRZako=; b=skn+7KAIuiXR39y0yLHyXxcKpTT13fw/p+zoE8tSQ7gWBqbHy74Wt3ERbcIUgM0LBr 8alo0n5UpQ0gJd9sytw151CzumfSjcnhaQJjdd+/83rIJnlA8GFW0dryyBEyJCHtpK7l NURAk14xPagaMtm550+PorNGXavCnoHZ1l/XzA7AwbnVhKi+hM5a+maDy23SA5CnTLhs a3HsRgNI1bkhRnzIb4WSq1Dfm4UW492kXHnESkYsuOPW6AZdww/39nCfMsj3a4Sf+9Kt FggjglBpnsoWSUiCMzN592sPtJN0Hj6LWwW3dd9CEzdpIzJmsgbofGfUWTifLETlnwAC WRHg== X-Gm-Message-State: APjAAAXintnosNuvlFHdZ2Mljq38CTSPGG7TOR21ul2jirEzjI4Ut9Ov Vbp6tGsA2FZQ/dQaqGT35p0N8Wi/Nmg= X-Received: by 2002:a17:902:5e2:: with SMTP id f89mr36319585plf.170.1552430965873; Tue, 12 Mar 2019 15:49:25 -0700 (PDT) Received: from cloudburst.twiddle.net (97-113-188-82.tukw.qwest.net. [97.113.188.82]) by smtp.gmail.com with ESMTPSA id u26sm3808705pfh.42.2019.03.12.15.49.24 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 12 Mar 2019 15:49:25 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Tue, 12 Mar 2019 15:49:23 -0700 Message-Id: <20190312224923.25709-1-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::443 Subject: [Qemu-devel] [PATCH] target/hppa: Avoid squishing DISAS_IAQ_N_STALE_EXIT 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: svens@stackframe.org Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Within a delay slot, we were squishing both DISAS_IAQ_N_STALE and DISAS_IAQ_N_STALE_EXIT to DISAS_IAQ_N_UPDATED. This lost the required exit to the main loop, and could result in interrupts never being delivered. Reported-by: Sven Schnelle Signed-off-by: Richard Henderson --- Sven, this should be a better fix for your 11/11. r~ --- target/hppa/translate.c | 42 +++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) -- 2.17.2 Tested-by: Sven Schnelle diff --git a/target/hppa/translate.c b/target/hppa/translate.c index 35c504087f..43b74367ea 100644 --- a/target/hppa/translate.c +++ b/target/hppa/translate.c @@ -347,6 +347,7 @@ static int expand_shl11(int val) /* Similarly, but we want to return to the main loop immediately to recognize unmasked interrupts. */ #define DISAS_IAQ_N_STALE_EXIT DISAS_TARGET_2 +#define DISAS_EXIT DISAS_TARGET_3 /* global register indexes */ static TCGv_reg cpu_gr[32]; @@ -4218,19 +4219,31 @@ static void hppa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) ctx->iaoq_b = ctx->iaoq_n; ctx->base.pc_next += 4; - if (ret == DISAS_NORETURN || ret == DISAS_IAQ_N_UPDATED) { - return; - } - if (ctx->iaoq_f == -1) { - tcg_gen_mov_reg(cpu_iaoq_f, cpu_iaoq_b); - copy_iaoq_entry(cpu_iaoq_b, ctx->iaoq_n, ctx->iaoq_n_var); + switch (ret) { + case DISAS_NORETURN: + case DISAS_IAQ_N_UPDATED: + break; + + case DISAS_NEXT: + case DISAS_IAQ_N_STALE: + case DISAS_IAQ_N_STALE_EXIT: + if (ctx->iaoq_f == -1) { + tcg_gen_mov_reg(cpu_iaoq_f, cpu_iaoq_b); + copy_iaoq_entry(cpu_iaoq_b, ctx->iaoq_n, ctx->iaoq_n_var); #ifndef CONFIG_USER_ONLY - tcg_gen_mov_i64(cpu_iasq_f, cpu_iasq_b); + tcg_gen_mov_i64(cpu_iasq_f, cpu_iasq_b); #endif - nullify_save(ctx); - ctx->base.is_jmp = DISAS_IAQ_N_UPDATED; - } else if (ctx->iaoq_b == -1) { - tcg_gen_mov_reg(cpu_iaoq_b, ctx->iaoq_n_var); + nullify_save(ctx); + ctx->base.is_jmp = (ret == DISAS_IAQ_N_STALE_EXIT + ? DISAS_EXIT + : DISAS_IAQ_N_UPDATED); + } else if (ctx->iaoq_b == -1) { + tcg_gen_mov_reg(cpu_iaoq_b, ctx->iaoq_n_var); + } + break; + + default: + g_assert_not_reached(); } } @@ -4252,11 +4265,12 @@ static void hppa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) case DISAS_IAQ_N_UPDATED: if (ctx->base.singlestep_enabled) { gen_excp_1(EXCP_DEBUG); - } else if (is_jmp == DISAS_IAQ_N_STALE_EXIT) { - tcg_gen_exit_tb(NULL, 0); - } else { + } else if (is_jmp != DISAS_IAQ_N_STALE_EXIT) { tcg_gen_lookup_and_goto_ptr(); } + /* FALLTHRU */ + case DISAS_EXIT: + tcg_gen_exit_tb(NULL, 0); break; default: g_assert_not_reached();