Merge branch 'for-next/kasan' into for-next/core
Optimise out-of-line KASAN checking when using software tagging. * for-next/kasan: kasan: arm64: support specialized outlined tag mismatch checks
This commit is contained in:
commit
2c9bd9d806
@ -23,4 +23,10 @@ long long __ashlti3(long long a, int b);
|
|||||||
long long __ashrti3(long long a, int b);
|
long long __ashrti3(long long a, int b);
|
||||||
long long __lshrti3(long long a, int b);
|
long long __lshrti3(long long a, int b);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function uses a custom calling convention and cannot be called from C so
|
||||||
|
* this prototype is not entirely accurate.
|
||||||
|
*/
|
||||||
|
void __hwasan_tag_mismatch(unsigned long addr, unsigned long access_info);
|
||||||
|
|
||||||
#endif /* __ASM_PROTOTYPES_H */
|
#endif /* __ASM_PROTOTYPES_H */
|
||||||
|
@ -1,7 +1,20 @@
|
|||||||
#ifdef CONFIG_ARM64_MODULE_PLTS
|
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
|
#ifdef CONFIG_ARM64_MODULE_PLTS
|
||||||
.plt 0 (NOLOAD) : { BYTE(0) }
|
.plt 0 (NOLOAD) : { BYTE(0) }
|
||||||
.init.plt 0 (NOLOAD) : { BYTE(0) }
|
.init.plt 0 (NOLOAD) : { BYTE(0) }
|
||||||
.text.ftrace_trampoline 0 (NOLOAD) : { BYTE(0) }
|
.text.ftrace_trampoline 0 (NOLOAD) : { BYTE(0) }
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_KASAN_SW_TAGS
|
||||||
|
/*
|
||||||
|
* Outlined checks go into comdat-deduplicated sections named .text.hot.
|
||||||
|
* Because they are in comdats they are not combined by the linker and
|
||||||
|
* we otherwise end up with multiple sections with the same .text.hot
|
||||||
|
* name in the .ko file. The kernel module loader warns if it sees
|
||||||
|
* multiple sections with the same name so we use this sections
|
||||||
|
* directive to force them into a single section and silence the
|
||||||
|
* warning.
|
||||||
|
*/
|
||||||
|
.text.hot : { *(.text.hot) }
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
@ -18,3 +18,5 @@ obj-$(CONFIG_CRC32) += crc32.o
|
|||||||
obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
|
obj-$(CONFIG_FUNCTION_ERROR_INJECTION) += error-inject.o
|
||||||
|
|
||||||
obj-$(CONFIG_ARM64_MTE) += mte.o
|
obj-$(CONFIG_ARM64_MTE) += mte.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_KASAN_SW_TAGS) += kasan_sw_tags.o
|
||||||
|
76
arch/arm64/lib/kasan_sw_tags.S
Normal file
76
arch/arm64/lib/kasan_sw_tags.S
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2020 Google LLC
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Report a tag mismatch detected by tag-based KASAN.
|
||||||
|
*
|
||||||
|
* A compiler-generated thunk calls this with a non-AAPCS calling
|
||||||
|
* convention. Upon entry to this function, registers are as follows:
|
||||||
|
*
|
||||||
|
* x0: fault address (see below for restore)
|
||||||
|
* x1: fault description (see below for restore)
|
||||||
|
* x2 to x15: callee-saved
|
||||||
|
* x16 to x17: safe to clobber
|
||||||
|
* x18 to x30: callee-saved
|
||||||
|
* sp: pre-decremented by 256 bytes (see below for restore)
|
||||||
|
*
|
||||||
|
* The caller has decremented the SP by 256 bytes, and created a
|
||||||
|
* structure on the stack as follows:
|
||||||
|
*
|
||||||
|
* sp + 0..15: x0 and x1 to be restored
|
||||||
|
* sp + 16..231: free for use
|
||||||
|
* sp + 232..247: x29 and x30 (same as in GPRs)
|
||||||
|
* sp + 248..255: free for use
|
||||||
|
*
|
||||||
|
* Note that this is not a struct pt_regs.
|
||||||
|
*
|
||||||
|
* To call a regular AAPCS function we must save x2 to x15 (which we can
|
||||||
|
* store in the gaps), and create a frame record (for which we can use
|
||||||
|
* x29 and x30 spilled by the caller as those match the GPRs).
|
||||||
|
*
|
||||||
|
* The caller expects x0 and x1 to be restored from the structure, and
|
||||||
|
* for the structure to be removed from the stack (i.e. the SP must be
|
||||||
|
* incremented by 256 prior to return).
|
||||||
|
*/
|
||||||
|
SYM_CODE_START(__hwasan_tag_mismatch)
|
||||||
|
#ifdef BTI_C
|
||||||
|
BTI_C
|
||||||
|
#endif
|
||||||
|
add x29, sp, #232
|
||||||
|
stp x2, x3, [sp, #8 * 2]
|
||||||
|
stp x4, x5, [sp, #8 * 4]
|
||||||
|
stp x6, x7, [sp, #8 * 6]
|
||||||
|
stp x8, x9, [sp, #8 * 8]
|
||||||
|
stp x10, x11, [sp, #8 * 10]
|
||||||
|
stp x12, x13, [sp, #8 * 12]
|
||||||
|
stp x14, x15, [sp, #8 * 14]
|
||||||
|
#ifndef CONFIG_SHADOW_CALL_STACK
|
||||||
|
str x18, [sp, #8 * 18]
|
||||||
|
#endif
|
||||||
|
|
||||||
|
mov x2, x30
|
||||||
|
bl kasan_tag_mismatch
|
||||||
|
|
||||||
|
ldp x0, x1, [sp]
|
||||||
|
ldp x2, x3, [sp, #8 * 2]
|
||||||
|
ldp x4, x5, [sp, #8 * 4]
|
||||||
|
ldp x6, x7, [sp, #8 * 6]
|
||||||
|
ldp x8, x9, [sp, #8 * 8]
|
||||||
|
ldp x10, x11, [sp, #8 * 10]
|
||||||
|
ldp x12, x13, [sp, #8 * 12]
|
||||||
|
ldp x14, x15, [sp, #8 * 14]
|
||||||
|
#ifndef CONFIG_SHADOW_CALL_STACK
|
||||||
|
ldr x18, [sp, #8 * 18]
|
||||||
|
#endif
|
||||||
|
ldp x29, x30, [sp, #8 * 29]
|
||||||
|
|
||||||
|
/* remove the structure from the stack */
|
||||||
|
add sp, sp, #256
|
||||||
|
ret
|
||||||
|
SYM_CODE_END(__hwasan_tag_mismatch)
|
||||||
|
EXPORT_SYMBOL(__hwasan_tag_mismatch)
|
@ -207,3 +207,10 @@ struct kasan_track *kasan_get_free_track(struct kmem_cache *cache,
|
|||||||
|
|
||||||
return &alloc_meta->free_track[i];
|
return &alloc_meta->free_track[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kasan_tag_mismatch(unsigned long addr, unsigned long access_info,
|
||||||
|
unsigned long ret_ip)
|
||||||
|
{
|
||||||
|
kasan_report(addr, 1 << (access_info & 0xf), access_info & 0x10,
|
||||||
|
ret_ip);
|
||||||
|
}
|
||||||
|
@ -50,6 +50,7 @@ endif
|
|||||||
CFLAGS_KASAN := -fsanitize=kernel-hwaddress \
|
CFLAGS_KASAN := -fsanitize=kernel-hwaddress \
|
||||||
$(call cc-param,hwasan-instrument-stack=$(stack_enable)) \
|
$(call cc-param,hwasan-instrument-stack=$(stack_enable)) \
|
||||||
$(call cc-param,hwasan-use-short-granules=0) \
|
$(call cc-param,hwasan-use-short-granules=0) \
|
||||||
|
$(call cc-param,hwasan-inline-all-checks=0) \
|
||||||
$(instrumentation_flags)
|
$(instrumentation_flags)
|
||||||
|
|
||||||
endif # CONFIG_KASAN_SW_TAGS
|
endif # CONFIG_KASAN_SW_TAGS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user