[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: GRUB on OLPC / XO
From: |
Marco Gerards |
Subject: |
Re: GRUB on OLPC / XO |
Date: |
Tue, 15 Jan 2008 12:31:30 +0100 |
User-agent: |
Gnus/5.110006 (No Gnus v0.6) Emacs/21.4 (gnu/linux) |
Robert Millan <address@hidden> 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