| /* SPDX-License-Identifier: GPL-2.0-only */ | |
| #ifndef _ASMRISCV_PROCESSOR_H_ | |
| #define _ASMRISCV_PROCESSOR_H_ | |
| #include <asm/csr.h> | |
| #include <asm/ptrace.h> | |
| #define EXCEPTION_CAUSE_MAX 24 | |
| #define INTERRUPT_CAUSE_MAX 16 | |
| #define RV_INSN_LEN(insn) ((((insn) & 0x3) < 0x3) ? 2 : 4) | |
| typedef void (*exception_fn)(struct pt_regs *); | |
| struct thread_info { | |
| int cpu; | |
| unsigned long hartid; | |
| unsigned long isa[1]; | |
| unsigned long sp; | |
| exception_fn exception_handlers[EXCEPTION_CAUSE_MAX]; | |
| exception_fn interrupt_handlers[INTERRUPT_CAUSE_MAX]; | |
| }; | |
| static inline struct thread_info *current_thread_info(void) | |
| { | |
| return (struct thread_info *)csr_read(CSR_SSCRATCH); | |
| } | |
| static inline void local_irq_enable(void) | |
| { | |
| csr_set(CSR_SSTATUS, SR_SIE); | |
| } | |
| static inline void local_irq_disable(void) | |
| { | |
| csr_clear(CSR_SSTATUS, SR_SIE); | |
| } | |
| static inline void local_ipi_enable(void) | |
| { | |
| csr_set(CSR_SIE, IE_SSIE); | |
| } | |
| static inline void local_ipi_disable(void) | |
| { | |
| csr_clear(CSR_SIE, IE_SSIE); | |
| } | |
| static inline void ipi_ack(void) | |
| { | |
| csr_clear(CSR_SIP, IE_SSIE); | |
| } | |
| static inline void local_dlbtrp_enable(void) | |
| { | |
| csr_set(CSR_SSTATUS, SR_SDT); | |
| } | |
| static inline void local_dlbtrp_disable(void) | |
| { | |
| csr_clear(CSR_SSTATUS, SR_SDT); | |
| } | |
| void install_exception_handler(unsigned long cause, void (*handler)(struct pt_regs *)); | |
| void install_irq_handler(unsigned long cause, void (*handler)(struct pt_regs *)); | |
| void do_handle_exception(struct pt_regs *regs); | |
| void thread_info_init(void); | |
| void local_hart_init(void); | |
| void show_regs(struct pt_regs *regs); | |
| #endif /* _ASMRISCV_PROCESSOR_H_ */ |