Skip to content

Commit 4b87dc4

Browse files
committed
[Arch/RISC-V] Next RISC-V
1. ISA manager interface. 2. Merge 32E/32I/64I. 3. Cache by CBOM ISA. 4. MMU support Sv32/Sv39/Sv48/Sv57/Sv64, SVPBMT ISA. 5. Merge M-mode, S-mode CSR ops. 6. Support SMP. 7. Support APLIC & IMSIC (AIA), CLIC, ACLINT/CLINT, INTC, PLIC. 8. Support DM (only by OFW) or not DM. 9. Merge T-HEAD vendor. Signed-off-by: GuEe-GUI <[email protected]>
1 parent 3ebad06 commit 4b87dc4

File tree

154 files changed

+10688
-10730
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

154 files changed

+10688
-10730
lines changed

components/drivers/cputime/Kconfig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
config RT_USING_CPUTIME
1+
menuconfig RT_USING_CPUTIME
22
bool "Enable CPU time for high resolution clock counter"
33
default n
44
help
@@ -25,9 +25,9 @@ if RT_USING_CPUTIME
2525
config RT_USING_CPUTIME_RISCV
2626
bool "Use rdtime instructions for CPU time"
2727
default y
28-
depends on ARCH_RISCV64
28+
depends on ARCH_RISCV
2929
help
30-
Some RISCV64 MCU Use rdtime instructions read CPU time.
30+
Some RISC-V MCU Use rdtime instructions read CPU time.
3131
config CPUTIME_TIMER_FREQ
3232
int "CPUTIME timer freq"
3333
default 0

components/drivers/cputime/cputime_riscv.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,21 @@
33
#include <rtthread.h>
44

55
#include <board.h>
6+
#include <riscv_timer.h>
67

78
/* Use Cycle counter of Data Watchpoint and Trace Register for CPU time */
89

910
static uint64_t riscv_cputime_getres(void)
1011
{
1112
uint64_t ret = 1000UL * 1000 * 1000;
1213

13-
ret = (ret * (1000UL * 1000)) / CPUTIME_TIMER_FREQ;
14+
ret = (ret * (1000UL * 1000)) / riscv_timer_get_frequency();
1415
return ret;
1516
}
1617

1718
static uint64_t riscv_cputime_gettime(void)
1819
{
19-
uint64_t time_elapsed;
20-
__asm__ __volatile__(
21-
"rdtime %0"
22-
: "=r"(time_elapsed));
23-
return time_elapsed;
20+
return riscv_timer_rdtime();
2421
}
2522

2623
const static struct rt_clock_cputime_ops _riscv_ops =
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
11
/*
2-
* Copyright (c) 2006-2023, RT-Thread Development Team
2+
* Copyright (c) 2006-2025, RT-Thread Development Team
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*
66
* Change Logs:
77
* Date Author Notes
88
* 2023-07-10 xqyjlj The first version.
9+
* 2025-04-20 GuEe-GUI Port to the DM
910
*/
1011

1112
#include "ktime.h"
13+
#include "riscv_timer.h"
1214

1315
static volatile unsigned long _init_cnt = 0;
1416

1517
rt_uint64_t rt_ktime_cputimer_getres(void)
1618
{
17-
return ((1000ULL * 1000 * 1000) * RT_KTIME_RESMUL) / CPUTIME_TIMER_FREQ;
19+
return ((1000ULL * 1000 * 1000) * RT_KTIME_RESMUL) / riscv_timer_get_frequency();
1820
}
1921

2022
unsigned long rt_ktime_cputimer_getfrq(void)
2123
{
22-
return CPUTIME_TIMER_FREQ;
24+
return riscv_timer_get_frequency();
2325
}
2426

2527
unsigned long rt_ktime_cputimer_getcnt(void)
2628
{
27-
unsigned long time_elapsed;
28-
__asm__ __volatile__("rdtime %0" : "=r"(time_elapsed));
29-
return time_elapsed - _init_cnt;
29+
return riscv_timer_rdtime() - _init_cnt;
3030
}
3131

3232
unsigned long rt_ktime_cputimer_getstep(void)
@@ -36,5 +36,5 @@ unsigned long rt_ktime_cputimer_getstep(void)
3636

3737
void rt_ktime_cputimer_init(void)
3838
{
39-
__asm__ __volatile__("rdtime %0" : "=r"(_init_cnt));
39+
_init_cnt = riscv_timer_rdtime();
4040
}

components/lwp/arch/risc-v/rv64/lwp_arch.c

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
#include <page.h>
3535

3636
#include <cpuport.h>
37-
#include <encoding.h>
3837
#include <stack.h>
3938
#include <cache.h>
39+
#include <csr.h>
4040

4141
extern rt_ubase_t MMUTable[];
4242

@@ -113,7 +113,11 @@ int arch_user_space_init(struct rt_lwp *lwp)
113113

114114
void *arch_kernel_mmu_table_get(void)
115115
{
116+
#if defined(RT_USING_SMP) && RT_CPUS_NR > 1
117+
return (void *)((char *)MMUTable + rt_hw_cpu_id() * ARCH_PAGE_SIZE);
118+
#else
116119
return (void *)((char *)MMUTable);
120+
#endif
117121
}
118122

119123
void arch_user_space_free(struct rt_lwp *lwp)
@@ -166,13 +170,14 @@ int arch_set_thread_context(void (*exit)(void), void *new_thread_stack,
166170
RT_ASSERT(thread_sp != RT_NULL);
167171
struct rt_hw_stack_frame *syscall_frame;
168172
struct rt_hw_stack_frame *thread_frame;
173+
struct rt_hw_switch_frame *frame;
169174

170175
rt_uint8_t *stk;
171176
rt_uint8_t *syscall_stk;
172177

173178
stk = (rt_uint8_t *)new_thread_stack;
174179
/* reserve syscall context, all the registers are copyed from parent */
175-
stk -= CTX_REG_NR * REGBYTES;
180+
stk -= CTX_ALL_REG_NR * sizeof(void *);
176181
syscall_stk = stk;
177182

178183
syscall_frame = (struct rt_hw_stack_frame *)stk;
@@ -192,12 +197,17 @@ int arch_set_thread_context(void (*exit)(void), void *new_thread_stack,
192197
syscall_frame->tp = (rt_ubase_t)thread->thread_idr;
193198

194199
#ifdef ARCH_USING_NEW_CTX_SWITCH
195-
extern void *_rt_hw_stack_init(rt_ubase_t *sp, rt_ubase_t ra, rt_ubase_t sstatus);
196-
rt_ubase_t sstatus = read_csr(sstatus) | SSTATUS_SPP;
197-
sstatus &= ~SSTATUS_SIE;
200+
RT_UNUSED(syscall_stk);
201+
RT_UNUSED(thread_frame);
202+
203+
frame = (struct rt_hw_switch_frame *)((rt_ubase_t)stk - sizeof(*frame));
204+
rt_memset(frame, 0, sizeof(*frame));
205+
206+
frame->regs[RT_HW_SWITCH_CONTEXT_RA] = (rt_ubase_t)exit;
207+
frame->regs[RT_HW_SWITCH_CONTEXT_XSTATUS] = (csr_read(CSR_STATUS) | SR_PP) & ~SR_IE;
198208

199209
/* compatible to RESTORE_CONTEXT */
200-
stk = (void *)_rt_hw_stack_init((rt_ubase_t *)stk, (rt_ubase_t)exit, sstatus);
210+
stk = (void *)frame;
201211
#else
202212
/* build temp thread context */
203213
stk -= sizeof(struct rt_hw_stack_frame);
@@ -214,8 +224,8 @@ int arch_set_thread_context(void (*exit)(void), void *new_thread_stack,
214224
thread_frame->epc = (rt_ubase_t)exit;
215225

216226
/* set old exception mode as supervisor, because in kernel */
217-
thread_frame->sstatus = read_csr(sstatus) | SSTATUS_SPP;
218-
thread_frame->sstatus &= ~SSTATUS_SIE; /* must disable interrupt */
227+
thread_frame->xstatus = read_csr(CSR_STATUS) | SR_PP;
228+
thread_frame->xstatus &= ~SR_IE; /* must disable interrupt */
219229

220230
/* set stack as syscall stack */
221231
thread_frame->user_sp_exc_stack = (rt_ubase_t)syscall_stk;

components/lwp/arch/risc-v/rv64/lwp_arch.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
#ifdef ARCH_MM_MMU
1818

19+
#include <cache.h>
20+
1921
#ifdef ARCH_MM_MMU_32BIT_LIMIT
2022
#define USER_HEAP_VADDR 0xF0000000UL
2123
#define USER_HEAP_VEND 0xFE000000UL
@@ -77,6 +79,6 @@ void *arch_signal_ucontext_save(int signo, siginfo_t *psiginfo,
7779
}
7880
#endif
7981

80-
#endif
82+
#endif /* ARCH_MM_MMU */
8183

8284
#endif /*LWP_ARCH_H__*/

components/lwp/arch/risc-v/rv64/lwp_gcc.S

Lines changed: 42 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@
1919
#define __ASSEMBLY__
2020
#endif /* __ASSEMBLY__ */
2121

22-
#include "cpuport.h"
23-
#include "encoding.h"
24-
#include "stackframe.h"
25-
#include "asm-generic.h"
22+
#include "asm.h"
23+
#include "csr.h"
2624

2725
.section .text.lwp
2826

@@ -33,13 +31,13 @@
3331
.type arch_start_umode, % function
3432
arch_start_umode:
3533
// load kstack for user process
36-
csrw sscratch, a3
37-
li t0, SSTATUS_SPP | SSTATUS_SIE // set as user mode, close interrupt
38-
csrc sstatus, t0
39-
li t0, SSTATUS_SPIE // enable interrupt when return to user mode
40-
csrs sstatus, t0
34+
csrw CSR_SCRATCH, a3
35+
li t0, SR_PP | SR_IE // set as user mode, close interrupt
36+
csrc CSR_STATUS, t0
37+
li t0, SR_PIE // enable interrupt when return to user mode
38+
csrs CSR_STATUS, t0
4139

42-
csrw sepc, a1
40+
csrw CSR_EPC, a1
4341
mv sp, a2
4442
sret//enter user mode
4543

@@ -49,12 +47,12 @@ arch_start_umode:
4947
.global arch_crt_start_umode
5048
.type arch_crt_start_umode, % function
5149
arch_crt_start_umode:
52-
li t0, SSTATUS_SPP | SSTATUS_SIE // set as user mode, close interrupt
53-
csrc sstatus, t0
54-
li t0, SSTATUS_SPIE // enable interrupt when return to user mode
55-
csrs sstatus, t0
50+
li t0, SR_PP | SR_IE // set as user mode, close interrupt
51+
csrc CSR_STATUS, t0
52+
li t0, SR_PIE // enable interrupt when return to user mode
53+
csrs CSR_STATUS, t0
5654

57-
csrw sepc, a1
55+
csrw CSR_EPC, a1
5856
mv s0, a0
5957
mv s1, a1
6058
mv s2, a2
@@ -67,7 +65,7 @@ arch_crt_start_umode:
6765
mv ra, a0//return address
6866
mv a0, s0//args
6967

70-
csrw sscratch, s3
68+
csrw CSR_SCRATCH, s3
7169
sret//enter user mode
7270

7371
/**
@@ -95,26 +93,26 @@ arch_ret_to_user:
9593

9694
ret_to_user_exit:
9795
RESTORE_ALL
98-
// `RESTORE_ALL` also reset sp to user sp, and setup sscratch
96+
// `RESTORE_ALL` also reset sp to user sp, and setup xscratch
9997
sret
10098

10199
/**
102100
* Restore user context from exception frame stroraged in ustack
103101
* And handle pending signals;
104102
*/
105103
arch_signal_quit:
106-
LOAD a0, FRAME_OFF_SP(sp)
104+
REG_L a0, FRAME_OFF_SP(sp)
107105
call arch_signal_ucontext_restore
108106

109107
/* reset kernel sp to the stack */
110-
addi sp, sp, CTX_REG_NR * REGBYTES
111-
STORE sp, FRAME_OFF_SP(a0)
108+
addi sp, sp, CTX_ALL_REG_NR * SZREG
109+
REG_S sp, FRAME_OFF_SP(a0)
112110
/* return value is user sp */
113111
mv sp, a0
114112

115113
/* restore user sp before enter trap */
116-
addi a0, sp, CTX_REG_NR * REGBYTES
117-
csrw sscratch, a0
114+
addi a0, sp, CTX_ALL_REG_NR * SZREG
115+
csrw CSR_SCRATCH, a0
118116

119117

120118
RESTORE_ALL
@@ -137,19 +135,19 @@ arch_thread_signal_enter:
137135
mv s2, a0
138136
mv s1, a3
139137

140-
LOAD t0, FRAME_OFF_SP(a2)
138+
REG_L t0, FRAME_OFF_SP(a2)
141139
mv a3, t0
142140
call arch_signal_ucontext_save
143141

144142
/** restore kernel sp */
145-
addi sp, s3, CTX_REG_NR * REGBYTES
143+
addi sp, s3, CTX_ALL_REG_NR * SZREG
146144

147145
/**
148146
* set regiter RA to user signal handler
149-
* set sp to user sp & save kernel sp in sscratch
147+
* set sp to user sp & save kernel sp in xscratch
150148
*/
151149
mv ra, a0
152-
csrw sscratch, sp
150+
csrw CSR_SCRATCH, sp
153151
mv sp, a0
154152

155153
/**
@@ -161,13 +159,13 @@ arch_thread_signal_enter:
161159

162160
1:
163161
/* enter user mode and enable interrupt when return to user mode */
164-
li t0, SSTATUS_SPP
165-
csrc sstatus, t0
166-
li t0, SSTATUS_SPIE
167-
csrs sstatus, t0
162+
li t0, SR_PP
163+
csrc CSR_STATUS, t0
164+
li t0, SR_PIE
165+
csrs CSR_STATUS, t0
168166

169-
/* sepc <- signal_handler */
170-
csrw sepc, s1
167+
/* xepc <- signal_handler */
168+
csrw CSR_EPC, s1
171169
/* a0 <- signal id */
172170
mv a0, s2
173171
/* a1 <- siginfo */
@@ -176,7 +174,7 @@ arch_thread_signal_enter:
176174
mv a2, a1
177175

178176
/* restore user GP */
179-
LOAD gp, FRAME_OFF_GP(s3)
177+
REG_L gp, FRAME_OFF_GP(s3)
180178

181179
/**
182180
* handler(signo, psi, ucontext);
@@ -229,12 +227,12 @@ arch_clone_exit:
229227
START_POINT(syscall_entry)
230228
#ifndef ARCH_USING_NEW_CTX_SWITCH
231229
//swap to thread kernel stack
232-
csrr t0, sstatus
230+
csrr t0, CSR_STATUS
233231
andi t0, t0, 0x100
234232
beqz t0, __restore_sp_from_tcb
235233

236-
__restore_sp_from_sscratch: // from kernel
237-
csrr t0, sscratch
234+
__restore_sp_from_CSR_SCRATCH: // from kernel
235+
csrr t0, CSR_SCRATCH
238236
j __move_stack_context
239237

240238
__restore_sp_from_tcb: // from user
@@ -245,22 +243,22 @@ __restore_sp_from_tcb: // from user
245243
__move_stack_context:
246244
mv t1, sp//src
247245
mv sp, t0//switch stack
248-
addi sp, sp, -CTX_REG_NR * REGBYTES
246+
addi sp, sp, -CTX_ALL_REG_NR * SZREG
249247
//copy context
250-
li s0, CTX_REG_NR//cnt
248+
li s0, CTX_ALL_REG_NR//cnt
251249
mv t2, sp//dst
252250

253251
copy_context_loop:
254-
LOAD t0, 0(t1)
255-
STORE t0, 0(t2)
252+
REG_L t0, 0(t1)
253+
REG_S t0, 0(t2)
256254
addi s0, s0, -1
257255
addi t1, t1, 8
258256
addi t2, t2, 8
259257
bnez s0, copy_context_loop
260258
#endif /* ARCH_USING_NEW_CTX_SWITCH */
261259

262260
/* fetch SYSCALL ID */
263-
LOAD a7, 17 * REGBYTES(sp)
261+
REG_L a7, 17 * SZREG(sp)
264262
addi a7, a7, -0xfe
265263
beqz a7, arch_signal_quit
266264

@@ -281,7 +279,7 @@ arch_syscall_exit:
281279
CLOSE_INTERRUPT
282280

283281
#if defined(ARCH_MM_MMU)
284-
LOAD s0, FRAME_OFF_SSTATUS(sp)
282+
REG_L s0, FRAME_OFF_XSTATUS(sp)
285283
andi s0, s0, 0x100
286284
bnez s0, dont_ret_to_user
287285
j arch_ret_to_user
@@ -294,10 +292,10 @@ dont_ret_to_user:
294292
call lwp_user_setting_restore
295293

296294
/* after restore the reg `tp`, need modify context */
297-
STORE tp, 4 * REGBYTES(sp)
295+
REG_S tp, 4 * SZREG(sp)
298296
#endif
299297

300298
//restore context
301299
RESTORE_ALL
302-
csrw sscratch, zero
300+
csrw CSR_SCRATCH, zero
303301
sret

0 commit comments

Comments
 (0)