forked from mirrors/linux
		
	powerpc: interrupt handler wrapper functions
Add wrapper functions (derived from x86 macros) for interrupt handler functions. This allows interrupt entry code to be written in C. 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-27-npiggin@gmail.com
This commit is contained in:
		
							parent
							
								
									11cb0a25f7
								
							
						
					
					
						commit
						8d41fc618a
					
				
					 1 changed files with 169 additions and 0 deletions
				
			
		
							
								
								
									
										169
									
								
								arch/powerpc/include/asm/interrupt.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								arch/powerpc/include/asm/interrupt.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,169 @@
 | 
			
		|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
 | 
			
		||||
#ifndef _ASM_POWERPC_INTERRUPT_H
 | 
			
		||||
#define _ASM_POWERPC_INTERRUPT_H
 | 
			
		||||
 | 
			
		||||
#include <linux/context_tracking.h>
 | 
			
		||||
#include <asm/ftrace.h>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DECLARE_INTERRUPT_HANDLER_RAW - Declare raw interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 * @returns:	Returns a value back to asm caller
 | 
			
		||||
 */
 | 
			
		||||
#define DECLARE_INTERRUPT_HANDLER_RAW(func)				\
 | 
			
		||||
	__visible long func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DEFINE_INTERRUPT_HANDLER_RAW - Define raw interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 * @returns:	Returns a value back to asm caller
 | 
			
		||||
 *
 | 
			
		||||
 * @func is called from ASM entry code.
 | 
			
		||||
 *
 | 
			
		||||
 * This is a plain function which does no tracing, reconciling, etc.
 | 
			
		||||
 * The macro is written so it acts as function definition. Append the
 | 
			
		||||
 * body with a pair of curly brackets.
 | 
			
		||||
 *
 | 
			
		||||
 * raw interrupt handlers must not enable or disable interrupts, or
 | 
			
		||||
 * schedule, tracing and instrumentation (ftrace, lockdep, etc) would
 | 
			
		||||
 * not be advisable either, although may be possible in a pinch, the
 | 
			
		||||
 * trace will look odd at least.
 | 
			
		||||
 *
 | 
			
		||||
 * A raw handler may call one of the other interrupt handler functions
 | 
			
		||||
 * to be converted into that interrupt context without these restrictions.
 | 
			
		||||
 *
 | 
			
		||||
 * On PPC64, _RAW handlers may return with fast_interrupt_return.
 | 
			
		||||
 *
 | 
			
		||||
 * Specific handlers may have additional restrictions.
 | 
			
		||||
 */
 | 
			
		||||
#define DEFINE_INTERRUPT_HANDLER_RAW(func)				\
 | 
			
		||||
static __always_inline long ____##func(struct pt_regs *regs);		\
 | 
			
		||||
									\
 | 
			
		||||
__visible noinstr long func(struct pt_regs *regs)			\
 | 
			
		||||
{									\
 | 
			
		||||
	long ret;							\
 | 
			
		||||
									\
 | 
			
		||||
	ret = ____##func (regs);					\
 | 
			
		||||
									\
 | 
			
		||||
	return ret;							\
 | 
			
		||||
}									\
 | 
			
		||||
									\
 | 
			
		||||
static __always_inline long ____##func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DECLARE_INTERRUPT_HANDLER - Declare synchronous interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 */
 | 
			
		||||
#define DECLARE_INTERRUPT_HANDLER(func)					\
 | 
			
		||||
	__visible void func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DEFINE_INTERRUPT_HANDLER - Define synchronous interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 *
 | 
			
		||||
 * @func is called from ASM entry code.
 | 
			
		||||
 *
 | 
			
		||||
 * The macro is written so it acts as function definition. Append the
 | 
			
		||||
 * body with a pair of curly brackets.
 | 
			
		||||
 */
 | 
			
		||||
#define DEFINE_INTERRUPT_HANDLER(func)					\
 | 
			
		||||
static __always_inline void ____##func(struct pt_regs *regs);		\
 | 
			
		||||
									\
 | 
			
		||||
__visible noinstr void func(struct pt_regs *regs)			\
 | 
			
		||||
{									\
 | 
			
		||||
	____##func (regs);						\
 | 
			
		||||
}									\
 | 
			
		||||
									\
 | 
			
		||||
