[SeaBIOS] [PATCH 3/3] Accept file supplied as multiboot modules
Kevin O'Connor
kevin at koconnor.net
Tue May 19 16:10:40 CEST 2015
On Tue, May 19, 2015 at 08:12:46AM +0200, Vladimir 'φ-coder/phcoder' Serbinenko wrote:
> > This code would need to be in the seabios coding style.
> >
> Could you point to style guide or to tell exact points you dislike? STFW
> "seabios style guide" returns no relevant results
http://seabios.org/Contributing
Basically, it's similar to the QEMU style - no tabs, 4 space
indentation, 80 column max, braces on same line as if/while/etc.
Also, the patches should contain a "signed-off-by" line as described
in the QEMU patch submission process.
> > Instead of passing this variable all the way through these
> > initialization functions, I suspect it would be much easier to just
> > stash the value in a global variable in the assembler and then read it
> > from that global in the coreboot.c code.
> >
> Done.
> > Why detect a multiboot entry in entry_elf - wouldn't it be much
> > simpler to point the multiboot header to a new entry_multiboot
> > assembler function?
> >
> Done.
> >
> > I don't understand this comment - seabios always uses -mregparam=3 and
> > nearly all the assembler entry stubs rely on this.
> >
> Removed.
>
Thanks. Some additional comments below.
> --- a/src/fw/coreboot.c
> +++ b/src/fw/coreboot.c
> @@ -17,6 +17,7 @@
> #include "stacks.h" // yield
> #include "string.h" // memset
> #include "util.h" // coreboot_preinit
> +#include "multiboot.h"
>
>
> /****************************************************************
> @@ -464,6 +465,69 @@ coreboot_cbfs_init(void)
> process_links_file();
> }
>
> +static int
> +extract_filename(char *dest, char *src, size_t lim)
> +{
> + char *ptr;
> + for (ptr = src; *ptr; ptr++)
> + {
> + if (!(ptr == src || ptr[-1] == ' ' || ptr[-1] == '\t'))
> + continue;
> + /* memcmp stops early if it encounters \0 as it doesn't match name=. */
> + if (memcmp(ptr, "name=", 5) == 0)
> + {
> + int i;
> + char *optr = dest;
> + for (i = 0, ptr += 5; *ptr && *ptr != ' ' && i < lim; i++)
> + *optr++ = *ptr++;
> + *optr++ = '\0';
> + return 1;
> + }
> + }
> + return 0;
> +}
> +
> +u32 VISIBLE32FLAT multiboot_info;
The VISIBLE32FLAT macro is for functions (not variables). I think you
can get away with just using __VISIBLE here (and removing the
"_cfunc32flat_" prefix from the romlayout.S code).
> +
> +void
> +coreboot_multiboot_init(void)
> +{
> + struct multiboot_info *mbi;
> + dprintf (1, "mbptr=0x%x\n", multiboot_info);
> + if (multiboot_info == 0xffffffff)
> + return;
> + mbi = (void *)multiboot_info;
> + dprintf (1, "flags=0x%x, mods=0x%x, mods_c=%d\n", mbi->flags, mbi->mods_addr,
> + mbi->mods_count);
> + if (!(mbi->flags & MULTIBOOT_INFO_MODS))
> + return;
> + int i;
> + struct multiboot_mod_list *mod = (void *)mbi->mods_addr;
> + for (i = 0; i < mbi->mods_count; i++) {
> + struct cbfs_romfile_s *cfile;
> + u8 *copy;
> + u32 len;
> + if (!mod[i].cmdline)
> + continue;
> + len = mod[i].mod_end - mod[i].mod_start;
> + cfile = malloc_tmp(sizeof(*cfile));
> + memset(cfile, 0, sizeof(*cfile));
> + dprintf (1, "module %s, size 0x%x\n", (char *)mod[i].cmdline, len);
> + if (!extract_filename(cfile->file.name, (char *)mod[i].cmdline, sizeof(cfile->file.name)))
> + {
> + free (cfile);
> + continue;
> + }
> + dprintf (1, "assigned file name <%s>\n", cfile->file.name);
> + cfile->file.size = cfile->rawsize = len;
> + copy = malloc_tmp (len);
> + memcpy(copy, (void *)mod[i].mod_start, len);
> + cfile->file.copy = cbfs_copyfile;
> + cfile->data = copy;
> + romfile_add(&cfile->file);
> + }
> +}
> +
> struct cbfs_payload_segment {
> u32 type;
> u32 compression;
> @@ -546,6 +610,8 @@ cbfs_payload_setup(void)
> break;
> struct cbfs_romfile_s *cfile;
> cfile = container_of(file, struct cbfs_romfile_s, file);
> + if (!cfile->fhdr)
> + continue;
Is there a reason to use 'struct cbfs_romfile_s' instead of
introducing a new 'struct multiboot_romfile_s'. Could all this new
code go into a new file src/fw/multiboot.c?
> const char *filename = file->name;
> char *desc = znprintf(MAXDESCSIZE, "Payload [%s]", &filename[4]);
> boot_add_cbfs(cfile->fhdr, desc, bootprio_find_named_rom(filename, 0));
> @@ -565,5 +631,5 @@ mb_head(u32 mbptr)
> ".long _reloc_abs_start\n"
> ".long 0\n"
> ".long 0\n"
> - ".long entry_elf\n");
> + ".long entry_multiboot\n");
> }
> diff --git a/src/multiboot.h b/src/multiboot.h
> new file mode 100644
> index 0000000..c143441
> --- /dev/null
> +++ b/src/multiboot.h
> @@ -0,0 +1,260 @@
> +/* multiboot.h - Multiboot header file. */
> +/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc.
This file should go into: src/std/
-Kevin
More information about the SeaBIOS
mailing list