[PATCH] tplink-safeloader: Patch to handle partitions with alternate names.
oklo at oklona.net
oklo at oklona.net
Mon May 2 09:24:24 PDT 2022
From: Ole Kristian Lona <oklo at oklona.net>
Some devices, specifically Deco M4R-v3 / M5. These devices have
fallback partitions which will be used in case the device
determines that the primary partition set is unbootable.
Signed-off-by: Ole Kristian Lona <oklo at oklona.net>
---
src/tplink-safeloader.c | 67 +++++++++++++++++++++++++++++++++--------
1 file changed, 55 insertions(+), 12 deletions(-)
diff --git a/src/tplink-safeloader.c b/src/tplink-safeloader.c
index fc46124..0ddbc02 100644
--- a/src/tplink-safeloader.c
+++ b/src/tplink-safeloader.c
@@ -53,6 +53,15 @@ struct flash_partition_entry {
uint32_t size;
};
+/** Flash partition names table entry */
+struct factory_partition_names {
+ const char *partition_table;
+ const char *soft_ver;
+ const char *os_image;
+ const char *file_system;
+ const char *extra_para;
+};
+
/** Partition trailing padding definitions
* Values 0x00 to 0xff are reserved to indicate the padding value
* Values from 0x100 are reserved to indicate other behaviour */
@@ -89,6 +98,7 @@ struct device_info {
struct flash_partition_entry partitions[MAX_PARTITIONS+1];
const char *first_sysupgrade_partition;
const char *last_sysupgrade_partition;
+ struct factory_partition_names partition_names;
};
#define SOFT_VER_TEXT(_t) {.type = SOFT_VER_TYPE_TEXT, .text = _t}
@@ -2982,8 +2992,10 @@ static void set_source_date_epoch() {
}
/** Generates the partition-table partition */
-static struct image_partition_entry make_partition_table(const struct flash_partition_entry *p) {
- struct image_partition_entry entry = alloc_image_partition("partition-table", 0x800);
+static struct image_partition_entry make_partition_table(const char *name,
+ const struct flash_partition_entry *p)
+{
+ struct image_partition_entry entry = alloc_image_partition(name, 0x800);
char *s = (char *)entry.data, *end = (char *)(s+entry.size);
@@ -3018,14 +3030,14 @@ static inline uint8_t bcd(uint8_t v) {
/** Generates the soft-version partition */
-static struct image_partition_entry make_soft_version(
+static struct image_partition_entry make_soft_version(const char *name,
const struct device_info *info, uint32_t rev)
{
/** If an info string is provided, use this instead of
* the structured data, and include the null-termination */
if (info->soft_ver.type == SOFT_VER_TYPE_TEXT) {
uint32_t len = strlen(info->soft_ver.text) + 1;
- return init_meta_partition_entry("soft-version",
+ return init_meta_partition_entry(name,
info->soft_ver.text, len, info->part_trail);
}
@@ -3055,11 +3067,11 @@ static struct image_partition_entry make_soft_version(
};
if (info->soft_ver_compat_level == 0)
- return init_meta_partition_entry("soft-version", &s,
+ return init_meta_partition_entry(name, &s,
(uint8_t *)(&s.compat_level) - (uint8_t *)(&s),
info->part_trail);
else
- return init_meta_partition_entry("soft-version", &s,
+ return init_meta_partition_entry(name, &s,
sizeof(s), info->part_trail);
}
@@ -3306,6 +3318,8 @@ static void build_image(const char *output,
struct flash_partition_entry *os_image_partition = NULL;
struct flash_partition_entry *file_system_partition = NULL;
size_t firmware_partition_index = 0;
+ char fs_name[32];
+ char os_name[32];
for (i = 0; info->partitions[i].name; i++) {
if (!strcmp(info->partitions[i].name, "firmware"))
@@ -3330,7 +3344,13 @@ static void build_image(const char *output,
for (i = MAX_PARTITIONS-1; i >= firmware_partition_index + 1; i--)
info->partitions[i+1] = info->partitions[i];
- file_system_partition->name = "file-system";
+ if (info->partition_names.file_system == NULL)
+ file_system_partition->name = "file-system";
+ else {
+ strcpy(fs_name, info->partition_names.file_system);
+ file_system_partition->name = fs_name;
+ }
+
file_system_partition->base = firmware_partition->base + kernel.st_size;
/* Align partition start to erase blocks for factory images only */
@@ -3339,15 +3359,38 @@ static void build_image(const char *output,
file_system_partition->size = firmware_partition->size - file_system_partition->base;
- os_image_partition->name = "os-image";
+ if (info->partition_names.os_image == NULL)
+ os_image_partition->name = "os-image";
+ else {
+ strcpy(os_name, info->partition_names.os_image);
+ os_image_partition->name = os_name;
+ }
+
os_image_partition->size = kernel.st_size;
}
- parts[0] = make_partition_table(info->partitions);
- parts[1] = make_soft_version(info, rev);
+ if (info->partition_names.partition_table == NULL)
+ parts[0] = make_partition_table("partition-table", info->partitions);
+ else
+ parts[0] = make_partition_table(info->partition_names.partition_table, info->partitions);
+
+ if (info->partition_names.soft_ver == NULL)
+ parts[1] = make_soft_version("soft-version", info, rev);
+ else
+ parts[1] = make_soft_version(info->partition_names.soft_ver, info, rev);
+
parts[2] = make_support_list(info);
- parts[3] = read_file("os-image", kernel_image, false, NULL);
- parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof, file_system_partition);
+
+ if (info->partition_names.os_image == NULL)
+ parts[3] = read_file("os-image", kernel_image, false, NULL);
+ else
+ parts[3] = read_file(info->partition_names.os_image, kernel_image, false, NULL);
+
+ if (info->partition_names.file_system == NULL)
+ parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof, file_system_partition);
+ else
+ parts[4] = read_file(info->partition_names.file_system, rootfs_image, add_jffs2_eof, file_system_partition);
+
/* Some devices need the extra-para partition to accept the firmware */
if (strcasecmp(info->id, "ARCHER-A6-V3") == 0 ||
--
2.32.0
More information about the openwrt-devel
mailing list