//boot/trunk/arch/ppc32/loader/asm.S |
---|
38,7 → 38,6 |
.global memsetb |
.global memcpy |
.global halt |
.global jump_to_kernel |
memsetb: |
146,9 → 145,6 |
mtctr r7 |
b 1b |
halt: |
b halt |
flush_instruction_cache: |
# Flush data cache |
//boot/trunk/arch/ppc32/loader/ofw.h |
---|
55,11 → 55,17 |
typedef void (*ofw_entry)(ofw_args_t *); |
extern void init(void); |
void halt(void); |
extern phandle ofw_find_device(const char *name); |
extern int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen); |
extern int ofw_call(const char *service, const int nargs, const int nret, ...); |
#define ofw_call_method(instance, method, nargs, nret, ...) ofw_call("call-method", (nargs + 2), nret, method, instance, ##__VA_ARGS__) |
extern ihandle ofw_open(const char *name); |
extern void ofw_write(const char *str, const int len); |
extern void ofw_puts(const char *str); |
extern void *ofw_claim(const void *addr, const int size, const int align); |
extern phandle ofw_find_device(const char *name); |
extern int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen); |
extern void *ofw_translate(const void *virt); |
#endif |
//boot/trunk/arch/ppc32/loader/printf.c |
---|
32,6 → 32,17 |
static char digits[] = "0123456789abcdef"; /**< Hexadecimal characters */ |
void puts(const char *str) |
{ |
int len = 0; |
while (str[len] != 0) |
len++; |
ofw_write(str, len); |
} |
/** Print hexadecimal digits |
* |
* Print fixed count of hexadecimal digits from |
73,7 → 84,7 |
} while (val /= base); |
d[sizeof(__native) * 8] = 0; |
ofw_puts(&d[i + 1]); |
puts(&d[i + 1]); |
} |
156,7 → 167,7 |
* String and character conversions. |
*/ |
case 's': |
ofw_puts(va_arg(ap, char_ptr)); |
puts(va_arg(ap, char_ptr)); |
goto loop; |
case 'c': |
167,31 → 178,31 |
* Hexadecimal conversions with fixed width. |
*/ |
case 'P': |
ofw_puts("0x"); |
puts("0x"); |
case 'p': |
print_fixed_hex(va_arg(ap, __native), sizeof(__native)); |
goto loop; |
case 'Q': |
ofw_puts("0x"); |
puts("0x"); |
case 'q': |
print_fixed_hex(va_arg(ap, __u64), INT64); |
goto loop; |
case 'L': |
ofw_puts("0x"); |
puts("0x"); |
case 'l': |
print_fixed_hex(va_arg(ap, __native), INT32); |
goto loop; |
case 'W': |
ofw_puts("0x"); |
puts("0x"); |
case 'w': |
print_fixed_hex(va_arg(ap, __native), INT16); |
goto loop; |
case 'B': |
ofw_puts("0x"); |
puts("0x"); |
case 'b': |
print_fixed_hex(va_arg(ap, __native), INT8); |
goto loop; |
204,7 → 215,7 |
goto loop; |
case 'X': |
ofw_puts("0x"); |
puts("0x"); |
case 'x': |
print_number(va_arg(ap, __native), 16); |
goto loop; |
//boot/trunk/arch/ppc32/loader/main.c |
---|
38,8 → 38,12 |
void bootstrap(void) |
{ |
printf("\nHelenOS PPC Bootloader\nLoaded at %L\nKernel size %d bytes, load address %L\n", &start, KERNEL_SIZE, KERNEL_LOAD_ADDRESS); |
printf("\nHelenOS PPC Bootloader\n"); |
void *loader = ofw_translate(&start); |
printf("loaded at %L (physical %L)\n", &start, loader); |
printf("kernel load address %L (size %d)\n", KERNEL_LOAD_ADDRESS, KERNEL_SIZE); |
void *addr = ofw_claim((void *) KERNEL_LOAD_ADDRESS, KERNEL_SIZE, 1); |
if (addr == NULL) { |
printf("Error: Unable to claim memory"); |
//boot/trunk/arch/ppc32/loader/asm.h |
---|
29,7 → 29,6 |
#ifndef __ASM_H__ |
#define __ASM_H__ |
void halt(void) __attribute__((noreturn)); |
void jump_to_kernel(void *addr) __attribute__((noreturn)); |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
//boot/trunk/arch/ppc32/loader/printf.h |
---|
46,6 → 46,7 |
typedef char *char_ptr; |
void puts(const char *str); |
void printf(const char *fmt, ...); |
#endif |
//boot/trunk/arch/ppc32/loader/ofw.c |
---|
27,10 → 27,12 |
*/ |
#include "ofw.h" |
#include "printf.h" |
ofw_entry ofw; |
phandle ofw_chosen; |
ihandle ofw_mmu; |
ihandle ofw_stdout; |
38,13 → 40,24 |
{ |
ofw_chosen = ofw_find_device("/chosen"); |
if (ofw_chosen == -1) |
ofw_call("exit", 0, 0); |
halt(); |
if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
ofw_stdout = 0; |
ofw_mmu = ofw_open("/mmu"); |
if (ofw_mmu == -1) { |
puts("Unable to open /mmu node\n"); |
halt(); |
} |
} |
void halt(void) |
{ |
ofw_call("exit", 0, 0); |
} |
int ofw_call(const char *service, const int nargs, const int nret, ...) |
{ |
va_list list; |
65,10 → 78,19 |
ofw(&args); |
return args.args[nargs]; |
if (nret > 0) |
return args.args[nargs + nret - 1]; |
else |
return 0; |
} |
ihandle ofw_open(const char *name) |
{ |
return ofw_call("open", 1, 1, name); |
} |
void ofw_write(const char *str, const int len) |
{ |
if (ofw_stdout == 0) |
78,17 → 100,6 |
} |
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); |
105,3 → 116,9 |
{ |
return (void *) ofw_call("claim", 3, 1, addr, size, align); |
} |
void *ofw_translate(const void *virt) |
{ |
return (void *) ofw_call_method(ofw_mmu, "translate", 1, 5, virt); |
} |