From patchwork Tue Jun 13 13:05:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 775160 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wn9MX2kcsz9s81 for ; Tue, 13 Jun 2017 23:19:04 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Ovvv0Y95"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3wn9MX1bmkzDqMS for ; Tue, 13 Jun 2017 23:19:04 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Ovvv0Y95"; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from mail-pf0-x241.google.com (mail-pf0-x241.google.com [IPv6:2607:f8b0:400e:c00::241]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3wn9531md1zDqLl for ; Tue, 13 Jun 2017 23:06:31 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Ovvv0Y95"; dkim-atps=neutral Received: by mail-pf0-x241.google.com with SMTP id y7so21382076pfd.3 for ; Tue, 13 Jun 2017 06:06:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=84IBlI3UUBySYXkrT/WIMnUQx+O1NwwP7veDIDAceAg=; b=Ovvv0Y95Y0s/2rZG+sK5PDa3wAWilCv6+I9G/dZa7zGBeoBHIqHCNOJCiN4PAXPZJv 1V3li2LYEWPGDrug/YMfJsJY4heGfFo0pUfhpZvSS4NJGuve/3gdcGAB16dWiBPyltwQ 3Ds8jxensQXPQfs5aRp/h94rRAre60oyeQIoWjoFM7++Ygr+X7TrkdWRg/Jyk1crULrI pEdC2NqA0oig8Z4m5dsyQE/b7jXvW5BvavE7395djVbYpuAqOnDlJgqlSa5ko6QDaOIf OewN67h2Uc7ZTbalRz37/zEKXq64u6ddtqiDPjtdZunT9sFiPlL6X0LcHC/4FjkkxwjO 6oHg== 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=84IBlI3UUBySYXkrT/WIMnUQx+O1NwwP7veDIDAceAg=; b=WzYC0rUAW79zHd6EeTU+nWo30pC40bda20r6y4GFAuaHXFjM8n7mZZZ5xG0dgrx4N7 7djzIgc4E7dUgC94clQOQK4Sbzu1/tVBita7a70zLkZJ/jo40EmaMe/6CRAewvOeFx/w v/iKGGvMF36mkfqXtoVCEi1cuBaQ+LXBRTVU2UiqfcCW72I1TOMBKkQTq2PzL03GkcCM bZDSGOsDzwjJtUeDQqqc5zA9TUhn64c9VrN4B+hqBocQrRsFKbv5KNkmxWXlsrhbuGFR xf/09vAHoHJJnoXrnCc1fyEuMpyoIzmBxSXPuj0389w/i4cnp9dyj/BDBcF67LMiv/Fo zsJg== X-Gm-Message-State: AODbwcCFZ4l8Qt1f+73O6dBEJlpT25hbYRJVPvQ07QsnkZ4/Wba9V+bJ 6DAVw5P55SUbsOiT X-Received: by 10.99.127.73 with SMTP id p9mr63482451pgn.169.1497359189209; Tue, 13 Jun 2017 06:06:29 -0700 (PDT) Received: from roar.au.ibm.com ([210.185.119.63]) by smtp.gmail.com with ESMTPSA id y28sm27750667pfd.32.2017.06.13.06.06.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 13 Jun 2017 06:06:28 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [PATCH 06/13] powerpc/64s: idle branch to handler with virtual mode offset Date: Tue, 13 Jun 2017 23:05:50 +1000 Message-Id: <20170613130557.26315-7-npiggin@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170613130557.26315-1-npiggin@gmail.com> References: <20170613130557.26315-1-npiggin@gmail.com> X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Gautham R . Shenoy" , Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Have the system reset idle wakeup handlers branched to in real mode with the 0xc... kernel address applied. This allows simplifications of avoiding rfid when switching to virtual mode in the wakeup handler. Signed-off-by: Nicholas Piggin --- arch/powerpc/include/asm/exception-64s.h | 13 +++++++++++++ arch/powerpc/kernel/exceptions-64s.S | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index 183d73b6ed99..33473cbc0986 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h @@ -236,6 +236,19 @@ END_FTR_SECTION_NESTED(ftr,ftr,943) #define kvmppc_interrupt kvmppc_interrupt_pr #endif +/* + * Branch to label using its 0xC000 address. This results in instruction + * address suitable for MSR[IR]=0 or 1, which allows relocation to be turned + * on using mtmsr rather than rfid. + * + * This could set the 0xc bits for !RELOCATABLE as an immediate, rather than + * load KBASE for a slight optimisation. + */ +#define BRANCH_TO_C000(reg, label) \ + __LOAD_HANDLER(reg, label); \ + mtctr reg; \ + bctr + #ifdef CONFIG_RELOCATABLE #define BRANCH_TO_COMMON(reg, label) \ __LOAD_HANDLER(reg, label); \ diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 31a9114860c4..ada0a20ef46c 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -99,7 +99,9 @@ EXC_VIRT_NONE(0x4000, 0x100) #ifdef CONFIG_PPC_P7_NAP /* * If running native on arch 2.06 or later, check if we are waking up - * from nap/sleep/winkle, and branch to idle handler. + * from nap/sleep/winkle, and branch to idle handler. The idle wakeup + * handler initially runs in real mode, but we branch to the 0xc000... + * address so we can turn on relocation with mtmsr. */ #define IDLETEST(n) \ BEGIN_FTR_SECTION ; \ @@ -107,7 +109,7 @@ EXC_VIRT_NONE(0x4000, 0x100) rlwinm. r10,r10,47-31,30,31 ; \ beq- 1f ; \ cmpwi cr3,r10,2 ; \ - BRANCH_TO_COMMON(r10, system_reset_idle_common) ; \ + BRANCH_TO_C000(r10, system_reset_idle_common) ; \ 1: \ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206) #else