[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH]: grub: Add revamped kernel startup code for sparc64.,
David Miller <=