1---
2title: Porting to New Architectures
3category: Contributing
4layout: default
5SPDX-License-Identifier: LGPL-2.1-or-later
6---
7
8# Porting systemd to New Architectures
9
10Here's a brief checklist of things to implement when porting systemd to a new
11architecture.
12
131. Patch
14   [src/basic/architecture.h](https://github.com/systemd/systemd/blob/main/src/basic/architecture.h)
15   and
16   [src/basic/architecture.c](https://github.com/systemd/systemd/blob/main/src/basic/architecture.c)
17   to make your architecture known to systemd. Besides an `ARCHITECTURE_XYZ`
18   enumeration entry you need to provide an implementation of
19   `native_architecture()` and `uname_architecture()`.
20
212. Patch
22   [src/shared/gpt.h](https://github.com/systemd/systemd/blob/main/src/shared/gpt.h)
23   and
24   [src/shared/gpt.c](https://github.com/systemd/systemd/blob/main/src/shared/gpt.c)
25   and define a new set of GPT partition type UUIDs for the root file system,
26   `/usr/` file system, and the matching Verity and Verity signature
27   partitions. Use `systemd-id128 new -p` to generate new suitable UUIDs you
28   can use for this. Make sure to register your new types in the various
29   functions in `gpt.c`. Also make sure to update the tables in
30   `docs/DISCOVERABLE_PARTITIONS.md` and `man/systemd-gpt-auto-generator.xml`
31   accordingly.
32
333. If your architecture supports UEFI, make sure to update the `efi_arch`
34   variable logic in `meson.build` to be set to the right architecture string
35   as defined by the UEFI specification. (This ensures that `systemd-boot` will
36   be built as the appropriately named `BOOT<arch>.EFI` binary.) Also, if your
37   architecture uses a special boot protocol for the Linux kernel make sure to
38   implement it in `src/boot/efi/linux*.c`, so that the `systemd-stub` EFI stub
39   can work.
40
414. Make sure to register the right system call numbers for your architecture in
42   `src/basic/missing_syscall_def.h`. systemd uses various system calls the
43   Linux kernel provides that are currently not wrapped by glibc (or are only
44   in very new glibc), and we need to know the right numbers for them. It might
45   also be necessary to tweak `src/basic/raw-clone.h`.
46
475. Make sure the code in `src/shared/seccomp-util.c` properly understands the
48   local architecture and its system call quirks.
49
506. If your architecture uses a `/lib64/` library directory, then make sure that
51   the `BaseFilesystem` table in `src/shared/base-filesystem.c` has an entry
52   for it so that it can be set up automatically if missing. This is useful to
53   support booting into OS trees that have an empty root directory with only
54   `/usr/` mounted in.
55
567. If your architecture supports VM virtualization and provides CPU opcodes
57   similar to x86' CPUID consider adding native support for detecting VMs this
58   way to `src/basic/virt.c`.
59