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.
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
{
|
{
|
||||||
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
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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 @@
|
|||||||
#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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user