Re: git: bed65d85c631 - main - linux64: Fix the build on arm64 with bti checking

From: Cy Schubert <Cy.Schubert_at_cschubert.com>
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