/** * 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; } }
/** * 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(); }
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; }
__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); }
__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); }