mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branch 'x86-64'
* x86-64: (83 commits) [PATCH] x86_64: x86_64 stack usage debugging [PATCH] x86_64: (resend) x86_64 stack overflow debugging [PATCH] x86_64: msi_apic.c build fix [PATCH] x86_64: i386/x86-64 Add nmi watchdog support for new Intel CPUs [PATCH] x86_64: Avoid broadcasting NMI IPIs [PATCH] x86_64: fix apic error on bootup [PATCH] x86_64: enlarge window for stack growth [PATCH] x86_64: Minor string functions optimizations [PATCH] x86_64: Move export symbols to their C functions [PATCH] x86_64: Standardize i386/x86_64 handling of NMI_VECTOR [PATCH] x86_64: Fix modular pc speaker [PATCH] x86_64: remove sys32_ni_syscall() [PATCH] x86_64: Do not use -ffunction-sections for modules [PATCH] x86_64: Add cpu_relax to apic_wait_icr_idle [PATCH] x86_64: adjust kstack_depth_to_print default [PATCH] i386/x86-64: adjust /proc/interrupts column headings [PATCH] x86_64: Fix race in cpu_local_* on preemptible kernels [PATCH] x86_64: Fix fast check in safe_smp_processor_id [PATCH] x86_64: x86_64 setup.c - printing cmp related boottime information [PATCH] i386/x86-64/ia64: Move polling flag into thread_info_status ... Manual resolve of trivial conflict in arch/i386/kernel/Makefile
This commit is contained in:
commit
81a07d7588
147 changed files with 5319 additions and 1648 deletions
|
|
@ -5,6 +5,8 @@
|
|||
|
||||
#include <asm/types.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct alt_instr {
|
||||
u8 *instr; /* original instruction */
|
||||
u8 *replacement;
|
||||
|
|
|
|||
|
|
@ -111,24 +111,12 @@ extern void init_apic_mappings (void);
|
|||
extern void smp_local_timer_interrupt (struct pt_regs * regs);
|
||||
extern void setup_boot_APIC_clock (void);
|
||||
extern void setup_secondary_APIC_clock (void);
|
||||
extern void setup_apic_nmi_watchdog (void);
|
||||
extern int reserve_lapic_nmi(void);
|
||||
extern void release_lapic_nmi(void);
|
||||
extern void disable_timer_nmi_watchdog(void);
|
||||
extern void enable_timer_nmi_watchdog(void);
|
||||
extern void nmi_watchdog_tick (struct pt_regs * regs);
|
||||
extern int APIC_init_uniprocessor (void);
|
||||
extern void disable_APIC_timer(void);
|
||||
extern void enable_APIC_timer(void);
|
||||
|
||||
extern void enable_NMI_through_LVT0 (void * dummy);
|
||||
|
||||
extern unsigned int nmi_watchdog;
|
||||
#define NMI_NONE 0
|
||||
#define NMI_IO_APIC 1
|
||||
#define NMI_LOCAL_APIC 2
|
||||
#define NMI_INVALID 3
|
||||
|
||||
extern int disable_timer_pin_1;
|
||||
|
||||
void smp_send_timer_broadcast_ipi(struct pt_regs *regs);
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@
|
|||
#define X86_FEATURE_CONSTANT_TSC (3*32+ 8) /* TSC ticks at a constant rate */
|
||||
#define X86_FEATURE_UP (3*32+ 9) /* smp kernel running on up */
|
||||
#define X86_FEATURE_FXSAVE_LEAK (3*32+10) /* FXSAVE leaks FOP/FIP/FOP */
|
||||
#define X86_FEATURE_ARCH_PERFMON (3*32+11) /* Intel Architectural PerfMon */
|
||||
|
||||
/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
|
||||
#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */
|
||||
|
|
|
|||
54
include/asm-i386/dwarf2.h
Normal file
54
include/asm-i386/dwarf2.h
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
#ifndef _DWARF2_H
|
||||
#define _DWARF2_H
|
||||
|
||||
#include <linux/config.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#warning "asm/dwarf2.h should be only included in pure assembly files"
|
||||
#endif
|
||||
|
||||
/*
|
||||
Macros for dwarf2 CFI unwind table entries.
|
||||
See "as.info" for details on these pseudo ops. Unfortunately
|
||||
they are only supported in very new binutils, so define them
|
||||
away for older version.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_UNWIND_INFO
|
||||
|
||||
#define CFI_STARTPROC .cfi_startproc
|
||||
#define CFI_ENDPROC .cfi_endproc
|
||||
#define CFI_DEF_CFA .cfi_def_cfa
|
||||
#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register
|
||||
#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset
|
||||
#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset
|
||||
#define CFI_OFFSET .cfi_offset
|
||||
#define CFI_REL_OFFSET .cfi_rel_offset
|
||||
#define CFI_REGISTER .cfi_register
|
||||
#define CFI_RESTORE .cfi_restore
|
||||
#define CFI_REMEMBER_STATE .cfi_remember_state
|
||||
#define CFI_RESTORE_STATE .cfi_restore_state
|
||||
|
||||
#else
|
||||
|
||||
/* Due to the structure of pre-exisiting code, don't use assembler line
|
||||
comment character # to ignore the arguments. Instead, use a dummy macro. */
|
||||
.macro ignore a=0, b=0, c=0, d=0
|
||||
.endm
|
||||
|
||||
#define CFI_STARTPROC ignore
|
||||
#define CFI_ENDPROC ignore
|
||||
#define CFI_DEF_CFA ignore
|
||||
#define CFI_DEF_CFA_REGISTER ignore
|
||||
#define CFI_DEF_CFA_OFFSET ignore
|
||||
#define CFI_ADJUST_CFA_OFFSET ignore
|
||||
#define CFI_OFFSET ignore
|
||||
#define CFI_REL_OFFSET ignore
|
||||
#define CFI_REGISTER ignore
|
||||
#define CFI_RESTORE ignore
|
||||
#define CFI_REMEMBER_STATE ignore
|
||||
#define CFI_RESTORE_STATE ignore
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
@ -19,6 +19,8 @@
|
|||
|
||||
struct hw_interrupt_type;
|
||||
|
||||
#define NMI_VECTOR 0x02
|
||||
|
||||
/*
|
||||
* Various low-level irq details needed by irq.c, process.c,
|
||||
* time.c, io_apic.c and smp.c
|
||||
|
|
|
|||
19
include/asm-i386/intel_arch_perfmon.h
Normal file
19
include/asm-i386/intel_arch_perfmon.h
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
#ifndef X86_INTEL_ARCH_PERFMON_H
|
||||
#define X86_INTEL_ARCH_PERFMON_H 1
|
||||
|
||||
#define MSR_ARCH_PERFMON_PERFCTR0 0xc1
|
||||
#define MSR_ARCH_PERFMON_PERFCTR1 0xc2
|
||||
|
||||
#define MSR_ARCH_PERFMON_EVENTSEL0 0x186
|
||||
#define MSR_ARCH_PERFMON_EVENTSEL1 0x187
|
||||
|
||||
#define ARCH_PERFMON_EVENTSEL0_ENABLE (1 << 22)
|
||||
#define ARCH_PERFMON_EVENTSEL_INT (1 << 20)
|
||||
#define ARCH_PERFMON_EVENTSEL_OS (1 << 17)
|
||||
#define ARCH_PERFMON_EVENTSEL_USR (1 << 16)
|
||||
|
||||
#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL (0x3c)
|
||||
#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8)
|
||||
#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT (1 << 0)
|
||||
|
||||
#endif /* X86_INTEL_ARCH_PERFMON_H */
|
||||
1
include/asm-i386/k8.h
Normal file
1
include/asm-i386/k8.h
Normal file
|
|
@ -0,0 +1 @@
|
|||
#include <asm-x86_64/k8.h>
|
||||
|
|
@ -55,12 +55,26 @@ static __inline__ void local_sub(long i, local_t *v)
|
|||
* much more efficient than these naive implementations. Note they take
|
||||
* a variable, not an address.
|
||||
*/
|
||||
#define cpu_local_read(v) local_read(&__get_cpu_var(v))
|
||||
#define cpu_local_set(v, i) local_set(&__get_cpu_var(v), (i))
|
||||
#define cpu_local_inc(v) local_inc(&__get_cpu_var(v))
|
||||
#define cpu_local_dec(v) local_dec(&__get_cpu_var(v))
|
||||
#define cpu_local_add(i, v) local_add((i), &__get_cpu_var(v))
|
||||
#define cpu_local_sub(i, v) local_sub((i), &__get_cpu_var(v))
|
||||
|
||||
/* Need to disable preemption for the cpu local counters otherwise we could
|
||||
still access a variable of a previous CPU in a non atomic way. */
|
||||
#define cpu_local_wrap_v(v) \
|
||||
({ local_t res__; \
|
||||
preempt_disable(); \
|
||||
res__ = (v); \
|
||||
preempt_enable(); \
|
||||
res__; })
|
||||
#define cpu_local_wrap(v) \
|
||||
({ preempt_disable(); \
|
||||
v; \
|
||||
preempt_enable(); }) \
|
||||
|
||||
#define cpu_local_read(v) cpu_local_wrap_v(local_read(&__get_cpu_var(v)))
|
||||
#define cpu_local_set(v, i) cpu_local_wrap(local_set(&__get_cpu_var(v), (i)))
|
||||
#define cpu_local_inc(v) cpu_local_wrap(local_inc(&__get_cpu_var(v)))
|
||||
#define cpu_local_dec(v) cpu_local_wrap(local_dec(&__get_cpu_var(v)))
|
||||
#define cpu_local_add(i, v) cpu_local_wrap(local_add((i), &__get_cpu_var(v)))
|
||||
#define cpu_local_sub(i, v) cpu_local_wrap(local_sub((i), &__get_cpu_var(v)))
|
||||
|
||||
#define __cpu_local_inc(v) cpu_local_inc(v)
|
||||
#define __cpu_local_dec(v) cpu_local_dec(v)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
#ifndef __ASM_MACH_IPI_H
|
||||
#define __ASM_MACH_IPI_H
|
||||
|
||||
/* Avoid include hell */
|
||||
#define NMI_VECTOR 0x02
|
||||
|
||||
void send_IPI_mask_bitmask(cpumask_t mask, int vector);
|
||||
void __send_IPI_shortcut(unsigned int shortcut, int vector);
|
||||
|
||||
|
|
@ -13,7 +16,7 @@ static inline void send_IPI_mask(cpumask_t mask, int vector)
|
|||
|
||||
static inline void __local_send_IPI_allbutself(int vector)
|
||||
{
|
||||
if (no_broadcast) {
|
||||
if (no_broadcast || vector == NMI_VECTOR) {
|
||||
cpumask_t mask = cpu_online_map;
|
||||
|
||||
cpu_clear(smp_processor_id(), mask);
|
||||
|
|
@ -24,7 +27,7 @@ static inline void __local_send_IPI_allbutself(int vector)
|
|||
|
||||
static inline void __local_send_IPI_all(int vector)
|
||||
{
|
||||
if (no_broadcast)
|
||||
if (no_broadcast || vector == NMI_VECTOR)
|
||||
send_IPI_mask(cpu_online_map, vector);
|
||||
else
|
||||
__send_IPI_shortcut(APIC_DEST_ALLINC, vector);
|
||||
|
|
|
|||
|
|
@ -5,24 +5,38 @@
|
|||
#define ASM_NMI_H
|
||||
|
||||
#include <linux/pm.h>
|
||||
|
||||
|
||||
struct pt_regs;
|
||||
|
||||
|
||||
typedef int (*nmi_callback_t)(struct pt_regs * regs, int cpu);
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* set_nmi_callback
|
||||
*
|
||||
* Set a handler for an NMI. Only one handler may be
|
||||
* set. Return 1 if the NMI was handled.
|
||||
*/
|
||||
void set_nmi_callback(nmi_callback_t callback);
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* unset_nmi_callback
|
||||
*
|
||||
* Remove the handler previously set.
|
||||
*/
|
||||
void unset_nmi_callback(void);
|
||||
|
||||
|
||||
extern void setup_apic_nmi_watchdog (void);
|
||||
extern int reserve_lapic_nmi(void);
|
||||
extern void release_lapic_nmi(void);
|
||||
extern void disable_timer_nmi_watchdog(void);
|
||||
extern void enable_timer_nmi_watchdog(void);
|
||||
extern void nmi_watchdog_tick (struct pt_regs * regs);
|
||||
|
||||
extern unsigned int nmi_watchdog;
|
||||
#define NMI_DEFAULT -1
|
||||
#define NMI_NONE 0
|
||||
#define NMI_IO_APIC 1
|
||||
#define NMI_LOCAL_APIC 2
|
||||
#define NMI_INVALID 3
|
||||
|
||||
#endif /* ASM_NMI_H */
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ extern char ignore_fpu_irq;
|
|||
extern void identify_cpu(struct cpuinfo_x86 *);
|
||||
extern void print_cpu_info(struct cpuinfo_x86 *);
|
||||
extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
|
||||
extern unsigned short num_cache_leaves;
|
||||
|
||||
#ifdef CONFIG_X86_HT
|
||||
extern void detect_ht(struct cpuinfo_x86 *c);
|
||||
|
|
@ -554,7 +555,7 @@ extern void prepare_to_copy(struct task_struct *tsk);
|
|||
extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
|
||||
|
||||
extern unsigned long thread_saved_pc(struct task_struct *tsk);
|
||||
void show_trace(struct task_struct *task, unsigned long *stack);
|
||||
void show_trace(struct task_struct *task, struct pt_regs *regs, unsigned long *stack);
|
||||
|
||||
unsigned long get_wchan(struct task_struct *p);
|
||||
|
||||
|
|
|
|||
|
|
@ -140,8 +140,7 @@ register unsigned long current_stack_pointer asm("esp") __attribute_used__;
|
|||
#define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */
|
||||
#define TIF_SECCOMP 8 /* secure computing */
|
||||
#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */
|
||||
#define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */
|
||||
#define TIF_MEMDIE 17
|
||||
#define TIF_MEMDIE 16
|
||||
|
||||
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
|
||||
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
|
||||
|
|
@ -153,7 +152,6 @@ register unsigned long current_stack_pointer asm("esp") __attribute_used__;
|
|||
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
|
||||
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
|
||||
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
||||
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
||||
|
||||
/* work to do on interrupt/exception return */
|
||||
#define _TIF_WORK_MASK \
|
||||
|
|
@ -170,6 +168,9 @@ register unsigned long current_stack_pointer asm("esp") __attribute_used__;
|
|||
* have to worry about atomic accesses.
|
||||
*/
|
||||
#define TS_USEDFPU 0x0001 /* FPU was used by this task this quantum (SMP) */
|
||||
#define TS_POLLING 0x0002 /* True if in idle loop and not sleeping */
|
||||
|
||||
#define tsk_is_polling(t) ((t)->thread_info->status & TS_POLLING)
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
|
|
|
|||
98
include/asm-i386/unwind.h
Normal file
98
include/asm-i386/unwind.h
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
#ifndef _ASM_I386_UNWIND_H
|
||||
#define _ASM_I386_UNWIND_H
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002-2006 Novell, Inc.
|
||||
* Jan Beulich <jbeulich@novell.com>
|
||||
* This code is released under version 2 of the GNU GPL.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_STACK_UNWIND
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
struct unwind_frame_info
|
||||
{
|
||||
struct pt_regs regs;
|
||||
struct task_struct *task;
|
||||
};
|
||||
|
||||
#define UNW_PC(frame) (frame)->regs.eip
|
||||
#define UNW_SP(frame) (frame)->regs.esp
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
#define UNW_FP(frame) (frame)->regs.ebp
|
||||
#define FRAME_RETADDR_OFFSET 4
|
||||
#define FRAME_LINK_OFFSET 0
|
||||
#define STACK_BOTTOM(tsk) STACK_LIMIT((tsk)->thread.esp0)
|
||||
#define STACK_TOP(tsk) ((tsk)->thread.esp0)
|
||||
#endif
|
||||
#define STACK_LIMIT(ptr) (((ptr) - 1) & ~(THREAD_SIZE - 1))
|
||||
|
||||
#define UNW_REGISTER_INFO \
|
||||
PTREGS_INFO(eax), \
|
||||
PTREGS_INFO(ecx), \
|
||||
PTREGS_INFO(edx), \
|
||||
PTREGS_INFO(ebx), \
|
||||
PTREGS_INFO(esp), \
|
||||
PTREGS_INFO(ebp), \
|
||||
PTREGS_INFO(esi), \
|
||||
PTREGS_INFO(edi), \
|
||||
PTREGS_INFO(eip)
|
||||
|
||||
static inline void arch_unw_init_frame_info(struct unwind_frame_info *info,
|
||||
/*const*/ struct pt_regs *regs)
|
||||
{
|
||||
if (user_mode_vm(regs))
|
||||
info->regs = *regs;
|
||||
else {
|
||||
memcpy(&info->regs, regs, offsetof(struct pt_regs, esp));
|
||||
info->regs.esp = (unsigned long)®s->esp;
|
||||
info->regs.xss = __KERNEL_DS;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void arch_unw_init_blocked(struct unwind_frame_info *info)
|
||||
{
|
||||
memset(&info->regs, 0, sizeof(info->regs));
|
||||
info->regs.eip = info->task->thread.eip;
|
||||
info->regs.xcs = __KERNEL_CS;
|
||||
__get_user(info->regs.ebp, (long *)info->task->thread.esp);
|
||||
info->regs.esp = info->task->thread.esp;
|
||||
info->regs.xss = __KERNEL_DS;
|
||||
info->regs.xds = __USER_DS;
|
||||
info->regs.xes = __USER_DS;
|
||||
}
|
||||
|
||||
extern asmlinkage int arch_unwind_init_running(struct unwind_frame_info *,
|
||||
asmlinkage int (*callback)(struct unwind_frame_info *,
|
||||
void *arg),
|
||||
void *arg);
|
||||
|
||||
static inline int arch_unw_user_mode(const struct unwind_frame_info *info)
|
||||
{
|
||||
#if 0 /* This can only work when selector register and EFLAGS saves/restores
|
||||
are properly annotated (and tracked in UNW_REGISTER_INFO). */
|
||||
return user_mode_vm(&info->regs);
|
||||
#else
|
||||
return info->regs.eip < PAGE_OFFSET
|
||||
|| (info->regs.eip >= __fix_to_virt(FIX_VSYSCALL)
|
||||
&& info->regs.eip < __fix_to_virt(FIX_VSYSCALL) + PAGE_SIZE)
|
||||
|| info->regs.esp < PAGE_OFFSET;
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define UNW_PC(frame) ((void)(frame), 0)
|
||||
|
||||
static inline int arch_unw_user_mode(const void *info)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_I386_UNWIND_H */
|
||||
Loading…
Reference in a new issue