1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 #ifndef _ASMRISCV_PROCESSOR_H_ 3 #define _ASMRISCV_PROCESSOR_H_ 4 #include <asm/csr.h> 5 #include <asm/ptrace.h> 6 7 #define EXCEPTION_CAUSE_MAX 24 8 #define INTERRUPT_CAUSE_MAX 16 9 10 #define RV_INSN_LEN(insn) ((((insn) & 0x3) < 0x3) ? 2 : 4) 11 12 typedef void (*exception_fn)(struct pt_regs *); 13 14 struct thread_info { 15 int cpu; 16 unsigned long hartid; 17 unsigned long isa[1]; 18 unsigned long sp; 19 exception_fn exception_handlers[EXCEPTION_CAUSE_MAX]; 20 exception_fn interrupt_handlers[INTERRUPT_CAUSE_MAX]; 21 }; 22 current_thread_info(void)23static inline struct thread_info *current_thread_info(void) 24 { 25 return (struct thread_info *)csr_read(CSR_SSCRATCH); 26 } 27 local_irq_enable(void)28static inline void local_irq_enable(void) 29 { 30 csr_set(CSR_SSTATUS, SR_SIE); 31 } 32 local_irq_disable(void)33static inline void local_irq_disable(void) 34 { 35 csr_clear(CSR_SSTATUS, SR_SIE); 36 } 37 local_ipi_enable(void)38static inline void local_ipi_enable(void) 39 { 40 csr_set(CSR_SIE, IE_SSIE); 41 } 42 local_ipi_disable(void)43static inline void local_ipi_disable(void) 44 { 45 csr_clear(CSR_SIE, IE_SSIE); 46 } 47 ipi_ack(void)48static inline void ipi_ack(void) 49 { 50 csr_clear(CSR_SIP, IE_SSIE); 51 } 52 local_dlbtrp_enable(void)53static inline void local_dlbtrp_enable(void) 54 { 55 csr_set(CSR_SSTATUS, SR_SDT); 56 } 57 local_dlbtrp_disable(void)58static inline void local_dlbtrp_disable(void) 59 { 60 csr_clear(CSR_SSTATUS, SR_SDT); 61 } 62 63 void install_exception_handler(unsigned long cause, void (*handler)(struct pt_regs *)); 64 void install_irq_handler(unsigned long cause, void (*handler)(struct pt_regs *)); 65 void do_handle_exception(struct pt_regs *regs); 66 void thread_info_init(void); 67 void local_hart_init(void); 68 69 void show_regs(struct pt_regs *regs); 70 71 #endif /* _ASMRISCV_PROCESSOR_H_ */ 72