Merge tag 'mips_fixes_4.16_4' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips
Pull MIPS fixes from James Hogan:
"A miscellaneous pile of MIPS fixes for 4.16:
- move put_compat_sigset() to evade hardened usercopy warnings (4.16)
- select ARCH_HAVE_PC_{SERIO,PARPORT} for Loongson64 platforms (4.16)
- fix kzalloc() failure handling in ath25 (3.19) and Octeon (4.0)
- fix disabling of IPIs during BMIPS suspend (3.19)"
* tag 'mips_fixes_4.16_4' of git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/mips:
MIPS: BMIPS: Do not mask IPIs during suspend
MIPS: Loongson64: Select ARCH_MIGHT_HAVE_PC_SERIO
MIPS: Loongson64: Select ARCH_MIGHT_HAVE_PC_PARPORT
signals: Move put_compat_sigset to compat.h to silence hardened usercopy
MIPS: OCTEON: irq: Check for null return on kzalloc allocation
MIPS: ath25: Check for kzalloc allocation failure
This commit is contained in:
@@ -135,6 +135,8 @@ int __init ath25_find_config(phys_addr_t base, unsigned long size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
board_data = kzalloc(BOARD_CONFIG_BUFSZ, GFP_KERNEL);
|
board_data = kzalloc(BOARD_CONFIG_BUFSZ, GFP_KERNEL);
|
||||||
|
if (!board_data)
|
||||||
|
goto error;
|
||||||
ath25_board.config = (struct ath25_boarddata *)board_data;
|
ath25_board.config = (struct ath25_boarddata *)board_data;
|
||||||
memcpy_fromio(board_data, bcfg, 0x100);
|
memcpy_fromio(board_data, bcfg, 0x100);
|
||||||
if (broken_boarddata) {
|
if (broken_boarddata) {
|
||||||
|
|||||||
@@ -2277,6 +2277,8 @@ static int __init octeon_irq_init_cib(struct device_node *ciu_node,
|
|||||||
}
|
}
|
||||||
|
|
||||||
host_data = kzalloc(sizeof(*host_data), GFP_KERNEL);
|
host_data = kzalloc(sizeof(*host_data), GFP_KERNEL);
|
||||||
|
if (!host_data)
|
||||||
|
return -ENOMEM;
|
||||||
raw_spin_lock_init(&host_data->lock);
|
raw_spin_lock_init(&host_data->lock);
|
||||||
|
|
||||||
addr = of_get_address(ciu_node, 0, NULL, NULL);
|
addr = of_get_address(ciu_node, 0, NULL, NULL);
|
||||||
|
|||||||
@@ -168,11 +168,11 @@ static void bmips_prepare_cpus(unsigned int max_cpus)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request_irq(IPI0_IRQ, bmips_ipi_interrupt, IRQF_PERCPU,
|
if (request_irq(IPI0_IRQ, bmips_ipi_interrupt,
|
||||||
"smp_ipi0", NULL))
|
IRQF_PERCPU | IRQF_NO_SUSPEND, "smp_ipi0", NULL))
|
||||||
panic("Can't request IPI0 interrupt");
|
panic("Can't request IPI0 interrupt");
|
||||||
if (request_irq(IPI1_IRQ, bmips_ipi_interrupt, IRQF_PERCPU,
|
if (request_irq(IPI1_IRQ, bmips_ipi_interrupt,
|
||||||
"smp_ipi1", NULL))
|
IRQF_PERCPU | IRQF_NO_SUSPEND, "smp_ipi1", NULL))
|
||||||
panic("Can't request IPI1 interrupt");
|
panic("Can't request IPI1 interrupt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ choice
|
|||||||
config LEMOTE_FULOONG2E
|
config LEMOTE_FULOONG2E
|
||||||
bool "Lemote Fuloong(2e) mini-PC"
|
bool "Lemote Fuloong(2e) mini-PC"
|
||||||
select ARCH_SPARSEMEM_ENABLE
|
select ARCH_SPARSEMEM_ENABLE
|
||||||
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||||
|
select ARCH_MIGHT_HAVE_PC_SERIO
|
||||||
select CEVT_R4K
|
select CEVT_R4K
|
||||||
select CSRC_R4K
|
select CSRC_R4K
|
||||||
select SYS_HAS_CPU_LOONGSON2E
|
select SYS_HAS_CPU_LOONGSON2E
|
||||||
@@ -33,6 +35,8 @@ config LEMOTE_FULOONG2E
|
|||||||
config LEMOTE_MACH2F
|
config LEMOTE_MACH2F
|
||||||
bool "Lemote Loongson 2F family machines"
|
bool "Lemote Loongson 2F family machines"
|
||||||
select ARCH_SPARSEMEM_ENABLE
|
select ARCH_SPARSEMEM_ENABLE
|
||||||
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||||
|
select ARCH_MIGHT_HAVE_PC_SERIO
|
||||||
select BOARD_SCACHE
|
select BOARD_SCACHE
|
||||||
select BOOT_ELF32
|
select BOOT_ELF32
|
||||||
select CEVT_R4K if ! MIPS_EXTERNAL_TIMER
|
select CEVT_R4K if ! MIPS_EXTERNAL_TIMER
|
||||||
@@ -62,6 +66,8 @@ config LEMOTE_MACH2F
|
|||||||
config LOONGSON_MACH3X
|
config LOONGSON_MACH3X
|
||||||
bool "Generic Loongson 3 family machines"
|
bool "Generic Loongson 3 family machines"
|
||||||
select ARCH_SPARSEMEM_ENABLE
|
select ARCH_SPARSEMEM_ENABLE
|
||||||
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||||
|
select ARCH_MIGHT_HAVE_PC_SERIO
|
||||||
select GENERIC_ISA_DMA_SUPPORT_BROKEN
|
select GENERIC_ISA_DMA_SUPPORT_BROKEN
|
||||||
select BOOT_ELF32
|
select BOOT_ELF32
|
||||||
select BOARD_SCACHE
|
select BOARD_SCACHE
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/aio_abi.h> /* for aio_context_t */
|
#include <linux/aio_abi.h> /* for aio_context_t */
|
||||||
|
#include <linux/uaccess.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/unistd.h>
|
||||||
|
|
||||||
#include <asm/compat.h>
|
#include <asm/compat.h>
|
||||||
@@ -550,8 +551,29 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,
|
|||||||
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
|
asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
|
||||||
|
|
||||||
extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat);
|
extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat);
|
||||||
extern int put_compat_sigset(compat_sigset_t __user *compat,
|
|
||||||
const sigset_t *set, unsigned int size);
|
/*
|
||||||
|
* Defined inline such that size can be compile time constant, which avoids
|
||||||
|
* CONFIG_HARDENED_USERCOPY complaining about copies from task_struct
|
||||||
|
*/
|
||||||
|
static inline int
|
||||||
|
put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
|
||||||
|
unsigned int size)
|
||||||
|
{
|
||||||
|
/* size <= sizeof(compat_sigset_t) <= sizeof(sigset_t) */
|
||||||
|
#ifdef __BIG_ENDIAN
|
||||||
|
compat_sigset_t v;
|
||||||
|
switch (_NSIG_WORDS) {
|
||||||
|
case 4: v.sig[7] = (set->sig[3] >> 32); v.sig[6] = set->sig[3];
|
||||||
|
case 3: v.sig[5] = (set->sig[2] >> 32); v.sig[4] = set->sig[2];
|
||||||
|
case 2: v.sig[3] = (set->sig[1] >> 32); v.sig[2] = set->sig[1];
|
||||||
|
case 1: v.sig[1] = (set->sig[0] >> 32); v.sig[0] = set->sig[0];
|
||||||
|
}
|
||||||
|
return copy_to_user(compat, &v, size) ? -EFAULT : 0;
|
||||||
|
#else
|
||||||
|
return copy_to_user(compat, set, size) ? -EFAULT : 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
|
asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
|
||||||
compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
|
compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
|
||||||
|
|||||||
@@ -488,25 +488,6 @@ get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(get_compat_sigset);
|
EXPORT_SYMBOL_GPL(get_compat_sigset);
|
||||||
|
|
||||||
int
|
|
||||||
put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
|
|
||||||
unsigned int size)
|
|
||||||
{
|
|
||||||
/* size <= sizeof(compat_sigset_t) <= sizeof(sigset_t) */
|
|
||||||
#ifdef __BIG_ENDIAN
|
|
||||||
compat_sigset_t v;
|
|
||||||
switch (_NSIG_WORDS) {
|
|
||||||
case 4: v.sig[7] = (set->sig[3] >> 32); v.sig[6] = set->sig[3];
|
|
||||||
case 3: v.sig[5] = (set->sig[2] >> 32); v.sig[4] = set->sig[2];
|
|
||||||
case 2: v.sig[3] = (set->sig[1] >> 32); v.sig[2] = set->sig[1];
|
|
||||||
case 1: v.sig[1] = (set->sig[0] >> 32); v.sig[0] = set->sig[0];
|
|
||||||
}
|
|
||||||
return copy_to_user(compat, &v, size) ? -EFAULT : 0;
|
|
||||||
#else
|
|
||||||
return copy_to_user(compat, set, size) ? -EFAULT : 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_NUMA
|
#ifdef CONFIG_NUMA
|
||||||
COMPAT_SYSCALL_DEFINE6(move_pages, pid_t, pid, compat_ulong_t, nr_pages,
|
COMPAT_SYSCALL_DEFINE6(move_pages, pid_t, pid, compat_ulong_t, nr_pages,
|
||||||
compat_uptr_t __user *, pages32,
|
compat_uptr_t __user *, pages32,
|
||||||
|
|||||||
Reference in New Issue
Block a user