diff options
author | luoqi <luoqi@FreeBSD.org> | 1999-09-22 22:01:51 +0000 |
---|---|---|
committer | luoqi <luoqi@FreeBSD.org> | 1999-09-22 22:01:51 +0000 |
commit | c07e4cb2e048ac5fa6fca0817404bd5d4978b6b8 (patch) | |
tree | daf85e9cd1148343fe68eb4df62cfac218bfae99 /sys/compat | |
parent | 1388d0402c14dc63c832d6ead5f3fbe2d0d16a55 (diff) | |
download | FreeBSD-src-c07e4cb2e048ac5fa6fca0817404bd5d4978b6b8.zip FreeBSD-src-c07e4cb2e048ac5fa6fca0817404bd5d4978b6b8.tar.gz |
Implement linux_ioperm() syscall. Fix linux_iopl() to use the level argument.
SVGAlib should now work.
Reviewed by: marcel
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/linux/linux_misc.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index 3bca8cf..919a5e7 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -1122,17 +1122,36 @@ linux_getitimer(struct proc *p, struct linux_getitimer_args *args) } int +linux_ioperm(struct proc *p, struct linux_ioperm_args *args) +{ + struct sysarch_args sa; + struct i386_ioperm_args *iia; + caddr_t sg; + + sg = stackgap_init(); + iia = stackgap_alloc(&sg, sizeof(struct i386_ioperm_args)); + iia->start = args->start; + iia->length = args->length; + iia->enable = args->enable; + sa.op = I386_SET_IOPERM; + sa.parms = (char *)iia; + return sysarch(p, &sa); +} + +int linux_iopl(struct proc *p, struct linux_iopl_args *args) { int error; - error = suser(p); - if (error != 0) - return error; + if (args->level < 0 || args->level > 3) + return (EINVAL); + if ((error = suser(p)) != 0) + return (error); if (securelevel > 0) - return EPERM; - p->p_md.md_regs->tf_eflags |= PSL_IOPL; - return 0; + return (EPERM); + p->p_md.md_regs->tf_eflags = (p->p_md.md_regs->tf_eflags & ~PSL_IOPL) | + (args->level * (PSL_IOPL / 3)); + return (0); } int |