coreboot/util/nvramtool/cbfs.h
<<
>>
Prefs
   1/*
   2 * This file is part of the coreboot project.
   3 *
   4 * Copyright (C) 2008 Jordan Crouse <jordan@cosmicpenguin.net>
   5 *
   6 * This file is dual-licensed. You can choose between:
   7 *   - The GNU GPL, version 2, as published by the Free Software Foundation
   8 *   - The revised BSD license (without advertising clause)
   9 *
  10 * ---------------------------------------------------------------------------
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; version 2 of the License.
  14 *
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU General Public License
  21 * along with this program; if not, write to the Free Software
  22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
  23 * ---------------------------------------------------------------------------
  24 * Redistribution and use in source and binary forms, with or without
  25 * modification, are permitted provided that the following conditions
  26 * are met:
  27 * 1. Redistributions of source code must retain the above copyright
  28 *    notice, this list of conditions and the following disclaimer.
  29 * 2. Redistributions in binary form must reproduce the above copyright
  30 *    notice, this list of conditions and the following disclaimer in the
  31 *    documentation and/or other materials provided with the distribution.
  32 * 3. The name of the author may not be used to endorse or promote products
  33 *    derived from this software without specific prior written permission.
  34 *
  35 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  36 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  37 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  38 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  39 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  40 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  41 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  42 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  43 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  44 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  45 * SUCH DAMAGE.
  46 * ---------------------------------------------------------------------------
  47 */
  48
  49#ifndef _CBFS_H_
  50#define _CBFS_H_
  51
  52#include "coreboot_tables.h"
  53
  54typedef uint64_t u64;
  55typedef uint32_t u32;
  56typedef uint16_t u16;
  57typedef uint8_t u8;
  58
  59/** These are standard values for the known compression
  60    alogrithms that coreboot knows about for stages and
  61    payloads.  Of course, other CBFS users can use whatever
  62    values they want, as long as they understand them. */
  63
  64#define CBFS_COMPRESS_NONE  0
  65#define CBFS_COMPRESS_LZMA  1
  66
  67/** These are standard component types for well known
  68    components (i.e - those that coreboot needs to consume.
  69    Users are welcome to use any other value for their
  70    components */
  71
  72#define CBFS_TYPE_STAGE      0x10
  73#define CBFS_TYPE_PAYLOAD    0x20
  74#define CBFS_TYPE_OPTIONROM  0x30
  75#define CBFS_TYPE_BOOTSPLASH 0x40
  76#define CBFS_TYPE_RAW        0x50
  77#define CBFS_TYPE_VSA        0x51
  78#define CBFS_TYPE_MBI        0x52
  79#define CBFS_TYPE_MICROCODE  0x53
  80#define CBFS_COMPONENT_CMOS_DEFAULT 0xaa
  81#define CBFS_COMPONENT_CMOS_LAYOUT 0x01aa
  82
  83
  84/** this is the master cbfs header - it need to be
  85    located somewhere in the bootblock.  Where it
  86    actually lives is up to coreboot. A pointer to
  87    this header will live at 0xFFFFFFFc, so we can
  88    easily find it. */
  89
  90#define CBFS_HEADER_MAGIC  0x4F524243
  91#define CBFS_HEADPTR_ADDR 0xFFFFFFFc
  92#define VERSION1 0x31313131
  93
  94struct cbfs_header {
  95        u32 magic;
  96        u32 version;
  97        u32 romsize;
  98        u32 bootblocksize;
  99        u32 align;
 100        u32 offset;
 101        u32 pad[2];
 102} __attribute__((packed));
 103
 104/** This is a component header - every entry in the CBFS
 105    will have this header.
 106
 107    This is how the component is arranged in the ROM:
 108
 109    --------------   <- 0
 110    component header
 111    --------------   <- sizeof(struct component)
 112    component name
 113    --------------   <- offset
 114    data
 115    ...
 116    --------------   <- offset + len
 117*/
 118
 119#define CBFS_FILE_MAGIC "LARCHIVE"
 120
 121struct cbfs_file {
 122        char magic[8];
 123        u32 len;
 124        u32 type;
 125        u32 checksum;
 126        u32 offset;
 127} __attribute__((packed));
 128
 129/*** Component sub-headers ***/
 130
 131/* Following are component sub-headers for the "standard"
 132   component types */
 133
 134/** This is the sub-header for stage components.  Stages are
 135    loaded by coreboot during the normal boot process */
 136
 137struct cbfs_stage {
 138        u32 compression;  /** Compression type */
 139        u64 entry;  /** entry point */
 140        u64 load;   /** Where to load in memory */
 141        u32 len;          /** length of data to load */
 142        u32 memlen;        /** total length of object in memory */
 143} __attribute__((packed));
 144
 145/** this is the sub-header for payload components.  Payloads
 146    are loaded by coreboot at the end of the boot process */
 147
 148struct cbfs_payload_segment {
 149        u32 type;
 150        u32 compression;
 151        u32 offset;
 152        u64 load_addr;
 153        u32 len;
 154        u32 mem_len;
 155} __attribute__((packed));
 156
 157struct cbfs_payload {
 158        struct cbfs_payload_segment segments;
 159};
 160
 161#define PAYLOAD_SEGMENT_CODE   0x45444F43
 162#define PAYLOAD_SEGMENT_DATA   0x41544144
 163#define PAYLOAD_SEGMENT_BSS    0x20535342
 164#define PAYLOAD_SEGMENT_PARAMS 0x41524150
 165#define PAYLOAD_SEGMENT_ENTRY  0x52544E45
 166
 167struct cbfs_optionrom {
 168        u32 compression;
 169        u32 len;
 170} __attribute__((packed));
 171
 172#define CBFS_NAME(_c) (((char *) (_c)) + sizeof(struct cbfs_file))
 173#define CBFS_SUBHEADER(_p) ( (void *) ((((u8 *) (_p)) + ntohl((_p)->offset))) )
 174
 175void * cbfs_get_file(const char *name);
 176struct cbfs_file *cbfs_find(const char *name);
 177void *cbfs_find_file(const char *name, unsigned int type, unsigned int *len);
 178
 179void open_cbfs(const char *filename);
 180#endif
 181
 182
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.