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:
parent
e244c196c4
commit
c78a19ed26
|
@ -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')
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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>
|
||||||
|
@ -15,7 +16,7 @@
|
||||||
|
|
||||||
.data
|
.data
|
||||||
.global boot_hartid /* global varible rt_boot_hartid in .data section */
|
.global boot_hartid /* global varible rt_boot_hartid in .data section */
|
||||||
boot_hartid:
|
boot_hartid:
|
||||||
.word 0xdeadbeef
|
.word 0xdeadbeef
|
||||||
|
|
||||||
.global _start
|
.global _start
|
||||||
|
|
Loading…
Reference in New Issue