From patchwork Mon Jun 22 10:52:02 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kito Cheng X-Patchwork-Id: 137544 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 300C34B9DB7B for ; Mon, 22 Jun 2026 10:52:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 300C34B9DB7B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1782125571; bh=okW+Y3OViOojtkT9kZRRVWnyY89WzJ1eebCDaiT8byE=; h=To:Cc:Subject:Date:In-Reply-To:References:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=WqiSWiU4Tc7BTLoTKbq3OVOq0LvXs/iuDQO9c5tamYPprzHfSKoH1iHMwhSJ+V2MD 6Ifvnx1beaWmEXmNV4WPSVB5PDXRSv0mhMvhwUv9sDo4xknNzX4c0OKdckMVjHdCKS E53xk38OH1uxpjMFu+asTkwaivSUfukkdpMlGnA4= X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from mail-pg1-x52f.google.com (mail-pg1-x52f.google.com [IPv6:2607:f8b0:4864:20::52f]) by sourceware.org (Postfix) with ESMTPS id 39BE14BA2E0C for ; Mon, 22 Jun 2026 10:52:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 39BE14BA2E0C ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 39BE14BA2E0C ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1782125536; cv=none; b=Io8oqH1B8u9y+2il5VJFGYcw19sDsOK8ZPLbIjqaR1/IGWh4az8CSYXl9fk+NIYKkzO1qRxEpdNlVYArIHGd95VE0E/v3yYW8OPN6NIONer38q/1786WEJ+oYVECKMBpAMPnrA8SVIVF/t9E9T0F5pOpk7b1SrFc+GrFktGx7hY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1782125536; c=relaxed/simple; bh=0/YeiX5wmAulJpjesUuJbARJcZifkJ696WZRdvNaeLI=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=CJ5BpbuWiCPyn2gofPxBB68BvUxxXjFQW6xOuVYkdJfOs+lEaZkdDP80aOE+sltc92GsASqdNn8Tvk2NMfDAI4VRQqiA1ItYrcMCPlTR1+a21SC0FFPCkMne5QEhh5i6BuaaOBSSC4boniTYCSmdypS7NNhSQ0CLbbfwwj9MNZc= 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=agCwtc60 DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 39BE14BA2E0C Received: by mail-pg1-x52f.google.com with SMTP id 41be03b00d2f7-c8b49639fbaso1608367a12.0 for ; Mon, 22 Jun 2026 03:52:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782125535; x=1782730335; 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=okW+Y3OViOojtkT9kZRRVWnyY89WzJ1eebCDaiT8byE=; b=a/dPDaEdS31Vpg9PS8S6dW2EYHd4X+7sbPNGuW82rhUVGy9vLGy8i0S8ytT56i6pAg fJU1HjeiWrDCSrdcSBBRvsG9ZWjEnhbF1hGeQ3VqqFnPpViqYDXk0dbaAOzqal2ibju8 4b8FrVDx5xYxGO1nWRq4f/A3luLYouxhb/5xy0ALvYXuwI5COR7gFBWLnIGvpR2+0exu FJ21Ym4t4x+/8VQxUvP02GH0P1xasPLm1NJJq8x/0Qeqhj4+FaZI/lEjdnurEwhEw0j7 23PuYxvRAvqZ2jNCLwf+nS8RjSup2mK76bh4j3WZKXfyr8b/Q7nvWb6nAD2yecGbz2bg RmlQ== X-Gm-Message-State: AOJu0YxI8z82XqAIGB7ScHZdQNUS18+brSHYkfv2F8bH0+m6LBR1VOcq ahYD1n43tb2iEQWRcMPwDtdiUsQHlJR7BL2KP8Y5am31sKr+alZtEEGRYyA7LEfrXb40Ld+5ec+ teTwVi2DslcBi+VGf/vdI0Bm0n4ZurAgY7i1gSIHfmpkmbk6qQz4R3ES8JGIFGLa/CvuN5SVWbY gj3qx0OdVEvMv2EcizGbxQXrKXUcCtuJ4IQ3h0LqGoWq+w X-Gm-Gg: AfdE7ck2E32I753l9v5vFOwkfC+qRPH28hMifakGMquhRbWoU6HZgW5ka7CiG1vNwWO D0GrVWvB/l4hlqyc6RJORLT0MPiet9eYlt+v7R+gx5MBxvpC0hppDtDSWnxR98xiKUPLq3+gt1O hnc8WrRXuMNjNxkmJgPn6IJJDKkL6ZiEv6WSCOC7YNvdavT4z4WA2KIu5AMenE95nV/h8QdQdnr Yu5PsaFV+uxFi+GMGfFlF1+j+jIs7bxywa5YpG0oybWjBtCYKKwRn6Xyx/C4FrJFaKLHezEUl81 Rv5gAD4+A0To9O+daFdfSEVQskc4d/ukzJTYABG89f+GDHb0qwZhV/BXaIjvz2bTzqaue/2SPi+ jbWKjVQl05vd6dFS8GoGqr6bt3rqyRkmVDrQNy2P12Esh7nkIDO7lVv7eEnBe9V1/sl1zFxpUbe XK2G1/8T+bm3ViC6oAZSvkpAg/XKEKozLN4hA1kw== X-Received: by 2002:a05:6a20:428b:b0:3b4:7cd8:5853 with SMTP id adf61e73a8af0-3bb69baf411mr14323093637.6.1782125534979; Mon, 22 Jun 2026 03:52:14 -0700 (PDT) Received: from hsinchu18.internal.sifive.com ([210.176.154.34]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c8bc5a1dc13sm6847599a12.26.2026.06.22.03.52.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 22 Jun 2026 03:52:14 -0700 (PDT) To: newlib@sourceware.org, kito.cheng@gmail.com Cc: Jesse Huang Subject: [committed 3/3] RISC-V: save and restore ssp on setjmp/longjmp Date: Mon, 22 Jun 2026 18:52:02 +0800 Message-ID: <20260622105202.664207-3-kito.cheng@sifive.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260622105202.664207-1-kito.cheng@sifive.com> References: <20260622105202.664207-1-kito.cheng@sifive.com> MIME-Version: 1.0 X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Kito Cheng via Newlib From: Kito Cheng Reply-To: Kito Cheng Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org From: Jesse Huang --- newlib/libc/include/machine/setjmp.h | 11 +++++-- newlib/libc/machine/riscv/setjmp.S | 43 ++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/newlib/libc/include/machine/setjmp.h b/newlib/libc/include/machine/setjmp.h index ab820ed94..4e74bdb0f 100644 --- a/newlib/libc/include/machine/setjmp.h +++ b/newlib/libc/include/machine/setjmp.h @@ -431,10 +431,17 @@ _BEGIN_STD_C otherwise in rv32imafd, store/restore FPR may mis-align. */ #define _JBTYPE long long #ifdef __riscv_32e -#define _JBLEN ((4*sizeof(long))/sizeof(long)) +#define __JBLEN ((4*sizeof(long))/sizeof(long)) #else -#define _JBLEN ((14*sizeof(long) + 12*sizeof(double))/sizeof(long)) +#define __JBLEN ((14*sizeof(long) + 12*sizeof(double))/sizeof(long)) #endif + +#ifdef __riscv_shadow_stack +#define _JBLEN (__JBLEN + 1) +#else +#define _JBLEN (__JBLEN) +#endif + #endif #ifdef __CSKYABIV2__ diff --git a/newlib/libc/machine/riscv/setjmp.S b/newlib/libc/machine/riscv/setjmp.S index a29c15f29..336ac5b4e 100644 --- a/newlib/libc/machine/riscv/setjmp.S +++ b/newlib/libc/machine/riscv/setjmp.S @@ -60,6 +60,18 @@ ENTRY(setjmp) FREG_S fs11,14*SZREG+11*SZFREG(a0) #endif +#ifdef __riscv_shadow_stack + /* read ssp into t0 */ + ssrdp t0 +# ifndef __riscv_float_abi_soft + REG_S t0, 14*SZREG+12*SZFREG(a0) +# elif defined (__riscv_32e) + REG_S t0, 4*SZREG(a0) +# else + REG_S t0, 14*SZREG(a0) +# endif +#endif + li a0, 0 ret END(setjmp) @@ -110,6 +122,37 @@ ENTRY(longjmp) FREG_L fs9, 14*SZREG+ 9*SZFREG(a0) FREG_L fs10,14*SZREG+10*SZFREG(a0) FREG_L fs11,14*SZREG+11*SZFREG(a0) +#endif +#ifdef __riscv_shadow_stack + /* read ssp into t0 */ + ssrdp t0 + /* skip unwinding if ss is not enabled */ + beqz t0, .Lunwind_fin +# ifndef __riscv_float_abi_soft + REG_L t1, 14*SZREG+12*SZFREG(a0) +# elif defined (__riscv_32e) + REG_L t0, 4*SZREG(a0) +# else + REG_L t1, 14*SZREG(a0) +# endif +.Lunwind: + /* should not be taken in normal condition */ + bleu t1, t0, .Lunwind_fin + /* The unwinding algorithm came from the zicfiss spec, increase ssp + by at most a page size to ensure always run into a guard page + before accidentally point to another legal shadow stack page */ + /* t0 = (t1 - t0 >= 4096) ? t0 + 4096 : t1 */ + lui a0, 1 + add t0, t0, a0 + bleu t0, t1, 1f + mv t0, t1 +1: + csrw ssp, t0 + /* Test if the location pointed by ssp is legal */ + sspush x5 + sspopchk x5 + j .Lunwind +.Lunwind_fin: #endif seqz a0, a1