Changeset a0c732e in mainline


Ignore:
Timestamp:
2006-02-26T11:48:05Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7a255e69
Parents:
13c1a0c
Message:

PPC32 boot loader preparation

Location:
arch/ppc32/boot
Files:
4 added
3 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/boot/Makefile

    r13c1a0c ra0c732e  
    22
    33CFLAGS = -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -I../include
     4DEFS = -DKERNEL_LOAD_ADDRESS=0x800000 -DKERNEL_SIZE=40960
     5
     6SOURCES = \
     7        main.c \
     8        ofw.c \
     9        printf.c \
     10        boot.S
     11
     12OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))
    413
    514build: boot.bin
    615        cp boot.bin ../../../load.bin
    716
    8 boot.bin: boot.o main.o
    9         $(LD) -no-check-sections -N -T _link.ld boot.o main.o -o $@
     17boot.bin: $(OBJECTS)
     18        $(LD) -no-check-sections -N -T _link.ld $(OBJECTS) -o $@
    1019
    11 boot.o: boot.S
    12         $(CC) $(CFLAGS) -c boot.S -o $@
     20%.o: %.S
     21        $(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@
    1322
    14 main.o: main.c
    15         $(CC) $(CFLAGS) -c main.c -o $@
     23%.o: %.c
     24        $(CC) $(DEFS) $(CFLAGS) -c $< -o $@
    1625
    1726clean:
    18         -rm -f boot.o main.o boot.bin ../../../load.bin
     27        -rm -f $(OBJECTS) boot.bin ../../../load.bin
  • arch/ppc32/boot/main.c

    r13c1a0c ra0c732e  
    2626 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2727 */
    28  
    29 #include "main.h"
    3028
    31 ofw_entry ofw;
     29#include "main.h"
     30#include "printf.h"
     31#include "ofw.h"
    3232
    33 phandle ofw_chosen;
    34 ihandle ofw_stdout;
    35 
    36 void init(void)
     33static void halt(void)
    3734{
    38         ofw_chosen = ofw_find_device("/chosen");
    39         if (ofw_chosen == -1)
    40                 ofw_call("exit", 0, 0);
    41        
    42         if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)     
    43                 ofw_stdout = 0;
    44 }
    45 
    46 int ofw_call(const char *service, const int nargs, const int nret, ...)
    47 {
    48         va_list list;
    49         ofw_args_t args;
    50         int i;
    51        
    52         args.service = service;
    53         args.nargs = nargs;
    54         args.nret = nret;
    55        
    56         va_start(list, nret);
    57         for (i = 0; i < nargs; i++)
    58                 args.args[i] = va_arg(list, ofw_arg_t);
    59         va_end(list);
    60        
    61         for (i = 0; i < nret; i++)
    62                 args.args[i + nargs] = 0;
    63        
    64         ofw(&args);
    65        
    66         return args.args[nargs];
    67 }
    68 
    69 void ofw_write(const char *str, const int len)
    70 {
    71         if (ofw_stdout == 0)
    72                 return;
    73        
    74         ofw_call("write", 3, 1, ofw_stdout, str, len);
    75 }
    76 
    77 void ofw_puts(const char *str)
    78 {
    79         int len = 0;
    80        
    81         while (str[len] != 0)
    82                 len++;
    83        
    84         ofw_write(str, len);
    85 }
    86 
    87 phandle ofw_find_device(const char *name)
    88 {
    89         return ofw_call("finddevice", 1, 1, name);
    90 }
    91 
    92 int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen)
    93 {
    94         return ofw_call("getprop", 4, 1, device, name, buf, buflen);
     35        while (1);
    9536}
    9637
    9738void bootstrap(void)
    9839{
    99         ofw_puts("\nHelenOS PPC Bootloader\n");
    100 
    101         while (1);
     40        printf("\nHelenOS PPC Bootloader\nKernel size %d, load address %L\n", KERNEL_SIZE, KERNEL_LOAD_ADDRESS);
     41       
     42        void *addr = ofw_claim((void *) KERNEL_LOAD_ADDRESS, KERNEL_SIZE, 1);
     43        if (addr == NULL) {
     44                printf("Error: Unable to claim memory");
     45                halt();
     46        }
     47       
     48        halt();
    10249}
  • arch/ppc32/boot/main.h

    r13c1a0c ra0c732e  
    3030#define __MAIN_H__
    3131
    32 #define MAX_OFW_ARGS    10
    33 
    34 typedef __builtin_va_list va_list;
    35 
    36 #define va_start(ap, last)              __builtin_va_start(ap, last)
    37 #define va_arg(ap, type)                __builtin_va_arg(ap, type)
    38 #define va_end(ap)                      __builtin_va_end(ap)
    39 
    40 typedef unsigned int ofw_arg_t;
    41 typedef unsigned int ihandle;
    42 typedef unsigned int phandle;
    43 
    44 /** OpenFirmware command structure
    45  *
    46  */
    47 typedef struct {
    48         const char *service;          /**< Command name */
    49         unsigned int nargs;           /**< Number of in arguments */
    50         unsigned int nret;            /**< Number of out arguments */
    51         ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */
    52 } ofw_args_t;
    53 
    54 typedef void (*ofw_entry)(ofw_args_t *);
    55 
    56 extern void init(void);
    57 extern int ofw_call(const char *service, const int nargs, const int nret, ...);
    58 extern void ofw_write(const char *str, const int len);
    59 extern void ofw_puts(const char *str);
    60 extern phandle ofw_find_device(const char *name);
    61 extern int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen);
    6232extern void bootstrap(void);
    6333
Note: See TracChangeset for help on using the changeset viewer.