From nobody Fri Jul 10 15:43:45 2026 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gxbhy1XH2z6lK0k for ; Fri, 10 Jul 2026 15:43:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gxbhy0X5Nz488f for ; Fri, 10 Jul 2026 15:43:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783698226; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=WqoB8EYYiwqCNd0UKcjerJLx4cGkzx2p9Wznazz6Tb4=; b=JUa2ssaNOaLqK/QqganeBPK4esiO9w86rynZNgfzI16SA2bPhlPDeHbAFhrenB7eWcGFeM dJglrJwvRKxcClsru/8BKDQgzvWUCPozm6jReLl9sUQzxbLUlYxDhqk1cbI3klad7oGSQY vXt7icSVGwzvNzuUaHEyawXWRLi+NldW8z/PnGXmtQTyl3G955IQGdV4Dkt7wfMe8ohyre PwXBSNG4QTGQp6YIwrQI13stFqN04+MrhGMPJO9XFSq0IeOq0gfe9i80DgZdIAVD86I4yD tCP0cqyJMS5X/VnTe/NWQKDPG02c4p9Lbi/n8DHhOqRiaaJa7U07MCOI3iMAlQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1783698226; a=rsa-sha256; cv=none; b=oXUfzKX4PM2qAqJO5hxbQOZUlUQGeuzHF8bATv6RhvnjCkhGMipI2HEEiuqtiPBXQYxGcf 9VlrLI8Jb3wbBPwhU4BCWmF2AQGHy4lDAcLgUCLOq+N5wkDQrNNoLiH9O1zhF7E03PDzYS SUpb3PKR/BqLUj7ImaQpbFBHNudcndFg8M2EnAdU23l6zDEYCQkei+Hw5wt5R1NwrL/ztq jjAlRyUyqhw+nT1GcAwcB1xAaHVcWezi70wziXe5JKmH2lwZ7XiarPuNKPg13hZKkCy/OI hnEHDjwP4aPRtLHha298a+X85agXdrK8auYMkv3LRt3CVPDRE1mGC9Fx9D4UiQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783698226; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=WqoB8EYYiwqCNd0UKcjerJLx4cGkzx2p9Wznazz6Tb4=; b=Jg9O4U3v6ibP+02JYbmmbpXqlEMiB0G5JfG/58lq17NBaX3mhPsR1NXRBdsjqqyln5HkC4 ESh4hrA2bLSFV7LhzkjyynDeULtexfBnG+RO+0m0X/4s+tVkLPPzeJmWNJyEjVbZyWDxe9 cwQKwN2mj2G1Q8dI6QhTGErq8Z0tfBN93unKm+0rolECPrpWePPcLvrIPIRy3scx9v6vp9 UjUMUIiQmMj1bHmAOnSkxtSkyCR8e3dLRtjfDIV+qnO0KyO4VgMIZGbdsDRiCKRMxpKbVU 9Fx6bv0/d211v2cfJE4uCmmdRuy0Hadz7wJx69MREwZOK25aJjPychQg0bcd+g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gxbhx6YW7z11RG for ; Fri, 10 Jul 2026 15:43:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3611d by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 10 Jul 2026 15:43:45 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Michal Meloun From: Mitchell Horne Subject: git: 17d7b3d6af94 - stable/15 - arm: Implement kernel ifunc List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mhorne X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 17d7b3d6af94d22ac30312b26672fa0fd01dfd1c Auto-Submitted: auto-generated Date: Fri, 10 Jul 2026 15:43:45 +0000 Message-Id: <6a511331.3611d.2fe596c8@gitrepo.freebsd.org> The branch stable/15 has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=17d7b3d6af94d22ac30312b26672fa0fd01dfd1c commit 17d7b3d6af94d22ac30312b26672fa0fd01dfd1c Author: Michal Meloun AuthorDate: 2026-01-24 10:41:10 +0000 Commit: Mitchell Horne CommitDate: 2026-07-10 15:43:32 +0000 arm: Implement kernel ifunc Add kernel ifunc support on arm. MFC after : 3 weeks Reviewed by: kib (previous version) Differential Revision: https://reviews.freebsd.org/D54970 (cherry picked from commit d78cbf483fe73c987573967042f57f15bf590629) --- sys/arm/arm/elf_machdep.c | 8 +++++++- sys/arm/arm/machdep.c | 5 ++--- sys/arm/include/ifunc.h | 24 +++++++++++++++++++++--- sys/conf/kern.pre.mk | 5 ++--- sys/kern/link_elf.c | 2 +- sys/sys/elf_common.h | 1 + 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/sys/arm/arm/elf_machdep.c b/sys/arm/arm/elf_machdep.c index 881c4fcff475..cf2add0c367c 100644 --- a/sys/arm/arm/elf_machdep.c +++ b/sys/arm/arm/elf_machdep.c @@ -150,7 +150,7 @@ bool elf_is_ifunc_reloc(Elf_Size r_info __unused) { - return (false); + return (ELF_R_TYPE(r_info) == R_ARM_IRELATIVE); } /* @@ -253,6 +253,12 @@ elf_reloc_internal(linker_file_t lf, Elf_Addr relocbase, const void *data, case R_ARM_RELATIVE: break; + case R_ARM_IRELATIVE: + addr = relocbase + addend; + addr = ((Elf_Addr (*)(void))addr)(); + if (*where != addr) + *where = addr; + break; default: printf("kldload: unexpected relocation type %d, " "symbol index %d\n", rtype, symidx); diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c index d51b4f10fe6b..8138de7a0499 100644 --- a/sys/arm/arm/machdep.c +++ b/sys/arm/arm/machdep.c @@ -445,6 +445,8 @@ initarm(struct arm_boot_params *abp) set_cpufuncs(); cpuinfo_init(); + sched_instance_select(); + link_elf_ireloc(); /* * Find the dtb passed in by the boot loader. @@ -521,9 +523,6 @@ initarm(struct arm_boot_params *abp) /* Do basic tuning, hz etc */ init_param1(); - sched_instance_select(); - /* link_elf_ireloc(); */ - /* * Allocate a page for the system page mapped to 0xffff0000 * This page will just contain the system vectors and can be diff --git a/sys/arm/include/ifunc.h b/sys/arm/include/ifunc.h index 6b7cf20c720f..98cc354ae6ca 100644 --- a/sys/arm/include/ifunc.h +++ b/sys/arm/include/ifunc.h @@ -1,10 +1,28 @@ -/* - * This file is in the public domain. +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2025, Michal Meloun + * */ #ifndef __ARM_IFUNC_H #define __ARM_IFUNC_H -#define __DO_NOT_HAVE_SYS_IFUNCS 1 +#define DEFINE_IFUNC(qual, ret_type, name, args) \ + static ret_type (*name##_resolver(void))args __used; \ + qual ret_type name args __attribute__((ifunc(#name "_resolver"))); \ + static ret_type (*name##_resolver(void))args + +#ifdef __not_yet__ +#define DEFINE_UIFUNC(qual, ret_type, name, args) \ + static ret_type (*name##_resolver(uint32_t, uint32_t, uint32_t, \ + uint32_t))args __used; \ + qual ret_type name args __attribute__((ifunc(#name "_resolver"))); \ + static ret_type (*name##_resolver( \ + uint32_t elf_hwcap __unused, \ + uint32_t elf_hwcap2 __unused, \ + uint32_t arg3 __unused, \ + uint32_t arg4 __unused))args +#endif #endif diff --git a/sys/conf/kern.pre.mk b/sys/conf/kern.pre.mk index 5bbd1ec70cd3..455e91f957e7 100644 --- a/sys/conf/kern.pre.mk +++ b/sys/conf/kern.pre.mk @@ -118,11 +118,10 @@ CFLAGS+= ${CONF_CFLAGS} LDFLAGS+= --build-id=sha1 .endif -.if (${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "amd64" || \ - ${MACHINE_CPUARCH} == "i386" || ${MACHINE} == "powerpc") && \ +.if ${MACHINE_CPUARCH} != "riscv" && \ defined(LINKER_FEATURES) && ${LINKER_FEATURES:Mifunc} == "" && \ !make(install) -.error amd64/arm64/i386/ppc* kernel requires linker ifunc support +.error amd64/arm/arm64/i386/ppc* kernel requires linker ifunc support .endif .if ${MACHINE_CPUARCH} == "amd64" LDFLAGS+= -z max-page-size=2097152 diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c index 45edd186e6ce..2a9e2a02709d 100644 --- a/sys/kern/link_elf.c +++ b/sys/kern/link_elf.c @@ -2041,7 +2041,7 @@ link_elf_propagate_vnets(linker_file_t lf) } #endif -#if defined(__i386__) || defined(__amd64__) || defined(__aarch64__) || defined(__powerpc__) +#if !defined(__riscv) /* * Use this lookup routine when performing relocations early during boot. * The generic lookup routine depends on kobj, which is not initialized diff --git a/sys/sys/elf_common.h b/sys/sys/elf_common.h index aa06e4af90f5..66da13005aed 100644 --- a/sys/sys/elf_common.h +++ b/sys/sys/elf_common.h @@ -1149,6 +1149,7 @@ typedef struct { #define R_ARM_THM_JUMP19 51 #define R_ARM_GNU_VTENTRY 100 #define R_ARM_GNU_VTINHERIT 101 +#define R_ARM_IRELATIVE 160 #define R_ARM_RSBREL32 250 #define R_ARM_THM_RPC22 251 #define R_ARM_RREL32 252