From ce57cb572e3dec5ae0cf122e5f1e71f3d8e647ff Mon Sep 17 00:00:00 2001 From: Xiang W Date: Wed, 19 Mar 2025 20:37:07 +0800 Subject: [PATCH] lib: sbi: Add parameter check in sbi_mpxy_set_shmem() Shared memory needs to be accessed in M-Mode so for now the high address of shared memory can't non-zero. Signed-off-by: Xiang W Reviewed-by: Anup Patel Link: https://lore.kernel.org/r/20250319123719.504622-1-wxjstz@126.com Signed-off-by: Anup Patel --- lib/sbi/sbi_mpxy.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/sbi/sbi_mpxy.c b/lib/sbi/sbi_mpxy.c index c5d9d1bb..c7f311ed 100644 --- a/lib/sbi/sbi_mpxy.c +++ b/lib/sbi/sbi_mpxy.c @@ -287,6 +287,20 @@ int sbi_mpxy_set_shmem(unsigned long shmem_phys_lo, if (shmem_phys_lo & ~PAGE_MASK) return SBI_ERR_INVALID_PARAM; + /* + * On RV32, the M-mode can only access the first 4GB of + * the physical address space because M-mode does not have + * MMU to access full 34-bit physical address space. + * So fail if the upper 32 bits of the physical address + * is non-zero on RV32. + * + * On RV64, kernel sets upper 64bit address part to zero. + * So fail if the upper 64bit of the physical address + * is non-zero on RV64. + */ + if (shmem_phys_hi) + return SBI_ERR_INVALID_ADDRESS; + if (!sbi_domain_check_addr_range(sbi_domain_thishart_ptr(), SHMEM_PHYS_ADDR(shmem_phys_hi, shmem_phys_lo), mpxy_shmem_size, PRV_S,