svn commit: r315544 - stable/11/sys/amd64/linux
Edward Tomasz Napierala
trasz at FreeBSD.org
Sun Mar 19 10:41:38 UTC 2017
Author: trasz
Date: Sun Mar 19 10:41:36 2017
New Revision: 315544
URL: https://svnweb.freebsd.org/changeset/base/315544
Log:
MFC r313993:
Reimplement linux_arch_prctl() as a wrapper around sysarch(2).
This also adds support for LINUX_ARCH_SET_GS.
Modified:
stable/11/sys/amd64/linux/linux_machdep.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/amd64/linux/linux_machdep.c
==============================================================================
--- stable/11/sys/amd64/linux/linux_machdep.c Sun Mar 19 10:39:59 2017 (r315543)
+++ stable/11/sys/amd64/linux/linux_machdep.c Sun Mar 19 10:41:36 2017 (r315544)
@@ -88,6 +88,7 @@ __FBSDID("$FreeBSD$");
#include <compat/linux/linux_util.h>
#include <compat/linux/linux_emul.h>
+#include <x86/include/sysarch.h>
int
linux_execve(struct thread *td, struct linux_execve_args *args)
@@ -226,28 +227,34 @@ int
linux_arch_prctl(struct thread *td, struct linux_arch_prctl_args *args)
{
int error;
- struct pcb *pcb;
+ struct sysarch_args bsd_args;
LINUX_CTR2(arch_prctl, "0x%x, %p", args->code, args->addr);
- error = ENOTSUP;
- pcb = td->td_pcb;
-
switch (args->code) {
- case LINUX_ARCH_GET_GS:
- error = copyout(&pcb->pcb_gsbase, (unsigned long *)args->addr,
- sizeof(args->addr));
- break;
case LINUX_ARCH_SET_GS:
- if (args->addr >= VM_MAXUSER_ADDRESS)
- return(EPERM);
+ bsd_args.op = AMD64_SET_GSBASE;
+ bsd_args.parms = (void *)args->addr;
+ error = sysarch(td, &bsd_args);
+ if (error == EINVAL)
+ error = EPERM;
+ break;
+ case LINUX_ARCH_SET_FS:
+ bsd_args.op = AMD64_SET_FSBASE;
+ bsd_args.parms = (void *)args->addr;
+ error = sysarch(td, &bsd_args);
+ if (error == EINVAL)
+ error = EPERM;
break;
case LINUX_ARCH_GET_FS:
- error = copyout(&pcb->pcb_fsbase, (unsigned long *)args->addr,
- sizeof(args->addr));
+ bsd_args.op = AMD64_GET_FSBASE;
+ bsd_args.parms = (void *)args->addr;
+ error = sysarch(td, &bsd_args);
break;
- case LINUX_ARCH_SET_FS:
- error = linux_set_cloned_tls(td, (void *)args->addr);
+ case LINUX_ARCH_GET_GS:
+ bsd_args.op = AMD64_GET_GSBASE;
+ bsd_args.parms = (void *)args->addr;
+ error = sysarch(td, &bsd_args);
break;
default:
error = EINVAL;
More information about the svn-src-stable
mailing list