diff --git a/kernel.spec b/kernel.spec index 2a5c22c..4683fbc 100644 --- a/kernel.spec +++ b/kernel.spec @@ -620,6 +620,7 @@ Patch31: linux-2.6-utrace.patch Patch32: linux-2.6-utrace-ptrace.patch Patch150: linux-2.6.29-sparc-IOC_TYPECHECK.patch +Patch151: sparc64_fix_build_errors_with_gcc460.patch Patch160: linux-2.6-32bit-mmap-exec-randomization.patch Patch161: linux-2.6-i386-nx-emulation.patch @@ -1192,6 +1193,7 @@ ApplyPatch linux-2.6-utrace-ptrace.patch # SPARC64 # ApplyPatch linux-2.6.29-sparc-IOC_TYPECHECK.patch +ApplyPatch sparc64_fix_build_errors_with_gcc460.patch # # Exec shield @@ -1970,6 +1972,9 @@ fi # and build. %changelog +* Wed Mar 09 2011 Dennis Gilmore +- apply sparc64 gcc-4.6.0 buildfix patch + * Wed Mar 09 2011 Ben Skeggs 2.6.38-0.rc8.git0.2 - nouveau: allow max clients on nv4x (679629), better error reporting diff --git a/sparc64_fix_build_errors_with_gcc460.patch b/sparc64_fix_build_errors_with_gcc460.patch new file mode 100644 index 0000000..807032c --- /dev/null +++ b/sparc64_fix_build_errors_with_gcc460.patch @@ -0,0 +1,305 @@ +From dbb988cf34a62e69c8863f212be212c6841004ba Mon Sep 17 00:00:00 2001 +From: David S. Miller +Date: Sat, 26 Feb 2011 23:40:02 -0800 +Subject: [PATCH] sparc64: Fix build errors with gcc-4.6.0 + +Most of the warnings emitted (we fail arch/sparc file +builds with -Werror) were legitimate but harmless, however +one case (n2_pcr_write) was a genuine bug. + +Based almost entirely upon a patch by Sam Ravnborg. + +Reported-by: Dennis Gilmore +Signed-off-by: David S. Miller +--- + arch/sparc/kernel/iommu.c | 3 --- + arch/sparc/kernel/ldc.c | 28 ++++++++++++++++++---------- + arch/sparc/kernel/pci.c | 1 + + arch/sparc/kernel/pci_common.c | 11 +++++++---- + arch/sparc/kernel/pci_fire.c | 2 -- + arch/sparc/kernel/pci_schizo.c | 4 +--- + arch/sparc/kernel/pci_sun4v.c | 3 +-- + arch/sparc/kernel/pcr.c | 2 +- + arch/sparc/kernel/ptrace_64.c | 3 ++- + arch/sparc/kernel/smp_64.c | 11 ++++------- + arch/sparc/kernel/traps_64.c | 3 +-- + 11 files changed, 36 insertions(+), 35 deletions(-) + +diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c +index 72509d0..6f01e8c 100644 +--- a/arch/sparc/kernel/iommu.c ++++ b/arch/sparc/kernel/iommu.c +@@ -333,13 +333,10 @@ static void dma_4u_free_coherent(struct device *dev, size_t size, + void *cpu, dma_addr_t dvma) + { + struct iommu *iommu; +- iopte_t *iopte; + unsigned long flags, order, npages; + + npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT; + iommu = dev->archdata.iommu; +- iopte = iommu->page_table + +- ((dvma - iommu->page_table_map_base) >> IO_PAGE_SHIFT); + + spin_lock_irqsave(&iommu->lock, flags); + +diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c +index df39a0f..732b0bc 100644 +--- a/arch/sparc/kernel/ldc.c ++++ b/arch/sparc/kernel/ldc.c +@@ -790,16 +790,20 @@ static void send_events(struct ldc_channel *lp, unsigned int event_mask) + static irqreturn_t ldc_rx(int irq, void *dev_id) + { + struct ldc_channel *lp = dev_id; +- unsigned long orig_state, hv_err, flags; ++ unsigned long orig_state, flags; + unsigned int event_mask; + + spin_lock_irqsave(&lp->lock, flags); + + orig_state = lp->chan_state; +- hv_err = sun4v_ldc_rx_get_state(lp->id, +- &lp->rx_head, +- &lp->rx_tail, +- &lp->chan_state); ++ ++ /* We should probably check for hypervisor errors here and ++ * reset the LDC channel if we get one. ++ */ ++ sun4v_ldc_rx_get_state(lp->id, ++ &lp->rx_head, ++ &lp->rx_tail, ++ &lp->chan_state); + + ldcdbg(RX, "RX state[0x%02lx:0x%02lx] head[0x%04lx] tail[0x%04lx]\n", + orig_state, lp->chan_state, lp->rx_head, lp->rx_tail); +@@ -904,16 +908,20 @@ out: + static irqreturn_t ldc_tx(int irq, void *dev_id) + { + struct ldc_channel *lp = dev_id; +- unsigned long flags, hv_err, orig_state; ++ unsigned long flags, orig_state; + unsigned int event_mask = 0; + + spin_lock_irqsave(&lp->lock, flags); + + orig_state = lp->chan_state; +- hv_err = sun4v_ldc_tx_get_state(lp->id, +- &lp->tx_head, +- &lp->tx_tail, +- &lp->chan_state); ++ ++ /* We should probably check for hypervisor errors here and ++ * reset the LDC channel if we get one. ++ */ ++ sun4v_ldc_tx_get_state(lp->id, ++ &lp->tx_head, ++ &lp->tx_tail, ++ &lp->chan_state); + + ldcdbg(TX, " TX state[0x%02lx:0x%02lx] head[0x%04lx] tail[0x%04lx]\n", + orig_state, lp->chan_state, lp->tx_head, lp->tx_tail); +diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c +index 4137579..f255382 100644 +--- a/arch/sparc/kernel/pci.c ++++ b/arch/sparc/kernel/pci.c +@@ -675,6 +675,7 @@ static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus) + * humanoid. + */ + err = sysfs_create_file(&dev->dev.kobj, &dev_attr_obppath.attr); ++ (void) err; + } + list_for_each_entry(child_bus, &bus->children, node) + pci_bus_register_of_sysfs(child_bus); +diff --git a/arch/sparc/kernel/pci_common.c b/arch/sparc/kernel/pci_common.c +index 6c7a33a..6e3874b 100644 +--- a/arch/sparc/kernel/pci_common.c ++++ b/arch/sparc/kernel/pci_common.c +@@ -295,14 +295,17 @@ static int sun4v_write_pci_cfg(struct pci_bus *bus_dev, unsigned int devfn, + unsigned int bus = bus_dev->number; + unsigned int device = PCI_SLOT(devfn); + unsigned int func = PCI_FUNC(devfn); +- unsigned long ret; + + if (config_out_of_range(pbm, bus, devfn, where)) { + /* Do nothing. */ + } else { +- ret = pci_sun4v_config_put(devhandle, +- HV_PCI_DEVICE_BUILD(bus, device, func), +- where, size, value); ++ /* We don't check for hypervisor errors here, but perhaps ++ * we should and influence our return value depending upon ++ * what kind of error is thrown. ++ */ ++ pci_sun4v_config_put(devhandle, ++ HV_PCI_DEVICE_BUILD(bus, device, func), ++ where, size, value); + } + return PCIBIOS_SUCCESSFUL; + } +diff --git a/arch/sparc/kernel/pci_fire.c b/arch/sparc/kernel/pci_fire.c +index efb896d..75dfeb6 100644 +--- a/arch/sparc/kernel/pci_fire.c ++++ b/arch/sparc/kernel/pci_fire.c +@@ -214,11 +214,9 @@ static int pci_fire_msi_setup(struct pci_pbm_info *pbm, unsigned long msiqid, + + static int pci_fire_msi_teardown(struct pci_pbm_info *pbm, unsigned long msi) + { +- unsigned long msiqid; + u64 val; + + val = upa_readq(pbm->pbm_regs + MSI_MAP(msi)); +- msiqid = (val & MSI_MAP_EQNUM); + + val &= ~MSI_MAP_VALID; + +diff --git a/arch/sparc/kernel/pci_schizo.c b/arch/sparc/kernel/pci_schizo.c +index 445a47a..4620eb7 100644 +--- a/arch/sparc/kernel/pci_schizo.c ++++ b/arch/sparc/kernel/pci_schizo.c +@@ -1313,7 +1313,7 @@ static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm, + const struct linux_prom64_registers *regs; + struct device_node *dp = op->dev.of_node; + const char *chipset_name; +- int is_pbm_a, err; ++ int err; + + switch (chip_type) { + case PBM_CHIP_TYPE_TOMATILLO: +@@ -1343,8 +1343,6 @@ static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm, + */ + regs = of_get_property(dp, "reg", NULL); + +- is_pbm_a = ((regs[0].phys_addr & 0x00700000) == 0x00600000); +- + pbm->next = pci_pbm_root; + pci_pbm_root = pbm; + +diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c +index 743344a..859abfd 100644 +--- a/arch/sparc/kernel/pci_sun4v.c ++++ b/arch/sparc/kernel/pci_sun4v.c +@@ -580,7 +580,7 @@ static int __devinit pci_sun4v_iommu_init(struct pci_pbm_info *pbm) + { + static const u32 vdma_default[] = { 0x80000000, 0x80000000 }; + struct iommu *iommu = pbm->iommu; +- unsigned long num_tsb_entries, sz, tsbsize; ++ unsigned long num_tsb_entries, sz; + u32 dma_mask, dma_offset; + const u32 *vdma; + +@@ -596,7 +596,6 @@ static int __devinit pci_sun4v_iommu_init(struct pci_pbm_info *pbm) + + dma_mask = (roundup_pow_of_two(vdma[1]) - 1UL); + num_tsb_entries = vdma[1] / IO_PAGE_SIZE; +- tsbsize = num_tsb_entries * sizeof(iopte_t); + + dma_offset = vdma[0]; + +diff --git a/arch/sparc/kernel/pcr.c b/arch/sparc/kernel/pcr.c +index 7c2ced6..8ac23e6 100644 +--- a/arch/sparc/kernel/pcr.c ++++ b/arch/sparc/kernel/pcr.c +@@ -81,7 +81,7 @@ static void n2_pcr_write(u64 val) + unsigned long ret; + + ret = sun4v_niagara2_setperf(HV_N2_PERF_SPARC_CTL, val); +- if (val != HV_EOK) ++ if (ret != HV_EOK) + write_pcr(val); + } + +diff --git a/arch/sparc/kernel/ptrace_64.c b/arch/sparc/kernel/ptrace_64.c +index 9ccc812..96ee50a 100644 +--- a/arch/sparc/kernel/ptrace_64.c ++++ b/arch/sparc/kernel/ptrace_64.c +@@ -1086,6 +1086,7 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs) + + asmlinkage void syscall_trace_leave(struct pt_regs *regs) + { ++#ifdef CONFIG_AUDITSYSCALL + if (unlikely(current->audit_context)) { + unsigned long tstate = regs->tstate; + int result = AUDITSC_SUCCESS; +@@ -1095,7 +1096,7 @@ asmlinkage void syscall_trace_leave(struct pt_regs *regs) + + audit_syscall_exit(result, regs->u_regs[UREG_I0]); + } +- ++#endif + if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) + trace_sys_exit(regs, regs->u_regs[UREG_G1]); + +diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c +index 555a76d..3e94a8c 100644 +--- a/arch/sparc/kernel/smp_64.c ++++ b/arch/sparc/kernel/smp_64.c +@@ -189,7 +189,7 @@ static inline long get_delta (long *rt, long *master) + void smp_synchronize_tick_client(void) + { + long i, delta, adj, adjust_latency = 0, done = 0; +- unsigned long flags, rt, master_time_stamp, bound; ++ unsigned long flags, rt, master_time_stamp; + #if DEBUG_TICK_SYNC + struct { + long rt; /* roundtrip time */ +@@ -208,10 +208,8 @@ void smp_synchronize_tick_client(void) + { + for (i = 0; i < NUM_ROUNDS; i++) { + delta = get_delta(&rt, &master_time_stamp); +- if (delta == 0) { ++ if (delta == 0) + done = 1; /* let's lock on to this... */ +- bound = rt; +- } + + if (!done) { + if (i > 0) { +@@ -933,13 +931,12 @@ void smp_flush_dcache_page_impl(struct page *page, int cpu) + void flush_dcache_page_all(struct mm_struct *mm, struct page *page) + { + void *pg_addr; +- int this_cpu; + u64 data0; + + if (tlb_type == hypervisor) + return; + +- this_cpu = get_cpu(); ++ preempt_disable(); + + #ifdef CONFIG_DEBUG_DCFLUSH + atomic_inc(&dcpage_flushes); +@@ -964,7 +961,7 @@ void flush_dcache_page_all(struct mm_struct *mm, struct page *page) + } + __local_flush_dcache_page(page); + +- put_cpu(); ++ preempt_enable(); + } + + void __irq_entry smp_new_mmu_context_version_client(int irq, struct pt_regs *regs) +diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c +index 42ad2ba..9456472 100644 +--- a/arch/sparc/kernel/traps_64.c ++++ b/arch/sparc/kernel/traps_64.c +@@ -2152,7 +2152,7 @@ static void user_instruction_dump(unsigned int __user *pc) + + void show_stack(struct task_struct *tsk, unsigned long *_ksp) + { +- unsigned long fp, thread_base, ksp; ++ unsigned long fp, ksp; + struct thread_info *tp; + int count = 0; + #ifdef CONFIG_FUNCTION_GRAPH_TRACER +@@ -2173,7 +2173,6 @@ void show_stack(struct task_struct *tsk, unsigned long *_ksp) + flushw_all(); + + fp = ksp + STACK_BIAS; +- thread_base = (unsigned long) tp; + + printk("Call Trace:\n"); + do { +-- +1.7.4.1 +