diff --git a/ChangeLog b/ChangeLog index e9fc249ec..6174e458d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,41 @@ +2004-03-29 Marco Gerards + + 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 * Makefile.in: Update copyright. diff --git a/boot/powerpc/ieee1275/cmain.c b/boot/powerpc/ieee1275/cmain.c new file mode 100644 index 000000000..7682a2959 --- /dev/null +++ b/boot/powerpc/ieee1275/cmain.c @@ -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 +#include + +#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. */ +} diff --git a/boot/powerpc/ieee1275/crt0.S b/boot/powerpc/ieee1275/crt0.S new file mode 100644 index 000000000..04a9cf5c4 --- /dev/null +++ b/boot/powerpc/ieee1275/crt0.S @@ -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: + diff --git a/boot/powerpc/ieee1275/ieee1275.c b/boot/powerpc/ieee1275/ieee1275.c new file mode 100644 index 000000000..7f1e5edb3 --- /dev/null +++ b/boot/powerpc/ieee1275/ieee1275.c @@ -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 + + +#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; +} diff --git a/conf/powerpc-ieee1275.mk b/conf/powerpc-ieee1275.mk new file mode 100644 index 000000000..65883b094 --- /dev/null +++ b/conf/powerpc-ieee1275.mk @@ -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) diff --git a/conf/powerpc-ieee1275.rmk b/conf/powerpc-ieee1275.rmk new file mode 100644 index 000000000..ac63dec38 --- /dev/null +++ b/conf/powerpc-ieee1275.rmk @@ -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. diff --git a/configure b/configure index 066307dd7..49c04d411 100644 --- a/configure +++ b/configure @@ -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" diff --git a/configure.ac b/configure.ac index 72c4155d2..f31aefa61 100644 --- a/configure.ac +++ b/configure.ac @@ -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" diff --git a/disk/powerpc/ieee1275/ofdisk.c b/disk/powerpc/ieee1275/ofdisk.c new file mode 100644 index 000000000..a43bd0d51 --- /dev/null +++ b/disk/powerpc/ieee1275/ofdisk.c @@ -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 +#include +#include +#include + +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); +} diff --git a/disk/powerpc/ieee1275/partition.c b/disk/powerpc/ieee1275/partition.c new file mode 100644 index 000000000..4d4b4b412 --- /dev/null +++ b/disk/powerpc/ieee1275/partition.c @@ -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 +#include +#include +#include + +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; +} diff --git a/genmk.rb b/genmk.rb index 709409c07..2be1f81af 100644 --- a/genmk.rb +++ b/genmk.rb @@ -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(' '); diff --git a/include/grub/powerpc/ieee1275/biosdisk.h b/include/grub/powerpc/ieee1275/biosdisk.h new file mode 100644 index 000000000..07cc54210 --- /dev/null +++ b/include/grub/powerpc/ieee1275/biosdisk.h @@ -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 */ diff --git a/include/grub/powerpc/ieee1275/console.h b/include/grub/powerpc/ieee1275/console.h new file mode 100644 index 000000000..4621acb40 --- /dev/null +++ b/include/grub/powerpc/ieee1275/console.h @@ -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 +#include + +/* 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 */ diff --git a/include/grub/powerpc/ieee1275/ieee1275.h b/include/grub/powerpc/ieee1275/ieee1275.h new file mode 100644 index 000000000..fb89cf34b --- /dev/null +++ b/include/grub/powerpc/ieee1275/ieee1275.h @@ -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 +#include +#include + +/* 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 */ diff --git a/include/grub/powerpc/ieee1275/loader.h b/include/grub/powerpc/ieee1275/loader.h new file mode 100644 index 000000000..53c0268d4 --- /dev/null +++ b/include/grub/powerpc/ieee1275/loader.h @@ -0,0 +1,51 @@ +/* + * PUPA -- Preliminary Universal Programming Architecture for GRUB + * Copyright (C) 2002 Yoshinori K. Okuji + * Copyright (C) 2003 Jeroen Dekkers + * + * 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 +#include +#include + +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 */ diff --git a/include/grub/powerpc/ieee1275/multiboot.h b/include/grub/powerpc/ieee1275/multiboot.h new file mode 100644 index 000000000..5ad03fef5 --- /dev/null +++ b/include/grub/powerpc/ieee1275/multiboot.h @@ -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 + +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 */ diff --git a/include/grub/powerpc/ieee1275/partition.h b/include/grub/powerpc/ieee1275/partition.h new file mode 100644 index 000000000..781763ff1 --- /dev/null +++ b/include/grub/powerpc/ieee1275/partition.h @@ -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 +#include +#include + +#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 */ diff --git a/include/grub/powerpc/ieee1275/time.h b/include/grub/powerpc/ieee1275/time.h new file mode 100644 index 000000000..435a49f17 --- /dev/null +++ b/include/grub/powerpc/ieee1275/time.h @@ -0,0 +1,33 @@ +/* + * PUPA -- Preliminary Universal Programming Architecture for GRUB + * Copyright (C) 2003 Marco Gerards + * + * 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 +# 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 */ diff --git a/include/grub/powerpc/ieee1275/util/biosdisk.h b/include/grub/powerpc/ieee1275/util/biosdisk.h new file mode 100644 index 000000000..49627a894 --- /dev/null +++ b/include/grub/powerpc/ieee1275/util/biosdisk.h @@ -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 */ diff --git a/include/grub/powerpc/setjmp.h b/include/grub/powerpc/setjmp.h new file mode 100644 index 000000000..05dfc098f --- /dev/null +++ b/include/grub/powerpc/setjmp.h @@ -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 */ diff --git a/include/grub/powerpc/types.h b/include/grub/powerpc/types.h new file mode 100644 index 000000000..bc3e24995 --- /dev/null +++ b/include/grub/powerpc/types.h @@ -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 */ diff --git a/kern/powerpc/ieee1275/init.c b/kern/powerpc/ieee1275/init.c new file mode 100644 index 000000000..16286a7b6 --- /dev/null +++ b/kern/powerpc/ieee1275/init.c @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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))) +{ +} diff --git a/kern/powerpc/ieee1275/openfw.c b/kern/powerpc/ieee1275/openfw.c new file mode 100644 index 000000000..89dd5c642 --- /dev/null +++ b/kern/powerpc/ieee1275/openfw.c @@ -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 +#include +#include +#include + +/* 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; +} diff --git a/normal/cmdline.c b/normal/cmdline.c index 9491517ee..894f11963 100644 --- a/normal/cmdline.c +++ b/normal/cmdline.c @@ -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) { diff --git a/term/powerpc/ieee1275/ofconsole.c b/term/powerpc/ieee1275/ofconsole.c new file mode 100644 index 000000000..786e7e27c --- /dev/null +++ b/term/powerpc/ieee1275/ofconsole.c @@ -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 +#include +#include +#include +#include + +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); +}