Added boot carrier for freeldr.  I'm at the point where I need to do 
something about the mac disklabel, because freeldr is trying to read
a PC partition table.  I'll need to sleep on it a bit.
Modified: trunk/reactos/boot/freeldr/Makefile
Modified: trunk/reactos/boot/freeldr/bootsect/Makefile
Added: trunk/reactos/boot/freeldr/bootsect/Makefile.i386
Added: trunk/reactos/boot/freeldr/bootsect/Makefile.powerpc
Added: trunk/reactos/boot/freeldr/bootsect/ofwboot.s

Modified: trunk/reactos/boot/freeldr/Makefile
--- trunk/reactos/boot/freeldr/Makefile	2005-03-30 22:04:56 UTC (rev 14385)
+++ trunk/reactos/boot/freeldr/Makefile	2005-03-31 09:30:29 UTC (rev 14386)
@@ -29,7 +29,7 @@
 	$(MAKE) -C fdebug
 
 test:
-	
+
 clean:
 	$(MAKE) -C bootsect clean
 	$(MAKE) -C freeldr clean
@@ -38,6 +38,7 @@
 	$(MAKE) -C tools clean
 
 bootcd:
+ifeq ($(ARCH),i386)
 	$(CP) bootsect/isoboot.bin ${BOOTCD_DIR}/../isoboot.bin
 	$(CP) bootsect/dosmbr.bin ${BOOTCD_DIR}/loader/dosmbr.bin
 	$(CP) bootsect/ext2.bin ${BOOTCD_DIR}/loader/ext2.bin
@@ -46,5 +47,6 @@
 	$(CP) bootsect/isoboot.bin ${BOOTCD_DIR}/loader/isoboot.bin
 	$(CP) freeldr/freeldr.sys ${BOOTCD_DIR}/loader/freeldr.sys
 	$(CP) freeldr/setupldr.sys ${BOOTCD_DIR}/loader/setupldr.sys
+endif
 
 .PHONY : clean

Modified: trunk/reactos/boot/freeldr/bootsect/Makefile
--- trunk/reactos/boot/freeldr/bootsect/Makefile	2005-03-30 22:04:56 UTC (rev 14385)
+++ trunk/reactos/boot/freeldr/bootsect/Makefile	2005-03-31 09:30:29 UTC (rev 14386)
@@ -25,56 +25,8 @@
 
 .PHONY : clean bootcd
 
-all: $(BIN2C) dosmbr.bin fat.bin fat32.bin isoboot.bin ext2.bin
-
-
-$(BIN2C) :
-	@$(MAKE) --no-print-directory -C $(FREELDR_TOOLS_PATH)
-
-dosmbr.bin : dosmbr.asm
-	@echo freeldr: Assembling dosmbr
-	@$(NASM_CMD) $(NFLAGS) -o dosmbr.bin -f bin dosmbr.asm
-
-fat.bin : fat.asm $(BIN2C)
-	@echo freeldr: Assembling fat
-	@$(NASM_CMD) $(NFLAGS) -o fat.bin -f bin fat.asm
-	@$(BIN2C) fat.bin fat.h fat_data
-
-
-fat32.bin : fat32.asm $(BIN2C)
-	@echo freeldr: Assembling fat32
-	@$(NASM_CMD) $(NFLAGS) -o fat32.bin -f bin fat32.asm
-	@$(BIN2C) fat32.bin fat32.h fat32_data
-
-isoboot.bin : isoboot.asm
-	@echo freeldr: Assembling isoboot
-	@$(NASM_CMD) $(NFLAGS) -o isoboot.bin -f bin isoboot.asm
-
-ext2.bin : ext2.asm
-	@echo freeldr: Assembling ext2
-	@$(NASM_CMD) $(NFLAGS) -o ext2.bin -f bin ext2.asm
-	@$(BIN2C) ext2.bin ext2.h ext2_data
-
-
-.PHONY : bootcd
-bootcd: bootcd_dirs isoboot.bin
-	$(CP) isoboot.bin $(BOOTCD_DIR)
-	$(CP) dosmbr.bin $(BOOTCD_DIR)/disk/loader
-	$(CP) ext2.bin $(BOOTCD_DIR)/disk/loader
-	$(CP) fat.bin $(BOOTCD_DIR)/disk/loader
-	$(CP) fat32.bin $(BOOTCD_DIR)/disk/loader
-	$(CP) isoboot.bin $(BOOTCD_DIR)/disk/loader
-
-.PHONY : bootcd_dirs
-bootcd_dirs:
-	$(MKDIR) $(BOOTCD_DIR)
-	$(MKDIR) $(BOOTCD_DIR)/disk
-	$(MKDIR) $(BOOTCD_DIR)/disk/reactos
-	$(MKDIR) $(BOOTCD_DIR)/disk/install
-	$(MKDIR) $(BOOTCD_DIR)/disk/bootdisk
-	$(MKDIR) $(BOOTCD_DIR)/disk/loader
-
-clean:
-	@-$(RM) *.bin
-	@-$(RM) *.h
-	@echo freeldr: Clean ALL done.
+ifeq ($(ARCH),powerpc)
+include Makefile.powerpc
+else
+include Makefile.i386
+endif

