diff options
| -rw-r--r-- | arch/x86/ia32/ia32_aout.c | 11 | ||||
| -rw-r--r-- | arch/x86/ia32/ia32_signal.c | 21 | ||||
| -rw-r--r-- | include/asm-x86/elf.h | 5 |
3 files changed, 20 insertions, 17 deletions
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index a0e1dbe67dc1..127ec3f07214 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
| @@ -85,8 +85,10 @@ static void dump_thread32(struct pt_regs *regs, struct user32 *dump) | |||
| 85 | dump->regs.ax = regs->ax; | 85 | dump->regs.ax = regs->ax; |
| 86 | dump->regs.ds = current->thread.ds; | 86 | dump->regs.ds = current->thread.ds; |
| 87 | dump->regs.es = current->thread.es; | 87 | dump->regs.es = current->thread.es; |
| 88 | asm("movl %%fs,%0" : "=r" (fs)); dump->regs.fs = fs; | 88 | savesegment(fs, fs); |
| 89 | asm("movl %%gs,%0" : "=r" (gs)); dump->regs.gs = gs; | 89 | dump->regs.fs = fs; |
| 90 | savesegment(gs, gs); | ||
| 91 | dump->regs.gs = gs; | ||
| 90 | dump->regs.orig_ax = regs->orig_ax; | 92 | dump->regs.orig_ax = regs->orig_ax; |
| 91 | dump->regs.ip = regs->ip; | 93 | dump->regs.ip = regs->ip; |
| 92 | dump->regs.cs = regs->cs; | 94 | dump->regs.cs = regs->cs; |
| @@ -430,8 +432,9 @@ beyond_if: | |||
| 430 | current->mm->start_stack = | 432 | current->mm->start_stack = |
| 431 | (unsigned long)create_aout_tables((char __user *)bprm->p, bprm); | 433 | (unsigned long)create_aout_tables((char __user *)bprm->p, bprm); |
| 432 | /* start thread */ | 434 | /* start thread */ |
| 433 | asm volatile("movl %0,%%fs" :: "r" (0)); \ | 435 | loadsegment(fs, 0); |
| 434 | asm volatile("movl %0,%%es; movl %0,%%ds": :"r" (__USER32_DS)); | 436 | loadsegment(ds, __USER32_DS); |
| 437 | loadsegment(es, __USER32_DS); | ||
| 435 | load_gs_index(0); | 438 | load_gs_index(0); |
| 436 | (regs)->ip = ex.a_entry; | 439 | (regs)->ip = ex.a_entry; |
| 437 | (regs)->sp = current->mm->start_stack; | 440 | (regs)->sp = current->mm->start_stack; |
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index 20af4c79579a..f1a2ac777faf 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
| @@ -206,7 +206,7 @@ struct rt_sigframe | |||
| 206 | { unsigned int cur; \ | 206 | { unsigned int cur; \ |
| 207 | unsigned short pre; \ | 207 | unsigned short pre; \ |
| 208 | err |= __get_user(pre, &sc->seg); \ | 208 | err |= __get_user(pre, &sc->seg); \ |
| 209 | asm volatile("movl %%" #seg ",%0" : "=r" (cur)); \ | 209 | savesegment(seg, cur); \ |
| 210 | pre |= mask; \ | 210 | pre |= mask; \ |
| 211 | if (pre != cur) loadsegment(seg, pre); } | 211 | if (pre != cur) loadsegment(seg, pre); } |
| 212 | 212 | ||
| @@ -235,7 +235,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, | |||
| 235 | */ | 235 | */ |
| 236 | err |= __get_user(gs, &sc->gs); | 236 | err |= __get_user(gs, &sc->gs); |
| 237 | gs |= 3; | 237 | gs |= 3; |
| 238 | asm("movl %%gs,%0" : "=r" (oldgs)); | 238 | savesegment(gs, oldgs); |
| 239 | if (gs != oldgs) | 239 | if (gs != oldgs) |
| 240 | load_gs_index(gs); | 240 | load_gs_index(gs); |
| 241 | 241 | ||
| @@ -355,14 +355,13 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, | |||
| 355 | { | 355 | { |
| 356 | int tmp, err = 0; | 356 | int tmp, err = 0; |
| 357 | 357 | ||
| 358 | tmp = 0; | 358 | savesegment(gs, tmp); |
| 359 | __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp)); | ||
| 360 | err |= __put_user(tmp, (unsigned int __user *)&sc->gs); | 359 | err |= __put_user(tmp, (unsigned int __user *)&sc->gs); |
| 361 | __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp)); | 360 | savesegment(fs, tmp); |
| 362 | err |= __put_user(tmp, (unsigned int __user *)&sc->fs); | 361 | err |= __put_user(tmp, (unsigned int __user *)&sc->fs); |
| 363 | __asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp)); | 362 | savesegment(ds, tmp); |
| 364 | err |= __put_user(tmp, (unsigned int __user *)&sc->ds); | 363 | err |= __put_user(tmp, (unsigned int __user *)&sc->ds); |
| 365 | __asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp)); | 364 | savesegment(es, tmp); |
| 366 | err |= __put_user(tmp, (unsigned int __user *)&sc->es); | 365 | err |= __put_user(tmp, (unsigned int __user *)&sc->es); |
| 367 | 366 | ||
| 368 | err |= __put_user((u32)regs->di, &sc->di); | 367 | err |= __put_user((u32)regs->di, &sc->di); |
| @@ -498,8 +497,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
| 498 | regs->dx = 0; | 497 | regs->dx = 0; |
| 499 | regs->cx = 0; | 498 | regs->cx = 0; |
| 500 | 499 | ||
| 501 | asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); | 500 | loadsegment(ds, __USER32_DS); |
| 502 | asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); | 501 | loadsegment(es, __USER32_DS); |
| 503 | 502 | ||
| 504 | regs->cs = __USER32_CS; | 503 | regs->cs = __USER32_CS; |
| 505 | regs->ss = __USER32_DS; | 504 | regs->ss = __USER32_DS; |
| @@ -591,8 +590,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 591 | regs->dx = (unsigned long) &frame->info; | 590 | regs->dx = (unsigned long) &frame->info; |
| 592 | regs->cx = (unsigned long) &frame->uc; | 591 | regs->cx = (unsigned long) &frame->uc; |
| 593 | 592 | ||
| 594 | asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); | 593 | loadsegment(ds, __USER32_DS); |
| 595 | asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); | 594 | loadsegment(es, __USER32_DS); |
| 596 | 595 | ||
| 597 | regs->cs = __USER32_CS; | 596 | regs->cs = __USER32_CS; |
| 598 | regs->ss = __USER32_DS; | 597 | regs->ss = __USER32_DS; |
diff --git a/include/asm-x86/elf.h b/include/asm-x86/elf.h index 7be4733c793e..acbf3451b964 100644 --- a/include/asm-x86/elf.h +++ b/include/asm-x86/elf.h | |||
| @@ -148,8 +148,9 @@ do { \ | |||
| 148 | 148 | ||
| 149 | static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp) | 149 | static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp) |
| 150 | { | 150 | { |
| 151 | asm volatile("movl %0,%%fs" :: "r" (0)); | 151 | loadsegment(fs, 0); |
| 152 | asm volatile("movl %0,%%es; movl %0,%%ds" : : "r" (__USER32_DS)); | 152 | loadsegment(ds, __USER32_DS); |
| 153 | loadsegment(es, __USER32_DS); | ||
| 153 | load_gs_index(0); | 154 | load_gs_index(0); |
| 154 | regs->ip = ip; | 155 | regs->ip = ip; |
| 155 | regs->sp = sp; | 156 | regs->sp = sp; |
