]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
gpt: Store the architecture in GptPartitionType
authorDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 23 Nov 2021 16:52:27 +0000 (17:52 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 24 Nov 2021 13:47:21 +0000 (14:47 +0100)
We also add a function gpt_partition_type_uuid_to_arch() to get the
architecture of a partition type uuid.

src/shared/gpt.c
src/shared/gpt.h
src/test/test-gpt.c

index 87b893beed780695d79c385957c34fa0eb700131..75324b0fe39223b4f1ab4f75e73d6010b9ff1308 100644 (file)
 #endif
 
 #define _GPT_ARCH_SEXTET(arch, name)                                   \
-        { GPT_ROOT_##arch,              "root-" name               },  \
-        { GPT_ROOT_##arch##_VERITY,     "root-" name "-verity"     },  \
-        { GPT_ROOT_##arch##_VERITY_SIG, "root-" name "-verity-sig" },  \
-        { GPT_USR_##arch,               "usr-" name                },  \
-        { GPT_USR_##arch##_VERITY,      "usr-" name "-verity"      },  \
-        { GPT_USR_##arch##_VERITY_SIG,  "usr-" name "-verity-sig"  }
+        { GPT_ROOT_##arch,              "root-" name,               ARCHITECTURE_##arch },  \
+        { GPT_ROOT_##arch##_VERITY,     "root-" name "-verity",     ARCHITECTURE_##arch },  \
+        { GPT_ROOT_##arch##_VERITY_SIG, "root-" name "-verity-sig", ARCHITECTURE_##arch },  \
+        { GPT_USR_##arch,               "usr-" name,                ARCHITECTURE_##arch },  \
+        { GPT_USR_##arch##_VERITY,      "usr-" name "-verity",      ARCHITECTURE_##arch },  \
+        { GPT_USR_##arch##_VERITY_SIG,  "usr-" name "-verity-sig",  ARCHITECTURE_##arch }
 
 const GptPartitionType gpt_partition_type_table[] = {
         _GPT_ARCH_SEXTET(ALPHA,       "alpha"),
@@ -28,7 +28,16 @@ const GptPartitionType gpt_partition_type_table[] = {
         _GPT_ARCH_SEXTET(ARM,         "arm"),
         _GPT_ARCH_SEXTET(ARM64,       "arm64"),
         _GPT_ARCH_SEXTET(IA64,        "ia64"),
-        _GPT_ARCH_SEXTET(LOONGARCH64, "loongarch64"),
+
+        // TODO: Replace with `_GPT_ARCH_SEXTET(LOONGARCH64, "loongarch64")` once
+        // https://github.com/systemd/systemd/pull/21288 is merged. */
+        { GPT_ROOT_LOONGARCH64,            "root-loongarch64",            _ARCHITECTURE_INVALID },
+        { GPT_ROOT_LOONGARCH64_VERITY,     "root-loongarch64-verity",     _ARCHITECTURE_INVALID },
+        { GPT_ROOT_LOONGARCH64_VERITY_SIG, "root-loongarch64-verity-sig", _ARCHITECTURE_INVALID },
+        { GPT_USR_LOONGARCH64,             "usr-loongarch64",             _ARCHITECTURE_INVALID },
+        { GPT_USR_LOONGARCH64_VERITY,      "usr-loongarch64-verity",      _ARCHITECTURE_INVALID },
+        { GPT_USR_LOONGARCH64_VERITY_SIG,  "usr-loongarch64-verity-sig",  _ARCHITECTURE_INVALID },
+
         _GPT_ARCH_SEXTET(MIPS_LE,     "mips-le"),
         _GPT_ARCH_SEXTET(MIPS64_LE,   "mips64-le"),
         _GPT_ARCH_SEXTET(PPC,         "ppc"),
@@ -42,26 +51,26 @@ const GptPartitionType gpt_partition_type_table[] = {
         _GPT_ARCH_SEXTET(X86,         "x86"),
         _GPT_ARCH_SEXTET(X86_64,      "x86-64"),
 #ifdef GPT_ROOT_NATIVE
-        { GPT_ROOT_NATIVE,            "root"                       },
-        { GPT_ROOT_NATIVE_VERITY,     "root-verity"                },
-        { GPT_ROOT_NATIVE_VERITY_SIG, "root-verity-sig"            },
-        { GPT_USR_NATIVE,             "usr"                        },
-        { GPT_USR_NATIVE_VERITY,      "usr-verity"                 },
-        { GPT_USR_NATIVE_VERITY_SIG,  "usr-verity-sig"             },
+        { GPT_ROOT_NATIVE,            "root",            native_architecture() },
+        { GPT_ROOT_NATIVE_VERITY,     "root-verity",     native_architecture() },
+        { GPT_ROOT_NATIVE_VERITY_SIG, "root-verity-sig", native_architecture() },
+        { GPT_USR_NATIVE,             "usr",             native_architecture() },
+        { GPT_USR_NATIVE_VERITY,      "usr-verity",      native_architecture() },
+        { GPT_USR_NATIVE_VERITY_SIG,  "usr-verity-sig",  native_architecture() },
 #endif
 #ifdef GPT_ROOT_SECONDARY
         _GPT_ARCH_SEXTET(SECONDARY,   "secondary"),
 #endif
 
-        { GPT_ESP,                    "esp"                        },
-        { GPT_XBOOTLDR,               "xbootldr"                   },
-        { GPT_SWAP,                   "swap"                       },
-        { GPT_HOME,                   "home"                       },
-        { GPT_SRV,                    "srv"                        },
-        { GPT_VAR,                    "var"                        },
-        { GPT_TMP,                    "tmp"                        },
-        { GPT_USER_HOME,              "user-home"                  },
-        { GPT_LINUX_GENERIC,          "linux-generic"              },
+        { GPT_ESP,                    "esp",           _ARCHITECTURE_INVALID },
+        { GPT_XBOOTLDR,               "xbootldr",      _ARCHITECTURE_INVALID },
+        { GPT_SWAP,                   "swap",          _ARCHITECTURE_INVALID },
+        { GPT_HOME,                   "home",          _ARCHITECTURE_INVALID },
+        { GPT_SRV,                    "srv",           _ARCHITECTURE_INVALID },
+        { GPT_VAR,                    "var",           _ARCHITECTURE_INVALID },
+        { GPT_TMP,                    "tmp",           _ARCHITECTURE_INVALID },
+        { GPT_USER_HOME,              "user-home",     _ARCHITECTURE_INVALID },
+        { GPT_LINUX_GENERIC,          "linux-generic", _ARCHITECTURE_INVALID },
         {}
 };
 
@@ -121,6 +130,14 @@ int gpt_partition_type_uuid_from_string(const char *s, sd_id128_t *ret) {
         return sd_id128_from_string(s, ret);
 }
 
+Architecture gpt_partition_type_uuid_to_arch(sd_id128_t id) {
+        for (size_t i = 0; i < ELEMENTSOF(gpt_partition_type_table) - 1; i++)
+                if (sd_id128_equal(id, gpt_partition_type_table[i].uuid))
+                        return gpt_partition_type_table[i].arch;
+
+        return _ARCHITECTURE_INVALID;
+}
+
 int gpt_partition_label_valid(const char *s) {
         _cleanup_free_ char16_t *recoded = NULL;
 
index fb9fb4854609334cb0c6b72fa032bfae05b63988..9b335d02aa48be00dec42d96b77d18e6cf3210bb 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "sd-id128.h"
 
+#include "architecture.h"
 #include "id128-util.h"
 
 #define GPT_ROOT_ALPHA       SD_ID128_MAKE(65,23,f8,ae,3e,b1,4e,2a,a0,5a,18,b6,95,ae,65,6f)
@@ -288,9 +289,12 @@ const char *gpt_partition_type_uuid_to_string_harder(
                 char buffer[static ID128_UUID_STRING_MAX]);
 int gpt_partition_type_uuid_from_string(const char *s, sd_id128_t *ret);
 
+Architecture gpt_partition_type_uuid_to_arch(sd_id128_t id);
+
 typedef struct GptPartitionType {
         sd_id128_t uuid;
         const char *name;
+        Architecture arch;
 } GptPartitionType;
 
 extern const GptPartitionType gpt_partition_type_table[];
index 7ee044ba50c4fbebee4cf41ad6cab5293f289889..6fa546de2ad55a9dc1c2d22aceec235380f9b4ab 100644 (file)
@@ -47,6 +47,8 @@ static void test_gpt_types_against_architectures(void) {
                                         assert_se(gpt_partition_type_is_usr(id));
                                 if (streq(prefix, "usr-") && streq(suffix, "-verity"))
                                         assert_se(gpt_partition_type_is_usr_verity(id));
+
+                                assert_se(gpt_partition_type_uuid_to_arch(id) == a);
                         }
                 }
 }