Re: git: bed65d85c631 - main - linux64: Fix the build on arm64 with bti checking
Date: Wed, 05 Jun 2024 15:37:14 UTC
In message <202406050929.4559TFj0027386@gitrepo.freebsd.org>, Andrew Turner
wri
tes:
> The branch main has been updated by andrew:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=bed65d85c631c3a8e60a81a15a5a745c
> 8ef92fbe
>
> commit bed65d85c631c3a8e60a81a15a5a745c8ef92fbe
> Author: Andrew Turner <andrew@FreeBSD.org>
> AuthorDate: 2024-06-04 12:47:52 +0000
> Commit: Andrew Turner <andrew@FreeBSD.org>
> CommitDate: 2024-06-05 09:23:40 +0000
>
> linux64: Fix the build on arm64 with bti checking
>
> When we enable checking for BTI on arm64 we need to include an ELF
> note in all object files linked into a module.
>
> As using objcopy from a binary to an ELF object file doesn't add the
> note switch to using .incbin from an assembly file. This allows us to
> add the needed note without affecting the included object.
>
> Reviewed by: imp, kib, emaste
> Sponsored by: Arm Ltd
> Differential Revision: https://reviews.freebsd.org/D45468
> ---
> sys/arm64/linux/linux_support.S | 4 ++++
> sys/compat/linux/linux_vdso_inc.S | 39 +++++++++++++++++++++++++++++++++++++
> ++
> sys/modules/linux64/Makefile | 17 +++--------------
> 3 files changed, 46 insertions(+), 14 deletions(-)
>
> diff --git a/sys/arm64/linux/linux_support.S b/sys/arm64/linux/linux_support.
> S
> index 151ede7e1c19..3b16583e9d54 100644
> --- a/sys/arm64/linux/linux_support.S
> +++ b/sys/arm64/linux/linux_support.S
> @@ -26,6 +26,8 @@
> * SUCH DAMAGE.
> */
>
> +#include <sys/elf_common.h>
> +
> #include <machine/asm.h>
> #include <machine/param.h>
> #include <machine/vmparam.h>
> @@ -172,3 +174,5 @@ ENTRY(futex_xorl)
> str w4, [x2]
> ret
> END(futex_xorl)
> +
> +GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)
> diff --git a/sys/compat/linux/linux_vdso_inc.S b/sys/compat/linux/linux_vdso_
> inc.S
> new file mode 100644
> index 000000000000..af10907f0b60
> --- /dev/null
> +++ b/sys/compat/linux/linux_vdso_inc.S
> @@ -0,0 +1,39 @@
> +/*-
> + * SPDX-License-Identifier: BSD-2-Clause
> + *
> + * Copyright (C) 2020 Arm Ltd
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOS
> E
> + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIA
> L
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
> T
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> + .section .rodata
> + .globl _binary_linux_vdso_so_o_start
> +_binary_linux_vdso_so_o_start:
> + .incbin "linux_vdso.so.o"
> + .globl _binary_linux_vdso_so_o_end
> +_binary_linux_vdso_so_o_end:
> +
> +#if defined(__aarch64__)
> +#include <sys/elf_common.h>
> +#include <machine/asm.h>
> +GNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)
> +#endif
> diff --git a/sys/modules/linux64/Makefile b/sys/modules/linux64/Makefile
> index 62e3b464d39f..beed5ec59c4b 100644
> --- a/sys/modules/linux64/Makefile
> +++ b/sys/modules/linux64/Makefile
> @@ -35,7 +35,8 @@ SRCS= linux_dummy_machdep.c \
> bus_if.h \
> device_if.h \
> vnode_if.h \
> - linux_support.S
> + linux_support.S \
> + linux_vdso_inc.S
> .if ${MACHINE_CPUARCH} == "amd64"
> SRCS+= linux_dummy_x86.c
> .endif
> @@ -47,7 +48,6 @@ SRCS+= opt_kstack_pages.h opt_nfs.h opt_hwpmc_hooks.h
> CLEANFILES= linux_assym.h linux_genassym.o linux_locore.o \
> genassym.o linux_vdso_gtod.o linux_vdso.so.o
>
> -OBJS= linux_vdso.so
>
> linux_assym.h: linux_genassym.o
> sh ${SYSDIR}/kern/genassym.sh linux_genassym.o > ${.TARGET}
> @@ -83,18 +83,7 @@ linux_vdso.so.o: linux_locore.o linux_vdso_gtod.o
> -T${SRCTOP}/sys/${MACHINE}/linux/linux_vdso.lds.s \
> -o ${.TARGET} ${.ALLSRC:M*.o}
>
> -.if ${MACHINE_CPUARCH} == "aarch64"
> -OBJCOPY_TARGET=--output-target elf64-littleaarch64 --binary-architecture aar
> ch64
> -.elif ${MACHINE_CPUARCH} == "amd64"
> -OBJCOPY_TARGET=--output-target elf64-x86-64 --binary-architecture i386:x86-6
> 4
> -.else
> -.error ${MACHINE_CPUARCH} not yet supported by linux64
> -.endif
> -
> -linux_vdso.so: linux_vdso.so.o
> - ${OBJCOPY} --input-target binary ${OBJCOPY_TARGET} \
> - linux_vdso.so.o ${.TARGET}
> - ${STRIPBIN} -N _binary_linux_vdso_so_o_size ${.TARGET}
> +linux_vdso_inc.o: linux_vdso.so.o
>
> linux_support.o: linux_support.S assym.inc linux_assym.h
> ${CC} -c -x assembler-with-cpp -DLOCORE ${CFLAGS} \
>
kldload linux64.ko results in the following panic on amd64. Reverting this
revision addresses the regression.
Fatal trap 12: page fault while in kernel mode
cpuid = 2; apic id = 02
fault virtual address = 0xffffffff824cd1df
fault code = supervisor write data, protection violation
instruction pointer = 0x20:0xffffffff824c49d9
stack pointer = 0x28:0xfffffe008ecc8a10
frame pointer = 0x28:0xfffffe008ecc8a50
code segment = base 0x0, limit 0xfffff, type 0x1b
= DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags = interrupt enabled, resume, IOPL = 0
current process = 4069 (kldload)
rdi: ffffffff824cd1d8 rsi: ffffffff824ce298 rdx: 000000000000000b
rcx: aaaaaaaaaaaaaaab r8: 00000000000000c0 r9: fffffe00b3123bc0
rax: 0000000000000058 rbx: fffff801701a6c00 rbp: fffffe008ecc8a50
r10: fffff80006015800 r11: 0000000000000423 r12: fffff8002075c000
r13: ffffffff824cd4b0 r14: fffff8002075c000 r15: fffff800031d6a00
trap number = 12
panic: page fault
cpuid = 2
time = 1717600139
KDB: stack backtrace:
db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame
0xfffffe008ecc8700
vpanic() at vpanic+0x13f/frame 0xfffffe008ecc8830
panic() at panic+0x43/frame 0xfffffe008ecc8890
trap_fatal() at trap_fatal+0x40b/frame 0xfffffe008ecc88f0
trap_pfault() at trap_pfault+0x46/frame 0xfffffe008ecc8940
calltrap() at calltrap+0x8/frame 0xfffffe008ecc8940
--- trap 0xc, rip = 0xffffffff824c49d9, rsp = 0xfffffe008ecc8a10, rbp =
0xfffffe008ecc8a50 ---
elf64_linux_vdso_fixup() at elf64_linux_vdso_fixup+0x99/frame
0xfffffe008ecc8a50
linux_vdso_install() at linux_vdso_install+0x53/frame 0xfffffe008ecc8a90
linker_load_module() at linker_load_module+0xc29/frame 0xfffffe008ecc8d80
kern_kldload() at kern_kldload+0x164/frame 0xfffffe008ecc8dd0
sys_kldload() at sys_kldload+0x5c/frame 0xfffffe008ecc8e00
amd64_syscall() at amd64_syscall+0x115/frame 0xfffffe008ecc8f30
fast_syscall_common() at fast_syscall_common+0xf8/frame 0xfffffe008ecc8f30
--- syscall (304, FreeBSD ELF64, kldload), rip = 0x2959195a57da, rsp =
0x295917b80438, rbp = 0x295917b809b0 ---
Uptime: 7m24s
Dumping 608 out of 8160 MB:..3%..11%..22%..32%..43%..53%..61%..71%..82%..92%
Dump complete
Automatic reboot in 15 seconds - press a key on the console to abort
acpi0: reset failed - timeout
Rebooting...
cpu_reset: Restarting BSP
cpu_reset_proxy: Stopped CPU 2
--
Cheers,
Cy Schubert <Cy.Schubert@cschubert.com>
FreeBSD UNIX: <cy@FreeBSD.org> Web: https://FreeBSD.org
NTP: <cy@nwtime.org> Web: https://nwtime.org
e^(i*pi)+1=0