grub-devel
[Top][All Lists]
Advanced

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

[PATCH 3/10]: Implement proper sparc64 kern startup.


From: David Miller
Subject: [PATCH 3/10]: Implement proper sparc64 kern startup.
Date: Wed, 04 Mar 2009 17:32:16 -0800 (PST)

2009-03-03 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[].
---
 include/grub/sparc64/ieee1275/kernel.h |    6 +-
 kern/sparc64/ieee1275/crt0.S           |   54 +++++++
 kern/sparc64/ieee1275/init.c           |  237 --------------------------------
 3 files changed, 59 insertions(+), 238 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..1cb47e4 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
@@ -24,6 +24,10 @@
 void EXPORT_FUNC (grub_reboot) (void);
 void EXPORT_FUNC (grub_halt) (void);
 
+/* The prefix which points to the directory where GRUB modules and its
+   configuration file are located.  */
+extern char grub_prefix[];
+
 /* Where grub-mkimage places the core modules in memory.  */
 #define GRUB_IEEE1275_MODULE_BASE 0x00300000
 
diff --git a/kern/sparc64/ieee1275/crt0.S b/kern/sparc64/ieee1275/crt0.S
new file mode 100644
index 0000000..5008b81
--- /dev/null
+++ b/kern/sparc64/ieee1275/crt0.S
@@ -0,0 +1,54 @@
+/* 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/cpu/kernel.h>
+
+       .text
+       .align  4
+       .globl  _start
+_start:
+       ba      codestart
+        nop
+
+       . = EXT_C(_start) + GRUB_KERNEL_CPU_PREFIX
+
+VARIABLE(grub_prefix)
+       /* to be filled by grub-mkelfimage */
+
+       /*
+        *  Leave some breathing room for the prefix.
+        */
+
+       . = EXT_C(_start) + GRUB_KERNEL_CPU_DATA_END
+
+codestart:
+       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





reply via email to

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