2004-03-29 Marco Gerards <metgerards@student.han.nl>

Add support for the newworld apple macintosh (PPC).  This has been
	tested on the powerbook 2000 only.  It only adds support for
	generic ieee1275 functions, console and disk support.  This should
	be easy to port to other architectures with support for Open
	Firmware.

	* configure.ac: Accept the powerpc as host_cpu.  In the case of
	the powerpc cpu set the host_vendor to ieee1275.  Make sure the i386
	specific tests are only executed while building for the i386.
	Inverse test for crosscompile.
	* genmk.rb (Utility): Allow assembler files.
	* normal/cmdline.c (pupa_tab_complete): Reset pupa_errno.
	* conf/powerpc-ieee1275.rmk: New file.
	* disk/powerpc/ieee1275/ofdisk.c: Likewise.
	* disk/powerpc/ieee1275/partition.c: Likewise.
	* include/pupa/powerpc/ieee1275/biosdisk.h: Likewise.
	* include/pupa/powerpc/ieee1275/console.h: Likewise.
	* include/pupa/powerpc/ieee1275/partition.h: Likewise.
	* include/pupa/powerpc/ieee1275/time.h: Likewise.
	* include/pupa/powerpc/ieee1275/util/biosdisk.h: Likewise.
	* include/pupa/powerpc/ieee1275/multiboot.h: Likewise.
	* include/pupa/powerpc/ieee1275/loader.h
	* include/pupa/powerpc/setjmp.h: Likewise.
	* include/pupa/powerpc/types.h: Likewise.
	* kern/powerpc/ieee1275/init.c: Likewise.
	* kern/powerpc/ieee1275/openfw.c: Likewise.
	* term/powerpc/ieee1275/ofconsole.c: Likewise.

	These files were written by Johan Rydberg
	(jrydberg@night.trouble.net) and I only modified them slightly.

	* boot/powerpc/ieee1275/cmain.c: New file.
	* boot/powerpc/ieee1275/crt0.S: Likewise.
	* boot/powerpc/ieee1275/ieee1275.c: Likewise.
	* include/pupa/powerpc/ieee1275/ieee1275.h: Likewise.
This commit is contained in:
marco_g 2004-03-28 21:52:02 +00:00
parent 8c8cc20511
commit e56cdf2111
25 changed files with 2768 additions and 22 deletions

View File

@ -1,3 +1,41 @@
2004-03-29 Marco Gerards <metgerards@student.han.nl>
Add support for the newworld apple macintosh (PPC). This has been
tested on the powerbook 2000 only. It only adds support for
generic ieee1275 functions, console and disk support. This should
be easy to port to other architectures with support for Open
Firmware.
* configure.ac: Accept the powerpc as host_cpu. In the case of
the powerpc cpu set the host_vendor to ieee1275. Make sure the i386
specific tests are only executed while building for the i386.
Inverse test for crosscompile.
* genmk.rb (Utility): Allow assembler files.
* normal/cmdline.c (pupa_tab_complete): Reset pupa_errno.
* conf/powerpc-ieee1275.rmk: New file.
* disk/powerpc/ieee1275/ofdisk.c: Likewise.
* disk/powerpc/ieee1275/partition.c: Likewise.
* include/pupa/powerpc/ieee1275/biosdisk.h: Likewise.
* include/pupa/powerpc/ieee1275/console.h: Likewise.
* include/pupa/powerpc/ieee1275/partition.h: Likewise.
* include/pupa/powerpc/ieee1275/time.h: Likewise.
* include/pupa/powerpc/ieee1275/util/biosdisk.h: Likewise.
* include/pupa/powerpc/ieee1275/multiboot.h: Likewise.
* include/pupa/powerpc/ieee1275/loader.h
* include/pupa/powerpc/setjmp.h: Likewise.
* include/pupa/powerpc/types.h: Likewise.
* kern/powerpc/ieee1275/init.c: Likewise.
* kern/powerpc/ieee1275/openfw.c: Likewise.
* term/powerpc/ieee1275/ofconsole.c: Likewise.
These files were written by Johan Rydberg
(jrydberg@night.trouble.net) and I only modified them slightly.
* boot/powerpc/ieee1275/cmain.c: New file.
* boot/powerpc/ieee1275/crt0.S: Likewise.
* boot/powerpc/ieee1275/ieee1275.c: Likewise.
* include/pupa/powerpc/ieee1275/ieee1275.h: Likewise.
2004-03-14 Jeroen Dekkers <jeroen@dekkers.cx>
* Makefile.in: Update copyright.

View File

@ -0,0 +1,148 @@
/* cmain.c - Startup code for the PowerPC. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <alloca.h>
#include <stdint.h>
#include "pupa/machine/ieee1275.h"
#include "pupa/kernel.h"
struct module_info
{
uint32_t start;
uint32_t end;
};
#define roundup(a, s) (((a) + ((s) - 1)) & ~((s) - 1))
/* OpenFirmware entry point passed to us from the real bootloader. */
intptr_t (*pupa_ieee1275_entry_fn) (void *);
/* Return a help text for this architecture. */
const char *
help_arch (void)
{
/* No special information. */
return "";
}
/* Setup the argument vector and pass control over to the main
function. */
void
cmain (uint32_t firmware_entry)
{
char **argv, args[256];
pupa_ieee1275_phandle_t chosen;
int argc = 0, actual;
long batl, batu;
pupa_ieee1275_entry_fn = (intptr_t (*)(void *)) firmware_entry;
/* Initialize BAT registers to unmapped to not generate overlapping
mappings below. */
asm volatile ("mtibatu 0,%0" :: "r"(0));
asm volatile ("mtibatu 1,%0" :: "r"(0));
asm volatile ("mtibatu 2,%0" :: "r"(0));
asm volatile ("mtibatu 3,%0" :: "r"(0));
asm volatile ("mtdbatu 0,%0" :: "r"(0));
asm volatile ("mtdbatu 1,%0" :: "r"(0));
asm volatile ("mtdbatu 2,%0" :: "r"(0));
asm volatile ("mtdbatu 3,%0" :: "r"(0));
/* Set up initial BAT table to only map the lowest 256 MB area. */
batl = 0x00000000 | 0x10 | 0x02;
batu = 0x00000000 | 0x1ffc | 0x02;
/* IBAT0 used for initial 256 MB segment */
asm volatile ("mtibatl 3,%0; mtibatu 3,%1" :: "r" (batl), "r" (batu));
/* DBAT0 used similar */
asm volatile ("mtdbatl 3,%0; mtdbatu 3,%1" :: "r" (batl), "r" (batu));
asm ("isync");
/* If any argument was passed to the kernel (us), they are
put in the bootargs property of /chosen. The string can
be null (just the nul-character), so check that the size
is actually greater than one. */
pupa_ieee1275_finddevice ("/chosen", &chosen);
if (pupa_ieee1275_get_property (chosen, "bootargs", args,
sizeof args, &actual) == 0
&& actual > 1)
{
/* A command line was passed. */
char *str = args;
int nr = 1;
/* First time around we count the number of arguments. */
argc = 2;
while (*str && *str == ' ')
str++;
while (*str)
if (*(str++) == ' ')
{
while (*str && *str == ' ')
str++;
if (*str)
argc++;
}
argv = alloca (sizeof (char *) * (argc + 2));
/* The bootargs property does not contain the program
name, just the arguments. */
argv[0] = "pupa";
/* Second time around we fill in the argv. */
str = args;
while (*str && *str == ' ')
str++;
argv[nr++] = str;
while (*str)
{
if (*str == ' ')
{
*(str++) = '\0';
while (*str && *str == ' ')
str++;
if (*str)
argv[nr++] = str;
}
else
str++;
}
argv[nr] = 0;
}
else
{
argv = alloca (sizeof (char *) * 2);
argv[0] = "pupa";
argv[1] = 0;
argc = 1;
}
/* Now invoke the main function. */
/* XXX: pupa_main does not parse arguments yet. */
pupa_main ();
/* Never reached. */
}

View File

@ -0,0 +1,55 @@
/* crt0.S - Startup code for the PowerPC. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
.section ".note"
.align 2
.note_section_header:
.long 8
.long 24
.long 0x1275
.string "PowerPC"
.note_descriptor:
.long 0x0 /* real-mode */
.long 0xffffffff /* real-base */
.long 0xffffffff /* real-size */
.long 0xffffffff /* virt-base */
.long 0xffffffff /* virt-size */
.long 0x00030000 /* load-base */
.text
.align 2
.globl _start
_start:
lis 1, init_stack@ha
la 1, init_stack@l(1)
addi 1, 1, -32
li 2, 0
li 13, 0
mr 3, 5
bl cmain
1: b 1b
.section ".bss"
.lcomm _ppc_init_stack, 4096*2, 16
init_stack:

View File

