x86 boot code build

Dimitry Andric dimitry at andric.com
Thu Oct 4 20:02:26 UTC 2012


On 2012-10-03 15:06, Andriy Gapon wrote:
> Currently we produce "slightly" different binaries for x86 boot code depending
> whether MACHINE_CPUARCH is i386 or amd64.  I think that there is no good reason
> for this, since in both cases we use exactly the same code and target the same
> classes of machines.  In other words, the binaries should be interchangeable[*].
>
> The difference boils down to using -march=i386 on amd64 while i386 uses default
> compiler flags, which are equivalent to -march=i486 -mtune=generic.

Yes, I also noticed this inconsistency during some other work in
sys/boot, and I ended up with this diff in my backlog:

Index: sys/boot/i386/Makefile.inc
===================================================================
--- sys/boot/i386/Makefile.inc  (revision 241194)
+++ sys/boot/i386/Makefile.inc  (working copy)
@@ -5,12 +5,13 @@
  BINDIR?=       /boot

  LOADER_ADDRESS?=0x200000
-CFLAGS+=       -ffreestanding -mpreferred-stack-boundary=2 \
+CFLAGS+=       -march=i386 -ffreestanding -mpreferred-stack-boundary=2 \
                 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float
+NO_CPU_CFLAGS=
  LDFLAGS+=      -nostdlib

  .if ${MACHINE_CPUARCH} == "amd64"
-CFLAGS+=       -m32 -march=i386
+CFLAGS+=       -m32
  ACFLAGS+=      -m32
  LDFLAGS+=      -m elf_i386_fbsd
  AFLAGS+=       --32


> If my analysis is correct, the only thing affected by the flags in the boot code
> is use of leave instruction when -Os is _not_ specified.
> For -march=i386 our gcc prefers using leave.  For -march=i486 it thinks that
> movs+pops are faster than leave and so prefers to not use it.  If -Os is
> specified, then leave is always used because it results in smaller machine code.
>
> So, as it is now, on amd64 we produce slightly smaller boot binaries where size
> doesn't matter.  Where size really matters (-Os) we produce identical binaries.
>
> If we decide that it makes sense to converge i386 and amd64 boot build options,
> which should we pick?

Well, do we still officially support any real i386 machines?  If so, we
should still use -march=i386 for the boot code.  Otherwise, let's start
using -march=i486 explicitly.  So like:

Index: sys/boot/i386/Makefile.inc
===================================================================
--- sys/boot/i386/Makefile.inc  (revision 241194)
+++ sys/boot/i386/Makefile.inc  (working copy)
@@ -5,12 +5,13 @@
  BINDIR?=       /boot

  LOADER_ADDRESS?=0x200000
-CFLAGS+=       -ffreestanding -mpreferred-stack-boundary=2 \
+CFLAGS+=       -march=i486 -ffreestanding -mpreferred-stack-boundary=2 \
                 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float
+NO_CPU_CFLAGS=
  LDFLAGS+=      -nostdlib

  .if ${MACHINE_CPUARCH} == "amd64"
-CFLAGS+=       -m32 -march=i386
+CFLAGS+=       -m32
  ACFLAGS+=      -m32
  LDFLAGS+=      -m elf_i386_fbsd
  AFLAGS+=       --32


More information about the freebsd-arch mailing list