Offline SMMSTORE variable modification tool. Can be used to pre-configure ROM image or debug EFI state stored in a dump. Change-Id: I6c1c06f1d0c39c13b5be76a3070f09b715aca6e0 Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/79080 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Michał Żygowski <michal.zygowski@3mdeb.com> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
90 lines
2.0 KiB
C
90 lines
2.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
#include "guids.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <commonlib/bsd/helpers.h>
|
|
|
|
#include "udk2017.h"
|
|
#include "utils.h"
|
|
|
|
const struct guid_alias_t known_guids[] = {
|
|
{
|
|
"coreboot",
|
|
{
|
|
0xceae4c1d, 0x335b, 0x4685,
|
|
{ 0xa4, 0xa0, 0xfc, 0x4a, 0x94, 0xee, 0xa0, 0x85 }
|
|
},
|
|
},
|
|
{
|
|
"dasharo",
|
|
{
|
|
0xd15b327e, 0xff2d, 0x4fc1,
|
|
{ 0xab, 0xf6, 0xc1, 0x2b, 0xd0, 0x8c, 0x13, 0x59 }
|
|
},
|
|
},
|
|
{
|
|
"global",
|
|
{
|
|
0x8be4df61, 0x93ca, 0x11d2,
|
|
{ 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c }
|
|
},
|
|
},
|
|
{
|
|
"microsoft",
|
|
{
|
|
0x77fa9abd, 0x0359, 0x4d32,
|
|
{ 0xbd, 0x60, 0x28, 0xf4, 0xe7, 0x8f, 0x78, 0x4b }
|
|
},
|
|
},
|
|
};
|
|
|
|
const int known_guid_count = ARRAY_SIZE(known_guids);
|
|
|
|
char *format_guid(const EFI_GUID *guid, bool use_alias)
|
|
{
|
|
if (use_alias) {
|
|
for (int i = 0; i < known_guid_count; ++i) {
|
|
const struct guid_alias_t *known_guid = &known_guids[i];
|
|
if (memcmp(&known_guid->guid, guid, sizeof(*guid)) == 0)
|
|
return strdup(known_guid->alias);
|
|
}
|
|
}
|
|
|
|
char *str = xmalloc(GUID_LEN + 1);
|
|
snprintf(str, GUID_LEN + 1,
|
|
"%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x",
|
|
guid->Data1, guid->Data2, guid->Data3,
|
|
guid->Data4[0], guid->Data4[1],
|
|
guid->Data4[2], guid->Data4[3],
|
|
guid->Data4[4], guid->Data4[5],
|
|
guid->Data4[6], guid->Data4[7]);
|
|
return str;
|
|
}
|
|
|
|
bool parse_guid(const char str[], EFI_GUID *guid)
|
|
{
|
|
for (int i = 0; i < known_guid_count; ++i) {
|
|
const struct guid_alias_t *known_guid = &known_guids[i];
|
|
if (str_eq(known_guid->alias, str)) {
|
|
*guid = known_guid->guid;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (strlen(str) != GUID_LEN)
|
|
return false;
|
|
|
|
int n = sscanf(str,
|
|
"%08x-%04hx-%04hx-"
|
|
"%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",
|
|
&guid->Data1, &guid->Data2, &guid->Data3,
|
|
&guid->Data4[0], &guid->Data4[1],
|
|
&guid->Data4[2], &guid->Data4[3],
|
|
&guid->Data4[4], &guid->Data4[5],
|
|
&guid->Data4[6], &guid->Data4[7]);
|
|
return n == 11;
|
|
}
|