diff options
author | Eduardo Habkost <ehabkost@redhat.com> | 2020-12-10 14:11:34 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2021-12-18 11:39:13 -0500 |
commit | fa692768020e42a5eca62c13b6be8a03e926a3b3 (patch) | |
tree | d6aa9b1ca6b36bf99e0594f166f14b93440c256d | |
parent | 401d3132fd5c212d3e7fea5fa79afa71236ca52e (diff) | |
download | seabios-fa692768020e42a5eca62c13b6be8a03e926a3b3.tar.gz |
smbios: Support SMBIOS 3.0 entry point at smbios_romfile_setup()
Support SMBIOS 3.0 entry points if exposed by QEMU in fw_cfg.
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
-rw-r--r-- | src/fw/biostables.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/fw/biostables.c b/src/fw/biostables.c index 5ff1b0ed..1c09a785 100644 --- a/src/fw/biostables.c +++ b/src/fw/biostables.c @@ -589,18 +589,45 @@ smbios_21_setup_entry_point(struct romfile_s *f_tables, } static int +smbios_30_setup_entry_point(struct romfile_s *f_tables, + struct smbios_30_entry_point *ep) +{ + if (!smbios_build_tables(f_tables, + &ep->structure_table_address, + &ep->structure_table_max_size, + NULL, NULL)) + return 0; + + ep->checksum -= checksum(ep, sizeof(*ep)); + copy_smbios_30(ep); + return 1; +} + +static int smbios_romfile_setup(void) { struct romfile_s *f_anchor = romfile_find("etc/smbios/smbios-anchor"); struct romfile_s *f_tables = romfile_find("etc/smbios/smbios-tables"); - struct smbios_21_entry_point ep; + union { + struct smbios_21_entry_point ep21; + struct smbios_30_entry_point ep30; + } ep; - if (!f_anchor || !f_tables || f_anchor->size != sizeof(ep)) + if (!f_anchor || !f_tables || f_anchor->size > sizeof(ep)) return 0; f_anchor->copy(f_anchor, &ep, f_anchor->size); - return smbios_21_setup_entry_point(f_tables, &ep); + if (f_anchor->size == sizeof(ep.ep21) && + ep.ep21.signature == SMBIOS_21_SIGNATURE) { + return smbios_21_setup_entry_point(f_tables, &ep.ep21); + } else if (f_anchor->size == sizeof(ep.ep30) && + valid_smbios_30_signature(&ep.ep30)) { + return smbios_30_setup_entry_point(f_tables, &ep.ep30); + } else { + dprintf(1, "Invalid SMBIOS signature at etc/smbios/smbios-anchor\n"); + return 0; + } } void |