Commit 2667e367 authored by Palmer Dabbelt's avatar Palmer Dabbelt

Merge patch series "RISC-V kasan rework"

Alexandre Ghiti <alexghiti@rivosinc.com> says:

As described in patch 2, our current kasan implementation is intricate,
so I tried to simplify the implementation and mimic what arm64/x86 are
doing.

In addition it fixes UEFI bootflow with a kasan kernel and kasan inline
instrumentation: all kasan configurations were tested on a large ubuntu
kernel with success with KASAN_KUNIT_TEST and KASAN_MODULE_TEST.

inline ubuntu config + uefi:
 sv39: OK
 sv48: OK
 sv57: OK

outline ubuntu config + uefi:
 sv39: OK
 sv48: OK
 sv57: OK

Actually 1 test always fails with KASAN_KUNIT_TEST that I have to check:
KASAN failure expected in "set_bit(nr, addr)", but none occurrred

Note that Palmer recently proposed to remove COMMAND_LINE_SIZE from the
userspace abi
https://lore.kernel.org/lkml/20221211061358.28035-1-palmer@rivosinc.com/T/
so that we can finally increase the command line to fit all kasan kernel
parameters.

All of this should hopefully fix the syzkaller riscv build that has been
failing for a few months now, any test is appreciated and if I can help
in any way, please ask.

* b4-shazam-merge:
  riscv: Unconditionnally select KASAN_VMALLOC if KASAN
  riscv: Fix ptdump when KASAN is enabled
  riscv: Fix EFI stub usage of KASAN instrumented strcmp function
  riscv: Move DTB_EARLY_BASE_VA to the kernel address space
  riscv: Rework kasan population functions
  riscv: Split early and final KASAN population functions

