On Mon, Aug 04, 2008 at 08:51:25AM -0400, Pavel Roskin wrote:
> On Mon, 2008-08-04 at 11:16 +0200, Robert Millan wrote:
> 
> > Furthermore, I had a look and some of the x86_64 versions are just stubs 
> > that
> > include the i386 one.
> > 
> > Why don't we handle this like Linux?  They ship a single directory and use
> > #ifdefs where appropiate.  That enforces consistency in the dir layout.
> 
> I think we can do it.  i386 and x86_64 could be joined into one "x86"
> architecture with common headers and sources.  Perhaps the users should
> still use i386 and x86_64 in configure, but the code should be mostly
> common.

I gave a try at this, which I haven't completed yet.  Here's what I have
so far.

The biggest stumbling block seems to be that autoconf doesn't make it easy
to do AC_CHECK_SIZEOF checks for standard compiling and cross-compiling in
the same run (it does support cross-compiling though).

I haven't found a way to do it.  If I modify types.m4 to export its
findings to a variable instead of dumping them to config.h directly,
further calls to the same check won't return different results, even if
CC / CFLAGS has been adjusted.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."
Index: conf/i386-efi.rmk
===================================================================
--- conf/i386-efi.rmk	(revision 1787)
+++ conf/i386-efi.rmk	(working copy)
@@ -1,8 +1,8 @@
 # -*- makefile -*-
 
-COMMON_ASFLAGS = -nostdinc -fno-builtin -m32
-COMMON_CFLAGS = -fno-builtin -m32
-COMMON_LDFLAGS = -melf_i386 -nostdlib
+COMMON_ASFLAGS = -nostdinc -fno-builtin
+COMMON_CFLAGS = -fno-builtin
+COMMON_LDFLAGS = -nostdlib
 
 # Used by various components.  These rules need to precede them.
 normal/lexer.c_DEPENDENCIES = grub_script.tab.h
Index: configure.ac
===================================================================
--- configure.ac	(revision 1787)
+++ configure.ac	(working copy)
@@ -75,7 +75,6 @@
 # Adjust CPU unless target was explicitly specified.
 if test -z "$target_alias"; then
   case "$target_cpu"-"$platform" in
-    x86_64-efi) ;;
     x86_64-*) target_cpu=i386 ;;
     powerpc64-ieee1275) target_cpu=powerpc ;;
   esac
@@ -84,21 +83,15 @@
 # Check if the platform is supported, make final adjustments.
 case "$target_cpu"-"$platform" in
   i386-efi) ;;
-  x86_64-efi) ;;
-  i386-pc) ;;
-  i386-coreboot) ;;
-  i386-linuxbios) platform=coreboot ;;
-  i386-ieee1275) ;;
+  i386-pc)		target_m32=1 ;;
+  i386-coreboot)	target_m32=1 ;;
+  i386-linuxbios)	target_m32=1 ; platform=coreboot ;;
+  i386-ieee1275)	target_m32=1 ;;
   powerpc-ieee1275) ;;
   sparc64-ieee1275) ;;
   *) AC_MSG_ERROR([platform "$platform" is not supported for target CPU "$target_cpu"]) ;;
 esac
 
-case "$target_cpu" in
-  i386 | powerpc) target_m32=1 ;;
-  x86_64 | sparc64) target_m64=1 ;;
-esac
-
 AC_SUBST(target_cpu)
 AC_SUBST(platform)
 
Index: include/grub/i386/setjmp.h
===================================================================
--- include/grub/i386/setjmp.h	(revision 1787)
+++ include/grub/i386/setjmp.h	(working copy)
@@ -19,10 +19,19 @@
 #ifndef GRUB_SETJMP_CPU_HEADER
 #define GRUB_SETJMP_CPU_HEADER	1
 
-typedef unsigned long grub_jmp_buf[6];
+typedef unsigned long grub_jmp_buf[8];
 
+#ifdef __x86_64__
+
+int grub_setjmp (grub_jmp_buf env);
+void grub_longjmp (grub_jmp_buf env, int val) __attribute__ ((noreturn));
+
+#else
+
 int grub_setjmp (grub_jmp_buf env) __attribute__ ((cdecl, regparm (3)));
 void grub_longjmp (grub_jmp_buf env, int val) __attribute__ ((noreturn, cdecl,
 							      regparm (3)));
 
+#endif
+
 #endif /* ! GRUB_SETJMP_CPU_HEADER */
Index: include/grub/i386/types.h
===================================================================
--- include/grub/i386/types.h	(revision 1787)
+++ include/grub/i386/types.h	(working copy)
@@ -19,12 +19,24 @@
 #ifndef GRUB_TYPES_CPU_HEADER
 #define GRUB_TYPES_CPU_HEADER	1
 
+#ifdef __i386__
+
 /* The size of void *.  */
 #define GRUB_TARGET_SIZEOF_VOID_P	4
 
 /* The size of long.  */
 #define GRUB_TARGET_SIZEOF_LONG		4
 
+#else
+
+/* The size of void *.  */
+#define GRUB_TARGET_SIZEOF_VOID_P	8
+
+/* The size of long.  */
+#define GRUB_TARGET_SIZEOF_LONG		8
+
+#endif
+
 /* i386 is little-endian.  */
 #undef GRUB_TARGET_WORDS_BIGENDIAN
 
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to