static __always_inline void ____##func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DECLARE_INTERRUPT_HANDLER_RET - Declare synchronous interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 * @returns:	Returns a value back to asm caller
 | 
			
		||||
 */
 | 
			
		||||
#define DECLARE_INTERRUPT_HANDLER_RET(func)				\
 | 
			
		||||
	__visible long func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DEFINE_INTERRUPT_HANDLER_RET - Define synchronous interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 * @returns:	Returns a value back to asm caller
 | 
			
		||||
 *
 | 
			
		||||
 * @func is called from ASM entry code.
 | 
			
		||||
 *
 | 
			
		||||
 * The macro is written so it acts as function definition. Append the
 | 
			
		||||
 * body with a pair of curly brackets.
 | 
			
		||||
 */
 | 
			
		||||
#define DEFINE_INTERRUPT_HANDLER_RET(func)				\
 | 
			
		||||
static __always_inline long ____##func(struct pt_regs *regs);		\
 | 
			
		||||
									\
 | 
			
		||||
__visible noinstr long func(struct pt_regs *regs)			\
 | 
			
		||||
{									\
 | 
			
		||||
	long ret;							\
 | 
			
		||||
									\
 | 
			
		||||
	ret = ____##func (regs);					\
 | 
			
		||||
									\
 | 
			
		||||
	return ret;							\
 | 
			
		||||
}									\
 | 
			
		||||
									\
 | 
			
		||||
static __always_inline long ____##func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DECLARE_INTERRUPT_HANDLER_ASYNC - Declare asynchronous interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 */
 | 
			
		||||
#define DECLARE_INTERRUPT_HANDLER_ASYNC(func)				\
 | 
			
		||||
	__visible void func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DEFINE_INTERRUPT_HANDLER_ASYNC - Define asynchronous interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 *
 | 
			
		||||
 * @func is called from ASM entry code.
 | 
			
		||||
 *
 | 
			
		||||
 * The macro is written so it acts as function definition. Append the
 | 
			
		||||
 * body with a pair of curly brackets.
 | 
			
		||||
 */
 | 
			
		||||
#define DEFINE_INTERRUPT_HANDLER_ASYNC(func)				\
 | 
			
		||||
static __always_inline void ____##func(struct pt_regs *regs);		\
 | 
			
		||||
									\
 | 
			
		||||
__visible noinstr void func(struct pt_regs *regs)			\
 | 
			
		||||
{									\
 | 
			
		||||
	____##func (regs);						\
 | 
			
		||||
}									\
 | 
			
		||||
									\
 | 
			
		||||
static __always_inline void ____##func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DECLARE_INTERRUPT_HANDLER_NMI - Declare NMI interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 * @returns:	Returns a value back to asm caller
 | 
			
		||||
 */
 | 
			
		||||
#define DECLARE_INTERRUPT_HANDLER_NMI(func)				\
 | 
			
		||||
	__visible long func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * DEFINE_INTERRUPT_HANDLER_NMI - Define NMI interrupt handler function
 | 
			
		||||
 * @func:	Function name of the entry point
 | 
			
		||||
 * @returns:	Returns a value back to asm caller
 | 
			
		||||
 *
 | 
			
		||||
 * @func is called from ASM entry code.
 | 
			
		||||
 *
 | 
			
		||||
 * The macro is written so it acts as function definition. Append the
 | 
			
		||||
 * body with a pair of curly brackets.
 | 
			
		||||
 */
 | 
			
		||||
#define DEFINE_INTERRUPT_HANDLER_NMI(func)				\
 | 
			
		||||
static __always_inline long ____##func(struct pt_regs *regs);		\
 | 
			
		||||
									\
 | 
			
		||||
__visible noinstr long func(struct pt_regs *regs)			\
 | 
			
		||||
{									\
 | 
			
		||||
	long ret;							\
 | 
			
		||||
									\
 | 
			
		||||
	ret = ____##func (regs);					\
 | 
			
		||||
									\
 | 
			
		||||
	return ret;							\
 | 
			
		||||
}									\
 | 
			
		||||
									\
 | 
			
		||||
static __always_inline long ____##func(struct pt_regs *regs)
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_POWERPC_INTERRUPT_H */
 | 
			
		||||
		Loading…
	
		Reference in a new issue