Commit d470c05b authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'sh/for-2.6.32' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6

* 'sh/for-2.6.32' of git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6:
  sh: Fix a TRACE_IRQS_OFF typo.
  sh: Optimize the setup_rt_frame() I-cache flush.
  sh: Populate initial secondary CPU info from boot_cpu_data.
  sh: Tidy up SMP cpuinfo.
  sh: Use boot_cpu_data for FPU tests in sigcontext paths.
  sh: ftrace: Fix up syscall tracepoint support.
  sh: force dcache flush if dcache_dirty bit set.
  sh: update die() output.
parents ee67e6cb 457b6461
...@@ -121,7 +121,7 @@ noresched: ...@@ -121,7 +121,7 @@ noresched:
ENTRY(resume_userspace) ENTRY(resume_userspace)
! r8: current_thread_info ! r8: current_thread_info
cli cli
TRACE_IRQS_OfF TRACE_IRQS_OFF
mov.l @(TI_FLAGS,r8), r0 ! current_thread_info->flags mov.l @(TI_FLAGS,r8), r0 ! current_thread_info->flags
tst #(_TIF_WORK_MASK & 0xff), r0 tst #(_TIF_WORK_MASK & 0xff), r0
bt/s __restore_all bt/s __restore_all
......
...@@ -291,31 +291,48 @@ struct syscall_metadata *syscall_nr_to_meta(int nr) ...@@ -291,31 +291,48 @@ struct syscall_metadata *syscall_nr_to_meta(int nr)
return syscalls_metadata[nr]; return syscalls_metadata[nr];
} }
void arch_init_ftrace_syscalls(void) int syscall_name_to_nr(char *name)
{
int i;
if (!syscalls_metadata)
return -1;
for (i = 0; i < NR_syscalls; i++)
if (syscalls_metadata[i])
if (!strcmp(syscalls_metadata[i]->name, name))
return i;
return -1;
}
void set_syscall_enter_id(int num, int id)
{
syscalls_metadata[num]->enter_id = id;
}
void set_syscall_exit_id(int num, int id)
{
syscalls_metadata[num]->exit_id = id;
}
static int __init arch_init_ftrace_syscalls(void)
{ {
int i; int i;
struct syscall_metadata *meta; struct syscall_metadata *meta;
unsigned long **psys_syscall_table = &sys_call_table; unsigned long **psys_syscall_table = &sys_call_table;
static atomic_t refs;
if (atomic_inc_return(&refs) != 1)
goto end;
syscalls_metadata = kzalloc(sizeof(*syscalls_metadata) * syscalls_metadata = kzalloc(sizeof(*syscalls_metadata) *
FTRACE_SYSCALL_MAX, GFP_KERNEL); FTRACE_SYSCALL_MAX, GFP_KERNEL);
if (!syscalls_metadata) { if (!syscalls_metadata) {
WARN_ON(1); WARN_ON(1);
return; return -ENOMEM;
} }
for (i = 0; i < FTRACE_SYSCALL_MAX; i++) { for (i = 0; i < FTRACE_SYSCALL_MAX; i++) {
meta = find_syscall_meta(psys_syscall_table[i]); meta = find_syscall_meta(psys_syscall_table[i]);
syscalls_metadata[i] = meta; syscalls_metadata[i] = meta;
} }
return;
/* Paranoid: avoid overflow */ return 0;
end:
atomic_dec(&refs);
} }
arch_initcall(arch_init_ftrace_syscalls);
#endif /* CONFIG_FTRACE_SYSCALLS */ #endif /* CONFIG_FTRACE_SYSCALLS */
...@@ -549,6 +549,8 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -549,6 +549,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
if (cpu == 0) if (cpu == 0)
seq_printf(m, "machine\t\t: %s\n", get_system_type()); seq_printf(m, "machine\t\t: %s\n", get_system_type());
else
seq_printf(m, "\n");
seq_printf(m, "processor\t: %d\n", cpu); seq_printf(m, "processor\t: %d\n", cpu);
seq_printf(m, "cpu family\t: %s\n", init_utsname()->machine); seq_printf(m, "cpu family\t: %s\n", init_utsname()->machine);
......
...@@ -145,7 +145,7 @@ static inline int restore_sigcontext_fpu(struct sigcontext __user *sc) ...@@ -145,7 +145,7 @@ static inline int restore_sigcontext_fpu(struct sigcontext __user *sc)
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
if (!(current_cpu_data.flags & CPU_HAS_FPU)) if (!(boot_cpu_data.flags & CPU_HAS_FPU))
return 0; return 0;
set_used_math(); set_used_math();
...@@ -158,7 +158,7 @@ static inline int save_sigcontext_fpu(struct sigcontext __user *sc, ...@@ -158,7 +158,7 @@ static inline int save_sigcontext_fpu(struct sigcontext __user *sc,
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
if (!(current_cpu_data.flags & CPU_HAS_FPU)) if (!(boot_cpu_data.flags & CPU_HAS_FPU))
return 0; return 0;
if (!used_math()) { if (!used_math()) {
...@@ -199,7 +199,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *r0_p ...@@ -199,7 +199,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *r0_p
#undef COPY #undef COPY
#ifdef CONFIG_SH_FPU #ifdef CONFIG_SH_FPU
if (current_cpu_data.flags & CPU_HAS_FPU) { if (boot_cpu_data.flags & CPU_HAS_FPU) {
int owned_fp; int owned_fp;
struct task_struct *tsk = current; struct task_struct *tsk = current;
...@@ -472,6 +472,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -472,6 +472,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
err |= __put_user(OR_R0_R0, &frame->retcode[6]); err |= __put_user(OR_R0_R0, &frame->retcode[6]);
err |= __put_user((__NR_rt_sigreturn), &frame->retcode[7]); err |= __put_user((__NR_rt_sigreturn), &frame->retcode[7]);
regs->pr = (unsigned long) frame->retcode; regs->pr = (unsigned long) frame->retcode;
flush_icache_range(regs->pr, regs->pr + sizeof(frame->retcode));
} }
if (err) if (err)
...@@ -497,8 +498,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -497,8 +498,6 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
pr_debug("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n", pr_debug("SIG deliver (%s:%d): sp=%p pc=%08lx pr=%08lx\n",
current->comm, task_pid_nr(current), frame, regs->pc, regs->pr); current->comm, task_pid_nr(current), frame, regs->pc, regs->pr);
flush_icache_range(regs->pr, regs->pr + sizeof(frame->retcode));
return 0; return 0;
give_sigsegv: give_sigsegv:
......
...@@ -35,6 +35,8 @@ static inline void __init smp_store_cpu_info(unsigned int cpu) ...@@ -35,6 +35,8 @@ static inline void __init smp_store_cpu_info(unsigned int cpu)
{ {
struct sh_cpuinfo *c = cpu_data + cpu; struct sh_cpuinfo *c = cpu_data + cpu;
memcpy(c, &boot_cpu_data, sizeof(struct sh_cpuinfo));
c->loops_per_jiffy = loops_per_jiffy; c->loops_per_jiffy = loops_per_jiffy;
} }
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <linux/kexec.h> #include <linux/kexec.h>
#include <linux/limits.h> #include <linux/limits.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/sysfs.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/fpu.h> #include <asm/fpu.h>
...@@ -159,12 +160,12 @@ void die(const char * str, struct pt_regs * regs, long err) ...@@ -159,12 +160,12 @@ void die(const char * str, struct pt_regs * regs, long err)
oops_enter(); oops_enter();
console_verbose();
spin_lock_irq(&die_lock); spin_lock_irq(&die_lock);
console_verbose();
bust_spinlocks(1); bust_spinlocks(1);
printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter); printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
sysfs_printk_last_file();
print_modules(); print_modules();
show_regs(regs); show_regs(regs);
...@@ -180,6 +181,7 @@ void die(const char * str, struct pt_regs * regs, long err) ...@@ -180,6 +181,7 @@ void die(const char * str, struct pt_regs * regs, long err)
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
oops_exit();
if (kexec_should_crash(current)) if (kexec_should_crash(current))
crash_kexec(regs); crash_kexec(regs);
...@@ -190,7 +192,6 @@ void die(const char * str, struct pt_regs * regs, long err) ...@@ -190,7 +192,6 @@ void die(const char * str, struct pt_regs * regs, long err)
if (panic_on_oops) if (panic_on_oops)
panic("Fatal exception"); panic("Fatal exception");
oops_exit();
do_exit(SIGSEGV); do_exit(SIGSEGV);
} }
......
...@@ -128,7 +128,7 @@ void __update_cache(struct vm_area_struct *vma, ...@@ -128,7 +128,7 @@ void __update_cache(struct vm_area_struct *vma,
return; return;
page = pfn_to_page(pfn); page = pfn_to_page(pfn);
if (pfn_valid(pfn) && page_mapping(page)) { if (pfn_valid(pfn)) {
int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags); int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
if (dirty) { if (dirty) {
unsigned long addr = (unsigned long)page_address(page); unsigned long addr = (unsigned long)page_address(page);
......
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