Skip to content

Commit fc86263

Browse files
committed
Add "volume" option to boot images from other partitions
1 parent 987c504 commit fc86263

File tree

5 files changed

+79
-1
lines changed

5 files changed

+79
-1
lines changed

boot.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,7 @@ static VOID config_entry_add_from_file(
12891289
entry = AllocatePool(sizeof(ConfigEntry));
12901290

12911291
*entry = (ConfigEntry) {
1292+
.device = device,
12921293
.tries_done = (UINTN) -1,
12931294
.tries_left = (UINTN) -1,
12941295
};
@@ -1375,6 +1376,17 @@ static VOID config_entry_add_from_file(
13751376

13761377
continue;
13771378
}
1379+
1380+
if (strcmpa((CHAR8 *)"volume", key) == 0) {
1381+
EFI_GUID volume;
1382+
EFI_HANDLE *new;
1383+
if (EFI_ERROR(parse_guid(value, &volume)))
1384+
continue;
1385+
if (EFI_ERROR(disk_find_by_part_uuid(&new, &volume)))
1386+
continue;
1387+
1388+
entry->device = new;
1389+
}
13781390
}
13791391

13801392
if (entry->type == LOADER_UNDEFINED) {
@@ -1396,7 +1408,6 @@ static VOID config_entry_add_from_file(
13961408
}
13971409
}
13981410

1399-
entry->device = device;
14001411
entry->id = StrDuplicate(file);
14011412
len = StrLen(entry->id);
14021413
/* remove ".conf" */

disk.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,19 @@ EFI_STATUS disk_get_part_uuid(EFI_HANDLE *handle, CHAR16 uuid[static 37]) {
3333

3434
return EFI_NOT_FOUND;
3535
}
36+
37+
EFI_STATUS disk_find_by_part_uuid(EFI_HANDLE **handle, EFI_GUID *guid) {
38+
UINTN handle_no;
39+
_cleanup_freepool_ EFI_HANDLE *handles = NULL;
40+
EFI_STATUS err = LibLocateHandleByDiskSignature(
41+
MBR_TYPE_EFI_PARTITION_TABLE_HEADER, SIGNATURE_TYPE_GUID,
42+
guid, &handle_no, &handles);
43+
if (EFI_ERROR(err))
44+
return err;
45+
46+
if (handle_no == 0)
47+
return EFI_NOT_FOUND;
48+
49+
*handle = handles[0];
50+
return EFI_SUCCESS;
51+
}

disk.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
#pragma once
33

44
EFI_STATUS disk_get_part_uuid(EFI_HANDLE *handle, CHAR16 uuid[static 37]);
5+
EFI_STATUS disk_find_by_part_uuid(EFI_HANDLE **handle, EFI_GUID *guid);

util.c

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,55 @@ EFI_STATUS parse_boolean(const CHAR8 *v, BOOLEAN *b) {
8282
return EFI_INVALID_PARAMETER;
8383
}
8484

85+
#define DECLARE_PARSE_HEX(n)\
86+
static BOOLEAN parse_hex##n(const CHAR8 **input, UINT##n *u) {\
87+
UINTN i; CHAR8 c;\
88+
for (i = 0; i < sizeof(UINT##n) * 2; ++i) {\
89+
c = *((*input)++);\
90+
if (c >= '0' && c <= '9')\
91+
*u = *u << 4 | (c - '0');\
92+
else if (c >= 'A' && c <= 'F')\
93+
*u = *u << 4 | (c - 'A' + 10);\
94+
else if (c >= 'a' && c <= 'f')\
95+
*u = *u << 4 | (c - 'a' + 10);\
96+
else{\
97+
return FALSE;\
98+
}\
99+
}\
100+
return TRUE;\
101+
}
102+
103+
DECLARE_PARSE_HEX(8)
104+
DECLARE_PARSE_HEX(16)
105+
DECLARE_PARSE_HEX(32)
106+
107+
#define GUID_LENGTH 36
108+
#define CHECK_DASH(input) *((input)++) == '-'
109+
110+
EFI_STATUS parse_guid(const CHAR8 *input, EFI_GUID *guid) {
111+
if (strlena(input) != GUID_LENGTH) {
112+
return EFI_INVALID_PARAMETER;
113+
}
114+
115+
if (parse_hex32(&input, &guid->Data1)
116+
&& CHECK_DASH(input) && parse_hex16(&input, &guid->Data2)
117+
&& CHECK_DASH(input) && parse_hex16(&input, &guid->Data3)
118+
&& CHECK_DASH(input)
119+
&& parse_hex8(&input, &guid->Data4[0])
120+
&& parse_hex8(&input, &guid->Data4[1])
121+
&& CHECK_DASH(input)) {
122+
123+
UINTN i;
124+
for (i = 2; i < 8; ++i)
125+
if (!parse_hex8(&input, &guid->Data4[i]))
126+
return EFI_INVALID_PARAMETER;
127+
128+
return EFI_SUCCESS;
129+
}
130+
131+
return EFI_INVALID_PARAMETER;
132+
}
133+
85134
EFI_STATUS efivar_set_raw(const EFI_GUID *vendor, const CHAR16 *name, const VOID *buf, UINTN size, BOOLEAN persistent) {
86135
UINT32 flags;
87136

util.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ static inline const CHAR16 *yes_no(BOOLEAN b) {
1212
}
1313

1414
EFI_STATUS parse_boolean(const CHAR8 *v, BOOLEAN *b);
15+
EFI_STATUS parse_guid(const CHAR8 *v, EFI_GUID *guid);
1516

1617
UINT64 ticks_read(void);
1718
UINT64 ticks_freq(void);

0 commit comments

Comments
 (0)