Index: arch/ppc/Makefile.inc
===================================================================
--- arch/ppc/Makefile.inc	(revision ba18512d0ae6d186133c61a7c81ad78746ac76e5)
+++ arch/ppc/Makefile.inc	(revision b524f8160fac39354818c5041d71a7fbb61fa89a)
@@ -16,4 +16,5 @@
 
 arch_sources= \
+	arch/context.S \
 	arch/ppc.c \
 	arch/debug/panic.s \
Index: arch/ppc/_link.ld
===================================================================
--- arch/ppc/_link.ld	(revision ba18512d0ae6d186133c61a7c81ad78746ac76e5)
+++ arch/ppc/_link.ld	(revision b524f8160fac39354818c5041d71a7fbb61fa89a)
@@ -33,4 +33,3 @@
 	_hardcoded_kdata_size = kdata_end - kdata_start;
 	_hardcoded_load_address = 0x80000000;
-
 }
Index: arch/ppc/include/asm/macro.h
===================================================================
--- arch/ppc/include/asm/macro.h	(revision ba18512d0ae6d186133c61a7c81ad78746ac76e5)
+++ arch/ppc/include/asm/macro.h	(revision b524f8160fac39354818c5041d71a7fbb61fa89a)
@@ -192,6 +192,70 @@
 
 .macro REGISTERS_STORE r
+	stw r0, 0(\r)
+	stw r1, 4(\r)
+	stw r2, 8(\r)
+	stw r3, 12(\r)
+	stw r4, 16(\r)
+	stw r5, 20(\r)
+	stw r6, 24(\r)
+	stw r7, 28(\r)
+	stw r8, 32(\r)
+	stw r9, 36(\r)
+	stw r10, 40(\r)
+	stw r11, 44(\r)
+	stw r12, 48(\r)
+	stw r13, 52(\r)
+	stw r14, 56(\r)
+	stw r15, 60(\r)
+	stw r16, 64(\r)
+	stw r17, 68(\r)
+	stw r18, 72(\r)
+	stw r19, 76(\r)
+	stw r20, 80(\r)
+	stw r21, 84(\r)
+	stw r22, 88(\r)
+	stw r23, 92(\r)
+	stw r24, 96(\r)
+	stw r25, 100(\r)
+	stw r26, 104(\r)
+	stw r27, 108(\r)
+	stw r28, 112(\r)
+	stw r29, 116(\r)
+	stw r30, 120(\r)
+	stw r31, 124(\r)
 .endm
 
 .macro REGISTERS_LOAD r
+	lwz r0, 0(\r)
+	lwz r1, 4(\r)
+	lwz r2, 8(\r)  
+	lwz r3, 12(\r)
+	lwz r4, 16(\r) 
+	lwz r5, 20(\r)
+	lwz r6, 24(\r)
+	lwz r7, 28(\r)
+	lwz r8, 32(\r)
+	lwz r9, 36(\r)
+	lwz r10, 40(\r)
+	lwz r11, 44(\r)
+	lwz r12, 48(\r)
+	lwz r13, 52(\r)
+	lwz r14, 56(\r)
+	lwz r15, 60(\r)
+	lwz r16, 64(\r)
+	lwz r17, 68(\r)
+	lwz r18, 72(\r)
+	lwz r19, 76(\r)
+	lwz r20, 80(\r)
+	lwz r21, 84(\r)
+	lwz r22, 88(\r)
+	lwz r23, 92(\r)
+	lwz r24, 96(\r)
+	lwz r25, 100(\r)
+	lwz r26, 104(\r)
+	lwz r27, 108(\r)
+	lwz r28, 112(\r)
+	lwz r29, 116(\r)
+	lwz r30, 120(\r)
+	lwz r31, 124(\r)
 .endm
Index: arch/ppc/include/context.h
===================================================================
--- arch/ppc/include/context.h	(revision ba18512d0ae6d186133c61a7c81ad78746ac76e5)
+++ arch/ppc/include/context.h	(revision b524f8160fac39354818c5041d71a7fbb61fa89a)
@@ -32,10 +32,40 @@
 #include <arch/types.h>
 
