svn commit: r315522 - in head: contrib/binutils/ld/emulparams sys/conf
Bruce Evans
brde at optusnet.com.au
Sun Mar 19 02:25:35 UTC 2017
On Sun, 19 Mar 2017, Ed Maste wrote:
> Log:
> use INT3 instead of NOP for x86 binary padding
>
> We should never end up executing the inter-function padding, so we
> are better off faulting than silently carrying on to whatever function
> happens to be next.
>
> Note that LLD will soon do this by default (although it currently pads
> with zeros).
>
> Reviewed by: dim, kib
> MFC after: 1 month
> Sponsored by: The FreeBSD Foundation
> Differential Revision: https://reviews.freebsd.org/D10047
Is this a pessimization? Instruction prefetch near the end of almost
every function now fetches INT3 instead of NOP. Both have to be
decoded to decoded whether to speculatively execute them. INT3 is
unlikely to be speculatively executed, but it takes extra work to
decide not to do so.
Functions normally end with a RET or unconditional JMP, and then branch
prediction usually prevents speculative execution beyond the end, so the
pessimization must be small.
Intra-function padding that is executed now uses "fat NOP" instructions
like null LEA's since this is faster to execute than a long string of
NOPs. This is less readable than NOPs or even INT3's. Of course, INT3
can't be used for executed padding. I think it is also used for intra-
function padding that is not executed. This is just harder to read
unless it is needed to avoid the possible pessimization in this commit.
The intra-function code with nops might look like:
jmp over
nop
# 7 nops altogether
nop
over:
or
jmp over
nullpad7 # single 7 byte null padding instruction
over:
and it is likely to be CPU-dependent whether 7 possibly-speculatively
executed nops take more or less resources than 1 possibly-speculatively
executed fancy instruction. I would expect the fancy instructions to
take more resources each.
Fancy LEAs don't seem such a good choice for executed padding either.
amd64 uses lots of REX prefixes instead of fancy instructions, since
these are designed to have low overheads. They certainly aren't
executed separately. On i386, the same technique with lots of older
prefixes is not used much, probably because all prefixes have high
overheads on old i386's. They can be as slow as NOPs although they
aren't executed separately.
Bruce
More information about the svn-src-head
mailing list