@ -0,0 +1,475 @@
/* ieee1275.c - Access the Open Firmware client interface. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <pupa/machine/ieee1275.h>
#define IEEE1275_PHANDLE_ROOT ((pupa_ieee1275_phandle_t) 0)
#define IEEE1275_PHANDLE_INVALID ((pupa_ieee1275_phandle_t) -1)
intptr_t (*pupa_ieee1275_entry_fn) (void *);
#ifndef IEEE1275_CALL_ENTRY_FN
#define IEEE1275_CALL_ENTRY_FN(args) (*pupa_ieee1275_entry_fn) (args)
#endif
/* All backcalls to the firmware is done by calling an entry function
which was passed to us from the bootloader. When doing the backcall,
a structure is passed which specifies what the firmware should do.
NAME is the requested service. NR_INS and NR_OUTS is the number of
passed arguments and the expected number of return values, resp. */
struct pupa_ieee1275_common_hdr
{
char *name;
int nr_ins;
int nr_outs;
};
#define INIT_IEEE1275_COMMON(p, xname, xins, xouts) \
(p)->name = xname; (p)->nr_ins = xins; (p)->nr_outs = xouts
/* FIXME is this function needed? */
pupa_uint32_t
pupa_ieee1275_decode_int_4 (unsigned char *p)
{
pupa_uint32_t val = (*p++ << 8);
val = (val + *p++) << 8;
val = (val + *p++) << 8;
return (val + *p);
}
int
pupa_ieee1275_finddevice (char *name, pupa_ieee1275_phandle_t *phandlep)
{
struct find_device_args {
struct pupa_ieee1275_common_hdr common;
char *device;
pupa_ieee1275_phandle_t phandle;
} args;
INIT_IEEE1275_COMMON (&args.common, "finddevice", 1, 1);
args.device = name;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*phandlep = args.phandle;
return 0;
}
int
pupa_ieee1275_get_property (int handle, const char *property, void *buf,
pupa_size_t size, pupa_size_t *actual)
{
struct get_property_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_phandle_t phandle;
const char *prop;
void *buf;
int buflen;
int size;
} args;
INIT_IEEE1275_COMMON (&args.common, "getprop", 4, 1);
args.phandle = handle;
args.prop = property;
args.buf = buf;
args.buflen = size;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
if (actual)
*actual = args.size;
return 0;
}
int
pupa_ieee1275_next_property (int handle, char *prev_prop, char *prop,
int *flags)
{
struct get_property_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_phandle_t phandle;
char *prev_prop;
char *next_prop;
int flags;
} args;
INIT_IEEE1275_COMMON (&args.common, "nextprop", 3, 1);
args.phandle = handle;
args.prev_prop = prev_prop;
args.next_prop = prop;
args.flags = -1;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
if (flags)
*flags = args.flags;
return 0;
}
int
pupa_ieee1275_get_property_length (pupa_ieee1275_phandle_t handle,
const char *prop, pupa_size_t *length)
{
struct get_property_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_phandle_t phandle;
const char *prop;
pupa_size_t length;
} args;
INIT_IEEE1275_COMMON (&args.common, "getproplen", 2, 1);
args.phandle = handle;
args.prop = prop;
args.length = -1;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*length = args.length;
return 0;
}
int
pupa_ieee1275_instance_to_package (pupa_ieee1275_ihandle_t ihandle,
pupa_ieee1275_phandle_t *phandlep)
{
struct instance_to_package_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_ihandle_t ihandle;
pupa_ieee1275_phandle_t phandle;
} args;
INIT_IEEE1275_COMMON (&args.common, "instance-to-package", 1, 1);
args.ihandle = ihandle;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*phandlep = args.phandle;
return 0;
}
int
pupa_ieee1275_package_to_path (pupa_ieee1275_phandle_t phandle,
char *path, pupa_size_t len, pupa_size_t *actual)
{
struct instance_to_package_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_phandle_t phandle;
char *buf;
int buflen;
int actual;
} args;
INIT_IEEE1275_COMMON (&args.common, "package-to-path", 3, 1);
args.phandle = phandle;
args.buf = path;
args.buflen = len;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
if (actual)
*actual = args.actual;
return 0;
}
int
pupa_ieee1275_instance_to_path (pupa_ieee1275_ihandle_t ihandle,
char *path, pupa_size_t len,
pupa_size_t *actual)
{
struct instance_to_package_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_ihandle_t ihandle;
char *buf;
int buflen;
int actual;
} args;
INIT_IEEE1275_COMMON (&args.common, "instance-to-path", 3, 1);
args.ihandle = ihandle;
args.buf = path;
args.buflen = len;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
if (actual)
*actual = args.actual;
return 0;
}
int
pupa_ieee1275_write (pupa_ieee1275_ihandle_t ihandle, void *buffer,
pupa_size_t len, pupa_size_t *actualp)
{
struct write_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_ihandle_t ihandle;
void *buf;
pupa_size_t len;
pupa_size_t actual;
} args;
INIT_IEEE1275_COMMON (&args.common, "write", 3, 1);
args.ihandle = ihandle;
args.buf = buffer;
args.len = len;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
if (actualp)
*actualp = args.actual;
return 0;
}
int
pupa_ieee1275_read (pupa_ieee1275_ihandle_t ihandle, void *buffer,
pupa_size_t len, pupa_size_t *actualp)
{
struct write_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_ihandle_t ihandle;
void *buf;
pupa_size_t len;
pupa_size_t actual;
} args;
INIT_IEEE1275_COMMON (&args.common, "read", 3, 1);
args.ihandle = ihandle;
args.buf = buffer;
args.len = len;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
if (actualp)
*actualp = args.actual;
return 0;
}
int
pupa_ieee1275_seek (pupa_ieee1275_ihandle_t ihandle, int pos_hi,
int pos_lo, int *result)
{
struct write_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_ihandle_t ihandle;
int pos_hi;
int pos_lo;
int result;
} args;
INIT_IEEE1275_COMMON (&args.common, "seek", 3, 1);
args.ihandle = ihandle;
args.pos_hi = pos_hi;
args.pos_lo = pos_lo;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
if (result)
*result = args.result;
return 0;
}
int
pupa_ieee1275_peer (pupa_ieee1275_phandle_t node,
pupa_ieee1275_phandle_t *result)
{
struct peer_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_phandle_t node;
pupa_ieee1275_phandle_t result;
} args;
INIT_IEEE1275_COMMON (&args.common, "peer", 1, 1);
args.node = node;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*result = args.result;
return 0;
}
int
pupa_ieee1275_child (pupa_ieee1275_phandle_t node,
pupa_ieee1275_phandle_t *result)
{
struct child_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_phandle_t node;
pupa_ieee1275_phandle_t result;
} args;
INIT_IEEE1275_COMMON (&args.common, "child", 1, 1);
args.node = node;
args.result = IEEE1275_PHANDLE_INVALID;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*result = args.result;
return 0;
}
int
pupa_ieee1275_parent (pupa_ieee1275_phandle_t node,
pupa_ieee1275_phandle_t *result)
{
struct parent_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_phandle_t node;
pupa_ieee1275_phandle_t result;
} args;
INIT_IEEE1275_COMMON (&args.common, "parent", 1, 1);
args.node = node;
args.result = IEEE1275_PHANDLE_INVALID;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*result = args.result;
return 0;
}
int
pupa_ieee1275_exit (void)
{
struct exit_args {
struct pupa_ieee1275_common_hdr common;
} args;
INIT_IEEE1275_COMMON (&args.common, "exit", 0, 0);
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
return 0;
}
int
pupa_ieee1275_open (char *node, pupa_ieee1275_ihandle_t *result)
{
struct open_args {
struct pupa_ieee1275_common_hdr common;
char *cstr;
pupa_ieee1275_ihandle_t result;
} args;
INIT_IEEE1275_COMMON (&args.common, "open", 1, 1);
args.cstr = node;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*result = args.result;
return 0;
}
int
pupa_ieee1275_close (pupa_ieee1275_ihandle_t ihandle)
{
struct close_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_ihandle_t ihandle;
} args;
INIT_IEEE1275_COMMON (&args.common, "close", 1, 0);
args.ihandle = ihandle;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
return 0;
}
int
pupa_ieee1275_claim (void *p, pupa_size_t size,
unsigned int align, void **result)
{
struct claim_args {
struct pupa_ieee1275_common_hdr common;
void *p;
pupa_size_t size;
unsigned int align;
void *addr;
} args;
INIT_IEEE1275_COMMON (&args.common, "claim", 3, 1);
args.p = p;
args.size = size;
args.align = align;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*result = args.addr;
return 0;
}
int
pupa_ieee1275_set_property (pupa_ieee1275_phandle_t phandle,
const char *propname, void *buf,
pupa_size_t size, pupa_size_t *actual)
{
struct set_property_args {
struct pupa_ieee1275_common_hdr common;
pupa_ieee1275_phandle_t phandle;
const char *propname;
void *buf;
pupa_size_t size;
pupa_size_t actual;
} args;
INIT_IEEE1275_COMMON (&args.common, "setprop", 4, 1);
args.size = size;
args.buf = buf;
args.propname = propname;
args.phandle = phandle;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
*actual = args.actual;
return 0;
}
int
pupa_ieee1275_set_color (pupa_ieee1275_ihandle_t ihandle,
int index, int r, int g, int b)
{
struct set_color_args {
struct pupa_ieee1275_common_hdr common;
char *method;
pupa_ieee1275_ihandle_t ihandle;
int index;
int b;
int g;
int r;
int result;
} args;
INIT_IEEE1275_COMMON (&args.common, "call-method", 6, 1);
args.method = "color!";
args.ihandle = ihandle;
args.index = index;
args.r = r;
args.g = g;
args.b = b;
if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
return -1;
return 0;
}

490
conf/powerpc-ieee1275.mk Normal file
View File

