From 7b43a753e346a0f16bef2b4db2ed71bac0ae25de Mon Sep 17 00:00:00 2001 From: Denis 'GNUtoo' Carikli Date: Fri, 22 May 2020 01:42:51 +0200 Subject: libre: add linux-libre-64 to replace archtecture specific versions Signed-off-by: Denis 'GNUtoo' Carikli --- ...ock-partitions-efi-Add-support-for-IGNORE.patch | 139 +++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 libre/linux-libre-64/0001-CHROMIUM-block-partitions-efi-Add-support-for-IGNORE.patch (limited to 'libre/linux-libre-64/0001-CHROMIUM-block-partitions-efi-Add-support-for-IGNORE.patch') diff --git a/libre/linux-libre-64/0001-CHROMIUM-block-partitions-efi-Add-support-for-IGNORE.patch b/libre/linux-libre-64/0001-CHROMIUM-block-partitions-efi-Add-support-for-IGNORE.patch new file mode 100644 index 000000000..46ebe72ea --- /dev/null +++ b/libre/linux-libre-64/0001-CHROMIUM-block-partitions-efi-Add-support-for-IGNORE.patch @@ -0,0 +1,139 @@ +From 2b4a8bfd9379fd9431d517e4db20c57468ecf3e6 Mon Sep 17 00:00:00 2001 +From: Julius Werner +Date: Wed, 20 Apr 2016 15:20:00 -0700 +Subject: [PATCH] CHROMIUM: block: partitions: efi: Add support for IGNOREME + GPT signature + +This patch adds support for a special GPT header signature marker (using +the string 'IGNOREME' instead of the spec's 'EFI PART'). This tells the +kernel to ignore this GPT completely and look at the other one instead. +Since the kernel always prefers the primary GPT anyway, all we really +need to do effectively is to check whether the primary GPT is marked +'IGNOREME' and force evaluation of the secondary one in that case. + +Signed-off-by: Julius Werner +Reviewed-on: https://chromium-review.googlesource.com/340080 +Reviewed-by: Gwendal Grignou + +An earlier attempt to upstream an alternative solution: +https://patchwork.kernel.org/patch/8933841/ + +mka@: added missing param 'lba' to log message and resolved minor +conflicts. + +BUG=chromium:941638, chrome-os-partner:52595 +TEST=Booted on Minnie with 'IGNOREME' primary GPT + +Change-Id: Ibaee639fac9fa2f04b8836ef153c95b7d0b045a4 +Signed-off-by: Matthias Kaehlcke +Reviewed-on: https://chromium-review.googlesource.com/1531701 +Reviewed-by: Douglas Anderson +Reviewed-by: Julius Werner +--- + block/partitions/efi.c | 31 ++++++++++++++++++++++--------- + block/partitions/efi.h | 3 ++- + 2 files changed, 24 insertions(+), 10 deletions(-) + +diff --git a/block/partitions/efi.c b/block/partitions/efi.c +index db2fef7dfc47..90103e0471c4 100644 +--- a/block/partitions/efi.c ++++ b/block/partitions/efi.c +@@ -330,23 +330,33 @@ static gpt_header *alloc_read_gpt_header(struct parsed_partitions *state, + * @lba: logical block address of the GPT header to test + * @gpt: GPT header ptr, filled on return. + * @ptes: PTEs ptr, filled on return. ++ * @ignored is filled on return with 1 if this is an IGNOREME GPT, ++ * 0 otherwise. May be NULL. + * + * Description: returns 1 if valid, 0 on error. + * If valid, returns pointers to newly allocated GPT header and PTEs. + */ + static int is_gpt_valid(struct parsed_partitions *state, u64 lba, +- gpt_header **gpt, gpt_entry **ptes) ++ gpt_header **gpt, gpt_entry **ptes, int *ignored) + { + u32 crc, origcrc; + u64 lastlba, pt_size; + ++ if (ignored) ++ *ignored = 0; + if (!ptes) + return 0; + if (!(*gpt = alloc_read_gpt_header(state, lba))) + return 0; + + /* Check the GUID Partition Table signature */ +- if (le64_to_cpu((*gpt)->signature) != GPT_HEADER_SIGNATURE) { ++ if (le64_to_cpu((*gpt)->signature) == GPT_HEADER_SIGNATURE_IGNORED) { ++ pr_debug("GUID Partition Table at LBA %llu marked IGNOREME\n", ++ lba); ++ if (ignored) ++ *ignored = 1; ++ goto fail; ++ } else if (le64_to_cpu((*gpt)->signature) != GPT_HEADER_SIGNATURE) { + pr_debug("GUID Partition Table Header signature is wrong:" + "%lld != %lld\n", + (unsigned long long)le64_to_cpu((*gpt)->signature), +@@ -583,7 +593,7 @@ compare_gpts(gpt_header *pgpt, gpt_header *agpt, u64 lastlba) + static int find_valid_gpt(struct parsed_partitions *state, gpt_header **gpt, + gpt_entry **ptes) + { +- int good_pgpt = 0, good_agpt = 0, good_pmbr = 0; ++ int good_pgpt = 0, good_agpt = 0, good_pmbr = 0, pgpt_ignored = 0; + gpt_header *pgpt = NULL, *agpt = NULL; + gpt_entry *pptes = NULL, *aptes = NULL; + legacy_mbr *legacymbr; +@@ -613,19 +623,21 @@ static int find_valid_gpt(struct parsed_partitions *state, gpt_header **gpt, + } + + good_pgpt = is_gpt_valid(state, GPT_PRIMARY_PARTITION_TABLE_LBA, +- &pgpt, &pptes); ++ &pgpt, &pptes, &pgpt_ignored); + if (good_pgpt) + good_agpt = is_gpt_valid(state, + le64_to_cpu(pgpt->alternate_lba), +- &agpt, &aptes); +- if (!good_agpt && force_gpt) +- good_agpt = is_gpt_valid(state, lastlba, &agpt, &aptes); ++ &agpt, &aptes, NULL); ++ ++ if (!good_agpt && (force_gpt || pgpt_ignored)) ++ good_agpt = is_gpt_valid(state, lastlba, &agpt, &aptes, NULL); + + /* The obviously unsuccessful case */ + if (!good_pgpt && !good_agpt) + goto fail; + +- compare_gpts(pgpt, agpt, lastlba); ++ if (!pgpt_ignored) ++ compare_gpts(pgpt, agpt, lastlba); + + /* The good cases */ + if (good_pgpt) { +@@ -642,7 +654,8 @@ static int find_valid_gpt(struct parsed_partitions *state, gpt_header **gpt, + *ptes = aptes; + kfree(pgpt); + kfree(pptes); +- pr_warn("Primary GPT is invalid, using alternate GPT.\n"); ++ pr_warn("Primary GPT is %s, using alternate GPT.\n", ++ pgpt_ignored ? "being ignored" : "invalid"); + return 1; + } + +diff --git a/block/partitions/efi.h b/block/partitions/efi.h +index 3e8576157575..260c24c54750 100644 +--- a/block/partitions/efi.h ++++ b/block/partitions/efi.h +@@ -27,7 +27,8 @@ + #define GPT_MBR_PROTECTIVE 1 + #define GPT_MBR_HYBRID 2 + +-#define GPT_HEADER_SIGNATURE 0x5452415020494645ULL ++#define GPT_HEADER_SIGNATURE 0x5452415020494645ULL /* 'EFI PART' */ ++#define GPT_HEADER_SIGNATURE_IGNORED 0x454d45524f4e4749ULL /* 'IGNOREME' */ + #define GPT_HEADER_REVISION_V1 0x00010000 + #define GPT_PRIMARY_PARTITION_TABLE_LBA 1 + +-- +2.25.0 + -- cgit v1.2.3