Index: arch/ppc/Makefile.inc
===================================================================
--- arch/ppc/Makefile.inc	(revision db5e25fded450f437b3829aa1a7d37235477e5df)
+++ arch/ppc/Makefile.inc	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -17,4 +17,5 @@
 arch_sources= \
 	arch/ppc.c \
+	arch/debug/panic.s \
 	arch/fpu_context.c \
 	arch/dummy.s \
@@ -22,4 +23,5 @@
 	arch/asm.s \
 	arch/mm/frame.c \
+	arch/mm/memory_init.c \
 	arch/mm/page.c \
 	arch/drivers/ofw.c
Index: arch/ppc/include/asm.h
===================================================================
--- arch/ppc/include/asm.h	(revision db5e25fded450f437b3829aa1a7d37235477e5df)
+++ arch/ppc/include/asm.h	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -1,4 +1,4 @@
 /*
- * Copyright (C) 2005 Jakub Jermar
+ * Copyright (C) 2005 Martin Decky
  * All rights reserved.
  *
@@ -33,4 +33,43 @@
 #include <config.h>
 
+/** Set priority level low
+ *
+ * Enable interrupts and return previous
+ * value of EE.
+ */
+static inline pri_t cpu_priority_low(void) {
+	pri_t v;
+	__asm__ volatile (
+		"\n"
+		: "=r" (v)
+	);
+	return v;
+}
+
+/** Set priority level high
+ *
+ * Disable interrupts and return previous
+ * value of EE.
+ */
+static inline pri_t cpu_priority_high(void) {
+	pri_t v;
+	__asm__ volatile (
+		"\n"
+		: "=r" (v)
+	);
+	return v;
+}
+
+/** Restore priority level
+ *
+ * Restore EE.
+ */
+static inline void cpu_priority_restore(pri_t pri) {
+	__asm__ volatile (
+		"\n"
+		: : "r" (pri)
+	);
+}
+
 /* TODO: implement the real stuff */
 static inline __address get_stack_base(void)
Index: arch/ppc/include/asm/macro.h
===================================================================
--- arch/ppc/include/asm/macro.h	(revision db5e25fded450f437b3829aa1a7d37235477e5df)
+++ arch/ppc/include/asm/macro.h	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -74,4 +74,7 @@
 #define	r30	30
 #define	r31	31
+
+/* GPR Aliases */
+#define	sp	1
 
 /* Floating Point Registers (FPRs) */
Index: arch/ppc/include/drivers/ofw.h
===================================================================
--- arch/ppc/include/drivers/ofw.h	(revision db5e25fded450f437b3829aa1a7d37235477e5df)
+++ arch/ppc/include/drivers/ofw.h	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -36,13 +36,69 @@
 typedef __u32 ofw_arg_t;
 typedef __u32 ihandle;
+typedef __u32 phandle;
 
-struct ofw_args_t {
-	const char *service;
-	int nargs;
-	int nret;
-	ofw_arg_t args[MAX_OFW_ARGS];
-};
+/** OpenFirmware command structure
+ *
+ */
+typedef struct {
+	const char *service;          /**< Command name */
+	__u32 nargs;                  /**< Number of in arguments */
+	__u32 nret;                   /**< Number of out arguments */
+	ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */
+} ofw_args_t;
 
-typedef void (*ofw_entry)(struct ofw_args_t *);
+/** OpenFirmware device address range structure
+ *
+ */
+typedef struct {
+	__u32 space;
+	__u32 address;
+	__u32 size;
+} address_range_t;
+
+/** OpenFirmware device interrupt structure
+ *
+ */
+typedef struct {
+	__u32 line;  /**< Interrupt number */
+	__u32 flags; /**< Interrupt flags/logic */
+} interrupt_info_t;
+
+/** OpenFirmware property structure
+ *
+ */
+typedef struct property_t {
+	char *name;              /**< Property name */
+	__u32 length;            /**< Value length */
+	char *value;             /**< Property value */
+	struct property_t *next; /**< Next property in list */
+} property_t;
+
+/** OpenFirmware device descritor
+ *
+ */
+typedef struct device_node_t {
+	char *name;                     /**< Device name */
+	char *type;                     /**< Device type */
+	phandle node;                   /**< Device handle */
+	
+	__u32 n_addrs;                  /**< Number of address ranges */
+	address_range_t *addrs;         /**< Address ranges list */
+	
+	__u32 n_intrs;                  /**< Number of interrupts */
+	interrupt_info_t *intrs;        /**< Interrupts list */
+	
+	char *full_name;                /**< Device full name */
+	
+	property_t *properties;         /**< Device properties */
+	
+	struct device_node_t *parent;   /**< Parent device */
+	struct device_node_t *child;    /**< First child in tree */
+	struct device_node_t *sibling;  /**< Next device on tree level */
+	struct device_node_t *next;     /**< Next device of the same type */
+	struct device_node_t *next_all; /**< Next device in list of all nodes */
+} device_node_t;
+
+typedef void (*ofw_entry)(ofw_args_t *);
 
 extern ofw_entry ofw;
