From: Ingo Molnar Date: Thu, 14 Aug 2008 12:58:22 +0000 (+0200) Subject: Merge branches 'x86/prototypes', 'x86/x2apic' and 'x86/debug' into x86/core X-Git-Tag: v2.6.28-rc1~711^2~1^2~33^2~2 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=c83d12806b6185131ece682de8696d8cfb78df69;p=linux-2.6-omap-h63xx.git Merge branches 'x86/prototypes', 'x86/x2apic' and 'x86/debug' into x86/core --- c83d12806b6185131ece682de8696d8cfb78df69 diff --cc arch/x86/kernel/signal_64.c index ca316b5b742,02b02583f5b,b45ef8ddd65,47c3d249e63..2f146405005 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c @@@@@ -53,68 -54,59 -53,59 -53,6 +54,68 @@@@@ sys_sigaltstack(const stack_t __user *u return do_sigaltstack(uss, uoss, regs->sp); } +/* + * Signal frame handlers. + */ + +static inline int save_i387(struct _fpstate __user *buf) +{ + struct task_struct *tsk = current; + int err = 0; + + BUILD_BUG_ON(sizeof(struct user_i387_struct) != + sizeof(tsk->thread.xstate->fxsave)); + + if ((unsigned long)buf % 16) + printk("save_i387: bad fpstate %p\n", buf); + + if (!used_math()) + return 0; + clear_used_math(); /* trigger finit */ + if (task_thread_info(tsk)->status & TS_USEDFPU) { + err = save_i387_checking((struct i387_fxsave_struct __user *) + buf); + if (err) + return err; + task_thread_info(tsk)->status &= ~TS_USEDFPU; + stts(); + } else { + if (__copy_to_user(buf, &tsk->thread.xstate->fxsave, + sizeof(struct i387_fxsave_struct))) + return -1; + } + return 1; +} + +/* + * This restores directly out of user space. Exceptions are handled. + */ +static inline int restore_i387(struct _fpstate __user *buf) +{ + struct task_struct *tsk = current; + int err; + + if (!used_math()) { + err = init_fpu(tsk); + if (err) + return err; + } + + if (!(task_thread_info(current)->status & TS_USEDFPU)) { + clts(); + task_thread_info(current)->status |= TS_USEDFPU; + } -- return restore_fpu_checking((__force struct i387_fxsave_struct *)buf); +++ err = restore_fpu_checking((__force struct i387_fxsave_struct *)buf); +++ if (unlikely(err)) { +++ /* +++ * Encountered an error while doing the restore from the +++ * user buffer, clear the fpu state. +++ */ +++ clear_fpu(tsk); +++ clear_used_math(); +++ } +++ return err; +} /* * Do a signal return; undo the signal stack. diff --cc include/asm-x86/apic.h index bc2e364bdb1,519ad65708e,502ca6594b1,133c998161c..1311c82b165 --- a/include/asm-x86/apic.h +++ b/include/asm-x86/apic.h @@@@@ -54,8 -54,13 -54,8 -54,8 +54,13 @@@@@ extern int disable_apic #endif extern int is_vsmp_box(void); + ++extern void xapic_wait_icr_idle(void); + ++extern u32 safe_xapic_wait_icr_idle(void); + ++extern u64 xapic_icr_read(void); + ++extern void xapic_icr_write(u32, u32); + ++extern int setup_profiling_timer(unsigned int); - -static inline void native_apic_write(unsigned long reg, u32 v) + +static inline void native_apic_mem_write(u32 reg, u32 v) { volatile u32 *addr = (volatile u32 *)(APIC_BASE + reg); diff --cc include/asm-x86/traps.h index 2a891a70471,b60fab546da,a4b65a71bd6,a4b65a71bd6..2ccebc6fb0b --- a/include/asm-x86/traps.h +++ b/include/asm-x86/traps.h @@@@@ -62,5 -64,7 -62,5 -62,5 +64,7 @@@@@ asmlinkage void do_coprocessor_error(st asmlinkage void do_simd_coprocessor_error(struct pt_regs *); asmlinkage void do_spurious_interrupt_bug(struct pt_regs *); + ++asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code); + ++ #endif /* CONFIG_X86_32 */ ---#endif /* _ASM_X86_TRAPS_H */ +++#endif /* ASM_X86__TRAPS_H */