/kernel/trunk/arch/ppc32/boot/ofw.h |
---|
File deleted |
/kernel/trunk/arch/ppc32/boot/ofw.c |
---|
File deleted |
/kernel/trunk/arch/ppc32/boot/printf.c |
---|
File deleted |
/kernel/trunk/arch/ppc32/boot/printf.h |
---|
File deleted |
/kernel/trunk/arch/ppc32/boot/Makefile |
---|
1,27 → 1,18 |
.PHONY: build clean |
CFLAGS = -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -I../include |
DEFS = -DKERNEL_LOAD_ADDRESS=0x800000 -DKERNEL_SIZE=40960 |
SOURCES = \ |
main.c \ |
ofw.c \ |
printf.c \ |
boot.S |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
build: boot.bin |
cp boot.bin ../../../load.bin |
boot.bin: $(OBJECTS) |
$(LD) -no-check-sections -N -T _link.ld $(OBJECTS) -o $@ |
boot.bin: boot.o main.o |
$(LD) -no-check-sections -N -T _link.ld boot.o main.o -o $@ |
%.o: %.S |
$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
boot.o: boot.S |
$(CC) $(CFLAGS) -c boot.S -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
main.o: main.c |
$(CC) $(CFLAGS) -c main.c -o $@ |
clean: |
-rm -f $(OBJECTS) boot.bin ../../../load.bin |
-rm -f boot.o main.o boot.bin ../../../load.bin |
/kernel/trunk/arch/ppc32/boot/main.c |
---|
27,23 → 27,76 |
*/ |
#include "main.h" |
#include "printf.h" |
#include "ofw.h" |
static void halt(void) |
ofw_entry ofw; |
phandle ofw_chosen; |
ihandle ofw_stdout; |
void init(void) |
{ |
while (1); |
ofw_chosen = ofw_find_device("/chosen"); |
if (ofw_chosen == -1) |
ofw_call("exit", 0, 0); |
if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
ofw_stdout = 0; |
} |
void bootstrap(void) |
int ofw_call(const char *service, const int nargs, const int nret, ...) |
{ |
printf("\nHelenOS PPC Bootloader\nKernel size %d, load address %L\n", KERNEL_SIZE, KERNEL_LOAD_ADDRESS); |
va_list list; |
ofw_args_t args; |
int i; |
void *addr = ofw_claim((void *) KERNEL_LOAD_ADDRESS, KERNEL_SIZE, 1); |
if (addr == NULL) { |
printf("Error: Unable to claim memory"); |
halt(); |
args.service = service; |
args.nargs = nargs; |
args.nret = nret; |
va_start(list, nret); |
for (i = 0; i < nargs; i++) |
args.args[i] = va_arg(list, ofw_arg_t); |
va_end(list); |
for (i = 0; i < nret; i++) |
args.args[i + nargs] = 0; |
ofw(&args); |
return args.args[nargs]; |
} |
halt(); |
void ofw_write(const char *str, const int len) |
{ |
if (ofw_stdout == 0) |
return; |
ofw_call("write", 3, 1, ofw_stdout, str, len); |
} |
void ofw_puts(const char *str) |
{ |
int len = 0; |
while (str[len] != 0) |
len++; |
ofw_write(str, len); |
} |
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); |
} |
void bootstrap(void) |
{ |
ofw_puts("\nHelenOS PPC Bootloader\n"); |
while (1); |
} |
/kernel/trunk/arch/ppc32/boot/main.h |
---|
29,6 → 29,36 |
#ifndef __MAIN_H__ |
#define __MAIN_H__ |
#define MAX_OFW_ARGS 10 |
typedef __builtin_va_list va_list; |
#define va_start(ap, last) __builtin_va_start(ap, last) |
#define va_arg(ap, type) __builtin_va_arg(ap, type) |
#define va_end(ap) __builtin_va_end(ap) |
typedef unsigned int ofw_arg_t; |
typedef unsigned int ihandle; |
typedef unsigned int phandle; |
/** OpenFirmware command structure |
* |
*/ |
typedef struct { |
const char *service; /**< Command name */ |
unsigned int nargs; /**< Number of in arguments */ |
unsigned int nret; /**< Number of out arguments */ |
ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */ |
} ofw_args_t; |
typedef void (*ofw_entry)(ofw_args_t *); |
extern void init(void); |
extern int ofw_call(const char *service, const int nargs, const int nret, ...); |
extern void ofw_write(const char *str, const int len); |
extern void ofw_puts(const char *str); |
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 bootstrap(void); |
#endif |