summaryrefslogtreecommitdiff
path: root/firmware/common/multiboot.c
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-12-22 20:31:06 +0000
committerAidan MacDonald <amachronic@protonmail.com>2024-03-31 16:57:19 +0100
commitdc9d354ed22b4c6230c6bfe885e8a3d2519b1285 (patch)
treeae7e82354a3599bf3bb24cc25b341ba94d235375 /firmware/common/multiboot.c
parent6ffd42548bf10cda13a01555ff4fa56d4213cdf2 (diff)
downloadrockbox-dc9d354ed22b4c6230c6bfe885e8a3d2519b1285.tar.gz
rockbox-dc9d354ed22b4c6230c6bfe885e8a3d2519b1285.zip
multiboot: Add v1 boot protocol
v1 passes the drive and partition number of the boot volume instead of using the volume number. The volume number isn't reliable because the same filesystem might get a different volume number once the firmware is loaded, which will cause the firmware to use the wrong root volume and fail to locate the correct .rockbox directory. Using drive and partition numbers avoids this issue because drive numbering is fixed and determined by the target. Change-Id: I7e68b892d9424a1f686197a6122e139b438e5f7e
Diffstat (limited to 'firmware/common/multiboot.c')
-rw-r--r--firmware/common/multiboot.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/firmware/common/multiboot.c b/firmware/common/multiboot.c
index c292aa1c30..8d6573d2dd 100644
--- a/firmware/common/multiboot.c
+++ b/firmware/common/multiboot.c
@@ -23,6 +23,7 @@
23#include "crc32.h" 23#include "crc32.h"
24#include "loader_strerror.h" 24#include "loader_strerror.h"
25#include "file.h" 25#include "file.h"
26#include "disk.h"
26#include <string.h> 27#include <string.h>
27#include <stdio.h> 28#include <stdio.h>
28 29
@@ -30,10 +31,20 @@ static void write_bootdata_v0(struct boot_data_t *data, unsigned int boot_volume
30{ 31{
31 memset(data->payload, data->length, 0); 32 memset(data->payload, data->length, 0);
32 33
33 data->boot_volume = boot_volume; 34 data->_boot_volume = boot_volume;
34 data->version = 0; 35 data->version = 0;
35} 36}
36 37
38static void write_bootdata_v1(struct boot_data_t *data, unsigned int boot_volume)
39{
40 memset(data->payload, data->length, 0);
41
42 data->_boot_volume = 0xff;
43 data->version = 1;
44 data->boot_drive = volume_drive(boot_volume);
45 data->boot_partition = volume_partition(boot_volume);
46}
47
37/* Write bootdata into location in FIRMWARE marked by magic header 48/* Write bootdata into location in FIRMWARE marked by magic header
38 * Assumes buffer is already loaded with the firmware image 49 * Assumes buffer is already loaded with the firmware image
39 * We just need to find the location and write data into the 50 * We just need to find the location and write data into the
@@ -68,6 +79,8 @@ bool write_bootdata(unsigned char* buf, int len, unsigned int boot_volume)
68 /* Write boot data according to the selected protocol */ 79 /* Write boot data according to the selected protocol */
69 if (proto_version == 0) 80 if (proto_version == 0)
70 write_bootdata_v0(data, boot_volume); 81 write_bootdata_v0(data, boot_volume);
82 else if (proto_version == 1)
83 write_bootdata_v1(data, boot_volume);
71 else 84 else
72 break; 85 break;
73 86