aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/include
diff options
context:
space:
mode:
authorJordan Crouse <jordan.crouse@amd.com>2008-05-07 20:34:02 +0000
committerJordan Crouse <jordan.crouse@amd.com>2008-05-07 20:34:02 +0000
commit681ec27e2c64763bba02ef816d41b6b366559f03 (patch)
treef943180f77f85b553e7e47791c06deaf44f184d3 /payloads/libpayload/include
parent35993a231ecb4957d18719801cc4519b1df80d70 (diff)
libpayload: Add LAR walking support
Add suport for walking LARs. These try to emulate the f* functions from POSIX, though they are obviously different in their behavior. Signed-off-by: Jordan Crouse <jordan.crouse@amd.com> Acked-by: Myles Watson <mylesgw@gmail.com> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3288 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'payloads/libpayload/include')
-rw-r--r--payloads/libpayload/include/arch/endian.h46
-rw-r--r--payloads/libpayload/include/lar.h94
-rw-r--r--payloads/libpayload/include/libpayload.h50
3 files changed, 190 insertions, 0 deletions
diff --git a/payloads/libpayload/include/arch/endian.h b/payloads/libpayload/include/arch/endian.h
new file mode 100644
index 0000000000..995681494a
--- /dev/null
+++ b/payloads/libpayload/include/arch/endian.h
@@ -0,0 +1,46 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2008 Advanced Micro Devices, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ARCH_ENDIAN_H
+#define _ARCH_ENDIAN_H
+
+static u32 ntohl(u32 in)
+{
+ return ((in & 0xFF) << 24) | ((in & 0xFF00) << 8) |
+ ((in & 0xFF0000) >> 8) | ((in & 0xFF000000) >> 24);
+}
+
+static u64 ntohll(u64 in)
+{
+ u32 h = in >> 32;
+ u32 l = in & 0xFFFFFFFF;
+
+ return (((u64) ntohl(l) << 32) | ((u64) ntohl(h)));
+}
+#endif
diff --git a/payloads/libpayload/include/lar.h b/payloads/libpayload/include/lar.h
new file mode 100644
index 0000000000..234637f10c
--- /dev/null
+++ b/payloads/libpayload/include/lar.h
@@ -0,0 +1,94 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2006 coresystems GmbH
+ * (Written by Stefan Reinauer <stepan@coresystems.de> for coresystems GmbH)
+ *
+ * This file is dual-licensed. You can choose between:
+ * - The GNU GPL, version 2, as published by the Free Software Foundation
+ * - The revised BSD license (without advertising clause)
+ *
+ * ---------------------------------------------------------------------------
+ * 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
+ * ---------------------------------------------------------------------------
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ---------------------------------------------------------------------------
+ */
+
+#ifndef LAR_H
+#define LAR_H
+
+#include <arch/types.h>
+
+#define LAR_MAGIC "LARCHIVE"
+#define LAR_MAX_PATHLEN 1024
+
+struct lar_header {
+ char magic[8];
+ u32 len;
+ u32 reallen;
+ u32 checksum;
+ u32 compchecksum;
+ u32 offset;
+ /* Compression:
+ * 0 = no compression
+ * 1 = lzma
+ * 2 = nrv2b
+ * 3 = zeroes
+ */
+ u32 compression;
+ u64 entry;
+ u64 loadaddress;
+};
+
+enum compalgo {
+ ALGO_NONE = 0,
+ ALGO_LZMA = 1,
+ ALGO_NRV2B = 2,
+ ALGO_ZEROES = 3,
+ /* invalid should always be the last entry. */
+ ALGO_INVALID
+};
+
+struct mem_file {
+ void *start;
+ int len;
+ u32 reallen;
+ u32 compression;
+ void *entry;
+ void *loadaddress;
+};
+
+#endif /* LAR_H */
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h
index 5bafb305ef..be4d2a7ba3 100644
--- a/payloads/libpayload/include/libpayload.h
+++ b/payloads/libpayload/include/libpayload.h
@@ -36,6 +36,7 @@
#include <arch/io.h>
#include <sysinfo.h>
#include <stdarg.h>
+#include <lar.h>
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
@@ -207,6 +208,55 @@ struct timeval {
int gettimeofday(struct timeval *tv, void *tz);
+/* libc/lar.c */
+
+struct LAR {
+ void * start;
+ int cindex;
+ int count;
+ int alloc;
+ int eof;
+ void **headers;
+};
+
+struct larent {
+ u8 name[LAR_MAX_PATHLEN];
+};
+
+struct larstat {
+ u32 len;
+ u32 reallen;
+ u32 checksum;
+ u32 compchecksum;
+ u32 offset;
+ u32 compression;
+ u64 entry;
+ u64 loadaddress;
+};
+
+struct LFILE {
+ struct LAR *lar;
+ struct lar_header *header;
+ u32 size;
+ void *start;
+ u32 offset;
+};
+
+struct LAR *openlar(void *addr);
+int closelar(struct LAR *lar);
+struct larent *readlar(struct LAR *lar);
+void rewindlar(struct LAR *lar);
+int larstat(struct LAR *lar, const char *path, struct larstat *buf);
+struct LFILE * lfopen(struct LAR *lar, const char *filename);
+int lfread(void *ptr, size_t size, size_t nmemb, struct LFILE *stream);
+
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+
+int lfseek(struct LFILE *stream, long offset, int whence);
+int lfclose(struct LFILE *file);
+
/* i386/coreboot.c */
int get_coreboot_info(struct sysinfo_t *info);