@ -0,0 +1,490 @@
# -*- makefile -*-
COMMON_ASFLAGS = -nostdinc -fno-builtin -D__ASSEMBLY__
COMMON_CFLAGS = -fno-builtin -D__ASSEMBLY__
# Images.
MOSTLYCLEANFILES += symlist.c kernel_syms.lst
DEFSYMFILES += kernel_syms.lst
symlist.c: $(addprefix include/pupa/,$(kernel_img_HEADERS)) gensymlist.sh
sh $(srcdir)/gensymlist.sh $(filter %.h,$^) > $@
kernel_syms.lst: $(addprefix include/pupa/,$(kernel_img_HEADERS)) genkernsyms.sh
sh $(srcdir)/genkernsyms.sh $(filter %h,$^) > $@
# Utilities.
sbin_UTILITIES = pupaof
bin_UTILITIES = pupa-emu
noinst_UTILITIES = genmoddep
# For pupa-emu
pupa_emu_SOURCES = kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/loader.c kern/rescue.c kern/term.c \
disk/powerpc/ieee1275/partition.c \
util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c \
normal/cmdline.c normal/command.c normal/main.c normal/menu.c \
util/console.c util/pupa-emu.c util/misc.c util/i386/pc/getroot.c \
kern/env.c
CLEANFILES += pupa-emu pupa_emu-kern_main.o pupa_emu-kern_device.o pupa_emu-kern_disk.o pupa_emu-kern_dl.o pupa_emu-kern_file.o pupa_emu-kern_fs.o pupa_emu-kern_err.o pupa_emu-kern_misc.o pupa_emu-kern_loader.o pupa_emu-kern_rescue.o pupa_emu-kern_term.o pupa_emu-disk_powerpc_ieee1275_partition.o pupa_emu-util_i386_pc_biosdisk.o pupa_emu-fs_fat.o pupa_emu-fs_ext2.o pupa_emu-normal_cmdline.o pupa_emu-normal_command.o pupa_emu-normal_main.o pupa_emu-normal_menu.o pupa_emu-util_console.o pupa_emu-util_pupa_emu.o pupa_emu-util_misc.o pupa_emu-util_i386_pc_getroot.o pupa_emu-kern_env.o
MOSTLYCLEANFILES += pupa_emu-kern_main.d pupa_emu-kern_device.d pupa_emu-kern_disk.d pupa_emu-kern_dl.d pupa_emu-kern_file.d pupa_emu-kern_fs.d pupa_emu-kern_err.d pupa_emu-kern_misc.d pupa_emu-kern_loader.d pupa_emu-kern_rescue.d pupa_emu-kern_term.d pupa_emu-disk_powerpc_ieee1275_partition.d pupa_emu-util_i386_pc_biosdisk.d pupa_emu-fs_fat.d pupa_emu-fs_ext2.d pupa_emu-normal_cmdline.d pupa_emu-normal_command.d pupa_emu-normal_main.d pupa_emu-normal_menu.d pupa_emu-util_console.d pupa_emu-util_pupa_emu.d pupa_emu-util_misc.d pupa_emu-util_i386_pc_getroot.d pupa_emu-kern_env.d
pupa-emu: pupa_emu-kern_main.o pupa_emu-kern_device.o pupa_emu-kern_disk.o pupa_emu-kern_dl.o pupa_emu-kern_file.o pupa_emu-kern_fs.o pupa_emu-kern_err.o pupa_emu-kern_misc.o pupa_emu-kern_loader.o pupa_emu-kern_rescue.o pupa_emu-kern_term.o pupa_emu-disk_powerpc_ieee1275_partition.o pupa_emu-util_i386_pc_biosdisk.o pupa_emu-fs_fat.o pupa_emu-fs_ext2.o pupa_emu-normal_cmdline.o pupa_emu-normal_command.o pupa_emu-normal_main.o pupa_emu-normal_menu.o pupa_emu-util_console.o pupa_emu-util_pupa_emu.o pupa_emu-util_misc.o pupa_emu-util_i386_pc_getroot.o pupa_emu-kern_env.o
$(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(pupa_emu_LDFLAGS)
pupa_emu-kern_main.o: kern/main.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_main.d: kern/main.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,main\.o[ :]*,pupa_emu-kern_main.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_main.d
pupa_emu-kern_device.o: kern/device.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_device.d: kern/device.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,device\.o[ :]*,pupa_emu-kern_device.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_device.d
pupa_emu-kern_disk.o: kern/disk.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_disk.d: kern/disk.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,disk\.o[ :]*,pupa_emu-kern_disk.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_disk.d
pupa_emu-kern_dl.o: kern/dl.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_dl.d: kern/dl.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,dl\.o[ :]*,pupa_emu-kern_dl.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_dl.d
pupa_emu-kern_file.o: kern/file.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_file.d: kern/file.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,file\.o[ :]*,pupa_emu-kern_file.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_file.d
pupa_emu-kern_fs.o: kern/fs.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_fs.d: kern/fs.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,fs\.o[ :]*,pupa_emu-kern_fs.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_fs.d
pupa_emu-kern_err.o: kern/err.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_err.d: kern/err.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,err\.o[ :]*,pupa_emu-kern_err.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_err.d
pupa_emu-kern_misc.o: kern/misc.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_misc.d: kern/misc.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,misc\.o[ :]*,pupa_emu-kern_misc.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_misc.d
pupa_emu-kern_loader.o: kern/loader.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_loader.d: kern/loader.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,loader\.o[ :]*,pupa_emu-kern_loader.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_loader.d
pupa_emu-kern_rescue.o: kern/rescue.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_rescue.d: kern/rescue.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,rescue\.o[ :]*,pupa_emu-kern_rescue.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_rescue.d
pupa_emu-kern_term.o: kern/term.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_term.d: kern/term.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,term\.o[ :]*,pupa_emu-kern_term.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_term.d
pupa_emu-disk_powerpc_ieee1275_partition.o: disk/powerpc/ieee1275/partition.c
$(BUILD_CC) -Idisk/powerpc/ieee1275 -I$(srcdir)/disk/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-disk_powerpc_ieee1275_partition.d: disk/powerpc/ieee1275/partition.c
set -e; $(BUILD_CC) -Idisk/powerpc/ieee1275 -I$(srcdir)/disk/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,partition\.o[ :]*,pupa_emu-disk_powerpc_ieee1275_partition.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-disk_powerpc_ieee1275_partition.d
pupa_emu-util_i386_pc_biosdisk.o: util/i386/pc/biosdisk.c
$(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-util_i386_pc_biosdisk.d: util/i386/pc/biosdisk.c
set -e; $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,biosdisk\.o[ :]*,pupa_emu-util_i386_pc_biosdisk.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-util_i386_pc_biosdisk.d
pupa_emu-fs_fat.o: fs/fat.c
$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-fs_fat.d: fs/fat.c
set -e; $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,fat\.o[ :]*,pupa_emu-fs_fat.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-fs_fat.d
pupa_emu-fs_ext2.o: fs/ext2.c
$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-fs_ext2.d: fs/ext2.c
set -e; $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,ext2\.o[ :]*,pupa_emu-fs_ext2.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-fs_ext2.d
pupa_emu-normal_cmdline.o: normal/cmdline.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-normal_cmdline.d: normal/cmdline.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,cmdline\.o[ :]*,pupa_emu-normal_cmdline.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-normal_cmdline.d
pupa_emu-normal_command.o: normal/command.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-normal_command.d: normal/command.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,command\.o[ :]*,pupa_emu-normal_command.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-normal_command.d
pupa_emu-normal_main.o: normal/main.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-normal_main.d: normal/main.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,main\.o[ :]*,pupa_emu-normal_main.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-normal_main.d
pupa_emu-normal_menu.o: normal/menu.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-normal_menu.d: normal/menu.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,menu\.o[ :]*,pupa_emu-normal_menu.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-normal_menu.d
pupa_emu-util_console.o: util/console.c
$(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-util_console.d: util/console.c
set -e; $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,console\.o[ :]*,pupa_emu-util_console.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-util_console.d
pupa_emu-util_pupa_emu.o: util/pupa-emu.c
$(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-util_pupa_emu.d: util/pupa-emu.c
set -e; $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,pupa\-emu\.o[ :]*,pupa_emu-util_pupa_emu.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-util_pupa_emu.d
pupa_emu-util_misc.o: util/misc.c
$(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-util_misc.d: util/misc.c
set -e; $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,misc\.o[ :]*,pupa_emu-util_misc.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-util_misc.d
pupa_emu-util_i386_pc_getroot.o: util/i386/pc/getroot.c
$(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-util_i386_pc_getroot.d: util/i386/pc/getroot.c
set -e; $(BUILD_CC) -Iutil/i386/pc -I$(srcdir)/util/i386/pc $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,getroot\.o[ :]*,pupa_emu-util_i386_pc_getroot.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-util_i386_pc_getroot.d
pupa_emu-kern_env.o: kern/env.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -c -o $@ $<
pupa_emu-kern_env.d: kern/env.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupa_emu_CFLAGS) -M $< | sed 's,env\.o[ :]*,pupa_emu-kern_env.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupa_emu-kern_env.d
pupa_emu_LDFLAGS = -lncurses
pupaof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.c \
boot/powerpc/ieee1275/crt0.S kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
kern/powerpc/ieee1275/init.c term/powerpc/ieee1275/ofconsole.c \
kern/powerpc/ieee1275/openfw.c fs/ext2.c normal/cmdline.c \
normal/command.c normal/main.c normal/menu.c \
disk/powerpc/ieee1275/ofdisk.c disk/powerpc/ieee1275/partition.c \
kern/env.c normal/arg.c
CLEANFILES += pupaof pupaof-boot_powerpc_ieee1275_cmain.o pupaof-boot_powerpc_ieee1275_ieee1275.o pupaof-boot_powerpc_ieee1275_crt0.o pupaof-kern_main.o pupaof-kern_device.o pupaof-kern_disk.o pupaof-kern_dl.o pupaof-kern_file.o pupaof-kern_fs.o pupaof-kern_err.o pupaof-kern_misc.o pupaof-kern_mm.o pupaof-kern_loader.o pupaof-kern_rescue.o pupaof-kern_term.o pupaof-kern_powerpc_ieee1275_init.o pupaof-term_powerpc_ieee1275_ofconsole.o pupaof-kern_powerpc_ieee1275_openfw.o pupaof-fs_ext2.o pupaof-normal_cmdline.o pupaof-normal_command.o pupaof-normal_main.o pupaof-normal_menu.o pupaof-disk_powerpc_ieee1275_ofdisk.o pupaof-disk_powerpc_ieee1275_partition.o pupaof-kern_env.o pupaof-normal_arg.o
MOSTLYCLEANFILES += pupaof-boot_powerpc_ieee1275_cmain.d pupaof-boot_powerpc_ieee1275_ieee1275.d pupaof-boot_powerpc_ieee1275_crt0.d pupaof-kern_main.d pupaof-kern_device.d pupaof-kern_disk.d pupaof-kern_dl.d pupaof-kern_file.d pupaof-kern_fs.d pupaof-kern_err.d pupaof-kern_misc.d pupaof-kern_mm.d pupaof-kern_loader.d pupaof-kern_rescue.d pupaof-kern_term.d pupaof-kern_powerpc_ieee1275_init.d pupaof-term_powerpc_ieee1275_ofconsole.d pupaof-kern_powerpc_ieee1275_openfw.d pupaof-fs_ext2.d pupaof-normal_cmdline.d pupaof-normal_command.d pupaof-normal_main.d pupaof-normal_menu.d pupaof-disk_powerpc_ieee1275_ofdisk.d pupaof-disk_powerpc_ieee1275_partition.d pupaof-kern_env.d pupaof-normal_arg.d
pupaof: pupaof-boot_powerpc_ieee1275_cmain.o pupaof-boot_powerpc_ieee1275_ieee1275.o pupaof-boot_powerpc_ieee1275_crt0.o pupaof-kern_main.o pupaof-kern_device.o pupaof-kern_disk.o pupaof-kern_dl.o pupaof-kern_file.o pupaof-kern_fs.o pupaof-kern_err.o pupaof-kern_misc.o pupaof-kern_mm.o pupaof-kern_loader.o pupaof-kern_rescue.o pupaof-kern_term.o pupaof-kern_powerpc_ieee1275_init.o pupaof-term_powerpc_ieee1275_ofconsole.o pupaof-kern_powerpc_ieee1275_openfw.o pupaof-fs_ext2.o pupaof-normal_cmdline.o pupaof-normal_command.o pupaof-normal_main.o pupaof-normal_menu.o pupaof-disk_powerpc_ieee1275_ofdisk.o pupaof-disk_powerpc_ieee1275_partition.o pupaof-kern_env.o pupaof-normal_arg.o
$(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(pupaof_LDFLAGS)
pupaof-boot_powerpc_ieee1275_cmain.o: boot/powerpc/ieee1275/cmain.c
$(BUILD_CC) -Iboot/powerpc/ieee1275 -I$(srcdir)/boot/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-boot_powerpc_ieee1275_cmain.d: boot/powerpc/ieee1275/cmain.c
set -e; $(BUILD_CC) -Iboot/powerpc/ieee1275 -I$(srcdir)/boot/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,cmain\.o[ :]*,pupaof-boot_powerpc_ieee1275_cmain.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-boot_powerpc_ieee1275_cmain.d
pupaof-boot_powerpc_ieee1275_ieee1275.o: boot/powerpc/ieee1275/ieee1275.c
$(BUILD_CC) -Iboot/powerpc/ieee1275 -I$(srcdir)/boot/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-boot_powerpc_ieee1275_ieee1275.d: boot/powerpc/ieee1275/ieee1275.c
set -e; $(BUILD_CC) -Iboot/powerpc/ieee1275 -I$(srcdir)/boot/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,ieee1275\.o[ :]*,pupaof-boot_powerpc_ieee1275_ieee1275.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-boot_powerpc_ieee1275_ieee1275.d
pupaof-boot_powerpc_ieee1275_crt0.o: boot/powerpc/ieee1275/crt0.S
$(BUILD_CC) -Iboot/powerpc/ieee1275 -I$(srcdir)/boot/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-boot_powerpc_ieee1275_crt0.d: boot/powerpc/ieee1275/crt0.S
set -e; $(BUILD_CC) -Iboot/powerpc/ieee1275 -I$(srcdir)/boot/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,crt0\.o[ :]*,pupaof-boot_powerpc_ieee1275_crt0.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-boot_powerpc_ieee1275_crt0.d
pupaof-kern_main.o: kern/main.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_main.d: kern/main.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,main\.o[ :]*,pupaof-kern_main.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_main.d
pupaof-kern_device.o: kern/device.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_device.d: kern/device.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,device\.o[ :]*,pupaof-kern_device.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_device.d
pupaof-kern_disk.o: kern/disk.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_disk.d: kern/disk.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,disk\.o[ :]*,pupaof-kern_disk.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_disk.d
pupaof-kern_dl.o: kern/dl.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_dl.d: kern/dl.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,dl\.o[ :]*,pupaof-kern_dl.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_dl.d
pupaof-kern_file.o: kern/file.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_file.d: kern/file.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,file\.o[ :]*,pupaof-kern_file.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_file.d
pupaof-kern_fs.o: kern/fs.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_fs.d: kern/fs.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,fs\.o[ :]*,pupaof-kern_fs.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_fs.d
pupaof-kern_err.o: kern/err.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_err.d: kern/err.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,err\.o[ :]*,pupaof-kern_err.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_err.d
pupaof-kern_misc.o: kern/misc.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_misc.d: kern/misc.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,misc\.o[ :]*,pupaof-kern_misc.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_misc.d
pupaof-kern_mm.o: kern/mm.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_mm.d: kern/mm.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,mm\.o[ :]*,pupaof-kern_mm.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_mm.d
pupaof-kern_loader.o: kern/loader.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_loader.d: kern/loader.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,loader\.o[ :]*,pupaof-kern_loader.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_loader.d
pupaof-kern_rescue.o: kern/rescue.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_rescue.d: kern/rescue.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,rescue\.o[ :]*,pupaof-kern_rescue.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_rescue.d
pupaof-kern_term.o: kern/term.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_term.d: kern/term.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,term\.o[ :]*,pupaof-kern_term.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_term.d
pupaof-kern_powerpc_ieee1275_init.o: kern/powerpc/ieee1275/init.c
$(BUILD_CC) -Ikern/powerpc/ieee1275 -I$(srcdir)/kern/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_powerpc_ieee1275_init.d: kern/powerpc/ieee1275/init.c
set -e; $(BUILD_CC) -Ikern/powerpc/ieee1275 -I$(srcdir)/kern/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,init\.o[ :]*,pupaof-kern_powerpc_ieee1275_init.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_powerpc_ieee1275_init.d
pupaof-term_powerpc_ieee1275_ofconsole.o: term/powerpc/ieee1275/ofconsole.c
$(BUILD_CC) -Iterm/powerpc/ieee1275 -I$(srcdir)/term/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-term_powerpc_ieee1275_ofconsole.d: term/powerpc/ieee1275/ofconsole.c
set -e; $(BUILD_CC) -Iterm/powerpc/ieee1275 -I$(srcdir)/term/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,ofconsole\.o[ :]*,pupaof-term_powerpc_ieee1275_ofconsole.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-term_powerpc_ieee1275_ofconsole.d
pupaof-kern_powerpc_ieee1275_openfw.o: kern/powerpc/ieee1275/openfw.c
$(BUILD_CC) -Ikern/powerpc/ieee1275 -I$(srcdir)/kern/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_powerpc_ieee1275_openfw.d: kern/powerpc/ieee1275/openfw.c
set -e; $(BUILD_CC) -Ikern/powerpc/ieee1275 -I$(srcdir)/kern/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,openfw\.o[ :]*,pupaof-kern_powerpc_ieee1275_openfw.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_powerpc_ieee1275_openfw.d
pupaof-fs_ext2.o: fs/ext2.c
$(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-fs_ext2.d: fs/ext2.c
set -e; $(BUILD_CC) -Ifs -I$(srcdir)/fs $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,ext2\.o[ :]*,pupaof-fs_ext2.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-fs_ext2.d
pupaof-normal_cmdline.o: normal/cmdline.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-normal_cmdline.d: normal/cmdline.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,cmdline\.o[ :]*,pupaof-normal_cmdline.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-normal_cmdline.d
pupaof-normal_command.o: normal/command.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-normal_command.d: normal/command.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,command\.o[ :]*,pupaof-normal_command.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-normal_command.d
pupaof-normal_main.o: normal/main.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-normal_main.d: normal/main.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,main\.o[ :]*,pupaof-normal_main.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-normal_main.d
pupaof-normal_menu.o: normal/menu.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-normal_menu.d: normal/menu.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,menu\.o[ :]*,pupaof-normal_menu.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-normal_menu.d
pupaof-disk_powerpc_ieee1275_ofdisk.o: disk/powerpc/ieee1275/ofdisk.c
$(BUILD_CC) -Idisk/powerpc/ieee1275 -I$(srcdir)/disk/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-disk_powerpc_ieee1275_ofdisk.d: disk/powerpc/ieee1275/ofdisk.c
set -e; $(BUILD_CC) -Idisk/powerpc/ieee1275 -I$(srcdir)/disk/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,ofdisk\.o[ :]*,pupaof-disk_powerpc_ieee1275_ofdisk.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-disk_powerpc_ieee1275_ofdisk.d
pupaof-disk_powerpc_ieee1275_partition.o: disk/powerpc/ieee1275/partition.c
$(BUILD_CC) -Idisk/powerpc/ieee1275 -I$(srcdir)/disk/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-disk_powerpc_ieee1275_partition.d: disk/powerpc/ieee1275/partition.c
set -e; $(BUILD_CC) -Idisk/powerpc/ieee1275 -I$(srcdir)/disk/powerpc/ieee1275 $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,partition\.o[ :]*,pupaof-disk_powerpc_ieee1275_partition.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-disk_powerpc_ieee1275_partition.d
pupaof-kern_env.o: kern/env.c
$(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-kern_env.d: kern/env.c
set -e; $(BUILD_CC) -Ikern -I$(srcdir)/kern $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,env\.o[ :]*,pupaof-kern_env.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-kern_env.d
pupaof-normal_arg.o: normal/arg.c
$(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -c -o $@ $<
pupaof-normal_arg.d: normal/arg.c
set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(pupaof_CFLAGS) -M $< | sed 's,arg\.o[ :]*,pupaof-normal_arg.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include pupaof-normal_arg.d
pupaof_HEADERS = pupa/powerpc/ieee1275/ieee1275.h
pupaof_CFLAGS = $(COMMON_CFLAGS)
pupaof_ASFLAGS = $(COMMON_ASFLAGS)
pupaof_LDFLAGS = -Wl,-Ttext,0x200000,-Bstatic
# For genmoddep.
genmoddep_SOURCES = util/genmoddep.c
CLEANFILES += genmoddep genmoddep-util_genmoddep.o
MOSTLYCLEANFILES += genmoddep-util_genmoddep.d
genmoddep: genmoddep-util_genmoddep.o
$(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(genmoddep_LDFLAGS)
genmoddep-util_genmoddep.o: util/genmoddep.c
$(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(genmoddep_CFLAGS) -c -o $@ $<
genmoddep-util_genmoddep.d: util/genmoddep.c
set -e; $(BUILD_CC) -Iutil -I$(srcdir)/util $(BUILD_CPPFLAGS) $(BUILD_CFLAGS) -DPUPA_UTIL=1 $(genmoddep_CFLAGS) -M $< | sed 's,genmoddep\.o[ :]*,genmoddep-util_genmoddep.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@
-include genmoddep-util_genmoddep.d
# Modules.
CLEANFILES += moddep.lst
pkgdata_DATA += moddep.lst
moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep
cat $(DEFSYMFILES) /dev/null | ./genmoddep $(UNDSYMFILES) > $@ \
|| (rm -f $@; exit 1)

51
conf/powerpc-ieee1275.rmk Normal file
View File

@ -0,0 +1,51 @@
# -*- makefile -*-
COMMON_ASFLAGS = -nostdinc -fno-builtin -D__ASSEMBLY__
COMMON_CFLAGS = -fno-builtin -D__ASSEMBLY__
# Images.
MOSTLYCLEANFILES += symlist.c kernel_syms.lst
DEFSYMFILES += kernel_syms.lst
symlist.c: $(addprefix include/pupa/,$(kernel_img_HEADERS)) gensymlist.sh
sh $(srcdir)/gensymlist.sh $(filter %.h,$^) > $@
kernel_syms.lst: $(addprefix include/pupa/,$(kernel_img_HEADERS)) genkernsyms.sh
sh $(srcdir)/genkernsyms.sh $(filter %h,$^) > $@
# Utilities.
sbin_UTILITIES = pupaof
bin_UTILITIES = pupa-emu
noinst_UTILITIES = genmoddep
# For pupa-emu
pupa_emu_SOURCES = kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/loader.c kern/rescue.c kern/term.c \
disk/powerpc/ieee1275/partition.c \
util/i386/pc/biosdisk.c fs/fat.c fs/ext2.c \
normal/cmdline.c normal/command.c normal/main.c normal/menu.c \
util/console.c util/pupa-emu.c util/misc.c util/i386/pc/getroot.c \
kern/env.c
pupa_emu_LDFLAGS = -lncurses
pupaof_SOURCES = boot/powerpc/ieee1275/cmain.c boot/powerpc/ieee1275/ieee1275.c \
boot/powerpc/ieee1275/crt0.S kern/main.c kern/device.c \
kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
kern/misc.c kern/mm.c kern/loader.c kern/rescue.c kern/term.c \
kern/powerpc/ieee1275/init.c term/powerpc/ieee1275/ofconsole.c \
kern/powerpc/ieee1275/openfw.c fs/ext2.c normal/cmdline.c \
normal/command.c normal/main.c normal/menu.c \
disk/powerpc/ieee1275/ofdisk.c disk/powerpc/ieee1275/partition.c \
kern/env.c normal/arg.c
pupaof_HEADERS = pupa/powerpc/ieee1275/ieee1275.h
pupaof_CFLAGS = $(COMMON_CFLAGS)
pupaof_ASFLAGS = $(COMMON_ASFLAGS)
pupaof_LDFLAGS = -Wl,-Ttext,0x200000,-Bstatic
# For genmoddep.
genmoddep_SOURCES = util/genmoddep.c
# Modules.

16
configure vendored
View File

@ -1363,6 +1363,7 @@ host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
case "$host_cpu" in
i[3456]86) host_cpu=i386 ;;
powerpc) ;;
*) { { echo "$as_me:$LINENO: error: unsupported CPU type" >&5
echo "$as_me: error: unsupported CPU type" >&2;}
{ (exit 1); exit 1; }; } ;;
@ -1370,6 +1371,7 @@ esac
case "$host_cpu"-"$host_vendor" in
i386-*) host_vendor=pc ;;
powerpc-*) host_vendor=ieee1275 ;;
*) { { echo "$as_me:$LINENO: error: unsupported machine type" >&5
echo "$as_me: error: unsupported machine type" >&2;}
{ (exit 1); exit 1; }; } ;;
@ -2737,6 +2739,7 @@ fi
echo "$as_me:$LINENO: result: $pupa_cv_asm_uscore" >&5
echo "${ECHO_T}$pupa_cv_asm_uscore" >&6
if test "x$host_cpu" = xi386; then
echo "$as_me:$LINENO: checking if start is defined by the compiler" >&5
echo $ECHO_N "checking if start is defined by the compiler... $ECHO_C" >&6
@ -3131,6 +3134,7 @@ echo "$as_me: error: neither end nor _end is defined" >&2;}
{ (exit 1); exit 1; }; }
fi
fi
if test "x$host_cpu" = xi386; then
@ -3877,9 +3881,6 @@ fi
# For cross-compiling.
if test "x$build" = "x$host"; then
BUILD_CC="$CC"
else
for ac_prog in gcc egcs cc
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
@ -3923,6 +3924,9 @@ test -n "$BUILD_CC" || BUILD_CC="{ { echo "$as_me:$LINENO: error: none of gcc, e
echo "$as_me: error: none of gcc, egcs and cc is found. set BUILD_CC manually." >&2;}
{ (exit 1); exit 1; }; }"
else
BUILD_CC="$CC"
fi
# Test the C compiler for the build environment.
@ -5334,7 +5338,8 @@ _ACEOF
# Check LZO.
# Check LZO when compiling for the i386.
if test "x$host_cpu" = xi386; then
echo "$as_me:$LINENO: checking for __lzo_init2 in -llzo" >&5
echo $ECHO_N "checking for __lzo_init2 in -llzo... $ECHO_C" >&6
@ -5403,7 +5408,7 @@ echo "$as_me: error: LZO library version 1.02 or later is required" >&2;}
{ (exit 1); exit 1; }; }
fi
echo "$as_me:$LINENO: checking for lzo1x_999_compress" >&5
echo "$as_me:$LINENO: checking for lzo1x_999_compress" >&5
echo $ECHO_N "checking for lzo1x_999_compress... $ECHO_C" >&6
if test "${ac_cv_func_lzo1x_999_compress+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@ -5483,6 +5488,7 @@ echo "$as_me: error: LZO1X-999 must be enabled" >&2;}
{ (exit 1); exit 1; }; }
fi
fi
CC="$tmp_CC"
CFLAGS="$tmp_CFLAGS"

View File

@ -1,6 +1,6 @@
# Process this file with autoconf to produce a configure script.
# Copyright (C) 2002,2003 Free Software Foundation, Inc.
# Copyright (C) 2002,2003,2004 Free Software Foundation, Inc.
#
# This configure.ac is free software; the author
# gives unlimited permission to copy and/or distribute it,
@ -22,11 +22,13 @@ AC_CANONICAL_HOST
case "$host_cpu" in
i[[3456]]86) host_cpu=i386 ;;
powerpc) ;;
*) AC_MSG_ERROR([unsupported CPU type]) ;;
esac
case "$host_cpu"-"$host_vendor" in
i386-*) host_vendor=pc ;;
powerpc-*) host_vendor=ieee1275 ;;
*) AC_MSG_ERROR([unsupported machine type]) ;;
esac
@ -80,9 +82,11 @@ AC_SUBST(CFLAGS)
# Defined in aclocal.m4.
pupa_ASM_USCORE
pupa_CHECK_START_SYMBOL
pupa_CHECK_BSS_START_SYMBOL
pupa_CHECK_END_SYMBOL
if test "x$host_cpu" = xi386; then
pupa_CHECK_START_SYMBOL
pupa_CHECK_BSS_START_SYMBOL
pupa_CHECK_END_SYMBOL
fi
if test "x$host_cpu" = xi386; then
pupa_I386_ASM_PREFIX_REQUIREMENT
@ -106,11 +110,11 @@ AC_PATH_PROG(RUBY, ruby)
# For cross-compiling.
if test "x$build" = "x$host"; then
BUILD_CC="$CC"
AC_SUBST(BUILD_CC)
else
AC_CHECK_PROGS(BUILD_CC, [gcc egcs cc],
[AC_MSG_ERROR([none of gcc, egcs and cc is found. set BUILD_CC manually.])])
else
BUILD_CC="$CC"
AC_SUBST(BUILD_CC)
fi
# Test the C compiler for the build environment.
@ -126,11 +130,13 @@ AC_C_BIGENDIAN
AC_CHECK_SIZEOF(void *)
AC_CHECK_SIZEOF(long)
# Check LZO.
AC_CHECK_LIB(lzo, __lzo_init2, ,
AC_MSG_ERROR([LZO library version 1.02 or later is required]))
AC_CHECK_FUNC(lzo1x_999_compress, ,
[AC_MSG_ERROR([LZO1X-999 must be enabled])])
# Check LZO when compiling for the i386.
if test "x$host_cpu" = xi386; then
AC_CHECK_LIB(lzo, __lzo_init2, ,
AC_MSG_ERROR([LZO library version 1.02 or later is required]))
AC_CHECK_FUNC(lzo1x_999_compress, ,
[AC_MSG_ERROR([LZO1X-999 must be enabled])])
fi
CC="$tmp_CC"
CFLAGS="$tmp_CFLAGS"

