12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 28aa34ab8SBenjamin Herrenschmidt #ifndef _ASM_POWERPC_EXCEPTION_H 38aa34ab8SBenjamin Herrenschmidt #define _ASM_POWERPC_EXCEPTION_H 48aa34ab8SBenjamin Herrenschmidt /* 58aa34ab8SBenjamin Herrenschmidt * Extracted from head_64.S 68aa34ab8SBenjamin Herrenschmidt * 78aa34ab8SBenjamin Herrenschmidt * PowerPC version 88aa34ab8SBenjamin Herrenschmidt * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) 98aa34ab8SBenjamin Herrenschmidt * 108aa34ab8SBenjamin Herrenschmidt * Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP 118aa34ab8SBenjamin Herrenschmidt * Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu> 128aa34ab8SBenjamin Herrenschmidt * Adapted for Power Macintosh by Paul Mackerras. 138aa34ab8SBenjamin Herrenschmidt * Low-level exception handlers and MMU support 148aa34ab8SBenjamin Herrenschmidt * rewritten by Paul Mackerras. 158aa34ab8SBenjamin Herrenschmidt * Copyright (C) 1996 Paul Mackerras. 168aa34ab8SBenjamin Herrenschmidt * 178aa34ab8SBenjamin Herrenschmidt * Adapted for 64bit PowerPC by Dave Engebretsen, Peter Bergner, and 188aa34ab8SBenjamin Herrenschmidt * Mike Corrigan {engebret|bergner|mikejc}@us.ibm.com 198aa34ab8SBenjamin Herrenschmidt * 208aa34ab8SBenjamin Herrenschmidt * This file contains the low-level support and setup for the 218aa34ab8SBenjamin Herrenschmidt * PowerPC-64 platform, including trap and interrupt dispatch. 228aa34ab8SBenjamin Herrenschmidt */ 238aa34ab8SBenjamin Herrenschmidt /* 248aa34ab8SBenjamin Herrenschmidt * The following macros define the code that appears as 258aa34ab8SBenjamin Herrenschmidt * the prologue to each of the exception handlers. They 268aa34ab8SBenjamin Herrenschmidt * are split into two parts to allow a single kernel binary 278aa34ab8SBenjamin Herrenschmidt * to be used for pSeries and iSeries. 288aa34ab8SBenjamin Herrenschmidt * 298aa34ab8SBenjamin Herrenschmidt * We make as much of the exception code common between native 308aa34ab8SBenjamin Herrenschmidt * exception handlers (including pSeries LPAR) and iSeries LPAR 318aa34ab8SBenjamin Herrenschmidt * implementations as possible. 328aa34ab8SBenjamin Herrenschmidt */ 332c86cd18SChristophe Leroy #include <asm/feature-fixups.h> 348aa34ab8SBenjamin Herrenschmidt 3515820091SNicholas Piggin /* PACA save area size in u64 units (exgen, exmc, etc) */ 3615820091SNicholas Piggin #define EX_SIZE 10 37dbeea1d6SNicholas Piggin 38dbeea1d6SNicholas Piggin /* 39ba41e1e1SBalbir Singh * maximum recursive depth of MCE exceptions 40ba41e1e1SBalbir Singh */ 41ba41e1e1SBalbir Singh #define MAX_MCE_DEPTH 4 42ba41e1e1SBalbir Singh 434508a74aSNicholas Piggin #ifdef __ASSEMBLY__ 44635942aeSNicholas Piggin 45a048a07dSNicholas Piggin #define STF_ENTRY_BARRIER_SLOT \ 46a048a07dSNicholas Piggin STF_ENTRY_BARRIER_FIXUP_SECTION; \ 47a048a07dSNicholas Piggin nop; \ 48a048a07dSNicholas Piggin nop; \ 49a048a07dSNicholas Piggin nop 50a048a07dSNicholas Piggin 51a048a07dSNicholas Piggin #define STF_EXIT_BARRIER_SLOT \ 52a048a07dSNicholas Piggin STF_EXIT_BARRIER_FIXUP_SECTION; \ 53a048a07dSNicholas Piggin nop; \ 54a048a07dSNicholas Piggin nop; \ 55a048a07dSNicholas Piggin nop; \ 56a048a07dSNicholas Piggin nop; \ 57a048a07dSNicholas Piggin nop; \ 58a048a07dSNicholas Piggin nop 59a048a07dSNicholas Piggin 60a048a07dSNicholas Piggin /* 61a048a07dSNicholas Piggin * r10 must be free to use, r13 must be paca 62a048a07dSNicholas Piggin */ 63a048a07dSNicholas Piggin #define INTERRUPT_TO_KERNEL \ 64a048a07dSNicholas Piggin STF_ENTRY_BARRIER_SLOT 65a048a07dSNicholas Piggin 66aa8a5e00SMichael Ellerman /* 67aa8a5e00SMichael Ellerman * Macros for annotating the expected destination of (h)rfid 68aa8a5e00SMichael Ellerman * 69aa8a5e00SMichael Ellerman * The nop instructions allow us to insert one or more instructions to flush the 70aa8a5e00SMichael Ellerman * L1-D cache when returning to userspace or a guest. 712384b36fSNicholas Piggin * 722384b36fSNicholas Piggin * powerpc relies on return from interrupt/syscall being context synchronising 732384b36fSNicholas Piggin * (which hrfid, rfid, and rfscv are) to support ARCH_HAS_MEMBARRIER_SYNC_CORE 742384b36fSNicholas Piggin * without additional synchronisation instructions. 752384b36fSNicholas Piggin * 762384b36fSNicholas Piggin * soft-masked interrupt replay does not include a context-synchronising rfid, 772384b36fSNicholas Piggin * but those always return to kernel, the sync is only required when returning 782384b36fSNicholas Piggin * to user. 79aa8a5e00SMichael Ellerman */ 80aa8a5e00SMichael Ellerman #define RFI_FLUSH_SLOT \ 81aa8a5e00SMichael Ellerman RFI_FLUSH_FIXUP_SECTION; \ 82aa8a5e00SMichael Ellerman nop; \ 83aa8a5e00SMichael Ellerman nop; \ 84aa8a5e00SMichael Ellerman nop 8550e51c13SNicholas Piggin 8650e51c13SNicholas Piggin #define RFI_TO_KERNEL \ 8750e51c13SNicholas Piggin rfid 8850e51c13SNicholas Piggin 8950e51c13SNicholas Piggin #define RFI_TO_USER \ 90a048a07dSNicholas Piggin STF_EXIT_BARRIER_SLOT; \ 91aa8a5e00SMichael Ellerman RFI_FLUSH_SLOT; \ 92aa8a5e00SMichael Ellerman rfid; \ 93aa8a5e00SMichael Ellerman b rfi_flush_fallback 9450e51c13SNicholas Piggin 9550e51c13SNicholas Piggin #define RFI_TO_USER_OR_KERNEL \ 96a048a07dSNicholas Piggin STF_EXIT_BARRIER_SLOT; \ 97aa8a5e00SMichael Ellerman RFI_FLUSH_SLOT; \ 98aa8a5e00SMichael Ellerman rfid; \ 99aa8a5e00SMichael Ellerman b rfi_flush_fallback 10050e51c13SNicholas Piggin 10150e51c13SNicholas Piggin #define RFI_TO_GUEST \ 102a048a07dSNicholas Piggin STF_EXIT_BARRIER_SLOT; \ 103aa8a5e00SMichael Ellerman RFI_FLUSH_SLOT; \ 104aa8a5e00SMichael Ellerman rfid; \ 105aa8a5e00SMichael Ellerman b rfi_flush_fallback 10650e51c13SNicholas Piggin 10750e51c13SNicholas Piggin #define HRFI_TO_KERNEL \ 10850e51c13SNicholas Piggin hrfid 10950e51c13SNicholas Piggin 11050e51c13SNicholas Piggin #define HRFI_TO_USER \ 111a048a07dSNicholas Piggin STF_EXIT_BARRIER_SLOT; \ 112aa8a5e00SMichael Ellerman RFI_FLUSH_SLOT; \ 113aa8a5e00SMichael Ellerman hrfid; \ 114aa8a5e00SMichael Ellerman b hrfi_flush_fallback 11550e51c13SNicholas Piggin 11650e51c13SNicholas Piggin #define HRFI_TO_USER_OR_KERNEL \ 117a048a07dSNicholas Piggin STF_EXIT_BARRIER_SLOT; \ 118aa8a5e00SMichael Ellerman RFI_FLUSH_SLOT; \ 119aa8a5e00SMichael Ellerman hrfid; \ 120aa8a5e00SMichael Ellerman b hrfi_flush_fallback 12150e51c13SNicholas Piggin 12250e51c13SNicholas Piggin #define HRFI_TO_GUEST \ 123a048a07dSNicholas Piggin STF_EXIT_BARRIER_SLOT; \ 124aa8a5e00SMichael Ellerman RFI_FLUSH_SLOT; \ 125aa8a5e00SMichael Ellerman hrfid; \ 126aa8a5e00SMichael Ellerman b hrfi_flush_fallback 12750e51c13SNicholas Piggin 12850e51c13SNicholas Piggin #define HRFI_TO_UNKNOWN \ 129a048a07dSNicholas Piggin STF_EXIT_BARRIER_SLOT; \ 130aa8a5e00SMichael Ellerman RFI_FLUSH_SLOT; \ 131aa8a5e00SMichael Ellerman hrfid; \ 132aa8a5e00SMichael Ellerman b hrfi_flush_fallback 13350e51c13SNicholas Piggin 1344508a74aSNicholas Piggin #endif /* __ASSEMBLY__ */ 1358aa34ab8SBenjamin Herrenschmidt 1368aa34ab8SBenjamin Herrenschmidt #endif /* _ASM_POWERPC_EXCEPTION_H */ 137