Link: https://lore.kernel.org/r/20230203075232.274282-1-alexghiti@rivosinc.comSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parents 2e75ab31 864046c5
...@@ -120,6 +120,7 @@ config RISCV ...@@ -120,6 +120,7 @@ config RISCV
select HAVE_SYSCALL_TRACEPOINTS select HAVE_SYSCALL_TRACEPOINTS
select IRQ_DOMAIN select IRQ_DOMAIN
select IRQ_FORCED_THREADING select IRQ_FORCED_THREADING
select KASAN_VMALLOC if KASAN
select MODULES_USE_ELF_RELA if MODULES select MODULES_USE_ELF_RELA if MODULES
select MODULE_SECTIONS if MODULES select MODULE_SECTIONS if MODULES
select OF select OF
......
...@@ -23,8 +23,6 @@ ...@@ -23,8 +23,6 @@
* linked at. The routines below are all implemented in assembler in a * linked at. The routines below are all implemented in assembler in a
* position independent manner * position independent manner
*/ */
__efistub_strcmp = strcmp;
__efistub__start = _start; __efistub__start = _start;
__efistub__start_kernel = _start_kernel; __efistub__start_kernel = _start_kernel;
__efistub__end = _end; __efistub__end = _end;
......
...@@ -57,7 +57,7 @@ unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] ...@@ -57,7 +57,7 @@ unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
EXPORT_SYMBOL(empty_zero_page); EXPORT_SYMBOL(empty_zero_page);
extern char _start[]; extern char _start[];
#define DTB_EARLY_BASE_VA PGDIR_SIZE #define DTB_EARLY_BASE_VA (ADDRESS_SPACE_END - (PTRS_PER_PGD / 2 * PGDIR_SIZE) + 1)
void *_dtb_early_va __initdata; void *_dtb_early_va __initdata;
uintptr_t _dtb_early_pa __initdata; uintptr_t _dtb_early_pa __initdata;
......
This diff is collapsed.
...@@ -59,10 +59,6 @@ struct ptd_mm_info { ...@@ -59,10 +59,6 @@ struct ptd_mm_info {
}; };
enum address_markers_idx { enum address_markers_idx {
#ifdef CONFIG_KASAN
KASAN_SHADOW_START_NR,
KASAN_SHADOW_END_NR,
#endif
FIXMAP_START_NR, FIXMAP_START_NR,
FIXMAP_END_NR, FIXMAP_END_NR,
PCI_IO_START_NR, PCI_IO_START_NR,
...@@ -74,6 +70,10 @@ enum address_markers_idx { ...@@ -74,6 +70,10 @@ enum address_markers_idx {
VMALLOC_START_NR, VMALLOC_START_NR,
VMALLOC_END_NR, VMALLOC_END_NR,
PAGE_OFFSET_NR, PAGE_OFFSET_NR,
#ifdef CONFIG_KASAN
KASAN_SHADOW_START_NR,
KASAN_SHADOW_END_NR,
#endif
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
MODULES_MAPPING_NR, MODULES_MAPPING_NR,
KERNEL_MAPPING_NR, KERNEL_MAPPING_NR,
...@@ -82,10 +82,6 @@ enum address_markers_idx { ...@@ -82,10 +82,6 @@ enum address_markers_idx {
}; };
static struct addr_marker address_markers[] = { static struct addr_marker address_markers[] = {
#ifdef CONFIG_KASAN
{0, "Kasan shadow start"},
{0, "Kasan shadow end"},
#endif
{0, "Fixmap start"}, {0, "Fixmap start"},
{0, "Fixmap end"}, {0, "Fixmap end"},
{0, "PCI I/O start"}, {0, "PCI I/O start"},
...@@ -97,6 +93,10 @@ static struct addr_marker address_markers[] = { ...@@ -97,6 +93,10 @@ static struct addr_marker address_markers[] = {
{0, "vmalloc() area"}, {0, "vmalloc() area"},
{0, "vmalloc() end"}, {0, "vmalloc() end"},
{0, "Linear mapping"}, {0, "Linear mapping"},
#ifdef CONFIG_KASAN
{0, "Kasan shadow start"},
{0, "Kasan shadow end"},
#endif
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
{0, "Modules/BPF mapping"}, {0, "Modules/BPF mapping"},
{0, "Kernel mapping"}, {0, "Kernel mapping"},
...@@ -362,10 +362,6 @@ static int __init ptdump_init(void) ...@@ -362,10 +362,6 @@ static int __init ptdump_init(void)
{ {
unsigned int i, j; unsigned int i, j;
#ifdef CONFIG_KASAN
address_markers[KASAN_SHADOW_START_NR].start_address = KASAN_SHADOW_START;
address_markers[KASAN_SHADOW_END_NR].start_address = KASAN_SHADOW_END;
#endif
address_markers[FIXMAP_START_NR].start_address = FIXADDR_START; address_markers[FIXMAP_START_NR].start_address = FIXADDR_START;
address_markers[FIXMAP_END_NR].start_address = FIXADDR_TOP; address_markers[FIXMAP_END_NR].start_address = FIXADDR_TOP;
address_markers[PCI_IO_START_NR].start_address = PCI_IO_START; address_markers[PCI_IO_START_NR].start_address = PCI_IO_START;
...@@ -377,6 +373,10 @@ static int __init ptdump_init(void) ...@@ -377,6 +373,10 @@ static int __init ptdump_init(void)
address_markers[VMALLOC_START_NR].start_address = VMALLOC_START; address_markers[VMALLOC_START_NR].start_address = VMALLOC_START;
address_markers[VMALLOC_END_NR].start_address = VMALLOC_END; address_markers[VMALLOC_END_NR].start_address = VMALLOC_END;
address_markers[PAGE_OFFSET_NR].start_address = PAGE_OFFSET; address_markers[PAGE_OFFSET_NR].start_address = PAGE_OFFSET;
#ifdef CONFIG_KASAN
address_markers[KASAN_SHADOW_START_NR].start_address = KASAN_SHADOW_START;
address_markers[KASAN_SHADOW_END_NR].start_address = KASAN_SHADOW_END;
#endif
#ifdef CONFIG_64BIT #ifdef CONFIG_64BIT
address_markers[MODULES_MAPPING_NR].start_address = MODULES_VADDR; address_markers[MODULES_MAPPING_NR].start_address = MODULES_VADDR;
address_markers[KERNEL_MAPPING_NR].start_address = kernel_map.virt_addr; address_markers[KERNEL_MAPPING_NR].start_address = kernel_map.virt_addr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment