PowerPC's "cmp" instruction has four operands. Normally people write
"cmpw" or "cmpd" for the second cmp operand 0 or 1. But, frequently
people forget, and write "cmp" with just three operands.
With older binutils this is silently accepted as if this was "cmpw",
while often "cmpd" is wanted. With newer binutils GAS will complain
about this for 64-bit code. For 32-bit code it still silently assumes
"cmpw" is what is meant.
Signed-off-by: Segher Boessenkool <redacted>
---
arch/powerpc/include/asm/cpuidle.h | 2 +-
arch/powerpc/kernel/vdso64/datapage.S | 2 +-
arch/powerpc/kernel/vdso64/gettimeofday.S | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
From: Michael Ellerman <mpe@ellerman.id.au> Date: 2016-10-12 03:05:22
Segher Boessenkool [off-list ref] writes:
PowerPC's "cmp" instruction has four operands. Normally people write
"cmpw" or "cmpd" for the second cmp operand 0 or 1. But, frequently
people forget, and write "cmp" with just three operands.
With older binutils this is silently accepted as if this was "cmpw",
while often "cmpd" is wanted. With newer binutils GAS will complain
about this for 64-bit code. For 32-bit code it still silently assumes
"cmpw" is what is meant.
Thanks.
Anton already sent a fix for the two vdso ones, which were real bugs,
and that's now in Linus' tree.
On Wed, Oct 12, 2016 at 02:05:19PM +1100, Michael Ellerman wrote:
Segher Boessenkool [off-list ref] writes:
quoted
PowerPC's "cmp" instruction has four operands. Normally people write
"cmpw" or "cmpd" for the second cmp operand 0 or 1. But, frequently
people forget, and write "cmp" with just three operands.
With older binutils this is silently accepted as if this was "cmpw",
while often "cmpd" is wanted. With newer binutils GAS will complain
about this for 64-bit code. For 32-bit code it still silently assumes
"cmpw" is what is meant.
Thanks.
Anton already sent a fix for the two vdso ones, which were real bugs,
and that's now in Linus' tree.
Ah cool. You'll just need the one then (and many more for book4e, but
I cannot really handle that, other people can do that a lot better).
What's this one doing, is it a bug? I can't really tell without knowing
what the magic sequence is meant to do.
It looks like it is making sure the ptesync is done. The ld/cmp/bne
is the usual to make sure the ld is done, and in std/ptesync/ld the ld
won't be done before the ptesync is done.
The cmp always compares equal, of course, so both cmpw and cmpd would
work fine here. cmpd looks better after ld ;-)
Segher
What's this one doing, is it a bug? I can't really tell without knowing
what the magic sequence is meant to do.
This one is the recommended idle state entry sequence described in
ISA. We need to ensure the context is fully saved and also create
a register dependency using cmp and loop which will ideally not be
taken. This will get the thread (pipeline) ready to start losing
state when the idle instruction is executed.
ISA 2.07 Section: 3.3.2.1 Entering and Exiting Power-Saving Mode
It looks like it is making sure the ptesync is done. The ld/cmp/bne
is the usual to make sure the ld is done, and in std/ptesync/ld the ld
won't be done before the ptesync is done.
The cmp always compares equal, of course, so both cmpw and cmpd would
work fine here. cmpd looks better after ld ;-)
Yes :)
cmpd or cmpw would provide same result as far as this code sequence is
concerned. I agree that cpmd is more appropriate here.
--Vaidy
From: Michael Ellerman <hidden> Date: 2016-10-26 10:21:12
On Thu, 2016-06-10 at 13:42:19 UTC, Segher Boessenkool wrote:
PowerPC's "cmp" instruction has four operands. Normally people write
"cmpw" or "cmpd" for the second cmp operand 0 or 1. But, frequently
people forget, and write "cmp" with just three operands.
With older binutils this is silently accepted as if this was "cmpw",
while often "cmpd" is wanted. With newer binutils GAS will complain
about this for 64-bit code. For 32-bit code it still silently assumes
"cmpw" is what is meant.
Signed-off-by: Segher Boessenkool <redacted>
From: Joel Stanley <joel@jms.id.au> Date: 2016-12-14 03:32:16
On Wed, Oct 26, 2016 at 8:51 PM, Michael Ellerman
[off-list ref] wrote:
On Thu, 2016-06-10 at 13:42:19 UTC, Segher Boessenkool wrote:
quoted
PowerPC's "cmp" instruction has four operands. Normally people write
"cmpw" or "cmpd" for the second cmp operand 0 or 1. But, frequently
people forget, and write "cmp" with just three operands.
With older binutils this is silently accepted as if this was "cmpw",
while often "cmpd" is wanted. With newer binutils GAS will complain
about this for 64-bit code. For 32-bit code it still silently assumes
"cmpw" is what is meant.
Signed-off-by: Segher Boessenkool <redacted>
This one made it into 4.9-rc3 as "powerpc: Convert cmp to cmpd in idle
enter sequence". We need it to build the 4.4 kernel with GCC 6.2, so
my OpenPower firmware builds are failing.
The patch won't backport directly as in 4.4 the macro is in
arch/powerpc/kernel/idle_power7.S.
Greg, is this one in your queue? Do we need to send a patch to stable
that backports cleanly?
Cheers,
Joel
On Wed, Dec 14, 2016 at 02:01:50PM +1030, Joel Stanley wrote:
quoted
quoted
With older binutils this is silently accepted as if this was "cmpw",
while often "cmpd" is wanted. With newer binutils GAS will complain
about this for 64-bit code. For 32-bit code it still silently assumes
"cmpw" is what is meant.
This one made it into 4.9-rc3 as "powerpc: Convert cmp to cmpd in idle
enter sequence". We need it to build the 4.4 kernel with GCC 6.2, so
my OpenPower firmware builds are failing.
The GCC version does not matter; the binutils version does, however.
Segher
On Wed, Dec 14, 2016 at 02:01:50PM +1030, Joel Stanley wrote:
On Wed, Oct 26, 2016 at 8:51 PM, Michael Ellerman
[off-list ref] wrote:
quoted
On Thu, 2016-06-10 at 13:42:19 UTC, Segher Boessenkool wrote:
quoted
PowerPC's "cmp" instruction has four operands. Normally people write
"cmpw" or "cmpd" for the second cmp operand 0 or 1. But, frequently
people forget, and write "cmp" with just three operands.
With older binutils this is silently accepted as if this was "cmpw",
while often "cmpd" is wanted. With newer binutils GAS will complain
about this for 64-bit code. For 32-bit code it still silently assumes
"cmpw" is what is meant.
Signed-off-by: Segher Boessenkool <redacted>
This one made it into 4.9-rc3 as "powerpc: Convert cmp to cmpd in idle
enter sequence". We need it to build the 4.4 kernel with GCC 6.2, so
my OpenPower firmware builds are failing.
The patch won't backport directly as in 4.4 the macro is in
arch/powerpc/kernel/idle_power7.S.
Greg, is this one in your queue? Do we need to send a patch to stable
that backports cleanly?
I need a clean backport, that is why it never showed up in 4.4-stable.
thanks,
greg k-h