Commit 31016e99 authored by Linus Torvalds's avatar Linus Torvalds

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()
parents 67415020 bf23690b
...@@ -400,7 +400,7 @@ config IRQ_ALL_CPUS ...@@ -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 ...@@ -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 ...@@ -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 @@ ...@@ -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, ...@@ -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 { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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 @@ ...@@ -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 @@ ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
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