18 Oct, 2018

1 commit

  • commit ea7e0480a4b695d0aa6b3fa99bd658a003122113 upstream.

    When using the legacy mmap layout, for example triggered using ulimit -s
    unlimited, get_unmapped_area() fills memory from bottom to top starting
    from a fairly low address near TASK_UNMAPPED_BASE.

    This placement is suboptimal if the user application wishes to allocate
    large amounts of heap memory using the brk syscall. With the VDSO being
    located low in the user's virtual address space, the amount of space
    available for access using brk is limited much more than it was prior to
    the introduction of the VDSO.

    For example:

    # ulimit -s unlimited; cat /proc/self/maps
    00400000-004ec000 r-xp 00000000 08:00 71436 /usr/bin/coreutils
    004fc000-004fd000 rwxp 000ec000 08:00 71436 /usr/bin/coreutils
    004fd000-0050f000 rwxp 00000000 00:00 0
    00cc3000-00ce4000 rwxp 00000000 00:00 0 [heap]
    2ab96000-2ab98000 r--p 00000000 00:00 0 [vvar]
    2ab98000-2ab99000 r-xp 00000000 00:00 0 [vdso]
    2ab99000-2ab9d000 rwxp 00000000 00:00 0
    ...

    Resolve this by adjusting STACK_TOP to reserve space for the VDSO &
    providing an address hint to get_unmapped_area() causing it to use this
    space even when using the legacy mmap layout.

    We reserve enough space for the VDSO, plus 1MB or 256MB for 32 bit & 64
    bit systems respectively within which we randomize the VDSO base
    address. Previously this randomization was taken care of by the mmap
    base address randomization performed by arch_mmap_rnd(). The 1MB & 256MB
    sizes are somewhat arbitrary but chosen such that we have some
    randomization without taking up too much of the user's virtual address
    space, which is often in short supply for 32 bit systems.

    With this the VDSO is always mapped at a high address, leaving lots of
    space for statically linked programs to make use of brk:

    # ulimit -s unlimited; cat /proc/self/maps
    00400000-004ec000 r-xp 00000000 08:00 71436 /usr/bin/coreutils
    004fc000-004fd000 rwxp 000ec000 08:00 71436 /usr/bin/coreutils
    004fd000-0050f000 rwxp 00000000 00:00 0
    00c28000-00c49000 rwxp 00000000 00:00 0 [heap]
    ...
    7f67c000-7f69d000 rwxp 00000000 00:00 0 [stack]
    7f7fc000-7f7fd000 rwxp 00000000 00:00 0
    7fcf1000-7fcf3000 r--p 00000000 00:00 0 [vvar]
    7fcf3000-7fcf4000 r-xp 00000000 00:00 0 [vdso]

    Signed-off-by: Paul Burton
    Reported-by: Huacai Chen
    Fixes: ebb5e78cc634 ("MIPS: Initial implementation of a VDSO")
    Cc: Huacai Chen
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # v4.4+
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     

04 Oct, 2018

1 commit

  • [ Upstream commit 67e09db507db3e1642ddce512a4313d20addd6e5 ]

    As Documentation/kbuild/makefile.txt says, it is a typical mistake
    to forget the FORCE prerequisite for the rule invoked by if_changed.

    Add the FORCE to the prerequisite, but it must be filtered-out from
    the files passed to the 'cat' command. Because this rule generates
    .vmlinux.its.S.cmd, vmlinux.its.S must be specified as targets so
    that the .cmd file is included.

    Signed-off-by: Masahiro Yamada
    Patchwork: https://patchwork.linux-mips.org/patch/19097/
    Signed-off-by: Paul Burton
    Cc: Kees Cook
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Masahiro Yamada
     

26 Sep, 2018

3 commits

  • [ Upstream commit cd87668d601f622e0ebcfea4f78d116d5f572f4d ]

    The PCI_OHCI_INT_REG case in pci_ohci_read_reg() contains the following
    if statement:

    if ((lo & 0x00000f00) == CS5536_USB_INTR)

    CS5536_USB_INTR expands to the constant 11, which gives us the following
    condition which can never evaluate true:

    if ((lo & 0xf00) == 11)

    At least when using GCC 8.1.0 this falls foul of the tautoligcal-compare
    warning, and since the code is built with the -Werror flag the build
    fails.

    Fix this by shifting lo right by 8 bits in order to match the
    corresponding PCI_OHCI_INT_REG case in pci_ohci_write_reg().

    Signed-off-by: Paul Burton
    Patchwork: https://patchwork.linux-mips.org/patch/19861/
    Cc: Huacai Chen
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     
  • [ Upstream commit c6ea7e9747318e5a6774995f4f8e3e0f7c0fa8ba ]

    Having the zload address at 0x8060.0000 means the size of the
    uncompressed kernel cannot be bigger than around 6 MiB, as it is
    deflated at address 0x8001.0000.

    This limit is too small; a kernel with some built-in drivers and things
    like debugfs enabled will already be over 6 MiB in size, and so will
    fail to extract properly.

    To fix this, we bump the zload address from 0x8060.0000 to 0x8100.0000.

    This is fine, as all the boards featuring Ingenic JZ SoCs have at least
    32 MiB of RAM, and use u-boot or compatible bootloaders which won't
    hardcode the load address but read it from the uImage's header.

    Signed-off-by: Paul Cercueil
    Signed-off-by: Paul Burton
    Patchwork: https://patchwork.linux-mips.org/patch/19787/
    Cc: Ralf Baechle
    Cc: James Hogan
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Paul Cercueil
     
  • [ Upstream commit f8a7bfe1cb2c1ebfa07775c9c8ac0ad3ba8e5ff5 ]

    This patch disables irq on reboot to fix hang issues that were observed
    due to pending interrupts.

    Signed-off-by: Felix Fietkau
    Signed-off-by: John Crispin
    Signed-off-by: Paul Burton
    Patchwork: https://patchwork.linux-mips.org/patch/19913/
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Felix Fietkau
     

20 Sep, 2018