View File

@ -0,0 +1,161 @@
/* ofdisk.c - Open Firmware disk access. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <pupa/misc.h>
#include <pupa/disk.h>
#include <pupa/mm.h>
#include <pupa/machine/ieee1275.h>
static int
pupa_ofdisk_iterate (int (*hook) (const char *name))
{
int dev_iterate (struct pupa_ieee1275_devalias *alias)
{
if (! pupa_strcmp (alias->type, "block"))
hook (alias->name);
return 0;
}
pupa_devalias_iterate (dev_iterate);
return 0;
}
static pupa_err_t
pupa_ofdisk_open (const char *name, pupa_disk_t disk)
{
pupa_ieee1275_phandle_t devalias;
pupa_ieee1275_phandle_t dev;
pupa_ieee1275_ihandle_t dev_ihandle = 0;
char *devpath = 0;
/* XXX: This should be large enough for any possible case. */
char prop[64];
pupa_size_t pathlen;
int actual;
if (pupa_ieee1275_finddevice ("/aliases", &devalias))
return pupa_error (PUPA_ERR_UNKNOWN_DEVICE, "Can't read the aliases");
pupa_ieee1275_get_property_length (devalias, name, &pathlen);
devpath = pupa_malloc (pathlen);
if (! devpath)
return pupa_errno;
if (pupa_ieee1275_get_property (devalias, name, devpath, pathlen, &actual))
return pupa_error (PUPA_ERR_UNKNOWN_DEVICE, "No such device alias");
/* To access the complete disk add `:0'. */
pupa_strcat (devpath, ":0");
pupa_ieee1275_open (devpath, &dev_ihandle);
if (! dev_ihandle)
return pupa_error (PUPA_ERR_UNKNOWN_DEVICE, "Can't open device");
if (pupa_ieee1275_finddevice (devpath, &dev))
{
pupa_error (PUPA_ERR_UNKNOWN_DEVICE, "Can't read device properties");
goto fail;
}
if (pupa_ieee1275_get_property (dev, "device_type", prop, sizeof (prop),
&actual))
{
pupa_error (PUPA_ERR_BAD_DEVICE, "Can't read the device type");
goto fail;
}
if (pupa_strcmp (prop, "block"))
{
pupa_error (PUPA_ERR_BAD_DEVICE, "Not a block device");
goto fail;
}
/* XXX: There is no property to read the number of blocks. There
should be a property `#blocks', but it is not there. Perhaps it
is possible to use seek for this. */
disk->total_sectors = 0xFFFFFFFFUL;
/* XXX: Is it ok to use this? Perhaps it is better to use the path
or some property. */
disk->id = dev;
/* XXX: Read this, somehow. */
disk->has_partitions = 1;
disk->data = (void *) dev_ihandle;
fail:
if (pupa_errno)
pupa_ieee1275_close (dev_ihandle);
pupa_free (devpath);
return pupa_errno;
}
static void
pupa_ofdisk_close (pupa_disk_t disk)
{
pupa_ieee1275_close ((pupa_ieee1275_ihandle_t) disk->data);
}
static pupa_err_t
pupa_ofdisk_read (pupa_disk_t disk, unsigned long sector,
unsigned long size, char *buf)
{
int status;
int actual;
unsigned long long pos;
pos = (unsigned long long) sector * 512UL;
pupa_ieee1275_seek ((pupa_ieee1275_ihandle_t) disk->data, (int) (pos >> 32),
(int) pos & 0xFFFFFFFFUL, &status);
if (status != 0)
return pupa_error (PUPA_ERR_READ_ERROR,
"Seek error, can't seek block %d", sector);
pupa_ieee1275_read ((pupa_ieee1275_ihandle_t) disk->data, buf,
size * 512UL, &actual);
if (actual != actual)
return pupa_error (PUPA_ERR_READ_ERROR, "Read error on block: %d", sector);
return 0;
}
static pupa_err_t
pupa_ofdisk_write (pupa_disk_t disk __attribute ((unused)),
unsigned long sector __attribute ((unused)),
unsigned long size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
return PUPA_ERR_NOT_IMPLEMENTED_YET;
}
static struct pupa_disk_dev pupa_ofdisk_dev =
{
.name = "ofdisk",
.iterate = pupa_ofdisk_iterate,
.open = pupa_ofdisk_open,
.close = pupa_ofdisk_close,
.read = pupa_ofdisk_read,
.write = pupa_ofdisk_write,
.next = 0
};
void
pupa_ofdisk_init (void)
{
pupa_disk_dev_register (&pupa_ofdisk_dev);
}

View File

