Skip to content

Commit a256f2e

Browse files
avpatelpaul-walmsley-sifive
authored andcommitted
RISC-V: Fix FIXMAP area corruption on RV32 systems
Currently, various virtual memory areas of Linux RISC-V are organized in increasing order of their virtual addresses is as follows: 1. User space area (This is lowest area and starts at 0x0) 2. FIXMAP area 3. VMALLOC area 4. Kernel area (This is highest area and starts at PAGE_OFFSET) The maximum size of user space aread is represented by TASK_SIZE. On RV32 systems, TASK_SIZE is defined as VMALLOC_START which causes the user space area to overlap the FIXMAP area. This allows user space apps to potentially corrupt the FIXMAP area and kernel OF APIs will crash whenever they access corrupted FDT in the FIXMAP area. On RV64 systems, TASK_SIZE is set to fixed 256GB and no other areas happen to overlap so we don't see any FIXMAP area corruptions. This patch fixes FIXMAP area corruption on RV32 systems by setting TASK_SIZE to FIXADDR_START. We also move FIXADDR_TOP, FIXADDR_SIZE, and FIXADDR_START defines to asm/pgtable.h so that we can avoid cyclic header includes. Signed-off-by: Anup Patel <[email protected]> Tested-by: Alistair Francis <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Paul Walmsley <[email protected]>
1 parent a55aa89 commit a256f2e

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

arch/riscv/include/asm/fixmap.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ enum fixed_addresses {
3030
__end_of_fixed_addresses
3131
};
3232

33-
#define FIXADDR_SIZE (__end_of_fixed_addresses * PAGE_SIZE)
34-
#define FIXADDR_TOP (VMALLOC_START)
35-
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
36-
3733
#define FIXMAP_PAGE_IO PAGE_KERNEL
3834

3935
#define __early_set_fixmap __set_fixmap

arch/riscv/include/asm/pgtable.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,14 +420,22 @@ static inline void pgtable_cache_init(void)
420420
#define VMALLOC_END (PAGE_OFFSET - 1)
421421
#define VMALLOC_START (PAGE_OFFSET - VMALLOC_SIZE)
422422

423+
#define FIXADDR_TOP VMALLOC_START
424+
#ifdef CONFIG_64BIT
425+
#define FIXADDR_SIZE PMD_SIZE
426+
#else
427+
#define FIXADDR_SIZE PGDIR_SIZE
428+
#endif
429+
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
430+
423431
/*
424-
* Task size is 0x4000000000 for RV64 or 0xb800000 for RV32.
432+
* Task size is 0x4000000000 for RV64 or 0x9fc00000 for RV32.
425433
* Note that PGDIR_SIZE must evenly divide TASK_SIZE.
426434
*/
427435
#ifdef CONFIG_64BIT
428436
#define TASK_SIZE (PGDIR_SIZE * PTRS_PER_PGD / 2)
429437
#else
430-
#define TASK_SIZE VMALLOC_START
438+
#define TASK_SIZE FIXADDR_START
431439
#endif
432440

433441
#include <asm-generic/pgtable.h>

0 commit comments

Comments
 (0)