Skip to content

Commit

Permalink
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6
Browse files Browse the repository at this point in the history
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6:
  sparc: Support show_unhandled_signals.
  sparc: use __ratelimit
  sunxvr500: Additional PCI id for sunxvr500 driver
  sparc: use asm-generic/scatterlist.h
  sparc64: If 'slot-names' property exist, create sysfs PCI slot information.
  sparc: remove trailing space in messages
  sparc: remove redundant return statements
  • Loading branch information
torvalds committed Mar 2, 2010
2 parents 6d6b89b + 4b17764 commit b7f3a20
Show file tree
Hide file tree
Showing 23 changed files with 176 additions and 100 deletions.
21 changes: 1 addition & 20 deletions arch/sparc/include/asm/scatterlist.h
@@ -1,27 +1,8 @@
#ifndef _SPARC_SCATTERLIST_H
#define _SPARC_SCATTERLIST_H

#include <asm/page.h>
#include <asm/types.h>

struct scatterlist {
#ifdef CONFIG_DEBUG_SG
unsigned long sg_magic;
#endif
unsigned long page_link;
unsigned int offset;

unsigned int length;

dma_addr_t dma_address;
__u32 dma_length;
};

#define sg_dma_address(sg) ((sg)->dma_address)
#define sg_dma_len(sg) ((sg)->dma_length)

#define ISA_DMA_THRESHOLD (~0UL)

#define ARCH_HAS_SG_CHAIN
#include <asm-generic/scatterlist.h>

#endif /* !(_SPARC_SCATTERLIST_H) */
2 changes: 0 additions & 2 deletions arch/sparc/kernel/devices.c
Expand Up @@ -143,6 +143,4 @@ void __init device_scan(void)

if (ARCH_SUN4C)
sun4c_probe_memerr_reg();

return;
}
2 changes: 1 addition & 1 deletion arch/sparc/kernel/leon_kernel.c
Expand Up @@ -124,7 +124,7 @@ void __init leon_init_timers(irq_handler_t counter_fn)

if (!(LEON3_BYPASS_LOAD_PA(&leon3_gptimer_regs->config) &
(1<<LEON3_GPTIMER_SEPIRQ))) {
prom_printf("irq timer not configured with seperate irqs \n");
prom_printf("irq timer not configured with separate irqs\n");
BUG();
}

Expand Down
4 changes: 2 additions & 2 deletions arch/sparc/kernel/leon_smp.c
Expand Up @@ -177,7 +177,7 @@ void __init leon_boot_cpus(void)
int nrcpu = leon_smp_nrcpus();
int me = smp_processor_id();

printk(KERN_INFO "%d:(%d:%d) cpus mpirq at 0x%x \n", (unsigned int)me,
printk(KERN_INFO "%d:(%d:%d) cpus mpirq at 0x%x\n", (unsigned int)me,
(unsigned int)nrcpu, (unsigned int)NR_CPUS,
(unsigned int)&(leon3_irqctrl_regs->mpstatus));

Expand Down Expand Up @@ -226,7 +226,7 @@ int __cpuinit leon_boot_one_cpu(int i)
break;
udelay(200);
}
printk(KERN_INFO "Started CPU %d \n", (unsigned int)i);
printk(KERN_INFO "Started CPU %d\n", (unsigned int)i);

if (!(cpu_callin_map[i])) {
printk(KERN_ERR "Processor %d is stuck.\n", i);
Expand Down
75 changes: 75 additions & 0 deletions arch/sparc/kernel/pci.c
Expand Up @@ -1095,3 +1095,78 @@ static int __init pcibios_init(void)
return 0;
}
subsys_initcall(pcibios_init);

#ifdef CONFIG_SYSFS
static void __devinit pci_bus_slot_names(struct device_node *node,
struct pci_bus *bus)
{
const struct pci_slot_names {
u32 slot_mask;
char names[0];
} *prop;
const char *sp;
int len, i;
u32 mask;

prop = of_get_property(node, "slot-names", &len);
if (!prop)
return;

mask = prop->slot_mask;
sp = prop->names;

if (ofpci_verbose)
printk("PCI: Making slots for [%s] mask[0x%02x]\n",
node->full_name, mask);

i = 0;
while (mask) {
struct pci_slot *pci_slot;
u32 this_bit = 1 << i;

if (!(mask & this_bit)) {
i++;
continue;
}

if (ofpci_verbose)
printk("PCI: Making slot [%s]\n", sp);

pci_slot = pci_create_slot(bus, i, sp, NULL);
if (IS_ERR(pci_slot))
printk(KERN_ERR "PCI: pci_create_slot returned %ld\n",
PTR_ERR(pci_slot));

sp += strlen(sp) + 1;
mask &= ~this_bit;
i++;
}
}

static int __init of_pci_slot_init(void)
{
struct pci_bus *pbus = NULL;

while ((pbus = pci_find_next_bus(pbus)) != NULL) {
struct device_node *node;

if (pbus->self) {
struct dev_archdata *sd = pbus->self->sysdata;

/* PCI->PCI bridge */
node = sd->prom_node;
} else {
struct pci_pbm_info *pbm = pbus->sysdata;

/* Host PCI controller */
node = pbm->op->node;
}

pci_bus_slot_names(node, pbus);
}

return 0;
}

module_init(of_pci_slot_init);
#endif
2 changes: 0 additions & 2 deletions arch/sparc/kernel/pcic.c
Expand Up @@ -585,8 +585,6 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node)
writew(ivec, pcic->pcic_regs+PCI_INT_SELECT_LO);
}
}

return;
}

/*
Expand Down
2 changes: 0 additions & 2 deletions arch/sparc/kernel/setup_32.c
Expand Up @@ -95,8 +95,6 @@ static void prom_sync_me(void)
"nop\n\t"
"nop\n\t" : : "r" (prom_tbr));
local_irq_restore(flags);

return;
}

static unsigned int boot_flags __initdata = 0;
Expand Down
2 changes: 1 addition & 1 deletion arch/sparc/kernel/sun4d_smp.c
Expand Up @@ -194,7 +194,7 @@ int __cpuinit smp4d_boot_one_cpu(int i)
smp_penguin_ctable.reg_size = 0;

/* whirrr, whirrr, whirrrrrrrrr... */
SMP_PRINTK(("Starting CPU %d at %p \n", i, entry));
SMP_PRINTK(("Starting CPU %d at %p\n", i, entry));
local_flush_cache_all();
prom_startcpu(cpu_node,
&smp_penguin_ctable, 0, (char *)entry);
Expand Down
11 changes: 3 additions & 8 deletions arch/sparc/kernel/unaligned_64.c
Expand Up @@ -21,6 +21,7 @@
#include <linux/smp.h>
#include <linux/bitops.h>
#include <linux/perf_event.h>
#include <linux/ratelimit.h>
#include <asm/fpumacro.h>

enum direction {
Expand Down Expand Up @@ -274,13 +275,9 @@ static void kernel_mna_trap_fault(int fixup_tstate_asi)

static void log_unaligned(struct pt_regs *regs)
{
static unsigned long count, last_time;
static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 5);

if (time_after(jiffies, last_time + 5 * HZ))
count = 0;
if (count < 5) {
last_time = jiffies;
count++;
if (__ratelimit(&ratelimit)) {
printk("Kernel unaligned access at TPC[%lx] %pS\n",
regs->tpc, (void *) regs->tpc);
}
Expand Down Expand Up @@ -636,7 +633,6 @@ void handle_lddfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr
return;
}
advance(regs);
return;
}

void handle_stdfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr)
Expand Down Expand Up @@ -685,5 +681,4 @@ void handle_stdfmna(struct pt_regs *regs, unsigned long sfar, unsigned long sfsr
return;
}
advance(regs);
return;
}
106 changes: 60 additions & 46 deletions arch/sparc/mm/fault_32.c
Expand Up @@ -35,6 +35,8 @@

extern int prom_node_root;

int show_unhandled_signals = 1;

/* At boot time we determine these two values necessary for setting
* up the segment maps and page table entries (pte's).
*/
Expand Down Expand Up @@ -149,6 +151,45 @@ asmlinkage int lookup_fault(unsigned long pc, unsigned long ret_pc,
return 0;
}

static inline void
show_signal_msg(struct pt_regs *regs, int sig, int code,
unsigned long address, struct task_struct *tsk)
{
if (!unhandled_signal(tsk, sig))
return;

if (!printk_ratelimit())
return;

printk("%s%s[%d]: segfault at %lx ip %p (rpc %p) sp %p error %x",
task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG,
tsk->comm, task_pid_nr(tsk), address,
(void *)regs->pc, (void *)regs->u_regs[UREG_I7],
(void *)regs->u_regs[UREG_FP], code);

print_vma_addr(KERN_CONT " in ", regs->pc);

printk(KERN_CONT "\n");
}

static void __do_fault_siginfo(int code, int sig, struct pt_regs *regs,
unsigned long addr)
{
siginfo_t info;

info.si_signo = sig;
info.si_code = code;
info.si_errno = 0;
info.si_addr = (void __user *) addr;
info.si_trapno = 0;

if (unlikely(show_unhandled_signals))
show_signal_msg(regs, sig, info.si_code,
addr, current);

force_sig_info (sig, &info, current);
}

extern unsigned long safe_compute_effective_address(struct pt_regs *,
unsigned int);

Expand All @@ -168,6 +209,14 @@ static unsigned long compute_si_addr(struct pt_regs *regs, int text_fault)
return safe_compute_effective_address(regs, insn);
}

static noinline void do_fault_siginfo(int code, int sig, struct pt_regs *regs,
int text_fault)
{
unsigned long addr = compute_si_addr(regs, text_fault);

__do_fault_siginfo(code, sig, regs, addr);
}

asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
unsigned long address)
{
Expand All @@ -176,9 +225,8 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
struct mm_struct *mm = tsk->mm;
unsigned int fixup;
unsigned long g2;
siginfo_t info;
int from_user = !(regs->psr & PSR_PS);
int fault;
int fault, code;

if(text_fault)
address = regs->pc;
Expand All @@ -195,7 +243,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
if (!ARCH_SUN4C && address >= TASK_SIZE)
goto vmalloc_fault;

info.si_code = SEGV_MAPERR;
code = SEGV_MAPERR;

/*
* If we're in an interrupt or have no user
Expand Down Expand Up @@ -229,7 +277,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
* we can handle it..
*/
good_area:
info.si_code = SEGV_ACCERR;
code = SEGV_ACCERR;
if(write) {
if(!(vma->vm_flags & VM_WRITE))
goto bad_area;
Expand Down Expand Up @@ -273,18 +321,8 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,

bad_area_nosemaphore:
/* User mode accesses just cause a SIGSEGV */
if(from_user) {
#if 0
printk("Fault whee %s [%d]: segfaults at %08lx pc=%08lx\n",
tsk->comm, tsk->pid, address, regs->pc);
#endif
info.si_signo = SIGSEGV;
info.si_errno = 0;
/* info.si_code set above to make clear whether
this was a SEGV_MAPERR or SEGV_ACCERR fault. */
info.si_addr = (void __user *)compute_si_addr(regs, text_fault);
info.si_trapno = 0;
force_sig_info (SIGSEGV, &info, tsk);
if (from_user) {
do_fault_siginfo(code, SIGSEGV, regs, text_fault);
return;
}

Expand Down Expand Up @@ -335,12 +373,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,

do_sigbus:
up_read(&mm->mmap_sem);
info.si_signo = SIGBUS;
info.si_errno = 0;
info.si_code = BUS_ADRERR;
info.si_addr = (void __user *) compute_si_addr(regs, text_fault);
info.si_trapno = 0;
force_sig_info (SIGBUS, &info, tsk);
do_fault_siginfo(BUS_ADRERR, SIGBUS, regs, text_fault);
if (!from_user)
goto no_context;

Expand Down Expand Up @@ -466,14 +499,10 @@ static void force_user_fault(unsigned long address, int write)
struct vm_area_struct *vma;
struct task_struct *tsk = current;
struct mm_struct *mm = tsk->mm;
siginfo_t info;
int code;

info.si_code = SEGV_MAPERR;
code = SEGV_MAPERR;

#if 0
printk("wf<pid=%d,wr=%d,addr=%08lx>\n",
tsk->pid, write, address);
#endif
down_read(&mm->mmap_sem);
vma = find_vma(mm, address);
if(!vma)
Expand All @@ -485,7 +514,7 @@ static void force_user_fault(unsigned long address, int write)
if(expand_stack(vma, address))
goto bad_area;
good_area:
info.si_code = SEGV_ACCERR;
code = SEGV_ACCERR;
if(write) {
if(!(vma->vm_flags & VM_WRITE))
goto bad_area;
Expand All @@ -502,27 +531,12 @@ static void force_user_fault(unsigned long address, int write)
return;
bad_area:
up_read(&mm->mmap_sem);
#if 0
printk("Window whee %s [%d]: segfaults at %08lx\n",
tsk->comm, tsk->pid, address);
#endif
info.si_signo = SIGSEGV;
info.si_errno = 0;
/* info.si_code set above to make clear whether
this was a SEGV_MAPERR or SEGV_ACCERR fault. */
info.si_addr = (void __user *) address;
info.si_trapno = 0;
force_sig_info (SIGSEGV, &info, tsk);
__do_fault_siginfo(code, SIGSEGV, tsk->thread.kregs, address);
return;

do_sigbus:
up_read(&mm->mmap_sem);
info.si_signo = SIGBUS;
info.si_errno = 0;
info.si_code = BUS_ADRERR;
info.si_addr = (void __user *) address;
info.si_trapno = 0;
force_sig_info (SIGBUS, &info, tsk);
__do_fault_siginfo(BUS_ADRERR, SIGBUS, tsk->thread.kregs, address);
}

void window_overflow_fault(void)
Expand Down

0 comments on commit b7f3a20

Please sign in to comment.