Loading arch/x86/boot/tty.c +1 −1 Original line number Diff line number Diff line Loading @@ -74,7 +74,7 @@ static int kbd_pending(void) { u8 pending; asm volatile("int $0x16; setnz %0" : "=rm" (pending) : "=qm" (pending) : "a" (0x0100)); return pending; } Loading arch/x86/include/asm/ds.h +4 −2 Original line number Diff line number Diff line Loading @@ -23,12 +23,13 @@ #ifndef _ASM_X86_DS_H #define _ASM_X86_DS_H #ifdef CONFIG_X86_DS #include <linux/types.h> #include <linux/init.h> #ifdef CONFIG_X86_DS struct task_struct; /* Loading Loading @@ -232,7 +233,8 @@ extern void ds_free(struct ds_context *context); #else /* CONFIG_X86_DS */ #define ds_init_intel(config) do {} while (0) struct cpuinfo_x86; static inline void __cpuinit ds_init_intel(struct cpuinfo_x86 *ignored) {} #endif /* CONFIG_X86_DS */ #endif /* _ASM_X86_DS_H */ arch/x86/kernel/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o obj-y += process.o obj-y += i387.o xsave.o obj-y += ptrace.o obj-y += ds.o obj-$(CONFIG_X86_DS) += ds.o obj-$(CONFIG_X86_32) += tls.o obj-$(CONFIG_IA32_EMULATION) += tls.o obj-y += step.o Loading arch/x86/kernel/cpu/intel.c +1 −2 Original line number Diff line number Diff line Loading @@ -307,12 +307,11 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) set_cpu_cap(c, X86_FEATURE_P4); if (c->x86 == 6) set_cpu_cap(c, X86_FEATURE_P3); #endif if (cpu_has_bts) ptrace_bts_init_intel(c); #endif detect_extended_topology(c); if (!cpu_has(c, X86_FEATURE_XTOPOLOGY)) { /* Loading arch/x86/kernel/ds.c +52 −45 Original line number Diff line number Diff line Loading @@ -21,8 +21,6 @@ */ #ifdef CONFIG_X86_DS #include <asm/ds.h> #include <linux/errno.h> Loading Loading @@ -211,14 +209,15 @@ static DEFINE_PER_CPU(struct ds_context *, system_context); static inline struct ds_context *ds_get_context(struct task_struct *task) { struct ds_context *context; unsigned long irq; spin_lock(&ds_lock); spin_lock_irqsave(&ds_lock, irq); context = (task ? task->thread.ds_ctx : this_system_context); if (context) context->count++; spin_unlock(&ds_lock); spin_unlock_irqrestore(&ds_lock, irq); return context; } Loading @@ -226,43 +225,33 @@ static inline struct ds_context *ds_get_context(struct task_struct *task) /* * Same as ds_get_context, but allocates the context and it's DS * structure, if necessary; returns NULL; if out of memory. * * pre: requires ds_lock to be held */ static inline struct ds_context *ds_alloc_context(struct task_struct *task) { struct ds_context **p_context = (task ? &task->thread.ds_ctx : &this_system_context); struct ds_context *context = *p_context; unsigned long irq; if (!context) { spin_unlock(&ds_lock); context = kzalloc(sizeof(*context), GFP_KERNEL); if (!context) { spin_lock(&ds_lock); if (!context) return NULL; } context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); if (!context->ds) { kfree(context); spin_lock(&ds_lock); return NULL; } spin_lock(&ds_lock); /* * Check for race - another CPU could have allocated * it meanwhile: */ spin_lock_irqsave(&ds_lock, irq); if (*p_context) { kfree(context->ds); kfree(context); return *p_context; } context = *p_context; } else { *p_context = context; context->this = p_context; Loading @@ -272,9 +261,10 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) set_tsk_thread_flag(task, TIF_DS_AREA_MSR); if (!task || (task == current)) wrmsr(MSR_IA32_DS_AREA, (unsigned long)context->ds, 0); get_tracer(task); wrmsrl(MSR_IA32_DS_AREA, (unsigned long)context->ds); } spin_unlock_irqrestore(&ds_lock, irq); } context->count++; Loading @@ -288,10 +278,12 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) */ static inline void ds_put_context(struct ds_context *context) { unsigned long irq; if (!context) return; spin_lock(&ds_lock); spin_lock_irqsave(&ds_lock, irq); if (--context->count) goto out; Loading @@ -313,7 +305,7 @@ static inline void ds_put_context(struct ds_context *context) kfree(context->ds); kfree(context); out: spin_unlock(&ds_lock); spin_unlock_irqrestore(&ds_lock, irq); } Loading Loading @@ -384,6 +376,7 @@ static int ds_request(struct task_struct *task, void *base, size_t size, struct ds_context *context; unsigned long buffer, adj; const unsigned long alignment = (1 << 3); unsigned long irq; int error = 0; if (!ds_cfg.sizeof_ds) Loading @@ -398,26 +391,27 @@ static int ds_request(struct task_struct *task, void *base, size_t size, return -EOPNOTSUPP; spin_lock(&ds_lock); error = -ENOMEM; context = ds_alloc_context(task); if (!context) goto out_unlock; return -ENOMEM; spin_lock_irqsave(&ds_lock, irq); error = -EPERM; if (!check_tracer(task)) goto out_unlock; get_tracer(task); error = -EALREADY; if (context->owner[qual] == current) goto out_unlock; goto out_put_tracer; error = -EPERM; if (context->owner[qual] != NULL) goto out_unlock; goto out_put_tracer; context->owner[qual] = current; spin_unlock(&ds_lock); spin_unlock_irqrestore(&ds_lock, irq); error = -ENOMEM; Loading Loading @@ -465,10 +459,17 @@ static int ds_request(struct task_struct *task, void *base, size_t size, out_release: context->owner[qual] = NULL; ds_put_context(context); put_tracer(task); return error; out_put_tracer: spin_unlock_irqrestore(&ds_lock, irq); ds_put_context(context); put_tracer(task); return error; out_unlock: spin_unlock(&ds_lock); spin_unlock_irqrestore(&ds_lock, irq); ds_put_context(context); return error; } Loading Loading @@ -818,13 +819,21 @@ static const struct ds_configuration ds_cfg_var = { .sizeof_ds = sizeof(long) * 12, .sizeof_field = sizeof(long), .sizeof_rec[ds_bts] = sizeof(long) * 3, #ifdef __i386__ .sizeof_rec[ds_pebs] = sizeof(long) * 10 #else .sizeof_rec[ds_pebs] = sizeof(long) * 18 #endif }; static const struct ds_configuration ds_cfg_64 = { .sizeof_ds = 8 * 12, .sizeof_field = 8, .sizeof_rec[ds_bts] = 8 * 3, #ifdef __i386__ .sizeof_rec[ds_pebs] = 8 * 10 #else .sizeof_rec[ds_pebs] = 8 * 18 #endif }; static inline void Loading @@ -838,17 +847,16 @@ void __cpuinit ds_init_intel(struct cpuinfo_x86 *c) switch (c->x86) { case 0x6: switch (c->x86_model) { case 0 ... 0xC: /* sorry, don't know about them */ break; case 0xD: case 0xE: /* Pentium M */ ds_configure(&ds_cfg_var); break; case 0xF: /* Core2 */ case 0x1C: /* Atom */ default: /* Core2, Atom, ... */ ds_configure(&ds_cfg_64); break; default: /* sorry, don't know about them */ break; } break; case 0xF: Loading Loading @@ -878,4 +886,3 @@ void ds_free(struct ds_context *context) while (leftovers--) ds_put_context(context); } #endif /* CONFIG_X86_DS */ Loading
arch/x86/boot/tty.c +1 −1 Original line number Diff line number Diff line Loading @@ -74,7 +74,7 @@ static int kbd_pending(void) { u8 pending; asm volatile("int $0x16; setnz %0" : "=rm" (pending) : "=qm" (pending) : "a" (0x0100)); return pending; } Loading
arch/x86/include/asm/ds.h +4 −2 Original line number Diff line number Diff line Loading @@ -23,12 +23,13 @@ #ifndef _ASM_X86_DS_H #define _ASM_X86_DS_H #ifdef CONFIG_X86_DS #include <linux/types.h> #include <linux/init.h> #ifdef CONFIG_X86_DS struct task_struct; /* Loading Loading @@ -232,7 +233,8 @@ extern void ds_free(struct ds_context *context); #else /* CONFIG_X86_DS */ #define ds_init_intel(config) do {} while (0) struct cpuinfo_x86; static inline void __cpuinit ds_init_intel(struct cpuinfo_x86 *ignored) {} #endif /* CONFIG_X86_DS */ #endif /* _ASM_X86_DS_H */
arch/x86/kernel/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -46,7 +46,7 @@ obj-$(CONFIG_X86_TRAMPOLINE) += trampoline.o obj-y += process.o obj-y += i387.o xsave.o obj-y += ptrace.o obj-y += ds.o obj-$(CONFIG_X86_DS) += ds.o obj-$(CONFIG_X86_32) += tls.o obj-$(CONFIG_IA32_EMULATION) += tls.o obj-y += step.o Loading
arch/x86/kernel/cpu/intel.c +1 −2 Original line number Diff line number Diff line Loading @@ -307,12 +307,11 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) set_cpu_cap(c, X86_FEATURE_P4); if (c->x86 == 6) set_cpu_cap(c, X86_FEATURE_P3); #endif if (cpu_has_bts) ptrace_bts_init_intel(c); #endif detect_extended_topology(c); if (!cpu_has(c, X86_FEATURE_XTOPOLOGY)) { /* Loading
arch/x86/kernel/ds.c +52 −45 Original line number Diff line number Diff line Loading @@ -21,8 +21,6 @@ */ #ifdef CONFIG_X86_DS #include <asm/ds.h> #include <linux/errno.h> Loading Loading @@ -211,14 +209,15 @@ static DEFINE_PER_CPU(struct ds_context *, system_context); static inline struct ds_context *ds_get_context(struct task_struct *task) { struct ds_context *context; unsigned long irq; spin_lock(&ds_lock); spin_lock_irqsave(&ds_lock, irq); context = (task ? task->thread.ds_ctx : this_system_context); if (context) context->count++; spin_unlock(&ds_lock); spin_unlock_irqrestore(&ds_lock, irq); return context; } Loading @@ -226,43 +225,33 @@ static inline struct ds_context *ds_get_context(struct task_struct *task) /* * Same as ds_get_context, but allocates the context and it's DS * structure, if necessary; returns NULL; if out of memory. * * pre: requires ds_lock to be held */ static inline struct ds_context *ds_alloc_context(struct task_struct *task) { struct ds_context **p_context = (task ? &task->thread.ds_ctx : &this_system_context); struct ds_context *context = *p_context; unsigned long irq; if (!context) { spin_unlock(&ds_lock); context = kzalloc(sizeof(*context), GFP_KERNEL); if (!context) { spin_lock(&ds_lock); if (!context) return NULL; } context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); if (!context->ds) { kfree(context); spin_lock(&ds_lock); return NULL; } spin_lock(&ds_lock); /* * Check for race - another CPU could have allocated * it meanwhile: */ spin_lock_irqsave(&ds_lock, irq); if (*p_context) { kfree(context->ds); kfree(context); return *p_context; } context = *p_context; } else { *p_context = context; context->this = p_context; Loading @@ -272,9 +261,10 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) set_tsk_thread_flag(task, TIF_DS_AREA_MSR); if (!task || (task == current)) wrmsr(MSR_IA32_DS_AREA, (unsigned long)context->ds, 0); get_tracer(task); wrmsrl(MSR_IA32_DS_AREA, (unsigned long)context->ds); } spin_unlock_irqrestore(&ds_lock, irq); } context->count++; Loading @@ -288,10 +278,12 @@ static inline struct ds_context *ds_alloc_context(struct task_struct *task) */ static inline void ds_put_context(struct ds_context *context) { unsigned long irq; if (!context) return; spin_lock(&ds_lock); spin_lock_irqsave(&ds_lock, irq); if (--context->count) goto out; Loading @@ -313,7 +305,7 @@ static inline void ds_put_context(struct ds_context *context) kfree(context->ds); kfree(context); out: spin_unlock(&ds_lock); spin_unlock_irqrestore(&ds_lock, irq); } Loading Loading @@ -384,6 +376,7 @@ static int ds_request(struct task_struct *task, void *base, size_t size, struct ds_context *context; unsigned long buffer, adj; const unsigned long alignment = (1 << 3); unsigned long irq; int error = 0; if (!ds_cfg.sizeof_ds) Loading @@ -398,26 +391,27 @@ static int ds_request(struct task_struct *task, void *base, size_t size, return -EOPNOTSUPP; spin_lock(&ds_lock); error = -ENOMEM; context = ds_alloc_context(task); if (!context) goto out_unlock; return -ENOMEM; spin_lock_irqsave(&ds_lock, irq); error = -EPERM; if (!check_tracer(task)) goto out_unlock; get_tracer(task); error = -EALREADY; if (context->owner[qual] == current) goto out_unlock; goto out_put_tracer; error = -EPERM; if (context->owner[qual] != NULL) goto out_unlock; goto out_put_tracer; context->owner[qual] = current; spin_unlock(&ds_lock); spin_unlock_irqrestore(&ds_lock, irq); error = -ENOMEM; Loading Loading @@ -465,10 +459,17 @@ static int ds_request(struct task_struct *task, void *base, size_t size, out_release: context->owner[qual] = NULL; ds_put_context(context); put_tracer(task); return error; out_put_tracer: spin_unlock_irqrestore(&ds_lock, irq); ds_put_context(context); put_tracer(task); return error; out_unlock: spin_unlock(&ds_lock); spin_unlock_irqrestore(&ds_lock, irq); ds_put_context(context); return error; } Loading Loading @@ -818,13 +819,21 @@ static const struct ds_configuration ds_cfg_var = { .sizeof_ds = sizeof(long) * 12, .sizeof_field = sizeof(long), .sizeof_rec[ds_bts] = sizeof(long) * 3, #ifdef __i386__ .sizeof_rec[ds_pebs] = sizeof(long) * 10 #else .sizeof_rec[ds_pebs] = sizeof(long) * 18 #endif }; static const struct ds_configuration ds_cfg_64 = { .sizeof_ds = 8 * 12, .sizeof_field = 8, .sizeof_rec[ds_bts] = 8 * 3, #ifdef __i386__ .sizeof_rec[ds_pebs] = 8 * 10 #else .sizeof_rec[ds_pebs] = 8 * 18 #endif }; static inline void Loading @@ -838,17 +847,16 @@ void __cpuinit ds_init_intel(struct cpuinfo_x86 *c) switch (c->x86) { case 0x6: switch (c->x86_model) { case 0 ... 0xC: /* sorry, don't know about them */ break; case 0xD: case 0xE: /* Pentium M */ ds_configure(&ds_cfg_var); break; case 0xF: /* Core2 */ case 0x1C: /* Atom */ default: /* Core2, Atom, ... */ ds_configure(&ds_cfg_64); break; default: /* sorry, don't know about them */ break; } break; case 0xF: Loading Loading @@ -878,4 +886,3 @@ void ds_free(struct ds_context *context) while (leftovers--) ds_put_context(context); } #endif /* CONFIG_X86_DS */