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:
Julius Werner
2024-03-06 13:34:44 -08:00
parent 092a1398f6
commit 06e3dcac45
6 changed files with 14 additions and 91 deletions

View File

@ -18,25 +18,13 @@ config SHOW_DATE_TIME
This option will increase the ELF file size by ca. 250 bytes. This option will increase the ELF file size by ca. 250 bytes.
config PAYLOAD_INFO_NAME config COREINFO_NAME
string "Payload name" string "Payload name"
default "coreinfo" default "coreinfo"
help help
The name of this payload for use in (e.g.) Bayou. The name of this payload for use in (e.g.) Bayou.
config PAYLOAD_INFO_LISTNAME config COREINFO_VERSION
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
string "Payload version" string "Payload version"
default "0.1" default "0.1"
help help

View File

@ -229,7 +229,7 @@ static void loop(void)
{ {
int key; int key;
center(0, CONFIG_PAYLOAD_INFO_NAME " " CONFIG_PAYLOAD_INFO_VERSION); center(0, CONFIG_COREINFO_NAME " " CONFIG_COREINFO_VERSION);
print_no_modules_selected(); print_no_modules_selected();
refresh(); refresh();
@ -319,7 +319,3 @@ int main(int argc, char **argv)
halt(); halt();
return 0; return 0;
} }
PAYLOAD_INFO(name, CONFIG_PAYLOAD_INFO_NAME);
PAYLOAD_INFO(listname, CONFIG_PAYLOAD_INFO_LISTNAME);
PAYLOAD_INFO(desc, CONFIG_PAYLOAD_INFO_DESC);

View File

@ -84,18 +84,6 @@ static inline u32 div_round_up(u32 n, u32 d) { return (n + d - 1) / d; }
#define MAX_ARGC_COUNT 32 #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 * @defgroup nvram NVRAM and RTC functions
* @{ * @{

View File

@ -198,8 +198,10 @@ enum cbfs_payload_segment_type {
PAYLOAD_SEGMENT_CODE = 0x434F4445, /* BE: 'CODE' */ PAYLOAD_SEGMENT_CODE = 0x434F4445, /* BE: 'CODE' */
PAYLOAD_SEGMENT_DATA = 0x44415441, /* BE: 'DATA' */ PAYLOAD_SEGMENT_DATA = 0x44415441, /* BE: 'DATA' */
PAYLOAD_SEGMENT_BSS = 0x42535320, /* BE: 'BSS ' */ PAYLOAD_SEGMENT_BSS = 0x42535320, /* BE: 'BSS ' */
PAYLOAD_SEGMENT_PARAMS = 0x50415241, /* BE: 'PARA' */
PAYLOAD_SEGMENT_ENTRY = 0x454E5452, /* BE: 'ENTR' */ 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 { struct cbfs_optionrom {

View File

@ -55,9 +55,7 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
{ {
Elf64_Phdr *phdr; Elf64_Phdr *phdr;
Elf64_Ehdr ehdr; Elf64_Ehdr ehdr;
Elf64_Shdr *shdr;
char *header; char *header;
char *strtab;
int headers; int headers;
int segments = 1; int segments = 1;
int isize = 0, osize = 0; int isize = 0, osize = 0;
@ -70,39 +68,15 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
if (!compress) if (!compress)
return -1; return -1;
if (elf_headers(input, &ehdr, &phdr, &shdr) < 0) if (elf_headers(input, &ehdr, &phdr, NULL) < 0)
return -1; return -1;
DEBUG("start: parse_elf_to_payload\n"); DEBUG("start: parse_elf_to_payload\n");
headers = ehdr.e_phnum; headers = ehdr.e_phnum;
header = input->data; header = input->data;
strtab = &header[shdr[ehdr.e_shstrndx].sh_offset]; /* Count the number of segment headers - we only care about PT_LOAD
headers, because that's what we're actually going to load */
/* 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
*/
for (i = 0; i < headers; i++) { for (i = 0; i < headers; i++) {
if (phdr[i].p_type != PT_LOAD) if (phdr[i].p_type != PT_LOAD)
continue; continue;
@ -144,30 +118,6 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
*/ */
segments = 0; 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++) { for (i = 0; i < headers; i++) {
if (phdr[i].p_type != PT_LOAD) if (phdr[i].p_type != PT_LOAD)
continue; continue;
@ -223,7 +173,6 @@ int parse_elf_to_payload(const struct buffer *input, struct buffer *output,
out: out:
if (segs) free(segs); if (segs) free(segs);
if (shdr) free(shdr);
if (phdr) free(phdr); if (phdr) free(phdr);
return ret; return ret;
} }

View File

@ -864,7 +864,7 @@ static int cbfs_payload_decompress(struct cbfs_payload_segment *segments,
if (segments[i].type == PAYLOAD_SEGMENT_BSS || if (segments[i].type == PAYLOAD_SEGMENT_BSS ||
segments[i].type == PAYLOAD_SEGMENT_ENTRY) { segments[i].type == PAYLOAD_SEGMENT_ENTRY) {
continue; 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); memcpy(out_ptr, in_ptr, segments[i].len);
segments[i].offset = new_offset; segments[i].offset = new_offset;
new_offset += segments[i].len; new_offset += segments[i].len;
@ -1090,7 +1090,7 @@ static int cbfs_payload_make_elf(struct buffer *buff, uint32_t arch,
segments++; segments++;
} else if (payload_type == PAYLOAD_SEGMENT_BSS) { } else if (payload_type == PAYLOAD_SEGMENT_BSS) {
segments++; segments++;
} else if (payload_type == PAYLOAD_SEGMENT_PARAMS) { } else if (payload_type == PAYLOAD_SEGMENT_DEPRECATED_PARAMS) {
segments++; segments++;
} else if (payload_type == PAYLOAD_SEGMENT_ENTRY) { } else if (payload_type == PAYLOAD_SEGMENT_ENTRY) {
/* The last segment in a payload is always ENTRY as /* 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; shdr.sh_size = segs[i].len;
name = strdup(".bss"); name = strdup(".bss");
buffer_splice(&tbuff, buff, 0, 0); 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_type = SHT_NOTE;
shdr.sh_flags = 0; shdr.sh_flags = 0;
shdr.sh_size = segs[i].len; shdr.sh_size = segs[i].len;
@ -1398,8 +1398,8 @@ static int cbfs_print_decoded_payload_segment_info(
seg->load_addr, seg->len); seg->load_addr, seg->len);
break; break;
case PAYLOAD_SEGMENT_PARAMS: case PAYLOAD_SEGMENT_DEPRECATED_PARAMS:
fprintf(fp, " parameters\n"); fprintf(fp, " parameters (deprecated)\n");
break; break;
default: default: