This change adds PPC support to libpayload, and hooks it up in the build process.
In addition to these changes, the following directory moves must happen:

i386 -> arch/i386
include/arch -> include/i386/arch

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>

diff -x .svn -urN libpayload.upstream/arch/powerpc/coreboot.c libpayload.ours/arch/powerpc/coreboot.c
--- libpayload.upstream/arch/powerpc/coreboot.c	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/coreboot.c	2009-05-19 00:14:34.000000000 +0200
@@ -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 <libpayload-config.h>
+#include <libpayload.h>
+#include <coreboot_tables.h>
+
+/*
+ * 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 -x .svn -urN libpayload.upstream/arch/powerpc/exec.S libpayload.ours/arch/powerpc/exec.S
--- libpayload.upstream/arch/powerpc/exec.S	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/exec.S	2009-05-19 00:14:34.000000000 +0200
@@ -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 -x .svn -urN libpayload.upstream/arch/powerpc/head.S libpayload.ours/arch/powerpc/head.S
--- libpayload.upstream/arch/powerpc/head.S	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/head.S	2009-05-19 00:14:34.000000000 +0200
@@ -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 -x .svn -urN libpayload.upstream/arch/powerpc/main.c libpayload.ours/arch/powerpc/main.c
--- libpayload.upstream/arch/powerpc/main.c	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/main.c	2009-05-19 00:14:34.000000000 +0200
@@ -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 <libpayload.h>
+
+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 -x .svn -urN libpayload.upstream/arch/powerpc/Makefile.inc libpayload.ours/arch/powerpc/Makefile.inc
--- libpayload.upstream/arch/powerpc/Makefile.inc	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/Makefile.inc	2009-05-19 00:14:34.000000000 +0200
@@ -0,0 +1,33 @@
+##
+## 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/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
+
diff -x .svn -urN libpayload.upstream/arch/powerpc/sysinfo.c libpayload.ours/arch/powerpc/sysinfo.c
--- libpayload.upstream/arch/powerpc/sysinfo.c	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/sysinfo.c	2009-05-19 00:14:34.000000000 +0200
@@ -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 <libpayload-config.h>
+#include <libpayload.h>
+#include <coreboot_tables.h>
+#include <multiboot_tables.h>
+
+/**
+ * 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 -x .svn -urN libpayload.upstream/arch/powerpc/timer.c libpayload.ours/arch/powerpc/timer.c
--- libpayload.upstream/arch/powerpc/timer.c	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/timer.c	2009-05-19 00:14:34.000000000 +0200
@@ -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 <libpayload.h>
+// #include <arch/rdtsc.h>
+
+/**
+ * @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 -x .svn -urN libpayload.upstream/arch/powerpc/util.S libpayload.ours/arch/powerpc/util.S
--- libpayload.upstream/arch/powerpc/util.S	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/util.S	2009-05-19 00:14:34.000000000 +0200
@@ -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 -x .svn -urN libpayload.upstream/arch/powerpc/virtual.c libpayload.ours/arch/powerpc/virtual.c
--- libpayload.upstream/arch/powerpc/virtual.c	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/arch/powerpc/virtual.c	2009-05-19 00:14:34.000000000 +0200
@@ -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 -x .svn -urN libpayload.upstream/Config.in libpayload.ours/Config.in
--- libpayload.upstream/Config.in	2009-05-19 00:14:28.000000000 +0200
+++ libpayload.ours/Config.in	2009-05-19 00:14:35.000000000 +0200
@@ -30,15 +30,27 @@
 
 mainmenu "Libpayload Configuration"
 
-# When (if) we support multiple architectures, this will become an option.
+menu "Architecture Options"
+
+choice
+        prompt "Target Architecture"
+        default TARGET_I386
+
 config TARGET_I386
-	bool
-	default y
+        bool "x86"
+        help
+          Support the x86 architecture
 
-menu "Architecture Options"
+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 -x .svn -urN libpayload.upstream/i386/Makefile.inc libpayload.ours/i386/Makefile.inc
--- libpayload.upstream/i386/Makefile.inc	2009-05-19 00:14:28.000000000 +0200
+++ libpayload.ours/i386/Makefile.inc	2009-05-19 00:14:34.000000000 +0200
@@ -27,9 +27,9 @@
 ## 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/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) += i386/multiboot.o
+TARGETS-$(CONFIG_MULTIBOOT) += arch/i386/multiboot.o
diff -x .svn -urN libpayload.upstream/include/powerpc/arch/endian.h libpayload.ours/include/powerpc/arch/endian.h
--- libpayload.upstream/include/powerpc/arch/endian.h	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/include/powerpc/arch/endian.h	2009-05-19 00:14:34.000000000 +0200
@@ -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 <arch/types.h>
+
+#define ntohw(in) (in)
+
+#define ntohl(in) (in)
+
+#define ntohll(in) (in)
+
+#endif
diff -x .svn -urN libpayload.upstream/include/powerpc/arch/io.h libpayload.ours/include/powerpc/arch/io.h
--- libpayload.upstream/include/powerpc/arch/io.h	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/include/powerpc/arch/io.h	2009-05-19 00:14:34.000000000 +0200
@@ -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 -x .svn -urN libpayload.upstream/include/powerpc/arch/types.h libpayload.ours/include/powerpc/arch/types.h
--- libpayload.upstream/include/powerpc/arch/types.h	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/include/powerpc/arch/types.h	2009-05-19 00:14:34.000000000 +0200
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the libpayload project.
+ *
+ * Copyright (C) 2007 Uwe Hermann <uwe@hermann-uwe.de>
+ *
+ * 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 -x .svn -urN libpayload.upstream/include/powerpc/arch/virtual.h libpayload.ours/include/powerpc/arch/virtual.h
--- libpayload.upstream/include/powerpc/arch/virtual.h	1970-01-01 01:00:00.000000000 +0100
+++ libpayload.ours/include/powerpc/arch/virtual.h	2009-05-19 00:14:34.000000000 +0200
@@ -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 -x .svn -urN libpayload.upstream/libc/malloc.c libpayload.ours/libc/malloc.c
--- libpayload.upstream/libc/malloc.c	2009-05-19 00:14:28.000000000 +0200
+++ libpayload.ours/libc/malloc.c	2009-05-19 00:14:34.000000000 +0200
@@ -103,16 +103,22 @@
 				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 -x .svn -urN libpayload.upstream/libc/time.c libpayload.ours/libc/time.c
--- libpayload.upstream/libc/time.c	2009-05-19 00:14:28.000000000 +0200
+++ libpayload.ours/libc/time.c	2009-05-19 00:14:34.000000000 +0200
@@ -34,7 +34,9 @@
 
 #include <libpayload-config.h>
 #include <libpayload.h>
+#ifdef CONFIG_TARGET_I386
 #include <arch/rdtsc.h>
+#endif
 
 extern u32 cpu_khz;
 
@@ -47,6 +49,7 @@
 #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 @@
 	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.
  *
diff -x .svn -urN libpayload.upstream/Makefile libpayload.ours/Makefile
--- libpayload.upstream/Makefile	2009-05-19 00:14:28.000000000 +0200
+++ libpayload.ours/Makefile	2009-05-19 00:14:35.000000000 +0200
@@ -34,7 +34,7 @@
 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 @@
 
 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 @@
 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 @@
 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 @@
 	$(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 @@
 
 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
