From patchwork Thu Jul 21 06:44:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 651018 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rw4wr55d3z9sf9 for ; Thu, 21 Jul 2016 17:22:20 +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=hT1oGBtX; dkim-atps=neutral Received: from ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3rw4wr3P5VzDrLD for ; Thu, 21 Jul 2016 17:22:20 +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=hT1oGBtX; 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 3rw46C3d50zDqTC for ; Thu, 21 Jul 2016 16:45:23 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=hT1oGBtX; dkim-atps=neutral Received: by mail-pf0-x241.google.com with SMTP id h186so4888844pfg.2 for ; Wed, 20 Jul 2016 23:45:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=rRnKuYVhUcbIwDTzIAk0tEdaFuuPMScZjj5/7jrLtMg=; b=hT1oGBtXnSvt3aXFEBlEEQ5x0oFmLRGTnpWrOYJtqY6uDIP3OVhxl2zmgBOVF9sx2C vTuw7kyc4R0XYxsmcsJg6vPMV8obHWOSS6pODoSsh0TvkCjcMw3FsRuYwvl68sDZt1Zm FmWtLM3bVanAkaYuGXVHWnEUY5HSnZ8dK8stm/JHrOfSplfT2RVvbuDKfhJsk+1I3ESw uYV1UZiCDxuOSif+05Csq5psAmPWhKBMbuvFqwkpw4KQAblHfzH3TB/zcBzWvpOEHGKK 7Ss9odhPn3MdE+qGWkOh76lyiROp5Bow30bZ5/r/E8ukvrMoqrG4k4D3s1Po6GsEG8f/ wshw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=rRnKuYVhUcbIwDTzIAk0tEdaFuuPMScZjj5/7jrLtMg=; b=fAvA1xQ+LVvbB5hIo1XvUTiG8GkI4FTG6ZlN9Gvf6nTb5u3r8p/7+y5zVCY6XGReyl 9GhKhLSSPv04Csh/+ew+D3h45fCyoBuqKUy6V3WXUK4FEqdvMcOdd6at2K4mmQMmWJqQ aJLEyjwuXctpuXUjISCRhOHYUFTIsCp3CP68BwE+4ucdzw7PxLakQlfvtcpIgGTfU4BC k5k1GNEaZ3BiEsezdAtHpzYsd0b6St9jpOWm6TDU0P5+Q/o2itlVyTjYSPxj/GLtp/KP rDVR+XrzAYRpQvlEKNC+nhD5HcR9duxJ+hJatClrS8h5xtR2c2dAfaUHxjvcbjmy21e1 /tfQ== X-Gm-Message-State: ALyK8tIGTwCqmfRJT8/oo5R/Z8RjUsU2s4kSrj71x63KkRXj9jI0sctXtpce8sbmIlzjZw== X-Received: by 10.98.22.212 with SMTP id 203mr65294648pfw.74.1469083521849; Wed, 20 Jul 2016 23:45:21 -0700 (PDT) Received: from roar.ozlabs.ibm.com ([122.99.82.10]) by smtp.gmail.com with ESMTPSA id z10sm9071053pff.95.2016.07.20.23.45.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 20 Jul 2016 23:45:21 -0700 (PDT) From: Nicholas Piggin X-Google-Original-From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [PATCH 13/14] powerpc/pseries: consolidate slb exceptions Date: Thu, 21 Jul 2016 16:44:12 +1000 Message-Id: <1469083453-9279-14-git-send-email-npiggin@gmail.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1469083453-9279-1-git-send-email-npiggin@gmail.com> References: <1469083453-9279-1-git-send-email-npiggin@gmail.com> X-Mailman-Approved-At: Thu, 21 Jul 2016 16:57:32 +1000 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin MIME-Version: 1.0 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" slb exceptions all follow the same pattern, so put it in a macro. Generated code should be the same. Signed-off-by: Nick Piggin --- arch/powerpc/kernel/exceptions-64s.S | 172 ++++++++++++++--------------------- 1 file changed, 69 insertions(+), 103 deletions(-) diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index b7a8a66..c317faf 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -497,111 +497,32 @@ MMU_FTR_SECTION_ELSE ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_RADIX) COMMON_HANDLER_END(data_access_common) - -VECTOR_HANDLER_REAL_BEGIN(data_access_slb, 0x380, 0x400) - SET_SCRATCH0(r13) - EXCEPTION_PROLOG_0(PACA_EXSLB) - EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380) - std r3,PACA_EXSLB+EX_R3(r13) - mfspr r3,SPRN_DAR - mfspr r12,SPRN_SRR1 -#ifndef CONFIG_RELOCATABLE - b slb_miss_realmode -#else - /* - * We can't just use a direct branch to slb_miss_realmode - * because the distance from here to there depends on where - * the kernel ends up being put. - */ - mfctr r11 - ld r10,PACAKBASE(r13) - LOAD_HANDLER_4G(r10, slb_miss_realmode) - mtctr r10 - bctr -#endif -VECTOR_HANDLER_REAL_END(data_access_slb, 0x380, 0x400) - -VECTOR_HANDLER_VIRT_BEGIN(data_access_slb, 0x4380, 0x4400) - SET_SCRATCH0(r13) - EXCEPTION_PROLOG_0(PACA_EXSLB) - EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380) - std r3,PACA_EXSLB+EX_R3(r13) - mfspr r3,SPRN_DAR - mfspr r12,SPRN_SRR1 -#ifndef CONFIG_RELOCATABLE - b slb_miss_realmode -#else - /* - * We can't just use a direct branch to slb_miss_realmode - * because the distance from here to there depends on where - * the kernel ends up being put. - */ - mfctr r11 - ld r10,PACAKBASE(r13) - LOAD_HANDLER_4G(r10, slb_miss_realmode) - mtctr r10 - bctr -#endif -VECTOR_HANDLER_VIRT_END(data_access_slb, 0x4380, 0x4400) -TRAMP_KVM_SKIP(PACA_EXSLB, 0x380) - - -VECTOR_HANDLER_REAL(instruction_access, 0x400, 0x480) -VECTOR_HANDLER_VIRT(instruction_access, 0x4400, 0x4480, 0x400) -TRAMP_KVM(PACA_EXGEN, 0x400) -COMMON_HANDLER_BEGIN(instruction_access_common) - EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN) - RECONCILE_IRQ_STATE(r10, r11) - ld r12,_MSR(r1) - ld r3,_NIP(r1) - andis. r4,r12,0x5820 - li r5,0x400 - std r3,_DAR(r1) - std r4,_DSISR(r1) -BEGIN_MMU_FTR_SECTION - b do_hash_page /* Try to handle as hpte fault */ -MMU_FTR_SECTION_ELSE - b handle_page_fault -ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_RADIX) -COMMON_HANDLER_END(instruction_access_common) - - -VECTOR_HANDLER_REAL_BEGIN(instruction_access_slb, 0x480, 0x500) - SET_SCRATCH0(r13) - EXCEPTION_PROLOG_0(PACA_EXSLB) - EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480) - std r3,PACA_EXSLB+EX_R3(r13) - mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ - mfspr r12,SPRN_SRR1 -#ifndef CONFIG_RELOCATABLE - b slb_miss_realmode -#else - mfctr r11 - ld r10,PACAKBASE(r13) - LOAD_HANDLER_4G(r10, slb_miss_realmode) - mtctr r10 - bctr -#endif -VECTOR_HANDLER_REAL_END(instruction_access_slb, 0x480, 0x500) -VECTOR_HANDLER_VIRT_BEGIN(instruction_access_slb, 0x4480, 0x4500) - SET_SCRATCH0(r13) - EXCEPTION_PROLOG_0(PACA_EXSLB) - EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480) - std r3,PACA_EXSLB+EX_R3(r13) - mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ - mfspr r12,SPRN_SRR1 -#ifndef CONFIG_RELOCATABLE - b slb_miss_realmode +/* + * SLB miss macro takes care of all 4 cases (I/D, real/virt) + */ +#if defined(CONFIG_RELOCATABLE) +#define SLB_ACCESS_EXCEPTION(addr_spr, vec, TEST) \ + SET_SCRATCH0(r13); \ + EXCEPTION_PROLOG_0(PACA_EXSLB); \ + EXCEPTION_PROLOG_1(PACA_EXSLB, TEST, vec); \ + std r3,PACA_EXSLB+EX_R3(r13); \ + mfspr r3,addr_spr; \ + mfspr r12,SPRN_SRR1; \ + mfctr r11; \ + ld r10,PACAKBASE(r13); \ + LOAD_HANDLER_4G(r10, slb_miss_realmode); \ + mtctr r10; \ + bctr; #else - mfctr r11 - ld r10,PACAKBASE(r13) - LOAD_HANDLER_4G(r10, slb_miss_realmode) - mtctr r10 - bctr +#define SLB_ACCESS_EXCEPTION(addr_spr, vec, TEST) \ + SET_SCRATCH0(r13); \ + EXCEPTION_PROLOG_0(PACA_EXSLB); \ + EXCEPTION_PROLOG_1(PACA_EXSLB, TEST, vec); \ + std r3,PACA_EXSLB+EX_R3(r13); \ + mfspr r3,addr_spr; \ + mfspr r12,SPRN_SRR1; \ + b slb_miss_realmode; #endif -VECTOR_HANDLER_VIRT_END(instruction_access_slb, 0x4480, 0x4500) -TRAMP_KVM(PACA_EXSLB, 0x480) - TRAMP_HANDLER_BEGIN(slb_miss_realmode) /* @@ -674,6 +595,45 @@ COMMON_HANDLER_BEGIN(unrecov_slb) COMMON_HANDLER_END(unrecov_slb) +VECTOR_HANDLER_REAL_BEGIN(data_access_slb, 0x380, 0x400) + SLB_ACCESS_EXCEPTION(SPRN_DAR, 0x380, KVMTEST_PR) +VECTOR_HANDLER_REAL_END(data_access_slb, 0x380, 0x400) + +VECTOR_HANDLER_VIRT_BEGIN(data_access_slb, 0x4380, 0x4400) + SLB_ACCESS_EXCEPTION(SPRN_DAR, 0x380, NOTEST) +VECTOR_HANDLER_VIRT_END(data_access_slb, 0x4380, 0x4400) +TRAMP_KVM_SKIP(PACA_EXSLB, 0x380) + + +VECTOR_HANDLER_REAL(instruction_access, 0x400, 0x480) +VECTOR_HANDLER_VIRT(instruction_access, 0x4400, 0x4480, 0x400) +TRAMP_KVM(PACA_EXGEN, 0x400) +COMMON_HANDLER_BEGIN(instruction_access_common) + EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN) + RECONCILE_IRQ_STATE(r10, r11) + ld r12,_MSR(r1) + ld r3,_NIP(r1) + andis. r4,r12,0x5820 + li r5,0x400 + std r3,_DAR(r1) + std r4,_DSISR(r1) +BEGIN_MMU_FTR_SECTION + b do_hash_page /* Try to handle as hpte fault */ +MMU_FTR_SECTION_ELSE + b handle_page_fault +ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_RADIX) +COMMON_HANDLER_END(instruction_access_common) + + +VECTOR_HANDLER_REAL_BEGIN(instruction_access_slb, 0x480, 0x500) + SLB_ACCESS_EXCEPTION(SPRN_SRR0, 0x480, KVMTEST_PR) +VECTOR_HANDLER_REAL_END(instruction_access_slb, 0x480, 0x500) +VECTOR_HANDLER_VIRT_BEGIN(instruction_access_slb, 0x4480, 0x4500) + SLB_ACCESS_EXCEPTION(SPRN_SRR0, 0x480, NOTEST) +VECTOR_HANDLER_VIRT_END(instruction_access_slb, 0x4480, 0x4500) +TRAMP_KVM(PACA_EXSLB, 0x480) + + VECTOR_HANDLER_REAL_BEGIN(hardware_interrupt, 0x500, 0x600) .globl hardware_interrupt_hv; hardware_interrupt_hv: @@ -922,7 +882,13 @@ TRAMP_KVM_HV(PACA_EXGEN, 0xe40) COMMON_HANDLER(emulation_assist_common, 0xe40, emulation_assist_interrupt) +/* + * hmi_exception trampoline is a special case. It jumps to hmi_exception_early + * first, and then eventaully from there to the trampoline to get into virtual + * mode. + */ __VECTOR_HANDLER_REAL_OOL_HV_DIRECT(hmi_exception, 0xe60, 0xe80, hmi_exception_early) +__TRAMP_HANDLER_REAL_OOL_MASKABLE_HV(hmi_exception, 0xe60) VECTOR_HANDLER_VIRT_NONE(0x4e60, 0x4e80) TRAMP_KVM_HV(PACA_EXGEN, 0xe60) COMMON_HANDLER_BEGIN(hmi_exception_early)