Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 950 → Rev 953

/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);
}