New cbfstool. Works without mmap or fork/exec and

supports fixed location files. Some parts are salvaged
from the pre-commit version (esp. stage and payload creation),
others are completely rewritten (eg. the main loop that handles
file addition)

Also adapt newconfig (we don't need cbfs/tools anymore) and fix
some minor issues in the cbfstool-README.

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Stefan Reinauer <stepan@coresystems.de>


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4630 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Patrick Georgi
2009-09-14 13:29:27 +00:00
parent c8d4a05f8f
commit b7b56dd8fb
77 changed files with 656 additions and 2445 deletions

View File

@@ -1,7 +1,6 @@
/*
* cbfstool
*
* Copyright (C) 2008 Jordan Crouse <jordan@cosmicpenguin.net>
* Copyright (C) 2009 coresystems GmbH
* written by Patrick Georgi <patrick.georgi@coresystems.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -17,17 +16,52 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
*/
#ifndef _CBFS_H_
#define _CBFS_H_
#include <stdint.h>
/** These are standard values for the known compression
alogrithms that coreboot knows about for stages and
payloads. Of course, other LAR users can use whatever
values they want, as long as they understand them. */
struct cbfs_header {
uint32_t magic;
uint32_t version;
uint32_t romsize;
uint32_t bootblocksize;
uint32_t align;
uint32_t offset;
uint32_t pad[2];
} __attribute__ ((packed));
#define CBFS_COMPRESS_NONE 0
#define CBFS_COMPRESS_LZMA 1
#define CBFS_COMPRESS_NRV2B 2
struct cbfs_file {
char magic[8];
uint32_t len;
uint32_t type;
uint32_t checksum;
uint32_t offset;
} __attribute__ ((packed));
struct cbfs_stage {
unsigned int compression;
unsigned long long entry;
unsigned long long load;
unsigned int len;
unsigned int memlen;
} __attribute__ ((packed));
#define PAYLOAD_SEGMENT_CODE 0x45444F43
#define PAYLOAD_SEGMENT_DATA 0x41544144
#define PAYLOAD_SEGMENT_BSS 0x20535342
#define PAYLOAD_SEGMENT_PARAMS 0x41524150
#define PAYLOAD_SEGMENT_ENTRY 0x52544E45
struct cbfs_payload_segment {
unsigned int type;
unsigned int compression;
unsigned int offset;
unsigned long long load_addr;
unsigned int len;
unsigned int mem_len;
} __attribute__ ((packed));
struct cbfs_payload {
struct cbfs_payload_segment segments;
} __attribute__ ((packed));
/** These are standard component types for well known
components (i.e - those that coreboot needs to consume.
@@ -50,90 +84,5 @@
*/
#define CBFS_COMPONENT_NULL 0xFFFFFFFF
/** this is the master cbfs header - it need to be
located somewhere in the bootblock. Where it
actually lives is up to coreboot. A pointer to
this header will live at 0xFFFFFFF4, so we can
easily find it. */
#define HEADER_MAGIC 0x4F524243
/* this is a version that gives the right answer in any endian-ness */
#define VERSION1 0x31313131
struct cbfs_header {
unsigned int magic;
unsigned int version;
unsigned int romsize;
unsigned int bootblocksize;
unsigned int align;
unsigned int offset;
unsigned int pad[2];
} __attribute__ ((packed));
/** This is a component header - every entry in the CBFS
will have this header.
This is how the component is arranged in the ROM:
-------------- <- 0
component header
-------------- <- sizeof(struct component)
component name
-------------- <- offset
data
...
-------------- <- offset + len
*/
#define COMPONENT_MAGIC "LARCHIVE"
struct cbfs_file {
char magic[8];
unsigned int len;
unsigned int type;
unsigned int checksum;
unsigned int offset;
} __attribute__ ((packed));
/*** Component sub-headers ***/
/* Following are component sub-headers for the "standard"
component types */
/** This is the sub-header for stage components. Stages are
loaded by coreboot during the normal boot process */
struct cbfs_stage {
unsigned int compression; /** Compression type */
unsigned long long entry; /** entry point */
unsigned long long load; /** Where to load in memory */
unsigned int len; /** length of data to load */
unsigned int memlen; /** total length of object in memory */
} __attribute__ ((packed));
/** this is the sub-header for payload components. Payloads
are loaded by coreboot at the end of the boot process */
struct cbfs_payload_segment {
unsigned int type;
unsigned int compression;
unsigned int offset;
unsigned long long load_addr;
unsigned int len;
unsigned int mem_len;
} __attribute__ ((packed));
struct cbfs_payload {
struct cbfs_payload_segment segments;
};
#define PAYLOAD_SEGMENT_CODE 0x45444F43
#define PAYLOAD_SEGMENT_DATA 0x41544144
#define PAYLOAD_SEGMENT_BSS 0x20535342
#define PAYLOAD_SEGMENT_PARAMS 0x41524150
#define PAYLOAD_SEGMENT_ENTRY 0x52544E45
#define CBFS_NAME(_c) (((unsigned char *) (_c)) + sizeof(struct cbfs_file))
#endif
int cbfs_file_header(uint32_t physaddr);
struct cbfs_file *cbfs_create_empty_file(uint32_t physaddr, uint32_t size);