diff --git a/payloads/libpayload/Config.in b/payloads/libpayload/Config.in index 55f09f7b2d..e0add21f4d 100644 --- a/payloads/libpayload/Config.in +++ b/payloads/libpayload/Config.in @@ -30,15 +30,27 @@ mainmenu "Libpayload Configuration" -# When (if) we support multiple architectures, this will become an option. -config TARGET_I386 - bool - default y - menu "Architecture Options" +choice + prompt "Target Architecture" + default TARGET_I386 + +config TARGET_I386 + bool "x86" + help + Support the x86 architecture + +config TARGET_POWERPC + bool "PowerPC" + help + Support the PowerPC architecture + +endchoice + config MULTIBOOT bool "Multiboot header support" + depends on TARGET_I386 default y endmenu diff --git a/payloads/libpayload/Makefile b/payloads/libpayload/Makefile index 32c39575e7..8086b2949c 100644 --- a/payloads/libpayload/Makefile +++ b/payloads/libpayload/Makefile @@ -34,7 +34,7 @@ export srck := $(src)/util/kconfig export obj := $(src)/build export objk := $(src)/build/util/kconfig -export KERNELVERSION := 0.1.0 +export KERNELVERSION := 0.2.0 export KCONFIG_AUTOHEADER := $(src)/include/libpayload-config.h export KCONFIG_AUTOCONFIG := $(obj)/auto.conf @@ -68,9 +68,10 @@ else include $(src)/.config -ARCHDIR-$(CONFIG_TARGET_I386) := i386 +ARCHDIR-$(CONFIG_TARGET_I386) := i386 +ARCHDIR-$(CONFIG_TARGET_POWERPC) := powerpc -PLATFORM-y += $(ARCHDIR-y)/Makefile.inc +PLATFORM-y += arch/$(ARCHDIR-y)/Makefile.inc TARGETS-y := BUILD-y := crypto/Makefile.inc libc/Makefile.inc drivers/Makefile.inc @@ -84,7 +85,7 @@ all: lib include $(PLATFORM-y) $(BUILD-y) OBJS := $(patsubst %,$(obj)/%,$(TARGETS-y)) -INCLUDES := -Iinclude -Ibuild +INCLUDES := -Iinclude -Ibuild -Iinclude/$(ARCHDIR-y) INCLUDES += -I$(shell $(CC) -print-search-dirs | head -n 1 | cut -d' ' -f2)include try-run= $(shell set -e; \ @@ -107,8 +108,8 @@ all: lib lib: $(obj)/lib/libpayload.a copystuff # Copy libpayload.a and head.o into $(src)/lib where lpgcc et al expect them. -copystuff: $(obj)/$(ARCHDIR-y)/head.S.o $(obj)/lib/libpayload.a - $(Q)cp $(obj)/$(ARCHDIR-y)/head.S.o $(src)/lib/$(ARCHDIR-y)/head.o +copystuff: $(obj)/arch/$(ARCHDIR-y)/head.S.o $(obj)/lib/libpayload.a + $(Q)cp $(obj)/arch/$(ARCHDIR-y)/head.S.o $(src)/lib/$(ARCHDIR-y)/head.o $(Q)cp $(obj)/lib/libpayload.a $(src)/lib $(obj)/lib/libpayload.a: prepare $(OBJS) @@ -138,7 +139,7 @@ prepare: $(Q)mkdir -p $(obj)/util/kconfig/lxdialog $(Q)mkdir -p $(obj)/crypto $(obj)/curses $(obj)/drivers/video $(Q)mkdir -p $(obj)/drivers/usb - $(Q)mkdir -p $(obj)/i386 $(obj)/lib/$(ARCHDIR-y) $(obj)/libc + $(Q)mkdir -p $(obj)/arch/$(ARCHDIR-y) $(obj)/lib/$(ARCHDIR-y) $(obj)/libc $(Q)mkdir -p $(src)/lib/$(ARCHDIR-y) doxy: doxygen @@ -151,8 +152,8 @@ doxygen-clean: clean: doxygen-clean $(Q)rm -rf $(obj)/crypto $(obj)/curses $(obj)/drivers - $(Q)rm -rf $(obj)/i386 $(obj)/lib $(obj)/libc - $(Q)rm -rf $(src)/lib/i386 $(src)/lib/libpayload.a + $(Q)rm -rf $(obj)/i386 $(obj)/powerpc $(obj)/lib $(obj)/libc + $(Q)rm -rf $(src)/lib/i386 $(src)/lib/powerpc $(src)/lib/libpayload.a distclean: clean $(Q)rm -rf build diff --git a/payloads/libpayload/arch/i386/Makefile.inc b/payloads/libpayload/arch/i386/Makefile.inc new file mode 100644 index 0000000000..6461b72b79 --- /dev/null +++ b/payloads/libpayload/arch/i386/Makefile.inc @@ -0,0 +1,35 @@ +## +## 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. +## + +TARGETS-y += arch/i386/head.S.o arch/i386/main.o arch/i386/sysinfo.o +TARGETS-y += arch/i386/timer.o arch/i386/coreboot.o arch/i386/util.S.o +TARGETS-y += arch/i386/exec.S.o arch/i386/virtual.o + +# Multiboot support is configurable +TARGETS-$(CONFIG_MULTIBOOT) += arch/i386/multiboot.o diff --git a/payloads/libpayload/i386/coreboot.c b/payloads/libpayload/arch/i386/coreboot.c similarity index 100% rename from payloads/libpayload/i386/coreboot.c rename to payloads/libpayload/arch/i386/coreboot.c diff --git a/payloads/libpayload/i386/exec.S b/payloads/libpayload/arch/i386/exec.S similarity index 100% rename from payloads/libpayload/i386/exec.S rename to payloads/libpayload/arch/i386/exec.S diff --git a/payloads/libpayload/i386/head.S b/payloads/libpayload/arch/i386/head.S similarity index 100% rename from payloads/libpayload/i386/head.S rename to payloads/libpayload/arch/i386/head.S diff --git a/payloads/libpayload/i386/main.c b/payloads/libpayload/arch/i386/main.c similarity index 100% rename from payloads/libpayload/i386/main.c rename to payloads/libpayload/arch/i386/main.c diff --git a/payloads/libpayload/i386/multiboot.c b/payloads/libpayload/arch/i386/multiboot.c similarity index 100% rename from payloads/libpayload/i386/multiboot.c rename to payloads/libpayload/arch/i386/multiboot.c diff --git a/payloads/libpayload/i386/sysinfo.c b/payloads/libpayload/arch/i386/sysinfo.c similarity index 100% rename from payloads/libpayload/i386/sysinfo.c rename to payloads/libpayload/arch/i386/sysinfo.c diff --git a/payloads/libpayload/i386/timer.c b/payloads/libpayload/arch/i386/timer.c similarity index 100% rename from payloads/libpayload/i386/timer.c rename to payloads/libpayload/arch/i386/timer.c diff --git a/payloads/libpayload/i386/util.S b/payloads/libpayload/arch/i386/util.S similarity index 100% rename from payloads/libpayload/i386/util.S rename to payloads/libpayload/arch/i386/util.S diff --git a/payloads/libpayload/i386/virtual.c b/payloads/libpayload/arch/i386/virtual.c similarity index 100% rename from payloads/libpayload/i386/virtual.c rename to payloads/libpayload/arch/i386/virtual.c diff --git a/payloads/libpayload/i386/Makefile.inc b/payloads/libpayload/arch/powerpc/Makefile.inc similarity index 86% rename from payloads/libpayload/i386/Makefile.inc rename to payloads/libpayload/arch/powerpc/Makefile.inc index 40d2699062..ddfb9fb560 100644 --- a/payloads/libpayload/i386/Makefile.inc +++ b/payloads/libpayload/arch/powerpc/Makefile.inc @@ -27,9 +27,7 @@ ## SUCH DAMAGE. ## -TARGETS-y += i386/head.S.o i386/main.o i386/sysinfo.o -TARGETS-y += i386/timer.o i386/coreboot.o i386/util.S.o -TARGETS-y += i386/exec.S.o i386/virtual.o +TARGETS-y += arch/powerpc/head.S.o arch/powerpc/main.o arch/powerpc/sysinfo.o +TARGETS-y += arch/powerpc/timer.o arch/powerpc/coreboot.o arch/powerpc/util.S.o +TARGETS-y += arch/powerpc/exec.S.o arch/powerpc/virtual.o -# Multiboot support is configurable -TARGETS-$(CONFIG_MULTIBOOT) += i386/multiboot.o diff --git a/payloads/libpayload/arch/powerpc/coreboot.c b/payloads/libpayload/arch/powerpc/coreboot.c new file mode 100644 index 0000000000..95d8f16f76 --- /dev/null +++ b/payloads/libpayload/arch/powerpc/coreboot.c @@ -0,0 +1,169 @@ +/* + * This file is part of the libpayload project. + * + * Copyright (C) 2008 Advanced Micro Devices, Inc. + * Copyright (C) 2009 coresystems GmbH + * + * 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. + */ + +#include +#include +#include + +/* + * Some of this is x86 specific, and the rest of it is generic. Right now, + * since we only support x86, we'll avoid trying to make lots of infrastructure + * we don't need. If in the future, we want to use coreboot on some other + * architecture, then take out the generic parsing code and move it elsewhere. + */ + +/* === Parsing code === */ +/* This is the generic parsing code. */ + +static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info) +{ + struct cb_memory *mem = (struct cb_memory *)ptr; + int count = MEM_RANGE_COUNT(mem); + int i; + + if (count > SYSINFO_MAX_MEM_RANGES) + count = SYSINFO_MAX_MEM_RANGES; + + info->n_memranges = 0; + + for (i = 0; i < count; i++) { + struct cb_memory_range *range = + (struct cb_memory_range *)MEM_RANGE_PTR(mem, i); + +#if MEMMAP_RAM_ONLY + if (range->type != CB_MEM_RAM) + continue; +#endif + + info->memrange[info->n_memranges].base = + UNPACK_CB64(range->start); + + info->memrange[info->n_memranges].size = + UNPACK_CB64(range->size); + + info->memrange[info->n_memranges].type = range->type; + + info->n_memranges++; + } +} + +static void cb_parse_serial(unsigned char *ptr, struct sysinfo_t *info) +{ + struct cb_serial *ser = (struct cb_serial *)ptr; + info->ser_ioport = ser->ioport; +} + +#ifdef CONFIG_NVRAM +static void cb_parse_optiontable(unsigned char *ptr, struct sysinfo_t *info) +{ + info->option_table = (struct cb_cmos_option_table *)ptr; +} + +static void cb_parse_checksum(unsigned char *ptr, struct sysinfo_t *info) +{ + struct cb_cmos_checksum *cmos_cksum = (struct cb_cmos_checksum *)ptr; + info->cmos_range_start = cmos_cksum->range_start; + info->cmos_range_end = cmos_cksum->range_end; + info->cmos_checksum_location = cmos_cksum->location; +} +#endif + +static int cb_parse_header(void *addr, int len, struct sysinfo_t *info) +{ + struct cb_header *header; + unsigned char *ptr = (unsigned char *)addr; + int i; + + for (i = 0; i < len; i += 16, ptr += 16) { + header = (struct cb_header *)ptr; + if (!strncmp((const char *)header->signature, "LBIO", 4)) + break; + } + + /* We walked the entire space and didn't find anything. */ + if (i >= len) + return -1; + + if (!header->table_bytes) + return 0; + + /* Make sure the checksums match. */ + if (ipchksum((u16 *) header, sizeof(*header)) != 0) + return -1; + + if (ipchksum((u16 *) (ptr + sizeof(*header)), + header->table_bytes) != header->table_checksum) + return -1; + + /* Now, walk the tables. */ + ptr += header->header_bytes; + + for (i = 0; i < header->table_entries; i++) { + struct cb_record *rec = (struct cb_record *)ptr; + + /* We only care about a few tags here (maybe more later). */ + switch (rec->tag) { + case CB_TAG_FORWARD: + return cb_parse_header((void *)(unsigned long)((struct cb_forward *)rec)->forward, len, info); + continue; + case CB_TAG_MEMORY: + cb_parse_memory(ptr, info); + break; + case CB_TAG_SERIAL: + cb_parse_serial(ptr, info); + break; +#ifdef CONFIG_NVRAM + case CB_TAG_CMOS_OPTION_TABLE: + cb_parse_optiontable(ptr, info); + break; + case CB_TAG_OPTION_CHECKSUM: + cb_parse_checksum(ptr, info); + break; +#endif + } + + ptr += rec->size; + } + + return 1; +} + +/* == Architecture specific == */ +/* This is the x86 specific stuff. */ + +int get_coreboot_info(struct sysinfo_t *info) +{ + int ret = cb_parse_header(phys_to_virt(0x00000000), 0x1000, info); + + if (ret != 1) + ret = cb_parse_header(phys_to_virt(0x000f0000), 0x1000, info); + + return (ret == 1) ? 0 : -1; +} diff --git a/payloads/libpayload/arch/powerpc/exec.S b/payloads/libpayload/arch/powerpc/exec.S new file mode 100644 index 0000000000..45672cba3e --- /dev/null +++ b/payloads/libpayload/arch/powerpc/exec.S @@ -0,0 +1,100 @@ +/* + * 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. + */ + +/* calling syntax: i386_do_exec(long addr, int argc, char **argv, int *ret) */ + +/* This implements the payload API detailed here: + * http://www.coreboot.org/Payload_API + */ + +.align 4 +.text + +.globl powerpc_do_exec + .type powerpc_do_exec,@function + +powerpc_do_exec: +#if 0 + pushl %ebp + movl %esp, %ebp + pushl %eax + + /* Put the run address in %eax */ + movl 8(%ebp), %eax + + /* Save off the rest of the registers */ + + pushl %esi + pushl %ecx + pushl %ebp + + /* Push the argc and argv pointers on to the stack */ + + movl 12(%ebp), %esi + movl 16(%ebp), %ecx + + pushl %esi + pushl %ecx + + /* Move a "magic" number on the stack - the other + * payload will use this as a clue that the argc + * and argv are sane + */ + + movl $12345678, %ecx + pushl %ecx + + /* Jump to the code */ + call *%eax + + /* %eax has the return value */ + + /* Skip over the argc/argv stuff still on the stack */ + addl $12, %esp + + /* Get back %ebp */ + popl %ebp + + /* Get the pointer to the return value + * and save the return value in it + */ + + movl 20(%ebp), %ecx + movl %eax, (%eax) + + /* Get the rest of the saved registers */ + popl %ecx + popl %esi + popl %eax + + /* Restore the stack pointer */ + movl %ebp,%esp + popl %ebp + ret +#endif diff --git a/payloads/libpayload/arch/powerpc/head.S b/payloads/libpayload/arch/powerpc/head.S new file mode 100644 index 0000000000..de6edadaff --- /dev/null +++ b/payloads/libpayload/arch/powerpc/head.S @@ -0,0 +1,87 @@ +/* + * 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. + */ + + .globl _entry, _leave + .text + .align 4 + +/* + * Our entry point - assume that the CPU is in 32 bit protected mode and + * all segments are in a flat model. That's our operating mode, so we won't + * change anything. + */ +_entry: +#if 0 + call _init + + /* We're back - go back to the bootloader. */ + ret + .align 4 + + +/* + * This function saves off the previous stack and switches us to our + * own execution environment. + */ +_init: + /* No interrupts, please. */ + cli + + /* Store current stack pointer. */ + movl %esp, %esi + + /* Store EAX and EBX */ + + movl %eax,loader_eax + movl %ebx,loader_ebx + + /* Setup new stack. */ + movl $_stack, %ebx + + movl %ebx, %esp + + /* Save old stack pointer. */ + pushl %esi + + /* Let's rock. */ + call start_main + +#endif + /* %eax has the return value - pass it on unmolested */ +_leave: +#if 0 + /* Get old stack pointer. */ + popl %ebx + + /* Restore old stack. */ + movl %ebx, %esp + + /* Return to the original context. */ + ret +#endif diff --git a/payloads/libpayload/arch/powerpc/main.c b/payloads/libpayload/arch/powerpc/main.c new file mode 100644 index 0000000000..48d6ef5495 --- /dev/null +++ b/payloads/libpayload/arch/powerpc/main.c @@ -0,0 +1,70 @@ +/* + * 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. + */ + +#include + +unsigned long loader_eax; /**< The value of EAX passed from the loader */ +unsigned long loader_ebx; /**< The value of EBX passed from the loader */ + +unsigned int main_argc; /**< The argc value to pass to main() */ + +/** The argv value to pass to main() */ +char *main_argv[MAX_ARGC_COUNT]; + +/** + * This is our C entry function - set up the system + * and jump into the payload entry point. + */ +void start_main(void) +{ + extern int main(int argc, char **argv); + + /* Set up the consoles. */ + console_init(); + + /* Gather system information. */ + lib_get_sysinfo(); + + /* + * Any other system init that has to happen before the + * user gets control goes here. + */ + + /* + * Go to the entry point. + * In the future we may care about the return value. + */ + + (void) main(main_argc, (main_argc != 0) ? main_argv : NULL); + + /* + * Returning here will go to the _leave function to return + * us to the original context. + */ +} diff --git a/payloads/libpayload/arch/powerpc/sysinfo.c b/payloads/libpayload/arch/powerpc/sysinfo.c new file mode 100644 index 0000000000..599a81140d --- /dev/null +++ b/payloads/libpayload/arch/powerpc/sysinfo.c @@ -0,0 +1,76 @@ +/* + * 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. + */ + +#include +#include +#include +#include + +/** + * This is a global structure that is used through the library - we set it + * up initially with some dummy values - hopefully they will be overridden. + */ +struct sysinfo_t lib_sysinfo = { + .cpu_khz = 200, +#ifdef CONFIG_SERIAL_CONSOLE + .ser_ioport = CONFIG_SERIAL_IOBASE, +#else + .ser_ioport = 0x3f8, +#endif +}; + +void lib_get_sysinfo(void) +{ + /* Get the CPU speed (for delays). */ + lib_sysinfo.cpu_khz = get_cpu_speed(); + +#ifdef CONFIG_MULTIBOOT + /* Get the information from the multiboot tables, + * if they exist */ + get_multiboot_info(&lib_sysinfo); +#endif + + /* Get information from the coreboot tables, + * if they exist */ + + get_coreboot_info(&lib_sysinfo); + + if (!lib_sysinfo.n_memranges) { + /* If we can't get a good memory range, use the default. */ + lib_sysinfo.n_memranges = 2; + + lib_sysinfo.memrange[0].base = 0; + lib_sysinfo.memrange[0].size = 640 * 1024; + lib_sysinfo.memrange[0].type = CB_MEM_RAM; + + lib_sysinfo.memrange[1].base = 1024 * 1024; + lib_sysinfo.memrange[1].size = 31 * 1024 * 1024; + lib_sysinfo.memrange[1].type = CB_MEM_RAM; + } +} diff --git a/payloads/libpayload/arch/powerpc/timer.c b/payloads/libpayload/arch/powerpc/timer.c new file mode 100644 index 0000000000..ba824b0d57 --- /dev/null +++ b/payloads/libpayload/arch/powerpc/timer.c @@ -0,0 +1,127 @@ +/* + * 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. + */ + +/** + * @file i386/timer.c + * i386 specific timer routines + */ + +#include +// #include + +/** + * @ingroup arch + * Global variable containing the speed of the processor in KHz. + */ +u32 cpu_khz; + +/** + * Calculate the speed of the processor for use in delays. + * + * @return The CPU speed in kHz. + */ +unsigned int get_cpu_speed(void) +{ +#if 0 + unsigned long long start, end; + + /* Set up the PPC port - disable the speaker, enable the T2 gate. */ + outb((inb(0x61) & ~0x02) | 0x01, 0x61); + + /* Set the PIT to Mode 0, counter 2, word access. */ + outb(0xB0, 0x43); + + /* Load the counter with 0xffff. */ + outb(0xff, 0x42); + outb(0xff, 0x42); + + /* Read the number of ticks during the period. */ + start = rdtsc(); + while (!(inb(0x61) & 0x20)) ; + end = rdtsc(); + + /* + * The clock rate is 1193180 Hz, the number of milliseconds for a + * period of 0xffff is 1193180 / (0xFFFF * 1000) or .0182. + * Multiply that by the number of measured clocks to get the kHz value. + */ + cpu_khz = (unsigned int)((end - start) * 1193180U / (1000 * 0xffff)); +#else + cpu_khz = 200 * 1024; +#endif + return cpu_khz; +} + +static inline void _delay(unsigned long long delta) +{ +#if 0 + unsigned long long timeout = rdtsc() + delta; + while (rdtsc() < timeout) ; +#endif +} + +/** + * Delay for a specified number of nanoseconds. + * + * @param n Number of nanoseconds to delay for. + */ +void ndelay(unsigned int n) +{ + _delay(n * cpu_khz / 1000000); +} + +/** + * Delay for a specified number of microseconds. + * + * @param n Number of microseconds to delay for. + */ +void udelay(unsigned int n) +{ + _delay(n * cpu_khz / 1000); +} + +/** + * Delay for a specified number of milliseconds. + * + * @param m Number of milliseconds to delay for. + */ +void mdelay(unsigned int m) +{ + _delay(m * cpu_khz); +} + +/** + * Delay for a specified number of seconds. + * + * @param s Number of seconds to delay for. + */ +void delay(unsigned int s) +{ + _delay(s * cpu_khz * 1000); +} diff --git a/payloads/libpayload/arch/powerpc/util.S b/payloads/libpayload/arch/powerpc/util.S new file mode 100644 index 0000000000..2905be7d8c --- /dev/null +++ b/payloads/libpayload/arch/powerpc/util.S @@ -0,0 +1,40 @@ +/* + * 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. + */ + + .globl halt + .text + .align 4 + +/* This function puts the system into a halt. */ +halt: +#if 0 + cli + hlt + jmp halt +#endif diff --git a/payloads/libpayload/arch/powerpc/virtual.c b/payloads/libpayload/arch/powerpc/virtual.c new file mode 100644 index 0000000000..cff26117dc --- /dev/null +++ b/payloads/libpayload/arch/powerpc/virtual.c @@ -0,0 +1,32 @@ +/* + * This file is part of the libpayload project. + * + * Copyright (C) 2008 coresystems GmbH + * + * 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. + */ + + +unsigned long virtual_offset = 0; + diff --git a/payloads/libpayload/configs/defconfig b/payloads/libpayload/configs/defconfig index 738d6c80bc..03c15fc9d1 100644 --- a/payloads/libpayload/configs/defconfig +++ b/payloads/libpayload/configs/defconfig @@ -1,13 +1,14 @@ # # Automatically generated make config: don't edit -# libpayload version: 0.1.0 -# Thu Sep 25 16:03:40 2008 +# libpayload version: 0.2.0 +# Thu May 21 12:01:39 2009 # -CONFIG_TARGET_I386=y # # Architecture Options # +CONFIG_TARGET_I386=y +# CONFIG_TARGET_POWERPC is not set # CONFIG_MULTIBOOT is not set # diff --git a/payloads/libpayload/include/arch/endian.h b/payloads/libpayload/include/i386/arch/endian.h similarity index 100% rename from payloads/libpayload/include/arch/endian.h rename to payloads/libpayload/include/i386/arch/endian.h diff --git a/payloads/libpayload/include/arch/io.h b/payloads/libpayload/include/i386/arch/io.h similarity index 100% rename from payloads/libpayload/include/arch/io.h rename to payloads/libpayload/include/i386/arch/io.h diff --git a/payloads/libpayload/include/arch/msr.h b/payloads/libpayload/include/i386/arch/msr.h similarity index 100% rename from payloads/libpayload/include/arch/msr.h rename to payloads/libpayload/include/i386/arch/msr.h diff --git a/payloads/libpayload/include/arch/rdtsc.h b/payloads/libpayload/include/i386/arch/rdtsc.h similarity index 100% rename from payloads/libpayload/include/arch/rdtsc.h rename to payloads/libpayload/include/i386/arch/rdtsc.h diff --git a/payloads/libpayload/include/arch/types.h b/payloads/libpayload/include/i386/arch/types.h similarity index 100% rename from payloads/libpayload/include/arch/types.h rename to payloads/libpayload/include/i386/arch/types.h diff --git a/payloads/libpayload/include/arch/virtual.h b/payloads/libpayload/include/i386/arch/virtual.h similarity index 100% rename from payloads/libpayload/include/arch/virtual.h rename to payloads/libpayload/include/i386/arch/virtual.h diff --git a/payloads/libpayload/include/powerpc/arch/endian.h b/payloads/libpayload/include/powerpc/arch/endian.h new file mode 100644 index 0000000000..8ffad70f0b --- /dev/null +++ b/payloads/libpayload/include/powerpc/arch/endian.h @@ -0,0 +1,41 @@ +/* + * 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 + +#include + +#define ntohw(in) (in) + +#define ntohl(in) (in) + +#define ntohll(in) (in) + +#endif diff --git a/payloads/libpayload/include/powerpc/arch/io.h b/payloads/libpayload/include/powerpc/arch/io.h new file mode 100644 index 0000000000..1676a8a119 --- /dev/null +++ b/payloads/libpayload/include/powerpc/arch/io.h @@ -0,0 +1,123 @@ +/* + * This file is part of the libpayload project. + * + * Copyright (C) 2008 Advanced Micro Devices, Inc. + * Copyright (C) 2008-2009 coresystems GmbH + * + * 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_IO_H +#define _ARCH_IO_H + +extern uint32_t isa_io_base; + +#define readb(_a) (*(volatile unsigned char *) (_a)) +#define readw(_a) (*(volatile unsigned short *) (_a)) +#define readl(_a) (*(volatile unsigned long *) (_a)) + +#define writeb(_v, _a) (*(volatile unsigned char *) (_a) = (_v)) +#define writew(_v, _a) (*(volatile unsigned short *) (_a) = (_v)) +#define writel(_v, _a) (*(volatile unsigned long *) (_a) = (_v)) + +static inline unsigned long inl(int port) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + unsigned long val; + __asm__ __volatile__("lhbrx %0,0,%1; eieio":"=r"(val): + "r"(addr), "m"(*addr)); + return val; +} + +static inline unsigned short inw(int port) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + unsigned short val; + __asm__ __volatile__("lwbrx %0,0,%1; eieio":"=r"(val):"r"(addr), "m"(*addr)); + return val; +} + +static inline unsigned char inb(int port) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + unsigned char val; + __asm__ __volatile__("lbz%U1%X1 %0,%1; eieio":"=r"(val):"m"(*addr)); + return val; +} + +static inline void outl(unsigned long val, int port) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + __asm__ __volatile__("stb%U0%X0 %1,%0; eieio":"=m"(*addr):"r"(val)); +} + +static inline void outw(unsigned short val, int port) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + __asm__ __volatile__("sthbrx %1,0,%2; eieio":"=m"(*addr):"r"(val),"r"(addr)); +} + +static inline void outb(unsigned char val, int port) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + __asm__ __volatile__("stwbrx %1,0,%2; eieio":"=m"(*addr):"r"(val), "r"(addr)); +} + +static inline void outsl(int port, const void *addr, unsigned long count) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + //__asm__ __volatile__("rep; outsl" : "+S"(addr), "+c"(count) : "d"(port)); +} + +static inline void outsw(int port, const void *addr, unsigned long count) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + //__asm__ __volatile__("rep; outsw" : "+S"(addr), "+c"(count) : "d"(port)); +} + +static inline void outsb(int port, const void *addr, unsigned long count) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + //__asm__ __volatile__("rep; outsb" : "+S"(addr), "+c"(count) : "d"(port)); +} + +static inline void insl(int port, void *addr, unsigned long count) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + //__asm__ __volatile__("rep; insl" : "+D"(addr), "+c"(count) : "d"(port)); +} + +static inline void insw(int port, void *addr, unsigned long count) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + //__asm__ __volatile__("rep; insw" : "+D"(addr), "+c"(count) : "d"(port)); +} + +static inline void insb(int port, void *addr, unsigned long count) +{ + volatile unsigned char *addr = (volatile unsigned char *)(isa_io_base + port); + //__asm__ __volatile__("rep; insb" : "+D"(addr), "+c"(count) : "d"(port)); +} + +#endif diff --git a/payloads/libpayload/include/powerpc/arch/types.h b/payloads/libpayload/include/powerpc/arch/types.h new file mode 100644 index 0000000000..1bd815bb44 --- /dev/null +++ b/payloads/libpayload/include/powerpc/arch/types.h @@ -0,0 +1,60 @@ +/* + * This file is part of the libpayload project. + * + * Copyright (C) 2007 Uwe Hermann + * + * 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_TYPES_H +#define _ARCH_TYPES_H + +typedef unsigned char uint8_t; +typedef unsigned char u8; +typedef signed char int8_t; +typedef signed char s8; + +typedef unsigned short uint16_t; +typedef unsigned short u16; +typedef signed short int16_t; +typedef signed short s16; + +typedef unsigned int uint32_t; +typedef unsigned int u32; +typedef signed int int32_t; +typedef signed int s32; + +typedef unsigned long long uint64_t; +typedef unsigned long long u64; +typedef signed long long int64_t; +typedef signed long long s64; + +typedef long time_t; +typedef long suseconds_t; + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#endif diff --git a/payloads/libpayload/include/powerpc/arch/virtual.h b/payloads/libpayload/include/powerpc/arch/virtual.h new file mode 100644 index 0000000000..328c3aa34e --- /dev/null +++ b/payloads/libpayload/include/powerpc/arch/virtual.h @@ -0,0 +1,41 @@ +/* + * This file is part of the libpayload project. + * + * Copyright (C) 2008 coresystems GmbH + * + * 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_VIRTUAL_H +#define _ARCH_VIRTUAL_H + +extern unsigned long virtual_offset; + +#define virt_to_phys(virt) ((unsigned long) (virt) + virtual_offset) +#define phys_to_virt(phys) ((void *) ((unsigned long) (phys) - virtual_offset)) + +#define virt_to_bus(addr) virt_to_phys(addr) +#define bus_to_virt(addr) phys_to_virt(addr) + +#endif diff --git a/payloads/libpayload/libc/malloc.c b/payloads/libpayload/libc/malloc.c index 24daf0e680..d18b289adf 100644 --- a/payloads/libpayload/libc/malloc.c +++ b/payloads/libpayload/libc/malloc.c @@ -103,16 +103,22 @@ static void *alloc(int len) void *nptr = ptr + (HDRSIZE + len); int nsize = size - (HDRSIZE + len); - /* Mark the block as used. */ - *((hdrtype_t *) ptr) = USED_BLOCK(len); - /* If there is still room in this block, - * then mark it as such. + * then mark it as such otherwise account + * the whole space for that block. */ - if (nsize > 0) + if (nsize > 0) { + /* Mark the block as used. */ + *((hdrtype_t *) ptr) = USED_BLOCK(len); + + /* Create a new free block. */ *((hdrtype_t *) nptr) = FREE_BLOCK(nsize); + } else { + /* Mark the block as used. */ + *((hdrtype_t *) ptr) = USED_BLOCK(size); + } return (void *)(ptr + HDRSIZE); } diff --git a/payloads/libpayload/libc/time.c b/payloads/libpayload/libc/time.c index 2d19bd173f..67675623a4 100644 --- a/payloads/libpayload/libc/time.c +++ b/payloads/libpayload/libc/time.c @@ -34,7 +34,9 @@ #include #include +#ifdef CONFIG_TARGET_I386 #include +#endif extern u32 cpu_khz; @@ -47,6 +49,7 @@ static struct { #define TICKS_PER_SEC (cpu_khz * 1000) #define TICKS_PER_USEC (cpu_khz / 1000) +#ifdef CONFIG_TARGET_I386 static void update_clock(void) { u64 delta = rdtsc() - clock.ticks; @@ -114,7 +117,16 @@ static void gettimeofday_init(void) clock.ticks = rdtsc(); } #endif +#endif +#ifdef CONFIG_TARGET_POWERPC +static void update_clock(void) +{ +} +static void gettimeofday_init(void) +{ +} +#endif /** * Return the current time broken into a timeval structure. *