@ -0,0 +1,120 @@
/* partiton.c - Read macintosh partition tables. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <pupa/disk.h>
#include <pupa/misc.h>
#include <pupa/mm.h>
#include <pupa/machine/partition.h>
pupa_err_t
pupa_partition_iterate (pupa_disk_t disk,
int (*hook) (const pupa_partition_t partition))
{
struct pupa_partition part;
struct pupa_apple_part apart;
struct pupa_disk raw;
int partno = 0;
int pos = PUPA_DISK_SECTOR_SIZE * 2;
/* Enforce raw disk access. */
raw = *disk;
raw.partition = 0;
for (;;)
{
if (pupa_disk_read (&raw, pos / PUPA_DISK_SECTOR_SIZE,
pos % PUPA_DISK_SECTOR_SIZE,
sizeof (struct pupa_apple_part), (char *) &apart))
return pupa_errno;
if (apart.magic != PUPA_APPLE_PART_MAGIC)
break;
part.start = apart.first_phys_block;
part.len = apart.blockcnt;
part.offset = pos;
part.index = partno;
if (hook (&part))
return pupa_errno;
if (apart.first_phys_block == PUPA_DISK_SECTOR_SIZE * 2)
return 0;
pos += sizeof (struct pupa_apple_part);
partno++;
}
return 0;
}
pupa_partition_t
pupa_partition_probe (pupa_disk_t disk, const char *str)
{
pupa_partition_t p;
int partnum = 0;
char *s = (char *) str;
int find_func (const pupa_partition_t partition)
{
if (partnum == partition->index)
{
p = (pupa_partition_t) pupa_malloc (sizeof (*p));
if (! p)
return 1;
pupa_memcpy (p, partition, sizeof (*p));
return 1;
}
return 0;
}
/* Get the partition number. */
partnum = pupa_strtoul (s, &s, 0);
if (pupa_errno)
{
pupa_error (PUPA_ERR_BAD_FILENAME, "invalid partition");
return 0;
}
if (pupa_partition_iterate (disk, find_func))
goto fail;
return p;
fail:
pupa_free (p);
return 0;
}
char *
pupa_partition_get_name (const pupa_partition_t p)
{
char *name;
name = pupa_malloc (13);
if (! name)
return 0;
pupa_sprintf (name, "%d", p->index);
return name;
}

View File

@ -170,7 +170,7 @@ class Utility
def rule(sources)
prefix = @name.to_var
objs = sources.collect do |src|
raise "unknown source file `#{src}'" if /\.c$/ !~ src
raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src
prefix + '-' + src.to_obj
end
objs_str = objs.join(' ');

View File

@ -0,0 +1,47 @@
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
*
* PUPA is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PUPA; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_BIOSDISK_MACHINE_HEADER
#define PUPA_BIOSDISK_MACHINE_HEADER 1
#define PUPA_BIOSDISK_FLAG_LBA 1
struct pupa_biosdisk_data
{
int drive;
unsigned long cylinders;
unsigned long heads;
unsigned long sectors;
unsigned long flags;
};
int pupa_biosdisk_rw_int13_extensions (int ah, int drive, void *dap);
int pupa_biosdisk_rw_standard (int ah, int drive, int coff, int hoff,
int soff, int nsec, int segment);
int pupa_biosdisk_check_int13_extensions (int drive);
int pupa_biosdisk_get_diskinfo_int13_extensions (int drive, void *drp);
int pupa_biosdisk_get_diskinfo_standard (int drive,
unsigned long *cylinders,
unsigned long *heads,
unsigned long *sectors);
int pupa_biosdisk_get_num_floppies (void);
void pupa_biosdisk_init (void);
#endif /* ! PUPA_BIOSDISK_MACHINE_HEADER */

View File

@ -0,0 +1,56 @@
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_CONSOLE_MACHINE_HEADER
#define PUPA_CONSOLE_MACHINE_HEADER 1
/* Define scan codes. */
#define PUPA_CONSOLE_KEY_LEFT 0x4B00
#define PUPA_CONSOLE_KEY_RIGHT 0x4D00
#define PUPA_CONSOLE_KEY_UP 0x4800
#define PUPA_CONSOLE_KEY_DOWN 0x5000
#define PUPA_CONSOLE_KEY_IC 0x5200
#define PUPA_CONSOLE_KEY_DC 0x5300
#define PUPA_CONSOLE_KEY_BACKSPACE 0x0008
#define PUPA_CONSOLE_KEY_HOME 0x4700
#define PUPA_CONSOLE_KEY_END 0x4F00
#define PUPA_CONSOLE_KEY_NPAGE 0x4900
#define PUPA_CONSOLE_KEY_PPAGE 0x5100
#ifndef ASM_FILE
#include <pupa/types.h>
#include <pupa/symbol.h>
/* These are global to share code between C and asm. */
extern pupa_uint8_t pupa_console_cur_color;
void pupa_console_real_putchar (int c);
int EXPORT_FUNC(pupa_console_checkkey) (void);
int EXPORT_FUNC(pupa_console_getkey) (void);
pupa_uint16_t pupa_console_getxy (void);
void pupa_console_gotoxy (pupa_uint8_t x, pupa_uint8_t y);
void pupa_console_cls (void);
void pupa_console_setcursor (int on);
/* Initialize the console system. */
void pupa_console_init (void);
#endif
#endif /* ! PUPA_CONSOLE_MACHINE_HEADER */

View File

@ -0,0 +1,99 @@
/* ieee1275.h - Access the Open Firmware client interface. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_IEEE1275_MACHINE_HEADER
#define PUPA_IEEE1275_MACHINE_HEADER 1
#include <stdint.h>
#include <pupa/err.h>
#include <pupa/types.h>
/* Maps a device alias to a pathname. */
struct pupa_ieee1275_devalias
{
char *name;
char *path;
char *type;
};
struct pupa_ieee1275_mem_region
{
unsigned int start;
unsigned int size;
};
/* FIXME jrydberg: is this correct cell types? */
typedef intptr_t pupa_ieee1275_ihandle_t;
typedef intptr_t pupa_ieee1275_phandle_t;
extern intptr_t (*pupa_ieee1275_entry_fn) (void *);
uint32_t EXPORT_FUNC(pupa_ieee1275_decode_int_4) (unsigned char *p);
int EXPORT_FUNC(pupa_ieee1275_finddevice) (char *name,
pupa_ieee1275_phandle_t *phandlep);
int EXPORT_FUNC(pupa_ieee1275_get_property) (int handle, const char *property,
void *buf, pupa_size_t size,
pupa_size_t *actual);
int EXPORT_FUNC(pupa_ieee1275_next_property) (int handle, char *prev_prop,
char *prop, int *flags);
int EXPORT_FUNC(pupa_ieee1275_get_property_length)
(pupa_ieee1275_phandle_t handle, const char *prop, pupa_size_t *length);
int EXPORT_FUNC(pupa_ieee1275_instance_to_package)
(pupa_ieee1275_ihandle_t ihandle, pupa_ieee1275_phandle_t *phandlep);
int EXPORT_FUNC(pupa_ieee1275_package_to_path) (pupa_ieee1275_phandle_t phandle,
char *path, pupa_size_t len,
pupa_size_t *actual);
int EXPORT_FUNC(pupa_ieee1275_instance_to_path)
(pupa_ieee1275_ihandle_t ihandle, char *path, pupa_size_t len,
pupa_size_t *actual);
int EXPORT_FUNC(pupa_ieee1275_write) (pupa_ieee1275_ihandle_t ihandle,
void *buffer, pupa_size_t len,
pupa_size_t *actualp);
int EXPORT_FUNC(pupa_ieee1275_read) (pupa_ieee1275_ihandle_t ihandle,
void *buffer, pupa_size_t len,
pupa_size_t *actualp);
int EXPORT_FUNC(pupa_ieee1275_seek) (pupa_ieee1275_ihandle_t ihandle,
int pos_hi, int pos_lo, int *result);
int EXPORT_FUNC(pupa_ieee1275_peer) (pupa_ieee1275_phandle_t node,
pupa_ieee1275_phandle_t *result);
int EXPORT_FUNC(pupa_ieee1275_child) (pupa_ieee1275_phandle_t node,
pupa_ieee1275_phandle_t *result);
int EXPORT_FUNC(pupa_ieee1275_parent) (pupa_ieee1275_phandle_t node,
pupa_ieee1275_phandle_t *result);
int EXPORT_FUNC(pupa_ieee1275_exit) (void);
int EXPORT_FUNC(pupa_ieee1275_open) (char *node,
pupa_ieee1275_ihandle_t *result);
int EXPORT_FUNC(pupa_ieee1275_close) (pupa_ieee1275_ihandle_t ihandle);
int EXPORT_FUNC(pupa_ieee1275_claim) (void *p, pupa_size_t size, unsigned int align,
void **result);
int EXPORT_FUNC(pupa_ieee1275_set_property) (pupa_ieee1275_phandle_t phandle,
const char *propname, void *buf,
pupa_size_t size,
pupa_size_t *actual);
int EXPORT_FUNC(pupa_ieee1275_set_color) (pupa_ieee1275_ihandle_t ihandle,
int index, int r, int g, int b);
pupa_err_t EXPORT_FUNC(pupa_devalias_iterate)
(int (*hook) (struct pupa_ieee1275_devalias *alias));
#endif /* ! PUPA_IEEE1275_MACHINE_HEADER */

View File

@ -0,0 +1,51 @@
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2002 Yoshinori K. Okuji <okuji@enbug.org>
* Copyright (C) 2003 Jeroen Dekkers <jeroen@dekkers.cx>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_LOADER_MACHINE_HEADER
#define PUPA_LOADER_MACHINE_HEADER 1
#include <pupa/types.h>
#include <pupa/symbol.h>
#include <pupa/machine/multiboot.h>
extern pupa_uint32_t EXPORT_VAR(pupa_linux_prot_size);
extern char *EXPORT_VAR(pupa_linux_tmp_addr);
extern char *EXPORT_VAR(pupa_linux_real_addr);
void EXPORT_FUNC(pupa_linux_boot_zimage) (void) __attribute__ ((noreturn));
void EXPORT_FUNC(pupa_linux_boot_bzimage) (void) __attribute__ ((noreturn));
/* This is an asm part of the chainloader. */
void EXPORT_FUNC(pupa_chainloader_real_boot) (int drive, void *part_addr) __attribute__ ((noreturn));
/* The asm part of the multiboot loader. */
void EXPORT_FUNC(pupa_multiboot_real_boot) (pupa_addr_t entry,
struct pupa_multiboot_info *mbi)
__attribute__ ((noreturn));
/* It is necessary to export these functions, because normal mode commands
reuse rescue mode commands. */
void pupa_rescue_cmd_chainloader (int argc, char *argv[]);
void pupa_rescue_cmd_linux (int argc, char *argv[]);
void pupa_rescue_cmd_initrd (int argc, char *argv[]);
void pupa_rescue_cmd_multiboot (int argc, char *argv[]);
void pupa_rescue_cmd_module (int argc, char *argv[]);
#endif /* ! PUPA_LOADER_MACHINE_HEADER */

