int linux_sys_set_thread_area(struct proc *p, void *v, register_t *retval) { struct linux_sys_set_thread_area_args *uap = v; struct l_segment_descriptor ldesc; int error; error = copyin(SCARG(uap, desc), &ldesc, sizeof ldesc); if (error != 0) return error; if (ldesc.entry_number == -1) { ldesc.entry_number = GUGS_SEL; if ((error = copyout(&ldesc, SCARG(uap, desc), sizeof ldesc))) return error; } else if (ldesc.entry_number != GUGS_SEL) return EINVAL; return i386_set_threadbase(p, SCARG(uap, desc)->base_addr, TSEG_GS); }
int sys_sysarch(struct proc *p, void *v, register_t *retval) { struct sys_sysarch_args /* { syscallarg(int) op; syscallarg(void *) parms; } */ *uap = v; int error = 0; switch(SCARG(uap, op)) { #ifdef USER_LDT case I386_GET_LDT: error = i386_get_ldt(p, SCARG(uap, parms), retval); break; case I386_SET_LDT: error = i386_set_ldt(p, SCARG(uap, parms), retval); break; #endif case I386_IOPL: error = i386_iopl(p, SCARG(uap, parms), retval); break; case I386_GET_IOPERM: error = i386_get_ioperm(p, SCARG(uap, parms), retval); break; case I386_SET_IOPERM: error = i386_set_ioperm(p, SCARG(uap, parms), retval); break; #ifdef VM86 case I386_VM86: error = i386_vm86(p, SCARG(uap, parms), retval); break; #endif case I386_GET_FSBASE: { uint32_t base = i386_get_threadbase(p, TSEG_FS); error = copyout(&base, SCARG(uap, parms), sizeof(base)); break; } case I386_SET_FSBASE: { uint32_t base; if ((error = copyin(SCARG(uap, parms), &base, sizeof(base)))) break; error = i386_set_threadbase(p, base, TSEG_FS); break; } case I386_GET_GSBASE: { uint32_t base = i386_get_threadbase(p, TSEG_GS); error = copyout(&base, SCARG(uap, parms), sizeof(base)); break; } case I386_SET_GSBASE: { uint32_t base; if ((error = copyin(SCARG(uap, parms), &base, sizeof(base)))) break; error = i386_set_threadbase(p, base, TSEG_GS); break; } default: error = EINVAL; break; } return (error); }