grub-devel
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]