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; } И такого кода там куча.