grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[patch] PPC cleanups


From: Hollis Blanchard
Subject: [patch] PPC cleanups
Date: Thu, 21 Apr 2005 22:51:22 -0500
User-agent: Mutt/1.5.6+20040907i

This patch has a lot of long-overdue PPC cleanups, including build
warnings. Since we all know the Changelog doesn't explain enough about a
patch, a quick overview:
- include/grub/powerpc/ieee1275/init.h was useless.
- roundup() was unused.
- rather than everyone accessing grub_ieee1275_flags directly, it's now
  static and provides test/set accessors.
- grub_ieee1275_realmode should have always been a flag instead of a
  global; I don't know what I was thinking at the time.
- ofdisk.h is a now real header (like biosdisk.h); no more
  grub_ofdisk_fini/grub_ofdisk_init "missing prototype" warnings.

Important new functionality:
- actually boot a Linux kernel successfully (don't prematurely free memory)
- properly handle partition numbering on briQ and Pegasos

I have boot-tested this patch on briQ and G3, and would like to check it
in soon.

I also have my sights on include/grub/powerpc/ieee1275/biosdisk.h. Any
suggestions on how to handle using util/i386/pc/biosdisk.c on PPC for
grub-emu?

-Hollis

2005-04-21  Hollis Blanchard  <address@hidden>

        * boot/powerpc/ieee1275/cmain.c: Don't include grub/machine/init.h.
        (roundup): Remove macro.
        (grub_ieee1275_flags): Make static.
        (grub_ieee1275_realmode): Remove.
        (grub_ieee1275_test_flag): New function.
        (grub_ieee1275_set_flag): Likewise.
        (find_options): Rename to `grub_ieee1275_find_options'; update
        callers. Set GRUB_IEEE1275_REAL_MODE and
        GRUB_IEEE1275_0_BASED_PARTITIONS.
        (cmain): New prototype.
        (cmain): Use `grub_ieee1275_set_flag' instead of accessing
        `grub_ieee1275_flags' directly.
        * conf/powerpc-ieee1275.rmk (grubof_HEADERS): Remove
        machine/biosdisk.h.
        * disk/powerpc/ieee1275/ofdisk.c: Include grub/machine/ofdisk.h. Don't
        include grub/machine/init.h.
        (grub_ofdisk_open): Call `grub_ieee1275_test_flag'.
        * include/grub/powerpc/ieee1275/ieee1275.h (grub_ieee1275_flags):
        Remove prototype.
        (grub_ieee1275_realmode): Likewise.
        (grub_ieee1275_flag): New enum.
        (grub_ieee1275_test_flag): New prototype.
        (grub_ieee1275_set_flag): New prototype.
        * include/grub/powerpc/ieee1275/init.h: Remove file.
        * include/grub/powerpc/ieee1275/ofdisk.h: New file.
        * kern/powerpc/ieee1275/init.c: Don't include grub/machine/init.h.
        Include grub/machine/console.h. Include grub/machine/ofdisk.h.
        (abort): Correct whitespace.
        (grub_machine_fini): Don't call `grub_ieee1275_release'. Remove
        comment.
        * kern/powerpc/ieee1275/openfw.c (grub_claimmap): Call
        `grub_ieee1275_test_flag'.
        (grub_ieee1275_encode_devname): Likewise.

Index: boot/powerpc/ieee1275/cmain.c
===================================================================
RCS file: /cvsroot/grub/grub2/boot/powerpc/ieee1275/cmain.c,v
retrieving revision 1.6
diff -u -p -r1.6 cmain.c
--- boot/powerpc/ieee1275/cmain.c       3 Jan 2005 17:44:25 -0000       1.6
+++ boot/powerpc/ieee1275/cmain.c       22 Apr 2005 03:44:22 -0000
@@ -23,7 +23,6 @@
 
 #include <grub/machine/ieee1275.h>
 #include <grub/kernel.h>
-#include <grub/machine/init.h>
 
 struct module_info
 {
@@ -31,26 +30,47 @@ struct module_info
   uint32_t end;
 };
 
-#define roundup(a, s) (((a) + ((s) - 1)) & ~((s) - 1))
-
 /* OpenFirmware entry point passed to us from the real bootloader.  */
 intptr_t (*grub_ieee1275_entry_fn) (void *);
 
-grub_uint32_t grub_ieee1275_flags;
-int grub_ieee1275_realmode;
+static grub_uint32_t grub_ieee1275_flags;
 
 
 
+int
+grub_ieee1275_test_flag (enum grub_ieee1275_flag flag)
+{
+  return (grub_ieee1275_flags & (1 << flag));
+}
+
+void
+grub_ieee1275_set_flag (enum grub_ieee1275_flag flag)
+{
+  grub_ieee1275_flags |= (1 << flag);
+}
+
 static void
-find_options (void)
+grub_ieee1275_find_options (void)
 {
   grub_ieee1275_phandle_t options;
+  grub_ieee1275_phandle_t openprom;
+  int realmode;
+  int smartfw;
 
   grub_ieee1275_finddevice ("/options", &options);
-  grub_ieee1275_get_property (options, "real-mode?", &grub_ieee1275_realmode,
-                             sizeof (grub_ieee1275_realmode), 0);
+  grub_ieee1275_get_property (options, "real-mode?", &realmode,
+                             sizeof (realmode), 0);
+  if (realmode)
+    grub_ieee1275_set_flag (GRUB_IEEE1275_REAL_MODE);
+
+  grub_ieee1275_finddevice ("/openprom", &openprom);
+  smartfw = grub_ieee1275_get_property (openprom, "SmartFirmware-version",
+                              0, 0, 0);
+  if (smartfw)
+    grub_ieee1275_set_flag (GRUB_IEEE1275_0_BASED_PARTITIONS);
 }
 
+void cmain (uint32_t r3, uint32_t r4, uint32_t r5);
 /* Setup the argument vector and pass control over to the main
    function.  */
 void
@@ -68,7 +88,7 @@ cmain (uint32_t r3, uint32_t r4 __attrib
 
       grub_ieee1275_entry_fn = (intptr_t (*)(void *)) r3;
 
-      grub_ieee1275_flags = GRUB_IEEE1275_NO_PARTITION_0;
+      grub_ieee1275_set_flag (GRUB_IEEE1275_NO_PARTITION_0);
 
       /* Old World Open Firmware may use 4M-5M without claiming it.  */
       grub_ieee1275_claim (0x00400000, 0x00100000, 0, 0);
@@ -84,7 +104,7 @@ cmain (uint32_t r3, uint32_t r4 __attrib
       grub_ieee1275_entry_fn = (intptr_t (*)(void *)) r5;
     }
 
-  find_options ();
+  grub_ieee1275_find_options ();
 
   /* If any argument was passed to the kernel (us), they are
      put in the bootargs property of /chosen.  The string can
Index: conf/powerpc-ieee1275.rmk
===================================================================
RCS file: /cvsroot/grub/grub2/conf/powerpc-ieee1275.rmk,v
retrieving revision 1.29
diff -u -p -r1.29 powerpc-ieee1275.rmk
--- conf/powerpc-ieee1275.rmk   26 Mar 2005 17:34:50 -0000      1.29
+++ conf/powerpc-ieee1275.rmk   22 Apr 2005 03:44:25 -0000
@@ -11,7 +11,7 @@ DEFSYMFILES += kernel_syms.lst
 
 grubof_HEADERS = arg.h boot.h device.h disk.h dl.h elf.h env.h err.h \
        file.h fs.h kernel.h misc.h mm.h net.h rescue.h symbol.h \
-       term.h types.h machine/biosdisk.h powerpc/libgcc.h loader.h \
+       term.h types.h powerpc/libgcc.h loader.h \
        partition.h pc_partition.h machine/time.h machine/ieee1275.h
 
 grubof_symlist.c: $(addprefix include/grub/,$(grubof_HEADERS)) gensymlist.sh
Index: disk/powerpc/ieee1275/ofdisk.c
===================================================================
RCS file: /cvsroot/grub/grub2/disk/powerpc/ieee1275/ofdisk.c,v
retrieving revision 1.8
diff -u -p -r1.8 ofdisk.c
--- disk/powerpc/ieee1275/ofdisk.c      26 Mar 2005 17:34:50 -0000      1.8
+++ disk/powerpc/ieee1275/ofdisk.c      22 Apr 2005 03:44:25 -0000
@@ -22,7 +22,7 @@
 #include <grub/disk.h>
 #include <grub/mm.h>
 #include <grub/machine/ieee1275.h>
-#include <grub/machine/init.h>
+#include <grub/machine/ofdisk.h>
 
 static int
 grub_ofdisk_iterate (int (*hook) (const char *name))
@@ -60,7 +60,7 @@ grub_ofdisk_open (const char *name, grub
     return grub_errno;
 
   /* To access the complete disk add `:0'.  */
-  if (! (grub_ieee1275_flags & GRUB_IEEE1275_NO_PARTITION_0))
+  if (! grub_ieee1275_test_flag (GRUB_IEEE1275_NO_PARTITION_0))
     grub_strcat (devpath, ":0");
 
   grub_ieee1275_open (devpath, &dev_ihandle);
Index: include/grub/powerpc/ieee1275/ieee1275.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/powerpc/ieee1275/ieee1275.h,v
retrieving revision 1.16
diff -u -p -r1.16 ieee1275.h
--- include/grub/powerpc/ieee1275/ieee1275.h    22 Apr 2005 02:32:37 -0000      
1.16
+++ include/grub/powerpc/ieee1275/ieee1275.h    22 Apr 2005 03:44:25 -0000
@@ -65,11 +65,24 @@ typedef intptr_t grub_ieee1275_ihandle_t
 typedef intptr_t grub_ieee1275_phandle_t;
 
 extern intptr_t (*grub_ieee1275_entry_fn) (void *);
-extern grub_uint32_t grub_ieee1275_flags;
-extern int grub_ieee1275_realmode;
 
-/* Old World firmware fails seek when "dev:0" is opened.  */
-#define GRUB_IEEE1275_NO_PARTITION_0 0x1
+enum grub_ieee1275_flag
+{
+  /* Old World firmware fails seek when "dev:0" is opened.  */
+  GRUB_IEEE1275_NO_PARTITION_0,
+
+  /* Apple firmware runs in translated mode and requires use of the "map"
+     method.  Other firmware runs in untranslated mode and doesn't like "map"
+     calls.  */
+  GRUB_IEEE1275_REAL_MODE,
+
+  /* CHRP specifies partitions are numbered from 1 (partition 0 refers to the
+     whole disk). However, CodeGen firmware numbers partitions from 0.  */
+  GRUB_IEEE1275_0_BASED_PARTITIONS,
+};
+
+extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
+extern void EXPORT_FUNC(grub_ieee1275_set_flag) (enum grub_ieee1275_flag flag);
 
 
 
Index: include/grub/powerpc/ieee1275/init.h
===================================================================
RCS file: include/grub/powerpc/ieee1275/init.h
diff -N include/grub/powerpc/ieee1275/init.h
--- include/grub/powerpc/ieee1275/init.h        26 Mar 2005 17:34:50 -0000      
1.2
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,27 +0,0 @@
-/*
- *  GRUB  --  GRand Unified Bootloader
- *  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.
- */
-
-#ifndef GRUB_INIT_MACHINE_HEADER
-#define GRUB_INIT_MACHINE_HEADER       1
-
-void cmain (uint32_t r3, uint32_t r4, uint32_t r5);
-void grub_ofdisk_init (void);
-void grub_console_init (void);
-
-#endif /* ! GRUB_INIT_MACHINE_HEADER */
Index: include/grub/powerpc/ieee1275/ofdisk.h
===================================================================
RCS file: include/grub/powerpc/ieee1275/ofdisk.h
diff -N include/grub/powerpc/ieee1275/ofdisk.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ include/grub/powerpc/ieee1275/ofdisk.h      22 Apr 2005 03:44:25 -0000
@@ -0,0 +1,26 @@
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2005  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 GRUB_OFDISK_MACHINE_HEADER
+#define GRUB_OFDISK_MACHINE_HEADER     1
+
+extern void grub_ofdisk_init (void);
+extern void grub_ofdisk_fini (void);
+
+#endif /* ! GRUB_INIT_MACHINE_HEADER */
Index: kern/powerpc/ieee1275/init.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/powerpc/ieee1275/init.c,v
retrieving revision 1.16
diff -u -p -r1.16 init.c
--- kern/powerpc/ieee1275/init.c        22 Apr 2005 02:32:37 -0000      1.16
+++ kern/powerpc/ieee1275/init.c        22 Apr 2005 03:44:25 -0000
@@ -29,9 +29,10 @@
 #include <grub/setjmp.h>
 #include <grub/env.h>
 #include <grub/misc.h>
-#include <grub/machine/init.h>
 #include <grub/machine/time.h>
 #include <grub/machine/kernel.h>
+#include <grub/machine/console.h>
+#include <grub/machine/ofdisk.h>
 
 /* Apple OF 1.0.5 reserves 0x0 to 0x4000 for the exception handlers.  */
 static const grub_addr_t grub_heap_start = 0x4000;
@@ -42,7 +43,7 @@ abort (void)
 {
   /* Trap to Open Firmware.  */
   asm ("trap");
-  
+
   for (;;);
 }
 
@@ -138,9 +139,6 @@ grub_machine_fini (void)
 {
   grub_ofdisk_fini ();
   grub_console_fini ();
-
-  grub_ieee1275_release (grub_heap_start, grub_heap_len);
-  /* XXX Release memory claimed for Old World firmware.  */
 }
 
 void
Index: kern/powerpc/ieee1275/openfw.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/powerpc/ieee1275/openfw.c,v
retrieving revision 1.9
diff -u -p -r1.9 openfw.c
--- kern/powerpc/ieee1275/openfw.c      22 Apr 2005 02:32:37 -0000      1.9
+++ kern/powerpc/ieee1275/openfw.c      22 Apr 2005 03:44:25 -0000
@@ -196,7 +196,8 @@ grub_claimmap (grub_addr_t addr, grub_si
   if (grub_ieee1275_claim (addr, size, 0, 0))
     return -1;
 
-  if ((! grub_ieee1275_realmode) && grub_map (addr, addr, size, 0x00))
+  if (! grub_ieee1275_test_flag (GRUB_IEEE1275_REAL_MODE)
+      && grub_map (addr, addr, size, 0x00))
     {
       grub_printf ("map failed: address 0x%x, size 0x%x\n", addr, size);
       grub_ieee1275_release (addr, size);
@@ -338,7 +339,10 @@ grub_ieee1275_encode_devname (const char
   if (partition)
     {
       unsigned int partno = grub_strtoul (partition, 0, 0);
-      partno--; /* GRUB partition numbering is 0-based.  */
+
+      /* GRUB partition numbering is 0-based.  */
+      if (! grub_ieee1275_test_flag (GRUB_IEEE1275_0_BASED_PARTITIONS))
+       partno--;
 
       /* Assume partno will require less than five bytes to encode.  */
       encoding = grub_malloc (grub_strlen (device) + 3 + 5);




reply via email to

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