x86 boot code build
Andriy Gapon
avg at FreeBSD.org
Sun Oct 14 09:53:54 UTC 2012
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
More information about the freebsd-arch
mailing list