aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-12-08 16:34:53 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-08 16:34:53 -0500
commite7522ed5c0140486f68bf3351b4e667f570b8c76 (patch)
tree04d56d4647b96b9eb75b5f2c842943d099cabe42 /arch/x86
parentb391738bd1c708fe85592410c6a7c9752689481d (diff)
parente634d8fc792c66c3d4ff45518c04848c1e28f221 (diff)
Merge branch 'x86-process-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-process-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86-64: merge the standard and compat start_thread() functions x86-64: make compat_start_thread() match start_thread()
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/include/asm/elf.h20
-rw-r--r--arch/x86/kernel/process_64.c32
2 files changed, 26 insertions, 26 deletions
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
index 456a304b8172..8a024babe5e6 100644
--- a/arch/x86/include/asm/elf.h
+++ b/arch/x86/include/asm/elf.h
@@ -157,19 +157,6 @@ do { \
157 157
158#define compat_elf_check_arch(x) elf_check_arch_ia32(x) 158#define compat_elf_check_arch(x) elf_check_arch_ia32(x)
159 159
160static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp)
161{
162 loadsegment(fs, 0);
163 loadsegment(ds, __USER32_DS);
164 loadsegment(es, __USER32_DS);
165 load_gs_index(0);
166 regs->ip = ip;
167 regs->sp = sp;
168 regs->flags = X86_EFLAGS_IF;
169 regs->cs = __USER32_CS;
170 regs->ss = __USER32_DS;
171}
172
173static inline void elf_common_init(struct thread_struct *t, 160static inline void elf_common_init(struct thread_struct *t,
174 struct pt_regs *regs, const u16 ds) 161 struct pt_regs *regs, const u16 ds)
175{ 162{
@@ -191,11 +178,8 @@ do { \
191#define COMPAT_ELF_PLAT_INIT(regs, load_addr) \ 178#define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
192 elf_common_init(&current->thread, regs, __USER_DS) 179 elf_common_init(&current->thread, regs, __USER_DS)
193 180
194#define compat_start_thread(regs, ip, sp) \ 181void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp);
195do { \ 182#define compat_start_thread start_thread_ia32
196 start_ia32_thread(regs, ip, sp); \
197 set_fs(USER_DS); \
198} while (0)
199 183
200#define COMPAT_SET_PERSONALITY(ex) \ 184#define COMPAT_SET_PERSONALITY(ex) \
201do { \ 185do { \
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index a98fe88fab64..c95c8f4e790a 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -349,26 +349,42 @@ out:
349 return err; 349 return err;
350} 350}
351 351
352void 352static void
353start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) 353start_thread_common(struct pt_regs *regs, unsigned long new_ip,
354 unsigned long new_sp,
355 unsigned int _cs, unsigned int _ss, unsigned int _ds)
354{ 356{
355 loadsegment(fs, 0); 357 loadsegment(fs, 0);
356 loadsegment(es, 0); 358 loadsegment(es, _ds);
357 loadsegment(ds, 0); 359 loadsegment(ds, _ds);
358 load_gs_index(0); 360 load_gs_index(0);
359 regs->ip = new_ip; 361 regs->ip = new_ip;
360 regs->sp = new_sp; 362 regs->sp = new_sp;
361 percpu_write(old_rsp, new_sp); 363 percpu_write(old_rsp, new_sp);
362 regs->cs = __USER_CS; 364 regs->cs = _cs;
363 regs->ss = __USER_DS; 365 regs->ss = _ss;
364 regs->flags = 0x200; 366 regs->flags = X86_EFLAGS_IF;
365 set_fs(USER_DS); 367 set_fs(USER_DS);
366 /* 368 /*
367 * Free the old FP and other extended state 369 * Free the old FP and other extended state
368 */ 370 */
369 free_thread_xstate(current); 371 free_thread_xstate(current);
370} 372}
371EXPORT_SYMBOL_GPL(start_thread); 373
374void
375start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
376{
377 start_thread_common(regs, new_ip, new_sp,
378 __USER_CS, __USER_DS, 0);
379}
380
381#ifdef CONFIG_IA32_EMULATION
382void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp)
383{
384 start_thread_common(regs, new_ip, new_sp,
385 __USER32_CS, __USER32_DS, __USER32_DS);
386}
387#endif
372 388
373/* 389/*
374 * switch_to(x,y) should switch tasks from x to y. 390 * switch_to(x,y) should switch tasks from x to y.