linux_dsm_epyc7002/include/asm-generic
Will Deacon ec6931b281 word-at-a-time: avoid undefined behaviour in zero_bytemask macro
The asm-generic, big-endian version of zero_bytemask creates a mask of
bytes preceding the first zero-byte by left shifting ~0ul based on the
position of the first zero byte.

Unfortunately, if the first (top) byte is zero, the output of
prep_zero_mask has only the top bit set, resulting in undefined C
behaviour as we shift left by an amount equal to the width of the type.
As it happens, GCC doesn't manage to spot this through the call to fls(),
but the issue remains if architectures choose to implement their shift
instructions differently.

An example would be arch/arm/ (AArch32), where LSL Rd, Rn, #32 results
in Rd == 0x0, whilst on arch/arm64 (AArch64) LSL Xd, Xn, #64 results in
Xd == Xn.

Rather than check explicitly for the problematic shift, this patch adds
an extra shift by 1, replacing fls with __fls. Since zero_bytemask is
never called with a zero argument (has_zero() is used to check the data
first), we don't need to worry about calling __fls(0), which is
undefined.

Cc: <stable@vger.kernel.org>
Cc: Victor Kamensky <victor.kamensky@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2014-04-27 15:20:05 -07:00
..
bitops bitops: Fix signedness of compile-time hweight implementations 2014-02-09 13:39:26 +01:00
4level-fixup.h
atomic64.h
atomic-long.h
atomic.h
audit_change_attr.h audit: Modify a set of system calls in audit class definitions 2014-01-17 17:01:46 -05:00
audit_dir_write.h
audit_read.h
audit_signal.h
audit_write.h audit: Modify a set of system calls in audit class definitions 2014-01-17 17:01:46 -05:00
barrier.h arch: Introduce smp_load_acquire(), smp_store_release() 2014-01-12 10:37:17 +01:00
bitops.h
bitsperlong.h
bug.h bug: Make BUG() always stop the machine 2014-04-07 16:36:10 -07:00
bugs.h
cache.h
cacheflush.h
checksum.h
clkdev.h
cmpxchg-local.h LLVMLinux: Remove warning about returning an uninitialized variable 2014-04-09 13:44:35 -07:00
cmpxchg.h
cputime_jiffies.h cputime: Bring cputime -> nsecs conversion 2014-03-13 15:56:44 +01:00
cputime_nsecs.h cputime: Bring cputime -> nsecs conversion 2014-03-13 15:56:44 +01:00
cputime.h
current.h
delay.h
device.h
div64.h
dma-coherent.h
dma-mapping-broken.h
dma-mapping-common.h
dma.h
early_ioremap.h mm: create generic early_ioremap() support 2014-04-07 16:36:15 -07:00
emergency-restart.h
exec.h
fb.h
fixmap.h add generic fixmap.h 2014-01-23 16:36:54 -08:00
ftrace.h
futex.h
getorder.h
gpio.h gpio: make gpiod_direction_output take a logical value 2014-02-07 09:47:02 +01:00
hardirq.h
hash.h lib: hash: follow-up fixups for arch hash 2013-12-19 00:14:53 -05:00
hugetlb.h
hw_irq.h
ide_iops.h
int-ll64.h
io-64-nonatomic-hi-lo.h
io-64-nonatomic-lo-hi.h
io.h Kconfig: rename HAS_IOPORT to HAS_IOPORT_MAP 2014-04-07 16:36:11 -07:00
ioctl.h
iomap.h Kconfig: rename HAS_IOPORT to HAS_IOPORT_MAP 2014-04-07 16:36:11 -07:00
irq_regs.h
irq.h
irqflags.h
Kbuild.asm
kdebug.h
kmap_types.h
kvm_para.h
libata-portmap.h
linkage.h
local64.h
local.h
mcs_spinlock.h locking/mcs: Allow architecture specific asm files to be used for contended case 2014-02-09 21:18:52 +01:00
memory_model.h
mm_hooks.h
mmu_context.h
mmu.h
module.h
mutex-dec.h
mutex-null.h
mutex-xchg.h
mutex.h
page.h
param.h
parport.h
pci_iomap.h
pci-bridge.h
pci-dma-compat.h
pci.h
percpu.h percpu: add raw_cpu_ops 2014-04-07 16:36:13 -07:00
pgalloc.h
pgtable-nopmd.h
pgtable-nopud.h
pgtable.h mm: use paravirt friendly ops for NUMA hinting ptes 2014-04-18 16:40:09 -07:00
preempt.h sched: Remove PREEMPT_NEED_RESCHED from generic code 2013-12-11 15:52:32 +01:00
ptrace.h
resource.h
rtc.h
rwsem.h asm-generic: rwsem: de-PPCify rwsem.h 2014-03-14 18:02:08 +00:00
scatterlist.h
sections.h
segment.h
serial.h
siginfo.h constify copy_siginfo_to_user{,32}() 2013-11-09 00:16:29 -05:00
signal.h
simd.h
sizes.h
spinlock.h
statfs.h
string.h
switch_to.h
syscall.h syscall_get_arch: remove useless function arguments 2014-03-20 10:11:59 -04:00
syscalls.h
termios-base.h
termios.h
timex.h
tlb.h
tlbflush.h
topology.h
trace_clock.h
uaccess-unaligned.h
uaccess.h asm-generic: uaccess: Spelling s/a ny/any/ 2014-01-02 10:45:23 +01:00
unaligned.h
unistd.h
user.h
vga.h
vmlinux.lds.h ARM: SoC specific changes 2014-04-05 14:19:54 -07:00
vtime.h
word-at-a-time.h word-at-a-time: avoid undefined behaviour in zero_bytemask macro 2014-04-27 15:20:05 -07:00
xor.h