1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __ASM_ALTERNATIVE_H 3*4882a593Smuzhiyun #define __ASM_ALTERNATIVE_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <asm/alternative-macros.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/init.h> 10*4882a593Smuzhiyun #include <linux/types.h> 11*4882a593Smuzhiyun #include <linux/stddef.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct alt_instr { 14*4882a593Smuzhiyun s32 orig_offset; /* offset to original instruction */ 15*4882a593Smuzhiyun s32 alt_offset; /* offset to replacement instruction */ 16*4882a593Smuzhiyun u16 cpufeature; /* cpufeature bit set for replacement */ 17*4882a593Smuzhiyun u8 orig_len; /* size of original instruction(s) */ 18*4882a593Smuzhiyun u8 alt_len; /* size of new instruction(s), <= orig_len */ 19*4882a593Smuzhiyun }; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun typedef void (*alternative_cb_t)(struct alt_instr *alt, 22*4882a593Smuzhiyun __le32 *origptr, __le32 *updptr, int nr_inst); 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun void __init apply_boot_alternatives(void); 25*4882a593Smuzhiyun void __init apply_alternatives_all(void); 26*4882a593Smuzhiyun bool alternative_is_applied(u16 cpufeature); 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #ifdef CONFIG_MODULES 29*4882a593Smuzhiyun void apply_alternatives_module(void *start, size_t length); 30*4882a593Smuzhiyun #else apply_alternatives_module(void * start,size_t length)31*4882a593Smuzhiyunstatic inline void apply_alternatives_module(void *start, size_t length) { } 32*4882a593Smuzhiyun #endif 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 35*4882a593Smuzhiyun #endif /* __ASM_ALTERNATIVE_H */ 36