From 523b123995eaa47a33d47bdb2682f7a9ab862f7f Mon Sep 17 00:00:00 2001 From: zhangjing0303 <161287203+zhangjing0303@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:10:46 +0800 Subject: [PATCH] [libcpu][risc-v] fix the bug when using ASID in the RV64 MMU * (fix) mmu: satp value should be 64-bit Corrected the SATP register to ensure it uses the correct 64-bit format as required by the system architecture. * use __asm__ instead of asm for the GNU C compiler Co-authored-by: Shell --------- Co-authored-by: Shell --- libcpu/risc-v/common64/asid.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libcpu/risc-v/common64/asid.c b/libcpu/risc-v/common64/asid.c index 5d7bffa3dc..c8ed61eb67 100644 --- a/libcpu/risc-v/common64/asid.c +++ b/libcpu/risc-v/common64/asid.c @@ -29,9 +29,10 @@ static rt_uint64_t global_asid_generation; void rt_hw_asid_init(void) { - unsigned int satp_reg = read_csr(satp); + rt_uint64_t satp_reg = read_csr(satp); satp_reg |= (((rt_uint64_t)0xffff) << PPN_BITS); write_csr(satp, satp_reg); + __asm__ volatile("sfence.vma x0, x0"); unsigned short valid_asid_bit = ((read_csr(satp) >> PPN_BITS) & 0xffff); // The maximal value of ASIDLEN, is 9 for Sv32 or 16 for Sv39, Sv48, and Sv57