2.8 KiB
title | category | layout | SPDX-License-Identifier |
---|---|---|---|
Porting to New Architectures | Contributing | default | LGPL-2.1-or-later |
Porting systemd to New Architectures
Here's a brief checklist of things to implement when porting systemd to a new architecture.
-
Patch src/basic/architecture.h and src/basic/architecture.c to make your architecture known to systemd. Besides an
ARCHITECTURE_XYZ
enumeration entry you need to provide an implementation ofnative_architecture()
anduname_architecture()
. -
Patch src/shared/gpt.h and src/shared/gpt.c and define a new set of GPT partition type UUIDs for the root file system,
/usr/
file system, and the matching Verity and Verity signature partitions. Usesystemd-id128 new -p
to generate new suitable UUIDs you can use for this. Make sure to register your new types in the various functions ingpt.c
. Also make sure to update the tables in Discoverable Partitions Specification andman/systemd-gpt-auto-generator.xml
accordingly. -
If your architecture supports UEFI, make sure to update the
efi_arch
variable logic inmeson.build
to be set to the right architecture string as defined by the UEFI specification. (This ensures thatsystemd-boot
will be built as the appropriately namedBOOT<arch>.EFI
binary.) Also, if your architecture uses a special boot protocol for the Linux kernel make sure to implement it insrc/boot/efi/linux*.c
, so that thesystemd-stub
EFI stub can work. -
Make sure to register the right system call numbers for your architecture in
src/basic/missing_syscall_def.h
. systemd uses various system calls the Linux kernel provides that are currently not wrapped by glibc (or are only in very new glibc), and we need to know the right numbers for them. It might also be necessary to tweaksrc/basic/raw-clone.h
. -
Make sure the code in
src/shared/seccomp-util.c
properly understands the local architecture and its system call quirks. -
If your architecture uses a
/lib64/
library directory, then make sure that theBaseFilesystem
table insrc/shared/base-filesystem.c
has an entry for it so that it can be set up automatically if missing. This is useful to support booting into OS trees that have an empty root directory with only/usr/
mounted in. -
If your architecture supports VM virtualization and provides CPU opcodes similar to x86' CPUID consider adding native support for detecting VMs this way to
src/basic/virt.c
.