diff --git a/sys/kern/makesyscalls.sh b/sys/kern/makesyscalls.sh index 53afdc28a789..d39fa291fbd5 100644 --- a/sys/kern/makesyscalls.sh +++ b/sys/kern/makesyscalls.sh @@ -115,8 +115,9 @@ s/\$//g printf " * created from%s\n */\n\n", $0 > sysarg printf "#ifndef %s\n", sysproto_h > sysarg printf "#define\t%s\n\n", sysproto_h > sysarg - printf "#include \n\n" > sysarg - printf "#include \n\n" > sysarg + printf "#include \n" > sysarg + printf "#include \n" > sysarg + printf "#include \n\n" > sysarg printf "struct proc;\n\n" > sysarg printf "struct thread;\n\n" > sysarg printf "#define\tPAD_(t)\t(sizeof(register_t) <= sizeof(t) ? \\\n" > sysarg diff --git a/sys/kern/posix4_mib.c b/sys/kern/posix4_mib.c index 09af27d0f623..d36859398c8d 100644 --- a/sys/kern/posix4_mib.c +++ b/sys/kern/posix4_mib.c @@ -92,12 +92,23 @@ P1B_SYSCTL(CTL_P1003_1B_TIMER_MAX, timer_max); /* p31b_setcfg: Set the configuration */ -void p31b_setcfg(int num, int value) +void +p31b_setcfg(int num, int value) { + if (num >= 1 && num < CTL_P1003_1B_MAXID) facility[num - 1] = value; } +int +p31b_getcfg(int num) +{ + + if (num >= 1 && num < CTL_P1003_1B_MAXID) + return (facility[num - 1]); + return (0); +} + /* * Turn on indications for standard (non-configurable) kernel features. */ diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index 64efa6d50288..ab9674b63fe4 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -569,3 +569,18 @@ struct sf_hdtr *hdtr, off_t *sbytes, int flags); } 394 MSTD BSD { int mac_syscall(const char *policy, int call, \ void *arg); } +395 UNIMPL NOHIDE nosys +396 UNIMPL NOHIDE nosys +397 UNIMPL NOHIDE nosys +398 UNIMPL NOHIDE nosys +399 UNIMPL NOHIDE nosys +400 MNOSTD BSD { int ksem_close(semid_t id); } +401 MNOSTD BSD { int ksem_post(semid_t id); } +402 MNOSTD BSD { int ksem_wait(semid_t id); } +403 MNOSTD BSD { int ksem_trywait(semid_t id); } +404 MNOSTD BSD { int ksem_init(semid_t *idp, unsigned int value); } +405 MNOSTD BSD { int ksem_open(semid_t *idp, const char *name, \ + int oflag, mode_t mode, unsigned int value); } +406 MNOSTD BSD { int ksem_unlink(const char *name); } +407 MNOSTD BSD { int ksem_getvalue(semid_t id, int *val); } +408 MNOSTD BSD { int ksem_destroy(semid_t id); } diff --git a/sys/modules/Makefile b/sys/modules/Makefile index a739773e86f8..bd470d2e1ac6 100644 --- a/sys/modules/Makefile +++ b/sys/modules/Makefile @@ -77,6 +77,7 @@ SUBDIR= 3dfx \ ${_random} \ rl \ rp \ + sem \ sf \ sis \ sk \ diff --git a/sys/modules/sem/Makefile b/sys/modules/sem/Makefile new file mode 100644 index 000000000000..0a1dba56a712 --- /dev/null +++ b/sys/modules/sem/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../kern + +KMOD= sem +SRCS= uipc_sem.c opt_posix.h + +.include diff --git a/sys/posix4/_semaphore.h b/sys/posix4/_semaphore.h new file mode 100644 index 000000000000..0024c7291969 --- /dev/null +++ b/sys/posix4/_semaphore.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002 Alfred Perlstein + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 THE AUTHOR 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$ + */ +#ifndef __SEMAPHORE_H_ +#define __SEMAPHORE_H_ + +typedef intptr_t semid_t; + +#ifndef _KERNEL + +#include + +/* + * Semaphore definitions. + */ +struct sem { +#define SEM_MAGIC ((u_int32_t) 0x09fa4012) + u_int32_t magic; + pthread_mutex_t lock; + pthread_cond_t gtzero; + u_int32_t count; + u_int32_t nwaiters; +#define SEM_USER (NULL) + semid_t semid; /* semaphore id if kernel (shared) semaphore */ + int syssem; /* 1 if kernel (shared) semaphore */ + LIST_ENTRY(sem) entry; + struct sem **backpointer; +}; + +__BEGIN_DECLS + +int ksem_close(semid_t id); +int ksem_post(semid_t id); +int ksem_wait(semid_t id); +int ksem_trywait(semid_t id); +int ksem_init(semid_t *idp, unsigned int value); +int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, + unsigned int value); +int ksem_unlink(const char *name); +int ksem_getvalue(semid_t id, int *val); +int ksem_destroy(semid_t id); + +__END_DECLS + +#endif /* !_KERNEL */ + +#endif /* __SEMAPHORE_H_ */ diff --git a/sys/posix4/posix4.h b/sys/posix4/posix4.h index 9b3c66efe2e8..9efd1d9dea1c 100644 --- a/sys/posix4/posix4.h +++ b/sys/posix4/posix4.h @@ -64,6 +64,7 @@ MALLOC_DECLARE(M_P31B); int p31b_proc(struct proc *, pid_t, struct proc **); void p31b_setcfg(int, int); +int p31b_getcfg(int); #ifdef _KPOSIX_PRIORITY_SCHEDULING diff --git a/sys/posix4/posix4_mib.c b/sys/posix4/posix4_mib.c index 09af27d0f623..d36859398c8d 100644 --- a/sys/posix4/posix4_mib.c +++ b/sys/posix4/posix4_mib.c @@ -92,12 +92,23 @@ P1B_SYSCTL(CTL_P1003_1B_TIMER_MAX, timer_max); /* p31b_setcfg: Set the configuration */ -void p31b_setcfg(int num, int value) +void +p31b_setcfg(int num, int value) { + if (num >= 1 && num < CTL_P1003_1B_MAXID) facility[num - 1] = value; } +int +p31b_getcfg(int num) +{ + + if (num >= 1 && num < CTL_P1003_1B_MAXID) + return (facility[num - 1]); + return (0); +} + /* * Turn on indications for standard (non-configurable) kernel features. */ diff --git a/sys/sys/_semaphore.h b/sys/sys/_semaphore.h new file mode 100644 index 000000000000..0024c7291969 --- /dev/null +++ b/sys/sys/_semaphore.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2002 Alfred Perlstein + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 THE AUTHOR 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$ + */ +#ifndef __SEMAPHORE_H_ +#define __SEMAPHORE_H_ + +typedef intptr_t semid_t; + +#ifndef _KERNEL + +#include + +/* + * Semaphore definitions. + */ +struct sem { +#define SEM_MAGIC ((u_int32_t) 0x09fa4012) + u_int32_t magic; + pthread_mutex_t lock; + pthread_cond_t gtzero; + u_int32_t count; + u_int32_t nwaiters; +#define SEM_USER (NULL) + semid_t semid; /* semaphore id if kernel (shared) semaphore */ + int syssem; /* 1 if kernel (shared) semaphore */ + LIST_ENTRY(sem) entry; + struct sem **backpointer; +}; + +__BEGIN_DECLS + +int ksem_close(semid_t id); +int ksem_post(semid_t id); +int ksem_wait(semid_t id); +int ksem_trywait(semid_t id); +int ksem_init(semid_t *idp, unsigned int value); +int ksem_open(semid_t *idp, const char *name, int oflag, mode_t mode, + unsigned int value); +int ksem_unlink(const char *name); +int ksem_getvalue(semid_t id, int *val); +int ksem_destroy(semid_t id); + +__END_DECLS + +#endif /* !_KERNEL */ + +#endif /* __SEMAPHORE_H_ */ diff --git a/sys/sys/posix4.h b/sys/sys/posix4.h index 9b3c66efe2e8..9efd1d9dea1c 100644 --- a/sys/sys/posix4.h +++ b/sys/sys/posix4.h @@ -64,6 +64,7 @@ MALLOC_DECLARE(M_P31B); int p31b_proc(struct proc *, pid_t, struct proc **); void p31b_setcfg(int, int); +int p31b_getcfg(int); #ifdef _KPOSIX_PRIORITY_SCHEDULING