Added: trunk/reactos/boot/freeldr/bootsect/Makefile.i386
--- trunk/reactos/boot/freeldr/bootsect/Makefile.i386	2005-03-30 22:04:56 UTC (rev 14385)
+++ trunk/reactos/boot/freeldr/bootsect/Makefile.i386	2005-03-31 09:30:29 UTC (rev 14386)
@@ -0,0 +1,52 @@
+all: $(BIN2C) dosmbr.bin fat.bin fat32.bin isoboot.bin ext2.bin
+
+$(BIN2C) :
+	@$(MAKE) --no-print-directory -C $(FREELDR_TOOLS_PATH)
+
+dosmbr.bin : dosmbr.asm
+	@echo ===================================================== Assembling dosmbr
+	@$(NASM_CMD) $(NFLAGS) -o dosmbr.bin -f bin dosmbr.asm
+
+fat.bin : fat.asm $(BIN2C)
+	@echo ===================================================== Assembling fat
+	@$(NASM_CMD) $(NFLAGS) -o fat.bin -f bin fat.asm
+	@$(BIN2C) fat.bin fat.h fat_data
+
+
+fat32.bin : fat32.asm $(BIN2C)
+	@echo ===================================================== Assembling fat32
+	@$(NASM_CMD) $(NFLAGS) -o fat32.bin -f bin fat32.asm
+	@$(BIN2C) fat32.bin fat32.h fat32_data
+
+isoboot.bin : isoboot.asm
+	@echo ===================================================== Assembling isoboot
+	@$(NASM_CMD) $(NFLAGS) -o isoboot.bin -f bin isoboot.asm
+
+ext2.bin : ext2.asm
+	@echo ===================================================== Assembling ext2
+	@$(NASM_CMD) $(NFLAGS) -o ext2.bin -f bin ext2.asm
+	@$(BIN2C) ext2.bin ext2.h ext2_data
+
+
+.PHONY : bootcd
+bootcd: bootcd_dirs isoboot.bin
+	$(CP) isoboot.bin $(BOOTCD_DIR)
+	$(CP) dosmbr.bin $(BOOTCD_DIR)/disk/loader
+	$(CP) ext2.bin $(BOOTCD_DIR)/disk/loader
+	$(CP) fat.bin $(BOOTCD_DIR)/disk/loader
+	$(CP) fat32.bin $(BOOTCD_DIR)/disk/loader
+	$(CP) isoboot.bin $(BOOTCD_DIR)/disk/loader
+
+.PHONY : bootcd_dirs
+bootcd_dirs:
+	$(MKDIR) $(BOOTCD_DIR)
+	$(MKDIR) $(BOOTCD_DIR)/disk
+	$(MKDIR) $(BOOTCD_DIR)/disk/reactos
+	$(MKDIR) $(BOOTCD_DIR)/disk/install
+	$(MKDIR) $(BOOTCD_DIR)/disk/bootdisk
+	$(MKDIR) $(BOOTCD_DIR)/disk/loader
+
+clean:
+	@-$(RM) *.bin
+	@-$(RM) *.h
+	@echo Clean ALL done.

