Skip to content

feat: support ARCH_REMAP_KERNEL on libcpu/c906 #9123

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions components/mm/mm_aspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@ typedef struct rt_aspace
struct rt_mutex bst_lock;

struct rt_mem_obj *private_object;

#ifdef ARCH_USING_ASID
rt_uint64_t asid;
#endif /* ARCH_USING_ASID */

} *rt_aspace_t;

typedef struct rt_varea
Expand Down
18 changes: 11 additions & 7 deletions libcpu/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -262,13 +262,17 @@ 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_REMAP_KERNEL
bool
depends on RT_USING_SMART
help
Remapping kernel image to high virtual address region

config ARCH_USING_ASID
bool
depends on RT_USING_SMART
help
Using ASID support from architecture

config ARCH_IA32
bool
Expand Down
28 changes: 25 additions & 3 deletions libcpu/risc-v/t-head/c906/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ static void *current_mmu_table = RT_NULL;
volatile __attribute__((aligned(4 * 1024)))
rt_ubase_t MMUTable[__SIZE(VPN2_BIT)];

#ifdef ARCH_USING_ASID
static rt_uint8_t ASID_BITS = 0;
static rt_uint32_t next_asid;
static rt_uint64_t global_asid_generation;
Expand Down Expand Up @@ -109,6 +110,24 @@ void rt_hw_aspace_switch(rt_aspace_t aspace)
asm volatile("sfence.vma x0,%0"::"r"(asid):"memory");
}

#define ASID_INIT() _asid_init()

#else /* ARCH_USING_ASID */

#define ASID_INIT()

void rt_hw_aspace_switch(rt_aspace_t aspace)
{
uintptr_t page_table = (uintptr_t)rt_kmem_v2p(aspace->page_table);
current_mmu_table = aspace->page_table;

write_csr(satp, (((size_t)SATP_MODE) << SATP_MODE_OFFSET) |
((rt_ubase_t)page_table >> PAGE_OFFSET_BIT));
rt_hw_tlb_invalidate_all_local();
}

#endif /* ARCH_USING_ASID */

void *rt_hw_mmu_tbl_get()
{
return current_mmu_table;
Expand Down Expand Up @@ -552,7 +571,7 @@ void rt_hw_mmu_setup(rt_aspace_t aspace, struct mem_desc *mdesc, int desc_nr)
mdesc++;
}

_asid_init();
ASID_INIT();

rt_hw_aspace_switch(&rt_kernel_space);
rt_page_cleanup();
Expand Down Expand Up @@ -601,13 +620,15 @@ void rt_hw_mem_setup_early(void)
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);
early_pgtbl[i] = COMBINEPTE(ps, PAGE_ATTR_RWX | PTE_G | PTE_V | PTE_CACHE |
PTE_SHARE | PTE_BUF | PTE_A | PTE_D);
ps += L1_PAGE_SIZE;
}

Expand All @@ -621,7 +642,8 @@ void rt_hw_mem_setup_early(void)
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);
early_pgtbl[i] = COMBINEPTE(ps, PAGE_ATTR_RWX | PTE_G | PTE_V | PTE_CACHE |
PTE_SHARE | PTE_BUF | PTE_A | PTE_D);
ps += L1_PAGE_SIZE;
}

Expand Down
52 changes: 45 additions & 7 deletions libcpu/risc-v/t-head/c906/startup_gcc.S
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@
* 2018/10/01 Bernard The first version
* 2018/12/27 Jesven Add 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 <cpuport.h>

boot_hartid: .int
.global boot_hartid
.data
.global boot_hartid /* global varible rt_boot_hartid in .data section */
boot_hartid:
.word 0xdeadbeef

.global _start
.section ".start", "ax"
Expand Down Expand Up @@ -72,8 +75,6 @@ _start:
li x31,0

/* set to disable FPU */
li t0, SSTATUS_FS
csrc sstatus, t0
li t0, SSTATUS_SUM
csrs sstatus, t0

Expand All @@ -86,8 +87,45 @@ _start:
la sp, __stack_start__
li t0, __STACKSIZE__
add sp, sp, t0
csrw sscratch, sp

/**
* sscratch is always zero on kernel mode
*/
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
Loading