From patchwork Sat Mar 16 16:24:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 160455 Delivered-To: patch@linaro.org Received: by 2002:a02:5cc1:0:0:0:0:0 with SMTP id w62csp787062jad; Sat, 16 Mar 2019 09:39:38 -0700 (PDT) X-Google-Smtp-Source: APXvYqy4VdkPPqZhz2m9UcWLPM6lwlBcTA57y0ESi59rEcSadYYjVamQW+Hh1fAuJE1ISN0saKeq X-Received: by 2002:adf:f54b:: with SMTP id j11mr6695611wrp.39.1552754378130; Sat, 16 Mar 2019 09:39:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552754378; cv=none; d=google.com; s=arc-20160816; b=YbjbXN16Cv3EBrN1mxS4ZTrrSnWfibbLSDkiQQxXhSsdjT6KKclbQ+rEStbWxm0aOT cAqZL3WdyScsBM/mZGhPtMZHqxPQ41RgeaHJ5pQKAmtyAAGfUsbp4Ekmn+0RdkMz+abj HKtL2Z8pZDDnxuZh6/tbdpy9mKSHouLlnOt9NPPRCe0T1dMYOJyWacSNoofKE2lmgNyx dSinnGFICmsuoek/GqiDOsAfzbjRSK2RO6WsP6YYuqyg7FbmiReaCvzTFb12A65vJEEC +hEdkTeEfTJR+9I8I/vRC3k0JHIj/5LpltDtvgCml0wXWhHVMPRV58hURdkv2w5rktlC i6WA== 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=TGTvh9mpF8xnmNB6CL1hnxtB2DhVugCS7o6BfwNDrKE=; b=0CMZ6HluFfHDrUBEaDVXbilDdMvwUHuH3yxbKL4eaMm6GO7GMg5E8RXcfBfopqmDCX 74CB+NtNExg68an1EZLkJmPhtqtp5UbhQqIKZpF2DkYXYYBYrP4WfzlDG1SV7VRt3gO7 4QauGflZK6WVR/lBFV1ZwQIIa97eBW3fL3wfIsmMLcX0oy0SLTpnau1Ic1hJ1j9O9Qkg PTAKBFNxl4NnH+0a2EF5zPiSU1UE+KIjG0nG994lEdSN81aKLIsGeIjGZr3F5Kv55+Uc FrbtmdgljJF6s+prD9KV/zms/7pAhxhYkca7QOIKL7nZqPVGvYRInn6T4xv4w+cVomvu 7UZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=MSOraLVm; 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 g7si3330384wru.334.2019.03.16.09.39.37 for (version=TLS1 cipher=AES128-SHA bits=128/128); Sat, 16 Mar 2019 09:39:38 -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=MSOraLVm; 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]:43990 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h5CLR-0008Tg-6I for patch@linaro.org; Sat, 16 Mar 2019 12:39:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:36690) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h5CHc-0005ws-Pu for qemu-devel@nongnu.org; Sat, 16 Mar 2019 12:35:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h5C7G-0002qh-3t for qemu-devel@nongnu.org; Sat, 16 Mar 2019 12:24:58 -0400 Received: from mail-pf1-x435.google.com ([2607:f8b0:4864:20::435]:38970) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h5C7F-0002q9-IJ for qemu-devel@nongnu.org; Sat, 16 Mar 2019 12:24:58 -0400 Received: by mail-pf1-x435.google.com with SMTP id i20so8414201pfo.6 for ; Sat, 16 Mar 2019 09:24:57 -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:in-reply-to:references; bh=TGTvh9mpF8xnmNB6CL1hnxtB2DhVugCS7o6BfwNDrKE=; b=MSOraLVmNA3pbNA4tVwKlJuMfYXth512ESl4d/PJEmRbLe5WAPW5kvEl5wstZcsFzO nlHqyooTfGAwuHVmQj/ixWn6L7M78H/GQpB9JqRZDCA3ECTt1TXj+ssA38KGxy6BMEJU KtEHjABOJ71mGEG7dLXr7x68sRA+ga2sndvCb5yF7fMp29xa5o5k1ugW8DFO4mkgM6Mb jhga0l+Mp3D7GIigytB17QLVTay1453C8yV7RyWaJtjWeKNnM73UJcVMUCo+o8f2CgpS /qHtQ1XU79DyV3kYp1lUUkRSTMvHu14ORpseO3b9j8HyQ+F+hHn3H+R8StDFGztRRJ3X By+g== 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=TGTvh9mpF8xnmNB6CL1hnxtB2DhVugCS7o6BfwNDrKE=; b=jYwBUbZcIA8RY3lF0mbWv5xGL3b9MJBYQfs4sO/9wKcisTs0JAvib4z1Bk6jm+hS1t dSu/wWthObKxpupQa3J9/Mm0rZkJMmhnDJmj2e8Pn0p51Me1ru8JBGjnq2qIjnb1bGJj d9TdQloKG+EaR7Crqy0Xc05GFitMD/GBwHT0ID8B815mqCuOPYaLy/rnn9zRvsHeAvu9 +45pd8/mB75cRTkqZgZ0vbAf4ACJzLWkQVeW+2azE6qHKZ6WojCxR5CVOdR8cFBdXA4m 8SrMIPtSoxWEJYpAW2yf0FrE82hbBqRsq7WbvOBkTGQ66W3HtEWkn4oE11L0DQ8Fyoff v6jA== X-Gm-Message-State: APjAAAXq4s/M1aPv0q4ww4dxzs0ByyAs5QUu4WWbGWZVJ1zzh/Lsp8yk 1SxTokdc1cShTuEGFH4LoVFKZBgSXLM= X-Received: by 2002:aa7:809a:: with SMTP id v26mr10218005pff.103.1552753496183; Sat, 16 Mar 2019 09:24:56 -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 x1sm10569412pge.73.2019.03.16.09.24.54 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 16 Mar 2019 09:24:55 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sat, 16 Mar 2019 09:24:51 -0700 Message-Id: <20190316162452.21284-2-richard.henderson@linaro.org> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190316162452.21284-1-richard.henderson@linaro.org> References: <20190316162452.21284-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::435 Subject: [Qemu-devel] [PULL 1/2] 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: peter.maydell@linaro.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. Tested-by: Sven Schnelle Reported-by: Sven Schnelle Signed-off-by: Richard Henderson --- target/hppa/translate.c | 42 +++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) -- 2.17.2 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();