Added: trunk/reactos/boot/freeldr/bootsect/Makefile.powerpc
--- trunk/reactos/boot/freeldr/bootsect/Makefile.powerpc	2005-03-30 22:04:56 UTC (rev 14385)
+++ trunk/reactos/boot/freeldr/bootsect/Makefile.powerpc	2005-03-31 09:30:29 UTC (rev 14386)
@@ -0,0 +1,35 @@
+TOOLS=$(PATH_TO_TOP)/tools
+SECTIONS= \
+	--only-section=.text \
+	--only-section=.data \
+	--only-section=.bss
+LDSECT=	-Ttext 0xe00000 -Tdata 0xe10000
+OBJS=ofwboot.o freeldr.o
+CFLAGS=-mbig -meabi -fPIC -fno-builtin -I../freeldr/include
+FREELDR=../freeldr/freeldr.sys
+
+.SUFFIXES: .c .o
+
+all: ofwldr 
+
+hack-coff$(EXEEXT):
+	$(HOST_CC) -I../freeldr/include hack-coff.c -o $@
+
+ofwboot.o: ofwboot.s
+	$(NASM_CMD) $< -c -o $@
+
+$(FREELDR):
+	$(MAKE) -C ../freeldr
+
+freeldr.o: $(FREELDR)
+	$(TOOLS)/ppc-le2be $< freeldr.tmp
+	$(OBJCOPY) -I binary -O elf32-powerpc -B powerpc:common freeldr.tmp $@
+	rm freeldr.tmp
+
+ofwldr: $(OBJS)
+	mppcw32-ld --no-omagic $(LDSECT) $(OBJS) -g -o $@.elf
+	mppcw32-objcopy $(SECTIONS) -O aixcoff-rs6000 $@.elf $@
+	$(TOOLS)/hack-coff $@
+
+clean:
+	rm -rf ofwldr *.o *.elf *.tmp

