Robert Millan <[EMAIL PROTECTED]> writes: Hi,
> I've been working for a few hours in a GRUB port to i386/OFW. There's > quite a bit of things that need cleanup/fix before it can be considered > complete, but it's in a stage that boots and lets you do basic things (like > listing storage devices). OLPC is OF!? I didn't expect this :-). Who made the firmware? > It's known to work on OLPC / XO. I don't have a working unit myself, but > someone from #olpc was kind enough to test it and even provided a screenshot: > > http://kwzs.be/pic6/P1010018.JPG Nice :-) > I'll be gradually integrating this into official GRUB tree. In the meantime, > if you want to try it: > > - checkout GRUB cvs (grub2 module) > - apply attached patch > - ./autogen.sh && ./configure --with-platform=ieee1275 && make kernel.elf > Great! I'll just review the patch! :-) > <GPLv2> I know my rights; I want my phone call! > <DRM> What use is a phone call, if you are unable to speak? > (as seen on /.) > > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/conf/i386-ieee1275.rmk ./conf/i386-ieee1275.rmk > --- ../../grub2/conf/i386-ieee1275.rmk 1970-01-01 01:00:00.000000000 > +0100 > +++ ./conf/i386-ieee1275.rmk 2008-01-12 03:04:50.000000000 +0100 > @@ -0,0 +1,117 @@ > +# -*- makefile -*- > + > +COMMON_ASFLAGS = -m32 -nostdinc -fno-builtin > +COMMON_CFLAGS = -ffreestanding -mrtd -mregparm=3 > +COMMON_LDFLAGS = -nostdlib -static -lgcc Why mregparm? I don't think we need this for OF? Do you call assembler functions? > +# Images. > +pkglib_PROGRAMS = kernel.elf > + > +# For kernel.elf. > +kernel_elf_SOURCES = kern/i386/ieee1275/startup.S kern/i386/ieee1275/init.c \ > + kern/powerpc/ieee1275/init.c \ > + kern/powerpc/ieee1275/cmain.c kern/powerpc/ieee1275/openfw.c \ > + 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/i386/dl.c kern/parser.c kern/partition.c \ > + kern/env.c \ > + kern/ieee1275/ieee1275.c \ > + term/ieee1275/ofconsole.c disk/ieee1275/ofdisk.c \ > + symlist.c > +kernel_elf_HEADERS = arg.h cache.h device.h disk.h dl.h elf.h elfload.h \ > + env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \ > + partition.h pc_partition.h rescue.h symbol.h term.h time.h types.h \ > + ieee1275/ieee1275.h > +kernel_elf_CFLAGS = $(COMMON_CFLAGS) > +kernel_elf_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x100000,-Bstatic > + > +MOSTLYCLEANFILES += symlist.c kernel_syms.lst > +DEFSYMFILES += kernel_syms.lst > + > +symlist.c: $(addprefix include/grub/,$(kernel_elf_HEADERS)) config.h > gensymlist.sh > + /bin/sh gensymlist.sh $(filter %.h,$^) > $@ || (rm -f $@; exit 1) > + > +kernel_syms.lst: $(addprefix include/grub/,$(kernel_elf_HEADERS)) config.h > genkernsyms.sh > + /bin/sh genkernsyms.sh $(filter %.h,$^) > $@ || (rm -f $@; exit 1) > + > +# Utilities. > +bin_UTILITIES = grub-mkimage > +sbin_UTILITIES = grub-mkdevicemap grub-probe > +ifeq ($(enable_grub_emu), yes) > +sbin_UTILITIES += grub-emu > +endif > + > +# For grub-mkimage. > +grub_mkimage_SOURCES = util/elf/grub-mkimage.c util/misc.c \ > + util/resolve.c > +grub_mkimage_LDFLAGS = $(LIBLZO) > + > +# For grub-mkdevicemap. > +grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c > \ > + util/i386/get_disk_name.c > + > +# For grub-probe. > +util/grub-probe.c_DEPENDENCIES = grub_probe_init.h > +grub_probe_SOURCES = util/grub-probe.c \ > + util/biosdisk.c util/misc.c util/getroot.c \ > + kern/device.c kern/disk.c kern/err.c kern/misc.c fs/fat.c \ > + fs/ext2.c kern/parser.c kern/partition.c \ > + partmap/pc.c partmap/apple.c partmap/gpt.c \ > + fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c fs/ntfs.c fs/ntfscomp.c \ > + fs/xfs.c fs/affs.c fs/sfs.c fs/hfsplus.c \ > + kern/fs.c \ > + kern/env.c fs/fshelp.c \ > + disk/lvm.c disk/raid.c grub_probe_init.c > + > +# For grub-emu. > +grub_emu_DEPENDENCIES = grub_script.tab.c grub_script.tab.h \ > + grub_emu_init.h > +grub_emu_SOURCES = commands/boot.c commands/cat.c commands/cmp.c \ > + commands/configfile.c commands/echo.c commands/help.c \ > + commands/terminal.c commands/ls.c commands/test.c \ > + commands/search.c commands/blocklist.c commands/hexdump.c \ > + commands/i386/pc/halt.c commands/i386/pc/reboot.c \ > + commands/i386/cpuid.c \ > + disk/host.c disk/loopback.c disk/raid.c disk/lvm.c \ > + fs/affs.c fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c \ > + fs/jfs.c fs/minix.c fs/sfs.c fs/ufs.c fs/xfs.c fs/hfsplus.c \ > + fs/ntfs.c fs/ntfscomp.c fs/cpio.c \ > + io/gzio.c \ > + kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c \ > + kern/err.c \ > + normal/execute.c kern/file.c kern/fs.c normal/lexer.c \ > + kern/loader.c kern/main.c kern/misc.c kern/parser.c \ > + grub_script.tab.c kern/partition.c kern/rescue.c kern/term.c \ > + normal/arg.c normal/cmdline.c normal/command.c normal/function.c\ > + normal/completion.c normal/main.c \ > + normal/menu.c normal/menu_entry.c normal/misc.c normal/script.c \ > + normal/color.c \ > + partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ > + partmap/acorn.c partmap/gpt.c \ > + util/console.c util/hostfs.c util/grub-emu.c util/misc.c \ > + util/biosdisk.c util/getroot.c \ > + util/i386/pc/misc.c grub_emu_init.c > + > +grub_emu_LDFLAGS = $(LIBCURSES) > + > +# Modules. > +pkglib_MODULES = normal.mod cpuid.mod > + > +# For normal.mod. > +normal_mod_DEPENDENCIES = grub_script.tab.c grub_script.tab.h > +normal_mod_SOURCES = normal/arg.c normal/cmdline.c normal/command.c \ > + normal/completion.c normal/execute.c \ > + normal/function.c normal/lexer.c normal/main.c normal/menu.c \ > + normal/menu_entry.c normal/misc.c grub_script.tab.c \ > + normal/script.c normal/i386/setjmp.S normal/color.c > +normal_mod_CFLAGS = $(COMMON_CFLAGS) > +normal_mod_ASFLAGS = $(COMMON_ASFLAGS) > +normal_mod_LDFLAGS = $(COMMON_LDFLAGS) > + > +# For cpuid.mod. > +cpuid_mod_SOURCES = commands/i386/cpuid.c > +cpuid_mod_CFLAGS = $(COMMON_CFLAGS) > +cpuid_mod_LDFLAGS = $(COMMON_LDFLAGS) > + > +include $(srcdir)/conf/common.mk > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/configure.ac ./configure.ac > --- ../../grub2/configure.ac 2007-12-25 10:09:42.000000000 +0100 > +++ ./configure.ac 2008-01-12 03:27:24.000000000 +0100 > @@ -1,6 +1,6 @@ > # Process this file with autoconf to produce a configure script. > > -# Copyright (C) 2002,2003,2004,2005,2006,2007 Free Software Foundation, Inc. > +# Copyright (C) 2002,2003,2004,2005,2006,2007,2008 Free Software > Foundation, Inc. > # > # This configure.ac is free software; the author > # gives unlimited permission to copy and/or distribute it, > @@ -79,6 +79,7 @@ case "$target_cpu"-"$platform" in > i386-efi) ;; > i386-pc) ;; > i386-linuxbios) ;; > + i386-ieee1275) ;; > powerpc-ieee1275) ;; > sparc64-ieee1275) ;; > *) AC_MSG_ERROR([unsupported machine type]) ;; > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/include/grub/i386/ieee1275/console.h > ./include/grub/i386/ieee1275/console.h > --- ../../grub2/include/grub/i386/ieee1275/console.h 1970-01-01 > 01:00:00.000000000 +0100 > +++ ./include/grub/i386/ieee1275/console.h 2008-01-12 00:00:56.000000000 > +0100 > @@ -0,0 +1 @@ > +#include <grub/powerpc/ieee1275/console.h> > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/include/grub/i386/ieee1275/ieee1275.h > ./include/grub/i386/ieee1275/ieee1275.h > --- ../../grub2/include/grub/i386/ieee1275/ieee1275.h 1970-01-01 > 01:00:00.000000000 +0100 > +++ ./include/grub/i386/ieee1275/ieee1275.h 2008-01-12 00:01:36.000000000 > +0100 > @@ -0,0 +1 @@ > +#include <grub/powerpc/ieee1275/ieee1275.h> > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/include/grub/i386/ieee1275/kernel.h > ./include/grub/i386/ieee1275/kernel.h > --- ../../grub2/include/grub/i386/ieee1275/kernel.h 1970-01-01 > 01:00:00.000000000 +0100 > +++ ./include/grub/i386/ieee1275/kernel.h 2008-01-12 00:01:13.000000000 > +0100 > @@ -0,0 +1 @@ > +#include <grub/powerpc/ieee1275/kernel.h> > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/include/grub/i386/ieee1275/time.h > ./include/grub/i386/ieee1275/time.h > --- ../../grub2/include/grub/i386/ieee1275/time.h 1970-01-01 > 01:00:00.000000000 +0100 > +++ ./include/grub/i386/ieee1275/time.h 2008-01-11 23:59:29.000000000 > +0100 > @@ -0,0 +1 @@ > +#include <grub/powerpc/ieee1275/time.h> > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/kern/i386/ieee1275/init.c ./kern/i386/ieee1275/init.c > --- ../../grub2/kern/i386/ieee1275/init.c 1970-01-01 01:00:00.000000000 > +0100 > +++ ./kern/i386/ieee1275/init.c 2008-01-12 03:26:35.000000000 +0100 > @@ -0,0 +1,35 @@ > +/* init.c -- Initialize GRUB on Open Firmware. */ > +/* > + * GRUB -- GRand Unified Bootloader > + * Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc. > + * > + * GRUB 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 3 of the License, or > + * (at your option) any later version. > + * > + * GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#include <grub/types.h> > + > +void > +grub_exit (void) > +{ > + /* Trap to Open Firmware. */ > + /* FIXME. */ > + > + for (;;); > +} > + > +void > +grub_arch_sync_caches (void *address __attribute__ ((unused)), > + grub_size_t len __attribute__ ((unused))) > +{ > +} > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/kern/i386/ieee1275/startup.S ./kern/i386/ieee1275/startup.S > --- ../../grub2/kern/i386/ieee1275/startup.S 1970-01-01 01:00:00.000000000 > +0100 > +++ ./kern/i386/ieee1275/startup.S 2008-01-12 03:27:13.000000000 +0100 > @@ -0,0 +1,38 @@ > +/* > + * GRUB -- GRand Unified Bootloader > + * Copyright (C) 1999,2000,2001,2002,2003,2005,2006,2007,2008 Free Software > Foundation, Inc. > + * > + * GRUB 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 3 of the License, or > + * (at your option) any later version. > + * > + * GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>. > + */ > + > +#define ASM_FILE 1 > + > +#include <grub/symbol.h> > + > +/* > + * Note: GRUB is compiled with the options -mrtd and -mregparm=3. > + * So the first three arguments are passed in %eax, %edx, and %ecx, > + * respectively, and if a function has a fixed number of arguments > + * and the number if greater than three, the function must return > + * with "ret $N" where N is ((the number of arguments) - 3) * 4. > + */ > + > + .file "startup.S" > + .text > + .globl start, _start > + > +start: > +_start: > + movl %eax, EXT_C(grub_ieee1275_entry_fn) > + jmp EXT_C(cmain) > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/kern/main.c ./kern/main.c > --- ../../grub2/kern/main.c 2008-01-05 13:04:35.000000000 +0100 > +++ ./kern/main.c 2008-01-12 03:03:04.000000000 +0100 > @@ -120,7 +120,7 @@ grub_main (void) > > /* Load pre-loaded modules and free the space. */ > grub_register_exported_symbols (); > - grub_load_modules (); > +// grub_load_modules (); Why? > > /* It is better to set the root device as soon as possible, > for convenience. */ > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/kern/powerpc/ieee1275/cmain.c ./kern/powerpc/ieee1275/cmain.c > --- ../../grub2/kern/powerpc/ieee1275/cmain.c 2007-12-30 09:52:05.000000000 > +0100 > +++ ./kern/powerpc/ieee1275/cmain.c 2008-01-12 03:12:01.000000000 +0100 > @@ -58,7 +58,7 @@ grub_ieee1275_find_options (void) > grub_ieee1275_finddevice ("/options", &options); > rc = grub_ieee1275_get_property (options, "real-mode?", &realmode, > sizeof realmode, 0); > - if ((rc >= 0) && realmode) > +// if ((rc >= 0) && realmode) > grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_REAL_MODE); Ehm? > > grub_ieee1275_finddevice ("/openprom", &openprom); > @@ -102,12 +102,9 @@ grub_ieee1275_find_options (void) > } > } > > -void cmain (uint32_t r3, uint32_t r4, uint32_t r5); > void > -cmain (UNUSED uint32_t r3, UNUSED uint32_t r4, uint32_t r5) > +cmain (void) > { > - grub_ieee1275_entry_fn = (int (*)(void *)) r5; > - > grub_ieee1275_finddevice ("/chosen", &grub_ieee1275_chosen); > > grub_ieee1275_find_options (); > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/kern/powerpc/ieee1275/init.c ./kern/powerpc/ieee1275/init.c > --- ../../grub2/kern/powerpc/ieee1275/init.c 2008-01-03 23:43:46.000000000 > +0100 > +++ ./kern/powerpc/ieee1275/init.c 2008-01-12 03:26:06.000000000 +0100 > @@ -52,15 +52,6 @@ grub_millisleep (grub_uint32_t ms) > grub_millisleep_generic (ms); > } > > -void > -grub_exit (void) > -{ > - /* Trap to Open Firmware. */ > - asm ("trap"); > - > - for (;;); > -} > - > /* Translate an OF filesystem path (separated by backslashes), into a GRUB > path (separated by forward slashes). */ > static void > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/kern/powerpc/ieee1275/openfw.c ./kern/powerpc/ieee1275/openfw.c > --- ../../grub2/kern/powerpc/ieee1275/openfw.c 2007-12-30 > 09:52:05.000000000 +0100 > +++ ./kern/powerpc/ieee1275/openfw.c 2008-01-12 02:53:01.000000000 +0100 > @@ -163,18 +163,18 @@ grub_err_t grub_available_iterate (int ( > > /* Decode each entry and call `hook'. */ > i = 0; > - while (i < sizeof (available)) > + while (i < sizeof (available) && available[i]) > { > grub_uint64_t address; > grub_uint64_t size; > > - address = available[i++]; > + address = grub_be_to_cpu32 (available[i++]); Why do you do this? Isn't this information available in native byte order? > if (address_cells == 2) > - address = (address << 32) | available[i++]; > + address = (address << 32) | grub_be_to_cpu32 (available[i++]); > > - size = available[i++]; > + size = grub_be_to_cpu32 (available[i++]); > if (size_cells == 2) > - size = (size << 32) | available[i++]; > + size = (size << 32) | grub_be_to_cpu32 (available[i++]); > > if (hook (address, size)) > break; > diff -x '*.mk' -x '*~' -x CVS -x .svn -x configure -x config.h.in -Nurp > ../../grub2/term/ieee1275/ofconsole.c ./term/ieee1275/ofconsole.c > --- ../../grub2/term/ieee1275/ofconsole.c 2007-12-25 12:10:47.000000000 > +0100 > +++ ./term/ieee1275/ofconsole.c 2008-01-12 03:09:02.000000000 +0100 > @@ -369,9 +369,6 @@ static struct grub_term grub_ofconsole_t > .getwh = grub_ofconsole_getwh, > .gotoxy = grub_ofconsole_gotoxy, > .cls = grub_ofconsole_cls, > - .setcolorstate = grub_ofconsole_setcolorstate, > - .setcolor = grub_ofconsole_setcolor, > - .getcolor = grub_ofconsole_getcolor, Why do you do this? -- Marco _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel