[devel] GRUB и сородичи

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Чт Дек 21 19:13:15 MSK 2006


On Thu, Dec 21, 2006 at 06:46:57PM +0300, Dmitry V. Levin wrote:
> On Thu, Dec 21, 2006 at 06:42:43PM +0300, Sergey Vlasov wrote:
> > On Thu, Dec 21, 2006 at 06:15:04PM +0300, Epiphanov Sergei wrote:
> > > > > Думал, можно обойтись малой кровью. :( Интересно, а что мешает
> > > > > попробовать собрать grub без этого ключа? Программирование на asm?
> > > >
> > > > Сергей сказал, что там есть i386 asm.
> > > 
> > > Вот только насколько оно привязано именно к i386 и к 32-битному полю?.. 
> > > Неужели так жёстко, что сборка под 64-бит рушит сам процесс работы grub? 
> > > Жаль, не на чем проверить...
> > 
> > Собственно загрузчик (/boot/grub/stage*) всегда собирается с -m32, и
> > с этой частью особых проблем нет (кроме необходимости костылей в
> > configure для объезда невозможности линковки с -m32, а также
> > исправления нескольких ошибок в Makefile.am).
> 
> Т.е. там не нужен -m32?

Как раз нужен - проблема в том, что с нашим gcc не проходят тесты в
configure из-за того, что делается попытка собрать бинарник с -m32;
приходится обходить это хаками.

--- grub-0.97/stage2/Makefile.am.alt-x86_64-m32	2006-07-21 11:02:14 +0400
+++ grub-0.97/stage2/Makefile.am	2006-07-21 11:09:07 +0400
@@ -55,11 +55,11 @@
 endif
 MOSTLYCLEANFILES = $(noinst_PROGRAMS)
 
-PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200
-START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
-NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0
-PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
-START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
+PRE_STAGE2_LINK = $(STAGE2_CFLAGS) -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200
+START_LINK = $(STAGE2_CFLAGS) -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
+NBLOADER_LINK = $(STAGE2_CFLAGS) -nostdlib -Wl,-N -Wl,-Ttext -Wl,0
+PXELOADER_LINK = $(STAGE2_CFLAGS) -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
+START_ELTORITO_LINK = $(STAGE2_CFLAGS) -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
 
 if NETBOOT_SUPPORT
 NETBOOT_FLAGS = -I$(top_srcdir)/netboot -DSUPPORT_NETBOOT=1
@@ -82,7 +82,7 @@
 STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \
 	$(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS)
 
-STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
+STAGE1_5_LINK = $(STAGE2_CFLAGS) -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
 STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
 
 # For stage2 target.
--- grub-0.97/stage1/Makefile.am.alt-x86_64-m32	2006-07-21 11:02:14 +0400
+++ grub-0.97/stage1/Makefile.am	2006-07-21 11:09:33 +0400
@@ -5,7 +5,7 @@
 
 # We can't use builtins or standard includes.
 AM_CCASFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
-LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
+LDFLAGS = $(STAGE1_CFLAGS) -nostdlib -Wl,-N,-Ttext,7C00
 
 noinst_PROGRAMS = stage1.exec
 stage1_exec_SOURCES = stage1.S stage1.h
--- grub-0.97/configure.ac.alt-x86_64-m32	2005-05-08 06:36:03 +0400
+++ grub-0.97/configure.ac	2006-07-21 11:02:15 +0400
@@ -47,7 +47,9 @@
 fi
 
 if test "x$host_cpu" = xx86_64; then
-  CFLAGS="-m32 $CFLAGS"
+  M32_FLAG="-m32 -nodefaultlibs"
+else
+  M32_FLAG=
 fi
 
 #
@@ -84,7 +86,7 @@
     if test "x$with_binutils" != x; then
       CFLAGS="-B$with_binutils/ $CFLAGS"
     fi
-    STAGE1_CFLAGS="-O2"
+    STAGE1_CFLAGS="$M32_FLAG -O2"
     GRUB_CFLAGS="-O2"
     AC_CACHE_CHECK([whether optimization for size works], size_flag, [
       saved_CFLAGS=$CFLAGS
@@ -97,6 +99,7 @@
     else
       STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops"
     fi
+    STAGE2_CFLAGS="$M32_FLAG $STAGE2_CFLAGS"
     # OpenBSD has a GCC extension for protecting applications from
     # stack smashing attacks, but GRUB doesn't want this feature.
     AC_CACHE_CHECK([whether gcc has -fno-stack-protector],
@@ -157,6 +160,9 @@
   AC_CHECK_TOOL(OBJCOPY, objcopy)
 fi
 
+grub_saved_CFLAGS="$CFLAGS"
+CFLAGS="$M32_FLAG $CFLAGS"
+
 # Defined in acinclude.m4.
 grub_ASM_USCORE
 grub_PROG_OBJCOPY_ABSOLUTE
@@ -173,6 +179,8 @@
 
 grub_ASM_ABSOLUTE_WITHOUT_ASTERISK
 
+CFLAGS="$grub_saved_CFLAGS"
+
 grub_CHECK_START_SYMBOL
 grub_CHECK_USCORE_START_SYMBOL
 if test "x$grub_cv_check_start_symbol" != "xyes" \




--- grub-0.97/stage2/disk_io.c.alt-x86_64-build	2006-07-21 10:58:25 +0400
+++ grub-0.97/stage2/disk_io.c	2006-07-21 10:58:25 +0400
@@ -130,7 +130,7 @@
 static inline unsigned long
 grub_log2 (unsigned long word)
 {
-  asm volatile ("bsfl %1,%0"
+  asm volatile ("bsf %1,%0"
 		: "=r" (word)
 		: "r" (word));
   return word;
--- grub-0.97/stage2/fsys_ext2fs.c.alt-x86_64-build	2006-07-21 10:58:25 +0400
+++ grub-0.97/stage2/fsys_ext2fs.c	2006-07-21 10:58:25 +0400
@@ -242,7 +242,7 @@
 static __inline__ unsigned long
 ffz (unsigned long word)
 {
-  __asm__ ("bsfl %1,%0"
+  __asm__ ("bsf %1,%0"
 :	   "=r" (word)
 :	   "r" (~word));
   return word;
--- grub-0.97/stage2/fsys_fat.c.alt-x86_64-build	2006-07-21 10:58:25 +0400
+++ grub-0.97/stage2/fsys_fat.c	2006-07-21 10:58:25 +0400
@@ -57,7 +57,7 @@
 static __inline__ unsigned long
 grub_log2 (unsigned long word)
 {
-  __asm__ ("bsfl %1,%0"
+  __asm__ ("bsf %1,%0"
 	   : "=r" (word)
 	   : "r" (word));
   return word;
--- grub-0.97/stage2/fsys_iso9660.c.alt-x86_64-build	2006-07-21 10:58:25 +0400
+++ grub-0.97/stage2/fsys_iso9660.c	2006-07-21 10:58:25 +0400
@@ -59,7 +59,7 @@
 static inline unsigned long
 grub_log2 (unsigned long word)
 {
-  asm volatile ("bsfl %1,%0"
+  asm volatile ("bsf %1,%0"
 		:          "=r" (word)
 		:          "r" (word));
   return word;
--- grub-0.97/stage2/fsys_reiserfs.c.alt-x86_64-build	2006-07-21 10:58:25 +0400
+++ grub-0.97/stage2/fsys_reiserfs.c	2006-07-21 10:58:25 +0400
@@ -369,7 +369,7 @@
 static __inline__ unsigned long
 grub_log2 (unsigned long word)
 {
-  __asm__ ("bsfl %1,%0"
+  __asm__ ("bsf %1,%0"
 	   : "=r" (word)
 	   : "r" (word));
   return word;
--- grub-0.97/stage2/fsys_xfs.c.alt-x86_64-build	2005-05-08 06:15:55 +0400
+++ grub-0.97/stage2/fsys_xfs.c	2006-07-21 10:58:25 +0400
@@ -100,26 +100,16 @@
 static inline __const__ xfs_uint16_t
 le16 (xfs_uint16_t x)
 {
-	__asm__("xchgb %b0,%h0"	\
-		: "=q" (x) \
-		:  "0" (x)); \
-		return x;
+	return ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8 );
 }
 
 static inline __const__ xfs_uint32_t
 le32 (xfs_uint32_t x)
 {
-#if 0
-        /* 386 doesn't have bswap.  */
-	__asm__("bswap %0" : "=r" (x) : "0" (x));
-#else
-	/* This is slower but this works on all x86 architectures.  */
-	__asm__("xchgb %b0, %h0" \
-		"\n\troll $16, %0" \
-		"\n\txchgb %b0, %h0" \
-		: "=q" (x) : "0" (x));
-#endif
-	return x;
+	return (((x & 0x000000ffUL) << 24) |
+		((x & 0x0000ff00UL) << 8) |
+		((x & 0x00ff0000UL) >> 8) |
+		((x & 0xff000000UL) >> 24));
 }
 
 static inline __const__ xfs_uint64_t
--- grub-0.97/stage2/smp-imps.c.alt-x86_64-build	2005-02-02 23:36:00 +0300
+++ grub-0.97/stage2/smp-imps.c	2006-07-21 11:01:30 +0400
@@ -270,7 +270,7 @@
 /*
  *  This contains the local APIC hardware address.
  */
-static unsigned imps_lapic_addr = ((unsigned) (&lapic_dummy)) - LAPIC_ID;
+static unsigned long imps_lapic_addr = ((unsigned long) (&lapic_dummy)) - LAPIC_ID;
 /*
  *  These map from virtual cpu numbers to APIC id's and back.
  */
--- grub-0.97/grub/asmstub.c.alt-x86_64-build	2006-07-21 10:58:25 +0400
+++ grub-0.97/grub/asmstub.c	2006-07-21 10:58:25 +0400
@@ -105,6 +105,12 @@
 static unsigned int serial_speed;
 #endif /* SIMULATE_SLOWNESS_OF_SERIAL */
 
+#ifdef __x86_64__
+#define SP_REG		"rsp"
+#else
+#define SP_REG		"esp"
+#endif
+
 /* The main entry point into this mess. */
 int
 grub_stage2 (void)
@@ -122,7 +128,7 @@
   void doit (void)
     {
       /* Make sure our stack lives in the simulated memory area. */
-      asm volatile ("movl %%esp, %0\n\tmovl %1, %%esp\n"
+      asm volatile ("mov %%" SP_REG ", %0\n\tmov %1, %%" SP_REG "\n"
 		    : "=&r" (realstack) : "r" (simstack));
       
       /* Do a setjmp here for the stop command.  */
@@ -140,7 +146,7 @@
 	}
       
       /* Replace our stack before we use any local variables. */
-      asm volatile ("movl %0, %%esp\n" : : "r" (realstack));
+      asm volatile ("mov %0, %%" SP_REG "\n" : : "r" (realstack));
     }
 
   assert (grub_scratch_mem == 0);



--- grub-0.97-alt2/grub.spec	2006-05-31 11:51:47 +0000
+++ grub-0.97-alt2.0.1/grub.spec	2006-07-21 06:58:22 +0000
@@ -1,11 +1,11 @@
 Name: grub
 Version: 0.97
-Release: alt2
+Release: alt2.0.1
 
 Summary: GRand Unified Bootloader
 License: GPL
 Group: System/Kernel and hardware
-Exclusivearch: %ix86
+Exclusivearch: %ix86 x86_64
 
 Source: ftp://alpha.gnu.org/gnu/grub/%name-%version.tar
 #"grubonce" is script to demonstrate & ease "savedefault --once"
@@ -46,12 +46,15 @@ Patch223:        stage2-wildcard-doc.dif
 Patch224:        grub-%{version}-protexec.patch
 Patch299:        grub-0.97-stackptr.diff
 
+Patch1000:	grub-0.97-alt-x86_64-m32.patch
+Patch1001:	grub-0.97-alt-x86_64-build.patch
 
 Provides: %name-doc = %version, %name-graph = %version
 Obsoletes: %name-doc, %name-graph
 
 # Automatically added by buildreq on Wed May 31 2006
-BuildRequires: libncurses-devel reiser4progs-minimal-devel tetex-latex
+BuildRequires: libncurses-devel tetex-latex
+# reiser4progs-minimal-devel
 
 %package utils
 Group: System/Kernel and hardware
@@ -81,8 +84,8 @@ Additional utilites for %name
 #%patch5 -p1
 %patch6 -p1
 %patch7 -p1
-%patch8 -p1
-%patch9 -p1
+#%patch8 -p1
+#%patch9 -p1
 #SuSE:
 
 rm -f acconfig.h || true
@@ -90,7 +93,7 @@ rm -f acconfig.h || true
 %patch201
 %patch202 -p1
 %patch203 -p1
-%patch204 -p1
+###%patch204 -p1
 %patch205 -p1
 %patch206 -p1
 %patch207 -p1
@@ -99,15 +102,18 @@ rm -f acconfig.h || true
 %patch210 -p1
 %patch211 -p1
 %patch212 -p1
-%patch213
-%patch214
+###%patch213
+###%patch214
 # Disable the wildcard feature
 #%patch220 -p1
 #%patch221 -p1
 #%patch222 -p1
 #%patch223 -p1
 %patch224 -p1
-%patch299
+###%patch299
+
+%patch1000 -p1 -b .alt-x86_64-m32
+%patch1001 -p1 -b .alt-x86_64-build
 
 %build
 #rm -rf configure
@@ -117,12 +123,15 @@ rm -f acconfig.h || true
 aclocal && autoheader && autoconf && automake --add-missing
 ###
 
-#%ifarch x86_64
-#  EXTRACFLAGS=' -fno-strict-aliasing -minline-all-stringops -m32 -fno-asynchronous-unwind-tables '
-#%else
+%ifarch x86_64
+  EXTRACFLAGS=' -fno-strict-aliasing -minline-all-stringops -fno-asynchronous-unwind-tables '
+  STAGEx_CFLAGS=' -m32 '
+%else
 EXTRACFLAGS=' -fno-strict-aliasing -minline-all-stringops'
-#%endif  
-CFLAGS="$RPM_OPT_FLAGS -Os -DNDEBUG -W -Wall -Wpointer-arith $EXTRACFLAGS" ./configure \
+  STAGEx_CFLAGS=
+%endif  
+CFLAGS="$RPM_OPT_FLAGS -Os -DNDEBUG -W -Wall -Wpointer-arith $EXTRACFLAGS" \
+STAGE1_CFLAGS="$STAGEx_CFLAGS" STAGE2_CFLAGS="$STAGEx_CFLAGS" ./configure \
   --prefix=/usr --infodir=%{_infodir} --mandir=%{_mandir} --datadir=%{_datadir} \
   --libexecdir=%{_libexecdir} \
   --disable-auto-linux-mem-opt --enable-diskless \


Так оно делает вид, что собирается, но на самом деле не работает.

> > Проблема в невозможности собрать /usr/sbin/grub (кстати, а
> > почему он лежит в /usr?), в результате grub нечем установить на
> > диск при запущенной системе.
> 
> Кто бы мне объяснил, зачем нужен -m32 в /usr/sbin/grub?

  char *stage2_first_buffer = ...
  int i;
  ...
  i = (int) stage2_first_buffer + SECTOR_SIZE - 4;
  while (*((unsigned long *) i))
    {
      if (i < (int) stage2_first_buffer
          || (*((int *) (i - 4)) & 0x80000000)
          || *((unsigned short *) i) >= 0xA00
          || *((short *) (i + 2)) == 0)
        {
          errnum = ERR_BAD_VERSION;
          goto fail;
        }
    
      *((int *) i) = 0;
      *((int *) (i - 4)) = 0;
      i -= 8;
    }

И такого кода там куча.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20061221/aa58b06a/attachment-0001.bin>


Подробная информация о списке рассылки Devel