Patch "arm64: assembler: make adr_l work in modules under KASLR" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
arm64: assembler: make adr_l work in modules under KASLR
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
arm64-assembler-make-adr_l-work-in-modules-under-kaslr.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Mon Jul 3 13:29:24 CEST 2017
From: Ard Biesheuvel <[email protected]>
Date: Wed, 11 Jan 2017 14:54:53 +0000
Subject: arm64: assembler: make adr_l work in modules under KASLR
From: Ard Biesheuvel <[email protected]>
[ Upstream commit 41c066f2c4d436c535616fe182331766c57838f0 ]
When CONFIG_RANDOMIZE_MODULE_REGION_FULL=y, the offset between loaded modules and the core kernel may exceed 4 GB, putting symbols exported by the core kernel out of the reach of the ordinary adrp/add instruction pairs used to generate relative symbol references. So make the adr_l macro emit a movz/movk sequence instead when executing in module context.
While at it, remove the pointless special case for the stack pointer.
--- arch/arm64/include/asm/assembler.h | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-)
arch/arm64/include/asm/assembler.h +27 -9
@@ -147,22 +147,25 @@ lr .req x30 // link register/* * Pseudo-ops for PC-relative adr/ldr/str <reg>, <symbol> where -* <symbol> is within the range +/- 4 GB of the PC. +* <symbol> is within the range +/- 4 GB of the PC when running +* in core kernel context. In module context, a movz/movk sequence +* is used, since modules may be loaded far away from the kernel +* when KASLR is in effect. */ /* * @dst: destination register (64 bit wide) * @sym: name of the symbol -* @tmp: optional scratch register to be used if <dst> == sp, which -* is not allowed in an adrp instruction */ - .macro adr_l, dst, sym, tmp= - .ifb \tmp + .macro adr_l, dst, sym +#ifndef MODULE adrp \dst, \sym add \dst, \dst, :lo12:\sym - .else - adrp \tmp, \sym - add \dst, \tmp, :lo12:\sym - .endif +#else + movz \dst, #:abs_g3:\sym + movk \dst, #:abs_g2_nc:\sym + movk \dst, #:abs_g1_nc:\sym + movk \dst, #:abs_g0_nc:\sym +#endif .endm/*
@@ -173,6 +176,7 @@ lr .req x30 // link register* the address */ .macro ldr_l, dst, sym, tmp= +#ifndef MODULE .ifb \tmp adrp \dst, \sym ldr \dst, [\dst, :lo12:\sym]
@@ -180,6 +184,15 @@ lr .req x30 // link register adrp \tmp, \sym ldr \dst, [\tmp, :lo12:\sym] .endif +#else + .ifb \tmp + adr_l \dst, \sym + ldr \dst, [\dst] + .else + adr_l \tmp, \sym + ldr \dst, [\tmp] + .endif +#endif .endm/*
@@ -189,8 +202,13 @@ lr .req x30 // link register* while <src> needs to be preserved. */ .macro str_l, src, sym, tmp +#ifndef MODULE adrp \tmp, \sym str \src, [\tmp, :lo12:\sym] +#else + adr_l \tmp, \sym + str \src, [\tmp] +#endif .endm/*
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/arm64-assembler-make-adr_l-work-in-modules-under-kaslr.patch