- LE Stubs fully correct and we can move freely between freeldr and ofwboot.
authorArt Yerkes <art.yerkes@gmail.com>
Tue, 27 Jun 2006 13:03:35 +0000 (13:03 +0000)
committerArt Yerkes <art.yerkes@gmail.com>
Tue, 27 Jun 2006 13:03:35 +0000 (13:03 +0000)
- Small tweaking.
- Added build for ppc-le2be, cause it's needed to mangle freeldr into a
  correct ofwboot payload.
- Some cleaning in ofwboot.

svn path=/branches/powerpc/; revision=22666

reactos/boot/freeldr/bootsect/ofw_tests/ofwtest.s
reactos/boot/freeldr/bootsect/ofw_util.s
reactos/boot/freeldr/bootsect/ofwboot.s
reactos/boot/freeldr/freeldr/arch/powerpc/boot.s
reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
reactos/boot/freeldr/freeldr/include/of.h
reactos/tools/ofw_interface/calls.ofw
reactos/tools/ofw_interface/ofw_interface.cpp
reactos/tools/ppc-le2be.mak [new file with mode: 0644]
reactos/tools/ppc.lost+found/link-freeldr
reactos/tools/tools.mak

index 131d20d..aa01086 100644 (file)
@@ -5,12 +5,8 @@ _start:
        .long   0
        .long   0
        
-       .globl ofw_functions_addr
        .globl ofw_dumpregs
        
-ofw_functions_addr:
-       .long   ofw_functions
-
        .globl _begin
 _begin:
        sync                    
@@ -30,158 +26,8 @@ _begin:
 
 foo:
        b       foo
-
-       .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_addr - _start@l(%r9)
-       lwz     %r3,0(%r3)
-       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
        
        .org    0x1000
-freeldr_banner:
-       .ascii  "ReactOS OpenFirmware Boot Program\r\n\0"
-
-freeldr_halt:
-       .ascii  "ReactOS OpenFirmware Boot Program Halting\r\n\0"
-
-freeldr_reg_init:
-       .ascii  "r\0"
-freeldr_reg_lr:        
-       .ascii  "lr \0"
-freeldr_reg_cr:        
-       .ascii  "cr \0"
-freeldr_reg_ctr:       
-       .ascii  "ctr\0"
-freeldr_reg_msr:       
-       .ascii  "msr\0"
-                       
-ofw_memory_size:
-       .long   0
-       .long   0
-       .long   0
-       .long   0
-       
-ofw_chosen_name:
-       .ascii  "/chosen\0"
-
-ofw_stdout_name:
-       .ascii  "stdout\0"
-
-ofw_memory_name:
-       .ascii  "/memory@0\0"
-
-ofw_reg_name:
-       .ascii  "reg\0"
-       
-       .org    0x2000
 stack:
        .space  0x4000
 
index 036a9c6..d4abe5e 100644 (file)
@@ -12,24 +12,23 @@ call_freeldr:
         * instructions here..  Pad with a nop if needed. */
        mfmsr   %r10
        ori     %r10,%r10,1
-       mtmsr   %r10
-
        nop
+       mtmsr   %r10
        
        /* 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
+       subi    %r20,%r20,1
+       mfmsr   %r20
+       mtmsr   %r20
+       nop
        /* Now normal ordering resumes */
        subi    %r1,%r1,0x100
 
@@ -40,10 +39,11 @@ call_ofw:
        stw     %r8,16(%r1)
 
        lis     %r10,0xe00000@ha
-       add     %r9,%r3,%r10
-       lwz     %r3,ofw_functions_addr - _start@l(%r9)
-       lwz     %r3,0(%r3)
-       mtctr   %r3
+       addi    %r8,%r10,ofw_functions_addr@l
+       lwz     %r9,0(%r8)
+       add     %r8,%r3,%r9
+       lwz     %r9,0(%r8)
+       mtctr   %r9
        
        mr      %r3,%r4
        mr      %r4,%r5
@@ -63,8 +63,12 @@ call_ofw:
 
        addi    %r1,%r1,0x100
        /* Ok, go back to little endian */
+
+       .align  4
        mfmsr   %r0
        ori     %r0,%r0,1
+
+       nop
        mtmsr   %r0
 
        /* Note that this is little-endian from here on */
index 70a5507..3e69c82 100644 (file)
@@ -49,10 +49,8 @@ _begin:
        lis     %r5,0x8000@ha
        addi    %r5,%r5,0x8000@l
 