View File

@ -0,0 +1,184 @@
/* multiboot.h - multiboot header file. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_MULTIBOOT_MACHINE_HEADER
#define PUPA_MULTIBOOT_MACHINE_HEADER 1
/* How many bytes from the start of the file we search for the header. */
#define PUPA_MB_SEARCH 8192
/* The magic field should contain this. */
#define PUPA_MB_MAGIC 0x1BADB002
/* This should be in %eax. */
#define PUPA_MB_MAGIC2 0x2BADB002
/* The bits in the required part of flags field we don't support. */
#define PUPA_MB_UNSUPPORTED 0x0000fffc
/* Alignment of multiboot modules. */
#define PUPA_MB_MOD_ALIGN 0x00001000
/*
* Flags set in the 'flags' member of the multiboot header.
*/
/* Align all boot modules on i386 page (4KB) boundaries. */
#define PUPA_MB_PAGE_ALIGN 0x00000001
/* Must pass memory information to OS. */
#define PUPA_MB_MEMORY_INFO 0x00000002
/* Must pass video information to OS. */
#define PUPA_MB_VIDEO_MODE 0x00000004
/* This flag indicates the use of the address fields in the header. */
#define PUPA_MB_AOUT_KLUDGE 0x00010000
/*
* Flags to be set in the 'flags' member of the multiboot info structure.
*/
/* is there basic lower/upper memory information? */
#define PUPA_MB_INFO_MEMORY 0x00000001
/* is there a boot device set? */
#define PUPA_MB_INFO_BOOTDEV 0x00000002
/* is the command-line defined? */
#define PUPA_MB_INFO_CMDLINE 0x00000004
/* are there modules to do something with? */
#define PUPA_MB_INFO_MODS 0x00000008
/* These next two are mutually exclusive */
/* is there a symbol table loaded? */
#define PUPA_MB_INFO_AOUT_SYMS 0x00000010
/* is there an ELF section header table? */
#define PUPA_MB_INFO_ELF_SHDR 0x00000020
/* is there a full memory map? */
#define PUPA_MB_INFO_MEM_MAP 0x00000040
/* Is there drive info? */
#define PUPA_MB_INFO_DRIVE_INFO 0x00000080
/* Is there a config table? */
#define PUPA_MB_INFO_CONFIG_TABLE 0x00000100
/* Is there a boot loader name? */
#define PUPA_MB_INFO_BOOT_LOADER_NAME 0x00000200
/* Is there a APM table? */
#define PUPA_MB_INFO_APM_TABLE 0x00000400
/* Is there video information? */
#define PUPA_MB_INFO_VIDEO_INFO 0x00000800
#ifndef ASM_FILE
#include <pupa/types.h>
struct pupa_multiboot_header
{
/* Must be PUPA_MB_MAGIC - see above. */
pupa_uint32_t magic;
/* Feature flags. */
pupa_uint32_t flags;
/* The above fields plus this one must equal 0 mod 2^32. */
pupa_uint32_t checksum;
/* These are only valid if PUPA_MB_AOUT_KLUDGE is set. */
pupa_uint32_t header_addr;
pupa_uint32_t load_addr;
pupa_uint32_t load_end_addr;
pupa_uint32_t bss_end_addr;
pupa_uint32_t entry_addr;
/* These are only valid if PUPA_MB_VIDEO_MODE is set. */
pupa_uint32_t mode_type;
pupa_uint32_t width;
pupa_uint32_t height;
pupa_uint32_t depth;
};
struct pupa_multiboot_info
{
/* MultiBoot info version number */
pupa_uint32_t flags;
/* Available memory from BIOS */
pupa_uint32_t mem_lower;
pupa_uint32_t mem_upper;
/* "root" partition */
pupa_uint32_t boot_device;
/* Kernel command line */
pupa_uint32_t cmdline;
/* Boot-Module list */
pupa_uint32_t mods_count;
pupa_uint32_t mods_addr;
pupa_uint32_t syms[4];
/* Memory Mapping buffer */
pupa_uint32_t mmap_length;
pupa_uint32_t mmap_addr;
/* Drive Info buffer */
pupa_uint32_t drives_length;
pupa_uint32_t drives_addr;
/* ROM configuration table */
pupa_uint32_t config_table;
/* Boot Loader Name */
pupa_uint32_t boot_loader_name;
/* APM table */
pupa_uint32_t apm_table;
/* Video */
pupa_uint32_t vbe_control_info;
pupa_uint32_t vbe_mode_info;
pupa_uint16_t vbe_mode;
pupa_uint16_t vbe_interface_seg;
pupa_uint16_t vbe_interface_off;
pupa_uint16_t vbe_interface_len;
};
struct pupa_mod_list
{
/* the memory used goes from bytes 'mod_start' to 'mod_end-1' inclusive */
pupa_uint32_t mod_start;
pupa_uint32_t mod_end;
/* Module command line */
pupa_uint32_t cmdline;
/* padding to take it to 16 bytes (must be zero) */
pupa_uint32_t pad;
};
#endif /* ! ASM_FILE */
#endif /* ! PUPA_MULTIBOOT_MACHINE_HEADER */

View File

@ -0,0 +1,140 @@
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 1999,2000,2001,2002,2004 Free Software Foundation, Inc.
*
* PUPA is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PUPA; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_PARTITION_HEADER
#define PUPA_PARTITION_HEADER 1
#include <pupa/symbol.h>
#include <pupa/types.h>
#include <pupa/err.h>
#define PUPA_APPLE_PART_MAGIC 0x504D
struct pupa_apple_part
{
/* The magic number to idenify this as a partition, it should have
the value `0x504D'. */
pupa_uint16_t magic;
/* Reserved. */
pupa_uint16_t reserved;
/* The size of the partition map in blocks. */
pupa_uint32_t partmap_size;
/* The first physical block of the partition. */
pupa_uint32_t first_phys_block;
/* The amount of blocks. */
pupa_uint32_t blockcnt;
/* The partition name. */
char partname[32];
/* The partition type. */
char parttype[32];
/* The first datablock of the partition. */
pupa_uint32_t datablocks_first;
/* The amount datablocks. */
pupa_uint32_t datablocks_count;
/* The status of the partition. (???) */
pupa_uint32_t status;
/* The first block on which the bootcode can be found. */
pupa_uint32_t bootcode_pos;
/* The size of the bootcode in bytes. */
pupa_uint32_t bootcode_size;
/* The load address of the bootcode. */
pupa_uint32_t bootcode_loadaddr;
/* Reserved. */
pupa_uint32_t reserved2;
/* The entrypoint of the bootcode. */
pupa_uint32_t bootcode_entrypoint;
/* Reserved. */
pupa_uint32_t reserved3;
/* A checksum of the bootcode. */
pupa_uint32_t bootcode_checksum;
/* The processor type. */
char processor[16];
/* Padding. */
pupa_uint16_t pad[187];
};
/* Partition description. */
struct pupa_partition
{
/* The start sector. */
unsigned long start;
/* The length in sector units. */
unsigned long len;
/* The offset of the partition table. */
unsigned long offset;
/* The index of this partition in the partition table. */
int index;
/* The DOS partition number. */
int dos_part;
/* The BSD partition number (a == 0). */
int bsd_part;
/* The DOS partition type. */
int dos_type;
/* The BSD partition type. */
int bsd_type;
};
typedef struct pupa_partition *pupa_partition_t;
struct pupa_disk;
pupa_partition_t EXPORT_FUNC(pupa_partition_probe) (struct pupa_disk *disk,
const char *str);
pupa_err_t EXPORT_FUNC(pupa_partition_iterate) (struct pupa_disk *disk,
int (*hook) (const pupa_partition_t partition));
char *EXPORT_FUNC(pupa_partition_get_name) (const pupa_partition_t partition);
static inline unsigned long
pupa_partition_get_start (const pupa_partition_t p)
{
return p->start;
}
static inline unsigned long
pupa_partition_get_len (const pupa_partition_t p)
{
return p->len;
}
#endif /* ! PUPA_PARTITION_HEADER */

View File

@ -0,0 +1,33 @@
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003 Marco Gerards <metgerards@student.han.nl>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef KERNEL_TIME_HEADER
#define KERNEL_TIME_HEADER 1
#ifdef PUPA_UTIL
# include <time.h>
# define PUPA_TICKS_PER_SECOND CLOCKS_PER_SEC
#else
# define PUPA_TICKS_PER_SECOND 18
#endif
/* Return the real time in ticks. */
pupa_uint32_t pupa_get_rtc (void);
#endif /* ! KERNEL_TIME_HEADER */

View File

@ -0,0 +1,28 @@
/* biosdisk.h - emulate biosdisk */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
*
* PUPA is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PUPA; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_BIOSDISK_MACHINE_UTIL_HEADER
#define PUPA_BIOSDISK_MACHINE_UTIL_HEADER 1
void pupa_util_biosdisk_init (const char *dev_map);
void pupa_util_biosdisk_fini (void);
char *pupa_util_biosdisk_get_pupa_dev (const char *os_dev);
#endif /* ! PUPA_BIOSDISK_MACHINE_UTIL_HEADER */

View File

@ -0,0 +1,25 @@
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_SETJMP_CPU_HEADER
#define PUPA_SETJMP_CPU_HEADER 1
typedef unsigned long pupa_jmp_buf[6];
#endif /* ! PUPA_SETJMP_CPU_HEADER */

View File

@ -0,0 +1,32 @@
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2002, 2004 Free Software Foundation, Inc.
*
* PUPA is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PUPA; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef PUPA_TYPES_CPU_HEADER
#define PUPA_TYPES_CPU_HEADER 1
/* The size of void *. */
#define PUPA_HOST_SIZEOF_VOID_P 4
/* The size of long. */
#define PUPA_HOST_SIZEOF_LONG 4
/* powerpc is little-endian. */
#undef PUPA_HOST_WORDS_LITTLEENDIAN
#endif /* ! PUPA_TYPES_CPU_HEADER */

View File

