cbfs: Remove broken remnants of PAYLOAD_INFO feature
PAYLOAD_INFO is a very old feature that can add a key/value information section to a payload file. It seems to have only ever been generated by coreinfo and never really read by anything. Since CB:1721 in 2012, the feature has been inadvertently broken in practice since the `.note.pinfo` sections that contain the information get discarded from the payload before cbfstool gets to see them. Since CB:28647 in 2018, support for the section in the SELF loader was (inadvertently?) dropped, so if someone actually fed cbfstool a payload ELF that did have a `.note.pinfo` section, modern coreboot would refuse to boot the payload entirely (which is probably not a good state to leave things in). This patch removes the code to generate PAYLOAD_INFO entries entirely, but leaves the support to parse and extract those sections from old payloads in place in cbfstool. Change-Id: I40d8e9b76a171ebcdaa2eae02d54a1ca5e592c85 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/81087 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Nico Huber <nico.h@gmx.de>
This commit is contained in:
parent
092a1398f6
commit
06e3dcac45
@ -18,25 +18,13 @@ config SHOW_DATE_TIME
|
||||
|
||||
This option will increase the ELF file size by ca. 250 bytes.
|
||||
|
||||
config PAYLOAD_INFO_NAME
|
||||
config COREINFO_NAME
|
||||
string "Payload name"
|
||||
default "coreinfo"
|
||||
help
|
||||
The name of this payload for use in (e.g.) Bayou.
|
||||
|
||||
config PAYLOAD_INFO_LISTNAME
|
||||
string "Payload menu entry name"
|
||||
default "System Information"
|
||||
help
|
||||
The name of this payload's menu entry for use in (e.g.) Bayou.
|
||||
|
||||
config PAYLOAD_INFO_DESC
|
||||
string "Payload description"
|
||||
default "Display information about the system"
|
||||
help
|
||||
The description of this payload for use in (e.g.) Bayou.
|
||||
|
||||
config PAYLOAD_INFO_VERSION
|
||||
config COREINFO_VERSION
|
||||
string "Payload version"
|
||||
default "0.1"
|
||||
help
|
||||
|
@ -229,7 +229,7 @@ static void loop(void)
|
||||
{
|
||||
int key;
|
||||
|
||||
center(0, CONFIG_PAYLOAD_INFO_NAME " " CONFIG_PAYLOAD_INFO_VERSION);
|
||||
center(0, CONFIG_COREINFO_NAME " " CONFIG_COREINFO_VERSION);
|
||||
print_no_modules_selected();
|
||||
refresh();
|
||||
|
||||
@ -319,7 +319,3 @@ int main(int argc, char **argv)
|
||||
halt();
|
||||
return 0;
|
||||
}
|
||||
|
||||
PAYLOAD_INFO(name, CONFIG_PAYLOAD_INFO_NAME);
|
||||
PAYLOAD_INFO(listname, CONFIG_PAYLOAD_INFO_LISTNAME);
|
||||
PAYLOAD_INFO(desc, CONFIG_PAYLOAD_INFO_DESC);
|
||||
|
@ -84,18 +84,6 @@ static inline u32 div_round_up(u32 n, u32 d) { return (n + d - 1) / d; }
|
||||
|
||||
#define MAX_ARGC_COUNT 32
|
||||
|
||||
/*
|
||||
* Payload information parameters - these are used to pass information
|
||||
* to the entity loading the payload.
|
||||
* Usage: PAYLOAD_INFO(key, value)
|
||||
* Example: PAYLOAD_INFO(name, "CoreInfo!")
|
||||
*/
|
||||
#define _pstruct(key) __pinfo_ ##key
|
||||
#define PAYLOAD_INFO(key, value) \
|
||||
static const char _pstruct(key)[] \
|
||||
__attribute__((__used__)) \
|
||||
__attribute__((section(".note.pinfo"),unused)) = #key "=" value
|
||||
|
||||
/**
|
||||
* @defgroup nvram NVRAM and RTC functions
|
||||
* @{
|
||||
|
@ -198,8 +198,10 @@ enum cbfs_payload_segment_type {
|
||||
PAYLOAD_SEGMENT_CODE = 0x434F4445, /* BE: 'CODE' */
|
||||
PAYLOAD_SEGMENT_DATA = 0x44415441, /* BE: 'DATA' */
|
||||
PAYLOAD_SEGMENT_BSS = 0x42535320, /* BE: 'BSS ' */
|
||||
PAYLOAD_SEGMENT_PARAMS = 0x50415241, /* BE: 'PARA' */
|
||||
PAYLOAD_SEGMENT_ENTRY = 0x454E5452, /* BE: 'ENTR' */
|
||||
|
||||
/* PARAMS for PAYLOAD_INFO feature. Broken since 2012, removed 2024. */
|
||||
PAYLOAD_SEGMENT_DEPRECATED_PARAMS = 0x50415241, /* BE: 'PARA' */
|
||||
};
|
||||
|
||||
struct cbfs_optionrom {
|
||||
|
@ -55,9 +55,7 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
|
||||
{
|
||||
Elf64_Phdr *phdr;
|
||||
Elf64_Ehdr ehdr;
|
||||
Elf64_Shdr *shdr;
|
||||
char *header;
|
||||
char *strtab;
|
||||
int headers;
|
||||
int segments = 1;
|
||||
int isize = 0, osize = 0;
|
||||
@ -70,39 +68,15 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
|
||||
if (!compress)
|
||||
return -1;
|
||||
|
||||
if (elf_headers(input, &ehdr, &phdr, &shdr) < 0)
|
||||
if (elf_headers(input, &ehdr, &phdr, NULL) < 0)
|
||||
return -1;
|
||||
|
||||
DEBUG("start: parse_elf_to_payload\n");
|
||||
headers = ehdr.e_phnum;
|
||||
header = input->data;
|
||||
|
||||
strtab = &header[shdr[ehdr.e_shstrndx].sh_offset];
|
||||
|
||||
/* Count the number of headers - look for the .notes.pinfo
|
||||
* section */
|
||||
|
||||
for (i = 0; i < ehdr.e_shnum; i++) {
|
||||
char *name;
|
||||
|
||||
if (i == ehdr.e_shstrndx)
|
||||
continue;
|
||||
|
||||
if (shdr[i].sh_size == 0)
|
||||
continue;
|
||||
|
||||
name = (char *)(strtab + shdr[i].sh_name);
|
||||
|
||||
if (!strcmp(name, ".note.pinfo")) {
|
||||
segments++;
|
||||
isize += (unsigned int)shdr[i].sh_size;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now, regular headers - we only care about PT_LOAD headers,
|
||||
* because that's what we're actually going to load
|
||||
*/
|
||||
|
||||
/* Count the number of segment headers - we only care about PT_LOAD
|
||||
headers, because that's what we're actually going to load */
|
||||
for (i = 0; i < headers; i++) {
|
||||
if (phdr[i].p_type != PT_LOAD)
|
||||
continue;
|
||||
@ -144,30 +118,6 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
|
||||
*/
|
||||
segments = 0;
|
||||
|
||||
for (i = 0; i < ehdr.e_shnum; i++) {
|
||||
char *name;
|
||||
if (i == ehdr.e_shstrndx)
|
||||
continue;
|
||||
|
||||
if (shdr[i].sh_size == 0)
|
||||
continue;
|
||||
name = (char *)(strtab + shdr[i].sh_name);
|
||||
if (!strcmp(name, ".note.pinfo")) {
|
||||
segs[segments].type = PAYLOAD_SEGMENT_PARAMS;
|
||||
segs[segments].load_addr = 0;
|
||||
segs[segments].len = (unsigned int)shdr[i].sh_size;
|
||||
segs[segments].offset = doffset;
|
||||
|
||||
memcpy((unsigned long *)(output->data + doffset),
|
||||
&header[shdr[i].sh_offset], shdr[i].sh_size);
|
||||
|
||||
doffset += segs[segments].len;
|
||||
osize += segs[segments].len;
|
||||
|
||||
segments++;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < headers; i++) {
|
||||
if (phdr[i].p_type != PT_LOAD)
|
||||
continue;
|
||||
@ -223,7 +173,6 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
|
||||
|
||||
out:
|
||||
if (segs) free(segs);
|
||||
if (shdr) free(shdr);
|
||||
if (phdr) free(phdr);
|
||||
return ret;
|
||||
}
|
||||
|
@ -864,7 +864,7 @@ static int cbfs_payload_decompress(struct cbfs_payload_segment *segments,
|
||||
if (segments[i].type == PAYLOAD_SEGMENT_BSS ||
|
||||
segments[i].type == PAYLOAD_SEGMENT_ENTRY) {
|
||||
continue;
|
||||
} else if (segments[i].type == PAYLOAD_SEGMENT_PARAMS) {
|
||||
} else if (segments[i].type == PAYLOAD_SEGMENT_DEPRECATED_PARAMS) {
|
||||
memcpy(out_ptr, in_ptr, segments[i].len);
|
||||
segments[i].offset = new_offset;
|
||||
new_offset += segments[i].len;
|
||||
@ -1090,7 +1090,7 @@ static int cbfs_payload_make_elf(struct buffer *buff, uint32_t arch,
|
||||
segments++;
|
||||
} else if (payload_type == PAYLOAD_SEGMENT_BSS) {
|
||||
segments++;
|
||||
} else if (payload_type == PAYLOAD_SEGMENT_PARAMS) {
|
||||
} else if (payload_type == PAYLOAD_SEGMENT_DEPRECATED_PARAMS) {
|
||||
segments++;
|
||||
} else if (payload_type == PAYLOAD_SEGMENT_ENTRY) {
|
||||
/* The last segment in a payload is always ENTRY as
|
||||
@ -1162,7 +1162,7 @@ static int cbfs_payload_make_elf(struct buffer *buff, uint32_t arch,
|
||||
shdr.sh_size = segs[i].len;
|
||||
name = strdup(".bss");
|
||||
buffer_splice(&tbuff, buff, 0, 0);
|
||||
} else if (segs[i].type == PAYLOAD_SEGMENT_PARAMS) {
|
||||
} else if (segs[i].type == PAYLOAD_SEGMENT_DEPRECATED_PARAMS) {
|
||||
shdr.sh_type = SHT_NOTE;
|
||||
shdr.sh_flags = 0;
|
||||
shdr.sh_size = segs[i].len;
|
||||
@ -1398,8 +1398,8 @@ static int cbfs_print_decoded_payload_segment_info(
|
||||
seg->load_addr, seg->len);
|
||||
break;
|
||||
|
||||
case PAYLOAD_SEGMENT_PARAMS:
|
||||
fprintf(fp, " parameters\n");
|
||||
case PAYLOAD_SEGMENT_DEPRECATED_PARAMS:
|
||||
fprintf(fp, " parameters (deprecated)\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
Loading…
x
Reference in New Issue
Block a user