gpt/DPS: alias amd64 to x86-64 and aarch64 to arm64

The DSP and our implementation mixes Debian terminology with CPU
terminology. It uses arm64 which is a Debian thing instead of
aarch64, but x86-64 which is a CPU thing instead of amd64.
Add some convenience and transparent aliasing, so that we don't
need to maintain architecture-specific and tool-specific translation
layers in mkosi among other places, while at the same time the DDIs
still look the same (ie: the partlabel does not change depending on
which alias is used, the canonical label is used on disk).
This commit is contained in:
Luca Boccassi
2023-05-26 18:33:35 +01:00
committed by Luca Boccassi
parent 719771adca
commit 08a2bb7b82
+21 -7
View File
@@ -125,11 +125,21 @@ DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(partition_mountpoint, PartitionDesi
{ SD_GPT_USR_##arch##_VERITY, "usr-" name "-verity", ARCHITECTURE_##arch, .designator = PARTITION_USR_VERITY }, \
{ SD_GPT_USR_##arch##_VERITY_SIG, "usr-" name "-verity-sig", ARCHITECTURE_##arch, .designator = PARTITION_USR_VERITY_SIG }
/* Two special cases: alias aarch64 to arm64, and amd64 to x86-64. The DSP mixes debianisms and CPUisms: for
* x86, it uses x86 and x86_64, but for aarch64 it uses arm64. This is confusing, and leads to issues for
* callers that have to know which -ism to use for which architecture. But we also don't really want to
* change the spec and add new partition labels, so add a user-friendly aliasing here, so that both are
* accepted but the end result on disk (ie: the partition label).
* So always list the canonical name FIRST, and then any aliases later, so that we can match on aliases,
* but always return the canonical name. And never return directly a match on the name, always re-resolve
* by UUID so that the canonical entry is always found. */
const GptPartitionType gpt_partition_type_table[] = {
_GPT_ARCH_SEXTET(ALPHA, "alpha"),
_GPT_ARCH_SEXTET(ARC, "arc"),
_GPT_ARCH_SEXTET(ARM, "arm"),
_GPT_ARCH_SEXTET(ARM64, "arm64"),
_GPT_ARCH_SEXTET(ARM64, "aarch64"), /* Alias: must be listed after arm64 */
_GPT_ARCH_SEXTET(IA64, "ia64"),
_GPT_ARCH_SEXTET(LOONGARCH64, "loongarch64"),
_GPT_ARCH_SEXTET(MIPS_LE, "mips-le"),
@@ -145,6 +155,7 @@ const GptPartitionType gpt_partition_type_table[] = {
_GPT_ARCH_SEXTET(TILEGX, "tilegx"),
_GPT_ARCH_SEXTET(X86, "x86"),
_GPT_ARCH_SEXTET(X86_64, "x86-64"),
_GPT_ARCH_SEXTET(X86_64, "amd64"), /* Alias: must be listed after x86-64 */
#ifdef SD_GPT_ROOT_NATIVE
{ SD_GPT_ROOT_NATIVE, "root", native_architecture(), .designator = PARTITION_ROOT },
{ SD_GPT_ROOT_NATIVE_VERITY, "root-verity", native_architecture(), .designator = PARTITION_ROOT_VERITY },
@@ -209,21 +220,24 @@ const char *gpt_partition_type_uuid_to_string_harder(
}
int gpt_partition_type_from_string(const char *s, GptPartitionType *ret) {
sd_id128_t id;
sd_id128_t id = SD_ID128_NULL;
int r;
assert(s);
for (size_t i = 0; i < ELEMENTSOF(gpt_partition_type_table) - 1; i++)
if (streq(s, gpt_partition_type_table[i].name)) {
if (ret)
*ret = gpt_partition_type_table[i];
return 0;
/* Don't return immediately, instead re-resolve by UUID so that we can support
* aliases like aarch64 -> arm64 transparently. */
id = gpt_partition_type_table[i].uuid;
break;
}
r = sd_id128_from_string(s, &id);
if (r < 0)
return r;
if (sd_id128_is_null(id)) {
r = sd_id128_from_string(s, &id);
if (r < 0)
return r;
}
if (ret)
*ret = gpt_partition_type_from_uuid(id);