mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-10-07 00:59:00 +08:00
[libcpu] rv64: support for ARCH_REMAP_KERNEL (#9067)
* [libcpu] support for ARCH_REMAP_KERNEL These changes introduce support for the ARCH_REMAP_KERNEL configuration, which isolates kernel space in high virtual address regions. This feature is necessary to enhance memory protection and management by segregating user and kernel spaces more effectively. Changes: - Updated conditional macros to check for ARCH_REMAP_KERNEL instead of ARCH_KERNEL_IN_HIGH_VA in board initialization files to reflect the new configuration option. - Modified qemu-virt64-riscv Kconfig and SConstruct files to include and utilize ARCH_REMAP_KERNEL. - Created a new linker script `link_smart.lds` for smart linking in qemu-virt64-riscv. - Updated rtconfig.py to use a more flexible execution path setup. - Enhanced user address space definitions in `lwp_arch.h` to support the new virtual address mappings. - Adjusted kernel memory initialization and mapping logic in `c906/mmu.c` and `virt64/mmu.c` to account for high virtual address regions. - Added Kconfig option to enable ARCH_REMAP_KERNEL for RISCV64 architectures. - Enhanced memory setup functions to support new mapping scheme, including updates to early page table setup and address relocation logic. These modifications ensure that the system can utilize high memory addresses for the kernel, improving memory isolation and system stability. Signed-off-by: Shell <smokewood@qq.com> * fixup: CI run failed * bsp: default config without using smart * fixup: static checks * restore rt_hw_mmu_kernel_map_init for D1 --------- Signed-off-by: Shell <smokewood@qq.com>
This commit is contained in:
@@ -142,9 +142,9 @@ jobs:
|
||||
popd
|
||||
pushd UtestRunner
|
||||
if [ $TEST_SD_FILE != "None" ]; then
|
||||
python3 qemu_runner.py --system $TEST_QEMU_ARCH --machine $TEST_QEMU_MACHINE --elf ../$TEST_BSP_ROOT/rtthread.elf --sd ../$TEST_BSP_ROOT/$TEST_SD_FILE
|
||||
python3 qemu_runner.py --system $TEST_QEMU_ARCH --machine $TEST_QEMU_MACHINE --elf ../$TEST_BSP_ROOT/rtthread.bin --sd ../$TEST_BSP_ROOT/$TEST_SD_FILE
|
||||
else
|
||||
python3 qemu_runner.py --system $TEST_QEMU_ARCH --machine $TEST_QEMU_MACHINE --elf ../$TEST_BSP_ROOT/rtthread.elf
|
||||
python3 qemu_runner.py --system $TEST_QEMU_ARCH --machine $TEST_QEMU_MACHINE --elf ../$TEST_BSP_ROOT/rtthread.bin
|
||||
fi
|
||||
cat rtt_console.log
|
||||
popd
|
||||
|
||||
@@ -38,7 +38,7 @@ void init_bss(void)
|
||||
unsigned int *dst;
|
||||
|
||||
dst = &__bss_start;
|
||||
while (dst < &__bss_end)
|
||||
while ((rt_ubase_t)dst < (rt_ubase_t)&__bss_end)
|
||||
{
|
||||
*dst++ = 0;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ void primary_cpu_entry(void)
|
||||
|
||||
#define IOREMAP_SIZE (1ul << 30)
|
||||
|
||||
#ifndef ARCH_KERNEL_IN_HIGH_VA
|
||||
#ifndef ARCH_REMAP_KERNEL
|
||||
#define IOREMAP_VEND USER_VADDR_START
|
||||
#else
|
||||
#define IOREMAP_VEND 0ul
|
||||
|
||||
@@ -38,7 +38,7 @@ void init_bss(void)
|
||||
unsigned int *dst;
|
||||
|
||||
dst = &__bss_start;
|
||||
while (dst < &__bss_end)
|
||||
while ((rt_ubase_t)dst < (rt_ubase_t)&__bss_end)
|
||||
{
|
||||
*dst++ = 0;
|
||||
}
|
||||
@@ -62,7 +62,7 @@ void primary_cpu_entry(void)
|
||||
|
||||
#define IOREMAP_SIZE (1ul << 30)
|
||||
|
||||
#ifndef ARCH_KERNEL_IN_HIGH_VA
|
||||
#ifndef ARCH_REMAP_KERNEL
|
||||
#define IOREMAP_VEND USER_VADDR_START
|
||||
#else
|
||||
#define IOREMAP_VEND 0ul
|
||||
|
||||
+216
-265
File diff suppressed because it is too large
Load Diff
@@ -27,6 +27,7 @@ config BOARD_QEMU_VIRT_RV64
|
||||
select RT_USING_USER_MAIN
|
||||
select RT_USING_CACHE
|
||||
select ARCH_MM_MMU
|
||||
select ARCH_REMAP_KERNEL
|
||||
select RT_USING_HW_ATOMIC
|
||||
default y
|
||||
|
||||
|
||||
@@ -29,6 +29,10 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False)
|
||||
|
||||
stack_size = 4096
|
||||
|
||||
if GetDepend('RT_USING_SMART'):
|
||||
# use smart link.lds
|
||||
env['LINKFLAGS'] = env['LINKFLAGS'].replace('link.lds', 'link_smart.lds')
|
||||
|
||||
stack_lds = open('link_stacksize.lds', 'w')
|
||||
if GetDepend('__STACKSIZE__'): stack_size = GetDepend('__STACKSIZE__')
|
||||
stack_lds.write('__STACKSIZE__ = %d;\n' % stack_size)
|
||||
|
||||
@@ -52,11 +52,11 @@ void primary_cpu_entry(void)
|
||||
|
||||
#define IOREMAP_SIZE (1ul << 30)
|
||||
|
||||
#ifndef ARCH_KERNEL_IN_HIGH_VA
|
||||
#ifndef ARCH_REMAP_KERNEL
|
||||
#define IOREMAP_VEND USER_VADDR_START
|
||||
#else
|
||||
#define IOREMAP_VEND 0ul
|
||||
#endif
|
||||
#endif /* ARCH_REMAP_KERNEL */
|
||||
|
||||
void rt_hw_board_init(void)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2020/12/12 bernard The first version
|
||||
*/
|
||||
|
||||
INCLUDE "link_stacksize.lds"
|
||||
|
||||
OUTPUT_ARCH( "riscv" )
|
||||
|
||||
/*
|
||||
* Memory layout:
|
||||
* 0x80000000 - 0x80200000: SBI
|
||||
* 0x80200000 - 0x81200000: Kernel
|
||||
*/
|
||||
|
||||
MEMORY
|
||||
{
|
||||
SRAM : ORIGIN = 0xFFFFFFC000200000, LENGTH = 0x1000000 - 0x200000
|
||||
}
|
||||
|
||||
ENTRY(_start)
|
||||
SECTIONS
|
||||
{
|
||||
/* . = 0x80200000 ; */
|
||||
. = 0xFFFFFFC000200000;
|
||||
|
||||
/* __STACKSIZE__ = 4096; */
|
||||
__text_start = .;
|
||||
.start :
|
||||
{
|
||||
*(.start);
|
||||
} > SRAM
|
||||
|
||||
. = ALIGN(8);
|
||||
|
||||
.text :
|
||||
{
|
||||
*(.text) /* remaining code */
|
||||
*(.text.*) /* remaining code */
|
||||
*(.rodata) /* read-only data (constants) */
|
||||
*(.rodata*)
|
||||
*(.glue_7)
|
||||
*(.glue_7t)
|
||||
*(.gnu.linkonce.t*)
|
||||
|
||||
/* section information for finsh shell */
|
||||
. = ALIGN(8);
|
||||
__fsymtab_start = .;
|
||||
KEEP(*(FSymTab))
|
||||
__fsymtab_end = .;
|
||||
. = ALIGN(8);
|
||||
__vsymtab_start = .;
|
||||
KEEP(*(VSymTab))
|
||||
__vsymtab_end = .;
|
||||
. = ALIGN(8);
|
||||
|
||||
/* section information for initial. */
|
||||
. = ALIGN(8);
|
||||
__rt_init_start = .;
|
||||
KEEP(*(SORT(.rti_fn*)))
|
||||
__rt_init_end = .;
|
||||
. = ALIGN(8);
|
||||
|
||||
__rt_utest_tc_tab_start = .;
|
||||
KEEP(*(UtestTcTab))
|
||||
__rt_utest_tc_tab_end = .;
|
||||
|
||||
. = ALIGN(8);
|
||||
_etext = .;
|
||||
} > SRAM
|
||||
|
||||
.eh_frame_hdr :
|
||||
{
|
||||
*(.eh_frame_hdr)
|
||||
*(.eh_frame_entry)
|
||||
} > SRAM
|
||||
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } > SRAM
|
||||
|
||||
. = ALIGN(8);
|
||||
__text_end = .;
|
||||
__text_size = __text_end - __text_start;
|
||||
|
||||
.data :
|
||||
{
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
|
||||
*(.data1)
|
||||
*(.data1.*)
|
||||
|
||||
. = ALIGN(8);
|
||||
PROVIDE( __global_pointer$ = . + 0x800 );
|
||||
|
||||
*(.sdata)
|
||||
*(.sdata.*)
|
||||
} > SRAM
|
||||
|
||||
. = ALIGN(8);
|
||||
.ctors :
|
||||
{
|
||||
PROVIDE(__ctors_start__ = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE(__ctors_end__ = .);
|
||||
} > SRAM
|
||||
|
||||
.dtors :
|
||||
{
|
||||
PROVIDE(__dtors_start__ = .);
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
KEEP(*(.fini_array))
|
||||
PROVIDE(__dtors_end__ = .);
|
||||
} > SRAM
|
||||
|
||||
/* stack for dual core */
|
||||
.stack :
|
||||
{
|
||||
. = ALIGN(64);
|
||||
__stack_start__ = .;
|
||||
|
||||
. += __STACKSIZE__;
|
||||
__stack_cpu0 = .;
|
||||
|
||||
. += __STACKSIZE__;
|
||||
__stack_cpu1 = .;
|
||||
} > SRAM
|
||||
|
||||
.sbss :
|
||||
{
|
||||
__bss_start = .;
|
||||
*(.sbss)
|
||||
*(.sbss.*)
|
||||
*(.dynsbss)
|
||||
*(.scommon)
|
||||
} > SRAM
|
||||
|
||||
.bss :
|
||||
{
|
||||
*(.bss)
|
||||
*(.bss.*)
|
||||
*(.dynbss)
|
||||
*(COMMON)
|
||||
__bss_end = .;
|
||||
} > SRAM
|
||||
|
||||
_end = .;
|
||||
|
||||
/* Stabs debugging sections. */
|
||||
.stab 0 : { *(.stab) }
|
||||
.stabstr 0 : { *(.stabstr) }
|
||||
.stab.excl 0 : { *(.stab.excl) }
|
||||
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||
.stab.index 0 : { *(.stab.index) }
|
||||
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||
.comment 0 : { *(.comment) }
|
||||
/* DWARF debug sections.
|
||||
* Symbols in the DWARF debugging sections are relative to the beginning
|
||||
* of the section so we begin them at 0. */
|
||||
/* DWARF 1 */
|
||||
.debug 0 : { *(.debug) }
|
||||
.line 0 : { *(.line) }
|
||||
/* GNU DWARF 1 extensions */
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
/* DWARF 1.1 and DWARF 2 */
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
/* DWARF 2 */
|
||||
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
||||
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||
.debug_line 0 : { *(.debug_line) }
|
||||
.debug_frame 0 : { *(.debug_frame) }
|
||||
.debug_str 0 : { *(.debug_str) }
|
||||
.debug_loc 0 : { *(.debug_loc) }
|
||||
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||
/* SGI/MIPS DWARF 2 extensions */
|
||||
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||
.debug_typenames 0 : { *(.debug_typenames) }
|
||||
.debug_varnames 0 : { *(.debug_varnames) }
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,14 +12,11 @@ if os.getenv('RTT_CC'):
|
||||
|
||||
if CROSS_TOOL == 'gcc':
|
||||
PLATFORM = 'gcc'
|
||||
EXEC_PATH = r'/opt/rtt_riscv64_musl/bin'
|
||||
EXEC_PATH = os.getenv('RTT_EXEC_PATH') or '/usr/bin'
|
||||
else:
|
||||
print('Please make sure your toolchains is GNU GCC!')
|
||||
exit(0)
|
||||
|
||||
if os.getenv('RTT_EXEC_PATH'):
|
||||
EXEC_PATH = os.getenv('RTT_EXEC_PATH')
|
||||
|
||||
BUILD = 'debug'
|
||||
|
||||
if PLATFORM == 'gcc':
|
||||
|
||||
@@ -25,6 +25,15 @@
|
||||
#define USER_VADDR_TOP 0xFF000000UL
|
||||
#define USER_LOAD_VADDR 0xD0000000UL
|
||||
#define LDSO_LOAD_VADDR USER_LOAD_VADDR
|
||||
#elif defined(ARCH_REMAP_KERNEL)
|
||||
#define USER_VADDR_START 0x00001000UL
|
||||
#define USER_VADDR_TOP 0x003ffffff000UL
|
||||
#define USER_STACK_VSTART 0x000270000000UL
|
||||
#define USER_STACK_VEND USER_HEAP_VADDR
|
||||
#define USER_HEAP_VADDR 0x000300000000UL
|
||||
#define USER_HEAP_VEND USER_VADDR_TOP
|
||||
#define USER_LOAD_VADDR 0x200000000
|
||||
#define LDSO_LOAD_VADDR 0x200000000
|
||||
#else
|
||||
#define USER_HEAP_VADDR 0x300000000UL
|
||||
#define USER_HEAP_VEND USER_STACK_VSTART
|
||||
|
||||
@@ -133,6 +133,7 @@ if RT_USING_SMART
|
||||
hex "The virtural address of kernel start"
|
||||
default 0xffff000000000000 if ARCH_ARMV8
|
||||
default 0xc0000000 if ARCH_ARM
|
||||
default 0xffffffc000000000 if ARCH_RISCV && ARCH_REMAP_KERNEL
|
||||
default 0x80000000 if ARCH_RISCV
|
||||
depends on ARCH_MM_MMU
|
||||
|
||||
@@ -255,6 +256,14 @@ config ARCH_RISCV64
|
||||
select ARCH_CPU_64BIT
|
||||
bool
|
||||
|
||||
if ARCH_RISCV64
|
||||
config ARCH_REMAP_KERNEL
|
||||
bool
|
||||
depends on RT_USING_SMART
|
||||
help
|
||||
Remapping kernel image to high virtual address region
|
||||
endif
|
||||
|
||||
config ARCH_IA32
|
||||
bool
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#define DBG_LVL DBG_WARNING
|
||||
#include <rtdbg.h>
|
||||
|
||||
#include <board.h>
|
||||
#include <cache.h>
|
||||
#include <mm_aspace.h>
|
||||
#include <mm_page.h>
|
||||
@@ -324,6 +325,14 @@ static inline void _init_region(void *vaddr, size_t size)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(RT_USING_SMART) && defined(ARCH_REMAP_KERNEL)
|
||||
#define KERN_SPACE_START ((void *)KERNEL_VADDR_START)
|
||||
#define KERN_SPACE_SIZE (0xfffffffffffff000UL - KERNEL_VADDR_START + 0x1000)
|
||||
#else
|
||||
#define KERN_SPACE_START ((void *)0x1000)
|
||||
#define KERN_SPACE_SIZE ((size_t)USER_VADDR_START - 0x1000)
|
||||
#endif
|
||||
|
||||
int rt_hw_mmu_map_init(rt_aspace_t aspace, void *v_address, rt_size_t size,
|
||||
rt_size_t *vtable, rt_size_t pv_off)
|
||||
{
|
||||
@@ -363,8 +372,7 @@ int rt_hw_mmu_map_init(rt_aspace_t aspace, void *v_address, rt_size_t size,
|
||||
}
|
||||
}
|
||||
|
||||
rt_aspace_init(&rt_kernel_space, (void *)0x1000, USER_VADDR_START - 0x1000,
|
||||
vtable);
|
||||
rt_aspace_init(&rt_kernel_space, KERN_SPACE_START, KERN_SPACE_SIZE, vtable);
|
||||
|
||||
_init_region(v_address, size);
|
||||
return 0;
|
||||
@@ -569,6 +577,62 @@ void rt_hw_mmu_kernel_map_init(rt_aspace_t aspace, rt_size_t vaddr_start, rt_siz
|
||||
rt_hw_tlb_invalidate_all_local();
|
||||
}
|
||||
|
||||
#define SATP_BASE ((size_t)SATP_MODE << SATP_MODE_OFFSET)
|
||||
void rt_hw_mem_setup_early(void)
|
||||
{
|
||||
rt_size_t pv_off;
|
||||
rt_size_t ps = 0x0;
|
||||
rt_size_t vs = 0x0;
|
||||
rt_size_t *early_pgtbl = (size_t *)(((size_t)&__bss_end + 4095) & ~0xfff);
|
||||
|
||||
/* calculate pv_offset */
|
||||
void *symb_pc;
|
||||
void *symb_linker;
|
||||
__asm__ volatile("la %0, _start\n" : "=r"(symb_pc));
|
||||
__asm__ volatile("la %0, _start_link_addr\n" : "=r"(symb_linker));
|
||||
symb_linker = *(void **)symb_linker;
|
||||
pv_off = symb_pc - symb_linker;
|
||||
rt_kmem_pvoff_set(pv_off);
|
||||
|
||||
if (pv_off)
|
||||
{
|
||||
if (pv_off & (1ul << (ARCH_INDEX_WIDTH * 2 + ARCH_PAGE_SHIFT)))
|
||||
{
|
||||
LOG_E("%s: not aligned virtual address. pv_offset %p", __func__, pv_off);
|
||||
RT_ASSERT(0);
|
||||
}
|
||||
/**
|
||||
* identical mapping,
|
||||
* PC are still at lower region before relocating to high memory
|
||||
*/
|
||||
for (size_t i = 0; i < __SIZE(PPN0_BIT); i++)
|
||||
{
|
||||
early_pgtbl[i] = COMBINEPTE(ps, PAGE_ATTR_RWX | PTE_G | PTE_V);
|
||||
ps += L1_PAGE_SIZE;
|
||||
}
|
||||
|
||||
/* relocate text region */
|
||||
__asm__ volatile("la %0, _start\n" : "=r"(ps));
|
||||
ps &= ~(L1_PAGE_SIZE - 1);
|
||||
vs = ps - pv_off;
|
||||
|
||||
/* relocate region */
|
||||
rt_size_t vs_idx = GET_L1(vs);
|
||||
rt_size_t ve_idx = GET_L1(vs + 0x80000000);
|
||||
for (size_t i = vs_idx; i < ve_idx; i++)
|
||||
{
|
||||
early_pgtbl[i] = COMBINEPTE(ps, PAGE_ATTR_RWX | PTE_G | PTE_V);
|
||||
ps += L1_PAGE_SIZE;
|
||||
}
|
||||
|
||||
/* apply new mapping */
|
||||
asm volatile("sfence.vma x0, x0");
|
||||
write_csr(satp, SATP_BASE | ((size_t)early_pgtbl >> PAGE_OFFSET_BIT));
|
||||
asm volatile("sfence.vma x0, x0");
|
||||
}
|
||||
/* return to lower text section */
|
||||
}
|
||||
|
||||
void *rt_hw_mmu_pgtbl_create(void)
|
||||
{
|
||||
size_t *mmu_table;
|
||||
|
||||
@@ -64,8 +64,8 @@
|
||||
#define PAGE_ATTR_CB (PTE_BUF | PTE_CACHE)
|
||||
#define PAGE_ATTR_DEV (PTE_SO)
|
||||
|
||||
#define PAGE_DEFAULT_ATTR_LEAF (PTE_SHARE | PTE_BUF | PTE_CACHE | PTE_A | PTE_D | PTE_U | PAGE_ATTR_RWX | PTE_V)
|
||||
#define PAGE_DEFAULT_ATTR_NEXT (PTE_SHARE | PTE_BUF | PTE_CACHE | PTE_A | PTE_D | PTE_V)
|
||||
#define PAGE_DEFAULT_ATTR_LEAF (PTE_SHARE | PTE_BUF | PTE_CACHE | PTE_A | PTE_D | PTE_G | PTE_U | PAGE_ATTR_RWX | PTE_V)
|
||||
#define PAGE_DEFAULT_ATTR_NEXT (PTE_SHARE | PTE_BUF | PTE_CACHE | PTE_A | PTE_D | PTE_G | PTE_V)
|
||||
|
||||
#define PAGE_IS_LEAF(pte) __MASKVALUE(pte, PAGE_ATTR_RWX)
|
||||
|
||||
|
||||
@@ -269,6 +269,14 @@ static inline void _init_region(void *vaddr, size_t size)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(RT_USING_SMART) && defined(ARCH_REMAP_KERNEL)
|
||||
#define KERN_SPACE_START ((void *)KERNEL_VADDR_START)
|
||||
#define KERN_SPACE_SIZE (0xfffffffffffff000UL - KERNEL_VADDR_START + 0x1000)
|
||||
#else
|
||||
#define KERN_SPACE_START ((void *)0x1000)
|
||||
#define KERN_SPACE_SIZE ((size_t)USER_VADDR_START - 0x1000)
|
||||
#endif
|
||||
|
||||
int rt_hw_mmu_map_init(rt_aspace_t aspace, void *v_address, rt_size_t size,
|
||||
rt_size_t *vtable, rt_size_t pv_off)
|
||||
{
|
||||
@@ -308,8 +316,7 @@ int rt_hw_mmu_map_init(rt_aspace_t aspace, void *v_address, rt_size_t size,
|
||||
}
|
||||
}
|
||||
|
||||
rt_aspace_init(&rt_kernel_space, (void *)0x1000, USER_VADDR_START - 0x1000,
|
||||
vtable);
|
||||
rt_aspace_init(&rt_kernel_space, KERN_SPACE_START, KERN_SPACE_SIZE, vtable);
|
||||
|
||||
_init_region(v_address, size);
|
||||
return 0;
|
||||
@@ -492,6 +499,62 @@ void rt_hw_mmu_setup(rt_aspace_t aspace, struct mem_desc *mdesc, int desc_nr)
|
||||
rt_page_cleanup();
|
||||
}
|
||||
|
||||
#define SATP_BASE ((size_t)SATP_MODE << SATP_MODE_OFFSET)
|
||||
void rt_hw_mem_setup_early(void)
|
||||
{
|
||||
rt_size_t pv_off;
|
||||
rt_size_t ps = 0x0;
|
||||
rt_size_t vs = 0x0;
|
||||
rt_size_t *early_pgtbl = (size_t *)(((size_t)&__bss_end + 4095) & ~0xfff);
|
||||
|
||||
/* calculate pv_offset */
|
||||
void *symb_pc;
|
||||
void *symb_linker;
|
||||
__asm__ volatile("la %0, _start\n" : "=r"(symb_pc));
|
||||
__asm__ volatile("la %0, _start_link_addr\n" : "=r"(symb_linker));
|
||||
symb_linker = *(void **)symb_linker;
|
||||
pv_off = symb_pc - symb_linker;
|
||||
rt_kmem_pvoff_set(pv_off);
|
||||
|
||||
if (pv_off)
|
||||
{
|
||||
if (pv_off & (1ul << (ARCH_INDEX_WIDTH * 2 + ARCH_PAGE_SHIFT)))
|
||||
{
|
||||
LOG_E("%s: not aligned virtual address. pv_offset %p", __func__, pv_off);
|
||||
RT_ASSERT(0);
|
||||
}
|
||||
/**
|
||||
* identical mapping,
|
||||
* PC are still at lower region before relocating to high memory
|
||||
*/
|
||||
for (size_t i = 0; i < __SIZE(PPN0_BIT); i++)
|
||||
{
|
||||
early_pgtbl[i] = COMBINEPTE(ps, PAGE_ATTR_RWX | PTE_G | PTE_V);
|
||||
ps += L1_PAGE_SIZE;
|
||||
}
|
||||
|
||||
/* relocate text region */
|
||||
__asm__ volatile("la %0, _start\n" : "=r"(ps));
|
||||
ps &= ~(L1_PAGE_SIZE - 1);
|
||||
vs = ps - pv_off;
|
||||
|
||||
/* relocate region */
|
||||
rt_size_t vs_idx = GET_L1(vs);
|
||||
rt_size_t ve_idx = GET_L1(vs + 0x80000000);
|
||||
for (size_t i = vs_idx; i < ve_idx; i++)
|
||||
{
|
||||
early_pgtbl[i] = COMBINEPTE(ps, PAGE_ATTR_RWX | PTE_G | PTE_V);
|
||||
ps += L1_PAGE_SIZE;
|
||||
}
|
||||
|
||||
/* apply new mapping */
|
||||
asm volatile("sfence.vma x0, x0");
|
||||
write_csr(satp, SATP_BASE | ((size_t)early_pgtbl >> PAGE_OFFSET_BIT));
|
||||
asm volatile("sfence.vma x0, x0");
|
||||
}
|
||||
/* return to lower text section */
|
||||
}
|
||||
|
||||
void *rt_hw_mmu_pgtbl_create(void)
|
||||
{
|
||||
size_t *mmu_table;
|
||||
|
||||
@@ -94,5 +94,39 @@ _start:
|
||||
*/
|
||||
csrw sscratch, zero
|
||||
call init_bss
|
||||
call sbi_init
|
||||
j primary_cpu_entry
|
||||
#ifdef ARCH_MM_MMU
|
||||
call rt_hw_mem_setup_early
|
||||
call rt_kmem_pvoff
|
||||
/* a0 := pvoff */
|
||||
beq a0, zero, 1f
|
||||
|
||||
/* relocate pc */
|
||||
la x1, _after_pc_relocation
|
||||
sub x1, x1, a0
|
||||
ret
|
||||
_after_pc_relocation:
|
||||
/* relocate gp */
|
||||
sub gp, gp, a0
|
||||
|
||||
/* relocate context: sp */
|
||||
la sp, __stack_start__
|
||||
li t0, __STACKSIZE__
|
||||
add sp, sp, t0
|
||||
|
||||
/* reset s0-fp */
|
||||
mv s0, zero
|
||||
|
||||
/* relocate stvec */
|
||||
la t0, trap_entry
|
||||
csrw stvec, t0
|
||||
1:
|
||||
#endif
|
||||
call sbi_init
|
||||
call primary_cpu_entry
|
||||
|
||||
_never_return_here:
|
||||
j .
|
||||
|
||||
.global _start_link_addr
|
||||
_start_link_addr:
|
||||
.dword __text_start
|
||||
|
||||
@@ -36,6 +36,8 @@ config RT_USING_SMART
|
||||
select RT_USING_KTIME
|
||||
select RT_USING_STDC_ATOMIC
|
||||
select RT_USING_SYSTEM_WORKQUEUE
|
||||
select RT_USING_CPU_USAGE_TRACER
|
||||
select RT_USING_SCHED_THREAD_CTX
|
||||
depends on ARCH_ARM_CORTEX_M || ARCH_ARM_ARM9 || ARCH_ARM_CORTEX_A || ARCH_ARMV8 || ARCH_RISCV64
|
||||
depends on !RT_USING_NANO
|
||||
help
|
||||
|
||||
Reference in New Issue
Block a user