Skip to content

Commit 139d42c

Browse files
Kanglong Wangchenhuacai
authored andcommitted
LoongArch: Add WriteCombine shadow mapping in KASAN
Currently, the kernel couldn't boot when ARCH_IOREMAP, ARCH_WRITECOMBINE and KASAN are enabled together. Because DMW2 is used by kernel now which is configured as 0xa000000000000000 for WriteCombine, but KASAN has no segment mapping for it. This patch fix this issue. Solution: Add the relevant definitions for WriteCombine (DMW2) in KASAN. Cc: [email protected] Fixes: 8e02c3b ("LoongArch: Add writecombine support for DMW-based ioremap()") Signed-off-by: Kanglong Wang <[email protected]> Signed-off-by: Huacai Chen <[email protected]>
1 parent 227ca9f commit 139d42c

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

arch/loongarch/include/asm/kasan.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
/* 64-bit segment value. */
2626
#define XKPRANGE_UC_SEG (0x8000)
2727
#define XKPRANGE_CC_SEG (0x9000)
28+
#define XKPRANGE_WC_SEG (0xa000)
2829
#define XKVRANGE_VC_SEG (0xffff)
2930

3031
/* Cached */
@@ -41,10 +42,17 @@
4142
#define XKPRANGE_UC_SHADOW_SIZE (XKPRANGE_UC_SIZE >> KASAN_SHADOW_SCALE_SHIFT)
4243
#define XKPRANGE_UC_SHADOW_END (XKPRANGE_UC_KASAN_OFFSET + XKPRANGE_UC_SHADOW_SIZE)
4344

45+
/* WriteCombine */
46+
#define XKPRANGE_WC_START WRITECOMBINE_BASE
47+
#define XKPRANGE_WC_SIZE XRANGE_SIZE
48+
#define XKPRANGE_WC_KASAN_OFFSET XKPRANGE_UC_SHADOW_END
49+
#define XKPRANGE_WC_SHADOW_SIZE (XKPRANGE_WC_SIZE >> KASAN_SHADOW_SCALE_SHIFT)
50+
#define XKPRANGE_WC_SHADOW_END (XKPRANGE_WC_KASAN_OFFSET + XKPRANGE_WC_SHADOW_SIZE)
51+
4452
/* VMALLOC (Cached or UnCached) */
4553
#define XKVRANGE_VC_START MODULES_VADDR
4654
#define XKVRANGE_VC_SIZE round_up(KFENCE_AREA_END - MODULES_VADDR + 1, PGDIR_SIZE)
47-
#define XKVRANGE_VC_KASAN_OFFSET XKPRANGE_UC_SHADOW_END
55+
#define XKVRANGE_VC_KASAN_OFFSET XKPRANGE_WC_SHADOW_END
4856
#define XKVRANGE_VC_SHADOW_SIZE (XKVRANGE_VC_SIZE >> KASAN_SHADOW_SCALE_SHIFT)
4957
#define XKVRANGE_VC_SHADOW_END (XKVRANGE_VC_KASAN_OFFSET + XKVRANGE_VC_SHADOW_SIZE)
5058

@@ -55,6 +63,7 @@
5563

5664
#define XKPRANGE_CC_SHADOW_OFFSET (KASAN_SHADOW_START + XKPRANGE_CC_KASAN_OFFSET)
5765
#define XKPRANGE_UC_SHADOW_OFFSET (KASAN_SHADOW_START + XKPRANGE_UC_KASAN_OFFSET)
66+
#define XKPRANGE_WC_SHADOW_OFFSET (KASAN_SHADOW_START + XKPRANGE_WC_KASAN_OFFSET)
5867
#define XKVRANGE_VC_SHADOW_OFFSET (KASAN_SHADOW_START + XKVRANGE_VC_KASAN_OFFSET)
5968

6069
extern bool kasan_early_stage;

arch/loongarch/mm/kasan_init.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ void *kasan_mem_to_shadow(const void *addr)
6262
case XKPRANGE_UC_SEG:
6363
offset = XKPRANGE_UC_SHADOW_OFFSET;
6464
break;
65+
case XKPRANGE_WC_SEG:
66+
offset = XKPRANGE_WC_SHADOW_OFFSET;
67+
break;
6568
case XKVRANGE_VC_SEG:
6669
offset = XKVRANGE_VC_SHADOW_OFFSET;
6770
break;
@@ -86,6 +89,8 @@ const void *kasan_shadow_to_mem(const void *shadow_addr)
8689

8790
if (addr >= XKVRANGE_VC_SHADOW_OFFSET)
8891
return (void *)(((addr - XKVRANGE_VC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKVRANGE_VC_START);
92+
else if (addr >= XKPRANGE_WC_SHADOW_OFFSET)
93+
return (void *)(((addr - XKPRANGE_WC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_WC_START);
8994
else if (addr >= XKPRANGE_UC_SHADOW_OFFSET)
9095
return (void *)(((addr - XKPRANGE_UC_SHADOW_OFFSET) << KASAN_SHADOW_SCALE_SHIFT) + XKPRANGE_UC_START);
9196
else if (addr >= XKPRANGE_CC_SHADOW_OFFSET)

0 commit comments

Comments
 (0)