-       bl      ofw_dumpregs 
-
+       bl      ofw_dumpregs
        bl      copy_bits
-
        bl      zero_registers
 
        /* Zero CTR */
@@ -63,32 +61,11 @@ _begin:
 
        mtlr    %r3
 
-       lis     %r3,call_freeldr@ha
-       addi    %r3,%r3,call_freeldr - _start
+       lis     %r3,call_ofw@ha
+       addi    %r3,%r3,call_ofw - _start
 
-       blr
+       b       call_freeldr
 
-/*
- * lifted from ppc/boot/openfirmware/misc.S
- * Copyright (C) Paul Mackerras 1997.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation        ;  either version
- * 2 of the License, or (at your option) any later version.
- */
-
-/*
- * Use the BAT2 & 3 registers to map the 1st 16MB of RAM to
- * the address given as the 1st argument.
- */
-setup_bats:
-       xor     3,3,3
-       
-       sync
-        isync
-        blr
-       
 zero_registers:
        xor     %r2,%r2,%r2
        mr      %r0,%r2
index a507daa..30c1f1c 100644 (file)
@@ -1,3 +1,3 @@
        .extern PpcInit
 _start:
-       b       PpcInit+4
+       b       PpcInit
index 674a4b4..90895d2 100644 (file)
@@ -280,10 +280,12 @@ void PpcInit( of_proxy the_ofproxy ) {
     int len;
     ofproxy = the_ofproxy;
 
+    ofw_print_string("Made it into freeldr LE code ... bootstrap complete\n");
+
     chosen_package = ofw_finddevice( "/chosen" );
 
     ofw_getprop( chosen_package, "stdin",
-                 &stdin_handle, sizeof(stdin_handle) );
+                 (char *)&stdin_handle, sizeof(stdin_handle) );
 
     stdin_handle = REV(stdin_handle);
 
index 3eb431f..22170c9 100644 (file)
@@ -10,7 +10,7 @@
 #include <string.h>
 
 typedef int (*of_proxy)
-    ( int table_off, void *arg1, void *arg2, void *arg3, void *arg4 );
+    ( int table_off, void *arg1, void *arg2, void *arg3, void *arg4, void *arg5 );
 typedef long jmp_buf[100];
 extern of_proxy ofproxy;
 extern void le_swap( void *begin, void *end, void *dest );
index 5a7352e..2300f06 100644 (file)
@@ -9,6 +9,16 @@ exit                   0       0
 child                  1       1       int int
 peer                   1       1       int int
 seek                   2       1       int int int
+# MMU methods 
+# claim (virt size align -- base)
+claim                  3       1       int int int int
+# release (virt size --)
+release                        2       0       int int
+# map (plo phi virt size mode --)
+map                    5       0       int int int int int
+unmap                  2       0       int int
+modify                 3       0       int int int
+translate              4       1       int int int int int
 # Convenience functions that interact closely with OFW (written in BE asm)
 -dumpregs              0       0
 -print_string          1       0       char*
index 80998c1..495bb8e 100644 (file)
@@ -134,17 +134,15 @@ void populate_definition( ofw_wrappers &wrapper, const std::string &line ) {
 
     for( i = 0; i < args; i++ ) {
        if( need_swap(argtypes[i]) ) {
-           std::string len;
+           le_stub << "\tint len" << i << " = ";
            if( have_len(argtypes[i]).size() ) 
-               len = have_len(argtypes[i]);
+               le_stub << have_len(argtypes[i]) << ";\n";
            else {
-               std::ostringstream oss;
-               oss << "strlen(arg" << i << ")";
-               len = oss.str();
+               le_stub << "strlen(arg" << i << ");\n";
            }
            le_stub << "\tle_swap("
                    << "arg" << i << "," 
-                   << "arg" << i << "+" << len << ","
+                   << "arg" << i << "+len" << i << ","
                    << "arg" << i << ");\n";
        }
     }
@@ -154,7 +152,7 @@ void populate_definition( ofw_wrappers &wrapper, const std::string &line ) {
 
     le_stub << "ofproxy(" << (wrapper.ctindex * 4);
     
-    for( i = 0; i < 4; i++ ) {
+    for( i = 0; i < 5; i++ ) {
        if( i < args ) le_stub << ",(void *)arg" << i;
        else le_stub << ",NULL";
     }
@@ -163,17 +161,9 @@ void populate_definition( ofw_wrappers &wrapper, const std::string &line ) {
 
     for( i = args-1; i >= 0; i-- ) {
        if( need_swap(argtypes[i]) ) {
-           std::string len;
-           if( have_len(argtypes[i]).size() ) 
-               len = have_len(argtypes[i]);
-           else {
-               std::ostringstream oss;
-               oss << "strlen(arg" << i << ")";
-               len = oss.str();
-           }
            le_stub << "\tle_swap("
                    << "arg" << i << "," 
-                   << "arg" << i << "+" << len << ","
+                   << "arg" << i << "+len" << i << ","
                    << "arg" << i << ");\n";
        }
     }
@@ -242,6 +232,7 @@ int main( int argc, char **argv ) {
 
     out << "/* AUTOMATICALLY GENERATED BY ofw_interface */\n"
        << "\t.section .text\n"
+       << "\t.align 4\n"
        << "\t.globl _start\n"
        << "\t.globl ofw_call_addr\n"
        << "ofw_call_addr:\n"
diff --git a/reactos/tools/ppc-le2be.mak b/reactos/tools/ppc-le2be.mak
new file mode 100644 (file)
index 0000000..1a32f15
--- /dev/null
@@ -0,0 +1,36 @@
+PPC_LE2BE_BASE = $(TOOLS_BASE)
+PPC_LE2BE_BASE_ = $(PPC_LE2BE_BASE)$(SEP)
+
+PPC_LE2BE_INT = $(INTERMEDIATE_)$(PPC_LE2BE_BASE)
+PPC_LE2BE_INT_ = $(PPC_LE2BE_INT)$(SEP)
+PPC_LE2BE_OUT = $(OUTPUT_)$(PPC_LE2BE_BASE)
+PPC_LE2BE_OUT_ = $(PPC_LE2BE_OUT)$(SEP)
+
+PPC_LE2BE_TARGET = \
+       $(EXEPREFIX)$(PPC_LE2BE_OUT_)ppc-le2be$(EXEPOSTFIX)
+
+PPC_LE2BE_SOURCES = \
+       $(PPC_LE2BE_BASE_)ppc-le2be.c
+
+PPC_LE2BE_OBJECTS = \
+       $(addprefix $(INTERMEDIATE_), $(PPC_LE2BE_SOURCES:.c=.o))
+
+PPC_LE2BE_HOST_CFLAGS = $(TOOLS_CFLAGS)
+
+PPC_LE2BE_HOST_LFLAGS = $(TOOLS_LFLAGS)
+
+.PHONY: ppc-le2be
+ppc-le2be: $(PPC_LE2BE_TARGET)
+
+$(PPC_LE2BE_TARGET): $(PPC_LE2BE_OBJECTS) | $(PPC_LE2BE_OUT)
+       $(ECHO_LD)
+       ${host_gcc} $(PPC_LE2BE_OBJECTS) $(PPC_LE2BE_HOST_LFLAGS) -o $@
+
+$(PPC_LE2BE_INT_)ppc-le2be.o: $(PPC_LE2BE_BASE_)ppc-le2be.c | $(PPC_LE2BE_INT)
+       $(ECHO_CC)
+       ${host_gcc} $(PPC_LE2BE_HOST_CFLAGS) -c $< -o $@
+
+.PHONY: ppc-le2be_clean
+ppc-le2be_clean:
+       -@$(rm) $(PPC_LE2BE_TARGET) $(PPC_LE2BE_OBJECTS) 2>$(NUL)
+clean: ppc-le2be_clean
index 56a2484..e52feb4 100755 (executable)
@@ -1,8 +1,9 @@
-#!/bin/sh
+#!/bin/sh -v
 
 export PATH=$PATH:/usr/local/pkg/reactos-powerpc/bin
 ld -EL -g -nostartfiles -nostdlib -N -Ttext=0x8000 -o freeldr.elf obj-ppc/boot/freeldr/freeldr/arch/powerpc/boot.o obj-ppc/boot/freeldr/freeldr/cache/blocklist.o obj-ppc/boot/freeldr/freeldr/cache/cache.o obj-ppc/boot/freeldr/freeldr/comm/rs232.o obj-ppc/boot/freeldr/freeldr/disk/disk.o obj-ppc/boot/freeldr/freeldr/disk/partition.o obj-ppc/boot/freeldr/freeldr/fs/ext2.o obj-ppc/boot/freeldr/freeldr/fs/fat.o obj-ppc/boot/freeldr/freeldr/fs/fs.o obj-ppc/boot/freeldr/freeldr/fs/fsrec.o obj-ppc/boot/freeldr/freeldr/fs/iso.o obj-ppc/boot/freeldr/freeldr/fs/ntfs.o obj-ppc/boot/freeldr/freeldr/inifile/ini_init.o obj-ppc/boot/freeldr/freeldr/inifile/inifile.o obj-ppc/boot/freeldr/freeldr/inifile/parse.o obj-ppc/boot/freeldr/freeldr/math/libgcc2.o obj-ppc/boot/freeldr/freeldr/mm/meminit.o obj-ppc/boot/freeldr/freeldr/mm/mm.o obj-ppc/boot/freeldr/freeldr/reactos/registry.o obj-ppc/boot/freeldr/freeldr/reactos/arcname.o obj-ppc/boot/freeldr/freeldr/reactos/binhive.o obj-ppc/boot/freeldr/freeldr/reactos/reactos.o obj-ppc/boot/freeldr/freeldr/rtl/list.o obj-ppc/boot/freeldr/freeldr/ui/gui.o obj-ppc/boot/freeldr/freeldr/ui/tui.o obj-ppc/boot/freeldr/freeldr/ui/tuimenu.o obj-ppc/boot/freeldr/freeldr/ui/ui.o obj-ppc/boot/freeldr/freeldr/video/bank.o obj-ppc/boot/freeldr/freeldr/video/fade.o obj-ppc/boot/freeldr/freeldr/video/palette.o obj-ppc/boot/freeldr/freeldr/video/pixel.o obj-ppc/boot/freeldr/freeldr/video/video.o obj-ppc/boot/freeldr/freeldr/freeldr.o obj-ppc/boot/freeldr/freeldr/debug.o obj-ppc/boot/freeldr/freeldr/version.o obj-ppc/boot/freeldr/freeldr/cmdline.o obj-ppc/boot/freeldr/freeldr/machine.o obj-ppc/boot/freeldr/freeldr/arch/powerpc/mach.o obj-ppc/boot/freeldr/freeldr/arch/powerpc/ofw.o obj-ppc/boot/freeldr/freeldr/arch/powerpc/mboot.o obj-ppc/boot/freeldr/freeldr/bootmgr.o obj-ppc/boot/freeldr/freeldr/drivemap.o obj-ppc/boot/freeldr/freeldr/miscboot.o obj-ppc/boot/freeldr/freeldr/options.o obj-ppc/boot/freeldr/freeldr/linuxboot.o obj-ppc/boot/freeldr/freeldr/oslist.o obj-ppc/boot/freeldr/freeldr/custom.o obj-ppc/lib/rossym/rossym.a obj-ppc/lib/string/string.a obj-ppc/lib/rtl/rtl.a /usr/local/pkg/reactos-powerpc/lib/libgcc.a
-objcopy -O binary --only-section=.text --only-section=.data --only-section=.bss freeldr.elf freeldr.tmp
+objcopy -O binary --only-section=.text --only-section=.data --only-section=.bss freeldr.elf freeldr.tmp.le
+output-ppc/tools/ppc-le2be freeldr.tmp.le freeldr.tmp
 objcopy -I binary -B powerpc:common -O elf32-powerpc freeldr.tmp ofwldr.payload
-reactos-powerpc-as -mbig -o ofwboot.o boot/freeldr/bootsect/ofwboot.s
-ld -EB -Ttext 0xe00000 -e _begin -o ofwldr ofwboot.o ofwldr.payload
+reactos-powerpc-as -mbig -o ofwboot.o boot/freeldr/bootsect/ofwboot.s boot/freeldr/bootsect/ofw_util.s boot/freeldr/bootsect/ofw.s
+ld -EB -Ttext 0xe00000 -Tdata 0xe17000 -e _begin -o ofwldr ofwboot.o ofwldr.payload
index e7b7c7e..05642f4 100644 (file)
@@ -53,6 +53,7 @@ include tools/mkhive/mkhive.mak
 include tools/nci/nci.mak
 include tools/rbuild/rbuild.mak
 include tools/ofw_interface/ofw_interface.mak
+include tools/ppc-le2be.mak
 include tools/unicode/unicode.mak
 include tools/widl/widl.mak
 include tools/winebuild/winebuild.mak