Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 881 → Rev 880

/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
25,25 → 25,78
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "main.h"
 
#include "main.h"
#include "printf.h"
#include "ofw.h"
ofw_entry ofw;
 
static void halt(void)
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;
halt();
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];
}
 
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