Bug #712 ยป posix4.patch
include/Makefile | ||
---|---|---|
# when buildworld is run.
|
||
#
|
||
LSUBDIRS= bus/cam bus/cam/scsi \
|
||
emulation/posix4 \
|
||
emulation/linux \
|
||
vfs/msdosfs vfs/nfs vfs/ntfs vfs/nwfs \
|
||
vfs/smbfs vfs/udf vfs/ufs \
|
include/pthread.h | ||
---|---|---|
#include <sys/time.h>
|
||
#include <sys/signal.h>
|
||
#include <limits.h>
|
||
#include <sched.h>
|
||
#include <sys/sched.h>
|
||
/*
|
||
* Run-time invariant values:
|
lib/libc_r/test/mutex_d.c | ||
---|---|---|
#include <assert.h>
|
||
#include <errno.h>
|
||
#include "pthread.h"
|
||
#include <sched.h>
|
||
#include <sys/sched.h>
|
||
#include <signal.h>
|
||
#include <stdarg.h>
|
||
#include <stdio.h>
|
lib/libc_r/test/sem_d.c | ||
---|---|---|
*
|
||
****************************************************************************/
|
||
#include <sys/semaphore.h>
|
||
#include <assert.h>
|
||
#include <stdio.h>
|
||
#include <fcntl.h>
|
||
#include <errno.h>
|
||
#include <semaphore.h>
|
||
#include <pthread.h>
|
||
#define NTHREADS 10
|
lib/libc_r/uthread/pthread_private.h | ||
---|---|---|
#include <sys/types.h>
|
||
#include <sys/time.h>
|
||
#include <sys/cdefs.h>
|
||
#include <sched.h>
|
||
#include <sys/sched.h>
|
||
#include <spinlock.h>
|
||
#include <pthread_np.h>
|
||
lib/libc_r/uthread/uthread_sem.c | ||
---|---|---|
* $DragonFly: src/lib/libc_r/uthread/uthread_sem.c,v 1.3 2005/05/30 22:50:53 joerg Exp $
|
||
*/
|
||
#include <sys/semaphore.h>
|
||
#include <stdlib.h>
|
||
#include <errno.h>
|
||
#include <semaphore.h>
|
||
#include <pthread.h>
|
||
#include "pthread_private.h"
|
||
#define _SEM_CHECK_VALIDITY(sem) \
|
lib/libc_r/uthread/uthread_spinlock.c | ||
---|---|---|
#include <sys/fcntl.h>
|
||
#include <stdio.h>
|
||
#include <sched.h>
|
||
#include <sys/sched.h>
|
||
#include <unistd.h>
|
||
#include <pthread.h>
|
||
#include <string.h>
|
lib/libthread_xu/thread/thr_private.h | ||
---|---|---|
#include <limits.h>
|
||
#include <signal.h>
|
||
#include <stdio.h>
|
||
#include <sched.h>
|
||
#include <sys/sched.h>
|
||
#include <unistd.h>
|
||
#include <pthread.h>
|
||
#include <pthread_np.h>
|
lib/libthread_xu/thread/thr_sem.c | ||
---|---|---|
#include "namespace.h"
|
||
#include <machine/tls.h>
|
||
#include <sys/semaphore.h>
|
||
#include <errno.h>
|
||
#include <fcntl.h>
|
||
#include <pthread.h>
|
||
#include <semaphore.h>
|
||
#include <stdlib.h>
|
||
#include <time.h>
|
||
#include "un-namespace.h"
|
sys/conf/files | ||
---|---|---|
bus/pci/pcib_if.m optional pci
|
||
dev/powermng/i386/alpm/alpm.c optional alpm
|
||
dev/misc/xrpu/xrpu.c optional xrpu
|
||
emulation/posix4/posix4_mib.c standard
|
||
emulation/posix4/p1003_1b.c standard
|
||
emulation/posix4/ksched.c optional _kposix_priority_scheduling
|
||
kern/kern_posix4_mib.c standard
|
||
kern/kern_p1003_1b.c standard
|
||
kern/kern_sched.c optional _kposix_priority_scheduling
|
||
vfs/ufs/ffs_alloc.c optional ffs
|
||
vfs/ufs/ffs_alloc.c optional mfs
|
||
vfs/ufs/ffs_balloc.c optional ffs
|
sys/emulation/linux/linux_misc.c | ||
---|---|---|
#include <machine/segments.h>
|
||
#endif
|
||
#include <emulation/posix4/sched.h>
|
||
#include <sys/sched.h>
|
||
#include <emulation/linux/linux_sysproto.h>
|
||
#include <arch_linux/linux.h>
|
sys/emulation/posix4/aio.h | ||
---|---|---|
/* XXX Conflicts with John's - not installed.
|
||
*/
|
||
/*-
|
||
* Copyright (c) 1996, 1997
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/aio.h,v 1.6 1999/12/29 04:55:01 peter Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/aio.h,v 1.3 2003/08/27 08:30:04 rob Exp $
|
||
*/
|
||
/* aio.h: P1003.1B-1993 Asynchronous I/O */
|
||
#ifndef _P1003_1B_AIO_H_
|
||
#define _P1003_1B_AIO_H_
|
||
#include <sys/_posix.h>
|
||
#include <sys/types.h>
|
||
/* For struct sigevent:
|
||
*/
|
||
#ifdef _KERNEL
|
||
#include <sys/signal.h>
|
||
#else
|
||
#include <signal.h>
|
||
#ifdef _P1003_1B_INCLUDE_MAYBES
|
||
#include <time.h>
|
||
#include <fcntl.h>
|
||
#else
|
||
struct timespec;
|
||
#endif
|
||
#endif
|
||
/* Return values: */
|
||
#define AIO_CANCELED 0x01 /* All operations cancelled */
|
||
#define AIO_NOTCANCELLED 0x02 /* Some not cancelled */
|
||
#define AIO_ALLDONE 0x04 /* None were cancelled */
|
||
/* lio_listio synchronization options */
|
||
#define LIO_WAIT 0x08 /* Suspend until complete */
|
||
#define LIO_NOWAIT 0x10 /* Continue operation */
|
||
/* lio_listio element operations */
|
||
#define LIO_READ 0x20
|
||
#define LIO_WRITE 0x40
|
||
#define LIO_NOP 0x80
|
||
typedef struct aiocb * const aio_listio_ctl;
|
||
typedef const struct aiocb * const caio_listio_ctl;
|
||
struct aiocb {
|
||
int aio_fildes; /* File descriptor */
|
||
off_t aio_offset; /* File offset */
|
||
volatile void * aio_buf; /* Location of buffer */
|
||
size_t aio_nbytes; /* Length of transfer */
|
||
int aio_reqprio; /* Request priority offset */
|
||
struct sigevent aio_sigevent; /* Signal number and value */
|
||
int aio_lio_opcode; /* Operation to be performed */
|
||
};
|
||
#ifndef _KERNEL
|
||
#include <sys/cdefs.h>
|
||
__BEGIN_DECLS
|
||
int aio_read (struct aiocb *);
|
||
int aio_write (struct aiocb *);
|
||
int lio_listio (int, aio_listio_ctl[], int, struct sigevent *);
|
||
int aio_error (const struct aiocb *);
|
||
ssize_t aio_return (struct aiocb *);
|
||
int aio_cancel (int, struct aiocb *);
|
||
int aio_suspend (caio_listio_ctl[], int, const struct timespec *);
|
||
int aio_fsync (int, struct aiocb *);
|
||
__END_DECLS
|
||
#endif /* _KERNEL */
|
||
#endif /* _P1003_1B_AIO_H_ */
|
sys/emulation/posix4/ksched.c | ||
---|---|---|
/*
|
||
* Copyright (c) 1996, 1997
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/ksched.c,v 1.7.2.1 2000/05/16 06:58:13 dillon Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/ksched.c,v 1.8 2007/02/03 18:05:57 corecode Exp $
|
||
*/
|
||
/* ksched: Soft real time scheduling based on "rtprio".
|
||
*/
|
||
#include <sys/param.h>
|
||
#include <sys/systm.h>
|
||
#include <sys/proc.h>
|
||
#include <sys/kernel.h>
|
||
#include <sys/resource.h>
|
||
#include <machine/cpu.h> /* For need_user_resched */
|
||
#include "posix4.h"
|
||
/* ksched: Real-time extension to support POSIX priority scheduling.
|
||
*/
|
||
struct ksched {
|
||
struct timespec rr_interval;
|
||
};
|
||
int ksched_attach(struct ksched **p)
|
||
{
|
||
struct ksched *ksched= p31b_malloc(sizeof(*ksched));
|
||
ksched->rr_interval.tv_sec = 0;
|
||
ksched->rr_interval.tv_nsec = 1000000000L / 10; /* XXX */
|
||
*p = ksched;
|
||
return 0;
|
||
}
|
||
int ksched_detach(struct ksched *p)
|
||
{
|
||
p31b_free(p);
|
||
return 0;
|
||
}
|
||
/*
|
||
* XXX About priorities
|
||
*
|
||
* POSIX 1003.1b requires that numerically higher priorities be of
|
||
* higher priority. It also permits sched_setparam to be
|
||
* implementation defined for SCHED_OTHER. I don't like
|
||
* the notion of inverted priorites for normal processes when
|
||
* you can use "setpriority" for that.
|
||
*
|
||
* I'm rejecting sched_setparam for SCHED_OTHER with EINVAL.
|
||
*/
|
||
/* Macros to convert between the unix (lower numerically is higher priority)
|
||
* and POSIX 1003.1b (higher numerically is higher priority)
|
||
*/
|
||
#define p4prio_to_rtpprio(P) (RTP_PRIO_MAX - (P))
|
||
#define rtpprio_to_p4prio(P) (RTP_PRIO_MAX - (P))
|
||
/* These improve readability a bit for me:
|
||
*/
|
||
#define P1B_PRIO_MIN rtpprio_to_p4prio(RTP_PRIO_MAX)
|
||
#define P1B_PRIO_MAX rtpprio_to_p4prio(RTP_PRIO_MIN)
|
||
static __inline int
|
||
getscheduler(register_t *ret, struct ksched *ksched, struct lwp *lp)
|
||
{
|
||
int e = 0;
|
||
switch (lp->lwp_rtprio.type)
|
||
{
|
||
case RTP_PRIO_FIFO:
|
||
*ret = SCHED_FIFO;
|
||
break;
|
||
case RTP_PRIO_REALTIME:
|
||
*ret = SCHED_RR;
|
||
break;
|
||
default:
|
||
*ret = SCHED_OTHER;
|
||
break;
|
||
}
|
||
return e;
|
||
}
|
||
int ksched_setparam(register_t *ret, struct ksched *ksched,
|
||
struct lwp *lp, const struct sched_param *param)
|
||
{
|
||
register_t policy;
|
||
int e;
|
||
e = getscheduler(&policy, ksched, lp);
|
||
if (e == 0)
|
||
{
|
||
if (policy == SCHED_OTHER)
|
||
e = EINVAL;
|
||
else
|
||
e = ksched_setscheduler(ret, ksched, lp, policy, param);
|
||
}
|
||
return e;
|
||
}
|
||
int ksched_getparam(register_t *ret, struct ksched *ksched,
|
||
struct lwp *lp, struct sched_param *param)
|
||
{
|
||
if (RTP_PRIO_IS_REALTIME(lp->lwp_rtprio.type))
|
||
param->sched_priority = rtpprio_to_p4prio(lp->lwp_rtprio.prio);
|
||
return 0;
|
||
}
|
||
/*
|
||
* XXX The priority and scheduler modifications should
|
||
* be moved into published interfaces in kern/kern_sync.
|
||
*
|
||
* The permissions to modify process p were checked in "p31b_proc()".
|
||
*
|
||
*/
|
||
int ksched_setscheduler(register_t *ret, struct ksched *ksched,
|
||
struct lwp *lp, int policy, const struct sched_param *param)
|
||
{
|
||
int e = 0;
|
||
struct rtprio rtp;
|
||
switch(policy)
|
||
{
|
||
case SCHED_RR:
|
||
case SCHED_FIFO:
|
||
if (param->sched_priority >= P1B_PRIO_MIN &&
|
||
param->sched_priority <= P1B_PRIO_MAX)
|
||
{
|
||
rtp.prio = p4prio_to_rtpprio(param->sched_priority);
|
||
rtp.type = (policy == SCHED_FIFO)
|
||
? RTP_PRIO_FIFO : RTP_PRIO_REALTIME;
|
||
lp->lwp_rtprio = rtp;
|
||
need_user_resched();
|
||
}
|
||
else
|
||
e = EPERM;
|
||
break;
|
||
case SCHED_OTHER:
|
||
{
|
||
rtp.type = RTP_PRIO_NORMAL;
|
||
rtp.prio = p4prio_to_rtpprio(param->sched_priority);
|
||
lp->lwp_rtprio = rtp;
|
||
/* XXX Simply revert to whatever we had for last
|
||
* normal scheduler priorities.
|
||
* This puts a requirement
|
||
* on the scheduling code: You must leave the
|
||
* scheduling info alone.
|
||
*/
|
||
need_user_resched();
|
||
}
|
||
break;
|
||
}
|
||
return e;
|
||
}
|
||
int ksched_getscheduler(register_t *ret, struct ksched *ksched, struct lwp *lp)
|
||
{
|
||
return getscheduler(ret, ksched, lp);
|
||
}
|
||
/* ksched_yield: Yield the CPU.
|
||
*/
|
||
int ksched_yield(register_t *ret, struct ksched *ksched)
|
||
{
|
||
need_user_resched();
|
||
return 0;
|
||
}
|
||
int ksched_get_priority_max(register_t*ret, struct ksched *ksched, int policy)
|
||
{
|
||
int e = 0;
|
||
switch (policy)
|
||
{
|
||
case SCHED_FIFO:
|
||
case SCHED_RR:
|
||
*ret = RTP_PRIO_MAX;
|
||
break;
|
||
case SCHED_OTHER:
|
||
*ret = PRIO_MAX;
|
||
break;
|
||
default:
|
||
e = EINVAL;
|
||
}
|
||
return e;
|
||
}
|
||
int ksched_get_priority_min(register_t *ret, struct ksched *ksched, int policy)
|
||
{
|
||
int e = 0;
|
||
switch (policy)
|
||
{
|
||
case SCHED_FIFO:
|
||
case SCHED_RR:
|
||
*ret = P1B_PRIO_MIN;
|
||
break;
|
||
case SCHED_OTHER:
|
||
*ret = PRIO_MIN;
|
||
break;
|
||
default:
|
||
e = EINVAL;
|
||
}
|
||
return e;
|
||
}
|
||
int ksched_rr_get_interval(register_t *ret, struct ksched *ksched,
|
||
struct lwp *lp, struct timespec *timespec)
|
||
{
|
||
*timespec = ksched->rr_interval;
|
||
return 0;
|
||
}
|
sys/emulation/posix4/mqueue.h | ||
---|---|---|
#ifndef _MQUEUE_H_
|
||
#define _MQUEUE_H_
|
||
/* mqueue.h: POSIX 1003.1b Message Queues */
|
||
/*-
|
||
* Copyright (c) 1996, 1997
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/mqueue.h,v 1.4 1999/12/29 04:55:02 peter Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/mqueue.h,v 1.3 2003/08/27 08:30:04 rob Exp $
|
||
*/
|
||
#include <sys/_posix.h>
|
||
#ifdef _P1003_1B_INCLUDE_MAYBES
|
||
#include <sys/types.h>
|
||
#include <fcntl.h>
|
||
#include <time.h>
|
||
#include <signal.h>
|
||
#else
|
||
struct sigevent;
|
||
#endif
|
||
typedef int mqd_t; /* message queue descriptors */
|
||
struct mq_attr {
|
||
long mq_flags; /* message queue flags */
|
||
long mq_maxmsg; /* maximum number of messages */
|
||
long mq_msgsize; /* maximum message size */
|
||
long mq_curmsgs; /* number of messages currently queued */
|
||
};
|
||
#ifndef _KERNEL
|
||
#include <sys/cdefs.h>
|
||
__BEGIN_DECLS
|
||
mqd_t mq_open (const char *, int oflag, ...);
|
||
int mq_close (mqd_t);
|
||
int mq_unlink (const char *);
|
||
int mq_send (mqd_t, const char *, size_t, unsigned int);
|
||
ssize_t mq_receive (mqd_t, char *, size_t, unsigned int *);
|
||
int mq_notify (mqd_t, const struct sigevent *);
|
||
int mq_setattr (mqd_t, const struct mq_attr *, struct mq_attr *);
|
||
int mq_getattr (mqd_t, struct mq_attr *);
|
||
__END_DECLS
|
||
#endif
|
||
#endif /* _MQUEUE_H_ */
|
sys/emulation/posix4/p1003_1b.c | ||
---|---|---|
/*
|
||
* Copyright (c) 1996, 1997, 1998
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/p1003_1b.c,v 1.5.2.2 2003/03/25 06:13:35 rwatson Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/p1003_1b.c,v 1.9 2007/02/03 18:05:57 corecode Exp $
|
||
*/
|
||
/* p1003_1b: Real Time common code.
|
||
*/
|
||
#include <sys/param.h>
|
||
#include <sys/systm.h>
|
||
#include <sys/kernel.h>
|
||
#include <sys/sysent.h>
|
||
#include <sys/proc.h>
|
||
#include <sys/syslog.h>
|
||
#include <sys/module.h>
|
||
#include <sys/sysproto.h>
|
||
#include <sys/sysctl.h>
|
||
#include "posix4.h"
|
||
MALLOC_DEFINE(M_P31B, "p1003.1b", "Posix 1003.1B");
|
||
/* p31b_proc: Return a proc struct corresponding to a pid to operate on.
|
||
*
|
||
* Enforce permission policy.
|
||
*
|
||
* The policy is the same as for sending signals except there
|
||
* is no notion of process groups.
|
||
*
|
||
* pid == 0 means my process.
|
||
*
|
||
* This is disabled until I've got a permission gate in again:
|
||
* only root can do this.
|
||
*/
|
||
#if 0
|
||
/*
|
||
* This is stolen from CANSIGNAL in kern_sig:
|
||
*
|
||
* Can process p, with pcred pc, do "write flavor" operations to process q?
|
||
*/
|
||
#define CAN_AFFECT(p, cr, q) \
|
||
((cr)->cr_uid == 0 || \
|
||
(cr)->cr_ruid == (q)->p_ucred->cr_ruid || \
|
||
(cr)->cr_uid == (q)->p_ucred->cr_ruid || \
|
||
(cr)->cr_ruid == (q)->p_ucred->cr_uid || \
|
||
(cr)->cr_uid == (q)->p_ucred->cr_uid)
|
||
#else
|
||
#define CAN_AFFECT(p, cr, q) ((cr)->cr_uid == 0)
|
||
#endif
|
||
/*
|
||
* p31b_proc: Look up a proc from a PID. If proc is 0 it is
|
||
* my own proc.
|
||
*/
|
||
int p31b_proc(struct proc *p, pid_t pid, struct proc **pp)
|
||
{
|
||
int ret = 0;
|
||
struct proc *other_proc = 0;
|
||
if (pid == 0)
|
||
other_proc = p;
|
||
else
|
||
other_proc = pfind(pid);
|
||
if (other_proc)
|
||
{
|
||
/* Enforce permission policy.
|
||
*/
|
||
if (CAN_AFFECT(p, p->p_ucred, other_proc))
|
||
*pp = other_proc;
|
||
else
|
||
ret = EPERM;
|
||
}
|
||
else
|
||
ret = ESRCH;
|
||
return ret;
|
||
}
|
||
#if !defined(_KPOSIX_PRIORITY_SCHEDULING)
|
||
int syscall_not_present(const char *s);
|
||
/* The system calls return ENOSYS if an entry is called that is
|
||
* not run-time supported. I am also logging since some programs
|
||
* start to use this when they shouldn't. That will be removed if annoying.
|
||
*/
|
||
int syscall_not_present(const char *s)
|
||
{
|
||
struct proc *p = curproc;
|
||
log(LOG_ERR, "cmd %s pid %d tried to use non-present %s\n",
|
||
p->p_comm, p->p_pid, s);
|
||
/* a " return nosys(p, uap); " here causes a core dump.
|
||
*/
|
||
return ENOSYS;
|
||
}
|
||
/* Not configured but loadable via a module:
|
||
*/
|
||
static int sched_attach(void)
|
||
{
|
||
return 0;
|
||
}
|
||
#define SYSCALL_NOT_PRESENT_GEN(SC) \
|
||
int SC (struct SC##_args *uap) \
|
||
{ \
|
||
return syscall_not_present(#SC); \
|
||
}
|
||
SYSCALL_NOT_PRESENT_GEN(sched_setparam)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_getparam)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_setscheduler)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_getscheduler)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_yield)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_get_priority_max)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_get_priority_min)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_rr_get_interval)
|
||
#else
|
||
/* Configured in kernel version:
|
||
*/
|
||
static struct ksched *ksched;
|
||
static int sched_attach(void)
|
||
{
|
||
int ret = ksched_attach(&ksched);
|
||
if (ret == 0)
|
||
p31b_setcfg(CTL_P1003_1B_PRIORITY_SCHEDULING, 1);
|
||
return ret;
|
||
}
|
||
int
|
||
sys_sched_setparam(struct sched_setparam_args *uap)
|
||
{
|
||
struct proc *p = curproc;
|
||
struct lwp *lp;
|
||
int e;
|
||
struct sched_param sched_param;
|
||
copyin(uap->param, &sched_param, sizeof(sched_param));
|
||
if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
|
||
lp = FIRST_LWP_IN_PROC(p); /* XXX lwp */
|
||
e = ksched_setparam(&uap->sysmsg_result, ksched, lp,
|
||
(const struct sched_param *)&sched_param);
|
||
}
|
||
return e;
|
||
}
|
||
int
|
||
sys_sched_getparam(struct sched_getparam_args *uap)
|
||
{
|
||
struct proc *p = curproc;
|
||
struct proc *targetp;
|
||
struct lwp *lp;
|
||
struct sched_param sched_param;
|
||
int e;
|
||
|
||
if (uap->pid != 0 && uap->pid != p->p_pid) {
|
||
e = p31b_proc(p, uap->pid, &targetp);
|
||
if (e)
|
||
return e;
|
||
} else {
|
||
targetp = p;
|
||
}
|
||
|
||
lp = FIRST_LWP_IN_PROC(targetp); /* XXX lwp */
|
||
e = ksched_getparam(&uap->sysmsg_result, ksched, lp, &sched_param);
|
||
if (!e)
|
||
copyout(&sched_param, uap->param, sizeof(sched_param));
|
||
return e;
|
||
}
|
||
int
|
||
sys_sched_setscheduler(struct sched_setscheduler_args *uap)
|
||
{
|
||
struct proc *p = curproc;
|
||
struct lwp *lp;
|
||
int e;
|
||
struct sched_param sched_param;
|
||
copyin(uap->param, &sched_param, sizeof(sched_param));
|
||
if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
|
||
lp = FIRST_LWP_IN_PROC(p); /* XXX lwp */
|
||
e = ksched_setscheduler(&uap->sysmsg_result, ksched, lp,
|
||
uap->policy, (const struct sched_param *)&sched_param);
|
||
}
|
||
return e;
|
||
}
|
||
int
|
||
sys_sched_getscheduler(struct sched_getscheduler_args *uap)
|
||
{
|
||
struct proc *p = curproc;
|
||
struct proc *targetp;
|
||
struct lwp *lp;
|
||
int e;
|
||
|
||
if (uap->pid != 0 && uap->pid != p->p_pid) {
|
||
e = p31b_proc(p, uap->pid, &targetp);
|
||
if (e)
|
||
return e;
|
||
} else {
|
||
targetp = p;
|
||
}
|
||
|
||
lp = FIRST_LWP_IN_PROC(targetp); /* XXX lwp */
|
||
e = ksched_getscheduler(&uap->sysmsg_result, ksched, lp);
|
||
return e;
|
||
}
|
||
int
|
||
sys_sched_yield(struct sched_yield_args *uap)
|
||
{
|
||
return ksched_yield(&uap->sysmsg_result, ksched);
|
||
}
|
||
int
|
||
sys_sched_get_priority_max(struct sched_get_priority_max_args *uap)
|
||
{
|
||
return ksched_get_priority_max(&uap->sysmsg_result, ksched, uap->policy);
|
||
}
|
||
int
|
||
sys_sched_get_priority_min(struct sched_get_priority_min_args *uap)
|
||
{
|
||
return ksched_get_priority_min(&uap->sysmsg_result, ksched, uap->policy);
|
||
}
|
||
int
|
||
sys_sched_rr_get_interval(struct sched_rr_get_interval_args *uap)
|
||
{
|
||
int e;
|
||
struct proc *p = curproc;
|
||
struct lwp *lp = curthread->td_lwp;
|
||
if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
|
||
e = ksched_rr_get_interval(&uap->sysmsg_result, ksched,
|
||
lp, uap->interval);
|
||
}
|
||
return e;
|
||
}
|
||
#endif
|
||
static void p31binit(void *notused)
|
||
{
|
||
(void) sched_attach();
|
||
p31b_setcfg(CTL_P1003_1B_PAGESIZE, PAGE_SIZE);
|
||
}
|
||
SYSINIT(p31b, SI_SUB_P1003_1B, SI_ORDER_FIRST, p31binit, NULL);
|
sys/emulation/posix4/posix4.h | ||
---|---|---|
#ifndef _P1003_1B_P1003_1B_H_
|
||
#define _P1003_1B_P1003_1B_H_
|
||
/*-
|
||
* Copyright (c) 1996, 1997, 1998
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/posix4.h,v 1.6 1999/12/27 10:22:09 bde Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/posix4.h,v 1.7 2007/02/03 18:05:57 corecode Exp $
|
||
*/
|
||
#include "opt_posix.h"
|
||
#include <sys/param.h>
|
||
#include <sys/ioccom.h>
|
||
#include <sys/malloc.h>
|
||
#include "sched.h"
|
||
MALLOC_DECLARE(M_P31B);
|
||
#define p31b_malloc(SIZE) kmalloc((SIZE), M_P31B, M_WAITOK)
|
||
#define p31b_free(P) kfree((P), M_P31B)
|
||
struct proc;
|
||
struct lwp;
|
||
int p31b_proc (struct proc *, pid_t, struct proc **);
|
||
void p31b_setcfg (int, int);
|
||
#ifdef _KPOSIX_PRIORITY_SCHEDULING
|
||
/*
|
||
* KSCHED_OP_RW is a vector of read/write flags for each entry indexed
|
||
* by the enum ksched_op.
|
||
*
|
||
* 1 means you need write access, 0 means read is sufficient.
|
||
*/
|
||
enum ksched_op {
|
||
#define KSCHED_OP_RW { 1, 0, 1, 0, 0, 0, 0, 0 }
|
||
SCHED_SETPARAM,
|
||
SCHED_GETPARAM,
|
||
SCHED_SETSCHEDULER,
|
||
SCHED_GETSCHEDULER,
|
||
SCHED_YIELD,
|
||
SCHED_GET_PRIORITY_MAX,
|
||
SCHED_GET_PRIORITY_MIN,
|
||
SCHED_RR_GET_INTERVAL,
|
||
SCHED_OP_MAX
|
||
};
|
||
struct ksched;
|
||
int ksched_attach(struct ksched **);
|
||
int ksched_detach(struct ksched *);
|
||
int ksched_setparam(register_t *, struct ksched *,
|
||
struct lwp *, const struct sched_param *);
|
||
int ksched_getparam(register_t *, struct ksched *,
|
||
struct lwp *, struct sched_param *);
|
||
int ksched_setscheduler(register_t *, struct ksched *,
|
||
struct lwp *, int, const struct sched_param *);
|
||
int ksched_getscheduler(register_t *, struct ksched *, struct lwp *);
|
||
int ksched_yield(register_t *, struct ksched *);
|
||
int ksched_get_priority_max(register_t *, struct ksched *, int);
|
||
int ksched_get_priority_min(register_t *, struct ksched *, int);
|
||
int ksched_rr_get_interval(register_t *, struct ksched *,
|
||
struct lwp *, struct timespec *);
|
||
#endif /* _KPOSIX_PRIORITY_SCHEDULING */
|
||
#endif /* _P1003_1B_P1003_1B_H_ */
|
sys/emulation/posix4/posix4_mib.c | ||
---|---|---|
/*-
|
||
* Copyright (c) 1998
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/posix4_mib.c,v 1.3.2.1 2000/08/03 01:09:59 peter Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/posix4_mib.c,v 1.3 2003/08/07 23:17:19 dillon Exp $
|
||
*/
|
||
#include <sys/param.h>
|
||
#include <sys/kernel.h>
|
||
#include <sys/queue.h>
|
||
#include <sys/sysctl.h>
|
||
#include "posix4.h"
|
||
static int facility[CTL_P1003_1B_MAXID - 1];
|
||
/* OID_AUTO isn't working with sysconf(3). I guess I'd have to
|
||
* modify it to do a lookup by name from the index.
|
||
* For now I've left it a top-level sysctl.
|
||
*/
|
||
#if 1
|
||
SYSCTL_DECL(_p1003_1b);
|
||
#define P1B_SYSCTL(num, name) \
|
||
SYSCTL_INT(_p1003_1b, num, \
|
||
name, CTLFLAG_RD, facility + num - 1, 0, "");
|
||
#else
|
||
SYSCTL_DECL(_kern_p1003_1b);
|
||
#define P1B_SYSCTL(num, name) \
|
||
SYSCTL_INT(_kern_p1003_1b, OID_AUTO, \
|
||
name, CTLFLAG_RD, facility + num - 1, 0, "");
|
||
SYSCTL_NODE(_kern, OID_AUTO, p1003_1b, CTLFLAG_RW, 0, "P1003.1B");
|
||
#endif
|
||
P1B_SYSCTL(CTL_P1003_1B_ASYNCHRONOUS_IO, asynchronous_io);
|
||
P1B_SYSCTL(CTL_P1003_1B_MAPPED_FILES, mapped_files);
|
||
P1B_SYSCTL(CTL_P1003_1B_MEMLOCK, memlock);
|
||
P1B_SYSCTL(CTL_P1003_1B_MEMLOCK_RANGE, memlock_range);
|
||
P1B_SYSCTL(CTL_P1003_1B_MEMORY_PROTECTION, memory_protection);
|
||
P1B_SYSCTL(CTL_P1003_1B_MESSAGE_PASSING, message_passing);
|
||
P1B_SYSCTL(CTL_P1003_1B_PRIORITIZED_IO, prioritized_io);
|
||
P1B_SYSCTL(CTL_P1003_1B_PRIORITY_SCHEDULING, priority_scheduling);
|
||
P1B_SYSCTL(CTL_P1003_1B_REALTIME_SIGNALS, realtime_signals);
|
||
P1B_SYSCTL(CTL_P1003_1B_SEMAPHORES, semaphores);
|
||
P1B_SYSCTL(CTL_P1003_1B_FSYNC, fsync);
|
||
P1B_SYSCTL(CTL_P1003_1B_SHARED_MEMORY_OBJECTS, shared_memory_objects);
|
||
P1B_SYSCTL(CTL_P1003_1B_SYNCHRONIZED_IO, synchronized_io);
|
||
P1B_SYSCTL(CTL_P1003_1B_TIMERS, timers);
|
||
P1B_SYSCTL(CTL_P1003_1B_AIO_LISTIO_MAX, aio_listio_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_AIO_MAX, aio_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_AIO_PRIO_DELTA_MAX, aio_prio_delta_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_DELAYTIMER_MAX, delaytimer_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_MQ_OPEN_MAX, mq_open_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_PAGESIZE, pagesize);
|
||
P1B_SYSCTL(CTL_P1003_1B_RTSIG_MAX, rtsig_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_SEM_NSEMS_MAX, sem_nsems_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_SEM_VALUE_MAX, sem_value_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_SIGQUEUE_MAX, sigqueue_max);
|
||
P1B_SYSCTL(CTL_P1003_1B_TIMER_MAX, timer_max);
|
||
/* p31b_setcfg: Set the configuration
|
||
*/
|
||
void p31b_setcfg(int num, int value)
|
||
{
|
||
if (num >= 1 && num < CTL_P1003_1B_MAXID)
|
||
facility[num - 1] = value;
|
||
}
|
sys/emulation/posix4/sched.h | ||
---|---|---|
#ifndef _SCHED_H_
|
||
#define _SCHED_H_
|
||
/* sched.h: POSIX 1003.1b Process Scheduling header */
|
||
/*-
|
||
* Copyright (c) 1996, 1997
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* and Jukka Antero Ukkonen.
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/sched.h,v 1.4 1999/12/29 04:55:02 peter Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/sched.h,v 1.3 2003/08/27 08:30:04 rob Exp $
|
||
*/
|
||
#include <sys/types.h> /* For pid_t */
|
||
#ifndef _KERNEL
|
||
#include <time.h> /* Per P1003.4 */
|
||
#endif
|
||
/* Scheduling policies
|
||
*/
|
||
#define SCHED_FIFO 1
|
||
#define SCHED_OTHER 2
|
||
#define SCHED_RR 3
|
||
struct sched_param
|
||
{
|
||
int sched_priority;
|
||
};
|
||
#ifndef _KERNEL
|
||
#include <sys/cdefs.h>
|
||
__BEGIN_DECLS
|
||
int sched_setparam (pid_t, const struct sched_param *);
|
||
int sched_getparam (pid_t, struct sched_param *);
|
||
int sched_setscheduler (pid_t, int, const struct sched_param *);
|
||
int sched_getscheduler (pid_t);
|
||
int sched_yield (void);
|
||
int sched_get_priority_max (int);
|
||
int sched_get_priority_min (int);
|
||
int sched_rr_get_interval (pid_t, struct timespec *);
|
||
__END_DECLS
|
||
#endif
|
||
#endif /* _SCHED_H_ */
|
sys/emulation/posix4/semaphore.h | ||
---|---|---|
#ifndef _SEMAPHORE_H_
|
||
#define _SEMAPHORE_H_
|
||
/* semaphore.h: POSIX 1003.1b semaphores */
|
||
/*-
|
||
* Copyright (c) 1996, 1997
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/semaphore.h,v 1.6 2000/01/20 07:55:42 jasone Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/semaphore.h,v 1.3 2003/08/27 08:30:04 rob Exp $
|
||
*/
|
||
#include <sys/_posix.h>
|
||
#include <machine/limits.h>
|
||
#ifdef _P1003_1B_INCLUDE_MAYBES
|
||
#include <sys/types.h>
|
||
#include <fcntl.h>
|
||
#endif
|
||
/* Opaque type definition. */
|
||
struct sem;
|
||
typedef struct sem *sem_t;
|
||
#define SEM_FAILED ((sem_t *)0)
|
||
#define SEM_VALUE_MAX UINT_MAX
|
||
#ifndef _KERNEL
|
||
#include <sys/cdefs.h>
|
||
__BEGIN_DECLS
|
||
int sem_init (sem_t *, int, unsigned int);
|
||
int sem_destroy (sem_t *);
|
||
sem_t *sem_open (const char *, int, ...);
|
||
int sem_close (sem_t *);
|
||
int sem_unlink (const char *);
|
||
int sem_wait (sem_t *);
|
||
int sem_trywait (sem_t *);
|
||
int sem_post (sem_t *);
|
||
int sem_getvalue (sem_t *, int *);
|
||
__END_DECLS
|
||
#endif
|
||
#endif /* _SEMAPHORE_H_ */
|
sys/kern/kern_p1003_1b.c | ||
---|---|---|
/*
|
||
* Copyright (c) 1996, 1997, 1998
|
||
* HD Associates, Inc. All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions
|
||
* are met:
|
||
* 1. Redistributions of source code must retain the above copyright
|
||
* notice, this list of conditions and the following disclaimer.
|
||
* 2. Redistributions in binary form must reproduce the above copyright
|
||
* notice, this list of conditions and the following disclaimer in the
|
||
* documentation and/or other materials provided with the distribution.
|
||
* 3. All advertising materials mentioning features or use of this software
|
||
* must display the following acknowledgement:
|
||
* This product includes software developed by HD Associates, Inc
|
||
* 4. Neither the name of the author nor the names of any co-contributors
|
||
* may be used to endorse or promote products derived from this software
|
||
* without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES AND CONTRIBUTORS ``AS IS'' AND
|
||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL HD ASSOCIATES OR CONTRIBUTORS BE LIABLE
|
||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
* SUCH DAMAGE.
|
||
*
|
||
* $FreeBSD: src/sys/posix4/p1003_1b.c,v 1.5.2.2 2003/03/25 06:13:35 rwatson Exp $
|
||
* $DragonFly: src/sys/emulation/posix4/p1003_1b.c,v 1.9 2007/02/03 18:05:57 corecode Exp $
|
||
*/
|
||
/* p1003_1b: Real Time common code.
|
||
*/
|
||
#include <sys/param.h>
|
||
#include <sys/systm.h>
|
||
#include <sys/kernel.h>
|
||
#include <sys/sysent.h>
|
||
#include <sys/posix4.h>
|
||
#include <sys/proc.h>
|
||
#include <sys/syslog.h>
|
||
#include <sys/module.h>
|
||
#include <sys/sysproto.h>
|
||
#include <sys/sysctl.h>
|
||
MALLOC_DEFINE(M_P31B, "p1003.1b", "Posix 1003.1B");
|
||
/* p31b_proc: Return a proc struct corresponding to a pid to operate on.
|
||
*
|
||
* Enforce permission policy.
|
||
*
|
||
* The policy is the same as for sending signals except there
|
||
* is no notion of process groups.
|
||
*
|
||
* pid == 0 means my process.
|
||
*
|
||
* This is disabled until I've got a permission gate in again:
|
||
* only root can do this.
|
||
*/
|
||
#if 0
|
||
/*
|
||
* This is stolen from CANSIGNAL in kern_sig:
|
||
*
|
||
* Can process p, with pcred pc, do "write flavor" operations to process q?
|
||
*/
|
||
#define CAN_AFFECT(p, cr, q) \
|
||
((cr)->cr_uid == 0 || \
|
||
(cr)->cr_ruid == (q)->p_ucred->cr_ruid || \
|
||
(cr)->cr_uid == (q)->p_ucred->cr_ruid || \
|
||
(cr)->cr_ruid == (q)->p_ucred->cr_uid || \
|
||
(cr)->cr_uid == (q)->p_ucred->cr_uid)
|
||
#else
|
||
#define CAN_AFFECT(p, cr, q) ((cr)->cr_uid == 0)
|
||
#endif
|
||
/*
|
||
* p31b_proc: Look up a proc from a PID. If proc is 0 it is
|
||
* my own proc.
|
||
*/
|
||
int p31b_proc(struct proc *p, pid_t pid, struct proc **pp)
|
||
{
|
||
int ret = 0;
|
||
struct proc *other_proc = 0;
|
||
if (pid == 0)
|
||
other_proc = p;
|
||
else
|
||
other_proc = pfind(pid);
|
||
if (other_proc)
|
||
{
|
||
/* Enforce permission policy.
|
||
*/
|
||
if (CAN_AFFECT(p, p->p_ucred, other_proc))
|
||
*pp = other_proc;
|
||
else
|
||
ret = EPERM;
|
||
}
|
||
else
|
||
ret = ESRCH;
|
||
return ret;
|
||
}
|
||
#if !defined(_KPOSIX_PRIORITY_SCHEDULING)
|
||
int syscall_not_present(const char *s);
|
||
/* The system calls return ENOSYS if an entry is called that is
|
||
* not run-time supported. I am also logging since some programs
|
||
* start to use this when they shouldn't. That will be removed if annoying.
|
||
*/
|
||
int syscall_not_present(const char *s)
|
||
{
|
||
struct proc *p = curproc;
|
||
log(LOG_ERR, "cmd %s pid %d tried to use non-present %s\n",
|
||
p->p_comm, p->p_pid, s);
|
||
/* a " return nosys(p, uap); " here causes a core dump.
|
||
*/
|
||
return ENOSYS;
|
||
}
|
||
/* Not configured but loadable via a module:
|
||
*/
|
||
static int sched_attach(void)
|
||
{
|
||
return 0;
|
||
}
|
||
#define SYSCALL_NOT_PRESENT_GEN(SC) \
|
||
int SC (struct SC##_args *uap) \
|
||
{ \
|
||
return syscall_not_present(#SC); \
|
||
}
|
||
SYSCALL_NOT_PRESENT_GEN(sched_setparam)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_getparam)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_setscheduler)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_getscheduler)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_yield)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_get_priority_max)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_get_priority_min)
|
||
SYSCALL_NOT_PRESENT_GEN(sched_rr_get_interval)
|
||
#else
|
||
/* Configured in kernel version:
|
||
*/
|
||
static struct ksched *ksched;
|
||
static int sched_attach(void)
|
||
{
|
||
int ret = ksched_attach(&ksched);
|
||
if (ret == 0)
|
||
p31b_setcfg(CTL_P1003_1B_PRIORITY_SCHEDULING, 1);
|
||
return ret;
|
||
}
|
||
int
|
||
sys_sched_setparam(struct sched_setparam_args *uap)
|
||
{
|
||
struct proc *p = curproc;
|
||
struct lwp *lp;
|
||
int e;
|
||
struct sched_param sched_param;
|
||
copyin(uap->param, &sched_param, sizeof(sched_param));
|
||
if ((e = p31b_proc(p, uap->pid, &p)) == 0) {
|
||
lp = FIRST_LWP_IN_PROC(p); /* XXX lwp */
|
||
e = ksched_setparam(&uap->sysmsg_result, ksched, lp,
|
||
(const struct sched_param *)&sched_param);
|