powerpc: add interrupt wrapper entry / exit stub functions
authorNicholas Piggin <npiggin@gmail.com>
Sat, 30 Jan 2021 13:08:37 +0000 (23:08 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 8 Feb 2021 13:02:12 +0000 (00:02 +1100)
These will be used by subsequent patches.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210130130852.2952424-28-npiggin@gmail.com
arch/powerpc/include/asm/interrupt.h

index 5e2526a..3df1921 100644 (file)
@@ -5,6 +5,50 @@
 #include <linux/context_tracking.h>
 #include <asm/ftrace.h>
 
+struct interrupt_state {
+};
+
+static inline void interrupt_enter_prepare(struct pt_regs *regs, struct interrupt_state *state)
+{
+}
+
+/*
+ * Care should be taken to note that interrupt_exit_prepare and
+ * interrupt_async_exit_prepare do not necessarily return immediately to
+ * regs context (e.g., if regs is usermode, we don't necessarily return to
+ * user mode). Other interrupts might be taken between here and return,
+ * context switch / preemption may occur in the exit path after this, or a
+ * signal may be delivered, etc.
+ *
+ * The real interrupt exit code is platform specific, e.g.,
+ * interrupt_exit_user_prepare / interrupt_exit_kernel_prepare for 64s.
+ *
+ * However interrupt_nmi_exit_prepare does return directly to regs, because
+ * NMIs do not do "exit work" or replay soft-masked interrupts.
+ */
+static inline void interrupt_exit_prepare(struct pt_regs *regs, struct interrupt_state *state)
+{
+}
+
+static inline void interrupt_async_enter_prepare(struct pt_regs *regs, struct interrupt_state *state)
+{
+}
+
+static inline void interrupt_async_exit_prepare(struct pt_regs *regs, struct interrupt_state *state)
+{
+}
+
+struct interrupt_nmi_state {
+};
+
+static inline void interrupt_nmi_enter_prepare(struct pt_regs *regs, struct interrupt_nmi_state *state)
+{
+}
+
+static inline void interrupt_nmi_exit_prepare(struct pt_regs *regs, struct interrupt_nmi_state *state)
+{
+}
+
 /**
  * DECLARE_INTERRUPT_HANDLER_RAW - Declare raw interrupt handler function
  * @func:      Function name of the entry point
@@ -71,7 +115,13 @@ static __always_inline void ____##func(struct pt_regs *regs);               \
                                                                        \
 __visible noinstr void func(struct pt_regs *regs)                      \
 {                                                                      \
+       struct interrupt_state state;                                   \
+                                                                       \
+       interrupt_enter_prepare(regs, &state);                          \
+                                                                       \
        ____##func (regs);                                              \
+                                                                       \
+       interrupt_exit_prepare(regs, &state);                           \
 }                                                                      \
                                                                        \
 static __always_inline void ____##func(struct pt_regs *regs)
@@ -99,10 +149,15 @@ static __always_inline long ____##func(struct pt_regs *regs);              \
                                                                        \
 __visible noinstr long func(struct pt_regs *regs)                      \
 {                                                                      \
+       struct interrupt_state state;                                   \
        long ret;                                                       \
                                                                        \
+       interrupt_enter_prepare(regs, &state);                          \
+                                                                       \
        ret = ____##func (regs);                                        \
                                                                        \
+       interrupt_exit_prepare(regs, &state);                           \
+                                                                       \
        return ret;                                                     \
 }                                                                      \
                                                                        \
@@ -129,7 +184,13 @@ static __always_inline void ____##func(struct pt_regs *regs);              \
                                                                        \
 __visible noinstr void func(struct pt_regs *regs)                      \
 {                                                                      \
+       struct interrupt_state state;                                   \
+                                                                       \
+       interrupt_async_enter_prepare(regs, &state);                    \
+                                                                       \
        ____##func (regs);                                              \
+                                                                       \
+       interrupt_async_exit_prepare(regs, &state);                     \
 }                                                                      \
                                                                        \
 static __always_inline void ____##func(struct pt_regs *regs)
@@ -157,10 +218,15 @@ static __always_inline long ____##func(struct pt_regs *regs);             \
                                                                        \
 __visible noinstr long func(struct pt_regs *regs)                      \
 {                                                                      \
+       struct interrupt_nmi_state state;                               \
        long ret;                                                       \
                                                                        \
+       interrupt_nmi_enter_prepare(regs, &state);                      \
+                                                                       \
        ret = ____##func (regs);                                        \
                                                                        \
+       interrupt_nmi_exit_prepare(regs, &state);                       \
+                                                                       \
        return ret;                                                     \
 }                                                                      \
                                                                        \