[coreboot-gerrit] Change in coreboot[master]: Added multiboot support to cbfstool and made changes to behaviour for...
Michał Żygowski (Code Review)
gerrit at coreboot.org
Wed Aug 8 18:46:15 CEST 2018
Michał Żygowski has uploaded this change for review. ( https://review.coreboot.org/27957
Change subject: Added multiboot support to cbfstool and made changes to behaviour for cbfs add-payload
......................................................................
Added multiboot support to cbfstool and made changes to behaviour for cbfs add-payload
* modified messaging and logic with respect to different payload types:
- tries multiboot if neither ELF nor UEFI
- then tries bzImage
* added check for Linux header in bzImage
* change ERROR level message if stage file not in ELF format (reduced to INFO)
Note: multiboot support limited to obtaining load location and entry point
Change-Id: Iaeb808e8750ad81bdf8c4daedb0d91e961eebb70
Signed-off-by: Paul Roberts <paul.c.roberts at ntlworld.com>
---
M util/cbfstool/cbfs-mkpayload.c
M util/cbfstool/cbfs-payload-linux.c
M util/cbfstool/cbfstool.c
M util/cbfstool/common.h
4 files changed, 123 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/57/27957/1
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c
index d6c10ad..8df52d9 100644
--- a/util/cbfstool/cbfs-mkpayload.c
+++ b/util/cbfstool/cbfs-mkpayload.c
@@ -454,3 +454,104 @@
return 0;
}
+
+#define MULTIBOOT_MAGIC 0x1BADB002
+
+struct multiboot_header {
+ uint32_t magic;
+ uint32_t flags;
+ uint32_t checksum;
+ uint32_t header_addr;
+ uint32_t load_addr;
+ uint32_t load_end_addr;
+ uint32_t bss_end_addr;
+ uint32_t entry_addr;
+};
+
+static int find_multiboot_header(const struct buffer *input,
+ struct multiboot_header *mboot_hdr)
+{
+ int i;
+
+ for (i = 0; i < 8192; i += sizeof(uint32_t)) {
+ uint32_t sum;
+ struct buffer in;
+
+ buffer_clone(&in, input);
+ buffer_seek(&in, i);
+
+ mboot_hdr->magic = xdr_le.get32(&in);
+
+ if (mboot_hdr->magic != MULTIBOOT_MAGIC)
+ continue;
+
+ mboot_hdr->flags = xdr_le.get32(&in);
+ mboot_hdr->checksum = xdr_le.get32(&in);
+
+ sum = mboot_hdr->magic + mboot_hdr->flags + mboot_hdr->checksum;
+
+ if (sum != 0) {
+ WARN("Multiboot header found @ %d. Checksum invalid\n",
+ i);
+ continue;
+ }
+
+ mboot_hdr->header_addr = xdr_le.get32(&in);
+ mboot_hdr->load_addr = xdr_le.get32(&in);
+ mboot_hdr->load_end_addr = xdr_le.get32(&in);
+ mboot_hdr->bss_end_addr = xdr_le.get32(&in);
+ mboot_hdr->entry_addr = xdr_le.get32(&in);
+
+ return i;
+ }
+
+ return -1;
+}
+
+int parse_multiboot_to_payload(const struct buffer *input,
+ struct buffer *output, enum comp_algo algo)
+{
+ int header_offset;
+ struct multiboot_header mboot_hdr;
+ uint32_t end_addr;
+
+
+ header_offset = find_multiboot_header(input, &mboot_hdr);
+
+ if (header_offset < 0) {
+ WARN("No valid multiboot header found.\n");
+ return -1;
+ }
+
+ /* No runtime boot information supported. */
+ if (mboot_hdr.flags & ((1 << 2) | (1 << 1))) {
+ WARN("No multiboot runtime boot information supported: %x.\n",
+ mboot_hdr.flags);
+ return -1;
+ }
+
+ if (!(mboot_hdr.flags & (1 << 16))) {
+ WARN("No multiboot load information available: %x.\n",
+ mboot_hdr.flags);
+ return -1;
+ }
+
+ end_addr = mboot_hdr.load_end_addr;
+ if (!end_addr)
+ end_addr = mboot_hdr.load_addr + input->size;
+
+ /* Support full file load only. */
+ if (header_offset + mboot_hdr.load_addr != mboot_hdr.header_addr ||
+ end_addr - mboot_hdr.load_addr != input->size) {
+ WARN("Multiboot payload loading only supports full file.\n");
+ return -1;
+ }
+
+ INFO("Compatible Multiboot payload found. load address:"
+ " 0x%x entry: 0x%x\n",mboot_hdr.load_addr,mboot_hdr.entry_addr);
+ return parse_flat_binary_to_payload(input,
+ output,
+ mboot_hdr.load_addr,
+ mboot_hdr.entry_addr,
+ algo);
+}
diff --git a/util/cbfstool/cbfs-payload-linux.c b/util/cbfstool/cbfs-payload-linux.c
index 6b4bf27..8183925 100644
--- a/util/cbfstool/cbfs-payload-linux.c
+++ b/util/cbfstool/cbfs-payload-linux.c
@@ -242,6 +242,19 @@
params.loader_type = 0xff; /* Unregistered Linux loader */
+ /* Check for signatures and determine version */
+ if ( hdr->boot_sector_magic != 0xAA55 ) {
+ WARN("bzImage missing 55AA signature\n");
+ return -1;
+ }
+ if ( (hdr->header_magic[0] != 'H')||
+ (hdr->header_magic[1] != 'd')||
+ (hdr->header_magic[2] != 'r')||
+ (hdr->header_magic[3] != 'S')){
+ WARN("bzImage missing HdrS signature\n");
+ return -1;
+ }
+
if (cmdline != NULL) {
if (hdr->protocol_version < 0x202) {
params.cl_magic = CL_MAGIC_VALUE;
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index f8b1f65..6fbe2fc 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -752,14 +752,19 @@
if (ret != 0)
ret = parse_fv_to_payload(buffer, &output, param.compression);
- /* If it's neither ELF nor UEFI Fv, try bzImage */
+ /* If it's neither ELF nor UEFI Fv, try multiboot */
+ if (ret != 0)
+ ret = parse_multiboot_to_payload(buffer, &output,
+ param.compression);
+
+ /* If it's neither ELF, UEFI Fv, nor multiboot try bzImage*/
if (ret != 0)
ret = parse_bzImage_to_payload(buffer, &output,
param.initrd, param.cmdline, param.compression);
/* Not a supported payload type */
if (ret != 0) {
- ERROR("Not a supported payload type (ELF / FV).\n");
+ ERROR("Not a supported payload type (ELF / FV / bzImage / Multiboot).\n");
buffer_delete(buffer);
return -1;
}
diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h
index baefc1c..ab2e441 100644
--- a/util/cbfstool/common.h
+++ b/util/cbfstool/common.h
@@ -198,6 +198,8 @@
uint32_t loadaddress,
uint32_t entrypoint,
enum comp_algo algo);
+int parse_multiboot_to_payload(const struct buffer *input,
+ struct buffer *output, enum comp_algo algo);
/* cbfs-mkstage.c */
int parse_elf_to_stage(const struct buffer *input, struct buffer *output,
enum comp_algo algo, uint32_t *location,
--
To view, visit https://review.coreboot.org/27957
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iaeb808e8750ad81bdf8c4daedb0d91e961eebb70
Gerrit-Change-Number: 27957
Gerrit-PatchSet: 1
Gerrit-Owner: Michał Żygowski <michal.zygowski at 3mdeb.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180808/9afc651f/attachment-0001.html>
More information about the coreboot-gerrit
mailing list