@ -0,0 +1,106 @@
/* init.c -- Initialize PUPA on the newworld mac (PPC). */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <pupa/kernel.h>
#include <pupa/dl.h>
#include <pupa/disk.h>
#include <pupa/mm.h>
#include <pupa/machine/partition.h>
#include <pupa/machine/ieee1275.h>
#include <pupa/normal.h>
#include <pupa/fs.h>
#include <pupa/setjmp.h>
#include <env.h>
void pupa_ofdisk_init (void);
void pupa_console_init (void);
/* XXX: Modules are not yet supported. */
pupa_addr_t pupa_end_addr = -1;
pupa_addr_t pupa_total_module_size = 0;
void
abort (void)
{
for (;;);
}
void
pupa_machine_init (void)
{
void *mem;
if (pupa_ieee1275_claim ((void *) 0x300000, 0x150000, 0, &mem) == -1)
abort (); /* Damn, we are in trouble! */
/* The memory allocations were copied from yaboot. */
pupa_mm_init_region ((void *) 0x300000, 0x150000);
/* XXX: Loadable modules are not supported. */
pupa_env_set ("prefix", "");
pupa_ext2_init ();
pupa_ofdisk_init ();
pupa_console_init ();
}
int
pupa_arch_dl_check_header (void *ehdr __attribute ((unused)),
pupa_size_t size __attribute ((unused)))
{
return 0;
}
pupa_err_t
pupa_arch_dl_relocate_symbols (pupa_dl_t mod __attribute ((unused)),
void *ehdr __attribute ((unused)))
{
return 0;
}
void
pupa_stop (void)
{
for (;;);
}
void
pupa_register_exported_symbols (void)
{
}
pupa_uint32_t
pupa_get_rtc (void)
{
return 0;
}
int
pupa_setjmp (pupa_jmp_buf env __attribute ((unused)))
{
return 0;
}
void
pupa_longjmp (pupa_jmp_buf env __attribute ((unused)),
int val __attribute ((unused)))
{
}

View File

@ -0,0 +1,86 @@
/* openfw.c -- Open firmware support funtions. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <pupa/err.h>
#include <pupa/misc.h>
#include <pupa/mm.h>
#include <pupa/machine/ieee1275.h>
/* Iterate through all device aliasses. Thisfunction can be used to
find a device of a specific type. */
pupa_err_t
pupa_devalias_iterate (int (*hook) (struct pupa_ieee1275_devalias *alias))
{
pupa_ieee1275_phandle_t devalias;
char aliasname[32];
int actual;
struct pupa_ieee1275_devalias alias;
if (pupa_ieee1275_finddevice ("/aliases", &devalias))
return -1;
/* XXX: Is this the right way to find the first property? */
aliasname[0] = '\0';
/* XXX: Are the while conditions correct? */
while (pupa_ieee1275_next_property (devalias, aliasname, aliasname, &actual)
|| actual)
{
pupa_ieee1275_phandle_t dev;
pupa_size_t pathlen;
char *devpath;
/* XXX: This should be large enough for any possible case. */
char devtype[64];
pupa_ieee1275_get_property_length (devalias, aliasname, &pathlen);
devpath = pupa_malloc (pathlen);
if (! devpath)
return pupa_errno;
if (pupa_ieee1275_get_property (devalias, aliasname, devpath, pathlen,
&actual))
{
pupa_free (devpath);
continue;
}
if (pupa_ieee1275_finddevice (devpath, &dev))
{
pupa_free (devpath);
continue;
}
if (pupa_ieee1275_get_property (dev, "device_type", devtype, sizeof devtype,
&actual))
{
pupa_free (devpath);
continue;
}
alias.name = aliasname;
alias.path= devpath;
alias.type = devtype;
hook (&alias);
pupa_free (devpath);
}
return 0;
}

View File

@ -1,6 +1,6 @@
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 1999,2000,2001,2002,2003 Free Software Foundation, Inc.
* Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -269,6 +269,7 @@ pupa_tab_complete (char *buf, int *restore)
add_completion (devname, ")", "disks", print_simple_completion);
}
pupa_errno = PUPA_ERR_NONE;
return 0;
}
@ -290,7 +291,7 @@ pupa_tab_complete (char *buf, int *restore)
{
/* Tab complete a command. */
len = pupa_strlen (pos);
pupa_iterate_commands (iterate_commands);
}
else
@ -330,7 +331,7 @@ pupa_tab_complete (char *buf, int *restore)
{
pos = partition + 1;
len = pupa_strlen (pos);
pupa_partition_iterate (partdev->disk, iterate_part);
if (pupa_errno)
pupa_errno = 0;
@ -363,7 +364,7 @@ pupa_tab_complete (char *buf, int *restore)
char *dirfile;
pos++;
len = pupa_strlen (pos);
dir = pupa_strchr (path, '/');
if (!dir)
{

View File

@ -0,0 +1,308 @@
/* ofconsole.c -- Open Firmware console for PUPA. */
/*
* PUPA -- Preliminary Universal Programming Architecture for GRUB
* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <pupa/machine/console.h>
#include <pupa/machine/ieee1275.h>
#include <pupa/term.h>
#include <pupa/types.h>
#include <pupa/misc.h>
static pupa_ieee1275_ihandle_t stdout_ihandle;
static pupa_ieee1275_ihandle_t stdin_ihandle;
static int pupa_curr_x;
static int pupa_curr_y;
static int pupa_keybuf;
static int pupa_buflen;
struct color
{
int red;
int green;
int blue;
};
#define MAX 0xff
static struct color colors[8] =
{
{ 0, 0, 0},
{ MAX, 0, 0},
{ 0, MAX, 0},
{ MAX, MAX, 0},
{ 0, 0, MAX},
{ MAX, 0, MAX},
{ 0, MAX, MAX},
{ MAX, MAX, MAX}
};
static int fgcolor = 7;
static int bgcolor = 0;
/* Write control characters to the console. */
static void
pupa_ofconsole_writeesc (const char *str)
{
while (*str)
{
char chr = *(str++);
pupa_ieee1275_write (stdout_ihandle, &chr, 1, 0);
}
}
static void
pupa_ofconsole_putchar (pupa_uint32_t c)
{
char chr = c;
if (c == '\n')
{
pupa_curr_y++;
pupa_curr_x = 0;
}
else
pupa_curr_x++;
pupa_ieee1275_write (stdout_ihandle, &chr, 1, 0);
}
static void
pupa_ofconsole_setcolorstate (pupa_term_color_state state)
{
char setcol[20];
int fg;
int bg;
switch (state)
{
case PUPA_TERM_COLOR_STANDARD:
case PUPA_TERM_COLOR_NORMAL:
fg = fgcolor;
bg = bgcolor;
break;
case PUPA_TERM_COLOR_HIGHLIGHT:
fg = bgcolor;
bg = fgcolor;
break;
default:
return;
}
pupa_sprintf (setcol, "\e[3%dm\e[4%dm", fg, bg);
pupa_ofconsole_writeesc (setcol);
}
static void
pupa_ofconsole_setcolor (pupa_uint8_t normal_color,
pupa_uint8_t highlight_color)
{
fgcolor = normal_color;
bgcolor = highlight_color;
}
static int
pupa_ofconsole_readkey (int *key)
{
char c;
int actual = 0;
pupa_ieee1275_read (stdin_ihandle, &c, 1, &actual);
if (actual && c == '\e')
{
pupa_ieee1275_read (stdin_ihandle, &c, 1, &actual);
if (! actual)
{
*key = '\e';
return 1;
}
if (c != 91)
return 0;
pupa_ieee1275_read (stdin_ihandle, &c, 1, &actual);
if (! actual)
return 0;
switch (c)
{
case 65:
/* Up: Ctrl-p. */
c = 16;
break;
case 66:
/* Down: Ctrl-n. */
c = 14;
break;
case 67:
/* Right: Ctrl-f. */
c = 6;
break;
case 68:
/* Left: Ctrl-b. */
c = 2;
break;
}
}
*key = c;
return actual;
}
static int
pupa_ofconsole_checkkey (void)
{
int key;
int read;
if (pupa_buflen)
return 1;
read = pupa_ofconsole_readkey (&key);
if (read)
{
pupa_keybuf = key;
pupa_buflen = 1;
return 1;
}
return 0;
}
static int
pupa_ofconsole_getkey (void)
{
int key;
if (pupa_buflen)
{
pupa_buflen =0;
return pupa_keybuf;
}
while (! pupa_ofconsole_readkey (&key));
return key;
}
static pupa_uint16_t
pupa_ofconsole_getxy (void)
{
return ((pupa_curr_x - 1) << 8) | pupa_curr_y;
}
static void
pupa_ofconsole_gotoxy (pupa_uint8_t x, pupa_uint8_t y)
{
char s[11]; /* 5 + 3 + 3. */
pupa_curr_x = x;
pupa_curr_y = y;
pupa_sprintf (s, "\e[%d;%dH", y - 1, x + 1);
pupa_ofconsole_writeesc (s);
}
static void
pupa_ofconsole_cls (void)
{
/* Clear the screen. */
pupa_ofconsole_writeesc (" ");
}
static void
pupa_ofconsole_setcursor (int on __attribute ((unused)))
{
/* XXX: Not supported. */
}
static void
pupa_ofconsole_refresh (void)
{
/* Do nothing, the current console state is ok. */
}
static pupa_err_t
pupa_ofconsole_init (void)
{
pupa_ieee1275_phandle_t chosen;
char data[4];
pupa_size_t actual;
int col;
if (pupa_ieee1275_finddevice ("/chosen", &chosen))
return pupa_error (PUPA_ERR_UNKNOWN_DEVICE, "Cannot find /chosen");
if (pupa_ieee1275_get_property (chosen, "stdout", data, sizeof data,
&actual)
|| actual != sizeof data)
return pupa_error (PUPA_ERR_UNKNOWN_DEVICE, "Cannot find stdout");
stdout_ihandle = pupa_ieee1275_decode_int_4 (data);
if (pupa_ieee1275_get_property (chosen, "stdin", data, sizeof data,
&actual)
|| actual != sizeof data)
return pupa_error (PUPA_ERR_UNKNOWN_DEVICE, "Cannot find stdin");
stdin_ihandle = pupa_ieee1275_decode_int_4 (data);
/* Initialize colors. */
for (col = 0; col < 7; col++)
pupa_ieee1275_set_color (stdout_ihandle, col, colors[col].red,
colors[col].green, colors[col].blue);
/* Set the right fg and bg colors. */
pupa_ofconsole_setcolorstate (PUPA_TERM_COLOR_NORMAL);
return 0;
}
static pupa_err_t
pupa_ofconsole_fini (void)
{
return 0;
}
static struct pupa_term pupa_ofconsole_term =
{
.name = "ofconsole",
.init = pupa_ofconsole_init,
.fini = pupa_ofconsole_fini,
.putchar = pupa_ofconsole_putchar,
.checkkey = pupa_ofconsole_checkkey,
.getkey = pupa_ofconsole_getkey,
.getxy = pupa_ofconsole_getxy,
.gotoxy = pupa_ofconsole_gotoxy,
.cls = pupa_ofconsole_cls,
.setcolorstate = pupa_ofconsole_setcolorstate,
.setcolor = pupa_ofconsole_setcolor,
.setcursor = pupa_ofconsole_setcursor,
.refresh = pupa_ofconsole_refresh,
.flags = 0,
.next = 0
};
void
pupa_console_init (void)
{
pupa_term_register (&pupa_ofconsole_term);
pupa_term_set_current (&pupa_ofconsole_term);
}