From: Ard Biesheuvel <ardb@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org,
Ard Biesheuvel <ardb@kernel.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Ryan Roberts <ryan.roberts@arm.com>,
Anshuman Khandual <anshuman.khandual@arm.com>,
Kees Cook <keescook@chromium.org>
Subject: [PATCH v3 28/60] arm64: head: move dynamic shadow call stack patching into early C runtime
Date: Tue, 7 Mar 2023 15:04:50 +0100 [thread overview]
Message-ID: <20230307140522.2311461-29-ardb@kernel.org> (raw)
In-Reply-To: <20230307140522.2311461-1-ardb@kernel.org>
Once we update the early kernel mapping code to only map the kernel once
with the right permissions, we can no longer perform code patching via
this mapping.
So move this code to an earlier stage of the boot, right after applying
the relocations.
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
arch/arm64/include/asm/scs.h | 2 +-
arch/arm64/kernel/Makefile | 2 --
arch/arm64/kernel/head.S | 8 +++---
arch/arm64/kernel/module.c | 2 +-
arch/arm64/kernel/pi/Makefile | 10 +++++---
arch/arm64/kernel/{ => pi}/patch-scs.c | 26 ++++++++++----------
6 files changed, 26 insertions(+), 24 deletions(-)
diff --git a/arch/arm64/include/asm/scs.h b/arch/arm64/include/asm/scs.h
index 13df982a080805e6..bcf8ad574807b82c 100644
--- a/arch/arm64/include/asm/scs.h
+++ b/arch/arm64/include/asm/scs.h
@@ -72,7 +72,7 @@ static inline void dynamic_scs_init(void)
static inline void dynamic_scs_init(void) {}
#endif
-int scs_patch(const u8 eh_frame[], int size);
+int __pi_scs_patch(const u8 eh_frame[], int size);
#endif /* __ASSEMBLY __ */
diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
index 4f1fcaebafcfe077..bae6194df6a50479 100644
--- a/arch/arm64/kernel/Makefile
+++ b/arch/arm64/kernel/Makefile
@@ -72,8 +72,6 @@ obj-$(CONFIG_ARM64_PTR_AUTH) += pointer_auth.o
obj-$(CONFIG_ARM64_MTE) += mte.o
obj-y += vdso-wrap.o
obj-$(CONFIG_COMPAT_VDSO) += vdso32-wrap.o
-obj-$(CONFIG_UNWIND_PATCH_PAC_INTO_SCS) += patch-scs.o
-CFLAGS_patch-scs.o += -mbranch-protection=none
# Force dependency (vdso*-wrap.S includes vdso.so through incbin)
$(obj)/vdso-wrap.o: $(obj)/vdso/vdso.so
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index 0a345898a12939af..70ad180eed364906 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -490,9 +490,6 @@ SYM_FUNC_START_LOCAL(__primary_switched)
#endif
#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
bl kasan_early_init
-#endif
-#ifdef CONFIG_UNWIND_PATCH_PAC_INTO_SCS
- bl scs_patch_vmlinux
#endif
mov x0, x20
bl finalise_el2 // Prefer VHE if possible
@@ -792,6 +789,11 @@ SYM_FUNC_START_LOCAL(__primary_switch)
#ifdef CONFIG_RELOCATABLE
mov x0, x23
bl __pi_relocate_kernel
+#endif
+#ifdef CONFIG_UNWIND_PATCH_PAC_INTO_SCS
+ ldr x0, =__eh_frame_start
+ ldr x1, =__eh_frame_end
+ bl __pi_scs_patch_vmlinux
#endif
ldr x8, =__primary_switched
adrp x0, KERNEL_START // __pa(KERNEL_START)
diff --git a/arch/arm64/kernel/module.c b/arch/arm64/kernel/module.c
index 5af4975caeb58ff7..9df01fce6ed528a0 100644
--- a/arch/arm64/kernel/module.c
+++ b/arch/arm64/kernel/module.c
@@ -516,7 +516,7 @@ int module_finalize(const Elf_Ehdr *hdr,
if (scs_is_dynamic()) {
s = find_section(hdr, sechdrs, ".init.eh_frame");
if (s)
- scs_patch((void *)s->sh_addr, s->sh_size);
+ __pi_scs_patch((void *)s->sh_addr, s->sh_size);
}
return module_init_ftrace_plt(hdr, sechdrs, me);
diff --git a/arch/arm64/kernel/pi/Makefile b/arch/arm64/kernel/pi/Makefile
index 7f6dfce893c3b88f..a8b302245f15326a 100644
--- a/arch/arm64/kernel/pi/Makefile
+++ b/arch/arm64/kernel/pi/Makefile
@@ -38,7 +38,9 @@ $(obj)/lib-%.pi.o: OBJCOPYFLAGS += --prefix-alloc-sections=.init
$(obj)/lib-%.o: $(srctree)/lib/%.c FORCE
$(call if_changed_rule,cc_o_c)
-obj-y := idreg-override.pi.o lib-fdt.pi.o lib-fdt_ro.pi.o
-obj-$(CONFIG_RELOCATABLE) += relocate.pi.o
-obj-$(CONFIG_RANDOMIZE_BASE) += kaslr_early.pi.o
-extra-y := $(patsubst %.pi.o,%.o,$(obj-y))
+obj-y := idreg-override.pi.o \
+ lib-fdt.pi.o lib-fdt_ro.pi.o
+obj-$(CONFIG_RELOCATABLE) += relocate.pi.o
+obj-$(CONFIG_RANDOMIZE_BASE) += kaslr_early.pi.o
+obj-$(CONFIG_UNWIND_PATCH_PAC_INTO_SCS) += patch-scs.pi.o
+extra-y := $(patsubst %.pi.o,%.o,$(obj-y))
diff --git a/arch/arm64/kernel/patch-scs.c b/arch/arm64/kernel/pi/patch-scs.c
similarity index 91%
rename from arch/arm64/kernel/patch-scs.c
rename to arch/arm64/kernel/pi/patch-scs.c
index a1fe4b4ff5917670..c65ef40d1e6b6b30 100644
--- a/arch/arm64/kernel/patch-scs.c
+++ b/arch/arm64/kernel/pi/patch-scs.c
@@ -4,14 +4,11 @@
* Author: Ard Biesheuvel <ardb@google.com>
*/
-#include <linux/bug.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/linkage.h>
-#include <linux/printk.h>
#include <linux/types.h>
-#include <asm/cacheflush.h>
#include <asm/scs.h>
//
@@ -81,7 +78,11 @@ static void __always_inline scs_patch_loc(u64 loc)
*/
return;
}
- dcache_clean_pou(loc, loc + sizeof(u32));
+ if (IS_ENABLED(CONFIG_ARM64_WORKAROUND_CLEAN_CACHE))
+ asm("dc civac, %0" :: "r"(loc));
+ else
+ asm(ALTERNATIVE("dc cvau, %0", "nop", ARM64_HAS_CACHE_IDC)
+ :: "r"(loc));
}
/*
@@ -128,10 +129,10 @@ struct eh_frame {
};
};
-static int noinstr scs_handle_fde_frame(const struct eh_frame *frame,
- bool fde_has_augmentation_data,
- int code_alignment_factor,
- bool dry_run)
+static int scs_handle_fde_frame(const struct eh_frame *frame,
+ bool fde_has_augmentation_data,
+ int code_alignment_factor,
+ bool dry_run)
{
int size = frame->size - offsetof(struct eh_frame, opcodes) + 4;
u64 loc = (u64)offset_to_ptr(&frame->initial_loc);
@@ -198,14 +199,13 @@ static int noinstr scs_handle_fde_frame(const struct eh_frame *frame,
break;
default:
- pr_err("unhandled opcode: %02x in FDE frame %lx\n", opcode[-1], (uintptr_t)frame);
return -ENOEXEC;
}
}
return 0;
}
-int noinstr scs_patch(const u8 eh_frame[], int size)
+int scs_patch(const u8 eh_frame[], int size)
{
const u8 *p = eh_frame;
@@ -251,12 +251,12 @@ int noinstr scs_patch(const u8 eh_frame[], int size)
return 0;
}
-asmlinkage void __init scs_patch_vmlinux(void)
+asmlinkage void __init scs_patch_vmlinux(const u8 start[], const u8 end[])
{
if (!should_patch_pac_into_scs())
return;
- WARN_ON(scs_patch(__eh_frame_start, __eh_frame_end - __eh_frame_start));
- icache_inval_all_pou();
+ scs_patch(start, end - start);
+ asm("ic ialluis");
isb();
}
--
2.39.2
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-03-07 14:35 UTC|newest]
Thread overview: 92+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-07 14:04 [PATCH v3 00/60] arm64: Add support for LPA2 at stage1 and WXN Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 01/60] arm64: kernel: Disable latent_entropy GCC plugin in early C runtime Ard Biesheuvel
2023-04-28 10:37 ` Mark Rutland
2023-04-28 10:54 ` Ard Biesheuvel
2023-04-28 11:48 ` Mark Rutland
2023-03-07 14:04 ` [PATCH v3 02/60] arm64: mm: Take potential load offset into account when KASLR is off Ard Biesheuvel
2023-04-28 10:41 ` Mark Rutland
2023-03-07 14:04 ` [PATCH v3 03/60] arm64: mm: get rid of kimage_vaddr global variable Ard Biesheuvel
2023-04-28 10:42 ` Mark Rutland
2023-03-07 14:04 ` [PATCH v3 04/60] arm64: mm: Move PCI I/O emulation region above the vmemmap region Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 05/60] arm64: mm: Move fixmap region above " Ard Biesheuvel
2023-04-28 11:00 ` Mark Rutland
2023-03-07 14:04 ` [PATCH v3 06/60] arm64: ptdump: Allow VMALLOC_END to be defined at boot Ard Biesheuvel
2023-03-07 16:58 ` Ryan Roberts
2023-03-07 17:01 ` Ard Biesheuvel
2023-04-28 11:25 ` Mark Rutland
2023-03-07 14:04 ` [PATCH v3 07/60] arm64: ptdump: Discover start of vmemmap region at runtime Ard Biesheuvel
2023-03-07 16:36 ` Ryan Roberts
2023-04-28 11:27 ` Mark Rutland
2023-03-07 14:04 ` [PATCH v3 08/60] arm64: vmemmap: Avoid base2 order of struct page size to dimension region Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 09/60] arm64: mm: Reclaim unused vmemmap region for vmalloc use Ard Biesheuvel
2023-03-07 16:42 ` Ryan Roberts
2023-03-07 16:58 ` Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 10/60] arm64: kaslr: Adjust randomization range dynamically Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 11/60] arm64: kaslr: drop special case for ThunderX in kaslr_requires_kpti() Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 12/60] arm64: Turn kaslr_feature_override into a generic SW feature override Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 13/60] arm64: kvm: honour 'nokaslr' command line option for the HYP VA space Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 14/60] arm64: kernel: Manage absolute relocations in code built under pi/ Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 15/60] arm64: kernel: Don't rely on objcopy to make code under pi/ __init Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 16/60] arm64: head: move relocation handling to C code Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 17/60] arm64: idreg-override: Omit non-NULL checks for override pointer Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 18/60] arm64: idreg-override: Prepare for place relative reloc patching Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 19/60] arm64: idreg-override: Avoid parameq() and parameqn() Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 20/60] arm64: idreg-override: avoid strlen() to check for empty strings Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 21/60] arm64: idreg-override: Avoid sprintf() for simple string concatenation Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 22/60] arm64: idreg-override: Avoid kstrtou64() to parse a single hex digit Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 23/60] arm64: idreg-override: Move to early mini C runtime Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 24/60] arm64: kernel: Remove early fdt remap code Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 25/60] arm64: head: Clear BSS and the kernel page tables in one go Ard Biesheuvel
2023-04-17 14:00 ` Ryan Roberts
2023-04-17 14:02 ` Ard Biesheuvel
2023-04-17 14:09 ` Ryan Roberts
2023-03-07 14:04 ` [PATCH v3 26/60] arm64: Move feature overrides into the BSS section Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 27/60] arm64: head: Run feature override detection before mapping the kernel Ard Biesheuvel
2023-03-07 14:04 ` Ard Biesheuvel [this message]
2023-03-07 14:04 ` [PATCH v3 29/60] arm64: kaslr: Use feature override instead of parsing the cmdline again Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 30/60] arm64: idreg-override: Create a pseudo feature for rodata=off Ard Biesheuvel
2023-04-17 14:28 ` Ryan Roberts
2023-04-17 14:30 ` Ard Biesheuvel
2023-04-17 14:33 ` Ryan Roberts
2023-03-07 14:04 ` [PATCH v3 31/60] arm64: Add helpers to probe local CPU for PAC/BTI/E0PD support Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 32/60] arm64: head: allocate more pages for the kernel mapping Ard Biesheuvel
2023-04-17 15:48 ` Ryan Roberts
2023-04-17 16:11 ` Ard Biesheuvel
2023-04-17 16:18 ` Ryan Roberts
2023-03-07 14:04 ` [PATCH v3 33/60] arm64: head: move memstart_offset_seed handling to C code Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 34/60] arm64: head: Move early kernel mapping routines into " Ard Biesheuvel
2023-04-18 9:31 ` Ryan Roberts
2023-04-18 10:06 ` Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 35/60] arm64: mm: Use 48-bit virtual addressing for the permanent ID map Ard Biesheuvel
2023-04-18 10:22 ` Ryan Roberts
2023-03-07 14:04 ` [PATCH v3 36/60] arm64: pgtable: Decouple PGDIR size macros from PGD/PUD/PMD levels Ard Biesheuvel
2023-03-07 14:04 ` [PATCH v3 37/60] arm64: kernel: Create initial ID map from C code Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 38/60] arm64: mm: avoid fixmap for early swapper_pg_dir updates Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 39/60] arm64: mm: omit redundant remap of kernel image Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 40/60] arm64: Revert "mm: provide idmap pointer to cpu_replace_ttbr1()" Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 41/60] arm64/mm: Add FEAT_LPA2 specific TCR_EL1.DS field Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 42/60] arm64/mm: Add FEAT_LPA2 specific ID_AA64MMFR0.TGRAN[2] Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 43/60] arm64: mm: Handle LVA support as a CPU feature Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 44/60] arm64: mm: Add feature override support for LVA Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 45/60] arm64: mm: Wire up TCR.DS bit to PTE shareability fields Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 46/60] arm64: mm: Add LPA2 support to phys<->pte conversion routines Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 47/60] arm64: mm: Add definitions to support 5 levels of paging Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 48/60] arm64: mm: add LPA2 and 5 level paging support to G-to-nG conversion Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 49/60] arm64: Enable LPA2 at boot if supported by the system Ard Biesheuvel
2023-04-18 13:50 ` Ryan Roberts
2023-03-07 14:05 ` [PATCH v3 50/60] arm64: mm: Add 5 level paging support to fixmap and swapper handling Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 51/60] arm64: kasan: Reduce minimum shadow alignment and enable 5 level paging Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 52/60] arm64: mm: Add support for folding PUDs at runtime Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 53/60] arm64: ptdump: Disregard unaddressable VA space Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 54/60] arm64: ptdump: Deal with translation levels folded at runtime Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 55/60] arm64: kvm: avoid CONFIG_PGTABLE_LEVELS for runtime levels Ard Biesheuvel
2023-04-18 14:29 ` Ryan Roberts
2023-03-07 14:05 ` [PATCH v3 56/60] arm64: kvm: Limit HYP VA and host S2 range to 48 bits when LPA2 is in effect Ard Biesheuvel
2023-04-18 14:33 ` Ryan Roberts
2023-03-07 14:05 ` [PATCH v3 57/60] arm64: Enable 52-bit virtual addressing for 4k and 16k granule configs Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 58/60] arm64: defconfig: Enable LPA2 support Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 59/60] mm: add arch hook to validate mmap() prot flags Ard Biesheuvel
2023-03-07 14:05 ` [PATCH v3 60/60] arm64: mm: add support for WXN memory translation attribute Ard Biesheuvel
2023-03-07 16:28 ` [PATCH v3 00/60] arm64: Add support for LPA2 at stage1 and WXN Ryan Roberts
2023-03-08 8:31 ` Ard Biesheuvel
2023-04-18 15:01 ` Ryan Roberts
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230307140522.2311461-29-ardb@kernel.org \
--to=ardb@kernel.org \
--cc=anshuman.khandual@arm.com \
--cc=catalin.marinas@arm.com \
--cc=keescook@chromium.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).