Commit 6612538c authored by Hiroshi Shimamoto's avatar Hiroshi Shimamoto Committed by Ingo Molnar

x86: clean up process_32/64.c

White space and coding style clean up.
Make process_32/64.c similar.
Signed-off-by: default avatarHiroshi Shimamoto <h-shimamoto@ct.jp.nec.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 3c2362e6
...@@ -142,7 +142,7 @@ EXPORT_SYMBOL(default_idle); ...@@ -142,7 +142,7 @@ EXPORT_SYMBOL(default_idle);
* to poll the ->work.need_resched flag instead of waiting for the * to poll the ->work.need_resched flag instead of waiting for the
* cross-CPU IPI to arrive. Use this option with caution. * cross-CPU IPI to arrive. Use this option with caution.
*/ */
static void poll_idle (void) static void poll_idle(void)
{ {
cpu_relax(); cpu_relax();
} }
...@@ -493,7 +493,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, ...@@ -493,7 +493,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
p->thread.ip = (unsigned long) ret_from_fork; p->thread.ip = (unsigned long) ret_from_fork;
savesegment(gs,p->thread.gs); savesegment(gs, p->thread.gs);
tsk = current; tsk = current;
if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) { if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
...@@ -571,7 +571,7 @@ void dump_thread(struct pt_regs * regs, struct user * dump) ...@@ -571,7 +571,7 @@ void dump_thread(struct pt_regs * regs, struct user * dump)
} }
EXPORT_SYMBOL(dump_thread); EXPORT_SYMBOL(dump_thread);
/* /*
* Capture the user space registers if the task is not running (in user space) * Capture the user space registers if the task is not running (in user space)
*/ */
int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs) int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Pentium III FXSR, SSE support * Pentium III FXSR, SSE support
* Gareth Hughes <gareth@valinux.com>, May 2000 * Gareth Hughes <gareth@valinux.com>, May 2000
* *
* X86-64 port * X86-64 port
* Andi Kleen. * Andi Kleen.
* *
...@@ -19,19 +19,19 @@ ...@@ -19,19 +19,19 @@
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/fs.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/fs.h>
#include <linux/elfcore.h> #include <linux/elfcore.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/user.h> #include <linux/user.h>
#include <linux/module.h>
#include <linux/a.out.h> #include <linux/a.out.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/utsname.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/module.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/utsname.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/kprobes.h> #include <linux/kprobes.h>
...@@ -129,54 +129,12 @@ static void default_idle(void) ...@@ -129,54 +129,12 @@ static void default_idle(void)
* to poll the ->need_resched flag instead of waiting for the * to poll the ->need_resched flag instead of waiting for the
* cross-CPU IPI to arrive. Use this option with caution. * cross-CPU IPI to arrive. Use this option with caution.
*/ */
static void poll_idle (void) static void poll_idle(void)
{ {
local_irq_enable(); local_irq_enable();
cpu_relax(); cpu_relax();
} }
static void do_nothing(void *unused)
{
}
void cpu_idle_wait(void)
{
unsigned int cpu, this_cpu = get_cpu();
cpumask_t map, tmp = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
put_cpu();
cpus_clear(map);
for_each_online_cpu(cpu) {
per_cpu(cpu_idle_state, cpu) = 1;
cpu_set(cpu, map);
}
__get_cpu_var(cpu_idle_state) = 0;
wmb();
do {
ssleep(1);
for_each_online_cpu(cpu) {
if (cpu_isset(cpu, map) &&
!per_cpu(cpu_idle_state, cpu))
cpu_clear(cpu, map);
}
cpus_and(map, map, cpu_online_map);
/*
* We waited 1 sec, if a CPU still did not call idle
* it may be because it is in idle and not waking up
* because it has nothing to do.
* Give all the remaining CPUS a kick.
*/
smp_call_function_mask(map, do_nothing, 0, 0);
} while (!cpus_empty(map));
set_cpus_allowed(current, tmp);
}
EXPORT_SYMBOL_GPL(cpu_idle_wait);
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
DECLARE_PER_CPU(int, cpu_state); DECLARE_PER_CPU(int, cpu_state);
...@@ -247,6 +205,47 @@ void cpu_idle(void) ...@@ -247,6 +205,47 @@ void cpu_idle(void)
} }
} }
static void do_nothing(void *unused)
{
}
void cpu_idle_wait(void)
{
unsigned int cpu, this_cpu = get_cpu();
cpumask_t map, tmp = current->cpus_allowed;
set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
put_cpu();
cpus_clear(map);
for_each_online_cpu(cpu) {
per_cpu(cpu_idle_state, cpu) = 1;
cpu_set(cpu, map);
}
__get_cpu_var(cpu_idle_state) = 0;
wmb();
do {
ssleep(1);
for_each_online_cpu(cpu) {
if (cpu_isset(cpu, map) && !per_cpu(cpu_idle_state, cpu))
cpu_clear(cpu, map);
}
cpus_and(map, map, cpu_online_map);
/*
* We waited 1 sec, if a CPU still did not call idle
* it may be because it is in idle and not waking up
* because it has nothing to do.
* Give all the remaining CPUS a kick.
*/
smp_call_function_mask(map, do_nothing, 0, 0);
} while (!cpus_empty(map));
set_cpus_allowed(current, tmp);
}
EXPORT_SYMBOL_GPL(cpu_idle_wait);
/* /*
* This uses new MONITOR/MWAIT instructions on P4 processors with PNI, * This uses new MONITOR/MWAIT instructions on P4 processors with PNI,
* which can obviate IPI to trigger checking of need_resched. * which can obviate IPI to trigger checking of need_resched.
...@@ -300,7 +299,7 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) ...@@ -300,7 +299,7 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
} }
} }
static int __init idle_setup (char *str) static int __init idle_setup(char *str)
{ {
if (!strcmp(str, "poll")) { if (!strcmp(str, "poll")) {
printk("using polling idle threads.\n"); printk("using polling idle threads.\n");
...@@ -315,13 +314,13 @@ static int __init idle_setup (char *str) ...@@ -315,13 +314,13 @@ static int __init idle_setup (char *str)
} }
early_param("idle", idle_setup); early_param("idle", idle_setup);
/* Prints also some state that isn't saved in the pt_regs */ /* Prints also some state that isn't saved in the pt_regs */
void __show_regs(struct pt_regs * regs) void __show_regs(struct pt_regs * regs)
{ {
unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs; unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs;
unsigned long d0, d1, d2, d3, d6, d7; unsigned long d0, d1, d2, d3, d6, d7;
unsigned int fsindex,gsindex; unsigned int fsindex, gsindex;
unsigned int ds,cs,es; unsigned int ds, cs, es;
printk("\n"); printk("\n");
print_modules(); print_modules();
...@@ -390,7 +389,7 @@ void exit_thread(void) ...@@ -390,7 +389,7 @@ void exit_thread(void)
struct task_struct *me = current; struct task_struct *me = current;
struct thread_struct *t = &me->thread; struct thread_struct *t = &me->thread;
if (me->thread.io_bitmap_ptr) { if (me->thread.io_bitmap_ptr) {
struct tss_struct *tss = &per_cpu(init_tss, get_cpu()); struct tss_struct *tss = &per_cpu(init_tss, get_cpu());
kfree(t->io_bitmap_ptr); kfree(t->io_bitmap_ptr);
...@@ -426,7 +425,7 @@ void flush_thread(void) ...@@ -426,7 +425,7 @@ void flush_thread(void)
tsk->thread.debugreg3 = 0; tsk->thread.debugreg3 = 0;
tsk->thread.debugreg6 = 0; tsk->thread.debugreg6 = 0;
tsk->thread.debugreg7 = 0; tsk->thread.debugreg7 = 0;
memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));
/* /*
* Forget coprocessor state.. * Forget coprocessor state..
*/ */
...@@ -449,7 +448,7 @@ void release_thread(struct task_struct *dead_task) ...@@ -449,7 +448,7 @@ void release_thread(struct task_struct *dead_task)
static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr) static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
{ {
struct user_desc ud = { struct user_desc ud = {
.base_addr = addr, .base_addr = addr,
.limit = 0xfffff, .limit = 0xfffff,
.seg_32bit = 1, .seg_32bit = 1,
...@@ -458,8 +457,8 @@ static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr) ...@@ -458,8 +457,8 @@ static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
}; };
struct n_desc_struct *desc = (void *)t->thread.tls_array; struct n_desc_struct *desc = (void *)t->thread.tls_array;
desc += tls; desc += tls;
desc->a = LDT_entry_a(&ud); desc->a = LDT_entry_a(&ud);
desc->b = LDT_entry_b(&ud); desc->b = LDT_entry_b(&ud);
} }
static inline u32 read_32bit_tls(struct task_struct *t, int tls) static inline u32 read_32bit_tls(struct task_struct *t, int tls)
...@@ -516,7 +515,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, ...@@ -516,7 +515,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr, memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr,
IO_BITMAP_BYTES); IO_BITMAP_BYTES);
set_tsk_thread_flag(p, TIF_IO_BITMAP); set_tsk_thread_flag(p, TIF_IO_BITMAP);
} }
/* /*
* Set a new TLS for the child thread? * Set a new TLS for the child thread?
...@@ -544,11 +543,29 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, ...@@ -544,11 +543,29 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
/* /*
* This special macro can be used to load a debugging register * This special macro can be used to load a debugging register
*/ */
#define loaddebug(thread,r) set_debugreg(thread->debugreg ## r, r) #define loaddebug(thread, r) set_debugreg(thread->debugreg ## r, r)
/*
* Capture the user space registers if the task is not running (in user space)
*/
int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
{
struct pt_regs *pp, ptregs;
pp = task_pt_regs(tsk);
ptregs = *pp;
ptregs.cs &= 0xffff;
ptregs.ss &= 0xffff;
elf_core_copy_regs(regs, &ptregs);
return 1;
}
static inline void __switch_to_xtra(struct task_struct *prev_p, static inline void __switch_to_xtra(struct task_struct *prev_p,
struct task_struct *next_p, struct task_struct *next_p,
struct tss_struct *tss) struct tss_struct *tss)
{ {
struct thread_struct *prev, *next; struct thread_struct *prev, *next;
...@@ -586,7 +603,7 @@ static inline void __switch_to_xtra(struct task_struct *prev_p, ...@@ -586,7 +603,7 @@ static inline void __switch_to_xtra(struct task_struct *prev_p,
/* /*
* switch_to(x,y) should switch tasks from x to y. * switch_to(x,y) should switch tasks from x to y.
* *
* This could still be optimized: * This could still be optimized:
* - fold all the options into a flag word and test it with a single test. * - fold all the options into a flag word and test it with a single test.
* - could test fs/gs bitsliced * - could test fs/gs bitsliced
* *
...@@ -597,7 +614,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) ...@@ -597,7 +614,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
{ {
struct thread_struct *prev = &prev_p->thread, struct thread_struct *prev = &prev_p->thread,
*next = &next_p->thread; *next = &next_p->thread;
int cpu = smp_processor_id(); int cpu = smp_processor_id();
struct tss_struct *tss = &per_cpu(init_tss, cpu); struct tss_struct *tss = &per_cpu(init_tss, cpu);
/* we're going to use this soon, after a few expensive things */ /* we're going to use this soon, after a few expensive things */
...@@ -700,7 +717,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) ...@@ -700,7 +717,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
/* /*
* sys_execve() executes a new program. * sys_execve() executes a new program.
*/ */
asmlinkage asmlinkage
long sys_execve(char __user *name, char __user * __user *argv, long sys_execve(char __user *name, char __user * __user *argv,
char __user * __user *envp, struct pt_regs regs) char __user * __user *envp, struct pt_regs regs)
{ {
...@@ -721,12 +738,12 @@ void set_personality_64bit(void) ...@@ -721,12 +738,12 @@ void set_personality_64bit(void)
/* inherit personality from parent */ /* inherit personality from parent */
/* Make sure to be in 64bit mode */ /* Make sure to be in 64bit mode */
clear_thread_flag(TIF_IA32); clear_thread_flag(TIF_IA32);
/* TBD: overwrites user setup. Should have two bits. /* TBD: overwrites user setup. Should have two bits.
But 64bit processes have always behaved this way, But 64bit processes have always behaved this way,
so it's not too bad. The main problem is just that so it's not too bad. The main problem is just that
32bit childs are affected again. */ 32bit childs are affected again. */
current->personality &= ~READ_IMPLIES_EXEC; current->personality &= ~READ_IMPLIES_EXEC;
} }
...@@ -819,19 +836,19 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) ...@@ -819,19 +836,19 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
/* Not strictly needed for fs, but do it for symmetry /* Not strictly needed for fs, but do it for symmetry
with gs */ with gs */
if (addr >= TASK_SIZE_OF(task)) if (addr >= TASK_SIZE_OF(task))
return -EPERM; return -EPERM;
cpu = get_cpu(); cpu = get_cpu();
/* handle small bases via the GDT because that's faster to /* handle small bases via the GDT because that's faster to
switch. */ switch. */
if (addr <= 0xffffffff) { if (addr <= 0xffffffff) {
set_32bit_tls(task, FS_TLS, addr); set_32bit_tls(task, FS_TLS, addr);
if (doit) { if (doit) {
load_TLS(&task->thread, cpu); load_TLS(&task->thread, cpu);
asm volatile("movl %0,%%fs" :: "r"(FS_TLS_SEL)); asm volatile("movl %0,%%fs" :: "r"(FS_TLS_SEL));
} }
task->thread.fsindex = FS_TLS_SEL; task->thread.fsindex = FS_TLS_SEL;
task->thread.fs = 0; task->thread.fs = 0;
} else { } else {
task->thread.fsindex = 0; task->thread.fsindex = 0;
task->thread.fs = addr; task->thread.fs = addr;
if (doit) { if (doit) {
...@@ -843,24 +860,24 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) ...@@ -843,24 +860,24 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
} }
put_cpu(); put_cpu();
break; break;
case ARCH_GET_FS: { case ARCH_GET_FS: {
unsigned long base; unsigned long base;
if (task->thread.fsindex == FS_TLS_SEL) if (task->thread.fsindex == FS_TLS_SEL)
base = read_32bit_tls(task, FS_TLS); base = read_32bit_tls(task, FS_TLS);
else if (doit) else if (doit)
rdmsrl(MSR_FS_BASE, base); rdmsrl(MSR_FS_BASE, base);
else else
base = task->thread.fs; base = task->thread.fs;
ret = put_user(base, (unsigned long __user *)addr); ret = put_user(base, (unsigned long __user *)addr);
break; break;
} }
case ARCH_GET_GS: { case ARCH_GET_GS: {
unsigned long base; unsigned long base;
unsigned gsindex; unsigned gsindex;
if (task->thread.gsindex == GS_TLS_SEL) if (task->thread.gsindex == GS_TLS_SEL)
base = read_32bit_tls(task, GS_TLS); base = read_32bit_tls(task, GS_TLS);
else if (doit) { else if (doit) {
asm("movl %%gs,%0" : "=r" (gsindex)); asm("movl %%gs,%0" : "=r" (gsindex));
if (gsindex) if (gsindex)
rdmsrl(MSR_KERNEL_GS_BASE, base); rdmsrl(MSR_KERNEL_GS_BASE, base);
else else
...@@ -868,39 +885,21 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) ...@@ -868,39 +885,21 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
} }
else else
base = task->thread.gs; base = task->thread.gs;
ret = put_user(base, (unsigned long __user *)addr); ret = put_user(base, (unsigned long __user *)addr);
break; break;
} }
default: default:
ret = -EINVAL; ret = -EINVAL;
break; break;
} }
return ret; return ret;
} }
long sys_arch_prctl(int code, unsigned long addr) long sys_arch_prctl(int code, unsigned long addr)
{ {
return do_arch_prctl(current, code, addr); return do_arch_prctl(current, code, addr);
}
/*
* Capture the user space registers if the task is not running (in user space)
*/
int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
{
struct pt_regs *pp, ptregs;
pp = task_pt_regs(tsk);
ptregs = *pp;
ptregs.cs &= 0xffff;
ptregs.ss &= 0xffff;
elf_core_copy_regs(regs, &ptregs);
return 1;
} }
unsigned long arch_align_stack(unsigned long sp) unsigned long arch_align_stack(unsigned long sp)
......
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