5 commits

  • [ Upstream commit d4da0e97baea8768b3d66ccef3967bebd50dfc3b ]

    If a driver causes DMA cache maintenance with a zero length then we
    currently BUG and kill the kernel. As this is a scenario that we may
    well be able to recover from, WARN & return in the condition instead.

    Signed-off-by: Paul Burton
    Acked-by: Florian Fainelli
    Patchwork: https://patchwork.linux-mips.org/patch/14623/
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     
  • [ Upstream commit 28ec2238f37e72a3a40a7eb46893e7651bcc40a6 ]

    of_find_compatible_node() returns a device_node pointer with refcount
    incremented and must be decremented explicitly.
    As this code is using the result only to check presence of the interrupt
    controller (!NULL) but not actually using the result otherwise the
    refcount can be decremented here immediately again.

    Signed-off-by: Nicholas Mc Guire
    Signed-off-by: Paul Burton
    Patchwork: https://patchwork.linux-mips.org/patch/19820/
    Cc: Ralf Baechle
    Cc: James Hogan
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Nicholas Mc Guire
     
  • [ Upstream commit b1259519e618d479ede8a0db5474b3aff99f5056 ]

    The call to of_find_node_by_name returns a node pointer with refcount
    incremented thus it must be explicitly decremented here after the last
    usage.

    Signed-off-by: Nicholas Mc Guire
    Signed-off-by: Paul Burton
    Patchwork: https://patchwork.linux-mips.org/patch/19558/
    Cc: Ralf Baechle
    Cc: James Hogan
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Nicholas Mc Guire
     
  • [ Upstream commit 0494d7ffdcebc6935410ea0719b24ab626675351 ]

    isa_virt_to_bus() & isa_bus_to_virt() claim to treat ISA bus addresses
    as being identical to physical addresses, but they fail to do so in the
    presence of a non-zero PHYS_OFFSET.

    Correct this by having them use virt_to_phys() & phys_to_virt(), which
    consolidates the calculations to one place & ensures that ISA bus
    addresses do indeed match physical addresses.

    Signed-off-by: Paul Burton
    Patchwork: https://patchwork.linux-mips.org/patch/20047/
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: Vladimir Kondratiev
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     
  • commit 0f02cfbc3d9e413d450d8d0fd660077c23f67eff upstream.

    When a system suffers from dcache aliasing a user program may observe
    stale VDSO data from an aliased cache line. Notably this can break the
    expectation that clock_gettime(CLOCK_MONOTONIC, ...) is, as its name
    suggests, monotonic.

    In order to ensure that users observe updates to the VDSO data page as
    intended, align the user mappings of the VDSO data page such that their
    cache colouring matches that of the virtual address range which the
    kernel will use to update the data page - typically its unmapped address
    within kseg0.

    This ensures that we don't introduce aliasing cache lines for the VDSO
    data page, and therefore that userland will observe updates without
    requiring cache invalidation.

    Signed-off-by: Paul Burton
    Reported-by: Hauke Mehrtens
    Reported-by: Rene Nielsen
    Reported-by: Alexandre Belloni
    Fixes: ebb5e78cc634 ("MIPS: Initial implementation of a VDSO")
    Patchwork: https://patchwork.linux-mips.org/patch/20344/
    Tested-by: Alexandre Belloni
    Tested-by: Hauke Mehrtens
    Cc: James Hogan
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # v4.4+
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     

05 Sep, 2018

