linux-sg2042/arch/mips/include/asm
Paul Burton 133d68e0ed MIPS: Fix cmpxchg on 32b signed ints for 64b kernel with !kernel_uses_llsc
Commit 8263db4d77 ("MIPS: cmpxchg: Implement __cmpxchg() as a
function") refactored our implementation of __cmpxchg() to be a function
rather than a macro, with the aim of making it easier to read & modify.
Unfortunately the commit breaks use of cmpxchg() for signed 32 bit
values when we have a 64 bit kernel with kernel_uses_llsc == false,
because:

 - In cmpxchg_local() we cast the old value to the type the pointer
   points to, and then to an unsigned long. If the pointer points to a
   signed type smaller than 64 bits then the old value will be sign
   extended to 64 bits. That is, bits beyond the size of the pointed to
   type will be set to 1 if the old value is negative. In the case of a
   signed 32 bit integer with a negative value, bits 63:32 will all be
   set.

 - In __cmpxchg_asm() we load the value from memory, ie. dereference the
   pointer, and store the value as an unsigned integer (__ret) whose
   size matches the pointer. For a 32 bit cmpxchg() this means we store
   the value in a u32, because the pointer provided to __cmpxchg_asm()
   by __cmpxchg() is of type volatile u32 *.

 - __cmpxchg_asm() then checks whether the value in memory (__ret)
   matches the provided old value, by comparing the two values. This
   results in the u32 being promoted to a 64 bit unsigned long to match
   the old argument - however because both types are unsigned the value
   is zero extended, which does not match the sign extension performed
   on the old value in cmpxchg_local() earlier.

This mismatch means that unfortunate cmpxchg() calls can incorrectly
fail for 64 bit kernels with kernel_uses_llsc == false. This is the case
on at least non-SMP Cavium Octeon kernels, which hardcode
kernel_uses_llsc in their cpu-feature-overrides.h header. Using a
v4.13-rc7 kernel configured using cavium_octeon_defconfig with SMP
manually disabled, this presents itself as oddity when we reach
userland - for example:

  can't run '/bin/mount': Text file busy
  can't run '/bin/mkdir': Text file busy
  can't run '/bin/mkdir': Text file busy
  can't run '/bin/mount': Text file busy
  can't run '/bin/hostname': Text file busy
  can't run '/etc/init.d/rcS': Text file busy
  can't run '/sbin/getty': Text file busy
  can't run '/sbin/getty': Text file busy

It appears that some part of the init process, which is in this case
buildroot's busybox init, is running successfully. It never manages to
reach the login prompt though, and complains about /sbin/getty being
busy repeatedly and indefinitely.

Fix this by casting the old value provided to __cmpxchg_asm() to an
appropriately sized unsigned integer, such that we consistently
zero-extend avoiding the mismatch. The __cmpxchg_small() case for 8 & 16
bit values is unaffected because __cmpxchg_small() already masks
provided values appropriately.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Fixes: 8263db4d77 ("MIPS: cmpxchg: Implement __cmpxchg() as a function")
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/17226/
Cc: linux-mips@linux-mips.org
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
2017-10-09 16:31:32 +02:00
..
dec
emma
fw MIPS: Malta: Remove fw_memblock_t abstraction 2015-11-11 08:35:45 +01:00
ip32
lasat
mach-ar7 MIPS: Remove all the uses of custom gpio.h 2015-09-03 12:08:02 +02:00
mach-ath25 MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-ath79 irqchip/ath79-cpu: Move the CPU IRQ driver from arch/mips/ath79/ 2016-02-17 13:47:19 +00:00
mach-au1x00 MIPS: Alchemy: update cpu feature overrides 2017-08-29 15:21:53 +02:00
mach-bcm47xx MIPS: BCM47XX: Add Luxul devices to the database 2017-01-25 02:51:12 +01:00
mach-bcm63xx MIPS: BCM63XX: fix ENETDMA_6345_MAXBURST_REG offset 2017-09-06 12:25:56 +02:00
mach-bmips MIPS: BMIPS: Add BCM6358 support 2016-05-13 14:02:09 +02:00
mach-cavium-octeon MIPS: Octeon: Expose support for mips32r1, mips32r2 and mips64r1 2017-08-29 15:21:52 +02:00
mach-cobalt MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-db1x00
mach-dec MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-emma2rh
mach-generic MIPS: generic: Set RTC_ALWAYS_BCD to 0 2017-06-28 12:22:41 +02:00
mach-ip22 MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-ip27 MIPS: NUMA: Remove the unused parent_node() macro 2017-08-29 15:21:51 +02:00
mach-ip28 MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-ip32 MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-jazz
mach-jz4740 mtd: nand: Rename nand.h into rawnand.h 2017-08-13 10:11:49 +02:00
mach-lantiq MIPS: lantiq: remove ltq_reset_cause() and ltq_boot_select() 2017-09-04 21:19:02 +02:00
mach-lasat
mach-loongson32 MIPS: Loongson1: Add watchdog support for Loongson1 board 2017-01-03 16:34:42 +01:00
mach-loongson64 MIPS: NUMA: Remove the unused parent_node() macro 2017-08-29 15:21:51 +02:00
mach-malta MIPS: Add definitions of SegCtl registers and use them 2016-05-28 12:35:04 +02:00
mach-netlogic MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-paravirt MIPS: paravirt: Fix undefined reference to smp_bootstrap 2016-09-13 16:45:15 +02:00
mach-pic32 MIPS: Add support for PIC32MZDA platform 2016-01-24 02:53:28 +01:00
mach-pistachio MIPS: Remove all the uses of custom gpio.h 2015-09-03 12:08:02 +02:00
mach-pmcs-msp71xx
mach-pnx833x
mach-ralink MIPS: ralink: Fix build error due to missing header 2017-07-18 23:59:18 +02:00
mach-rc32434 MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-rm MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-sibyte MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-tx39xx
mach-tx49xx MIPS16e2: Provide feature overrides for non-MIPS16 systems 2017-07-11 14:13:06 +02:00
mach-vr41xx
mach-xilfpga MIPS: xilfpga: Add mipsfpga platform code 2015-11-11 08:38:44 +01:00
mips-boards irqchip: mips-gic: Move various definitions to the driver 2017-09-04 13:53:14 +02:00
netlogic MIPS: SMP: Constify smp ops 2017-08-29 15:21:50 +02:00
octeon MIPS: Octeon: Allow access to CIU3 IRQ domains. 2017-09-04 21:19:03 +02:00
pci MIPS: Fix misspellings in comments. 2016-04-03 12:32:09 +02:00
sgi MIPS: IP22/IP28: Fix typo 2016-05-28 12:35:08 +02:00
sibyte MIPS: BCM1480: bcm1480_regs.h: strip redundant comments 2016-05-13 14:02:13 +02:00
sn MIPS: Fix misspellings in comments. 2016-04-03 12:32:09 +02:00
txx9
vr41xx
xtalk
Kbuild MIPS: Use queued spinlocks (qspinlock) 2017-06-29 02:42:26 +02:00
abi.h signals: Prepare to split out <linux/signal_types.h> from <linux/signal.h> 2017-03-02 08:42:37 +01:00
addrspace.h MIPS: Adjust MIPS64 CAC_BASE to reflect Config.K0 2016-10-06 18:02:35 +02:00
amon.h
arch_hweight.h
asm-eva.h
asm-offsets.h
asm-prototypes.h MIPS: Fix modversioning of _mcount symbol 2017-04-12 15:13:53 +02:00
asm.h MIPS: Add DWARF unwinding to assembly 2017-09-06 11:01:52 +02:00
asmmacro-32.h
asmmacro-64.h
asmmacro.h MIPS: Add a missing ".set pop" in an early commit 2016-09-13 17:25:11 +02:00
atomic.h locking/atomic, arch/mips: Convert to _relaxed atomics 2016-06-16 10:48:34 +02:00
barrier.h MIPS: Barrier: Add definitions of SYNC stype values 2016-10-04 16:13:57 +02:00
bcache.h MIPS: Introduce API for enabling & disabling L2 prefetch 2015-10-26 09:49:41 +01:00
bitops.h MIPS: Move definitions for 32/64-bit agonstic inline assembler to new file. 2016-05-09 12:00:05 +02:00
bitrev.h MIPS: Implement __arch_bitrev* using bitswap for MIPSr6 2016-05-13 14:02:17 +02:00
bmips-spaces.h
bmips.h MIPS: SMP: Constify smp ops 2017-08-29 15:21:50 +02:00
bootinfo.h MIPS: platform: Allow for DTB to be moved during kernel relocation 2017-01-03 16:34:45 +01:00
branch.h MIPS: Fix unaligned PC interpretation in `compute_return_epc' 2017-06-29 02:42:26 +02:00
break.h
bug.h
bugs.h
cache.h Revert "MIPS: Don't unnecessarily include kmalloc.h into <asm/cache.h>." 2017-08-07 12:01:17 +02:00
cacheflush.h MIPS: c-r4k: Split user/kernel flush_icache_range() 2016-10-04 16:13:57 +02:00
cacheops.h MIPS: Loongson: Add Loongson-3A R2 basic support 2016-05-13 14:02:14 +02:00
cdmm.h MIPS: CDMM: Add builtin_mips_cdmm_driver() macro 2015-11-05 11:15:41 +01:00
cevt-r4k.h MIPS: cevt-r4k: Migrate to new 'set-state' interface 2015-09-03 12:07:52 +02:00
checksum.h new helper: uaccess_kernel() 2017-03-28 16:43:25 -04:00
clock.h
clocksource.h MIPS: VDSO: Add implementations of gettimeofday() and clock_gettime() 2015-11-11 08:36:41 +01:00
cmp.h
cmpxchg.h MIPS: Fix cmpxchg on 32b signed ints for 64b kernel with !kernel_uses_llsc 2017-10-09 16:31:32 +02:00
compat-signal.h Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
compat.h MIPS: Clean up compat_siginfo_t 2015-11-12 11:35:47 +01:00
compiler.h
cop2.h
cpu-features.h MIPS: Introduce cpu_tcache_line_size 2017-08-08 00:02:27 +02:00
cpu-info.h MIPS: Add CPU cluster number accessors 2017-08-30 00:57:27 +02:00
cpu-type.h MIPS: Remove unused R6000 support 2017-08-29 15:21:51 +02:00
cpu.h MIPS: Remove unused R6000 support 2017-08-29 15:21:51 +02:00
cpufeature.h MIPS: Enable GENERIC_CPU_AUTOPROBE 2017-04-10 11:56:04 +02:00
debug.h MIPS: Declare mips_debugfs_dir in a header 2015-10-26 09:49:42 +01:00
delay.h
device.h treewide: Move dma_ops from struct dev_archdata into struct device 2017-01-24 12:23:35 -05:00
div64.h
dma-coherence.h MIPS: Support per-device DMA coherence 2016-10-06 18:02:01 +02:00
dma-mapping.h treewide: Consolidate get_dma_ops() implementations 2017-01-24 12:23:35 -05:00
dma.h
ds1287.h
dsemul.h MIPS: Use per-mm page to execute branch delay slot instructions 2016-08-02 09:28:53 +02:00
dsp.h
edac.h
elf.h sched/headers: Prepare to remove the <linux/mm_types.h> dependency from <linux/sched.h> 2017-03-02 08:42:37 +01:00
errno.h
eva.h
exec.h
extable.h mips: separate extable.h, switch module.h to it 2016-10-05 18:36:18 -04:00
fb.h
fixmap.h
floppy.h MIPS: Don't use dma_cache_sync to implement fd_cacheflush 2017-08-30 00:57:29 +02:00
fpregdef.h
fpu.h Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2017-04-06 13:16:34 -07:00
fpu_emulator.h MIPS: math-emu: Add FP emu debugfs stats for individual instructions 2017-08-29 15:21:57 +02:00
ftrace.h
futex.h futex: Remove duplicated code and fix undefined behaviour 2017-08-25 22:49:59 +02:00
gio_device.h
gt64120.h
hardirq.h
hazards.h MIPS: hazards.h: Fix typo 2016-05-28 12:35:06 +02:00
highmem.h MIPS: highmem: ensure that we don't use more than one page for PTEs 2017-06-08 14:51:58 +02:00
hpet.h
hugetlb.h
hw_irq.h
i8259.h MIPS: IRQ: Remove useless i8259_of_init() prototype. 2017-01-03 16:34:48 +01:00
ide.h
idle.h
inst.h
io.h MIPS: Add __ioread64_copy 2017-09-04 13:53:14 +02:00
irq.h MIPS: Fix minimum alignment requirement of IRQ stack 2017-07-11 14:13:06 +02:00
irq_cpu.h
irq_gt641xx.h
irq_regs.h MIPS: Select CONFIG_HANDLE_DOMAIN_IRQ and make it work. 2016-05-13 14:01:40 +02:00
irqflags.h MIPS: Loongson-3: Introduce CONFIG_LOONGSON3_ENHANCEMENT 2016-05-13 14:02:15 +02:00
isadep.h
jazz.h
jazzdma.h
jump_label.h locking/static_keys: Add a new static_key interface 2015-08-03 11:34:15 +02:00
kdebug.h MIPS: Add uprobes support. 2015-09-03 12:08:05 +02:00
kexec.h mips/panic: replace smp_send_stop() with kdump friendly version in panic path 2016-10-11 15:06:32 -07:00
kgdb.h
kmap_types.h
kprobes.h MIPS: kprobes: flush_insn_slot should flush only if probe initialised 2017-06-08 15:42:05 +02:00
kvm_host.h KVM: update to new mmu_notifier semantic v2 2017-08-31 16:13:00 -07:00
kvm_para.h
linkage.h MIPS: Remove "__weak" definition from arch-specific linkage.h 2015-09-03 12:07:39 +02:00
llsc.h MIPS: Move definitions for 32/64-bit agonstic inline assembler to new file. 2016-05-09 12:00:05 +02:00
local.h
m48t37.h
maar.h MIPS: Separate MAAR V bit into VL and VH for XPA 2017-03-28 14:49:01 +01:00
machine.h MIPS: generic: Abstract FDT fixup application 2017-06-28 12:22:41 +02:00
mc146818-time.h
mc146818rtc.h
mips-cm.h MIPS: CPS: Cluster support for topology functions 2017-08-30 00:57:28 +02:00
mips-cpc.h MIPS: CPS: Have asm/mips-cps.h include CM & CPC headers 2017-08-30 00:57:27 +02:00
mips-cps.h MIPS: GIC: Introduce asm/mips-gic.h with accessor functions 2017-08-30 14:03:40 +02:00
mips-gic.h irqchip: mips-gic: Move gic_get_c0_*_int() to asm/mips-gic.h 2017-09-04 13:53:14 +02:00
mips-r2-to-r6-emul.h MIPS: traps: Correct the SIGTRAP debug ABI in `do_watch' and `do_trap_or_bp' 2016-04-03 12:32:09 +02:00
mips_machine.h
mips_mt.h MIPS: MT: Fix typo 2016-05-28 12:35:07 +02:00
mipsmtregs.h
mipsprom.h
mipsregs.h MIPS: Fix input modify in __write_64bit_c0_split() 2017-09-21 16:26:42 +02:00
mmu.h MIPS: Use per-mm page to execute branch delay slot instructions 2016-08-02 09:28:53 +02:00
mmu_context.h sched/headers: Prepare to remove the <linux/mm_types.h> dependency from <linux/sched.h> 2017-03-02 08:42:37 +01:00
mmzone.h
module.h MIPS: Remove unused R6000 support 2017-08-29 15:21:51 +02:00
msa.h MIPS: Fix MSA asm warnings in control reg accessors 2016-07-24 12:45:00 +02:00
msc01_ic.h
nile4.h
paccess.h
page.h treewide: replace config_enabled() with IS_ENABLED() (2nd round) 2016-08-26 17:39:35 -07:00
pci.h MIPS: PCI: Remove unused busn_offset 2017-05-18 15:39:19 -05:00
perf_event.h
pgalloc.h MIPS: do not use __GFP_REPEAT for order-0 request 2017-07-12 16:26:03 -07:00
pgtable-32.h MIPS: mm: adjust PKMAP location 2017-06-08 14:51:58 +02:00
pgtable-64.h MIPS: Add 48-bit VA space (and 4-level page tables) for 4K pages. 2017-04-10 11:56:06 +02:00
pgtable-bits.h MIPS: Allow RIXI to be used on non-R2 or R6 cores 2016-05-13 15:30:25 +02:00
pgtable.h mm: move phys_mem_access_prot_allowed() declaration to pgtable.h 2016-10-07 18:46:29 -07:00
pm-cps.h MIPS: pm-cps: Add MIPSr6 CPU support 2016-10-04 16:13:57 +02:00
pm.h
pmon.h
prefetch.h
processor.h locking/core: Provide common cpu_relax_yield() definition 2016-11-17 08:17:36 +01:00
prom.h
ptrace.h MIPS: ptrace: Fix regs_return_value for kernel context 2016-10-12 14:34:45 +02:00
r4k-timer.h
r4kcache.h new helper: uaccess_kernel() 2017-03-28 16:43:25 -04:00
reboot.h
reg.h
regdef.h
rtlx.h
seccomp.h tree-wide: replace config_enabled() with IS_ENABLED() 2016-08-04 08:50:07 -04:00
setup.h MIPS: KVM: Don't hardcode restored HWREna 2016-06-15 23:58:31 +02:00
sgialib.h
sgiarcs.h MIPS: Fix misspellings in comments. 2016-04-03 12:32:09 +02:00
shmparam.h
sigcontext.h
signal.h Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus 2016-08-06 09:13:11 -04:00
sim.h
smp-cps.h MIPS: smp-cps: Pull boot config retrieval out of mips_cps_boot_vpes 2016-05-13 14:01:50 +02:00
smp-ops.h MIPS: CPS: Have asm/mips-cps.h include CM & CPC headers 2017-08-30 00:57:27 +02:00
smp.h MIPS: SMP: Constify smp ops 2017-08-29 15:21:50 +02:00
sni.h
socket.h
sparsemem.h
spinlock.h MIPS: Use queued spinlocks (qspinlock) 2017-06-29 02:42:26 +02:00
spinlock_types.h MIPS: Use queued spinlocks (qspinlock) 2017-06-29 02:42:26 +02:00
spram.h
stackframe.h MIPS: Add DWARF unwinding to assembly 2017-09-06 11:01:52 +02:00
stackprotector.h
stacktrace.h mips: Save all registers when saving the frame 2017-09-06 11:02:11 +02:00
string.h
switch_to.h MIPS: Cleanup LLBit handling in switch_to 2017-01-03 16:34:42 +01:00
syscall.h MIPS: Correct forced syscall errors 2017-07-11 14:13:06 +02:00
termios.h Replace <asm/uaccess.h> with <linux/uaccess.h> globally 2016-12-24 11:46:01 -08:00
thread_info.h MIPS: Remove r2_emul_return from struct thread_info 2017-01-03 16:34:41 +01:00
time.h MIPS: Remove "weak" from get_c0_compare_int() declaration 2015-09-03 12:07:38 +02:00
timex.h
tlb.h MIPS: asm/tlb.h: Add UNIQUE_GUEST_ENTRYHI() macro 2017-03-28 14:49:30 +01:00
tlbdebug.h MIPS: Refactor dumping of TLB registers for r3k/r4k 2015-09-03 12:07:45 +02:00
tlbex.h MIPS: Export some tlbex internals for KVM to use 2017-02-03 15:19:01 +00:00
tlbflush.h
tlbmisc.h
topology.h MIPS: Abstract CPU core & VP(E) ID access through accessor functions 2017-08-30 00:57:26 +02:00
traps.h
txx9irq.h
txx9pio.h
txx9tmr.h
types.h
uaccess.h Merge branch 'work.uaccess-unaligned' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2017-07-15 11:17:52 -07:00
uasm.h MIPS: Add some instructions to uasm. 2017-06-28 12:22:39 +02:00
unistd.h trim __ARCH_WANT_SYS_OLD_GETRLIMIT 2017-05-27 15:38:02 -04:00
uprobes.h uprobes: remove function declarations from arch/{mips,s390} 2016-10-07 18:46:30 -07:00
vdso.h MIPS: VDSO: Fix conversions in do_monotonic()/do_monotonic_coarse() 2017-06-29 02:42:29 +02:00
vga.h vga: optimise console scrolling 2017-09-08 18:26:48 -07:00
vpe.h MIPS: MT: Remove "weak" from vpe_run() declaration 2015-08-26 15:23:40 +02:00
war.h
watch.h MIPS: Fix watchpoint restoration 2016-05-09 12:00:02 +02:00
wbflush.h
yamon-dt.h MIPS: generic/yamon-dt: Support > 256MB of RAM 2017-06-28 12:22:41 +02:00