Added: trunk/reactos/boot/freeldr/bootsect/ofwboot.s
--- trunk/reactos/boot/freeldr/bootsect/ofwboot.s	2005-03-30 22:04:56 UTC (rev 14385)
+++ trunk/reactos/boot/freeldr/bootsect/ofwboot.s	2005-03-31 09:30:29 UTC (rev 14386)
@@ -0,0 +1,960 @@
+	.section .text
+_start:	
+	.long	0xe00000 + 12
+	.long	0
+	.long	0
+	
+/*
+ * LIFTED FROM arch/macppc/stand/ofwboot/Locore.c
+ * Copyright (C) 1995, 1996 Wolfgang Solfrank.
+ * Copyright (C) 1995, 1996 TooLs GmbH.
+ * All rights reserved.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by TooLs GmbH.
+ * 4. The name of TooLs GmbH may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``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 TOOLS GMBH 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.
+ */
+	
+_begin:
+	sync                    
+	isync
+
+	lis     %r1,stack@ha    
+	addi    %r1,%r1,stack@l 
+	addi    %r1,%r1,16384 - 0x10
+          
+	mfmsr   %r8             
+	li      %r0,0
+	mtmsr   %r0             
+	isync                   
+                               
+	mtibatu 0,%r0           
+	mtibatu 1,%r0           
+	mtibatu 2,%r0           
+	mtibatu 3,%r0           
+	mtdbatu 0,%r0           
+	mtdbatu 1,%r0           
+	mtdbatu 2,%r0           
+	mtdbatu 3,%r0           
+	
+	li      %r9,0x12             /* BATL(0, BAT_M, BAT_PP_RW) */
+	mtibatl 0,%r9           
+	mtdbatl 0,%r9           
+	li      %r9,0x1ffe           /* BATU(0, BAT_BL_256M, BAT_Vs) */
+	mtibatu 0,%r9           
+	mtdbatu 0,%r9           
+	isync                   
+
+	li	%r8,0x3030
+	mtmsr	%r8
+
+	/* Store ofw call addr */
+	mr	%r21,%r5
+	lis	%r10,0xe00000@ha
+	stw	%r5,ofw_call_addr - _start@l(%r10)
+
+	lis	%r4,_binary_freeldr_tmp_end@ha
+	addi	%r4,%r4,_binary_freeldr_tmp_end@l
+	lis	%r3,_binary_freeldr_tmp_start@ha
+	addi	%r3,%r3,_binary_freeldr_tmp_start@l
+
+	lis	%r5,0x8000@ha
+	addi	%r5,%r5,0x8000@l
+
+	bl	copy_bits
+
+	bl	zero_registers
+
+	lis	%r3,0xe00000@ha
+	addi	%r3,%r3,freeldr_banner - _start
+
+	bl	ofw_print_string
+
+	bl	ofw_print_eol
+
+	/* Zero CTR */
+	mtcr	%r31
+	
+	lis	%r3,0x8000@ha
+	addi	%r3,%r3,0x8000@l
+
+	mtlr	%r3
+	
+	lis	%r3,call_ofw@ha
+	addi	%r3,%r3,call_ofw - _start
+	
+	b	call_freeldr
+		
+	.align	4
+call_freeldr:
+	/* Get the address of the functions list --
+	 * Note:
+	 * Because of little endian switch we must use an even number of
+	 * instructions here..  Pad with a nop if needed. */
+	mfmsr	%r10
+	ori	%r10,%r10,1
+	mtmsr	%r10
+
+	nop
+	
+	/* Note that this is little-endian from here on */
+	blr
+	nop
+
+	.align  4
+call_ofw:
+	/* R3 has the function offset to call (n * 4) 
+	 * Other arg registers are unchanged.
+	 * Note that these 4 instructions are in reverse order due to
+	 * little-endian convention */
+	andi.	%r0,%r0,65534
+	mfmsr	%r0
+	mtmsr	%r0
+	/* Now normal ordering resumes */
+	subi	%r1,%r1,0x100
+
+	stw	%r8,4(%r1)
+	stw	%r9,8(%r1)
+	stw	%r10,12(%r1)
+	mflr	%r8
+	stw	%r8,16(%r1)
+
+	lis	%r10,0xe00000@ha
+	add	%r9,%r3,%r10
+	lwz	%r3,ofw_functions - _start@l(%r9)
+	mtctr	%r3
+	
+	mr	%r3,%r4
+	mr	%r4,%r5
+	mr	%r5,%r6
+	mr	%r6,%r7
+	mr	%r7,%r8
+
+	/* Goto the swapped function */
+	bctrl
+
+	lwz	%r8,16(%r1)
+	mtlr	%r8
+
+	lwz	%r8,4(%r1)
+	lwz	%r9,8(%r1)
+	lwz	%r10,12(%r1)
+
+	addi	%r1,%r1,0x100
+	/* Ok, go back to little endian */
+	mfmsr	%r0
+	ori	%r0,%r0,1
+	mtmsr	%r0
+
+	/* Note that this is little-endian from here on */
+	blr
+	nop
+
+zero_registers:
+	xor	%r2,%r2,%r2
+	mr	%r0,%r2
+	mr	%r3,%r2
+	
+	mr	%r4,%r2
+	mr	%r5,%r2
+	mr	%r6,%r2
+	mr	%r7,%r2
+
+	mr	%r8,%r2
+	mr	%r9,%r2
+	mr	%r10,%r2
+	mr	%r11,%r2
+
+	mr	%r12,%r2
+	mr	%r13,%r2
+	mr	%r14,%r2
+	mr	%r15,%r2
+	
+	mr	%r12,%r2
+	mr	%r13,%r2
+	mr	%r14,%r2
+	mr	%r15,%r2
+	
+	mr	%r16,%r2
+	mr	%r17,%r2
+	mr	%r18,%r2
+	mr	%r19,%r2
+	
+	mr	%r20,%r2
+	mr	%r21,%r2
+	mr	%r22,%r2
+	mr	%r23,%r2
+	
+	mr	%r24,%r2
+	mr	%r25,%r2
+	mr	%r26,%r2
+	mr	%r27,%r2
+	
+	mr	%r28,%r2
+	mr	%r29,%r2
+	mr	%r30,%r2
+	mr	%r31,%r2
+
+	blr
+	
+prim_strlen:
+	mr	%r5,%r3
+prim_strlen_loop:	
+	lbz	%r4,0(%r3)
+	cmpi	0,0,%r4,0
+	beq	prim_strlen_done
+	addi	%r3,%r3,1
+	b	prim_strlen_loop
+	
+prim_strlen_done:
+	sub	%r3,%r3,%r5
+	blr
+	
+copy_bits:
+	cmp	0,0,%r3,%r4
+	beqlr
+	lwz	%r6,0(%r3)
+	stw	%r6,0(%r5)
+	addi	%r3,%r3,4
+	addi	%r5,%r5,4
+	b	copy_bits
+
+ofw_print_string_hook:
+	bl	ofw_print_number
+	bl	ofw_exit
+	
+ofw_print_string:
+	/* Reserve some stack space */
+	subi	%r1,%r1,32
+
+	/* Save args */
+	stw	%r3,0(%r1)
+	
+	/* Save the lr, a scratch register */
+	stw	%r8,8(%r1)
+	mflr	%r8
+	stw	%r8,12(%r1)
+
+	/* Load the package name */
+	lis	%r3,0xe00000@ha
+	addi	%r3,%r3,ofw_chosen_name - _start
+
+	/* Fire */
+	bl	ofw_finddevice
+
+	/* Load up for getprop */
+	stw	%r3,16(%r1)
+
+	lis	%r4,0xe00000@ha
+	addi	%r4,%r4,ofw_stdout_name - _start
+
+	addi	%r5,%r1,20
+
+	li	%r6,4
+
+	bl	ofw_getprop
+
+	/* Measure the string and remember the length */
+	lwz	%r3,0(%r1)
+	bl	prim_strlen
+	mr	%r5,%r3
+	
+	lwz	%r3,20(%r1)
+	lwz	%r4,0(%r1)
+
+	/* Write the string */
+	bl	ofw_write
+
+	/* Return */
+	lwz	%r8,12(%r1)
+	mtlr	%r8
+	lwz	%r8,8(%r1)
+	
+	addi	%r1,%r1,32
+	blr
+
+	/* Print 8 hex digits representing a number in r3 */
+ofw_print_number:
+	subi	%r1,%r1,32
+	stw	%r8,0(%r1)
+	mflr	%r8
+	stw	%r8,4(%r1)
+	stw	%r9,8(%r1)
+
+	xor	%r9,%r9,%r9
+	stw	%r9,12(%r1)
+
+	/* Set up and, devide, shift */
+	mr	%r8,%r3
+	lis	%r6,0xf0000000@ha
+	lis	%r7,0x10000000@ha
+	li	%r9,8
+
+ofw_number_loop:
+	nop
+	cmpi	0,0,%r9,0
+	beq	ofw_number_return
+	subi	%r9,%r9,1
+
+	/* Body: isolate digit, divide, print */
+	and	%r5,%r6,%r8
+	divwu	%r4,%r5,%r7
+	srwi	%r6,%r6,4
+	srwi	%r7,%r7,4
+
+	nop
+	
+	cmpi	0,0,%r4,10
+	bge	ofw_number_letter
+	addi	%r4,%r4,'0'
+	b	ofw_number_digit_out
+	
+ofw_number_letter:
+	addi	%r4,%r4,'A' - 10
+
+ofw_number_digit_out:	
+	stb	%r4,12(%r1)
+	addi	%r3,%r1,12
+
+	stw	%r6,16(%r1)
+	stw	%r7,20(%r1)
+	stw	%r8,24(%r1)
+	stw	%r9,28(%r1)
+	
+	bl	ofw_print_string
+
+	lwz	%r6,16(%r1)
+	lwz	%r7,20(%r1)
+	lwz	%r8,24(%r1)
+	lwz	%r9,28(%r1)
+	
+	b	ofw_number_loop
+
+ofw_number_return:	
+	/* Return */
+	lwz	%r9,8(%r1)
+	lwz	%r8,4(%r1)
+	mtlr	%r8
+	lwz	%r8,0(%r1)
+	addi	%r1,%r1,32
+	blr
+
+ofw_print_eol:
+	subi	%r1,%r1,16
+	stw	%r8,0(%r1)
+	mflr	%r8
+	stw	%r8,4(%r1)
+	li	%r4,0x0d0a
+	sth	%r4,8(%r1)
+	xor	%r4,%r4,%r4
+	sth	%r4,10(%r1)
+	addi	%r3,%r1,8
+	bl	ofw_print_string
+	lwz	%r8,4(%r1)
+	mtlr	%r8
+	lwz	%r8,0(%r1)
+	addi	%r1,%r1,16
+	blr
+
+ofw_print_nothing:
+	subi	%r1,%r1,16
+	stw	%r8,0(%r1)
+	mflr	%r8
+	stw	%r8,4(%r1)
+	li	%r4,0
+	sth	%r4,8(%r1)
+	xor	%r4,%r4,%r4
+	sth	%r4,10(%r1)
+	addi	%r3,%r1,8
+	bl	ofw_print_string
+	lwz	%r8,4(%r1)
+	mtlr	%r8
+	lwz	%r8,0(%r1)
+	addi	%r1,%r1,16
+	blr
+
+ofw_print_space:
+	subi	%r1,%r1,16
+	stw	%r8,0(%r1)
+	mflr	%r8
+	stw	%r8,4(%r1)
+	li	%r4,0x2000
+	sth	%r4,8(%r1)
+	xor	%r4,%r4,%r4
+	sth	%r4,10(%r1)
+	addi	%r3,%r1,8
+	bl	ofw_print_string
+	lwz	%r8,4(%r1)
+	mtlr	%r8
+	lwz	%r8,0(%r1)
+	addi	%r1,%r1,16
+	blr
+
+ofw_print_regs:	
+	/* Construct ofw exit call */
+	subi	%r1,%r1,0xa0
+
+	stw	%r0,0(%r1)
+	stw	%r1,4(%r1)
+	stw	%r2,8(%r1)
+	stw	%r3,12(%r1)
+
+	stw	%r4,16(%r1)
+	stw	%r5,20(%r1)
+	stw	%r6,24(%r1)
+	stw	%r7,28(%r1)
+	
+	stw	%r8,32(%r1)
+	stw	%r9,36(%r1)
+	stw	%r10,40(%r1)
+	stw	%r11,44(%r1)
+	
+	stw	%r12,48(%r1)
+	stw	%r13,52(%r1)
+	stw	%r14,56(%r1)
+	stw	%r15,60(%r1)
+	
+	stw	%r16,64(%r1)
+	stw	%r17,68(%r1)
+	stw	%r18,72(%r1)
+	stw	%r19,76(%r1)
+	
+	stw	%r20,80(%r1)
+	stw	%r21,84(%r1)
+	stw	%r22,88(%r1)
+	stw	%r23,92(%r1)
+	
+	stw	%r24,96(%r1)
+	stw	%r25,100(%r1)
+	stw	%r26,104(%r1)
+	stw	%r27,108(%r1)
+	
+	stw	%r28,112(%r1)
+	stw	%r29,116(%r1)
+	stw	%r30,120(%r1)
+	stw	%r31,124(%r1)
+
+	mflr	%r0
+	stw	%r0,128(%r1)
+	mfcr	%r0
+	stw	%r0,132(%r1)
+	mfctr	%r0
+	stw	%r0,136(%r1)
+	mfmsr	%r0
+	stw	%r0,140(%r1)
+
+	/* Count at zero */
+	xor	%r0,%r0,%r0
+	stw	%r0,144(%r1)
+	mr	%r3,%r1
+	stw	%r3,148(%r1)
+	
+	/* Body, print the regname, then the register */
+ofw_register_loop:
+	lwz	%r3,144(%r1)
+	cmpi	0,0,%r3,32
+	beq	ofw_register_special
+	lis	%r3,0xe00000@ha
+	addi	%r3,%r3,freeldr_reg_init - _start
+	bl	ofw_print_string
+	lwz	%r3,144(%r1)
+	bl	ofw_print_number
+	bl	ofw_print_space
+	lwz	%r3,144(%r1)
+	mulli	%r3,%r3,4
+	add	%r3,%r1,%r3
+	lwz	%r3,0(%r3)
+	stw	%r3,152(%r1)
+	bl	ofw_print_number
+	lwz	%r3,144(%r1)
+	addi	%r3,%r3,1
+	stw	%r3,144(%r1)
+	b	done_dump
+
+dump_optional:	
+	bl	ofw_print_space
+	bl	ofw_print_space
+	lwz	%r3,152(%r1)
+	lwz	%r3,0(%r3)
+	bl	ofw_print_number
+	bl	ofw_print_space	
+	lwz	%r3,152(%r1)
+	lwz	%r3,4(%r3)
+	bl	ofw_print_number
+	bl	ofw_print_space	
+	lwz	%r3,152(%r1)
+	lwz	%r3,8(%r3)
+	bl	ofw_print_number
+	bl	ofw_print_space	
+	lwz	%r3,152(%r1)
+	lwz	%r3,12(%r3)
+	bl	ofw_print_number
+	bl	ofw_print_space
+done_dump:	
+	bl	ofw_print_eol
+	b	ofw_register_loop
+
+ofw_register_special:
+	/* LR */
+	lis	%r3,0xe00000@ha
+	addi	%r3,%r3,freeldr_reg_lr - _start
+	bl	ofw_print_string
+	bl	ofw_print_space
+	lwz	%r3,128(%r1)
+	bl	ofw_print_number
+	bl	ofw_print_eol
+	
+	/* CR */
+	lis	%r3,0xe00000@ha
+	addi	%r3,%r3,freeldr_reg_cr - _start
+	bl	ofw_print_string
+	bl	ofw_print_space
+	lwz	%r3,132(%r1)
+	bl	ofw_print_number
+	bl	ofw_print_eol
+	
+	/* CTR */
+	lis	%r3,0xe00000@ha
+	addi	%r3,%r3,freeldr_reg_ctr - _start
+	bl	ofw_print_string
+	bl	ofw_print_space
+	lwz	%r3,136(%r1)
+	bl	ofw_print_number
+	bl	ofw_print_eol
+	
+	/* MSR */
+	lis	%r3,0xe00000@ha
+	addi	%r3,%r3,freeldr_reg_msr - _start
+	bl	ofw_print_string
+	bl	ofw_print_space
+	lwz	%r3,140(%r1)
+	bl	ofw_print_number
+	bl	ofw_print_eol
+
+	/* Return */
+	lwz	%r0,128(%r1)
+	mtlr	%r0
+	
+	lwz	%r0,0(%r1)
+	lwz	%r2,8(%r1)
+	lwz	%r3,12(%r1)
+
+	lwz	%r4,16(%r1)
+	lwz	%r5,20(%r1)
+	lwz	%r6,24(%r1)
+	lwz	%r7,28(%r1)
+
+	addi	%r1,%r1,0xa0
+		
+	blr
+	
+ofw_finddevice_hook:
+	subi	%r1,%r1,32
+	stw	%r3,0(%r1)
+	mflr	%r3
+	stw	%r3,4(%r1)
+	lwz	%r3,0(%r1)
+	bl	ofw_finddevice
+	stw	%r3,0(%r1)
+	lwz	%r3,4(%r1)
+	mtlr	%r3
+	lwz	%r3,0(%r1)
+	addi	%r1,%r1,32	
+	blr
+	
+ofw_finddevice:
+	/* Reserve stack space ...
+	 * 20 bytes for the ofw call,
+	 * r8, r9, and lr */
+	subi	%r1,%r1,32
+
+	/* Store r8, r9, lr */
+	stw	%r8,20(%r1)
+	stw	%r9,24(%r1)
+	mflr	%r8
+	stw	%r8,28(%r1)
+	
+	/* Get finddevice name */
+	lis	%r8,0xe00000@ha
+	addi	%r9,%r8,ofw_finddevice_name - _start
+	stw	%r9,0(%r1)
+
+	/* 1 Argument and 1 return */
+	li	%r9,1
+	stw	%r9,4(%r1)
+	stw	%r9,8(%r1)
+
+	stw	%r3,12(%r1)
+
+	/* Load up the call address */
+	lwz	%r9,ofw_call_addr - _start(%r8)
+	mtlr	%r9
+
+	/* Set argument */
+	mr	%r3,%r1
+	
+	/* Fire */
+	blrl
+	
+	lwz	%r3,16(%r1)
+	
+	/* Restore registers */
+	lwz	%r8,28(%r1)
+	mtlr	%r8
+	lwz	%r9,24(%r1)
+	lwz	%r8,20(%r1)
+	
+	addi	%r1,%r1,32
+	
+	/* Return */
+	blr
+
+ofw_getprop_hook:
+	/* Reserve stack space:
+	 * 32 bytes for the ofw call
+	 * 12 bytes for r8, r9, lr
+	 */		
+	/* Reserve stack space ...
+	 * 20 bytes for the ofw call,
+	 * r8, r9, and lr */
+	subi	%r1,%r1,48
+
+	/* Store r8, r9, lr */
+	stw	%r8,32(%r1)
+	stw	%r9,36(%r1)
+	mflr	%r8
+	stw	%r8,40(%r1)
+	
+	/* Get getprop name */
+	lis	%r8,0xe00000@ha
+	addi	%r9,%r8,ofw_getprop_name - _start
+	stw	%r9,0(%r1)
+
+	/* 4 Argument and 1 return */
+	li	%r9,4
+	stw	%r9,4(%r1)
+	li	%r9,1
+	stw	%r9,8(%r1)
+
+	stw	%r3,12(%r1) /* Package */
+	stw	%r4,16(%r1) /* Property */
+	stw	%r5,20(%r1) /* Return buffer */
+	stw	%r6,24(%r1) /* Buffer size */
+	
+	/* Load up the call address */
+	lwz	%r9,ofw_call_addr - _start(%r8)
+	mtlr	%r9
+
+	/* Set argument */
+	mr	%r3,%r1
+
+	/* Fire */
+	blrl
+
+	/* Workaround to a wierd crash ... not sure what causes it.
+	 * XXX investigate me */
+	bl	ofw_print_nothing
+	
+	/* Return */
+	lwz	%r3,28(%r1)
+
+	/* Restore registers */
+	lwz	%r8,40(%r1)
+	mtlr	%r8
+	lwz	%r9,36(%r1)
+	lwz	%r8,32(%r1)
+	
+	addi	%r1,%r1,48
+		
+	/* Return */
+	blr
+
+ofw_getprop:
+	/* Reserve stack space:
+	 * 32 bytes for the ofw call
+	 * 12 bytes for r8, r9, lr
+	 */		
+	/* Reserve stack space ...
+	 * 20 bytes for the ofw call,
+	 * r8, r9, and lr */
+	subi	%r1,%r1,48
+
+	/* Store r8, r9, lr */
+	stw	%r8,32(%r1)
+	stw	%r9,36(%r1)
+	mflr	%r8
+	stw	%r8,40(%r1)
+	
+	/* Get getprop name */
+	lis	%r8,0xe00000@ha
+	addi	%r9,%r8,ofw_getprop_name - _start
+	stw	%r9,0(%r1)
+
+	/* 4 Argument and 1 return */
+	li	%r9,4
+	stw	%r9,4(%r1)
+	li	%r9,1
+	stw	%r9,8(%r1)
+
+	stw	%r3,12(%r1) /* Package */
+	stw	%r4,16(%r1) /* Property */
+	stw	%r5,20(%r1) /* Return buffer */
+	stw	%r6,24(%r1) /* Buffer size */
+	
+	/* Load up the call address */
+	lwz	%r9,ofw_call_addr - _start(%r8)
+	mtlr	%r9
+
+	/* Set argument */
+	mr	%r3,%r1
+
+	/* Fire */
+	blrl
+	
+	/* Return */
+	lwz	%r3,28(%r1)
+
+	/* Restore registers */
+	lwz	%r8,40(%r1)
+
+	mtlr	%r8
+	lwz	%r9,36(%r1)
+	lwz	%r8,32(%r1)
+	
+	addi	%r1,%r1,48
+		
+	/* Return */
+	blr
+		
+ofw_write:
+	/* Reserve stack space:
+	 * 28 bytes for the ofw call
+	 * 12 bytes for r8, r9, lr
+	 */		
+	/* Reserve stack space ...
+	 * 20 bytes for the ofw call,
+	 * r8, r9, and lr */
+	subi	%r1,%r1,48
+
+	nop
+	
+	/* Store r8, r9, lr */
+	stw	%r8,28(%r1)
+	stw	%r9,32(%r1)
+	mflr	%r8
+	stw	%r8,36(%r1)
+	
+	/* Get write name */
+	lis	%r8,0xe00000@ha
+	addi	%r9,%r8,ofw_write_name - _start
+	stw	%r9,0(%r1)
+
+	/* 3 Arguments and 1 return */
+	li	%r9,3
+	stw	%r9,4(%r1)
+	li	%r9,1
+	stw	%r9,8(%r1)
+
+	stw	%r3,12(%r1)
+	stw	%r4,16(%r1)
+	stw	%r5,20(%r1)
+	
+	/* Load up the call address */
+	lwz	%r9,ofw_call_addr - _start(%r8)
+	mtlr	%r9
+
+	/* Set argument */
+	mr	%r3,%r1
+
+	/* Fire */
+	blrl
+
+	/* Return */
+	lwz	%r3,24(%r1)
+
+	/* Restore registers */
+	lwz	%r8,36(%r1)
+	mtlr	%r8
+	lwz	%r9,32(%r1)
+	lwz	%r8,28(%r1)
+	
+	addi	%r1,%r1,48
+	
+	/* Return */
[truncated at 1000 lines; 156 more skipped]