[2091] * kern/sparc64/ieee1275/init.c: Delete, replace with...

"David S. Miller" <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
Revision: 2091
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2091
Author:   davem
Date:     2009-04-13 07:02:46 +0000 (Mon, 13 Apr 2009)
Log Message:
-----------
	* 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.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/DISTLIST
    trunk/grub2/include/grub/sparc64/ieee1275/kernel.h

Added Paths:
-----------
    trunk/grub2/kern/sparc64/ieee1275/crt0.S

Removed Paths:
-------------
    trunk/grub2/kern/sparc64/ieee1275/init.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog	2009-04-13 06:40:34 UTC (rev 2090)
+++ trunk/grub2/ChangeLog	2009-04-13 07:02:46 UTC (rev 2091)
@@ -18,6 +18,15 @@
 	(grub_ofdisk_open): Use ofdisk_hash_ent address as disk->id
 	instead of device phandle which is not unique.
 
+	* 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.
+
 2009-04-12  Pavel Roskin  <[email protected]>
 
          * configure.ac: Change the logic when we check for target tools.

Modified: trunk/grub2/DISTLIST
===================================================================
--- trunk/grub2/DISTLIST	2009-04-13 06:40:34 UTC (rev 2090)
+++ trunk/grub2/DISTLIST	2009-04-13 07:02:46 UTC (rev 2091)
@@ -379,7 +379,7 @@
 kern/powerpc/ieee1275/startup.S
 kern/sparc64/cache.S
 kern/sparc64/dl.c
-kern/sparc64/ieee1275/init.c
+kern/sparc64/ieee1275/crt0.S
 kern/sparc64/ieee1275/openfw.c
 kern/x86_64/dl.c
 kern/x86_64/efi/callwrap.S

Modified: trunk/grub2/include/grub/sparc64/ieee1275/kernel.h
===================================================================
--- trunk/grub2/include/grub/sparc64/ieee1275/kernel.h	2009-04-13 06:40:34 UTC (rev 2090)
+++ trunk/grub2/include/grub/sparc64/ieee1275/kernel.h	2009-04-13 07:02:46 UTC (rev 2091)
@@ -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 */

Added: trunk/grub2/kern/sparc64/ieee1275/crt0.S
===================================================================
--- trunk/grub2/kern/sparc64/ieee1275/crt0.S	                        (rev 0)
+++ trunk/grub2/kern/sparc64/ieee1275/crt0.S	2009-04-13 07:02:46 UTC (rev 2091)
@@ -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

Deleted: trunk/grub2/kern/sparc64/ieee1275/init.c
===================================================================
--- trunk/grub2/kern/sparc64/ieee1275/init.c	2009-04-13 06:40:34 UTC (rev 2090)
+++ trunk/grub2/kern/sparc64/ieee1275/init.c	2009-04-13 07:02:46 UTC (rev 2091)
@@ -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;
-}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.