5 commits

  • commit 690d9163bf4b8563a2682e619f938e6a0443947f upstream.

    Some versions of GCC suboptimally generate calls to the __multi3()
    intrinsic for MIPS64r6 builds, resulting in link failures due to the
    missing function:

    LD vmlinux.o
    MODPOST vmlinux.o
    kernel/bpf/verifier.o: In function `kmalloc_array':
    include/linux/slab.h:631: undefined reference to `__multi3'
    fs/select.o: In function `kmalloc_array':
    include/linux/slab.h:631: undefined reference to `__multi3'
    ...

    We already have a workaround for this in which we provide the
    instrinsic, but we do so selectively for GCC 7 only. Unfortunately the
    issue occurs with older GCC versions too - it has been observed with
    both GCC 5.4.0 & GCC 6.4.0.

    MIPSr6 support was introduced in GCC 5, so all major GCC versions prior
    to GCC 8 are affected and we extend our workaround accordingly to all
    MIPS64r6 builds using GCC versions older than GCC 8.

    Signed-off-by: Paul Burton
    Reported-by: Vladimir Kondratiev
    Fixes: ebabcf17bcd7 ("MIPS: Implement __multi3 for GCC7 MIPS64r6 builds")
    Patchwork: https://patchwork.linux-mips.org/patch/20297/
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # 4.15+
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     
  • commit a30718868915fbb991a9ae9e45594b059f28e9ae upstream.

    Linux expects that if a CPU modifies a memory location, then that
    modification will eventually become visible to other CPUs in the system.

    Loongson 3 CPUs include a Store Fill Buffer (SFB) which sits between a
    core & its L1 data cache, queueing memory accesses & allowing for faster
    forwarding of data from pending stores to younger loads from the core.
    Unfortunately the SFB prioritizes loads such that a continuous stream of
    loads may cause a pending write to be buffered indefinitely. This is
    problematic if we end up with 2 CPUs which each perform a store that the
    other polls for - one or both CPUs may end up with their stores buffered
    in the SFB, never reaching cache due to the continuous reads from the
    poll loop. Such a deadlock condition has been observed whilst running
    qspinlock code.

    This patch changes the definition of cpu_relax() to smp_mb() for
    Loongson-3, forcing a flush of the SFB on SMP systems which will cause
    any pending writes to make it as far as the L1 caches where they will
    become visible to other CPUs. If the kernel is not compiled for SMP
    support, this will expand to a barrier() as before.

    This workaround matches that currently implemented for ARM when
    CONFIG_ARM_ERRATA_754327=y, which was introduced by commit 534be1d5a2da
    ("ARM: 6194/1: change definition of cpu_relax() for ARM11MPCore").

    Although the workaround is only required when the Loongson 3 SFB
    functionality is enabled, and we only began explicitly enabling that
    functionality in v4.7 with commit 1e820da3c9af ("MIPS: Loongson-3:
    Introduce CONFIG_LOONGSON3_ENHANCEMENT"), existing or future firmware
    may enable the SFB which means we may need the workaround backported to
    earlier kernels too.

    [paul.burton@mips.com:
    - Reword commit message & comment.
    - Limit stable backport to v3.15+ where we support Loongson 3 CPUs.]

    Signed-off-by: Huacai Chen
    Signed-off-by: Paul Burton
    References: 534be1d5a2da ("ARM: 6194/1: change definition of cpu_relax() for ARM11MPCore")
    References: 1e820da3c9af ("MIPS: Loongson-3: Introduce CONFIG_LOONGSON3_ENHANCEMENT")
    Patchwork: https://patchwork.linux-mips.org/patch/19830/
    Cc: Ralf Baechle
    Cc: James Hogan
    Cc: linux-mips@linux-mips.org
    Cc: Fuxin Zhang
    Cc: Zhangjin Wu
    Cc: Huacai Chen
    Cc: stable@vger.kernel.org # v3.15+
    Signed-off-by: Greg Kroah-Hartman

    Huacai Chen
     
  • commit 344ebf09949c31bcb8818d8458b65add29f1d67b upstream.

    The VDSO Makefile filters CFLAGS to select a subset which it uses whilst
    building the VDSO ELF. One of the flags it allows through is the -march=
    flag that selects the architecture/ISA to target.

    Unfortunately in cases where CONFIG_CPU_MIPS32_R{1,2}=y and the
    toolchain defaults to building for MIPS64, the main MIPS Makefile ends
    up using the short-form - flags in cflags-y. This is because the
    calls to cc-option always fail to use the long-form -march= flag
    due to the lack of an -mabi= flag in KBUILD_CFLAGS at the point
    where the cc-option function is executed. The resulting GCC invocation
    is something like:

    $ mips64-linux-gcc -Werror -march=mips32r2 -c -x c /dev/null -o tmp
    cc1: error: '-march=mips32r2' is not compatible with the selected ABI

    These short-form - flags are dropped by the VDSO Makefile's
    filtering, and so we attempt to build the VDSO without specifying any
    architecture. This results in an attempt to build the VDSO using
    whatever the compiler's default architecture is, regardless of whether
    that is suitable for the kernel configuration.

    One encountered build failure resulting from this mismatch is a
    rejection of the sync instruction if the kernel is configured for a
    MIPS32 or MIPS64 r1 or r2 target but the toolchain defaults to an older
    architecture revision such as MIPS1 which did not include the sync
    instruction:

    CC arch/mips/vdso/gettimeofday.o
    /tmp/ccGQKoOj.s: Assembler messages:
    /tmp/ccGQKoOj.s:273: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:329: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:520: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:714: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1009: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1066: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1114: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1279: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1334: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1374: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1459: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1514: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:1814: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:2002: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    /tmp/ccGQKoOj.s:2066: Error: opcode not supported on this processor: mips1 (mips1) `sync'
    make[2]: *** [scripts/Makefile.build:318: arch/mips/vdso/gettimeofday.o] Error 1
    make[1]: *** [scripts/Makefile.build:558: arch/mips/vdso] Error 2
    make[1]: *** Waiting for unfinished jobs....

    This can be reproduced for example by attempting to build
    pistachio_defconfig using Arnd's GCC 8.1.0 mips64 toolchain from
    kernel.org:

    https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/x86_64-gcc-8.1.0-nolibc-mips64-linux.tar.xz

    Resolve this problem by using the long-form -march= in all cases,
    which makes it through the arch/mips/vdso/Makefile's filtering & is thus
    consistently used to build both the kernel proper & the VDSO.

    The use of cc-option to prefer the long-form & fall back to the
    short-form flags makes no sense since the short-form is just an
    abbreviation for the also-supported long-form in all GCC versions that
    we support building with. This means there is no case in which we have
    to use the short-form - flags, so we can simply remove them.

    The manual redefinition of _MIPS_ISA is removed naturally along with the
    use of the short-form flags that it accompanied, and whilst here we
    remove the separate assembler ISA selection. I suspect that both of
    these were only required due to the mips32 vs mips2 mismatch that was
    introduced by commit 59b3e8e9aac6 ("[MIPS] Makefile crapectomy.") and
    fixed but not cleaned up by commit 9200c0b2a07c ("[MIPS] Fix Makefile
    bugs for MIPS32/MIPS64 R1 and R2.").

    I've marked this for backport as far as v4.4 where the MIPS VDSO was
    introduced. In earlier kernels there should be no ill effect to using
    the short-form flags.

    Signed-off-by: Paul Burton
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # v4.4+
    Reviewed-by: James Hogan
    Patchwork: https://patchwork.linux-mips.org/patch/19579/
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     
  • commit f5958b4cf4fc38ed4583ab83fb7c4cd1ab05f47b upstream.

    Use the `unsigned long' rather than `__u32' type for DSP accumulator
    registers, like with the regular MIPS multiply/divide accumulator and
    general-purpose registers, as all are 64-bit in 64-bit implementations
    and using a 32-bit data type leads to contents truncation on context
    saving.

    Update `arch_ptrace' and `compat_arch_ptrace' accordingly, removing
    casts that are similarly not used with multiply/divide accumulator or
    general-purpose register accesses.

    Signed-off-by: Maciej W. Rozycki
    Signed-off-by: Paul Burton
    Fixes: e50c0a8fa60d ("Support the MIPS32 / MIPS64 DSP ASE.")
    Patchwork: https://patchwork.linux-mips.org/patch/19329/
    Cc: Alexander Viro
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: linux-fsdevel@vger.kernel.org
    Cc: linux-mips@linux-mips.org
    Cc: linux-kernel@vger.kernel.org
    Cc: stable@vger.kernel.org # 2.6.15+
    Signed-off-by: Greg Kroah-Hartman

    Maciej W. Rozycki
     
  • [ Upstream commit d5ea019f8a381f88545bb26993b62ec24a2796b7 ]

    This reverts commit 2a027b47dba6 ("MIPS: BCM47XX: Enable 74K Core
    ExternalSync for PCIe erratum").

    Enabling ExternalSync caused a regression for BCM4718A1 (used e.g. in
    Netgear E3000 and ASUS RT-N16): it simply hangs during PCIe
    initialization. It's likely that BCM4717A1 is also affected.

    I didn't notice that earlier as the only BCM47XX devices with PCIe I
    own are:
    1) BCM4706 with 2 x 14e4:4331
    2) BCM4706 with 14e4:4360 and 14e4:4331
    it appears that BCM4706 is unaffected.

    While BCM5300X-ES300-RDS.pdf seems to document that erratum and its
    workarounds (according to quotes provided by Tokunori) it seems not even
    Broadcom follows them.

    According to the provided info Broadcom should define CONF7_ES in their
    SDK's mipsinc.h and implement workaround in the si_mips_init(). Checking
    both didn't reveal such code. It *could* mean Broadcom also had some
    problems with the given workaround.

    Signed-off-by: Rafał Miłecki
    Signed-off-by: Paul Burton
    Reported-by: Michael Marley
    Patchwork: https://patchwork.linux-mips.org/patch/20032/
    URL: https://bugs.openwrt.org/index.php?do=details&task_id=1688
    Cc: Tokunori Ikegami
    Cc: Hauke Mehrtens
    Cc: Chris Packham
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Rafał Miłecki
     

