Received: by 2002:a05:6359:6284:b0:131:369:b2a3 with SMTP id se4csp1384488rwb; Sat, 5 Aug 2023 13:53:43 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEBoPOOlG51RUiQgxPw+LV/M2nRUNQ2EmbfUR3Dt700+U2IDqY4ZiEADexlv0SZH0rsPg/Q X-Received: by 2002:a05:6a00:842:b0:67e:18c6:d2c6 with SMTP id q2-20020a056a00084200b0067e18c6d2c6mr8066922pfk.5.1691268822785; Sat, 05 Aug 2023 13:53:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691268822; cv=none; d=google.com; s=arc-20160816; b=NILkQyNw9a2lJR+Uuf5yQIPvGdmW063qlPzOF2jZ/6wz7Yj+v03l5Fowdt3ZB1TW7V x/8MHllgw2WFE9CIRXBXOKGCxMe0tTUE/2E9fEdV3FmVsyXir9IvoZuiahHAmDA/Cklj q1bOHOLLBbrevP0pPt+5mHFtjpYHjCe3FSGLIfk3JbbUhtnRRu5zpTkLZPdHS9sfKJsR LaJ7P3+1w7eqbWvsFLRdF9qhgx9QlC5sF8KOH6EGTOBdhO0oSGCpe8Qa8I4Ku6jqLDta 72w/3azO9nOoFUPW5kzEusjTmlUw0KNc8G1Td6NFkN51TjGReaEB7GHouwBUtSmm9eb7 FLDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:feedback-id:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from; bh=xLRKBMx4MkugeQYFCPXNX+2rpI4s3ZQRa+3mCC/Wtps=; fh=qDuYiBigcDB5OOi2VEjvZowinM7+A028kB0vdTLYbmY=; b=aGn8jwr53FUCJ1xuh5GTu0O20wvAhpohSIoA1E0f3KFeGC9gl8f81tD6tsJ5LwHfJg QPCgGeFF+MDk8vi9X5iloWsYiM1ICpMVIdhnZReZE9Tp9zX9v94eZFDQvVxDRvrGQD8Z Crol/U69wc1njpURE7To9sKLQc/RbC2HJiWG3MPnnNqmXNSIKRi2CLyJlMlwltfjMpik 2YxuLxQ3+Qf5RYuzlwXOaw+BcZYB6wb4E9ofoN+tyG4hXBi2DBHSwufnB3Guf0hU+ogD O6mQvDrZIfl+GB0VcAR2Jg/eBtebl2p+l0IRyo94vLe3rwujAp/LLAq7kIUMHtbou4Dl 2dnA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id ce11-20020a056a002a0b00b006870c1ea846si3484505pfb.281.2023.08.05.13.53.31; Sat, 05 Aug 2023 13:53:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229825AbjHESkv (ORCPT + 99 others); Sat, 5 Aug 2023 14:40:51 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229441AbjHESku (ORCPT ); Sat, 5 Aug 2023 14:40:50 -0400 Received: from smtpbgeu2.qq.com (smtpbgeu2.qq.com [18.194.254.142]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 90E5FB7; Sat, 5 Aug 2023 11:40:44 -0700 (PDT) X-QQ-mid: bizesmtp77t1691260833tbkk0zgs Received: from linux-lab-host.localdomain ( [116.30.131.233]) by bizesmtp.qq.com (ESMTP) with id ; Sun, 06 Aug 2023 02:40:32 +0800 (CST) X-QQ-SSF: 01200000000000E0X000B00A0000000 X-QQ-FEAT: 96VJ2VzXm/qdtVNFs2llxvJYD1e7vTK/6sALo+w7KpYnEx5xxyFVMgmbni986 I+ubWSZeNYyKq7ve3SC2kqvKaunRY+GWoCA9DxAFziLaMTjrTAEzJnMm54xMLRQrBRO1vpt UElu7Wn3n99SnR7UnCtVyGOrhb433wF9G9nvE5EafhPnryICXtaazTBbnRwTdeieN6GqEzp hxlufo1G+WxGmiOppTQYcrDrtun2YC6ofAup1A2/xTBvhBIUZhVUzTZxOCOwiD4fbfPiGYT yzImKaZ1m145V2VTqnF/f/tb5BfBILZYAY2vGfcsnhDzcg90DgjIgcTt1Rv/DvvjNZ4JCaP HZQUN5Gj87cuy8toh2/opdzwH3Lf5a5FCUifUKg2JwHb+gX9QqWWCANxMiTCSweA39za5wi X-QQ-GoodBg: 0 X-BIZMAIL-ID: 16661133259475389670 From: Zhangjin Wu To: w@1wt.eu Cc: falcon@tinylab.org, arnd@arndb.de, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, tanyuan@tinylab.org, thomas@t-8ch.de, =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Subject: [PATCH v6 2/8] tools/nolibc: add support for powerpc64 Date: Sun, 6 Aug 2023 02:40:31 +0800 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:tinylab.org:qybglogicsvrgz:qybglogicsvrgz5a-1 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_PASS, T_SPF_HELO_TEMPERROR,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This follows the 64-bit PowerPC ABI [1], refers to the slides: "A new ABI for little-endian PowerPC64 Design & Implementation" [2] and the musl code in arch/powerpc64/crt_arch.h. First, stdu and clrrdi are used instead of stwu and clrrwi for powerpc64. Second, the stack frame size is increased to 32 bytes for powerpc64, 32 bytes is the minimal stack frame size supported described in [2]. Besides, the TOC pointer (GOT pointer) must be saved to r2. This works on both little endian and big endian 64-bit PowerPC. [1]: https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.pdf [2]: https://www.llvm.org/devmtg/2014-04/PDFs/Talks/Euro-LLVM-2014-Weigand.pdf Reviewed-by: Thomas Weißschuh Signed-off-by: Zhangjin Wu --- tools/include/nolibc/arch-powerpc.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tools/include/nolibc/arch-powerpc.h b/tools/include/nolibc/arch-powerpc.h index 8332c9d3e5d6..76c3784f9dc7 100644 --- a/tools/include/nolibc/arch-powerpc.h +++ b/tools/include/nolibc/arch-powerpc.h @@ -172,6 +172,7 @@ _ret; \ }) +#ifndef __powerpc64__ /* FIXME: For 32-bit PowerPC, with newer gcc compilers (e.g. gcc 13.1.0), * "omit-frame-pointer" fails with __attribute__((no_stack_protector)) but * works with __attribute__((__optimize__("-fno-stack-protector"))) @@ -180,10 +181,24 @@ #undef __no_stack_protector #define __no_stack_protector __attribute__((__optimize__("-fno-stack-protector"))) #endif +#endif /* !__powerpc64__ */ /* startup code */ void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_stack_protector _start(void) { +#ifdef __powerpc64__ + /* On 64-bit PowerPC, save TOC/GOT pointer to r2 */ + extern char TOC __asm__ (".TOC."); + register volatile long r2 __asm__ ("r2") = (void *)&TOC - (void *)_start; + + __asm__ volatile ( + "mr 3, 1\n" /* save stack pointer to r3, as arg1 of _start_c */ + "clrrdi 1, 1, 4\n" /* align the stack to 16 bytes */ + "li 0, 0\n" /* zero the frame pointer */ + "stdu 1, -32(1)\n" /* the initial stack frame */ + "bl _start_c\n" /* transfer to c runtime */ + ); +#else __asm__ volatile ( "mr 3, 1\n" /* save stack pointer to r3, as arg1 of _start_c */ "clrrwi 1, 1, 4\n" /* align the stack to 16 bytes */ @@ -191,6 +206,7 @@ void __attribute__((weak, noreturn, optimize("Os", "omit-frame-pointer"))) __no_ "stwu 1, -16(1)\n" /* the initial stack frame */ "bl _start_c\n" /* transfer to c runtime */ ); +#endif __builtin_unreachable(); } -- 2.25.1