https://github.com/torvalds/linux
Revision bdbc29c19b2633b1d9c52638fb732bcde7a2031a authored by Paul Mackerras on 27 August 2013, 06:07:49 UTC, committed by Benjamin Herrenschmidt on 27 August 2013, 06:59:30 UTC
On 64-bit, __pa(&static_var) gets miscompiled by recent versions of gcc as something like: addis 3,2,.LANCHOR1+4611686018427387904@toc@ha addi 3,3,.LANCHOR1+4611686018427387904@toc@l This ends up effectively ignoring the offset, since its bottom 32 bits are zero, and means that the result of __pa() still has 0xC in the top nibble. This happens with gcc 4.8.1, at least. To work around this, for 64-bit we make __pa() use an AND operator, and for symmetry, we make __va() use an OR operator. Using an AND operator rather than a subtraction ends up with slightly shorter code since it can be done with a single clrldi instruction, whereas it takes three instructions to form the constant (-PAGE_OFFSET) and add it on. (Note that MEMORY_START is always 0 on 64-bit.) CC: <stable@vger.kernel.org> Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
1 parent f5f6cbb
Tip revision: bdbc29c19b2633b1d9c52638fb732bcde7a2031a authored by Paul Mackerras on 27 August 2013, 06:07:49 UTC
powerpc: Work around gcc miscompilation of __pa() on 64-bit
powerpc: Work around gcc miscompilation of __pa() on 64-bit
Tip revision: bdbc29c
File | Mode | Size |
---|---|---|
802 | ||
8021q | ||
9p | ||
appletalk | ||
atm | ||
ax25 | ||
batman-adv | ||
bluetooth | ||
bridge | ||
caif | ||
can | ||
ceph | ||
core | ||
dcb | ||
dccp | ||
decnet | ||
dns_resolver | ||
dsa | ||
ethernet | ||
ieee802154 | ||
ipv4 | ||
ipv6 | ||
ipx | ||
irda | ||
iucv | ||
key | ||
l2tp | ||
lapb | ||
llc | ||
mac80211 | ||
mac802154 | ||
mpls | ||
netfilter | ||
netlabel | ||
netlink | ||
netrom | ||
nfc | ||
openvswitch | ||
packet | ||
phonet | ||
rds | ||
rfkill | ||
rose | ||
rxrpc | ||
sched | ||
sctp | ||
sunrpc | ||
tipc | ||
unix | ||
vmw_vsock | ||
wimax | ||
wireless | ||
x25 | ||
xfrm | ||
Kconfig | -rw-r--r-- | 11.5 KB |
Makefile | -rw-r--r-- | 2.0 KB |
compat.c | -rw-r--r-- | 24.8 KB |
nonet.c | -rw-r--r-- | 552 bytes |
socket.c | -rw-r--r-- | 84.0 KB |
sysctl_net.c | -rw-r--r-- | 2.8 KB |
Computing file changes ...