Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 14 Oct 2012 12:53:50 +0300
From:      Andriy Gapon <avg@FreeBSD.org>
To:        freebsd-arch@FreeBSD.org
Cc:        Dimitry Andric <dimitry@andric.com>
Subject:   Re: x86 boot code build
Message-ID:  <507A8BAE.5060304@FreeBSD.org>
In-Reply-To: <506DEB4C.5020508@andric.com>
References:  <506C385C.3020400@FreeBSD.org> <506DEB4C.5020508@andric.com>

next in thread | previous in thread | raw e-mail | index | archive | help
on 04/10/2012 23:02 Dimitry Andric said the following:
> 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:

Thank you for the patch!
Here is a slightly larger one (including some commented out changes in userboot):
http://people.freebsd.org/~avg/boot-march%3di386.diff

> 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


-- 
Andriy Gapon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?507A8BAE.5060304>