ARM fixes for 7.1
Three fixes: - Avoid KASAN instrumentation of half-word IO - Use a byte load for KASAN shadow stack - Fix kexec and hibernation with PAN -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEuNNh8scc2k/wOAE+9OeQG+StrGQFAmousPYACgkQ9OeQG+St rGREqQ/+OdeNlX8q7h7Hv5kOXsrjsD/UMjsunzP/RKeZUYskF0zxJyK+qc6BjW1g +5zxSikZ+cZZT0rrGma5gOBpNG0FtJSF02CyCSjlKyb6nu09wc1aMZ/DiAMQkZ/u wunswFeR3pO97YT6QxJMcv2MVabH4FvWg7aym5KmJycWwRYzDwd1id0b/aEDyP6n bEnspk1RnAgp12mC4IjK+dKlsd9wgbrCNBXCyGw35cqEuqaVG021Jkprwxk3jdK/ sunFPQVZebewiQFQOTQP6jNudYOfV6Uf+7wu67C7inLdffe7r+OW+Z2aFuHXJmXo lbpQvmgzHMzpFq5nNQaMFO3cwe6HwPwwDJbXf6eDWvbKPaaU6AQf+Ywcbj/P6Aj6 7+ellXuSkErTKZSVrJ/wdLB2I1CGHkWbMX6VSXizuZJ5H07E40urkEqIALyw3Q4z +8RxnOrfsrlVeE1m+rm5FpOSxokD8kbSn66fP2EwIG1lRbbmFw402nj51a7Vuc8e RcSqPt3Y8L9vHCh9c2hxc/IzYTyE21wKeWWP9qPsvR79xyJLLgPbAwvk6sxGLDEY Fcourk96GROJ1RQxNXLzjgexrVCVBgZgW+qeOwVcxzejWZbkx7i/9UFCokTHO0bg 4UrMJ6+XWH49PwDTlxjHBn+HFgAwLlZyFNIbee6fQNqxvYgxo68= =aiHy -----END PGP SIGNATURE----- Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rmk/linux Pull ARM fixes from Russell King: - Avoid KASAN instrumentation of half-word IO - Use a byte load for KASAN shadow stack - Fix kexec and hibernation with PAN * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rmk/linux: ARM: 9476/1: mm: fix kexec and hibernation with CONFIG_CPU_TTBR0_PAN ARM: 9475/1: entry: use byte load for KASAN VMAP stack shadow ARM: 9474/1: io: avoid KASAN instrumentation of raw halfword I/O
This commit is contained in:
commit
4242809533
4 changed files with 36 additions and 3 deletions
|
|
@ -56,8 +56,19 @@ void __raw_readsl(const volatile void __iomem *addr, void *data, int longlen);
|
|||
* the bus. Rather than special-case the machine, just let the compiler
|
||||
* generate the access for CPUs prior to ARMv6.
|
||||
*/
|
||||
#define __raw_readw(a) (__chk_io_ptr(a), *(volatile unsigned short __force *)(a))
|
||||
#define __raw_writew(v,a) ((void)(__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v)))
|
||||
#define __raw_writew __raw_writew
|
||||
static __no_kasan_or_inline void __raw_writew(u16 val, volatile void __iomem *addr)
|
||||
{
|
||||
__chk_io_ptr(addr);
|
||||
*(volatile unsigned short __force *)addr = val;
|
||||
}
|
||||
|
||||
#define __raw_readw __raw_readw
|
||||
static __no_kasan_or_inline u16 __raw_readw(const volatile void __iomem *addr)
|
||||
{
|
||||
__chk_io_ptr(addr);
|
||||
return *(const volatile unsigned short __force *)addr;
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* When running under a hypervisor, we want to avoid I/O accesses with
|
||||
|
|
|
|||
|
|
@ -567,7 +567,7 @@ ENTRY(__switch_to)
|
|||
@ are using KASAN
|
||||
mov_l r2, KASAN_SHADOW_OFFSET
|
||||
add r2, r2, ip, lsr #KASAN_SHADOW_SCALE_SHIFT
|
||||
ldr r2, [r2]
|
||||
ldrb r2, [r2]
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include <asm/suspend.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include "reboot.h"
|
||||
|
||||
int pfn_is_nosave(unsigned long pfn)
|
||||
|
|
@ -82,6 +83,15 @@ static void notrace arch_restore_image(void *unused)
|
|||
{
|
||||
struct pbe *pbe;
|
||||
|
||||
/*
|
||||
* With CONFIG_CPU_TTBR0_PAN enabled, TTBCR.EPD0 is set to block
|
||||
* TTBR0 page-table walks. The identity mapping used here lives at
|
||||
* low (user-space) virtual addresses and is only reachable via
|
||||
* TTBR0, so re-enable those walks before switching page tables.
|
||||
* On non-PAN kernels this is a no-op.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_CPU_TTBR0_PAN))
|
||||
uaccess_save_and_enable();
|
||||
cpu_switch_mm(idmap_pgd, &init_mm);
|
||||
for (pbe = restore_pblist; pbe; pbe = pbe->next)
|
||||
copy_page(pbe->orig_address, pbe->address);
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <asm/pgalloc.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/system_info.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
/*
|
||||
* Note: accesses outside of the kernel image and the identity map area
|
||||
|
|
@ -133,6 +134,17 @@ early_initcall(init_static_idmap);
|
|||
*/
|
||||
void setup_mm_for_reboot(void)
|
||||
{
|
||||
/*
|
||||
* With CONFIG_CPU_TTBR0_PAN enabled, TTBCR.EPD0 is set whenever
|
||||
* user-space access is disabled in order to block TTBR0 page-table
|
||||
* walks. The identity mapping lives at low (user-space) virtual
|
||||
* addresses and can only be reached via TTBR0, so we must re-enable
|
||||
* those walks before switching page tables. On non-PAN kernels this
|
||||
* is a no-op.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_CPU_TTBR0_PAN))
|
||||
uaccess_save_and_enable();
|
||||
|
||||
/* Switch to the identity mapping. */
|
||||
cpu_switch_mm(idmap_pgd, &init_mm);
|
||||
local_flush_bp_all();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue