13847dab7SHelge Deller /* SPDX-License-Identifier: GPL-2.0 */ 23847dab7SHelge Deller #ifndef __ASM_PARISC_ALTERNATIVE_H 33847dab7SHelge Deller #define __ASM_PARISC_ALTERNATIVE_H 43847dab7SHelge Deller 58cc28269SHelge Deller #define ALT_COND_ALWAYS 0x80 /* always replace instruction */ 63847dab7SHelge Deller #define ALT_COND_NO_SMP 0x01 /* when running UP instead of SMP */ 73847dab7SHelge Deller #define ALT_COND_NO_DCACHE 0x02 /* if system has no d-cache */ 83847dab7SHelge Deller #define ALT_COND_NO_ICACHE 0x04 /* if system has no i-cache */ 93847dab7SHelge Deller #define ALT_COND_NO_SPLIT_TLB 0x08 /* if split_tlb == 0 */ 103847dab7SHelge Deller #define ALT_COND_NO_IOC_FDC 0x10 /* if I/O cache does not need flushes */ 1182992fc7SHelge Deller #define ALT_COND_RUN_ON_QEMU 0x20 /* if running on QEMU */ 123847dab7SHelge Deller 133847dab7SHelge Deller #define INSN_PxTLB 0x02 /* modify pdtlb, pitlb */ 143847dab7SHelge Deller #define INSN_NOP 0x08000240 /* nop */ 153847dab7SHelge Deller 163847dab7SHelge Deller #ifndef __ASSEMBLY__ 173847dab7SHelge Deller 183847dab7SHelge Deller #include <linux/init.h> 193847dab7SHelge Deller #include <linux/types.h> 203847dab7SHelge Deller #include <linux/stddef.h> 213847dab7SHelge Deller #include <linux/stringify.h> 223847dab7SHelge Deller 233847dab7SHelge Deller struct alt_instr { 243847dab7SHelge Deller s32 orig_offset; /* offset to original instructions */ 25b148766eSHelge Deller s16 len; /* end of original instructions */ 26b148766eSHelge Deller u16 cond; /* see ALT_COND_XXX */ 273847dab7SHelge Deller u32 replacement; /* replacement instruction or code */ 28b148766eSHelge Deller } __packed; 293847dab7SHelge Deller 303847dab7SHelge Deller void set_kernel_text_rw(int enable_read_write); 318cc28269SHelge Deller void apply_alternatives_all(void); 328cc28269SHelge Deller void apply_alternatives(struct alt_instr *start, struct alt_instr *end, 338cc28269SHelge Deller const char *module_name); 343847dab7SHelge Deller 353847dab7SHelge Deller /* Alternative SMP implementation. */ 363847dab7SHelge Deller #define ALTERNATIVE(cond, replacement) "!0:" \ 37*3b6ff6bbSHelge Deller ".section .altinstructions, \"a\" !" \ 38*3b6ff6bbSHelge Deller ".align 4 !" \ 39b148766eSHelge Deller ".word (0b-4-.) !" \ 40b148766eSHelge Deller ".hword 1, " __stringify(cond) " !" \ 41b148766eSHelge Deller ".word " __stringify(replacement) " !" \ 423847dab7SHelge Deller ".previous" 433847dab7SHelge Deller 443847dab7SHelge Deller #else 453847dab7SHelge Deller 4682992fc7SHelge Deller /* to replace one single instructions by a new instruction */ 473847dab7SHelge Deller #define ALTERNATIVE(from, to, cond, replacement)\ 48*3b6ff6bbSHelge Deller .section .altinstructions, "a" ! \ 49*3b6ff6bbSHelge Deller .align 4 ! \ 50b148766eSHelge Deller .word (from - .) ! \ 51b148766eSHelge Deller .hword (to - from)/4, cond ! \ 52b148766eSHelge Deller .word replacement ! \ 533847dab7SHelge Deller .previous 543847dab7SHelge Deller 5582992fc7SHelge Deller /* to replace multiple instructions by new code */ 5682992fc7SHelge Deller #define ALTERNATIVE_CODE(from, num_instructions, cond, new_instr_ptr)\ 57*3b6ff6bbSHelge Deller .section .altinstructions, "a" ! \ 58*3b6ff6bbSHelge Deller .align 4 ! \ 59b148766eSHelge Deller .word (from - .) ! \ 60b148766eSHelge Deller .hword -num_instructions, cond ! \ 61b148766eSHelge Deller .word (new_instr_ptr - .) ! \ 6282992fc7SHelge Deller .previous 6382992fc7SHelge Deller 643847dab7SHelge Deller #endif /* __ASSEMBLY__ */ 653847dab7SHelge Deller 663847dab7SHelge Deller #endif /* __ASM_PARISC_ALTERNATIVE_H */ 67