- __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp));
- *(unsigned int *)&sc.gs = tmp;
- __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp));
- *(unsigned int *)&sc.fs = tmp;
- *(unsigned int *)&sc.es = regs->xes;
- *(unsigned int *)&sc.ds = regs->xds;
- sc.edi = regs->edi;
- sc.esi = regs->esi;
- sc.ebp = regs->ebp;
- sc.esp = regs->esp;
- sc.ebx = regs->ebx;
- sc.edx = regs->edx;
- sc.ecx = regs->ecx;
- sc.eax = regs->eax;
- sc.trapno = current->thread.trap_no;
- sc.err = current->thread.error_code;
- sc.eip = regs->eip;
- *(unsigned int *)&sc.cs = regs->xcs;
- sc.eflags = regs->eflags;
- sc.esp_at_signal = regs->esp;
- *(unsigned int *)&sc.ss = regs->xss;
+ savesegment(gs, tmp);
+ err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
+ savesegment(fs, tmp);
+ err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
+
+ err |= __put_user(regs->xes, (unsigned int __user *)&sc->es);
+ err |= __put_user(regs->xds, (unsigned int __user *)&sc->ds);
+ err |= __put_user(regs->edi, &sc->edi);
+ err |= __put_user(regs->esi, &sc->esi);
+ err |= __put_user(regs->ebp, &sc->ebp);
+ err |= __put_user(regs->esp, &sc->esp);
+ err |= __put_user(regs->ebx, &sc->ebx);
+ err |= __put_user(regs->edx, &sc->edx);
+ err |= __put_user(regs->ecx, &sc->ecx);
+ err |= __put_user(regs->eax, &sc->eax);
+ err |= __put_user(current->thread.trap_no, &sc->trapno);
+ err |= __put_user(current->thread.error_code, &sc->err);
+ err |= __put_user(regs->eip, &sc->eip);
+ err |= __put_user(regs->xcs, (unsigned int __user *)&sc->cs);
+ err |= __put_user(regs->eflags, &sc->eflags);
+ err |= __put_user(regs->esp, &sc->esp_at_signal);
+ err |= __put_user(regs->xss, (unsigned int __user *)&sc->ss);