xref: /kvm-unit-tests/lib/riscv/asm/processor.h (revision 0182459af36445327a0a4f6e724e550e27863168)
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)23 static inline struct thread_info *current_thread_info(void)
24 {
25 	return (struct thread_info *)csr_read(CSR_SSCRATCH);
26 }
27 
local_irq_enable(void)28 static inline void local_irq_enable(void)
29 {
30 	csr_set(CSR_SSTATUS, SR_SIE);
31 }
32 
local_irq_disable(void)33 static inline void local_irq_disable(void)
34 {
35 	csr_clear(CSR_SSTATUS, SR_SIE);
36 }
37 
local_ipi_enable(void)38 static inline void local_ipi_enable(void)
39 {
40 	csr_set(CSR_SIE, IE_SSIE);
41 }
42 
local_ipi_disable(void)43 static inline void local_ipi_disable(void)
44 {
45 	csr_clear(CSR_SIE, IE_SSIE);
46 }
47 
ipi_ack(void)48 static inline void ipi_ack(void)
49 {
50 	csr_clear(CSR_SIP, IE_SSIE);
51 }
52 
local_dlbtrp_enable(void)53 static inline void local_dlbtrp_enable(void)
54 {
55 	csr_set(CSR_SSTATUS, SR_SDT);
56 }
57 
local_dlbtrp_disable(void)58 static 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