Commit 3d339d33 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus

Pull MIPS fixes from Ralf Baechle:
 "Another round of 4.11 for the MIPS architecture. This time around it's
  mostly arch but little platforms-specific code.

   - PCI: Register controllers in the right order to aoid a PCI error
   - KGDB: Use kernel context for sleeping threads
   - smp-cps: Fix potentially uninitialised value of core
   - KASLR: Fix build
   - ELF: Fix BUG() warning in arch_check_elf
   - Fix modversioning of _mcount symbol
   - fix out-of-tree defconfig target builds
   - cevt-r4k: Fix out-of-bounds array access
   - perf: fix deadlock
   - Malta: Fix i8259 irqchip setup"

* 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus:
  MIPS: PCI: add controllers before the specified head
  MIPS: KGDB: Use kernel context for sleeping threads
  MIPS: smp-cps: Fix potentially uninitialised value of core
  MIPS: KASLR: Add missing header files
  MIPS: Avoid BUG warning in arch_check_elf
  MIPS: Fix modversioning of _mcount symbol
  MIPS: generic: fix out-of-tree defconfig target builds
  MIPS: cevt-r4k: Fix out-of-bounds array access
  MIPS: perf: fix deadlock
  MIPS: Malta: Fix i8259 irqchip setup
parents 5a7ad114 edb0b6a0
...@@ -489,7 +489,7 @@ $(generic_defconfigs): ...@@ -489,7 +489,7 @@ $(generic_defconfigs):
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh \ $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh \
-m -O $(objtree) $(srctree)/arch/$(ARCH)/configs/generic_defconfig $^ \ -m -O $(objtree) $(srctree)/arch/$(ARCH)/configs/generic_defconfig $^ \
$(foreach board,$(BOARDS),$(generic_config_dir)/board-$(board).config) $(foreach board,$(BOARDS),$(generic_config_dir)/board-$(board).config)
$(Q)$(MAKE) olddefconfig $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig
# #
# Prevent generic merge_config rules attempting to merge single fragments # Prevent generic merge_config rules attempting to merge single fragments
...@@ -503,8 +503,8 @@ $(generic_config_dir)/%.config: ; ...@@ -503,8 +503,8 @@ $(generic_config_dir)/%.config: ;
# #
.PHONY: sead3_defconfig .PHONY: sead3_defconfig
sead3_defconfig: sead3_defconfig:
$(Q)$(MAKE) 32r2el_defconfig BOARDS=sead-3 $(Q)$(MAKE) -f $(srctree)/Makefile 32r2el_defconfig BOARDS=sead-3
.PHONY: sead3micro_defconfig .PHONY: sead3micro_defconfig
sead3micro_defconfig: sead3micro_defconfig:
$(Q)$(MAKE) micro32r2el_defconfig BOARDS=sead-3 $(Q)$(MAKE) -f $(srctree)/Makefile micro32r2el_defconfig BOARDS=sead-3
...@@ -3,3 +3,4 @@ ...@@ -3,3 +3,4 @@
#include <asm/fpu.h> #include <asm/fpu.h>
#include <asm-generic/asm-prototypes.h> #include <asm-generic/asm-prototypes.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/ftrace.h>
...@@ -80,7 +80,7 @@ static unsigned int calculate_min_delta(void) ...@@ -80,7 +80,7 @@ static unsigned int calculate_min_delta(void)
} }
/* Sorted insert of 75th percentile into buf2 */ /* Sorted insert of 75th percentile into buf2 */
for (k = 0; k < i; ++k) { for (k = 0; k < i && k < ARRAY_SIZE(buf2); ++k) {
if (buf1[ARRAY_SIZE(buf1) - 1] < buf2[k]) { if (buf1[ARRAY_SIZE(buf1) - 1] < buf2[k]) {
l = min_t(unsigned int, l = min_t(unsigned int,
i, ARRAY_SIZE(buf2) - 1); i, ARRAY_SIZE(buf2) - 1);
......
...@@ -257,7 +257,7 @@ int arch_check_elf(void *_ehdr, bool has_interpreter, void *_interp_ehdr, ...@@ -257,7 +257,7 @@ int arch_check_elf(void *_ehdr, bool has_interpreter, void *_interp_ehdr,
else if ((prog_req.fr1 && prog_req.frdefault) || else if ((prog_req.fr1 && prog_req.frdefault) ||
(prog_req.single && !prog_req.frdefault)) (prog_req.single && !prog_req.frdefault))
/* Make sure 64-bit MIPS III/IV/64R1 will not pick FR1 */ /* Make sure 64-bit MIPS III/IV/64R1 will not pick FR1 */
state->overall_fp_mode = ((current_cpu_data.fpu_id & MIPS_FPIR_F64) && state->overall_fp_mode = ((raw_current_cpu_data.fpu_id & MIPS_FPIR_F64) &&
cpu_has_mips_r2_r6) ? cpu_has_mips_r2_r6) ?
FP_FR1 : FP_FR0; FP_FR1 : FP_FR0;
else if (prog_req.fr1) else if (prog_req.fr1)
......
...@@ -244,9 +244,6 @@ static int compute_signal(int tt) ...@@ -244,9 +244,6 @@ static int compute_signal(int tt)
void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p) void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
{ {
int reg; int reg;
struct thread_info *ti = task_thread_info(p);
unsigned long ksp = (unsigned long)ti + THREAD_SIZE - 32;
struct pt_regs *regs = (struct pt_regs *)ksp - 1;
#if (KGDB_GDB_REG_SIZE == 32) #if (KGDB_GDB_REG_SIZE == 32)
u32 *ptr = (u32 *)gdb_regs; u32 *ptr = (u32 *)gdb_regs;
#else #else
...@@ -254,25 +251,46 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p) ...@@ -254,25 +251,46 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
#endif #endif
for (reg = 0; reg < 16; reg++) for (reg = 0; reg < 16; reg++)
*(ptr++) = regs->regs[reg]; *(ptr++) = 0;
/* S0 - S7 */ /* S0 - S7 */
for (reg = 16; reg < 24; reg++) *(ptr++) = p->thread.reg16;
*(ptr++) = regs->regs[reg]; *(ptr++) = p->thread.reg17;
*(ptr++) = p->thread.reg18;
*(ptr++) = p->thread.reg19;
*(ptr++) = p->thread.reg20;
*(ptr++) = p->thread.reg21;
*(ptr++) = p->thread.reg22;
*(ptr++) = p->thread.reg23;
for (reg = 24; reg < 28; reg++) for (reg = 24; reg < 28; reg++)
*(ptr++) = 0; *(ptr++) = 0;
/* GP, SP, FP, RA */ /* GP, SP, FP, RA */
for (reg = 28; reg < 32; reg++) *(ptr++) = (long)p;
*(ptr++) = regs->regs[reg]; *(ptr++) = p->thread.reg29;
*(ptr++) = p->thread.reg30;
*(ptr++) = regs->cp0_status; *(ptr++) = p->thread.reg31;
*(ptr++) = regs->lo;
*(ptr++) = regs->hi; *(ptr++) = p->thread.cp0_status;
*(ptr++) = regs->cp0_badvaddr;
*(ptr++) = regs->cp0_cause; /* lo, hi */
*(ptr++) = regs->cp0_epc; *(ptr++) = 0;
*(ptr++) = 0;
/*
* BadVAddr, Cause
* Ideally these would come from the last exception frame up the stack
* but that requires unwinding, otherwise we can't know much for sure.
*/
*(ptr++) = 0;
*(ptr++) = 0;
/*
* PC
* use return address (RA), i.e. the moment after return from resume()
*/
*(ptr++) = p->thread.reg31;
} }
void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc) void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc)
......
...@@ -1446,6 +1446,11 @@ static int mipsxx_pmu_handle_shared_irq(void) ...@@ -1446,6 +1446,11 @@ static int mipsxx_pmu_handle_shared_irq(void)
HANDLE_COUNTER(0) HANDLE_COUNTER(0)
} }
#ifdef CONFIG_MIPS_PERF_SHARED_TC_COUNTERS
read_unlock(&pmuint_rwlock);
#endif
resume_local_counters();
/* /*
* Do all the work for the pending perf events. We can do this * Do all the work for the pending perf events. We can do this
* in here because the performance counter interrupt is a regular * in here because the performance counter interrupt is a regular
...@@ -1454,10 +1459,6 @@ static int mipsxx_pmu_handle_shared_irq(void) ...@@ -1454,10 +1459,6 @@ static int mipsxx_pmu_handle_shared_irq(void)
if (handled == IRQ_HANDLED) if (handled == IRQ_HANDLED)
irq_work_run(); irq_work_run();
#ifdef CONFIG_MIPS_PERF_SHARED_TC_COUNTERS
read_unlock(&pmuint_rwlock);
#endif
resume_local_counters();
return handled; return handled;
} }
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/libfdt.h> #include <linux/libfdt.h>
#include <linux/of_fdt.h> #include <linux/of_fdt.h>
#include <linux/sched.h> #include <linux/sched/task.h>
#include <linux/start_kernel.h> #include <linux/start_kernel.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/printk.h> #include <linux/printk.h>
......
...@@ -422,13 +422,12 @@ void play_dead(void) ...@@ -422,13 +422,12 @@ void play_dead(void)
local_irq_disable(); local_irq_disable();
idle_task_exit(); idle_task_exit();
cpu = smp_processor_id(); cpu = smp_processor_id();
core = cpu_data[cpu].core;
cpu_death = CPU_DEATH_POWER; cpu_death = CPU_DEATH_POWER;
pr_debug("CPU%d going offline\n", cpu); pr_debug("CPU%d going offline\n", cpu);
if (cpu_has_mipsmt || cpu_has_vp) { if (cpu_has_mipsmt || cpu_has_vp) {
core = cpu_data[cpu].core;
/* Look for another online VPE within the core */ /* Look for another online VPE within the core */
for_each_online_cpu(cpu_death_sibling) { for_each_online_cpu(cpu_death_sibling) {
if (cpu_data[cpu_death_sibling].core != core) if (cpu_data[cpu_death_sibling].core != core)
......
...@@ -232,6 +232,17 @@ void __init arch_init_irq(void) ...@@ -232,6 +232,17 @@ void __init arch_init_irq(void)
{ {
int corehi_irq; int corehi_irq;
/*
* Preallocate the i8259's expected virq's here. Since irqchip_init()
* will probe the irqchips in hierarchial order, i8259 is probed last.
* If anything allocates a virq before the i8259 is probed, it will
* be given one of the i8259's expected range and consequently setup
* of the i8259 will fail.
*/
WARN(irq_alloc_descs(I8259A_IRQ_BASE, I8259A_IRQ_BASE,
16, numa_node_id()) < 0,
"Cannot reserve i8259 virqs at IRQ%d\n", I8259A_IRQ_BASE);
i8259_set_poll(mips_pcibios_iack); i8259_set_poll(mips_pcibios_iack);
irqchip_init(); irqchip_init();
......
...@@ -190,7 +190,7 @@ void register_pci_controller(struct pci_controller *hose) ...@@ -190,7 +190,7 @@ void register_pci_controller(struct pci_controller *hose)
} }
INIT_LIST_HEAD(&hose->list); INIT_LIST_HEAD(&hose->list);
list_add(&hose->list, &controllers); list_add_tail(&hose->list, &controllers);
/* /*
* Do not panic here but later - this might happen before console init. * Do not panic here but later - this might happen before console init.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment