feat: libcpu/risc-v: unify low-level bringups

This patch consolidates the separated architecture-specific code for
rv64 (virt64 and c906) under a more unified approach. The changes
aim to enhance maintainability and code reuse, reducing duplication
between these two architectures while adding small improvements in
porting compatibility.

Changes:
- Modified build scripts (SConscript) for both virt64 and c906 to
  remove ASID and vector dependencies when not required.
- Updated c906's sbi.c and sbi.h to use standard integer types
  (uint32_t) and include the missing <stdint.h> header.
- Unified inline function declaration for `sbi_call` across both
  c906 and virt64 using `rt_inline`.
- Disabled FPU and vector in c906's startup assembly file, aligning it
  with the virt64 handling.
- Corrected syscall handler type definitions in c906 for consistency.

Signed-off-by: Shell <smokewood@qq.com>
This commit is contained in:
Shell 2024-09-02 18:03:21 +08:00 committed by Meco Man
parent e244c196c4
commit c78a19ed26
8 changed files with 19 additions and 11 deletions

View File

@ -1,11 +1,13 @@
# RT-Thread building script for component # RT-Thread building script for component
from building import * from building import *
cwd = GetCurrentDir() cwd = GetCurrentDir()
src = Glob('*.c') + Glob('*.cpp') + Glob('*_gcc.S') src = Glob('*.c') + Glob('*.cpp') + Glob('*_gcc.S')
CPPPATH = [cwd] CPPPATH = [cwd]
if not GetDepend('ARCH_USING_ASID'):
SrcRemove(src, ['asid.c'])
group = DefineGroup('libcpu', src, depend = [''], CPPPATH = CPPPATH) group = DefineGroup('libcpu', src, depend = [''], CPPPATH = CPPPATH)
Return('group') Return('group')

View File

@ -68,8 +68,8 @@ static struct sbi_ret sbi_get_impl_version(void)
void sbi_print_version(void) void sbi_print_version(void)
{ {
unsigned int major; uint32_t major;
unsigned int minor; uint32_t minor;
/* For legacy SBI implementations. */ /* For legacy SBI implementations. */
if (sbi_spec_version == 0) if (sbi_spec_version == 0)

View File

@ -48,6 +48,7 @@
#ifndef _MACHINE_SBI_H_ #ifndef _MACHINE_SBI_H_
#define _MACHINE_SBI_H_ #define _MACHINE_SBI_H_
#include <stdint.h>
#include <rtdef.h> #include <rtdef.h>
/* SBI Specification Version */ /* SBI Specification Version */
@ -140,7 +141,7 @@ struct sbi_ret
long value; long value;
}; };
static inline struct sbi_ret rt_inline struct sbi_ret
sbi_call(uint64_t arg7, uint64_t arg6, uint64_t arg0, uint64_t arg1, sbi_call(uint64_t arg7, uint64_t arg6, uint64_t arg0, uint64_t arg1,
uint64_t arg2, uint64_t arg3, uint64_t arg4) uint64_t arg2, uint64_t arg3, uint64_t arg4)
{ {

View File

@ -75,6 +75,8 @@ _start:
li x31,0 li x31,0
/* set to disable FPU */ /* set to disable FPU */
li t0, SSTATUS_FS + SSTATUS_VS
csrc sstatus, t0
li t0, SSTATUS_SUM li t0, SSTATUS_SUM
csrs sstatus, t0 csrs sstatus, t0

View File

@ -26,7 +26,7 @@
#include "riscv_mmu.h" #include "riscv_mmu.h"
#include "stack.h" #include "stack.h"
typedef rt_size_t (*syscallfunc_t)(rt_size_t, rt_size_t, rt_size_t, rt_size_t, rt_size_t, rt_size_t, rt_size_t); typedef rt_ubase_t (*syscallfunc_t)(rt_ubase_t, rt_ubase_t, rt_ubase_t, rt_ubase_t, rt_ubase_t, rt_ubase_t, rt_ubase_t);
void syscall_handler(struct rt_hw_stack_frame *regs) void syscall_handler(struct rt_hw_stack_frame *regs)
{ {

View File

@ -1,14 +1,16 @@
# RT-Thread building script for component # RT-Thread building script for component
from building import * from building import *
Import('rtconfig')
cwd = GetCurrentDir() cwd = GetCurrentDir()
src = Glob('*.c') + Glob('*.cpp') + Glob('*_gcc.S') src = Glob('*.c') + Glob('*.cpp') + Glob('*_gcc.S')
src = src + ['../common/atomic_riscv.c']
CPPPATH = [cwd] CPPPATH = [cwd]
if not GetDepend('ARCH_USING_ASID'):
SrcRemove(src, ['asid.c'])
if not GetDepend('ARCH_RISCV_VECTOR'):
SrcRemove(src, ['vector_gcc.S'])
group = DefineGroup('libcpu', src, depend = [''], CPPPATH = CPPPATH) group = DefineGroup('libcpu', src, depend = [''], CPPPATH = CPPPATH)
Return('group') Return('group')

View File

@ -141,7 +141,7 @@ struct sbi_ret
long value; long value;
}; };
static __inline struct sbi_ret rt_inline struct sbi_ret
sbi_call(uint64_t arg7, uint64_t arg6, uint64_t arg0, uint64_t arg1, sbi_call(uint64_t arg7, uint64_t arg6, uint64_t arg0, uint64_t arg1,
uint64_t arg2, uint64_t arg3, uint64_t arg4) uint64_t arg2, uint64_t arg3, uint64_t arg4)
{ {

View File

@ -8,6 +8,7 @@
* 2018/10/01 Bernard The first version * 2018/10/01 Bernard The first version
* 2018/12/27 Jesven Add SMP support * 2018/12/27 Jesven Add SMP support
* 2020/6/12 Xim Port to QEMU and remove SMP support * 2020/6/12 Xim Port to QEMU and remove SMP support
* 2024-06-30 Shell Support of kernel remapping
*/ */
#include <encoding.h> #include <encoding.h>