From patchwork Wed Jan 3 17:14:33 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Sergey Bugaev X-Patchwork-Id: 1882016 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=OP5u9ZuT; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4T4xDz1JKvz1yQ5 for ; Thu, 4 Jan 2024 04:15:31 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1E8F1385801C for ; Wed, 3 Jan 2024 17:15:29 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-lf1-x136.google.com (mail-lf1-x136.google.com [IPv6:2a00:1450:4864:20::136]) by sourceware.org (Postfix) with ESMTPS id E11A23858291 for ; Wed, 3 Jan 2024 17:15:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E11A23858291 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E11A23858291 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::136 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704302110; cv=none; b=mxa3nsPY4M/ME7DbioQE1wPl9Ue979d++Y62Y/NfGFedgpO0FtpfO2T4Yb0UFNqPrfVbap9qey7EBMyWi2BZlgrNT0hWIsRykkZnGd4G6wQf9eafZrY5ysSAZYwnQhrcCFGNNbIV8Kqj5ga7IVtKdlN2ls1uX7Jipaq3FMEKSW0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1704302110; c=relaxed/simple; bh=Blw3FHayElcvRjTiIfW7bv+dVVYdDL1BT/BJzAZP9to=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=hCZgIExctOXd5tIyiTRHulIDGrFS3DAMW8nUYl28704yYNbZCDvw1VmLv69+/osmcm3JeU++7LpmRLjnwbs9pHv0ux5JNwKxp4vC9+bjNebWUG+GLh4W29I+zlorP0YYLNk0DrVMjpFPPVhO5F38O1G/pUrUyfpXzhyFak+kdnU= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-lf1-x136.google.com with SMTP id 2adb3069b0e04-50e7b273352so7304632e87.1 for ; Wed, 03 Jan 2024 09:15:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1704302104; x=1704906904; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=u4Zrxj5i+9f3fzUkdIF1zut7M+pPTvLugxFqYziHDZk=; b=OP5u9ZuTmSrtjPz3JHGnR6l5fokvY/6GoJE4d1gkHhaaj+4lwoT+y6CW0YG4egybp/ 00211jS4SI87loz2ilcb0HZ4O4zFKcTbQpuOy2hSQlv07YFc4z3ICphJjgCaKTHI9/PV UmrCKcEdmzWB+lXtvpPQV8OEyP/n5BkGVhD4QY3gUnwPTdAwZRfr1Q7NjxrTMghthQ7m pPtpITeGWOxs337rG2DDwli25lYHqvDu/2Tbv1dsHhCP4yVxncFwLgWOWFBCyd2pLywc 4ylhTnHRHGJ9GFVu210CV8DRxbS6ciSG1Rs71DUsDuChaU02smbE94yY6fSU4vnxQSGN mwTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704302104; x=1704906904; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=u4Zrxj5i+9f3fzUkdIF1zut7M+pPTvLugxFqYziHDZk=; b=Jbprm45AICI0JP7nq7TPyb45xAAX8rujjCNoFS+deEpSg//stYg8CjGPQ9LC0D9CaU Cv0KS8Gc9pkm5h+RrdsoG1eDkBDEAZpOcM/QhqzC8Y0a6HNGfhEmc2d/2ndKHd5M5lst IYwt3IFvdKhh2/8cwluHP8k+5QxFAD9wEXh15b4UHGLQ/CQmTgTAfsEvFbHviMwbJlex VN8Sy/hMIkn5tkz7Ddek27/wU+SJVyUSf5O2+G0NRPgYA+I7c3aBTuCL2fEsORzgyU2o cs2xusqpRY5WL9nsxlNcif5QbPQpZb4OdUIU3Knw0S3cOQTogctIiftlyO1fAucI8u/v pKsg== X-Gm-Message-State: AOJu0YwxyML6PgHsEQdVtrMDAlYLFU783luLGExqSTxfTfnGCIyGUJs4 qzm5HsYdXXW0ToAiXt11N+o6EBtiYOg= X-Google-Smtp-Source: AGHT+IHteDAF/SIv8nly7kuhEUwVtXEKS21IUcEgyetCYyN4YtNhADx/9jw9jERRk1DLgniutHW8xA== X-Received: by 2002:a05:6512:108d:b0:50e:86af:97e3 with SMTP id j13-20020a056512108d00b0050e86af97e3mr5312547lfg.76.1704302104208; Wed, 03 Jan 2024 09:15:04 -0800 (PST) Received: from surface-pro-6.. ([2a00:1370:818c:b32f:ebdc:fd0:376b:8006]) by smtp.gmail.com with ESMTPSA id y23-20020a196417000000b0050e6d84d177sm3546068lfb.279.2024.01.03.09.15.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 03 Jan 2024 09:15:03 -0800 (PST) From: Sergey Bugaev To: libc-alpha@sourceware.org, bug-hurd@gnu.org Cc: Adhemerval Zanella Netto , Helmut Grohne Subject: [RFC PATCH 00/23] aarch64-gnu port Date: Wed, 3 Jan 2024 20:14:33 +0300 Message-ID: <20240103171502.1358371-1-bugaevc@gmail.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Spam-Status: No, score=-4.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.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+incoming=patchwork.ozlabs.org@sourceware.org Hello! This is my work on the aarch64-gnu port, aka GNU/Hurd on 64-bit ARM. To build this, you need an aarch64-gnu toolchain (binutils, GCC, MIG), and GNU Mach headers for AArch64. I have posted the patches for binutils, GCC, and GNU Mach to the bug-hurd mailing list; no patches are required to build aarch64-gnu-mig. glibc fully builds and produces all the exepected libraries (including libmvec) and binaries. It can then be used to build other programs, in particular many core Hurd servers seem to build just fine. There is no AArch64 port of GNU Mach yet; I'm trying to get the ball rolling by making this port of glibc. I have only added some AArch64 headers to GNU Mach, but no actual runnable code. My versions of , (and others) are by no means final, they are more of preliminary sketches of the API so I have something to port glibc against. If there are changes resulting from discussions and (hopefully) an eventual Mach AArch64 port, we'll need to make corresponding changes to glibc. There not being a Mach build means that it's not currently possible to run or test any of this port on a real Mach. It is possible to run simple statically linked executables on Linux (or, I guess, other kernels which use ELF and similar enough ABI wrt how the arguments are placed on the stack) as long as you emulate the syscalls and RPCs in some way. I have done that, and verified that simple statically linked executables in the bootstrap configuration (i.e. without a Hurd exec server, with arguments already placed on the stack by Mach) start up fine. I have also done a quick i686-gnu build (to see if static-start.S or init-first.c changes have broken something), and a statically linked hello world seems to still work as expected. As usual, the disclaimer about me not knowing what I'm doing: I don't! I especially am not at all familiar with AArch64, even less so than with x86_64. I could have done something incredibly stupid; please do review! That being said, these changes seem smaller and a lot less radical than the x86_64 port patchset; they're mostly adding things rather than reworking them, so there is less of a chance to break the x86 targets. Evidently, we've done enough rewrokings and portability fixes (notably, various 64-bit fixes) during the x86_64 port to make it easier to add new ports. This port itself continues this trend somewhat too, with init-first.c now finally becoming only sysdeps/mach/hurd -specific, and HTL gaining support for TLS_DTV_AT_TP. As I said in the previous letter on bug-hurd, the hardware hardening features (BTI, MTE, PAC) are currently "not really supported", but I do want to support them in the future. I'm extremely interested in getting feedback or suggestions about these. For example: what should our API for controlling PAC keys look like, should we just allow userland to read and write all the keys? Are there, for example, any gotchas with BTI that we need to be aware of? Is it possible to start using PAC after initial start-up (once /dev/random becomes available, so PAC keys can be initialized) — how would we do that without crashing on e.g. ret pointers that have not been encrypted? Finally, a couple of words about the page size. My plan is for userland to not assume any static value of page size, and always query it dynamically, unlike on x86, even though GNU Mach will likely be compiled with some fixed value of page size; my understanding is this is also how things are done on GNU/Linux. To that end, I've tried to reduce the reliance on and on EXEC_PAGESIZE being defined. Currently, Mach headers still define *something* named PAGE_SIZE unconditionally, causing __mach_init () to pick it up and use it instead of querying the page size dynamically. We should make sure this does not happen (i.e. should not define PAGE_SIZE on AArch64), this is just something I haven't figured out a nice way to fix yet. Sergey P.S. I have not forgotten about my other unmerged patch series! (Most importantly, O_IGNORE_CTTY everywhere and the fcntl fortification.) I hope to find some time to hack on them, hopefully some time soon. Sergey Bugaev (23): hurd: Add some missing includes hurd: Declare _hurd_intr_rpc_msg* with protected visibility Allow glibc to be compiled without EXEC_PAGESIZE mach: Drop some unnecessary vm_param.h includes hurd: Disable Prefer_MAP_32BIT_EXEC on non-x86_64 for now mach: Drop SNARF_ARGS macro hurd: Pass the data pointer to _hurd_stack_setup explicitly hurd: Drop x86-specific assembly from init-first.c hurd: Make init-first.c no longer x86-specific hurd: Only init early static TLS if it's used to store stack or pointer guards hurd: Initializy _dl_pagesize early in static builds aarch64: Make cpu-features definitions not Linux-specific aarch64: Add dl-procinfo aarch64: Allow building without kernel support for BTI mach: Add a basic AArch64 port hurd: Add a basic AArch64 port hurd: Implement TLS on AArch64 hurd: Implement longjmp for AArch64 Add FPE_FLTIDO hurd: Add an AArch64 signal implementation htl: Implement some support for TLS_DTV_AT_TP htl: Add an AArch64 implementation hurd: Add expected aarch64-gnu abistlists bits/siginfo-consts.h | 4 +- elf/dl-support.c | 6 +- elf/rtld.c | 2 + htl/pt-create.c | 2 + hurd/hurdsig.c | 8 +- libio/libioP.h | 2 +- mach/Makefile | 1 + mach/lowlevellock.h | 1 + mach/setup-thread.c | 1 - .../sysv/linux => }/aarch64/cpu-features.h | 0 sysdeps/aarch64/dl-bti.c | 10 + sysdeps/aarch64/dl-procinfo.c | 59 + sysdeps/aarch64/dl-procinfo.h | 38 + sysdeps/aarch64/htl/Makefile | 20 + sysdeps/aarch64/htl/bits/pthreadtypes-arch.h | 36 + sysdeps/aarch64/htl/machine-sp.h | 29 + sysdeps/aarch64/htl/pt-machdep.h | 28 + sysdeps/aarch64/htl/tcb-offsets.sym | 5 + .../sysv/linux => }/aarch64/libc-start.c | 0 sysdeps/htl/dl-thread_gscope_wait.c | 16 +- sysdeps/hurd/include/hurd.h | 1 + sysdeps/hurd/include/hurd/signal.h | 1 + sysdeps/mach/aarch64/bits/mach/param.h | 24 + sysdeps/mach/aarch64/cpu-features.c | 109 + sysdeps/mach/aarch64/sys/ucontext.h | 73 + sysdeps/mach/aarch64/sysdep.h | 45 + sysdeps/mach/aarch64/thread_state.h | 44 + sysdeps/mach/configure | 1 + sysdeps/mach/configure.ac | 1 + sysdeps/mach/hurd/aarch64/Implies | 3 + sysdeps/mach/hurd/aarch64/Makefile | 24 + sysdeps/mach/hurd/aarch64/____longjmp_chk.S | 173 ++ sysdeps/mach/hurd/aarch64/__longjmp.S | 150 ++ sysdeps/mach/hurd/aarch64/bits/sigcontext.h | 96 + .../mach/hurd/aarch64/dl-tls-initialized.c | 19 + sysdeps/mach/hurd/aarch64/exc2signal.c | 119 + sysdeps/mach/hurd/aarch64/htl/pt-machdep.c | 55 + sysdeps/mach/hurd/aarch64/htl/pt-setup.c | 80 + sysdeps/mach/hurd/aarch64/intr-msg.h | 123 + sysdeps/mach/hurd/aarch64/ld.abilist | 18 + .../mach/hurd/aarch64/libBrokenLocale.abilist | 1 + sysdeps/mach/hurd/aarch64/libanl.abilist | 4 + sysdeps/mach/hurd/aarch64/libc.abilist | 2123 +++++++++++++++++ .../hurd/aarch64/libc_malloc_debug.abilist | 26 + sysdeps/mach/hurd/aarch64/libdl.abilist | 0 sysdeps/mach/hurd/aarch64/libm.abilist | 1030 ++++++++ sysdeps/mach/hurd/aarch64/libmvec.abilist | 75 + sysdeps/mach/hurd/aarch64/libpthread.abilist | 165 ++ sysdeps/mach/hurd/aarch64/libresolv.abilist | 55 + sysdeps/mach/hurd/aarch64/librt.abilist | 33 + sysdeps/mach/hurd/aarch64/longjmp-ts.c | 50 + sysdeps/mach/hurd/aarch64/shlib-versions | 2 + sysdeps/mach/hurd/aarch64/signal-defines.sym | 10 + sysdeps/mach/hurd/aarch64/static-start.S | 52 + sysdeps/mach/hurd/aarch64/tls.h | 206 ++ sysdeps/mach/hurd/aarch64/trampoline.c | 327 +++ sysdeps/mach/hurd/aarch64/vm_param.h | 24 + sysdeps/mach/hurd/dl-sysdep.c | 3 +- sysdeps/mach/hurd/htl/pt-sysdep.c | 9 + sysdeps/mach/hurd/i386/static-start.S | 3 + sysdeps/mach/hurd/{x86 => }/init-first.c | 45 +- sysdeps/mach/hurd/mig-reply.c | 1 + sysdeps/mach/hurd/mmap.c | 2 +- sysdeps/mach/hurd/x86_64/static-start.S | 1 + sysdeps/mach/sysdep.h | 7 - sysdeps/mach/x86/sysdep.h | 14 - 66 files changed, 5639 insertions(+), 56 deletions(-) rename sysdeps/{unix/sysv/linux => }/aarch64/cpu-features.h (100%) create mode 100644 sysdeps/aarch64/dl-procinfo.c create mode 100644 sysdeps/aarch64/dl-procinfo.h create mode 100644 sysdeps/aarch64/htl/Makefile create mode 100644 sysdeps/aarch64/htl/bits/pthreadtypes-arch.h create mode 100644 sysdeps/aarch64/htl/machine-sp.h create mode 100644 sysdeps/aarch64/htl/pt-machdep.h create mode 100644 sysdeps/aarch64/htl/tcb-offsets.sym rename sysdeps/{unix/sysv/linux => }/aarch64/libc-start.c (100%) create mode 100644 sysdeps/mach/aarch64/bits/mach/param.h create mode 100644 sysdeps/mach/aarch64/cpu-features.c create mode 100644 sysdeps/mach/aarch64/sys/ucontext.h create mode 100644 sysdeps/mach/aarch64/sysdep.h create mode 100644 sysdeps/mach/aarch64/thread_state.h create mode 100644 sysdeps/mach/hurd/aarch64/Implies create mode 100644 sysdeps/mach/hurd/aarch64/Makefile create mode 100644 sysdeps/mach/hurd/aarch64/____longjmp_chk.S create mode 100644 sysdeps/mach/hurd/aarch64/__longjmp.S create mode 100644 sysdeps/mach/hurd/aarch64/bits/sigcontext.h create mode 100644 sysdeps/mach/hurd/aarch64/dl-tls-initialized.c create mode 100644 sysdeps/mach/hurd/aarch64/exc2signal.c create mode 100644 sysdeps/mach/hurd/aarch64/htl/pt-machdep.c create mode 100644 sysdeps/mach/hurd/aarch64/htl/pt-setup.c create mode 100644 sysdeps/mach/hurd/aarch64/intr-msg.h create mode 100644 sysdeps/mach/hurd/aarch64/ld.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libBrokenLocale.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libanl.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libc.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libc_malloc_debug.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libdl.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libm.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libmvec.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libpthread.abilist create mode 100644 sysdeps/mach/hurd/aarch64/libresolv.abilist create mode 100644 sysdeps/mach/hurd/aarch64/librt.abilist create mode 100644 sysdeps/mach/hurd/aarch64/longjmp-ts.c create mode 100644 sysdeps/mach/hurd/aarch64/shlib-versions create mode 100644 sysdeps/mach/hurd/aarch64/signal-defines.sym create mode 100644 sysdeps/mach/hurd/aarch64/static-start.S create mode 100644 sysdeps/mach/hurd/aarch64/tls.h create mode 100644 sysdeps/mach/hurd/aarch64/trampoline.c create mode 100644 sysdeps/mach/hurd/aarch64/vm_param.h rename sysdeps/mach/hurd/{x86 => }/init-first.c (87%)