a90bd527d9
CBFS allows coreboot rom images that are only partially covered by the filesystem itself. The intention of this feature was to allow EC / ME / IMC firmware to be inserted easily at the beginning of the image. However, this was never implemented in cbfstool. This patch implements an additional parameter for cbfstool. If you call cbfstool like this: cbfstool coreboot.rom create 8192K bootblock.bin 64 0x700000 it will now create an 8M image with CBFS covering the last 1M of that image. Test: cbfstool coreboot.rom create 8192K bootblock.bin 64 0x700000 creates an 8M image that is 7M of 0xff and 1M of CBFS. Change-Id: I5c016b4bf32433f160b43f4df2dd768276f4c70b Signed-off-by: Stefan Reinauer <reinauer@google.com> Reviewed-on: http://review.coreboot.org/1708 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
80 lines
2.8 KiB
C
80 lines
2.8 KiB
C
/*
|
|
* 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
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
|
|
*/
|
|
|
|
#include <stdint.h>
|
|
#include "swab.h"
|
|
#define ntohl(x) (host_bigendian?(x):swab32(x))
|
|
#define htonl(x) (host_bigendian?(x):swab32(x))
|
|
#define ntohll(x) (host_bigendian?(x):swab64(x))
|
|
#define htonll(x) (host_bigendian?(x):swab64(x))
|
|
|
|
extern void *offset;
|
|
extern struct cbfs_header *master_header;
|
|
extern uint32_t phys_start, phys_end, align, romsize;
|
|
extern int host_bigendian;
|
|
|
|
static inline void *phys_to_virt(uint32_t addr)
|
|
{
|
|
return offset + addr;
|
|
}
|
|
|
|
static inline uint32_t virt_to_phys(void *addr)
|
|
{
|
|
return (unsigned long)(addr - offset) & 0xffffffff;
|
|
}
|
|
|
|
#define ALIGN(val, by) (((val) + (by)-1)&~((by)-1))
|
|
|
|
uint32_t getfilesize(const char *filename);
|
|
void *loadfile(const char *filename, uint32_t * romsize_p, void *content,
|
|
int place);
|
|
void *loadrom(const char *filename);
|
|
int writerom(const char *filename, void *start, uint32_t size);
|
|
|
|
int iself(unsigned char *input);
|
|
|
|
typedef void (*comp_func_ptr) (char *, int, char *, int *);
|
|
typedef enum { CBFS_COMPRESS_NONE = 0, CBFS_COMPRESS_LZMA = 1 } comp_algo;
|
|
|
|
comp_func_ptr compression_function(comp_algo algo);
|
|
|
|
uint64_t intfiletype(const char *name);
|
|
|
|
int parse_elf_to_payload(unsigned char *input, unsigned char **output,
|
|
comp_algo algo);
|
|
int parse_elf_to_stage(unsigned char *input, unsigned char **output,
|
|
comp_algo algo, uint32_t * location);
|
|
|
|
void *create_cbfs_file(const char *filename, void *data, uint32_t * datasize,
|
|
uint32_t type, uint32_t * location);
|
|
|
|
int create_cbfs_image(const char *romfile, uint32_t romsize,
|
|
const char *bootblock, uint32_t align, uint32_t offs);
|
|
|
|
int add_file_to_cbfs(void *content, uint32_t contentsize, uint32_t location);
|
|
int remove_file_from_cbfs(const char *filename);
|
|
void print_cbfs_directory(const char *filename);
|
|
int extract_file_from_cbfs(const char *filename, const char *payloadname, const char *outpath);
|
|
int remove_file_from_cbfs(const char *filename);
|
|
|
|
uint32_t cbfs_find_location(const char *romfile, uint32_t filesize,
|
|
const char *filename, uint32_t align);
|
|
|
|
void print_supported_filetypes(void);
|
|
|
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|