[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 3/7]: Implement proper sparc64 kern startup.
From: |
David Miller |
Subject: |
[PATCH 3/7]: Implement proper sparc64 kern startup. |
Date: |
Tue, 03 Mar 2009 18:15:21 -0800 (PST) |
This replaces the C implementation with a proper assembler
one. Also add missing grub_prefix[] declaration to
kernel.h
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 | 4 +
kern/sparc64/ieee1275/crt0.S | 53 +++++++
kern/sparc64/ieee1275/init.c | 237 --------------------------------
3 files changed, 57 insertions(+), 237 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..a292657 100644
--- a/include/grub/sparc64/ieee1275/kernel.h
+++ b/include/grub/sparc64/ieee1275/kernel.h
@@ -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..8b22b07
--- /dev/null
+++ b/kern/sparc64/ieee1275/crt0.S
@@ -0,0 +1,53 @@
+/* crt0.S - Startup code for the Sparc64. */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 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/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.1.2.253.ga34a
- [PATCH 3/7]: Implement proper sparc64 kern startup.,
David Miller <=