28 Jul, 2018

2 commits

  • commit 38c0a74fe06da3be133cae3fb7bde6a9438e698b upstream.

    The MIPS implementation of pci_resource_to_user() introduced in v3.12 by
    commit 4c2924b725fb ("MIPS: PCI: Use pci_resource_to_user to map pci
    memory space properly") incorrectly sets *end to the address of the
    byte after the resource, rather than the last byte of the resource.

    This results in userland seeing resources as a byte larger than they
    actually are, for example a 32 byte BAR will be reported by a tool such
    as lspci as being 33 bytes in size:

    Region 2: I/O ports at 1000 [disabled] [size=33]

    Correct this by subtracting one from the calculated end address,
    reporting the correct address to userland.

    Signed-off-by: Paul Burton
    Reported-by: Rui Wang
    Fixes: 4c2924b725fb ("MIPS: PCI: Use pci_resource_to_user to map pci memory space properly")
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: Wolfgang Grandegger
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # v3.12+
    Patchwork: https://patchwork.linux-mips.org/patch/19829/
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     
  • commit bc88ad2efd11f29e00a4fd60fcd1887abfe76833 upstream.

    ath79_ddr_wb_flush_base has the type void __iomem *, so register offsets
    need to be a multiple of 4 in order to access the intended register.

    Signed-off-by: Felix Fietkau
    Signed-off-by: John Crispin
    Signed-off-by: Paul Burton
    Fixes: 24b0e3e84fbf ("MIPS: ath79: Improve the DDR controller interface")
    Patchwork: https://patchwork.linux-mips.org/patch/19912/
    Cc: Alban Bedel
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # 4.2+
    Signed-off-by: Greg Kroah-Hartman

    Felix Fietkau
     

17 Jul, 2018

3 commits

  • commit 523402fa9101090c91d2033b7ebdfdcf65880488 upstream.

    We currently attempt to check whether a physical address range provided
    to __ioremap() may be in use by the page allocator by examining the
    value of PageReserved for each page in the region - lowmem pages not
    marked reserved are presumed to be in use by the page allocator, and
    requests to ioremap them fail.

    The way we check this has been broken since commit 92923ca3aace ("mm:
    meminit: only set page reserved in the memblock region"), because
    memblock will typically not have any knowledge of non-RAM pages and
    therefore those pages will not have the PageReserved flag set. Thus when
    we attempt to ioremap a region outside of RAM we incorrectly fail
    believing that the region is RAM that may be in use.

    In most cases ioremap() on MIPS will take a fast-path to use the
    unmapped kseg1 or xkphys virtual address spaces and never hit this path,
    so the only way to hit it is for a MIPS32 system to attempt to ioremap()
    an address range in lowmem with flags other than _CACHE_UNCACHED.
    Perhaps the most straightforward way to do this is using
    ioremap_uncached_accelerated(), which is how the problem was discovered.

    Fix this by making use of walk_system_ram_range() to test the address
    range provided to __ioremap() against only RAM pages, rather than all
    lowmem pages. This means that if we have a lowmem I/O region, which is
    very common for MIPS systems, we're free to ioremap() address ranges
    within it. A nice bonus is that the test is no longer limited to lowmem.

    The approach here matches the way x86 performed the same test after
    commit c81c8a1eeede ("x86, ioremap: Speed up check for RAM pages") until
    x86 moved towards a slightly more complicated check using walk_mem_res()
    for unrelated reasons with commit 0e4c12b45aa8 ("x86/mm, resource: Use
    PAGE_KERNEL protection for ioremap of memory pages").

    Signed-off-by: Paul Burton
    Reported-by: Serge Semin
    Tested-by: Serge Semin
    Fixes: 92923ca3aace ("mm: meminit: only set page reserved in the memblock region")
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # v4.2+
    Patchwork: https://patchwork.linux-mips.org/patch/19786/
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     
  • commit b63e132b6433a41cf311e8bc382d33fd2b73b505 upstream.

    The current MIPS implementation of arch_trigger_cpumask_backtrace() is
    broken because it attempts to use synchronous IPIs despite the fact that
    it may be run with interrupts disabled.

    This means that when arch_trigger_cpumask_backtrace() is invoked, for
    example by the RCU CPU stall watchdog, we may:

    - Deadlock due to use of synchronous IPIs with interrupts disabled,
    causing the CPU that's attempting to generate the backtrace output
    to hang itself.

    - Not succeed in generating the desired output from remote CPUs.

    - Produce warnings about this from smp_call_function_many(), for
    example:

    [42760.526910] INFO: rcu_sched detected stalls on CPUs/tasks:
    [42760.535755] 0-...!: (1 GPs behind) idle=ade/140000000000000/0 softirq=526944/526945 fqs=0
    [42760.547874] 1-...!: (0 ticks this GP) idle=e4a/140000000000000/0 softirq=547885/547885 fqs=0
    [42760.559869] (detected by 2, t=2162 jiffies, g=266689, c=266688, q=33)
    [42760.568927] ------------[ cut here ]------------
    [42760.576146] WARNING: CPU: 2 PID: 1216 at kernel/smp.c:416 smp_call_function_many+0x88/0x20c
    [42760.587839] Modules linked in:
    [42760.593152] CPU: 2 PID: 1216 Comm: sh Not tainted 4.15.4-00373-gee058bb4d0c2 #2
    [42760.603767] Stack : 8e09bd20 8e09bd20 8e09bd20 fffffff0 00000007 00000006 00000000 8e09bca8
    [42760.616937] 95b2b379 95b2b379 807a0080 00000007 81944518 0000018a 00000032 00000000
    [42760.630095] 00000000 00000030 80000000 00000000 806eca74 00000009 8017e2b8 000001a0
    [42760.643169] 00000000 00000002 00000000 8e09baa4 00000008 808b8008 86d69080 8e09bca0
    [42760.656282] 8e09ad50 805e20aa 00000000 00000000 00000000 8017e2b8 00000009 801070ca
    [42760.669424] ...
    [42760.673919] Call Trace:
    [42760.678672] [] show_stack+0x70/0xf0
    [42760.685417] [] dump_stack+0xaa/0xd0
    [42760.692188] [] __warn+0x80/0x92
    [42760.698549] [] warn_slowpath_null+0x28/0x36
    [42760.705912] [] smp_call_function_many+0x88/0x20c
    [42760.713696] [] arch_trigger_cpumask_backtrace+0x30/0x4a
    [42760.722216] [] rcu_dump_cpu_stacks+0x6a/0x98
    [42760.729580] [] rcu_check_callbacks+0x672/0x6ac
    [42760.737476] [] update_process_times+0x18/0x34
    [42760.744981] [] tick_sched_handle.isra.5+0x26/0x38
    [42760.752793] [] tick_sched_timer+0x1c/0x50
    [42760.759882] [] __hrtimer_run_queues+0xc6/0x226
    [42760.767418] [] hrtimer_interrupt+0x88/0x19a
    [42760.775031] [] gic_compare_interrupt+0x2e/0x3a
    [42760.782761] [] handle_percpu_devid_irq+0x78/0x168
    [42760.790795] [] generic_handle_irq+0x1e/0x2c
    [42760.798117] [] gic_handle_local_int+0x38/0x86
    [42760.805545] [] gic_irq_dispatch+0xa/0x14
    [42760.812534] [] generic_handle_irq+0x1e/0x2c
    [42760.820086] [] do_IRQ+0x16/0x20
    [42760.826274] [] plat_irq_dispatch+0x62/0x94
    [42760.833458] [] except_vec_vi_end+0x70/0x78
    [42760.840655] [] smp_call_function_many+0x1ba/0x20c
    [42760.848501] [] smp_call_function+0x1e/0x2c
    [42760.855693] [] flush_tlb_mm+0x2a/0x98
    [42760.862730] [] tlb_flush_mmu+0x1c/0x44
    [42760.869628] [] arch_tlb_finish_mmu+0x26/0x3e
    [42760.877021] [] tlb_finish_mmu+0x18/0x66
    [42760.883907] [] exit_mmap+0x76/0xea
    [42760.890428] [] mmput+0x80/0x11a
    [42760.896632] [] do_exit+0x1f4/0x80c
    [42760.903158] [] do_group_exit+0x20/0x7e
    [42760.909990] [] __wake_up_parent+0x0/0x1e
    [42760.917045] [] smp_call_function_many+0x1a2/0x20c
    [42760.924893] [] syscall_common+0x14/0x1c
    [42760.931765] ---[ end trace 02aa09da9dc52a60 ]---
    [42760.938342] ------------[ cut here ]------------
    [42760.945311] WARNING: CPU: 2 PID: 1216 at kernel/smp.c:291 smp_call_function_single+0xee/0xf8
    ...

    This patch switches MIPS' arch_trigger_cpumask_backtrace() to use async
    IPIs & smp_call_function_single_async() in order to resolve this
    problem. We ensure use of the pre-allocated call_single_data_t
    structures is serialized by maintaining a cpumask indicating that
    they're busy, and refusing to attempt to send an IPI when a CPU's bit is
    set in this mask. This should only happen if a CPU hasn't responded to a
    previous backtrace IPI - ie. if it's hung - and we print a warning to
    the console in this case.

    I've marked this for stable branches as far back as v4.9, to which it
    applies cleanly. Strictly speaking the faulty MIPS implementation can be
    traced further back to commit 856839b76836 ("MIPS: Add
    arch_trigger_all_cpu_backtrace() function") in v3.19, but kernel
    versions v3.19 through v4.8 will require further work to backport due to
    the rework performed in commit 9a01c3ed5cdb ("nmi_backtrace: add more
    trigger_*_cpu_backtrace() methods").

    Signed-off-by: Paul Burton
    Patchwork: https://patchwork.linux-mips.org/patch/19597/
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: Huacai Chen
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # v4.9+
    Fixes: 856839b76836 ("MIPS: Add arch_trigger_all_cpu_backtrace() function")
    Fixes: 9a01c3ed5cdb ("nmi_backtrace: add more trigger_*_cpu_backtrace() methods")
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     
  • commit 5a267832c2ec47b2dad0fdb291a96bb5b8869315 upstream.

    The generic nmi_cpu_backtrace() function calls show_regs() when a struct
    pt_regs is available, and dump_stack() otherwise. If we were to make use
    of the generic nmi_cpu_backtrace() with MIPS' current implementation of
    show_regs() this would mean that we see only register data with no
    accompanying stack information, in contrast with our current
    implementation which calls dump_stack() regardless of whether register
    state is available.

    In preparation for making use of the generic nmi_cpu_backtrace() to
    implement arch_trigger_cpumask_backtrace(), have our implementation of
    show_regs() call dump_stack() and drop the explicit dump_stack() call in
    arch_dump_stack() which is invoked by arch_trigger_cpumask_backtrace().

    This will allow the output we produce to remain the same after a later
    patch switches to using nmi_cpu_backtrace(). It may mean that we produce
    extra stack output in other uses of show_regs(), but this:

    1) Seems harmless.
    2) Is good for consistency between arch_trigger_cpumask_backtrace()
    and other users of show_regs().
    3) Matches the behaviour of the ARM & PowerPC architectures.

    Marked for stable back to v4.9 as a prerequisite of the following patch
    "MIPS: Call dump_stack() from show_regs()".

    Signed-off-by: Paul Burton
    Patchwork: https://patchwork.linux-mips.org/patch/19596/
    Cc: James Hogan
    Cc: Ralf Baechle
    Cc: Huacai Chen
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org # v4.9+
    Signed-off-by: Greg Kroah-Hartman

    Paul Burton
     

03 Jul, 2018

3 commits

  • commit 18f3e95b90b28318ef35910d21c39908de672331 upstream.

    While a barrier is present in the outX() functions before the register
    write, a similar barrier is missing in the inX() functions after the
    register read. This could allow memory accesses following inX() to
    observe stale data.

    This patch is very similar to commit a1cc7034e33d12dc1 ("MIPS: io: Add
    barrier after register read in readX()"). Because war_io_reorder_wmb()
    is both used by writeX() and outX(), if readX() need a barrier then so
    does inX().

    Cc: stable@vger.kernel.org
    Signed-off-by: Huacai Chen
    Patchwork: https://patchwork.linux-mips.org/patch/19516/
    Signed-off-by: Paul Burton
    Cc: James Hogan
    Cc: linux-mips@linux-mips.org
    Cc: Fuxin Zhang
    Cc: Zhangjin Wu
    Cc: Huacai Chen
    Signed-off-by: Greg Kroah-Hartman

    Huacai Chen
     
  • commit 2a027b47dba6b77ab8c8e47b589ae9bbc5ac6175 upstream.

    The erratum and workaround are described by BCM5300X-ES300-RDS.pdf as
    below.

    R10: PCIe Transactions Periodically Fail

    Description: The BCM5300X PCIe does not maintain transaction ordering.
    This may cause PCIe transaction failure.
    Fix Comment: Add a dummy PCIe configuration read after a PCIe
    configuration write to ensure PCIe configuration access
    ordering. Set ES bit of CP0 configu7 register to enable
    sync function so that the sync instruction is functional.
    Resolution: hndpci.c: extpci_write_config()
    hndmips.c: si_mips_init()
    mipsinc.h CONF7_ES

    This is fixed by the CFE MIPS bcmsi chipset driver also for BCM47XX.
    Also the dummy PCIe configuration read is already implemented in the
    Linux BCMA driver.

    Enable ExternalSync in Config7 when CONFIG_BCMA_DRIVER_PCI_HOSTMODE=y
    too so that the sync instruction is externalised.

    Signed-off-by: Tokunori Ikegami
    Reviewed-by: Paul Burton
    Acked-by: Hauke Mehrtens
    Cc: Chris Packham
    Cc: Rafał Miłecki
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/19461/
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    Tokunori Ikegami
     
  • commit 6fb8656646f996d1eef42e6d56203c4915cb9e08 upstream.

    ftrace_graph_caller was never run after calling ftrace_trace_function,
    breaking the function graph tracer. Fix this, bringing it in line with the
    x86 implementation.

    While we're at it, also streamline the control flow of _mcount a bit to
    reduce the number of branches.

    This issue was reported before:
    https://www.linux-mips.org/archives/linux-mips/2014-11/msg00295.html

    Signed-off-by: Matthias Schiffer
    Tested-by: Matt Redfearn
    Patchwork: https://patchwork.linux-mips.org/patch/18929/
    Signed-off-by: Paul Burton
    Cc: stable@vger.kernel.org # v3.17+
    Signed-off-by: Greg Kroah-Hartman

    Matthias Schiffer
     

21 Jun, 2018

3 commits

  • [ Upstream commit 2c2bf522ed8cbfaac666f7dc65cfd38de2b89f0f ]

    dtc recently (v1.4.4-8-g756ffc4f52f6) added PCI bus checks. Fix the
    warnings now emitted:

    arch/mips/boot/dts/img/boston.dtb: Warning (pci_bridge): /pci@10000000: missing bus-range for PCI bridge
    arch/mips/boot/dts/img/boston.dtb: Warning (pci_bridge): /pci@12000000: missing bus-range for PCI bridge
    arch/mips/boot/dts/img/boston.dtb: Warning (pci_bridge): /pci@14000000: missing bus-range for PCI bridge

    Signed-off-by: Matt Redfearn
    Cc: Ralf Baechle
    Cc: Paul Burton
    Cc: Rob Herring
    Cc: Mark Rutland
    Cc: linux-mips@linux-mips.org
    Cc: devicetree@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/19070/
    Signed-off-by: James Hogan
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Matt Redfearn
     
  • [ Upstream commit a1cc7034e33d12dc17d13fbcd7d597d552889097 ]

    While a barrier is present in the writeX() functions before the register
    write, a similar barrier is missing in the readX() functions after the
    register read. This could allow memory accesses following readX() to
    observe stale data.

    Signed-off-by: Sinan Kaya
    Reported-by: Arnd Bergmann
    Cc: Ralf Baechle
    Cc: Paul Burton
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/19069/
    [jhogan@kernel.org: Tidy commit message]
    Signed-off-by: James Hogan
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sinan Kaya
     
  • [ Upstream commit f6b7aeee8f167409195fbf1364d02988fecad1d0 ]

    writeX() has strong ordering semantics with respect to memory updates.
    In the absence of a write barrier or a compiler barrier, the compiler
    can reorder register and memory update instructions. This breaks the
    writeX() API.

    Signed-off-by: Sinan Kaya
    Cc: Arnd Bergmann
    Cc: Ralf Baechle
    Cc: Paul Burton
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/18997/
    [jhogan@kernel.org: Tidy commit message]
    Signed-off-by: James Hogan
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sinan Kaya
     

05 Jun, 2018

2 commits

  • commit 28e4213dd331e944e7fca1954a946829162ed9d4 upstream.

    Having PR_FP_MODE_FRE (i.e. Config5.FRE) set without PR_FP_MODE_FR (i.e.
    Status.FR) is not supported as the lone purpose of Config5.FRE is to
    emulate Status.FR=0 handling on FPU hardware that has Status.FR=1
    hardwired[1][2]. Also we do not handle this case elsewhere, and assume
    throughout our code that TIF_HYBRID_FPREGS and TIF_32BIT_FPREGS cannot
    be set both at once for a task, leading to inconsistent behaviour if
    this does happen.

    Return unsuccessfully then from prctl(2) PR_SET_FP_MODE calls requesting
    PR_FP_MODE_FRE to be set with PR_FP_MODE_FR clear. This corresponds to
    modes allowed by `mips_set_personality_fp'.

    References:

    [1] "MIPS Architecture For Programmers, Vol. III: MIPS32 / microMIPS32
    Privileged Resource Architecture", Imagination Technologies,
    Document Number: MD00090, Revision 6.02, July 10, 2015, Table 9.69
    "Config5 Register Field Descriptions", p. 262

    [2] "MIPS Architecture For Programmers, Volume III: MIPS64 / microMIPS64
    Privileged Resource Architecture", Imagination Technologies,
    Document Number: MD00091, Revision 6.03, December 22, 2015, Table
    9.72 "Config5 Register Field Descriptions", p. 288

    Fixes: 9791554b45a2 ("MIPS,prctl: add PR_[GS]ET_FP_MODE prctl options for MIPS")
    Signed-off-by: Maciej W. Rozycki
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: # 4.0+
    Patchwork: https://patchwork.linux-mips.org/patch/19327/
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    Maciej W. Rozycki
     
  • commit c7e814628df65f424fe197dde73bfc67e4a244d7 upstream.

    Use 64-bit accesses for 64-bit floating-point general registers with
    PTRACE_PEEKUSR, removing the truncation of their upper halves in the
    FR=1 mode, caused by commit bbd426f542cb ("MIPS: Simplify FP context
    access"), which inadvertently switched them to using 32-bit accesses.

    The PTRACE_POKEUSR side is fine as it's never been broken and continues
    using 64-bit accesses.

    Fixes: bbd426f542cb ("MIPS: Simplify FP context access")
    Signed-off-by: Maciej W. Rozycki
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: # 3.15+
    Patchwork: https://patchwork.linux-mips.org/patch/19334/
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    Maciej W. Rozycki
     

30 May, 2018

7 commits

  • [ Upstream commit db6775ca6e0353d2618ca7d5e210fc36ad43bbd4 ]

    Using a period after a newline causes bad output.

    Fixes: 64b139f97c01 ("MIPS: OCTEON: irq: add CIB and other fixes")
    Signed-off-by: Joe Perches
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/17886/
    Signed-off-by: James Hogan
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Joe Perches
     
  • [ Upstream commit 05454c1bde91fb013c0431801001da82947e6b5a ]

    According to the QCA u-boot source the "PCIE Phase Lock Loop
    Configuration (PCIE_PLL_CONFIG)" register is for all SoCs except the
    QCA955X and QCA956X at offset 0x10.

    Since the PCIE PLL config register is only defined for the AR724x fix
    only this value. The value is wrong since the day it was added and isn't
    used by any driver yet.

    Signed-off-by: Mathias Kresin
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/16048/
    Signed-off-by: James Hogan
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Mathias Kresin
     
  • [ Upstream commit 9a9ab3078e2744a1a55163cfaec73a5798aae33e ]

    We now have a platform (Ranchu) in the "generic" platform which matches
    based on the FDT compatible string using mips_machine_is_compatible(),
    however that function doesn't stop at a blank struct
    of_device_id::compatible as that is an array in the struct, not a
    pointer to a string.

    Fix the loop completion to check the first byte of the compatible array
    rather than the address of the compatible array in the struct.

    Fixes: eed0eabd12ef ("MIPS: generic: Introduce generic DT-based board support")
    Signed-off-by: James Hogan
    Reviewed-by: Paul Burton
    Reviewed-by: Matt Redfearn
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/18580/
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    James Hogan
     
  • commit ba3696e94d9d590d9a7e55f68e81c25dba515191 upstream.

    Trivial fix to spelling mistake in debugfs_entries text.

    Fixes: 669e846e6c4e ("KVM/MIPS32: MIPS arch specific APIs for KVM")
    Signed-off-by: Colin Ian King
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: kernel-janitors@vger.kernel.org
    Cc: # 3.10+
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    Colin Ian King
     
  • commit 9a3a92ccfe3620743d4ae57c987dc8e9c5f88996 upstream.

    Check the TIF_32BIT_FPREGS task setting of the tracee rather than the
    tracer in determining the layout of floating-point general registers in
    the floating-point context, correcting access to odd-numbered registers
    for o32 tracees where the setting disagrees between the two processes.

    Fixes: 597ce1723e0f ("MIPS: Support for 64-bit FP with O32 binaries")
    Signed-off-by: Maciej W. Rozycki
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: # 3.14+
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    Maciej W. Rozycki
     
  • commit 71e909c0cdad28a1df1fa14442929e68615dee45 upstream.

    Correct commit 7aeb753b5353 ("MIPS: Implement task_user_regset_view.")
    and expose the FIR register using the unused 4 bytes at the end of the
    NT_PRFPREG regset. Without that register included clients cannot use
    the PTRACE_GETREGSET request to retrieve the complete FPU register set
    and have to resort to one of the older interfaces, either PTRACE_PEEKUSR
    or PTRACE_GETFPREGS, to retrieve the missing piece of data. Also the
    register is irreversibly missing from core dumps.

    This register is architecturally hardwired and read-only so the write
    path does not matter. Ignore data supplied on writes then.

    Fixes: 7aeb753b5353 ("MIPS: Implement task_user_regset_view.")
    Signed-off-by: James Hogan
    Signed-off-by: Maciej W. Rozycki
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: # 3.13+
    Patchwork: https://patchwork.linux-mips.org/patch/19273/
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    Maciej W. Rozycki
     
  • commit 55a2aa08b3af519a9693f99cdf7fa6d8b62d9f65 upstream.

    When DMA will be performed to a MIPS32 1004K CPS, the L1-cache for the
    range needs to be flushed and invalidated first.
    The code currently takes one of two approaches.
    1/ If the range is less than the size of the dcache, then HIT type
    requests flush/invalidate cache lines for the particular addresses.
    HIT-type requests a globalised by the CPS so this is safe on SMP.

    2/ If the range is larger than the size of dcache, then INDEX type
    requests flush/invalidate the whole cache. INDEX type requests affect
    the local cache only. CPS does not propagate them in any way. So this
    invalidation is not safe on SMP CPS systems.

    Data corruption due to '2' can quite easily be demonstrated by
    repeatedly "echo 3 > /proc/sys/vm/drop_caches" and then sha1sum a file
    that is several times the size of available memory. Dropping caches
    means that large contiguous extents (large than dcache) are more likely.

    This was not a problem before Linux-4.8 because option 2 was never used
    if CONFIG_MIPS_CPS was defined. The commit which removed that apparently
    didn't appreciate the full consequence of the change.

    We could, in theory, globalize the INDEX based flush by sending an IPI
    to other cores. These cache invalidation routines can be called with
    interrupts disabled and synchronous IPI require interrupts to be
    enabled. Asynchronous IPI may not trigger writeback soon enough. So we
    cannot use IPI in practice.

    We can already test if IPI would be needed for an INDEX operation with
    r4k_op_needs_ipi(R4K_INDEX). If this is true then we mustn't try the
    INDEX approach as we cannot use IPI. If this is false (e.g. when there
    is only one core and hence one L1 cache) then it is safe to use the
    INDEX approach without IPI.

    This patch avoids options 2 if r4k_op_needs_ipi(R4K_INDEX), and so
    eliminates the corruption.

    Fixes: c00ab4896ed5 ("MIPS: Remove cpu_has_safe_index_cacheops")
    Signed-off-by: NeilBrown
    Cc: Ralf Baechle
    Cc: Paul Burton
    Cc: linux-mips@linux-mips.org
    Cc: # 4.8+
    Patchwork: https://patchwork.linux-mips.org/patch/19259/
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    NeilBrown
     

26 Apr, 2018

3 commits

  • [ Upstream commit 7bf8b16d1b60419c865e423b907a05f413745b3e ]

    The GIC supports running in External Interrupt Controller (EIC) mode,
    and will signal this via cpu_has_veic if enabled in hardware. Currently
    the generic kernel will panic if cpu_has_veic is set - but the GIC can
    legitimately set this flag if either configured to boot in EIC mode, or
    if the GIC driver enables this mode. Make the kernel not panic in this
    case, and instead just check if the GIC is present. If so, use it's CPU
    local interrupt routing functions. If an EIC is present, but it is not
    the GIC, then the kernel does not know how to get the VIRQ for the CPU
    local interrupts and should panic. Support for alternative EICs being
    present is needed here for the generic kernel to support them.

    Suggested-by: Paul Burton
    Signed-off-by: Matt Redfearn
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/18191/
    Signed-off-by: James Hogan
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Matt Redfearn
     
  • [ Upstream commit 0cde5b44a30f1daaef1c34e08191239dc63271c4 ]

    When commit b27311e1cace ("MIPS: TXx9: Add RBTX4939 board support")
    added board support for the RBTX4939, it added a call to
    led_classdev_register even if the LED class is built as a module.
    Built-in arch code cannot call module code directly like this. Commit
    b33b44073734 ("MIPS: TXX9: use IS_ENABLED() macro") subsequently
    changed the inclusion of this code to a single check that
    CONFIG_LEDS_CLASS is either builtin or a module, but the same issue
    remains.

    This leads to MIPS allmodconfig builds failing when CONFIG_MACH_TX49XX=y
    is set:

    arch/mips/txx9/rbtx4939/setup.o: In function `rbtx4939_led_probe':
    setup.c:(.init.text+0xc0): undefined reference to `of_led_classdev_register'
    make: *** [Makefile:999: vmlinux] Error 1

    Fix this by using the IS_BUILTIN() macro instead.

    Fixes: b27311e1cace ("MIPS: TXx9: Add RBTX4939 board support")
    Signed-off-by: Matt Redfearn
    Reviewed-by: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/18544/
    Signed-off-by: James Hogan
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Matt Redfearn
     
  • [ Upstream commit 5f2483eb2423152445b39f2db59d372f523e664e ]

    Make doesn't expand shell style "vmlinuz.{32,ecoff,bin,srec}" to the 4
    separate files, so none of these files get cleaned up by make clean.
    List the files separately instead.

    Fixes: ec3352925b74 ("MIPS: Remove all generated vmlinuz* files on "make clean"")
    Signed-off-by: James Hogan
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/18491/
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    James Hogan
     

24 Apr, 2018

2 commits

  • commit c96eebf07692e53bf4dd5987510d8b550e793598 upstream.

    The label .Llast_fixup\@ is jumped to on page fault within the final
    byte set loop of memset (on < MIPSR6 architectures). For some reason, in
    this fault handler, the v1 register is randomly set to a2 & STORMASK.
    This clobbers v1 for the calling function. This can be observed with the
    following test code:

    static int __init __attribute__((optimize("O0"))) test_clear_user(void)
    {
    register int t asm("v1");
    char *test;
    int j, k;

    pr_info("\n\n\nTesting clear_user\n");
    test = vmalloc(PAGE_SIZE);

    for (j = 256; j < 512; j++) {
    t = 0xa5a5a5a5;
    if ((k = clear_user(test + PAGE_SIZE - 256, j)) != j - 256) {
    pr_err("clear_user (%px %d) returned %d\n", test + PAGE_SIZE - 256, j, k);
    }
    if (t != 0xa5a5a5a5) {
    pr_err("v1 was clobbered to 0x%x!\n", t);
    }
    }

    return 0;
    }
    late_initcall(test_clear_user);

    Which demonstrates that v1 is indeed clobbered (MIPS64):

    Testing clear_user
    v1 was clobbered to 0x1!
    v1 was clobbered to 0x2!
    v1 was clobbered to 0x3!
    v1 was clobbered to 0x4!
    v1 was clobbered to 0x5!
    v1 was clobbered to 0x6!
    v1 was clobbered to 0x7!

    Since the number of bytes that could not be set is already contained in
    a2, the andi placing a value in v1 is not necessary and actively
    harmful in clobbering v1.

    Reported-by: James Hogan
    Signed-off-by: Matt Redfearn
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/19109/
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    Matt Redfearn
     
  • commit daf70d89f80c6e1772233da9e020114b1254e7e0 upstream.

    The __clear_user function is defined to return the number of bytes that
    could not be cleared. From the underlying memset / bzero implementation
    this means setting register a2 to that number on return. Currently if a
    page fault is triggered within the memset_partial block, the value
    loaded into a2 on return is meaningless.

    The label .Lpartial_fixup\@ is jumped to on page fault. In order to work
    out how many bytes failed to copy, the exception handler should find how
    many bytes left in the partial block (andi a2, STORMASK), add that to
    the partial block end address (a2), and subtract the faulting address to
    get the remainder. Currently it incorrectly subtracts the partial block
    start address (t1), which has additionally been clobbered to generate a
    jump target in memset_partial. Fix this by adding the block end address
    instead.

    This issue was found with the following test code:
    int j, k;
    for (j = 0; j < 512; j++) {
    if ((k = clear_user(NULL, j)) != j) {
    pr_err("clear_user (NULL %d) returned %d\n", j, k);
    }
    }
    Which now passes on Creator Ci40 (MIPS32) and Cavium Octeon II (MIPS64).

    Suggested-by: James Hogan
    Signed-off-by: Matt Redfearn
    Cc: Ralf Baechle
    Cc: linux-mips@linux-mips.org
    Cc: stable@vger.kernel.org
    Patchwork: https://patchwork.linux-mips.org/patch/19108/
    Signed-off-by: James Hogan
    Signed-off-by: Greg Kroah-Hartman

    Matt Redfearn