コード例 #1
0
/**
 * Frees the per-cpu spin locks used to disable preemption.
 *
 * Called by rtR0TermNative.
 */
void rtThreadPreemptDarwinTerm(void)
{
    for (size_t i = 0; i < RT_ELEMENTS(g_aPreemptHacks); i++)
        if (g_aPreemptHacks[i].pSpinLock)
        {
            lck_spin_free(g_aPreemptHacks[i].pSpinLock, g_pDarwinLockGroup);
            g_aPreemptHacks[i].pSpinLock = NULL;
        }
}
コード例 #2
0
/**
 * Frees the per-cpu spin locks used to disable preemption.
 *
 * Called by rtR0TermNative.
 */
void rtThreadPreemptDarwinTerm(void)
{
    IPRT_DARWIN_SAVE_EFL_AC();

    for (size_t i = 0; i < RT_ELEMENTS(g_aPreemptHacks); i++)
        if (g_aPreemptHacks[i].pSpinLock)
        {
            lck_spin_free(g_aPreemptHacks[i].pSpinLock, g_pDarwinLockGroup);
            g_aPreemptHacks[i].pSpinLock = NULL;
        }

    IPRT_DARWIN_RESTORE_EFL_AC();
}
コード例 #3
0
ファイル: ucode.c プロジェクト: JackieXie168/xnu
static kern_return_t
register_locks(void)
{
	/* already allocated? */
	if (ucode_slock_grp_attr && ucode_slock_grp && ucode_slock_attr && ucode_slock)
		return KERN_SUCCESS;

	/* allocate lock group attribute and group */
	if (!(ucode_slock_grp_attr = lck_grp_attr_alloc_init()))
		goto nomem_out;

	lck_grp_attr_setstat(ucode_slock_grp_attr);

	if (!(ucode_slock_grp = lck_grp_alloc_init("uccode_lock", ucode_slock_grp_attr)))
		goto nomem_out;

	/* Allocate lock attribute */
	if (!(ucode_slock_attr = lck_attr_alloc_init()))
		goto nomem_out;

	/* Allocate the spin lock */
	/* We keep one global spin-lock. We could have one per update
	 * request... but srsly, why would you update microcode like that?
	 */
	if (!(ucode_slock = lck_spin_alloc_init(ucode_slock_grp, ucode_slock_attr)))
		goto nomem_out;

	return KERN_SUCCESS;

nomem_out:
	/* clean up */
	if (ucode_slock)
		lck_spin_free(ucode_slock, ucode_slock_grp);
	if (ucode_slock_attr)
		lck_attr_free(ucode_slock_attr);
	if (ucode_slock_grp)
		lck_grp_free(ucode_slock_grp);
	if (ucode_slock_grp_attr)
		lck_grp_attr_free(ucode_slock_grp_attr);

	return KERN_NO_SPACE;
}
コード例 #4
0
__private_extern__
int pp_filter_deregister()
{
    // Bug in 10.4.2 - if we attached to an IP6 socket, the kernel will
    // panic when we try to deregister the filter. It appears the socket
    // stays on the filter list even when closed. Radar# 4234311.
    // This is fixed in 10.4.3.

    pp_filter_deregister_handle(PP_FILTER_UDP_HANDLE, &udpFiltDone);
    pp_filter_deregister_handle(PP_FILTER_TCP_HANDLE, &tcpFiltDone);
    pp_filter_deregister_handle(PP_FILTER_UDP6_HANDLE, &udp6FiltDone);
    pp_filter_deregister_handle(PP_FILTER_TCP6_HANDLE, &tcp6FiltDone);

    if (-1 != icmpFiltDone)
        pp_filter_deregister_handle(PP_FILTER_ICMP_HANDLE, &icmpFiltDone);
    if (-1 != icmp6FiltDone)
        pp_filter_deregister_handle(PP_FILTER_ICMP6_HANDLE, &icmp6FiltDone);
    if (-1 != rawFiltDone)
        pp_filter_deregister_handle(PP_FILTER_RAW_HANDLE, &rawFiltDone);

    lck_spin_free(pp_dynlck, pp_spin_grp);
    return (0);
}
コード例 #5
0
__private_extern__
int pp_filter_register()
{
    struct sflt_filter pp_filter = {
        0, // sf_handle
        SFLT_GLOBAL, // sf_flags
        0, // sf_name
        ppfilter_unregister, // sf_unregistered
        ppfilter_attach, // sf_attach
        ppfilter_detach, // sf_detach
        NULL, // sf_notify
        NULL, // sf_getpeername
        NULL, // sf_getsockname
        NULL, // sf_data_in
        NULL, // sf_data_out
        ppfilter_connect_in, // sf_connect_in
        ppfilter_connect_out, // sf_connect_out
        NULL, // sf_bind
        NULL, // sf_setoption
        NULL, // sf_getoption
        NULL, // sf_listen
        NULL, // sf_ioctl
    };

    int i;
    for(i=0; i < PP_DYN_ENTRIES_COUNT; ++i)
        pp_dyn_entries[i].addr = INADDR_NONE;

    pp_dynlck = lck_spin_alloc_init(pp_spin_grp, LCK_ATTR_NULL);
    if (!pp_dynlck)
        return (ENOMEM);

    errno_t err;

    pp_filter.sf_handle = PP_FILTER_TCP_HANDLE;
    // data filter is used for PASV FTP support
    pp_filter.sf_data_in = ppfilter_data_in;
    pp_filter.sf_name = "PeerGuardian TCP";
    if ((err = sflt_register(&pp_filter, AF_INET, SOCK_STREAM, IPPROTO_TCP))) {
        printf("PeerGuardian: Failed to register '%s' filter: %d.\n", pp_filter.sf_name, err);
        return (err);
    }

    pp_filter.sf_handle = PP_FILTER_TCP6_HANDLE;
    pp_filter.sf_name = "PeerGuardian TCP6";
    if ((err = sflt_register(&pp_filter, AF_INET6, SOCK_STREAM, IPPROTO_TCP))) {
        printf("PeerGuardian: Failed to register '%s' filter: %d.\n", pp_filter.sf_name, err);
        pp_filter_deregister_handle(PP_FILTER_TCP_HANDLE, &tcpFiltDone);
        goto filter_register_exit;
    }
    pp_filter.sf_data_in = (typeof(pp_filter.sf_data_in))NULL;

    // UDP can "connect", but it can also just send the data, so we need to monitor both
    pp_filter.sf_data_in = ppfilter_data_in_raw;
    pp_filter.sf_data_out = ppfilter_data_out_raw;

    pp_filter.sf_handle = PP_FILTER_UDP_HANDLE;
    pp_filter.sf_name = "PeerGuardian UDP";
    if ((err = sflt_register(&pp_filter, AF_INET, SOCK_DGRAM, IPPROTO_UDP))) {
        printf("PeerGuardian: Failed to register '%s' filter: %d.\n", pp_filter.sf_name, err);
        pp_filter_deregister_handle(PP_FILTER_TCP_HANDLE, &tcpFiltDone);
        pp_filter_deregister_handle(PP_FILTER_TCP6_HANDLE, &tcp6FiltDone);
        goto filter_register_exit;
    }

    pp_filter.sf_handle = PP_FILTER_UDP6_HANDLE;
    pp_filter.sf_name = "PeerGuardian UDP6";
    if ((err = sflt_register(&pp_filter, AF_INET6, SOCK_DGRAM, IPPROTO_UDP))) {
        printf("PeerGuardian: Failed to register '%s' filter: %d.\n", pp_filter.sf_name, err);
        pp_filter_deregister_handle(PP_FILTER_TCP_HANDLE, &tcpFiltDone);
        pp_filter_deregister_handle(PP_FILTER_TCP6_HANDLE, &tcp6FiltDone);
        pp_filter_deregister_handle(PP_FILTER_UDP_HANDLE, &udpFiltDone);
        goto filter_register_exit;
    }

    // RAW sockets don't "connect", they just send/recv data
    pp_filter.sf_connect_in = (typeof(pp_filter.sf_connect_in))NULL;
    pp_filter.sf_connect_out = (typeof(pp_filter.sf_connect_out))NULL;

    // Failures of the following are not fatal
    pp_filter.sf_handle = PP_FILTER_ICMP_HANDLE;
    pp_filter.sf_name = "PeerGuardian ICMP";
    if ((err = sflt_register(&pp_filter, AF_INET, SOCK_RAW, IPPROTO_ICMP))) {
        printf("PeerGuardian: Failed to register '%s' filter: %d.\n", pp_filter.sf_name, err);
        icmpFiltDone = -1;
    }

    pp_filter.sf_handle = PP_FILTER_ICMP6_HANDLE;
    pp_filter.sf_name = "PeerGuardian ICMP6";
    if ((err = sflt_register(&pp_filter, AF_INET6, SOCK_RAW, IPPROTO_ICMPV6))) {
        printf("PeerGuardian: Failed to register '%s' filter: %d.\n", pp_filter.sf_name, err);
        icmp6FiltDone = -1;
    }

    pp_filter.sf_handle = PP_FILTER_RAW_HANDLE;
    pp_filter.sf_name = "PeerGuardian RAW";
    if ((err = sflt_register(&pp_filter, AF_INET, SOCK_RAW, IPPROTO_RAW))) {
        printf("PeerGuardian: Failed to register '%s' filter: %d.\n", pp_filter.sf_name, err);
        rawFiltDone = -1;
    }

    err = 0;

filter_register_exit:
    if (err && pp_dynlck)
        lck_spin_free(pp_dynlck, pp_spin_grp);

    return (err);
}