예제 #1
0
/*
 * Called once to initialize data structures...
 */
static int
nfssvc_modevent(module_t mod, int type, void *data)
{
	int error = 0;

	switch (type) {
	case MOD_LOAD:
		error = syscall_helper_register(nfssvc_syscalls,
		    SY_THR_STATIC_KLD);
		break;

	case MOD_UNLOAD:
		if (nfsd_call_nfsserver != NULL || nfsd_call_nfscommon != NULL
		    || nfsd_call_nfscl != NULL || nfsd_call_nfsd != NULL) {
			error = EBUSY;
			break;
		}
		syscall_helper_unregister(nfssvc_syscalls);
		break;
	default:
		error = EOPNOTSUPP;
		break;
	}
	return error;
}
예제 #2
0
static int
ksem_module_init(void)
{
	int error;

	mtx_init(&sem_lock, "sem", NULL, MTX_DEF);
	mtx_init(&ksem_count_lock, "ksem count", NULL, MTX_DEF);
	sx_init(&ksem_dict_lock, "ksem dictionary");
	ksem_dictionary = hashinit(1024, M_KSEM, &ksem_hash);
	p31b_setcfg(CTL_P1003_1B_SEM_NSEMS_MAX, SEM_MAX);
	p31b_setcfg(CTL_P1003_1B_SEM_VALUE_MAX, SEM_VALUE_MAX);

	error = syscall_helper_register(ksem_syscalls);
	if (error)
		return (error);
#ifdef COMPAT_FREEBSD32
	error = syscall32_helper_register(ksem32_syscalls);
	if (error)
		return (error);
#endif
	return (0);
}
예제 #3
0
static int
msginit()
{
    int i, error;

    TUNABLE_INT_FETCH("kern.ipc.msgseg", &msginfo.msgseg);
    TUNABLE_INT_FETCH("kern.ipc.msgssz", &msginfo.msgssz);
    msginfo.msgmax = msginfo.msgseg * msginfo.msgssz;
    TUNABLE_INT_FETCH("kern.ipc.msgmni", &msginfo.msgmni);
    TUNABLE_INT_FETCH("kern.ipc.msgmnb", &msginfo.msgmnb);
    TUNABLE_INT_FETCH("kern.ipc.msgtql", &msginfo.msgtql);

    msgpool = malloc(msginfo.msgmax, M_MSG, M_WAITOK);
    msgmaps = malloc(sizeof(struct msgmap) * msginfo.msgseg, M_MSG, M_WAITOK);
    msghdrs = malloc(sizeof(struct msg) * msginfo.msgtql, M_MSG, M_WAITOK);
    msqids = malloc(sizeof(struct msqid_kernel) * msginfo.msgmni, M_MSG,
                    M_WAITOK);

    /*
     * msginfo.msgssz should be a power of two for efficiency reasons.
     * It is also pretty silly if msginfo.msgssz is less than 8
     * or greater than about 256 so ...
     */

    i = 8;
    while (i < 1024 && i != msginfo.msgssz)
        i <<= 1;
    if (i != msginfo.msgssz) {
        DPRINTF(("msginfo.msgssz=%d (0x%x)\n", msginfo.msgssz,
                 msginfo.msgssz));
        panic("msginfo.msgssz not a small power of 2");
    }

    if (msginfo.msgseg > 32767) {
        DPRINTF(("msginfo.msgseg=%d\n", msginfo.msgseg));
        panic("msginfo.msgseg > 32767");
    }

    for (i = 0; i < msginfo.msgseg; i++) {
        if (i > 0)
            msgmaps[i-1].next = i;
        msgmaps[i].next = -1;	/* implies entry is available */
    }
    free_msgmaps = 0;
    nfree_msgmaps = msginfo.msgseg;

    for (i = 0; i < msginfo.msgtql; i++) {
        msghdrs[i].msg_type = 0;
        if (i > 0)
            msghdrs[i-1].msg_next = &msghdrs[i];
        msghdrs[i].msg_next = NULL;
#ifdef MAC
        mac_sysvmsg_init(&msghdrs[i]);
#endif
    }
    free_msghdrs = &msghdrs[0];

    for (i = 0; i < msginfo.msgmni; i++) {
        msqids[i].u.msg_qbytes = 0;	/* implies entry is available */
        msqids[i].u.msg_perm.seq = 0;	/* reset to a known value */
        msqids[i].u.msg_perm.mode = 0;
#ifdef MAC
        mac_sysvmsq_init(&msqids[i]);
#endif
    }
    mtx_init(&msq_mtx, "msq", NULL, MTX_DEF);

    error = syscall_helper_register(msg_syscalls);
    if (error != 0)
        return (error);
#ifdef COMPAT_FREEBSD32
    error = syscall32_helper_register(msg32_syscalls);
    if (error != 0)
        return (error);
#endif
    return (0);
}
예제 #4
0
#include <netinet/sctp_peeloff.h>

static struct syscall_helper_data sctp_syscalls[] = {
	SYSCALL_INIT_HELPER_F(sctp_peeloff, SYF_CAPENABLED),
	SYSCALL_INIT_HELPER_F(sctp_generic_sendmsg, SYF_CAPENABLED),
	SYSCALL_INIT_HELPER_F(sctp_generic_sendmsg_iov, SYF_CAPENABLED),
	SYSCALL_INIT_HELPER_F(sctp_generic_recvmsg, SYF_CAPENABLED),
	SYSCALL_INIT_LAST
};

static void
sctp_syscalls_init(void *unused __unused)
{
	int error;

	error = syscall_helper_register(sctp_syscalls, SY_THR_STATIC);
	KASSERT((error == 0),
	    ("%s: syscall_helper_register failed for sctp syscalls", __func__));
#ifdef COMPAT_FREEBSD32
	error = syscall32_helper_register(sctp_syscalls, SY_THR_STATIC);
	KASSERT((error == 0),
	    ("%s: syscall32_helper_register failed for sctp syscalls",
	    __func__));
#endif
}
SYSINIT(sctp_syscalls, SI_SUB_SYSCALLS, SI_ORDER_ANY, sctp_syscalls_init, NULL);

/*
 * SCTP syscalls.
 * Functionality only compiled in if SCTP is defined in the kernel Makefile,
 * otherwise all return EOPNOTSUPP.