grub-devel
[Top][All Lists]
Advanced

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

[PATCH]: grub: Add revamped kernel startup code for sparc64.


From: David Miller
Subject: [PATCH]: grub: Add revamped kernel startup code for sparc64.
Date: Mon, 13 Apr 2009 00:02:58 -0700 (PDT)

I've commited these changes.

2009-04-12 David S. Miller <address@hidden>

        * kern/sparc64/ieee1275/init.c: Delete, replace with...
        * kern/sparc64/ieee1275/crt0.S: assembler implementation.
        * include/grub/sparc64/ieee1275/kernel.h: Declare grub_prefix[].
        (GRUB_MOD_ALIGN, GRUB_MOD_GAP, GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE,
        GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE,
        GRUB_KERNEL_MACHINE_COMPRESSED_SIZE, GRUB_KERNEL_MACHINE_PREFIX,
        GRUB_KERNEL_MACHINE_DATA_END): Define.
        (grub_kernel_image_size, grub_total_module_size): Declare.
---
 include/grub/sparc64/ieee1275/kernel.h |   38 +++++-
 kern/sparc64/ieee1275/crt0.S           |   77 ++++++++++
 kern/sparc64/ieee1275/init.c           |  237 --------------------------------
 3 files changed, 112 insertions(+), 240 deletions(-)
 create mode 100644 kern/sparc64/ieee1275/crt0.S
 delete mode 100644 kern/sparc64/ieee1275/init.c

diff --git a/include/grub/sparc64/ieee1275/kernel.h 
b/include/grub/sparc64/ieee1275/kernel.h
index 0b6bce2..03a6314 100644
--- a/include/grub/sparc64/ieee1275/kernel.h
+++ b/include/grub/sparc64/ieee1275/kernel.h
@@ -1,6 +1,6 @@
 /*
  *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2005,2007  Free Software Foundation, Inc.
+ *  Copyright (C) 2005,2007,2009  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
@@ -19,12 +19,44 @@
 #ifndef GRUB_KERNEL_MACHINE_HEADER
 #define GRUB_KERNEL_MACHINE_HEADER     1
 
+#define GRUB_MOD_ALIGN 0x2000
+
+/* Non-zero value is only needed for PowerMacs.  */
+#define GRUB_MOD_GAP 0x0
+
+/* The offset of GRUB_TOTAL_MODULE_SIZE.  */
+#define GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE  0x8
+
+/* The offset of GRUB_KERNEL_IMAGE_SIZE.  */
+#define GRUB_KERNEL_MACHINE_KERNEL_IMAGE_SIZE  0xc
+
+/* The offset of GRUB_COMPRESSED_SIZE.  */
+#define GRUB_KERNEL_MACHINE_COMPRESSED_SIZE    0x10
+
+/* The offset of GRUB_PREFIX.  */
+#define GRUB_KERNEL_MACHINE_PREFIX             0x14
+
+/* End of the data section. */
+#define GRUB_KERNEL_MACHINE_DATA_END           0x114
+
+#ifndef ASM_FILE
+
 #include <grub/symbol.h>
+#include <grub/types.h>
+
+/* The size of kernel image.  */
+extern grub_int32_t grub_kernel_image_size;
+
+/* The total size of module images following the kernel.  */
+extern grub_int32_t grub_total_module_size;
+
+/* The prefix which points to the directory where GRUB modules and its
+   configuration file are located.  */
+extern char grub_prefix[];
 
 void EXPORT_FUNC (grub_reboot) (void);
 void EXPORT_FUNC (grub_halt) (void);
 
-/* Where grub-mkimage places the core modules in memory.  */
-#define GRUB_IEEE1275_MODULE_BASE 0x00300000
+#endif /* ! ASM_FILE */
 
 #endif /* ! GRUB_KERNEL_MACHINE_HEADER */
