android_kernel_xiaomi_sm8350/include/asm-arm
Nicolas Pitre 02828845dd [ARM] 4016/1: prefetch macro is wrong wrt gcc's "delete-null-pointer-checks"
optimization

The gcc manual says:

|`-fdelete-null-pointer-checks'
|     Use global dataflow analysis to identify and eliminate useless
|     checks for null pointers.  The compiler assumes that dereferencing
|     a null pointer would have halted the program.  If a pointer is
|     checked after it has already been dereferenced, it cannot be null.
|     Enabled at levels `-O2', `-O3', `-Os'.

Now the problem can be seen with this test case:

#include <linux/prefetch.h>
extern void bar(char *x);
void foo(char *x)
{
	prefetch(x);
	if (x)
		bar(x);
}

Because the constraint to the inline asm used in the prefetch() macro is
a memory operand, gcc assumes that the asm code does dereference the
pointer and the delete-null-pointer-checks optimization kicks in.
Inspection of generated assembly for the above example shows that bar()
is indeed called unconditionally without any test on the value of x.

Of course in the prefetch case there is no real dereference and it
cannot be assumed that a null pointer would have been caught at that
point. This causes kernel oopses with constructs like
hlist_for_each_entry() where the list's 'next' content is prefetched
before the pointer is tested against NULL, and only when gcc feels like
applying this optimization which doesn't happen all the time with more
complex code.

It appears that the way to prevent delete-null-pointer-checks
optimization to occur in this case is to make prefetch() into a static
inline function instead of a macro. At least this is what is done on
x86_64 where a similar inline asm memory operand is used (I presume they
would have seen the same problem if it didn't work) and resulting code
for the above example confirms that.

An alternative would consist of replacing the memory operand by a
register operand containing the pointer, and use the addressing mode
explicitly in the asm template. But that would be less optimal than an
offsettable memory reference.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2006-12-13 18:30:20 +00:00
..
arch-aaec2000 [ARM] Clean up discontigmem support 2006-11-30 22:52:28 +00:00
arch-at91rm9200 [ARM] 3977/1: AT91: remove loop waiting for reset 2006-12-04 14:37:42 +00:00
arch-cl7500 Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
arch-clps711x [ARM] Clean up discontigmem support 2006-11-30 22:52:28 +00:00
arch-ebsa110 [ARM] ebsa110: fix warnings generated by asm/arch/io.h 2006-11-20 15:59:10 +00:00
arch-ebsa285 fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-ep93xx [PATCH] Cirrus Logic ep93xx ethernet driver 2006-09-22 20:13:23 -04:00
arch-h720x fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-imx [ARM] 3991/1: i.MX/MX1 high resolution time source 2006-12-07 16:24:16 +00:00
arch-integrator [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-iop13xx [ARM] 3995/1: iop13xx: add iop13xx support 2006-12-07 17:20:21 +00:00
arch-iop32x [ARM] 3851/1: iop3xx: add io-data glantank support 2006-09-25 10:34:02 +01:00
arch-iop33x [ARM] 3832/1: iop3xx: coding style cleanup 2006-09-25 10:25:53 +01:00
arch-ixp4xx Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm 2006-12-07 15:40:39 -08:00
arch-ixp23xx [ARM] 3662/1: ixp23xx: don't include asm/hardware.h in uncompress.h 2006-06-28 17:54:56 +01:00
arch-ixp2000 [ARM] Fix decompressor serial IO to give CRLF not LFCR 2006-03-28 10:24:33 +01:00
arch-l7200 [ARM] Remove "translated" io macros 2006-11-30 14:39:14 +00:00
arch-lh7a40x [ARM] Clean up discontigmem support 2006-11-30 22:52:28 +00:00
arch-netx [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-omap WorkQueue: Fix up arch-specific work items where possible 2006-12-05 19:36:26 +00:00
arch-pnx4008 Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
arch-pxa [ARM] Merge individual ARM sub-trees 2006-12-07 23:07:26 +00:00
arch-realview [ARM] 3631/1: Remove legacy __mem_isa() definitions 2006-06-24 10:34:48 +01:00
arch-rpc [ARM] Move FLUSH_BASE macros to asm/arch/memory.h 2006-04-07 13:22:21 +01:00
arch-s3c2410 [ARM] 4004/1: S3C24XX: UDC remove implict addition of VA to regs 2006-12-08 16:05:53 +00:00
arch-sa1100 [ARM] Merge individual ARM sub-trees 2006-12-07 23:07:26 +00:00
arch-shark fix file specification in comments 2006-10-03 23:01:26 +02:00
arch-versatile [PATCH] arm-versatile iomem annotations 2006-10-11 11:17:06 -07:00
hardware Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
mach [ARM] Remove compatibility layer for ARM irqs 2006-11-30 12:24:47 +00:00
a.out.h
apm.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
assembler.h [ARM] Remove MODE_(SVC|IRQ|FIQ|USR) and DEFAULT_FIQ 2006-06-25 12:01:48 +01:00
atomic.h [ARM] 3810/1: switch atomic helpers over to raw_local_irq_{save,restore} 2006-09-25 10:25:24 +01:00
auxvec.h
bitops.h [ARM] 3852/1: convert atomic bitops and __xchg over to raw_local_irq_{save,restore} 2006-09-25 10:34:03 +01:00
bug.h [ARM] 3983/2: remove unused argument to __bug() 2006-12-07 22:38:09 +00:00
bugs.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
byteorder.h [ARM] Fix byte order macros for Thumb 2006-06-19 15:35:36 +01:00
cache.h
cacheflush.h [ARM] Use CPU_CACHE_* where possible in asm/cacheflush.h 2006-09-27 18:00:35 +01:00
checksum.h [NET]: ARM checksum annotations and cleanups. 2006-12-02 21:23:15 -08:00
cnt32_to_63.h [ARM] 3978/1: macro to provide a 63-bit value from a 32-bit hardware counter 2006-12-07 16:06:45 +00:00
cpu-multi32.h [ARM] Unuse another Linux PTE bit 2006-12-13 14:34:43 +00:00
cpu-single.h [ARM] Unuse another Linux PTE bit 2006-12-13 14:34:43 +00:00
cpu.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
cputime.h
current.h
delay.h
device.h Driver core: add dev_archdata to struct device 2006-12-01 14:52:01 -08:00
div64.h [ARM] 3611/4: optimize do_div() when divisor is constant 2006-12-07 16:06:09 +00:00
dma-mapping.h [PATCH] Add struct dev pointer to dma_is_consistent() 2006-12-07 08:39:41 -08:00
dma.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
domain.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
dyntick.h [ARM] 3692/1: ARM: coswitch irq handling to the generic implementation 2006-07-01 22:30:09 +01:00
ecard.h
elf.h [ARM] 3881/4: xscale: clean up cp0/cp1 handling 2006-12-03 17:52:22 +00:00
emergency-restart.h
errno.h
fcntl.h
fiq.h
flat.h [ARM] nommu: create flat.h to support uClinux flat binaries 2006-09-20 14:58:35 +01:00
floppy.h [PATCH] ARM: fixup irqflags breakage after ARM genirq merge 2006-07-02 17:29:22 -07:00
fpstate.h [ARM] 3370/2: ep93xx: add crunch support 2006-06-28 17:55:01 +01:00
futex.h
glue.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
hardirq.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
hardware.h
hw_irq.h [PATCH] misc arm pt_regs fixes 2006-10-08 12:32:36 -07:00
ide.h
io.h [ARM] Remove warnings for __io_pci and __arch_(get|put)* 2006-11-30 14:36:29 +00:00
ioctl.h
ioctls.h
ipc.h
ipcbuf.h
irq_regs.h Initial blind fixup for arm for irq changes 2006-10-06 10:59:54 -07:00
irq.h [ARM] 3692/1: ARM: coswitch irq handling to the generic implementation 2006-07-01 22:30:09 +01:00
irqflags.h [ARM] Add ARM irqtrace support 2006-09-20 14:58:35 +01:00
Kbuild Add empty Kbuild files for 'make headers_install' in remaining arches. 2006-06-18 12:58:53 +01:00
kmap_types.h
leds.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
limits.h
linkage.h
local.h
locks.h
mc146818rtc.h
memory.h [ARM] Clean up discontigmem support 2006-11-30 22:52:28 +00:00
mman.h
mmu_context.h [ARM] Add section support to ioremap 2006-06-29 22:14:30 +01:00
mmu.h [ARM] Add section support to ioremap 2006-06-29 22:14:30 +01:00
mmzone.h
module.h
msgbuf.h
mtd-xip.h
mutex.h
namei.h
nwflash.h
page-nommu.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
page.h Merge master.kernel.org:/pub/scm/linux/kernel/git/tmlind/linux-omap-upstream into devel 2006-09-27 19:57:54 +01:00
param.h
parport.h
pci.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
percpu.h
pgalloc.h [ARM] nommu: adjust headers for !MMU ARM systems 2006-06-28 17:59:45 +01:00
pgtable-hwdef.h [ARM] Set bit 4 on section mappings correctly depending on CPU 2006-06-29 18:24:21 +01:00
pgtable-nommu.h [ARM] Fix nommu build 2006-11-30 13:53:54 +00:00
pgtable.h [ARM] Unuse another Linux PTE bit 2006-12-13 14:34:43 +00:00
poll.h
posix_types.h
proc-fns.h [ARM] nommu: add ARM946E-S core support 2006-09-27 17:39:19 +01:00
processor.h [ARM] 4016/1: prefetch macro is wrong wrt gcc's "delete-null-pointer-checks" 2006-12-13 18:30:20 +00:00
procinfo.h [ARM] Move HWCAP_* definitions to asm/elf.h 2006-11-30 12:24:46 +00:00
ptrace.h [ARM] 3665/1: crunch: add ptrace support 2006-06-28 17:55:00 +01:00
resource.h
rtc.h [PATCH] RTC subsystem: ARM cleanup 2006-03-27 08:44:50 -08:00
scatterlist.h
sections.h
segment.h
semaphore-helper.h
semaphore.h
sembuf.h
serial.h
setup.h [PATCH] cleanup asm/setup.h userspace visibility 2006-12-07 08:39:46 -08:00
shmbuf.h
shmparam.h
sigcontext.h
siginfo.h
signal.h [PATCH] ARM: fixup irqflags breakage after ARM genirq merge 2006-07-02 17:29:22 -07:00
sizes.h
smp.h Don't include linux/config.h from anywhere else in include/ 2006-04-26 12:56:16 +01:00
socket.h [AF_UNIX]: Datagram getpeersec 2006-06-29 16:58:06 -07:00
sockios.h
spinlock_types.h
spinlock.h [PATCH] Directed yield: cpu_relax variants for spinlocks and rw-locks 2006-10-01 00:39:21 -07:00
stat.h
statfs.h
string.h
suspend.h
system.h [ARM] Handle HWCAP_VFP in VFP support code 2006-12-08 16:05:26 +00:00
termbits.h
termios.h
therm.h
thread_info.h [ARM] 3911/2: Simplify alloc_thread_info on ARM 2006-11-30 15:27:03 +00:00
thread_notify.h [ARM] Add thread_notify infrastructure 2006-06-22 10:24:18 +01:00
timex.h
tlb.h
tlbflush.h [ARM] 3759/2: Remove uses of %? 2006-09-20 14:58:35 +01:00
topology.h
traps.h
types.h
uaccess.h [ARM] Add __must_check to uaccess functions 2006-10-28 10:15:31 +01:00
ucontext.h [ARM] 3664/1: crunch: add signal frame save/restore 2006-06-28 17:54:59 +01:00
unaligned.h [ARM] 3849/1: fix get_unaligned() for gcc >= 4.1 2006-09-25 10:34:00 +01:00
unistd.h [ARM] Add sys_*at syscalls 2006-12-09 16:41:55 +00:00
user.h
vfp.h
vfpmacros.h [ARM] 3472/1: Use the D variants of FLDMIA/FSTMIA on ARMv6 2006-04-10 21:32:42 +01:00
vga.h [PATCH] vgacon: make VGA_MAP_MEM take size, remove extra use 2006-06-22 15:05:58 -07:00
xor.h