@@ -52,4 +108,6 @@
 extern int ofw_call(const char *service, const int nargs, const int nret, ...);
 extern void ofw_putchar(const char ch);
+extern phandle ofw_find_device(const char *name);
+extern int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen);
 extern void putchar(const char ch);
 
Index: arch/ppc/src/asm.s
===================================================================
--- arch/ppc/src/asm.s	(revision db5e25fded450f437b3829aa1a7d37235477e5df)
+++ arch/ppc/src/asm.s	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -27,4 +27,6 @@
 #
 
+#include <arch/asm/macro.h>
+
 .text
 
Index: arch/ppc/src/drivers/ofw.c
===================================================================
--- arch/ppc/src/drivers/ofw.c	(revision db5e25fded450f437b3829aa1a7d37235477e5df)
+++ arch/ppc/src/drivers/ofw.c	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -30,11 +30,12 @@
 #include <stdarg.h>
 
-ihandle ofw_chosen;
+ofw_entry ofw;
+
+phandle ofw_chosen;
 ihandle ofw_stdout;
-ofw_entry ofw;
 
 void ofw_init(void)
 {
-	ofw_chosen = ofw_call("finddevice", 1, 1, "/chosen");
+	ofw_chosen = ofw_find_device("/chosen");
 	if (ofw_chosen == -1)
 		ofw_done();
@@ -53,5 +54,5 @@
 {
 	va_list list;
-	struct ofw_args_t args;
+	ofw_args_t args;
 	int i;
 	
@@ -78,5 +79,15 @@
 		return;
 	
-	ofw_call("write", 3, 1, ofw_stdout, ch, 1);
+	ofw_call("write", 3, 1, ofw_stdout, &ch, 1);
+}
+
+phandle ofw_find_device(const char *name)
+{
+	return ofw_call("finddevice", 1, 1, name);
+}
+
+int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen)
+{
+	return ofw_call("getprop", 4, 1, device, name, buf, buflen);
 }
 
Index: arch/ppc/src/dummy.s
===================================================================
--- arch/ppc/src/dummy.s	(revision db5e25fded450f437b3829aa1a7d37235477e5df)
+++ arch/ppc/src/dummy.s	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -30,8 +30,5 @@
 
 .global memcopy
-.global cpu_priority_high
-.global cpu_priority_low
 .global cpu_priority_read
-.global cpu_priority_restore
 .global memsetb
 .global context_save
@@ -39,9 +36,7 @@
 .global userspace
 .global before_thread_runs_arch
-.global panic_printf
 .global cpu_identify
 .global cpu_arch_init
 .global cpu_print_report
-.global get_memory_size
 .global arch_pre_mm_init
 .global arch_post_mm_init
@@ -52,7 +47,4 @@
 
 memcopy:
-cpu_priority_high:
-cpu_priority_low:
-cpu_priority_restore:
 cpu_priority_read:
 memsetb:
@@ -63,9 +55,7 @@
 calibrate_delay_loop:
 asm_delay_loop:
-panic_printf:
 cpu_identify:
 cpu_arch_init:
 cpu_print_report:
-get_memory_size:
 arch_pre_mm_init:
 arch_post_mm_init:
Index: arch/ppc/src/mm/memory_init.c
===================================================================
--- arch/ppc/src/mm/memory_init.c	(revision 10caad058d67667161638f7fa111c763899ec013)
+++ arch/ppc/src/mm/memory_init.c	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2005 Martin Decky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - 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.
+ * - 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 ``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 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 <arch/mm/memory_init.h>
+#include <arch/drivers/ofw.h>
+#include <panic.h>
+
+#define MEMMAP_MAX_RECORDS 32
+
+typedef struct {
+	__u32 start;
+	__u32 size;
+} memmap_t;
+
+size_t get_memory_size(void) 
+{
+	phandle handle = ofw_find_device("/memory");
+	if (handle == -1)
+		panic("No RAM\n");
+	
+	memmap_t memmap[MEMMAP_MAX_RECORDS];
+	size_t ret = ofw_get_property(handle, "reg", &memmap, sizeof(memmap));
+	if (ret == -1)
+		panic("Device /memory has no reg property\n");
+	
+	size_t total;
+	int i;
+	
+	for (i = 0; i < MEMMAP_MAX_RECORDS; i++) {
+		if (memmap[i].size == 0)
+			break;
+		total += memmap[i].size;
+	}
+
+	return total;
+}
Index: arch/ppc/src/start.S
===================================================================
--- arch/ppc/src/start.S	(revision db5e25fded450f437b3829aa1a7d37235477e5df)
+++ arch/ppc/src/start.S	(revision 10caad058d67667161638f7fa111c763899ec013)
@@ -27,4 +27,6 @@
 #
 
+#include <arch/asm/macro.h>
+
 .section K_TEXT_START
 