-#define SP_DELTA	0
+#define SP_DELTA	4
 
 struct context {
+	__u32 r0;
 	__u32 sp;
+	__u32 r2;
+	__u32 r3;
+	__u32 r4;
+	__u32 r5;
+	__u32 r6;
+	__u32 r7;
+	__u32 r8;
+	__u32 r9;
+	__u32 r10;
+	__u32 r11;
+	__u32 r12;
+	__u32 r13;
+	__u32 r14;
+	__u32 r15;
+	__u32 r16;
+	__u32 r17;
+	__u32 r18;
+	__u32 r19;
+	__u32 r20;
+	__u32 r21;
+	__u32 r22;
+	__u32 r23;
+	__u32 r24;
+	__u32 r25;
+	__u32 r26;
+	__u32 r27;
+	__u32 r28;
+	__u32 r29;
+	__u32 r30;
+	__u32 r31;
 	__u32 pc;
-	
 	pri_t pri;
 } __attribute__ ((packed));
Index: arch/ppc/src/context.S
===================================================================
--- arch/ppc/src/context.S	(revision b524f8160fac39354818c5041d71a7fbb61fa89a)
+++ arch/ppc/src/context.S	(revision b524f8160fac39354818c5041d71a7fbb61fa89a)
@@ -0,0 +1,54 @@
+#
+# 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/asm/macro.h>
+
+.text   
+
+.global context_save
+.global context_restore
+
+context_save:
+	REGISTERS_STORE r3
+	
+	mflr r3
+	stw r3, 128(r3)
+	
+	# context_save returns 1
+	li r3, 1
+	blr
+	
+context_restore:
+	REGISTERS_LOAD r3
+	
+	lwz r3, 128(r3)
+	mtlr r3
+	
+	# context_restore returns 0
+	li r3, 0
+	blr
Index: arch/ppc/src/dummy.s
===================================================================
--- arch/ppc/src/dummy.s	(revision ba18512d0ae6d186133c61a7c81ad78746ac76e5)
+++ arch/ppc/src/dummy.s	(revision b524f8160fac39354818c5041d71a7fbb61fa89a)
@@ -29,9 +29,8 @@
 .text
 
+.global memcpy
 .global memcopy
 .global cpu_priority_read
 .global memsetb
-.global context_save
-.global context_restore
 .global userspace
 .global before_thread_runs_arch
@@ -46,9 +45,8 @@
 .global dummy
 
+memcpy:
 memcopy:
 cpu_priority_read:
 memsetb:
-context_save:
-context_restore:
 before_thread_runs_arch:
 userspace:
Index: arch/ppc/src/start.S
===================================================================
--- arch/ppc/src/start.S	(revision ba18512d0ae6d186133c61a7c81ad78746ac76e5)
+++ arch/ppc/src/start.S	(revision b524f8160fac39354818c5041d71a7fbb61fa89a)
@@ -36,3 +36,21 @@
 	bl early_init
 	
+	lis r3, _hardcoded_ktext_size@ha
+	addi r3, r3, _hardcoded_ktext_size@l
+	lis r4, hardcoded_ktext_size@ha
+	addi r4, r4, hardcoded_ktext_size@l
+	stw r3, 0(r4)
+	
+	lis r3, _hardcoded_kdata_size@ha
+	addi r3, r3, _hardcoded_kdata_size@l
+	lis r4, hardcoded_kdata_size@ha
+	addi r4, r4, hardcoded_kdata_size@l
+	stw r3, 0(r4)
+	
+	lis r3, _hardcoded_load_address@ha
+	addi r3, r3, _hardcoded_load_address@l
+	lis r4, hardcoded_load_address@ha
+	addi r4, r4, hardcoded_load_address@l
+	stw r3, 0(r4)
+	
 	b main_bsp