diff --git a/kern/sparc64/ieee1275/crt0.S b/kern/sparc64/ieee1275/crt0.S
new file mode 100644
index 0000000..4e67cbc
--- /dev/null
+++ b/kern/sparc64/ieee1275/crt0.S
@@ -0,0 +1,77 @@
+/* crt0.S - Startup code for the Sparc64.  */
+/*
+ *  GRUB  --  GRand Unified Bootloader
+ *  Copyright (C) 2009  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/symbol.h>
+#include <grub/machine/kernel.h>
+
+       .text
+       .align  4
+       .globl  _start
+_start:
+       ba      codestart
+        nop
+
+       . = EXT_C(_start) + GRUB_KERNEL_MACHINE_TOTAL_MODULE_SIZE
+
+VARIABLE(grub_total_module_size)
+       .word   0
+VARIABLE(grub_kernel_image_size)
+       .word   0
+VARIABLE(grub_compressed_size)
+       .word   0
+VARIABLE(grub_prefix)
+       /* to be filled by grub-mkimage */
+
+       /*
+        *  Leave some breathing room for the prefix.
+        */
+
+       . = EXT_C(_start) + GRUB_KERNEL_MACHINE_DATA_END
+
+codestart:
+       /* Copy the modules past the end of the kernel image.
+        * They are currently sitting in the BSS.
+        */
+       sethi   %hi(__bss_start), %o2
+       or      %o2, %lo(__bss_start), %o2
+       sethi   %hi(_end), %o3
+       or      %o3, %lo(_end), %o3
+       sethi   %hi(grub_total_module_size), %o4
+       lduw    [%o4 + %lo(grub_total_module_size)], %o4
+1:     lduw    [%o2], %o5
+       stw     %o5, [%o3]
+       subcc   %o4, 4, %o4
+       add     %o2, 4, %o2
+       bne,pt  %icc, 1b
+        add    %o3, 4, %o3
+
+       /* Now it's safe to clear out the BSS.  */
+       sethi   %hi(__bss_start), %o2
+       or      %o2, %lo(__bss_start), %o2
+       sethi   %hi(_end), %o3
+       or      %o3, %lo(_end), %o3
+1:     stx     %g0, [%o2]
+       add     %o2, 8, %o2
+       cmp     %o2, %o3
+       blt,pt  %xcc, 1b
+        nop
+       sethi   %hi(grub_ieee1275_entry_fn), %o2
+       stx     %o0, [%o2 + %lo(grub_ieee1275_entry_fn)]
+       call    grub_main
+        nop
+1:     ba,a    1b
diff --git a/kern/sparc64/ieee1275/init.c b/kern/sparc64/ieee1275/init.c
deleted file mode 100644
index a342557..0000000
--- a/kern/sparc64/ieee1275/init.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*  init.c -- Initialize GRUB on the Ultra Sprac (sparc64).  */
-/*
- *  GRUB  --  GRand Unified Bootloader
- *  Copyright (C) 2003,2004,2005,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/>.
- */
-
-#include <grub/kernel.h>
-#include <grub/dl.h>
-#include <grub/disk.h>
-#include <grub/mm.h>
-#include <grub/partition.h>
-#include <grub/normal.h>
-#include <grub/fs.h>
-#include <grub/setjmp.h>
-#include <grub/env.h>
-#include <grub/misc.h>
-#include <grub/time.h>
-#include <grub/machine/console.h>
-#include <grub/machine/kernel.h>
-#include <grub/ieee1275/ofdisk.h>
-#include <grub/ieee1275/ieee1275.h>
-
-/* OpenBoot entry point.  */
-int (*grub_ieee1275_entry_fn) (void *);
-grub_ieee1275_phandle_t grub_ieee1275_chosen;
-static grub_uint32_t grub_ieee1275_flags;
-/* FIXME (sparc64).  */
-static const grub_addr_t grub_heap_start = 0x40000;
-static grub_addr_t grub_heap_len;
-
-void
-_start (uint64_t r0 __attribute__((unused)),
-        uint64_t r1 __attribute__((unused)),
-        uint64_t r2 __attribute__((unused)),
-        uint64_t r3 __attribute__((unused)),
-        uint64_t r4,
-        uint64_t r5 __attribute__((unused)));
-void
-_start (uint64_t r0 __attribute__((unused)),
-        uint64_t r1 __attribute__((unused)),
-        uint64_t r2 __attribute__((unused)),
-        uint64_t r3 __attribute__((unused)),
-        uint64_t r4,
-        uint64_t r5 __attribute__((unused)))
-{
-  grub_ieee1275_entry_fn = (int (*)(void *)) r4;
-
-  grub_ieee1275_finddevice ("/chosen", &grub_ieee1275_chosen);
-
-  /* Now invoke the main function.  */
-  grub_main ();
-
-  /* Never reached.  */
-}
-
-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);
-}
-
-/* Translate an OF filesystem path (separated by backslashes), into a GRUB
-   path (separated by forward slashes).  */
-static void
-grub_translate_ieee1275_path (char *filepath)
-{
-  char *backslash;
-
-  backslash = grub_strchr (filepath, '\\');
-  while (backslash != 0)
-    {
-      *backslash = '/';
-      backslash = grub_strchr (filepath, '\\');
-    }
-}
-
-void
-grub_machine_set_prefix (void)
-{
-  char bootpath[64]; /* XXX check length */
-  char *filename;
-  char *prefix;
-
-  if (grub_ieee1275_get_property (grub_ieee1275_chosen, "bootpath", bootpath,
-                                 sizeof (bootpath), 0))
-    {
-      /* Should never happen.  */
-      grub_printf ("/chosen/bootpath property missing!\n");
-      grub_env_set ("prefix", "");
-      return;
-    }
-
-  /* Transform an OF device path to a GRUB path.  */
-
-  prefix = grub_ieee1275_encode_devname (bootpath);
-
-  filename = grub_ieee1275_get_filename (bootpath);
-  if (filename)
-    {
-      char *newprefix;
-      char *lastslash = grub_strrchr (filename, '\\');
-
-      /* Truncate at last directory.  */
-      if (lastslash)
-        {
-         *lastslash = '\0';
-         grub_translate_ieee1275_path (filename);
-
-         newprefix = grub_malloc (grub_strlen (prefix)
-                                  + grub_strlen (filename));
-         grub_sprintf (newprefix, "%s%s", prefix, filename);
-         grub_free (prefix);
-         prefix = newprefix;
-       }
-    }
-
-  grub_env_set ("prefix", prefix);
-
-  grub_free (filename);
-  grub_free (prefix);
-}
-
-grub_uint64_t ieee1275_get_time_ms (void);
-
-void
-grub_machine_init (void)
-{
-  char *args;
-  grub_ssize_t length;
-
-  grub_console_init ();
-
-  /* FIXME (sparc64).  */
-  grub_heap_len = (grub_addr_t) &_start - 0x1000 - grub_heap_start;
-
-  if (grub_ieee1275_claim (grub_heap_start, grub_heap_len, 0, 0))
-      grub_fatal ("Failed to claim heap at %p, len 0x%x\n", grub_heap_start,
-                  grub_heap_len);
-  grub_mm_init_region ((void *) grub_heap_start, grub_heap_len);
-
-  grub_ofdisk_init ();
-
-  /* Process commandline.  */
-  if (grub_ieee1275_get_property_length (grub_ieee1275_chosen, "bootargs",
-                                         &length) == 0 &&
-      length > 0)
-    {
-      grub_ssize_t i = 0;
-
-      args = grub_malloc (length);
-      grub_ieee1275_get_property (grub_ieee1275_chosen, "bootargs", args,
-                                 length, 0);
-
-      while (i < length)
-       {
-         char *command = &args[i];
-         char *end;
-         char *val;
-
-         end = grub_strchr (command, ';');
-         if (end == 0)
-           i = length; /* No more commands after this one.  */
-         else
-           {
-             *end = '\0';
-             i += end - command + 1;
-             while (grub_isspace(args[i]))
-               i++;
-           }
-
-         /* Process command.  */
-         val = grub_strchr (command, '=');
-         if (val)
-           {
-             *val = '\0';
-             grub_env_set (command, val + 1);
-           }
-       }
-    }
-
-  grub_install_get_time_ms (ieee1275_get_time_ms);
-}
-
-void
-grub_machine_fini (void)
-{
-  grub_ofdisk_fini ();
-  grub_console_fini ();
-}
-
-void
-grub_exit (void)
-{
-  grub_ieee1275_enter ();
-}
-
-grub_uint64_t
-ieee1275_get_time_ms (void)
-{
-  return grub_get_rtc ();
-}
-
-grub_uint32_t
-grub_get_rtc (void)
-{
-  grub_uint32_t msecs;
-
-  if (grub_ieee1275_milliseconds (&msecs))
-    return 0;
-
-  return msecs;
-}
-
-grub_addr_t
-grub_arch_modules_addr (void)
-{
-  return GRUB_IEEE1275_MODULE_BASE;
-}
-- 
1.6.2.3





reply via email to

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