161cfe9a2SMarouene Boubakri /* SPDX-License-Identifier: BSD-2-Clause */
261cfe9a2SMarouene Boubakri /*
3cbaab388SMarouene Boubakri * Copyright 2022-2023 NXP
461cfe9a2SMarouene Boubakri */
561cfe9a2SMarouene Boubakri
6d50fee03SEtienne Carriere #ifndef __RISCV_H
7d50fee03SEtienne Carriere #define __RISCV_H
861cfe9a2SMarouene Boubakri
961cfe9a2SMarouene Boubakri #include <compiler.h>
1061cfe9a2SMarouene Boubakri #include <encoding.h>
11e10bcf3bSAlvin Chang #include <stdbool.h>
1261cfe9a2SMarouene Boubakri #include <stdint.h>
1361cfe9a2SMarouene Boubakri #include <sys/cdefs.h>
1461cfe9a2SMarouene Boubakri #include <util.h>
1561cfe9a2SMarouene Boubakri
16*e27b0796SYu-Chien Peter Lin /* The stack pointer is always kept 16-byte aligned */
17*e27b0796SYu-Chien Peter Lin #define STACK_ALIGNMENT 16
18*e27b0796SYu-Chien Peter Lin
1961cfe9a2SMarouene Boubakri #define RISCV_XLEN_BITS (__riscv_xlen)
2061cfe9a2SMarouene Boubakri #define RISCV_XLEN_BYTES (__riscv_xlen / 8)
2161cfe9a2SMarouene Boubakri
22346358fbSMarouene Boubakri /* Bind registers to their ABI names */
23346358fbSMarouene Boubakri #define REG_RA 1
24346358fbSMarouene Boubakri #define REG_SP 2
25346358fbSMarouene Boubakri #define REG_GP 3
26346358fbSMarouene Boubakri #define REG_TP 4
27346358fbSMarouene Boubakri #define REG_T0 5
28346358fbSMarouene Boubakri #define REG_T2 7
29346358fbSMarouene Boubakri #define REG_S0 8
30346358fbSMarouene Boubakri #define REG_S1 9
31346358fbSMarouene Boubakri #define REG_A0 10
32346358fbSMarouene Boubakri #define REG_A1 11
33346358fbSMarouene Boubakri #define REG_A2 12
34346358fbSMarouene Boubakri #define REG_A3 13
35346358fbSMarouene Boubakri #define REG_A5 15
36346358fbSMarouene Boubakri #define REG_A7 17
37346358fbSMarouene Boubakri #define REG_S2 18
38346358fbSMarouene Boubakri #define REG_S11 27
39346358fbSMarouene Boubakri #define REG_T3 28
40346358fbSMarouene Boubakri #define REG_T6 31
41346358fbSMarouene Boubakri
42aa8c4695SMarouene Boubakri #if defined(CFG_RISCV_M_MODE)
43aa8c4695SMarouene Boubakri #define CSR_MODE_OFFSET PRV_M
44aa8c4695SMarouene Boubakri #define XRET mret
45aa8c4695SMarouene Boubakri #elif defined(CFG_RISCV_S_MODE)
46aa8c4695SMarouene Boubakri #define CSR_MODE_OFFSET PRV_S
47aa8c4695SMarouene Boubakri #define XRET sret
48aa8c4695SMarouene Boubakri #endif
49aa8c4695SMarouene Boubakri
50aa8c4695SMarouene Boubakri #define CSR_MODE_BITS SHIFT_U64(CSR_MODE_OFFSET, 8)
51aa8c4695SMarouene Boubakri
52aa8c4695SMarouene Boubakri #define CSR_XSTATUS (CSR_MODE_BITS | 0x000)
53aa8c4695SMarouene Boubakri #define CSR_XIE (CSR_MODE_BITS | 0x004)
54aa8c4695SMarouene Boubakri #define CSR_XTVEC (CSR_MODE_BITS | 0x005)
55aa8c4695SMarouene Boubakri #define CSR_XSCRATCH (CSR_MODE_BITS | 0x040)
56aa8c4695SMarouene Boubakri #define CSR_XEPC (CSR_MODE_BITS | 0x041)
57aa8c4695SMarouene Boubakri #define CSR_XCAUSE (CSR_MODE_BITS | 0x042)
58aa8c4695SMarouene Boubakri #define CSR_XTVAL (CSR_MODE_BITS | 0x043)
59aa8c4695SMarouene Boubakri #define CSR_XIP (CSR_MODE_BITS | 0x044)
60f4b54213SHuang Borong #define CSR_XISELECT (CSR_MODE_BITS | 0x050)
61f4b54213SHuang Borong #define CSR_XIREG (CSR_MODE_BITS | 0x051)
62f4b54213SHuang Borong #define CSR_XTOPEI (CSR_MODE_BITS | 0x05C)
63aa8c4695SMarouene Boubakri
64cbaab388SMarouene Boubakri #define IRQ_XSOFT (CSR_MODE_OFFSET + 0)
65cbaab388SMarouene Boubakri #define IRQ_XTIMER (CSR_MODE_OFFSET + 4)
66cbaab388SMarouene Boubakri #define IRQ_XEXT (CSR_MODE_OFFSET + 8)
67cbaab388SMarouene Boubakri
68cbaab388SMarouene Boubakri #define CSR_XIE_SIE BIT64(IRQ_XSOFT)
69cbaab388SMarouene Boubakri #define CSR_XIE_TIE BIT64(IRQ_XTIMER)
70cbaab388SMarouene Boubakri #define CSR_XIE_EIE BIT64(IRQ_XEXT)
71cbaab388SMarouene Boubakri
72cbaab388SMarouene Boubakri #define CSR_XSTATUS_IE BIT(CSR_MODE_OFFSET + 0)
73cbaab388SMarouene Boubakri #define CSR_XSTATUS_PIE BIT(CSR_MODE_OFFSET + 4)
74cbaab388SMarouene Boubakri #define CSR_XSTATUS_SPP BIT(8)
75cbaab388SMarouene Boubakri #define CSR_XSTATUS_SUM BIT(18)
76cbaab388SMarouene Boubakri #define CSR_XSTATUS_MXR BIT(19)
77cbaab388SMarouene Boubakri
785232a348SAlvin Chang #define CSR_XCAUSE_INTR_FLAG BIT64(__riscv_xlen - 1)
795232a348SAlvin Chang
8061cfe9a2SMarouene Boubakri #ifndef __ASSEMBLER__
8161cfe9a2SMarouene Boubakri
82921af96fSAlvin Chang #define read_csr(csr) \
83921af96fSAlvin Chang ({ \
84921af96fSAlvin Chang unsigned long __tmp; \
85921af96fSAlvin Chang asm volatile ("csrr %0, %1" : "=r"(__tmp) : "i"(csr)); \
86921af96fSAlvin Chang __tmp; \
87921af96fSAlvin Chang })
88921af96fSAlvin Chang
89921af96fSAlvin Chang #define write_csr(csr, val) \
90921af96fSAlvin Chang ({ \
91921af96fSAlvin Chang asm volatile ("csrw %0, %1" : : "i"(csr), "rK"(val)); \
92921af96fSAlvin Chang })
93921af96fSAlvin Chang
94921af96fSAlvin Chang #define swap_csr(csr, val) \
95921af96fSAlvin Chang ({ \
96921af96fSAlvin Chang unsigned long __tmp; \
97921af96fSAlvin Chang asm volatile ("csrrw %0, %1, %2" \
98921af96fSAlvin Chang : "=r"(__tmp) : "i"(csr), "rK"(val)); \
99921af96fSAlvin Chang __tmp; \
100921af96fSAlvin Chang })
101921af96fSAlvin Chang
102ca5bd0a2SHuang Borong #define read_set_csr(csr, val) \
103921af96fSAlvin Chang ({ \
104921af96fSAlvin Chang unsigned long __tmp; \
105921af96fSAlvin Chang asm volatile ("csrrs %0, %1, %2" \
106ca5bd0a2SHuang Borong : "=r"(__tmp) : "i"(csr), "rK"(val)); \
107921af96fSAlvin Chang __tmp; \
108921af96fSAlvin Chang })
109921af96fSAlvin Chang
110ca5bd0a2SHuang Borong #define set_csr(csr, val) \
111ca5bd0a2SHuang Borong ({ \
112ca5bd0a2SHuang Borong asm volatile ("csrs %0, %1" : : "i"(csr), "rK"(val)); \
113ca5bd0a2SHuang Borong })
114ca5bd0a2SHuang Borong
115ca5bd0a2SHuang Borong #define read_clear_csr(csr, val) \
116921af96fSAlvin Chang ({ \
117921af96fSAlvin Chang unsigned long __tmp; \
118921af96fSAlvin Chang asm volatile ("csrrc %0, %1, %2" \
119ca5bd0a2SHuang Borong : "=r"(__tmp) : "i"(csr), "rK"(val)); \
120921af96fSAlvin Chang __tmp; \
121921af96fSAlvin Chang })
122921af96fSAlvin Chang
123ca5bd0a2SHuang Borong #define clear_csr(csr, val) \
124ca5bd0a2SHuang Borong ({ \
125ca5bd0a2SHuang Borong asm volatile ("csrc %0, %1" : : "i"(csr), "rK"(val)); \
126ca5bd0a2SHuang Borong })
127ca5bd0a2SHuang Borong
128921af96fSAlvin Chang #define rdtime() read_csr(CSR_TIME)
129921af96fSAlvin Chang #define rdcycle() read_csr(CSR_CYCLE)
130921af96fSAlvin Chang #define rdinstret() read_csr(CSR_INSTRET)
131921af96fSAlvin Chang
mb(void)13261cfe9a2SMarouene Boubakri static inline __noprof void mb(void)
13361cfe9a2SMarouene Boubakri {
13461cfe9a2SMarouene Boubakri asm volatile ("fence" : : : "memory");
13561cfe9a2SMarouene Boubakri }
13661cfe9a2SMarouene Boubakri
read_gp(void)13709653bcaSAlvin Chang static inline __noprof unsigned long read_gp(void)
13809653bcaSAlvin Chang {
13909653bcaSAlvin Chang unsigned long gp = 0;
14009653bcaSAlvin Chang
14109653bcaSAlvin Chang asm volatile("mv %0, gp" : "=&r"(gp));
14209653bcaSAlvin Chang return gp;
14309653bcaSAlvin Chang }
14409653bcaSAlvin Chang
read_tp(void)14561cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_tp(void)
14661cfe9a2SMarouene Boubakri {
1477bb13ba6SAlvin Chang unsigned long tp = 0;
14861cfe9a2SMarouene Boubakri
14961cfe9a2SMarouene Boubakri asm volatile("mv %0, tp" : "=&r"(tp));
15061cfe9a2SMarouene Boubakri return tp;
15161cfe9a2SMarouene Boubakri }
15261cfe9a2SMarouene Boubakri
read_fp(void)1534450510cSAlvin Chang static inline __noprof unsigned long read_fp(void)
1544450510cSAlvin Chang {
1554450510cSAlvin Chang unsigned long fp = 0;
1564450510cSAlvin Chang
157660463d3SAlvin Chang asm volatile ("mv %0, s0" : "=r" (fp));
1584450510cSAlvin Chang
1594450510cSAlvin Chang return fp;
1604450510cSAlvin Chang }
1614450510cSAlvin Chang
read_pc(void)1624450510cSAlvin Chang static inline __noprof unsigned long read_pc(void)
1634450510cSAlvin Chang {
1644450510cSAlvin Chang unsigned long pc = 0;
1654450510cSAlvin Chang
1664450510cSAlvin Chang asm volatile ("auipc %0, 0" : "=r" (pc));
1674450510cSAlvin Chang
1684450510cSAlvin Chang return pc;
1694450510cSAlvin Chang }
1704450510cSAlvin Chang
wfi(void)17161cfe9a2SMarouene Boubakri static inline __noprof void wfi(void)
17261cfe9a2SMarouene Boubakri {
17361cfe9a2SMarouene Boubakri asm volatile ("wfi");
17461cfe9a2SMarouene Boubakri }
17561cfe9a2SMarouene Boubakri
riscv_cpu_pause(void)17647fd7209SYu Chien Peter Lin static inline __noprof void riscv_cpu_pause(void)
17747fd7209SYu Chien Peter Lin {
17847fd7209SYu Chien Peter Lin unsigned long dummy = 0;
17947fd7209SYu Chien Peter Lin
18047fd7209SYu Chien Peter Lin /*
18147fd7209SYu Chien Peter Lin * Use a divide instruction to force wait
18247fd7209SYu Chien Peter Lin * for multiple CPU cycles.
18347fd7209SYu Chien Peter Lin * Note: RISC-V does not raise an exception
18447fd7209SYu Chien Peter Lin * on divide by zero.
18547fd7209SYu Chien Peter Lin */
18647fd7209SYu Chien Peter Lin asm volatile ("div %0, %0, zero" : "=r" (dummy));
18747fd7209SYu Chien Peter Lin
18847fd7209SYu Chien Peter Lin /*
18947fd7209SYu Chien Peter Lin * Use the encoding of the 'pause' instruction,
19047fd7209SYu Chien Peter Lin * thus no need to verify toolchain support for
19147fd7209SYu Chien Peter Lin * zihintpause.
19247fd7209SYu Chien Peter Lin * On hardware platforms that do not implement
19347fd7209SYu Chien Peter Lin * this extension, it will simply serve as a no-op.
19447fd7209SYu Chien Peter Lin */
19547fd7209SYu Chien Peter Lin asm volatile (".4byte 0x100000f"); /* pause */
19647fd7209SYu Chien Peter Lin barrier();
19747fd7209SYu Chien Peter Lin }
19847fd7209SYu Chien Peter Lin
flush_tlb(void)19961cfe9a2SMarouene Boubakri static inline __noprof void flush_tlb(void)
20061cfe9a2SMarouene Boubakri {
20161cfe9a2SMarouene Boubakri asm volatile("sfence.vma zero, zero");
20261cfe9a2SMarouene Boubakri }
20361cfe9a2SMarouene Boubakri
flush_tlb_entry(unsigned long va)20461cfe9a2SMarouene Boubakri static inline __noprof void flush_tlb_entry(unsigned long va)
20561cfe9a2SMarouene Boubakri {
20661cfe9a2SMarouene Boubakri asm volatile ("sfence.vma %0" : : "r" (va) : "memory");
20761cfe9a2SMarouene Boubakri }
20861cfe9a2SMarouene Boubakri
20961cfe9a2SMarouene Boubakri /* supervisor address translation and protection */
read_satp(void)21061cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_satp(void)
21161cfe9a2SMarouene Boubakri {
21261cfe9a2SMarouene Boubakri unsigned long satp;
21361cfe9a2SMarouene Boubakri
21461cfe9a2SMarouene Boubakri asm volatile("csrr %0, satp" : "=r" (satp));
21561cfe9a2SMarouene Boubakri
21661cfe9a2SMarouene Boubakri return satp;
21761cfe9a2SMarouene Boubakri }
21861cfe9a2SMarouene Boubakri
write_satp(unsigned long satp)21961cfe9a2SMarouene Boubakri static inline __noprof void write_satp(unsigned long satp)
22061cfe9a2SMarouene Boubakri {
22161cfe9a2SMarouene Boubakri asm volatile("csrw satp, %0" : : "r" (satp));
22261cfe9a2SMarouene Boubakri }
22361cfe9a2SMarouene Boubakri
22461cfe9a2SMarouene Boubakri /* machine trap-vector base-address register */
read_mtvec(void)22561cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_mtvec(void)
22661cfe9a2SMarouene Boubakri {
22761cfe9a2SMarouene Boubakri unsigned long mtvec;
22861cfe9a2SMarouene Boubakri
22961cfe9a2SMarouene Boubakri asm volatile("csrr %0, mtvec" : "=r" (mtvec));
23061cfe9a2SMarouene Boubakri
23161cfe9a2SMarouene Boubakri return mtvec;
23261cfe9a2SMarouene Boubakri }
23361cfe9a2SMarouene Boubakri
write_mtvec(unsigned long mtvec)23461cfe9a2SMarouene Boubakri static inline __noprof void write_mtvec(unsigned long mtvec)
23561cfe9a2SMarouene Boubakri {
23661cfe9a2SMarouene Boubakri asm volatile("csrw mtvec, %0" : : "r" (mtvec));
23761cfe9a2SMarouene Boubakri }
23861cfe9a2SMarouene Boubakri
23961cfe9a2SMarouene Boubakri /* supervisor trap-vector base-address register */
read_stvec(void)24061cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_stvec(void)
24161cfe9a2SMarouene Boubakri {
24261cfe9a2SMarouene Boubakri unsigned long stvec;
24361cfe9a2SMarouene Boubakri
24461cfe9a2SMarouene Boubakri asm volatile("csrr %0, stvec" : "=r" (stvec));
24561cfe9a2SMarouene Boubakri
24661cfe9a2SMarouene Boubakri return stvec;
24761cfe9a2SMarouene Boubakri }
24861cfe9a2SMarouene Boubakri
write_stvec(unsigned long stvec)24961cfe9a2SMarouene Boubakri static inline __noprof void write_stvec(unsigned long stvec)
25061cfe9a2SMarouene Boubakri {
25161cfe9a2SMarouene Boubakri asm volatile("csrw stvec, %0" : : "r" (stvec));
25261cfe9a2SMarouene Boubakri }
25361cfe9a2SMarouene Boubakri
25461cfe9a2SMarouene Boubakri /* machine status register */
read_mstatus(void)25561cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_mstatus(void)
25661cfe9a2SMarouene Boubakri {
25761cfe9a2SMarouene Boubakri unsigned long mstatus;
25861cfe9a2SMarouene Boubakri
25961cfe9a2SMarouene Boubakri asm volatile("csrr %0, mstatus" : "=r" (mstatus));
26061cfe9a2SMarouene Boubakri
26161cfe9a2SMarouene Boubakri return mstatus;
26261cfe9a2SMarouene Boubakri }
26361cfe9a2SMarouene Boubakri
write_mstatus(unsigned long mstatus)26461cfe9a2SMarouene Boubakri static inline __noprof void write_mstatus(unsigned long mstatus)
26561cfe9a2SMarouene Boubakri {
26661cfe9a2SMarouene Boubakri asm volatile("csrw mstatus, %0" : : "r" (mstatus));
26761cfe9a2SMarouene Boubakri }
26861cfe9a2SMarouene Boubakri
26961cfe9a2SMarouene Boubakri /* supervisor status register */
read_sstatus(void)27061cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_sstatus(void)
27161cfe9a2SMarouene Boubakri {
27261cfe9a2SMarouene Boubakri unsigned long sstatus;
27361cfe9a2SMarouene Boubakri
27461cfe9a2SMarouene Boubakri asm volatile("csrr %0, sstatus" : "=r" (sstatus));
27561cfe9a2SMarouene Boubakri
27661cfe9a2SMarouene Boubakri return sstatus;
27761cfe9a2SMarouene Boubakri }
27861cfe9a2SMarouene Boubakri
write_sstatus(unsigned long sstatus)27961cfe9a2SMarouene Boubakri static inline __noprof void write_sstatus(unsigned long sstatus)
28061cfe9a2SMarouene Boubakri {
28161cfe9a2SMarouene Boubakri asm volatile("csrw sstatus, %0" : : "r" (sstatus));
28261cfe9a2SMarouene Boubakri }
28361cfe9a2SMarouene Boubakri
set_sstatus(unsigned long sstatus)28461cfe9a2SMarouene Boubakri static inline __noprof void set_sstatus(unsigned long sstatus)
28561cfe9a2SMarouene Boubakri {
28661cfe9a2SMarouene Boubakri unsigned long x;
28761cfe9a2SMarouene Boubakri
28861cfe9a2SMarouene Boubakri asm volatile ("csrrs %0, sstatus, %1" : "=r"(x) : "rK"(sstatus));
28961cfe9a2SMarouene Boubakri }
29061cfe9a2SMarouene Boubakri
29161cfe9a2SMarouene Boubakri /* machine exception delegation */
read_medeleg(void)29261cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_medeleg(void)
29361cfe9a2SMarouene Boubakri {
29461cfe9a2SMarouene Boubakri unsigned long medeleg;
29561cfe9a2SMarouene Boubakri
29661cfe9a2SMarouene Boubakri asm volatile("csrr %0, medeleg" : "=r" (medeleg));
29761cfe9a2SMarouene Boubakri
29861cfe9a2SMarouene Boubakri return medeleg;
29961cfe9a2SMarouene Boubakri }
30061cfe9a2SMarouene Boubakri
write_medeleg(unsigned long medeleg)30161cfe9a2SMarouene Boubakri static inline __noprof void write_medeleg(unsigned long medeleg)
30261cfe9a2SMarouene Boubakri {
30361cfe9a2SMarouene Boubakri asm volatile("csrw medeleg, %0" : : "r" (medeleg));
30461cfe9a2SMarouene Boubakri }
30561cfe9a2SMarouene Boubakri
30661cfe9a2SMarouene Boubakri /* machine interrupt delegation */
read_mideleg(void)30761cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_mideleg(void)
30861cfe9a2SMarouene Boubakri {
30961cfe9a2SMarouene Boubakri unsigned long mideleg;
31061cfe9a2SMarouene Boubakri
31161cfe9a2SMarouene Boubakri asm volatile("csrr %0, mideleg" : "=r" (mideleg));
31261cfe9a2SMarouene Boubakri
31361cfe9a2SMarouene Boubakri return mideleg;
31461cfe9a2SMarouene Boubakri }
31561cfe9a2SMarouene Boubakri
write_mideleg(unsigned long mideleg)31661cfe9a2SMarouene Boubakri static inline __noprof void write_mideleg(unsigned long mideleg)
31761cfe9a2SMarouene Boubakri {
31861cfe9a2SMarouene Boubakri asm volatile("csrw mideleg, %0" : : "r" (mideleg));
31961cfe9a2SMarouene Boubakri }
32061cfe9a2SMarouene Boubakri
32161cfe9a2SMarouene Boubakri /* machine interrupt-enable register */
read_mie(void)32261cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_mie(void)
32361cfe9a2SMarouene Boubakri {
32461cfe9a2SMarouene Boubakri unsigned long mie;
32561cfe9a2SMarouene Boubakri
32661cfe9a2SMarouene Boubakri asm volatile("csrr %0, mie" : "=r" (mie));
32761cfe9a2SMarouene Boubakri
32861cfe9a2SMarouene Boubakri return mie;
32961cfe9a2SMarouene Boubakri }
33061cfe9a2SMarouene Boubakri
write_mie(unsigned long mie)33161cfe9a2SMarouene Boubakri static inline __noprof void write_mie(unsigned long mie)
33261cfe9a2SMarouene Boubakri {
33361cfe9a2SMarouene Boubakri asm volatile("csrw mie, %0" : : "r" (mie));
33461cfe9a2SMarouene Boubakri }
33561cfe9a2SMarouene Boubakri
33661cfe9a2SMarouene Boubakri /* supervisor interrupt-enable register */
read_sie(void)33761cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_sie(void)
33861cfe9a2SMarouene Boubakri {
33961cfe9a2SMarouene Boubakri unsigned long sie;
34061cfe9a2SMarouene Boubakri
34161cfe9a2SMarouene Boubakri asm volatile("csrr %0, sie" : "=r" (sie));
34261cfe9a2SMarouene Boubakri
34361cfe9a2SMarouene Boubakri return sie;
34461cfe9a2SMarouene Boubakri }
34561cfe9a2SMarouene Boubakri
write_sie(unsigned long sie)34661cfe9a2SMarouene Boubakri static inline __noprof void write_sie(unsigned long sie)
34761cfe9a2SMarouene Boubakri {
34861cfe9a2SMarouene Boubakri asm volatile("csrw sie, %0" : : "r" (sie));
34961cfe9a2SMarouene Boubakri }
35061cfe9a2SMarouene Boubakri
35161cfe9a2SMarouene Boubakri /* machine exception program counter */
read_mepc(void)35261cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_mepc(void)
35361cfe9a2SMarouene Boubakri {
35461cfe9a2SMarouene Boubakri unsigned long mepc;
35561cfe9a2SMarouene Boubakri
35661cfe9a2SMarouene Boubakri asm volatile("csrr %0, mepc" : "=r" (mepc));
35761cfe9a2SMarouene Boubakri
35861cfe9a2SMarouene Boubakri return mepc;
35961cfe9a2SMarouene Boubakri }
36061cfe9a2SMarouene Boubakri
write_mepc(unsigned long mepc)36161cfe9a2SMarouene Boubakri static inline __noprof void write_mepc(unsigned long mepc)
36261cfe9a2SMarouene Boubakri {
36361cfe9a2SMarouene Boubakri asm volatile("csrw mepc, %0" : : "r" (mepc));
36461cfe9a2SMarouene Boubakri }
36561cfe9a2SMarouene Boubakri
36661cfe9a2SMarouene Boubakri /* supervisor exception program counter */
read_sepc(void)36761cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_sepc(void)
36861cfe9a2SMarouene Boubakri {
36961cfe9a2SMarouene Boubakri unsigned long sepc;
37061cfe9a2SMarouene Boubakri
37161cfe9a2SMarouene Boubakri asm volatile("csrr %0, sepc" : "=r" (sepc));
37261cfe9a2SMarouene Boubakri
37361cfe9a2SMarouene Boubakri return sepc;
37461cfe9a2SMarouene Boubakri }
37561cfe9a2SMarouene Boubakri
write_sepc(unsigned long sepc)37661cfe9a2SMarouene Boubakri static inline __noprof void write_sepc(unsigned long sepc)
37761cfe9a2SMarouene Boubakri {
37861cfe9a2SMarouene Boubakri asm volatile("csrw sepc, %0" : : "r" (sepc));
37961cfe9a2SMarouene Boubakri }
38061cfe9a2SMarouene Boubakri
38161cfe9a2SMarouene Boubakri /* machine scratch register */
read_mscratch(void)38261cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_mscratch(void)
38361cfe9a2SMarouene Boubakri {
38461cfe9a2SMarouene Boubakri unsigned long mscratch;
38561cfe9a2SMarouene Boubakri
38661cfe9a2SMarouene Boubakri asm volatile("csrr %0, mscratch" : "=r" (mscratch));
38761cfe9a2SMarouene Boubakri
38861cfe9a2SMarouene Boubakri return mscratch;
38961cfe9a2SMarouene Boubakri }
39061cfe9a2SMarouene Boubakri
write_mscratch(unsigned long mscratch)39161cfe9a2SMarouene Boubakri static inline __noprof void write_mscratch(unsigned long mscratch)
39261cfe9a2SMarouene Boubakri {
39361cfe9a2SMarouene Boubakri asm volatile("csrw mscratch, %0" : : "r" (mscratch));
39461cfe9a2SMarouene Boubakri }
39561cfe9a2SMarouene Boubakri
39661cfe9a2SMarouene Boubakri /* supervisor scratch register */
read_sscratch(void)39761cfe9a2SMarouene Boubakri static inline __noprof unsigned long read_sscratch(void)
39861cfe9a2SMarouene Boubakri {
39961cfe9a2SMarouene Boubakri unsigned long sscratch;
40061cfe9a2SMarouene Boubakri
40161cfe9a2SMarouene Boubakri asm volatile("csrr %0, sscratch" : "=r" (sscratch));
40261cfe9a2SMarouene Boubakri
40361cfe9a2SMarouene Boubakri return sscratch;
40461cfe9a2SMarouene Boubakri }
40561cfe9a2SMarouene Boubakri
write_sscratch(unsigned long sscratch)40661cfe9a2SMarouene Boubakri static inline __noprof void write_sscratch(unsigned long sscratch)
40761cfe9a2SMarouene Boubakri {
40861cfe9a2SMarouene Boubakri asm volatile("csrw sscratch, %0" : : "r" (sscratch));
40961cfe9a2SMarouene Boubakri }
41061cfe9a2SMarouene Boubakri
41161cfe9a2SMarouene Boubakri /* trap-return instructions */
mret(void)41261cfe9a2SMarouene Boubakri static inline __noprof void mret(void)
41361cfe9a2SMarouene Boubakri {
41461cfe9a2SMarouene Boubakri asm volatile("mret");
41561cfe9a2SMarouene Boubakri }
41661cfe9a2SMarouene Boubakri
sret(void)41761cfe9a2SMarouene Boubakri static inline __noprof void sret(void)
41861cfe9a2SMarouene Boubakri {
41961cfe9a2SMarouene Boubakri asm volatile("sret");
42061cfe9a2SMarouene Boubakri }
42161cfe9a2SMarouene Boubakri
uret(void)42261cfe9a2SMarouene Boubakri static inline __noprof void uret(void)
42361cfe9a2SMarouene Boubakri {
42461cfe9a2SMarouene Boubakri asm volatile("uret");
42561cfe9a2SMarouene Boubakri }
42661cfe9a2SMarouene Boubakri
427994c8602SAlvin Chang __noprof uint64_t read_time(void);
428994c8602SAlvin Chang
barrier_read_counter_timer(void)429994c8602SAlvin Chang static inline __noprof uint64_t barrier_read_counter_timer(void)
430994c8602SAlvin Chang {
431994c8602SAlvin Chang mb(); /* Get timer value after pending operations have completed */
432994c8602SAlvin Chang return read_time();
433994c8602SAlvin Chang }
434994c8602SAlvin Chang
read_cntfrq(void)435994c8602SAlvin Chang static inline __noprof uint32_t read_cntfrq(void)
436994c8602SAlvin Chang {
437994c8602SAlvin Chang return CFG_RISCV_MTIME_RATE;
438994c8602SAlvin Chang }
439994c8602SAlvin Chang
440e10bcf3bSAlvin Chang __noprof bool riscv_detect_csr_seed(void);
441e10bcf3bSAlvin Chang
44261cfe9a2SMarouene Boubakri #endif /*__ASSEMBLER__*/
44361cfe9a2SMarouene Boubakri
444d50fee03SEtienne Carriere #endif /*__RISCV_H*/
445