From patchwork Sun Jun 28 07:02:29 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jesse Huang X-Patchwork-Id: 137959 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 653884BA23CD for ; Sun, 28 Jun 2026 07:03:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 653884BA23CD Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=sifive.com header.i=@sifive.com header.a=rsa-sha256 header.s=google header.b=SvJ/TG+6 X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-dy1-x1330.google.com (mail-dy1-x1330.google.com [IPv6:2607:f8b0:4864:20::1330]) by sourceware.org (Postfix) with ESMTPS id DC2A34BA2E27 for ; Sun, 28 Jun 2026 07:02:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DC2A34BA2E27 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=sifive.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org DC2A34BA2E27 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::1330 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1782630175; cv=none; b=hxzw1DUbkGQckUvnQl/2fCuT3csKQoTACc8XKO22RkaiFk+jk6mZaPsMbMlZK98s4IEtljgruQjprTE5TNf3HSK8EiHlBguXiNTwhfuWRNxocaP1Irre9YjAzpFDTMpcoISy9qBFrexGteRf4HJM+foKaiONH8Nyc/BoKjz/zy0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1782630175; c=relaxed/simple; bh=mlS2PZAAFP/lRb+2BAAYh0c24Gm0xyLbuM3L91Km8MA=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=onie1/6tg2cTFZNcb8dZszqO5LaoMGrrpcz4TxqmsKWFXyjrQhIO+BjjM5kVteWfnycsTFXSs9M3dyf+h5Kz+uskqRQ0ADcnfJ6wCP9tau/H9Flf9cOFlWtf1qZqYAOIAB0BYI9pInudivU/NIzhRb3JziK8LMlPbjNupzj0p7A= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=sifive.com header.i=@sifive.com header.a=rsa-sha256 header.s=google header.b=SvJ/TG+6 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org DC2A34BA2E27 Received: by mail-dy1-x1330.google.com with SMTP id 5a478bee46e88-30eac9abd79so776913eec.1 for ; Sun, 28 Jun 2026 00:02:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1782630174; x=1783234974; darn=sourceware.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ieAVYXk0qAnuZ6Q0RdIA+DeV7oaQLxCeRzLJmw9/5Yw=; b=SvJ/TG+68kUvgNbDD1CjlqG8CYaLS0gPD80fgnHDyOzPBz/UNH59NQKWQgfVwmggoU j/PWcSpjY3FBg+ikuQSQuto+UmkzlNpygG7yWrJGY9mmoO4jiKm3cgekz6/yB8ctQs8v JF8bePWCPOjRJVKY+bumvvn58WdUFIPTxaqj2Nl2vNLxSRwMH2jgqkUpIRubQ9Jo8Wt6 6t+By0AkKWgj6g16kZy2IlNnKTJ989cfyymk7QGI9mNUTF75EHGJniCqX6pptKivwJV3 sFataKS23mtPbMQEV2g6uzJJjODTTxAh2FLIj8uhV9P406vRB++ioWwzfIE0JdCIkqDh DHSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782630174; x=1783234974; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ieAVYXk0qAnuZ6Q0RdIA+DeV7oaQLxCeRzLJmw9/5Yw=; b=B/nYPsaruKPFy06i9ooO/mMtHdLJuwzHF2fdPFl2fHkAo0UVXwcMMck+QoXD/1y5L7 CQWGErqaiX/ZdXxsLDOGB3drb8wQ/XbInwyZJdLcXwWP3DglP4piKPgfWkT3wFCK7eB8 71n5IYtpF3ha1ZYRKL15whtiUkEWf4dkMuOJiV7A4wT2Zy2BAD8wja6xTGctN0uY+6I4 0IqCG8uUJ+TOfrQZCPSCjBf314N60zOHPD79mx89QhiS5PHRQFap+Yu+ONjnc8fEZtOF 4E50sIy8pocPtlaFlv6k3R+PQ4SkbF/36tWbNZZriCgOuVexqflbepG/sfQWH0OHHYYu cb+w== X-Gm-Message-State: AOJu0YynbaE9bO4JW/s5BPb2LFhSqqJ8Kx1DHqianFtf6xUzEkX1AOH1 yaiqY3I4Zv5fwJkeHCe3nKx3wIcw4geVoWbxnUiKu1KQrUhN+8GU7n78XxuJl6KtDEkIhCJKmrd 9nCx3SnGxDIFndKQmAQ2ryiLu4rlCpRzIc7+N3UhsICbe1/+595zwDAnT1m3yQZwF9B+IVdbwXw rznNXwofrGBtsBpFON4+D+7nqDPD/BVtrLCFvDmmjgRoHM0eKADWk= X-Gm-Gg: AfdE7cnboX1B8f//Cc+RSjSthdER60jTxc/tsXfnEFQUdBUDh3OloZpAGXIoSa3JTgQ iXq8FUIc3mq3oZ0i4x9HxsUNzVxPQx6dhZBfo0OP8rpzQCCldAWUeMQSA2eUTAGNwYwbPzqN+RD U9SUS4GNrNTgS5FptfNpM7oMdP54jrWnvvcKr/8DJ6E+eEwIFkCECffKCUQ5Jsp+39Qwy7pHfkX PrXdu6pF1eaJKvxHKBg+o9np19mKlwJbCN195sEIE3nPQFopzKOF1U3MnADrWY1bVrnv/3eJKfN 2Ln5afVBtPCtiFhIxE+OYAj6YtW6FJGoERhNLbYdz6z5WhlJHwi/K8W2b8gyN38vveSZg3F1PfJ dZRsMIWmAKT21ot7UfXTBkOhkL9KkfTSWj9pylQVIRe/4MY0UezL7EL9v/xkhpSHKfyiZFJclFJ MH8TKB+wRiCmrlSWCihREzDlA6IS/4g0M0yiq04W3G X-Received: by 2002:a05:7300:7fa6:b0:2db:2089:460f with SMTP id 5a478bee46e88-30cab22a412mr6252065eec.19.1782630173617; Sun, 28 Jun 2026 00:02:53 -0700 (PDT) Received: from sw08.internal.sifive.com ([4.53.31.132]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30c7c8afc91sm35435166eec.14.2026.06.28.00.02.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 28 Jun 2026 00:02:52 -0700 (PDT) From: Jesse Huang To: libc-alpha@sourceware.org Cc: andrew@sifive.com, darius@bluespec.com, debug@rivosinc.com, jeffreyalaw@gmail.com, kito.cheng@sifive.com, palmer@dabbelt.com, schwab@suse.de, Jesse Huang , Hau Hsu , Jerry Zhang Jian Subject: [PATCH v5 04/16] riscv: Adjust assembly routines to support landing pad Date: Sun, 28 Jun 2026 00:02:29 -0700 Message-Id: <20260628070241.88310-5-jesse.huang@sifive.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20260628070241.88310-1-jesse.huang@sifive.com> References: <20260628070241.88310-1-jesse.huang@sifive.com> MIME-Version: 1.0 X-Spam-Status: No, score=-13.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, PROLO_LEO3, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org Landing pads, instructions for setting the label value, and alignment directives are inserted where they are needed. Changed to use software-guarded call in dl_runtime_resolve. Co-authored-by: Hau Hsu Co-authored-by: Kito Cheng Co-authored-by: Jerry Zhang Jian --- sysdeps/riscv/crti.S | 4 ++ sysdeps/riscv/crtn.S | 4 ++ sysdeps/riscv/dl-machine.h | 8 +++ sysdeps/riscv/dl-trampoline.S | 41 +++++++-------- sysdeps/riscv/start.S | 9 ++++ sysdeps/riscv/sys/asm.h | 12 ++++- sysdeps/unix/sysv/linux/riscv/clone.S | 1 + sysdeps/unix/sysv/linux/riscv/sysdep.h | 69 ++++++++++++++++++++++++++ 8 files changed, 127 insertions(+), 21 deletions(-) create mode 100644 sysdeps/riscv/crti.S create mode 100644 sysdeps/riscv/crtn.S diff --git a/sysdeps/riscv/crti.S b/sysdeps/riscv/crti.S new file mode 100644 index 0000000000..fb1097c5ca --- /dev/null +++ b/sysdeps/riscv/crti.S @@ -0,0 +1,4 @@ +/* crti.S is empty because .init_array/.fini_array are used exclusively. + Include sysdep.h to define gnu property if necessary. */ + +#include diff --git a/sysdeps/riscv/crtn.S b/sysdeps/riscv/crtn.S new file mode 100644 index 0000000000..b2e7cb692e --- /dev/null +++ b/sysdeps/riscv/crtn.S @@ -0,0 +1,4 @@ +/* crtn.S is empty because .init_array/.fini_array are used exclusively. + Include sysdep.h to define gnu property if necessary. */ + +#include diff --git a/sysdeps/riscv/dl-machine.h b/sysdeps/riscv/dl-machine.h index babb52af20..05992c8705 100644 --- a/sysdeps/riscv/dl-machine.h +++ b/sysdeps/riscv/dl-machine.h @@ -28,6 +28,13 @@ #include #include #include +/* This is a marker to remind us to add real expansion to setup the label + for the function signature label scheme in the future */ +#ifdef __riscv_landing_pad_unlabeled +# define SET_LPAD +#else +# define SET_LPAD +#endif #ifndef _RTLD_PROLOGUE # define _RTLD_PROLOGUE(entry) \ @@ -127,6 +134,7 @@ elf_machine_dynamic (void) # Pass our finalizer function to _start.\n\ lla a0, _dl_fini\n\ # Jump to the user entry point.\n\ + " STRINGXV (SET_LPAD) "\n\ jr s0\n\ " _RTLD_EPILOGUE (ENTRY_POINT) \ _RTLD_EPILOGUE (_dl_start_user) "\ diff --git a/sysdeps/riscv/dl-trampoline.S b/sysdeps/riscv/dl-trampoline.S index 6c731fcfd4..f37ed60343 100644 --- a/sysdeps/riscv/dl-trampoline.S +++ b/sysdeps/riscv/dl-trampoline.S @@ -29,6 +29,7 @@ # define FRAME_SIZE (-((-10 * SZREG) & ALMASK)) #else # define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK)) +# define FREG_BASE_OFFSET (10*SZREG) #endif ENTRY (_dl_runtime_resolve) @@ -45,23 +46,23 @@ ENTRY (_dl_runtime_resolve) REG_S a7, 8*SZREG(sp) #ifndef __riscv_float_abi_soft - FREG_S fa0, (10*SZREG + 0*SZFREG)(sp) - FREG_S fa1, (10*SZREG + 1*SZFREG)(sp) - FREG_S fa2, (10*SZREG + 2*SZFREG)(sp) - FREG_S fa3, (10*SZREG + 3*SZFREG)(sp) - FREG_S fa4, (10*SZREG + 4*SZFREG)(sp) - FREG_S fa5, (10*SZREG + 5*SZFREG)(sp) - FREG_S fa6, (10*SZREG + 6*SZFREG)(sp) - FREG_S fa7, (10*SZREG + 7*SZFREG)(sp) + FREG_S fa0, (FREG_BASE_OFFSET + 0*SZFREG)(sp) + FREG_S fa1, (FREG_BASE_OFFSET + 1*SZFREG)(sp) + FREG_S fa2, (FREG_BASE_OFFSET + 2*SZFREG)(sp) + FREG_S fa3, (FREG_BASE_OFFSET + 3*SZFREG)(sp) + FREG_S fa4, (FREG_BASE_OFFSET + 4*SZFREG)(sp) + FREG_S fa5, (FREG_BASE_OFFSET + 5*SZFREG)(sp) + FREG_S fa6, (FREG_BASE_OFFSET + 6*SZFREG)(sp) + FREG_S fa7, (FREG_BASE_OFFSET + 7*SZFREG)(sp) #endif # Update .got.plt and obtain runtime address of callee. slli a1, t1, 1 mv a0, t0 # link map add a1, a1, t1 # reloc offset (== thrice the .got.plt offset) - la a2, _dl_fixup - jalr a2 - mv t1, a0 + la t2, _dl_fixup + jalr t2 + mv t2, a0 # Restore arguments from stack. REG_L ra, 9*SZREG(sp) @@ -75,20 +76,20 @@ ENTRY (_dl_runtime_resolve) REG_L a7, 8*SZREG(sp) #ifndef __riscv_float_abi_soft - FREG_L fa0, (10*SZREG + 0*SZFREG)(sp) - FREG_L fa1, (10*SZREG + 1*SZFREG)(sp) - FREG_L fa2, (10*SZREG + 2*SZFREG)(sp) - FREG_L fa3, (10*SZREG + 3*SZFREG)(sp) - FREG_L fa4, (10*SZREG + 4*SZFREG)(sp) - FREG_L fa5, (10*SZREG + 5*SZFREG)(sp) - FREG_L fa6, (10*SZREG + 6*SZFREG)(sp) - FREG_L fa7, (10*SZREG + 7*SZFREG)(sp) + FREG_L fa0, (FREG_BASE_OFFSET + 0*SZFREG)(sp) + FREG_L fa1, (FREG_BASE_OFFSET + 1*SZFREG)(sp) + FREG_L fa2, (FREG_BASE_OFFSET + 2*SZFREG)(sp) + FREG_L fa3, (FREG_BASE_OFFSET + 3*SZFREG)(sp) + FREG_L fa4, (FREG_BASE_OFFSET + 4*SZFREG)(sp) + FREG_L fa5, (FREG_BASE_OFFSET + 5*SZFREG)(sp) + FREG_L fa6, (FREG_BASE_OFFSET + 6*SZFREG)(sp) + FREG_L fa7, (FREG_BASE_OFFSET + 7*SZFREG)(sp) #endif addi sp, sp, FRAME_SIZE # Invoke the callee. - jr t1 + jr t2 END (_dl_runtime_resolve) #if !defined PROF && defined SHARED diff --git a/sysdeps/riscv/start.S b/sysdeps/riscv/start.S index bc3bc04219..0d74cbf251 100644 --- a/sysdeps/riscv/start.S +++ b/sysdeps/riscv/start.S @@ -53,6 +53,7 @@ ENTRY (ENTRY_POINT) #if defined PIC && !defined SHARED /* Avoid relocation in static PIE since _start is called before it is relocated. */ + SET_LPAD lla a0, __wrap_main #else la a0, main @@ -69,7 +70,11 @@ ENTRY (ENTRY_POINT) END (ENTRY_POINT) #if defined PIC && !defined SHARED +#ifdef __riscv_landing_pad + .align 2 +#endif /* __riscv_landing_pad */ __wrap_main: + LPAD tail main@plt #endif @@ -79,9 +84,13 @@ __wrap_main: needs to be initialized before calling __libc_start_main in that case. So we redundantly initialize it at the beginning of _start. */ +#ifdef __riscv_landing_pad + .align 2 +#endif /* __riscv_landing_pad */ load_gp: .option push .option norelax + LPAD lla gp, __global_pointer$ .option pop ret diff --git a/sysdeps/riscv/sys/asm.h b/sysdeps/riscv/sys/asm.h index 1ca3d46120..54217540f8 100644 --- a/sysdeps/riscv/sys/asm.h +++ b/sysdeps/riscv/sys/asm.h @@ -46,13 +46,23 @@ # endif #endif +/* Landing pad for Zicfilp CFI. */ +#ifndef LPAD +# ifdef __riscv_landing_pad_unlabeled +# define LPAD lpad 0 +# else +# define LPAD +# endif +#endif + /* Declare leaf routine. */ #define LEAF(symbol) \ .globl symbol; \ .align 2; \ .type symbol,@function; \ symbol: \ - cfi_startproc; + cfi_startproc; \ + LPAD; /* Mark end of function. */ #undef END diff --git a/sysdeps/unix/sysv/linux/riscv/clone.S b/sysdeps/unix/sysv/linux/riscv/clone.S index 1ce930a97e..92e2752bf6 100644 --- a/sysdeps/unix/sysv/linux/riscv/clone.S +++ b/sysdeps/unix/sysv/linux/riscv/clone.S @@ -82,6 +82,7 @@ L (thread_start): REG_L a0,SZREG(sp) /* Argument pointer. */ /* Call the user's function. */ + SET_LPAD jalr a1 /* Call exit with the function's return value. */ diff --git a/sysdeps/unix/sysv/linux/riscv/sysdep.h b/sysdeps/unix/sysv/linux/riscv/sysdep.h index 7f0eb07045..c60b0623c2 100644 --- a/sysdeps/unix/sysv/linux/riscv/sysdep.h +++ b/sysdeps/unix/sysv/linux/riscv/sysdep.h @@ -53,6 +53,75 @@ # include +/* GNU_PROPERTY_RISCV_* macros from elf.h for use in asm code. */ +#define FEATURE_1_AND 0xc0000000 + +/* Add a NT_GNU_PROPERTY_TYPE_0 note. */ +#if __riscv_xlen == 32 +# define GNU_PROPERTY(type, value) \ + .section .note.gnu.property, "a"; \ + .p2align 2; \ + .word 4; \ + .word 12; \ + .word 5; \ + .asciz "GNU"; \ + .word type; \ + .word 4; \ + .word value; \ + .text +#else +# define GNU_PROPERTY(type, value) \ + .section .note.gnu.property, "a"; \ + .p2align 3; \ + .word 4; \ + .word 16; \ + .word 5; \ + .asciz "GNU"; \ + .word type; \ + .word 4; \ + .word value; \ + .word 0; \ + .text +#endif + +/* Add GNU property note with the supported features to all asm code + where sysdep.h is included. */ +#undef __VALUE_FOR_FEATURE_1_AND +#if defined (__riscv_landing_pad) || defined (__riscv_shadow_stack) +# if defined (__riscv_landing_pad_unlabeled) +# if defined (__riscv_shadow_stack) +# define __VALUE_FOR_FEATURE_1_AND 0x3 +# else +# define __VALUE_FOR_FEATURE_1_AND 0x1 +# endif +# elif defined (__riscv_landing_pad_func_sig) +# if defined (__riscv_shadow_stack) +# define __VALUE_FOR_FEATURE_1_AND 0x6 +# else +# define __VALUE_FOR_FEATURE_1_AND 0x4 +# endif +# else +# if defined (__riscv_shadow_stack) +# define __VALUE_FOR_FEATURE_1_AND 0x2 +# else +# error "What?" +# endif +# endif +#endif + +#if defined (__VALUE_FOR_FEATURE_1_AND) +GNU_PROPERTY (FEATURE_1_AND, __VALUE_FOR_FEATURE_1_AND) +#endif +#undef __VALUE_FOR_FEATURE_1_AND + +#ifdef __riscv_landing_pad_unlabeled +# define SET_LPAD +# define LPAD lpad 0 +#else +# define SET_LPAD +# define LPAD +#endif + # define ENTRY(name) LEAF(name) # define L(label) .L ## label