Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: powerpc: Fix userspace build of ptrace.h powerpc: Fix default_machine_crash_shutdown #ifdef botch powerpc: Fix logic error in fixup_irqs powerpc/iseries: Fix possible null pointer dereference in iSeries_pcibios_fixup_resources powerpc: Linux cannot run with 0 cores powerpc: Fix feature-fixup tests for gcc 4.5 powerpc: Disable SPARSE_IRQ by default powerpc: Fix compile errors in prom_init_check for gcc 4.5 powerpc: Fix module building for gcc 4.5 and 64 bit powerpc/perf_event: Fix for power_pmu_disable()
This commit is contained in:
Коммит
31016e9941
|
@ -400,7 +400,7 @@ config IRQ_ALL_CPUS
|
||||||
|
|
||||||
config SPARSE_IRQ
|
config SPARSE_IRQ
|
||||||
bool "Support sparse irq numbering"
|
bool "Support sparse irq numbering"
|
||||||
default y
|
default n
|
||||||
help
|
help
|
||||||
This enables support for sparse irqs. This is useful for distro
|
This enables support for sparse irqs. This is useful for distro
|
||||||
kernels that want to define a high CONFIG_NR_CPUS value but still
|
kernels that want to define a high CONFIG_NR_CPUS value but still
|
||||||
|
@ -409,7 +409,7 @@ config SPARSE_IRQ
|
||||||
( Sparse IRQs can also be beneficial on NUMA boxes, as they spread
|
( Sparse IRQs can also be beneficial on NUMA boxes, as they spread
|
||||||
out the irq_desc[] array in a more NUMA-friendly way. )
|
out the irq_desc[] array in a more NUMA-friendly way. )
|
||||||
|
|
||||||
If you don't know what to do here, say Y.
|
If you don't know what to do here, say N.
|
||||||
|
|
||||||
config NUMA
|
config NUMA
|
||||||
bool "NUMA support"
|
bool "NUMA support"
|
||||||
|
|
|
@ -92,10 +92,10 @@ endif
|
||||||
else
|
else
|
||||||
KBUILD_CFLAGS += $(call cc-option,-mtune=power4)
|
KBUILD_CFLAGS += $(call cc-option,-mtune=power4)
|
||||||
endif
|
endif
|
||||||
else
|
|
||||||
LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_TUNE_CELL),y)
|
ifeq ($(CONFIG_TUNE_CELL),y)
|
||||||
KBUILD_CFLAGS += $(call cc-option,-mtune=cell)
|
KBUILD_CFLAGS += $(call cc-option,-mtune=cell)
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -24,11 +24,7 @@
|
||||||
* 2 of the License, or (at your option) any later version.
|
* 2 of the License, or (at your option) any later version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#else
|
|
||||||
#include <stdint.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
@ -364,13 +360,13 @@ static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
struct ppc_debug_info {
|
struct ppc_debug_info {
|
||||||
uint32_t version; /* Only version 1 exists to date */
|
__u32 version; /* Only version 1 exists to date */
|
||||||
uint32_t num_instruction_bps;
|
__u32 num_instruction_bps;
|
||||||
uint32_t num_data_bps;
|
__u32 num_data_bps;
|
||||||
uint32_t num_condition_regs;
|
__u32 num_condition_regs;
|
||||||
uint32_t data_bp_alignment;
|
__u32 data_bp_alignment;
|
||||||
uint32_t sizeof_condition; /* size of the DVC register */
|
__u32 sizeof_condition; /* size of the DVC register */
|
||||||
uint64_t features;
|
__u64 features;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
@ -386,13 +382,13 @@ struct ppc_debug_info {
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
struct ppc_hw_breakpoint {
|
struct ppc_hw_breakpoint {
|
||||||
uint32_t version; /* currently, version must be 1 */
|
__u32 version; /* currently, version must be 1 */
|
||||||
uint32_t trigger_type; /* only some combinations allowed */
|
__u32 trigger_type; /* only some combinations allowed */
|
||||||
uint32_t addr_mode; /* address match mode */
|
__u32 addr_mode; /* address match mode */
|
||||||
uint32_t condition_mode; /* break/watchpoint condition flags */
|
__u32 condition_mode; /* break/watchpoint condition flags */
|
||||||
uint64_t addr; /* break/watchpoint address */
|
__u64 addr; /* break/watchpoint address */
|
||||||
uint64_t addr2; /* range end or mask */
|
__u64 addr2; /* range end or mask */
|
||||||
uint64_t condition_value; /* contents of the DVC register */
|
__u64 condition_value; /* contents of the DVC register */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
|
@ -447,7 +447,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
||||||
crash_kexec_prepare_cpus(crashing_cpu);
|
crash_kexec_prepare_cpus(crashing_cpu);
|
||||||
cpu_set(crashing_cpu, cpus_in_crash);
|
cpu_set(crashing_cpu, cpus_in_crash);
|
||||||
crash_kexec_stop_spus();
|
crash_kexec_stop_spus();
|
||||||
#ifdef CONFIG_PPC_STD_MMU_64
|
#if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
|
||||||
crash_kexec_wait_realmode(crashing_cpu);
|
crash_kexec_wait_realmode(crashing_cpu);
|
||||||
#endif
|
#endif
|
||||||
if (ppc_md.kexec_cpu_down)
|
if (ppc_md.kexec_cpu_down)
|
||||||
|
|
|
@ -295,7 +295,10 @@ void fixup_irqs(const struct cpumask *map)
|
||||||
|
|
||||||
for_each_irq(irq) {
|
for_each_irq(irq) {
|
||||||
desc = irq_to_desc(irq);
|
desc = irq_to_desc(irq);
|
||||||
if (desc && desc->status & IRQ_PER_CPU)
|
if (!desc)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (desc->status & IRQ_PER_CPU)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
cpumask_and(mask, desc->affinity, map);
|
cpumask_and(mask, desc->affinity, map);
|
||||||
|
|
|
@ -791,8 +791,11 @@ static void power_pmu_disable(struct perf_event *event)
|
||||||
cpuhw = &__get_cpu_var(cpu_hw_events);
|
cpuhw = &__get_cpu_var(cpu_hw_events);
|
||||||
for (i = 0; i < cpuhw->n_events; ++i) {
|
for (i = 0; i < cpuhw->n_events; ++i) {
|
||||||
if (event == cpuhw->event[i]) {
|
if (event == cpuhw->event[i]) {
|
||||||
while (++i < cpuhw->n_events)
|
while (++i < cpuhw->n_events) {
|
||||||
cpuhw->event[i-1] = cpuhw->event[i];
|
cpuhw->event[i-1] = cpuhw->event[i];
|
||||||
|
cpuhw->events[i-1] = cpuhw->events[i];
|
||||||
|
cpuhw->flags[i-1] = cpuhw->flags[i];
|
||||||
|
}
|
||||||
--cpuhw->n_events;
|
--cpuhw->n_events;
|
||||||
ppmu->disable_pmc(event->hw.idx - 1, cpuhw->mmcr);
|
ppmu->disable_pmc(event->hw.idx - 1, cpuhw->mmcr);
|
||||||
if (event->hw.idx) {
|
if (event->hw.idx) {
|
||||||
|
|
|
@ -872,7 +872,7 @@ static void __init prom_send_capabilities(void)
|
||||||
"ibm_architecture_vec structure inconsistent: 0x%x !\n",
|
"ibm_architecture_vec structure inconsistent: 0x%x !\n",
|
||||||
*cores);
|
*cores);
|
||||||
} else {
|
} else {
|
||||||
*cores = NR_CPUS / prom_count_smt_threads();
|
*cores = DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads());
|
||||||
prom_printf("Max number of cores passed to firmware: 0x%x\n",
|
prom_printf("Max number of cores passed to firmware: 0x%x\n",
|
||||||
(unsigned long)*cores);
|
(unsigned long)*cores);
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,12 +52,18 @@ do
|
||||||
if [ "${UNDEF:0:9}" = "_restgpr_" ]; then
|
if [ "${UNDEF:0:9}" = "_restgpr_" ]; then
|
||||||
OK=1
|
OK=1
|
||||||
fi
|
fi
|
||||||
|
if [ "${UNDEF:0:10}" = "_restgpr0_" ]; then
|
||||||
|
OK=1
|
||||||
|
fi
|
||||||
if [ "${UNDEF:0:11}" = "_rest32gpr_" ]; then
|
if [ "${UNDEF:0:11}" = "_rest32gpr_" ]; then
|
||||||
OK=1
|
OK=1
|
||||||
fi
|
fi
|
||||||
if [ "${UNDEF:0:9}" = "_savegpr_" ]; then
|
if [ "${UNDEF:0:9}" = "_savegpr_" ]; then
|
||||||
OK=1
|
OK=1
|
||||||
fi
|
fi
|
||||||
|
if [ "${UNDEF:0:10}" = "_savegpr0_" ]; then
|
||||||
|
OK=1
|
||||||
|
fi
|
||||||
if [ "${UNDEF:0:11}" = "_save32gpr_" ]; then
|
if [ "${UNDEF:0:11}" = "_save32gpr_" ]; then
|
||||||
OK=1
|
OK=1
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -12,8 +12,8 @@ CFLAGS_REMOVE_code-patching.o = -pg
|
||||||
CFLAGS_REMOVE_feature-fixups.o = -pg
|
CFLAGS_REMOVE_feature-fixups.o = -pg
|
||||||
|
|
||||||
obj-y := string.o alloc.o \
|
obj-y := string.o alloc.o \
|
||||||
checksum_$(CONFIG_WORD_SIZE).o
|
checksum_$(CONFIG_WORD_SIZE).o crtsavres.o
|
||||||
obj-$(CONFIG_PPC32) += div64.o copy_32.o crtsavres.o
|
obj-$(CONFIG_PPC32) += div64.o copy_32.o
|
||||||
obj-$(CONFIG_HAS_IOMEM) += devres.o
|
obj-$(CONFIG_HAS_IOMEM) += devres.o
|
||||||
|
|
||||||
obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \
|
obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
* Written By Michael Meissner
|
* Written By Michael Meissner
|
||||||
*
|
*
|
||||||
* Based on gcc/config/rs6000/crtsavres.asm from gcc
|
* Based on gcc/config/rs6000/crtsavres.asm from gcc
|
||||||
|
* 64 bit additions from reading the PPC elf64abi document.
|
||||||
*
|
*
|
||||||
* This file is free software; you can redistribute it and/or modify it
|
* This file is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the
|
* under the terms of the GNU General Public License as published by the
|
||||||
|
@ -44,6 +45,8 @@
|
||||||
|
|
||||||
#ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
#ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||||
|
|
||||||
|
#ifndef CONFIG_PPC64
|
||||||
|
|
||||||
/* Routines for saving integer registers, called by the compiler. */
|
/* Routines for saving integer registers, called by the compiler. */
|
||||||
/* Called with r11 pointing to the stack header word of the caller of the */
|
/* Called with r11 pointing to the stack header word of the caller of the */
|
||||||
/* function, just beyond the end of the integer save area. */
|
/* function, just beyond the end of the integer save area. */
|
||||||
|
@ -226,4 +229,130 @@ _GLOBAL(_rest32gpr_31_x)
|
||||||
mtlr 0
|
mtlr 0
|
||||||
mr 1,11
|
mr 1,11
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
#else /* CONFIG_PPC64 */
|
||||||
|
|
||||||
|
.globl _savegpr0_14
|
||||||
|
_savegpr0_14:
|
||||||
|
std r14,-144(r1)
|
||||||
|
.globl _savegpr0_15
|
||||||
|
_savegpr0_15:
|
||||||
|
std r15,-136(r1)
|
||||||
|
.globl _savegpr0_16
|
||||||
|
_savegpr0_16:
|
||||||
|
std r16,-128(r1)
|
||||||
|
.globl _savegpr0_17
|
||||||
|
_savegpr0_17:
|
||||||
|
std r17,-120(r1)
|
||||||
|
.globl _savegpr0_18
|
||||||
|
_savegpr0_18:
|
||||||
|
std r18,-112(r1)
|
||||||
|
.globl _savegpr0_19
|
||||||
|
_savegpr0_19:
|
||||||
|
std r19,-104(r1)
|
||||||
|
.globl _savegpr0_20
|
||||||
|
_savegpr0_20:
|
||||||
|
std r20,-96(r1)
|
||||||
|
.globl _savegpr0_21
|
||||||
|
_savegpr0_21:
|
||||||
|
std r21,-88(r1)
|
||||||
|
.globl _savegpr0_22
|
||||||
|
_savegpr0_22:
|
||||||
|
std r22,-80(r1)
|
||||||
|
.globl _savegpr0_23
|
||||||
|
_savegpr0_23:
|
||||||
|
std r23,-72(r1)
|
||||||
|
.globl _savegpr0_24
|
||||||
|
_savegpr0_24:
|
||||||
|
std r24,-64(r1)
|
||||||
|
.globl _savegpr0_25
|
||||||
|
_savegpr0_25:
|
||||||
|
std r25,-56(r1)
|
||||||
|
.globl _savegpr0_26
|
||||||
|
_savegpr0_26:
|
||||||
|
std r26,-48(r1)
|
||||||
|
.globl _savegpr0_27
|
||||||
|
_savegpr0_27:
|
||||||
|
std r27,-40(r1)
|
||||||
|
.globl _savegpr0_28
|
||||||
|
_savegpr0_28:
|
||||||
|
std r28,-32(r1)
|
||||||
|
.globl _savegpr0_29
|
||||||
|
_savegpr0_29:
|
||||||
|
std r29,-24(r1)
|
||||||
|
.globl _savegpr0_30
|
||||||
|
_savegpr0_30:
|
||||||
|
std r30,-16(r1)
|
||||||
|
.globl _savegpr0_31
|
||||||
|
_savegpr0_31:
|
||||||
|
std r31,-8(r1)
|
||||||
|
std r0,16(r1)
|
||||||
|
blr
|
||||||
|
|
||||||
|
.globl _restgpr0_14
|
||||||
|
_restgpr0_14:
|
||||||
|
ld r14,-144(r1)
|
||||||
|
.globl _restgpr0_15
|
||||||
|
_restgpr0_15:
|
||||||
|
ld r15,-136(r1)
|
||||||
|
.globl _restgpr0_16
|
||||||
|
_restgpr0_16:
|
||||||
|
ld r16,-128(r1)
|
||||||
|
.globl _restgpr0_17
|
||||||
|
_restgpr0_17:
|
||||||
|
ld r17,-120(r1)
|
||||||
|
.globl _restgpr0_18
|
||||||
|
_restgpr0_18:
|
||||||
|
ld r18,-112(r1)
|
||||||
|
.globl _restgpr0_19
|
||||||
|
_restgpr0_19:
|
||||||
|
ld r19,-104(r1)
|
||||||
|
.globl _restgpr0_20
|
||||||
|
_restgpr0_20:
|
||||||
|
ld r20,-96(r1)
|
||||||
|
.globl _restgpr0_21
|
||||||
|
_restgpr0_21:
|
||||||
|
ld r21,-88(r1)
|
||||||
|
.globl _restgpr0_22
|
||||||
|
_restgpr0_22:
|
||||||
|
ld r22,-80(r1)
|
||||||
|
.globl _restgpr0_23
|
||||||
|
_restgpr0_23:
|
||||||
|
ld r23,-72(r1)
|
||||||
|
.globl _restgpr0_24
|
||||||
|
_restgpr0_24:
|
||||||
|
ld r24,-64(r1)
|
||||||
|
.globl _restgpr0_25
|
||||||
|
_restgpr0_25:
|
||||||
|
ld r25,-56(r1)
|
||||||
|
.globl _restgpr0_26
|
||||||
|
_restgpr0_26:
|
||||||
|
ld r26,-48(r1)
|
||||||
|
.globl _restgpr0_27
|
||||||
|
_restgpr0_27:
|
||||||
|
ld r27,-40(r1)
|
||||||
|
.globl _restgpr0_28
|
||||||
|
_restgpr0_28:
|
||||||
|
ld r28,-32(r1)
|
||||||
|
.globl _restgpr0_29
|
||||||
|
_restgpr0_29:
|
||||||
|
ld r0,16(r1)
|
||||||
|
ld r29,-24(r1)
|
||||||
|
mtlr r0
|
||||||
|
ld r30,-16(r1)
|
||||||
|
ld r31,-8(r1)
|
||||||
|
blr
|
||||||
|
|
||||||
|
.globl _restgpr0_30
|
||||||
|
_restgpr0_30:
|
||||||
|
ld r30,-16(r1)
|
||||||
|
.globl _restgpr0_31
|
||||||
|
_restgpr0_31:
|
||||||
|
ld r0,16(r1)
|
||||||
|
ld r31,-8(r1)
|
||||||
|
mtlr r0
|
||||||
|
blr
|
||||||
|
|
||||||
|
#endif /* CONFIG_PPC64 */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
* 2 of the License, or (at your option) any later version.
|
* 2 of the License, or (at your option) any later version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
@ -288,8 +289,8 @@ static void test_alternative_case_with_external_branch(void)
|
||||||
|
|
||||||
static void test_cpu_macros(void)
|
static void test_cpu_macros(void)
|
||||||
{
|
{
|
||||||
extern void ftr_fixup_test_FTR_macros;
|
extern u8 ftr_fixup_test_FTR_macros;
|
||||||
extern void ftr_fixup_test_FTR_macros_expected;
|
extern u8 ftr_fixup_test_FTR_macros_expected;
|
||||||
unsigned long size = &ftr_fixup_test_FTR_macros_expected -
|
unsigned long size = &ftr_fixup_test_FTR_macros_expected -
|
||||||
&ftr_fixup_test_FTR_macros;
|
&ftr_fixup_test_FTR_macros;
|
||||||
|
|
||||||
|
@ -301,8 +302,8 @@ static void test_cpu_macros(void)
|
||||||
static void test_fw_macros(void)
|
static void test_fw_macros(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
extern void ftr_fixup_test_FW_FTR_macros;
|
extern u8 ftr_fixup_test_FW_FTR_macros;
|
||||||
extern void ftr_fixup_test_FW_FTR_macros_expected;
|
extern u8 ftr_fixup_test_FW_FTR_macros_expected;
|
||||||
unsigned long size = &ftr_fixup_test_FW_FTR_macros_expected -
|
unsigned long size = &ftr_fixup_test_FW_FTR_macros_expected -
|
||||||
&ftr_fixup_test_FW_FTR_macros;
|
&ftr_fixup_test_FW_FTR_macros;
|
||||||
|
|
||||||
|
@ -314,10 +315,10 @@ static void test_fw_macros(void)
|
||||||
|
|
||||||
static void test_lwsync_macros(void)
|
static void test_lwsync_macros(void)
|
||||||
{
|
{
|
||||||
extern void lwsync_fixup_test;
|
extern u8 lwsync_fixup_test;
|
||||||
extern void end_lwsync_fixup_test;
|
extern u8 end_lwsync_fixup_test;
|
||||||
extern void lwsync_fixup_test_expected_LWSYNC;
|
extern u8 lwsync_fixup_test_expected_LWSYNC;
|
||||||
extern void lwsync_fixup_test_expected_SYNC;
|
extern u8 lwsync_fixup_test_expected_SYNC;
|
||||||
unsigned long size = &end_lwsync_fixup_test -
|
unsigned long size = &end_lwsync_fixup_test -
|
||||||
&lwsync_fixup_test;
|
&lwsync_fixup_test;
|
||||||
|
|
||||||
|
|
|
@ -445,7 +445,11 @@ void __init iSeries_pcibios_fixup_resources(struct pci_dev *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
allocate_device_bars(pdev);
|
allocate_device_bars(pdev);
|
||||||
iseries_device_information(pdev, bus, *sub_bus);
|
if (likely(sub_bus))
|
||||||
|
iseries_device_information(pdev, bus, *sub_bus);
|
||||||
|
else
|
||||||
|
printk(KERN_ERR "PCI: Device node %s has missing or invalid "
|
||||||
|
"linux,subbus property\n", node->full_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -503,6 +503,11 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)
|
||||||
strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
|
strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
|
||||||
strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0)
|
strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
if (info->hdr->e_machine == EM_PPC64)
|
||||||
|
/* Special register function linked on all modules during final link of .ko */
|
||||||
|
if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
|
||||||
|
strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0)
|
||||||
|
return 1;
|
||||||
/* Do not ignore this symbol */
|
/* Do not ignore this symbol */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче