]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
LoongArch: Set correct protection_map[] for VM_NONE/VM_SHARED
authorHuacai Chen <chenhuacai@loongson.cn>
Wed, 31 Dec 2025 07:19:10 +0000 (15:19 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Wed, 31 Dec 2025 07:19:10 +0000 (15:19 +0800)
For 32BIT platform _PAGE_PROTNONE is 0, so set a VMA to be VM_NONE or
VM_SHARED will make pages non-present, then cause Oops with kernel page
fault.

Fix it by set correct protection_map[] for VM_NONE/VM_SHARED, replacing
_PAGE_PROTNONE with _PAGE_PRESENT.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/mm/cache.c

index 6be04d36ca0769658a2b52d25af50dd6ad7e07e0..496916845ff764d83b75db520cad5d220d241f76 100644 (file)
@@ -160,8 +160,8 @@ void cpu_cache_init(void)
 
 static const pgprot_t protection_map[16] = {
        [VM_NONE]                                       = __pgprot(_CACHE_CC | _PAGE_USER |
-                                                                  _PAGE_PROTNONE | _PAGE_NO_EXEC |
-                                                                  _PAGE_NO_READ),
+                                                                  _PAGE_NO_EXEC | _PAGE_NO_READ |
+                                                                  (_PAGE_PROTNONE ? : _PAGE_PRESENT)),
        [VM_READ]                                       = __pgprot(_CACHE_CC | _PAGE_VALID |
                                                                   _PAGE_USER | _PAGE_PRESENT |
                                                                   _PAGE_NO_EXEC),
@@ -180,8 +180,8 @@ static const pgprot_t protection_map[16] = {
        [VM_EXEC | VM_WRITE | VM_READ]                  = __pgprot(_CACHE_CC | _PAGE_VALID |
                                                                   _PAGE_USER | _PAGE_PRESENT),
        [VM_SHARED]                                     = __pgprot(_CACHE_CC | _PAGE_USER |
-                                                                  _PAGE_PROTNONE | _PAGE_NO_EXEC |
-                                                                  _PAGE_NO_READ),
+                                                                  _PAGE_NO_EXEC | _PAGE_NO_READ |
+                                                                  (_PAGE_PROTNONE ? : _PAGE_PRESENT)),
        [VM_SHARED | VM_READ]                           = __pgprot(_CACHE_CC | _PAGE_VALID |
                                                                   _PAGE_USER | _PAGE_PRESENT |
                                                                   _PAGE_NO_EXEC),