Commit b6edbb1e authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar

x86_64: use save/loadsegment in ia32 compat

Use savesegment and loadsegment consistently in ia32 compat code.
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c171f465
...@@ -85,8 +85,10 @@ static void dump_thread32(struct pt_regs *regs, struct user32 *dump) ...@@ -85,8 +85,10 @@ static void dump_thread32(struct pt_regs *regs, struct user32 *dump)
dump->regs.ax = regs->ax; dump->regs.ax = regs->ax;
dump->regs.ds = current->thread.ds; dump->regs.ds = current->thread.ds;
dump->regs.es = current->thread.es; dump->regs.es = current->thread.es;
asm("movl %%fs,%0" : "=r" (fs)); dump->regs.fs = fs; savesegment(fs, fs);
asm("movl %%gs,%0" : "=r" (gs)); dump->regs.gs = gs; dump->regs.fs = fs;
savesegment(gs, gs);
dump->regs.gs = gs;
dump->regs.orig_ax = regs->orig_ax; dump->regs.orig_ax = regs->orig_ax;
dump->regs.ip = regs->ip; dump->regs.ip = regs->ip;
dump->regs.cs = regs->cs; dump->regs.cs = regs->cs;
...@@ -430,8 +432,9 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) ...@@ -430,8 +432,9 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
current->mm->start_stack = current->mm->start_stack =
(unsigned long)create_aout_tables((char __user *)bprm->p, bprm); (unsigned long)create_aout_tables((char __user *)bprm->p, bprm);
/* start thread */ /* start thread */
asm volatile("movl %0,%%fs" :: "r" (0)); \ loadsegment(fs, 0);
asm volatile("movl %0,%%es; movl %0,%%ds": :"r" (__USER32_DS)); loadsegment(ds, __USER32_DS);
loadsegment(es, __USER32_DS);
load_gs_index(0); load_gs_index(0);
(regs)->ip = ex.a_entry; (regs)->ip = ex.a_entry;
(regs)->sp = current->mm->start_stack; (regs)->sp = current->mm->start_stack;
......
...@@ -206,7 +206,7 @@ struct rt_sigframe ...@@ -206,7 +206,7 @@ struct rt_sigframe
{ unsigned int cur; \ { unsigned int cur; \
unsigned short pre; \ unsigned short pre; \
err |= __get_user(pre, &sc->seg); \ err |= __get_user(pre, &sc->seg); \
asm volatile("movl %%" #seg ",%0" : "=r" (cur)); \ savesegment(seg, cur); \
pre |= mask; \ pre |= mask; \
if (pre != cur) loadsegment(seg, pre); } if (pre != cur) loadsegment(seg, pre); }
...@@ -235,7 +235,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, ...@@ -235,7 +235,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
*/ */
err |= __get_user(gs, &sc->gs); err |= __get_user(gs, &sc->gs);
gs |= 3; gs |= 3;
asm("movl %%gs,%0" : "=r" (oldgs)); savesegment(gs, oldgs);
if (gs != oldgs) if (gs != oldgs)
load_gs_index(gs); load_gs_index(gs);
...@@ -355,14 +355,13 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, ...@@ -355,14 +355,13 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
{ {
int tmp, err = 0; int tmp, err = 0;
tmp = 0; savesegment(gs, tmp);
__asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
err |= __put_user(tmp, (unsigned int __user *)&sc->gs); err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
__asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp)); savesegment(fs, tmp);
err |= __put_user(tmp, (unsigned int __user *)&sc->fs); err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
__asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp)); savesegment(ds, tmp);
err |= __put_user(tmp, (unsigned int __user *)&sc->ds); err |= __put_user(tmp, (unsigned int __user *)&sc->ds);
__asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp)); savesegment(es, tmp);
err |= __put_user(tmp, (unsigned int __user *)&sc->es); err |= __put_user(tmp, (unsigned int __user *)&sc->es);
err |= __put_user((u32)regs->di, &sc->di); err |= __put_user((u32)regs->di, &sc->di);
...@@ -498,8 +497,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, ...@@ -498,8 +497,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
regs->dx = 0; regs->dx = 0;
regs->cx = 0; regs->cx = 0;
asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); loadsegment(ds, __USER32_DS);
asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); loadsegment(es, __USER32_DS);
regs->cs = __USER32_CS; regs->cs = __USER32_CS;
regs->ss = __USER32_DS; regs->ss = __USER32_DS;
...@@ -591,8 +590,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, ...@@ -591,8 +590,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
regs->dx = (unsigned long) &frame->info; regs->dx = (unsigned long) &frame->info;
regs->cx = (unsigned long) &frame->uc; regs->cx = (unsigned long) &frame->uc;
asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); loadsegment(ds, __USER32_DS);
asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); loadsegment(es, __USER32_DS);
regs->cs = __USER32_CS; regs->cs = __USER32_CS;
regs->ss = __USER32_DS; regs->ss = __USER32_DS;
......
...@@ -148,8 +148,9 @@ do { \ ...@@ -148,8 +148,9 @@ do { \
static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp) static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp)
{ {
asm volatile("movl %0,%%fs" :: "r" (0)); loadsegment(fs, 0);
asm volatile("movl %0,%%es; movl %0,%%ds" : : "r" (__USER32_DS)); loadsegment(ds, __USER32_DS);
loadsegment(es, __USER32_DS);
load_gs_index(0); load_gs_index(0);
regs->ip = ip; regs->ip = ip;
regs->sp = sp; regs->sp = 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