From patchwork Fri Mar 10 13:15:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Gardner X-Patchwork-Id: 737415 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 3vfnpQ3xVhz9s7k; Sat, 11 Mar 2017 00:16:30 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=canonical-com.20150623.gappssmtp.com header.i=@canonical-com.20150623.gappssmtp.com header.b="UCekRPpS"; dkim-atps=neutral Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1cmKPC-0000Pl-MM; Fri, 10 Mar 2017 13:16:26 +0000 Received: from mail-io0-f181.google.com ([209.85.223.181]) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1cmKOq-0000FC-3B for kernel-team@lists.ubuntu.com; Fri, 10 Mar 2017 13:16:04 +0000 Received: by mail-io0-f181.google.com with SMTP id g6so48047764ioj.1 for ; Fri, 10 Mar 2017 05:16:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=1wPUVJnnwmiCNUSDTxewkf0M6eeAG3URyZRMRkL81z8=; b=UCekRPpS3EIcEDsDMWG+Bq/x/A3KXfOtmoValYzpKqWNQUL5YQOl4j1h6i3y+1Y/Lp PBU1Py6Nhmalu9oFaf3sZ3+AydNelBz27QRCIrAFQScFAI5k8WaXHQyrdXWgGPc0V5hJ WFIkHTbTX2hV+9LmzvfORHSDZ5nK/x+tN3uJHKzq2EKTKZpRttS3L/a1Q/DZj9cT15KG G0yxlyssvfZP53qMLC4oGu6VbIpIL9twA60z7E+HC0pyqT9UHjWdUoAkPyn9NHJCg4yH FkHuiNyUqETyZrSxTuhgiHkundK0frUWCaiHBetpYUhmwg4EM5b/QN9cB9qREK6pVwhE 0Xsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=1wPUVJnnwmiCNUSDTxewkf0M6eeAG3URyZRMRkL81z8=; b=Uz/9CfTWqB4+kwnptcxK/by5HCu80rE4wFsj6qThi+OOAEOyWA5peBWyIJAY92/RbP lRxHurOelMkMha8huZcigwIJ83ZkhJaWIImpiR/7sm3XOk7Fe/Y5x0+JAVdpt7YqaeZQ tUQBE7j3TZR8+NYNcu9/yesFnujZAJz0Y9q2YRUK6WyrXSg+BmbrBrNK/+fLvKRJDxO9 0dgWvIju9keW55lIITtCjhFaIuO1GKpzDeiyF2sWRV8WyMb1EkJUKN99b0UbdY6QKSUp mTdHHAAPwf1YcfuGu22NOR+zpWVMrbQmX44vBWQ5aYSaNQFduZVdeKsIl+ab5YWxnWkM EVjw== X-Gm-Message-State: AMke39n2SIGaSI65O5MDkAJk2iuGKOyY4sk6DXwxgdIf4rxFIP6wSJOX7bHzEbRQTccHMUT7 X-Received: by 10.107.46.198 with SMTP id u67mr18214075iou.8.1489151762726; Fri, 10 Mar 2017 05:16:02 -0800 (PST) Received: from localhost.localdomain (host-98-127-250-84.bln-mt.client.bresnan.net. [98.127.250.84]) by smtp.gmail.com with ESMTPSA id h12sm4348476iod.57.2017.03.10.05.16.01 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 10 Mar 2017 05:16:02 -0800 (PST) From: Tim Gardner To: kernel-team@lists.ubuntu.com Subject: [PATCH 6/6] powerpc/powernv: Fix bug due to labeling ambiguity in power_enter_stop Date: Fri, 10 Mar 2017 06:15:50 -0700 Message-Id: <1489151750-6289-7-git-send-email-tim.gardner@canonical.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1489151750-6289-1-git-send-email-tim.gardner@canonical.com> References: <1489151750-6289-1-git-send-email-tim.gardner@canonical.com> X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: "Gautham R. Shenoy" BugLink: http://bugs.launchpad.net/bugs/1666197 Commit 09206b600c76 ("powernv: Pass PSSCR value and mask to power9_idle_stop") added additional code in power_enter_stop() to distinguish between stop requests whose PSSCR had ESL=EC=1 from those which did not. When ESL=EC=1, we do a forward-jump to a location labelled by "1", which had the code to handle the ESL=EC=1 case. Unfortunately just a couple of instructions before this label, is the macro IDLE_STATE_ENTER_SEQ() which also has a label "1" in its expansion. As a result, the current code can result in directly executing stop instruction for deep stop requests with PSSCR ESL=EC=1, without saving the hypervisor state. Fix this BUG by labeling the location that handles ESL=EC=1 case with a more descriptive label ".Lhandle_esl_ec_set" (local label suggestion a la .Lxx from Anton Blanchard). While at it, rename the label "2" labelling the location of the code handling entry into deep stop states with ".Lhandle_deep_stop". For a good measure, change the label in IDLE_STATE_ENTER_SEQ() macro to an not-so commonly used value in order to avoid similar mishaps in the future. Cherry-picked from commit 424f8acd328a ("powerpc/powernv: Fix bug due to labeling ambiguity in power_enter_stop") Fixes: 09206b600c76 ("powernv: Pass PSSCR value and mask to power9_idle_stop") Signed-off-by: Gautham R. Shenoy Signed-off-by: Michael Ellerman Signed-off-by: Tim Gardner --- arch/powerpc/include/asm/cpuidle.h | 4 ++-- arch/powerpc/kernel/idle_book3s.S | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/powerpc/include/asm/cpuidle.h b/arch/powerpc/include/asm/cpuidle.h index 65d8078..82ea83d 100644 --- a/arch/powerpc/include/asm/cpuidle.h +++ b/arch/powerpc/include/asm/cpuidle.h @@ -70,8 +70,8 @@ static inline void report_invalid_psscr_val(u64 psscr_val, int err) std r0,0(r1); \ ptesync; \ ld r0,0(r1); \ -1: cmpd cr0,r0,r0; \ - bne 1b; \ +236: cmpd cr0,r0,r0; \ + bne 236b; \ IDLE_INST; \ #define IDLE_STATE_ENTER_SEQ_NORET(IDLE_INST) \ diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index 4f6cf55..4724ccc 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S @@ -276,19 +276,21 @@ power_enter_stop: */ andis. r4,r3,PSSCR_EC_ESL_MASK_SHIFTED clrldi r3,r3,60 /* r3 = Bits[60:63] = Requested Level (RL) */ - bne 1f + bne .Lhandle_esl_ec_set IDLE_STATE_ENTER_SEQ(PPC_STOP) li r3,0 /* Since we didn't lose state, return 0 */ b pnv_wakeup_noloss + +.Lhandle_esl_ec_set: /* * Check if the requested state is a deep idle state. */ -1: LOAD_REG_ADDRBASE(r5,pnv_first_deep_stop_state) + LOAD_REG_ADDRBASE(r5,pnv_first_deep_stop_state) ld r4,ADDROFF(pnv_first_deep_stop_state)(r5) cmpd r3,r4 - bge 2f + bge .Lhandle_deep_stop IDLE_STATE_ENTER_SEQ_NORET(PPC_STOP) -2: +.Lhandle_deep_stop: /* * Entering deep idle state. * Clear thread bit in PACA_CORE_IDLE_STATE, save SPRs to