[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH 00/23] aarch64-gnu port

From: Sergey Bugaev
Subject: [RFC PATCH 00/23] aarch64-gnu port
Date: Wed, 3 Jan 2024 20:14:33 +0300


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
<mach/aarch64/exception.h>, <mach/aarch64/thread_status.h> (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

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 <mach/vm_param.h> 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. <mach/vm_param.h> should not define PAGE_SIZE on AArch64),
this is just something I haven't figured out a nice way to fix yet.


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
  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%)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]