From bcdce02d9bc8150e1d191ed5ca9da45b7604964a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 21 Aug 2018 13:47:02 +0200 Subject: Update to FreeBSD head 2018-06-01 Git mirror commit fb63610a69b0eb7f69a201ba05c4c1a7a2739cf9. Update #3472. --- rtemsbsd/include/machine/atomic.h | 33 ++ .../include/machine/rtems-bsd-kernel-namespace.h | 115 ++++--- rtemsbsd/include/sys/disk_zone.h | 1 + rtemsbsd/include/sys/epoch.h | 141 +++++++++ rtemsbsd/rtems/rtems-kernel-epoch.c | 334 +++++++++++++++++++++ rtemsbsd/rtems/rtems-kernel-jail.c | 2 +- rtemsbsd/sys/arm/lpc/if_lpe.c | 18 +- 7 files changed, 606 insertions(+), 38 deletions(-) create mode 100644 rtemsbsd/include/sys/disk_zone.h create mode 100644 rtemsbsd/include/sys/epoch.h create mode 100644 rtemsbsd/rtems/rtems-kernel-epoch.c (limited to 'rtemsbsd') diff --git a/rtemsbsd/include/machine/atomic.h b/rtemsbsd/include/machine/atomic.h index f7de4178..052df5a7 100644 --- a/rtemsbsd/include/machine/atomic.h +++ b/rtemsbsd/include/machine/atomic.h @@ -379,6 +379,39 @@ atomic_cmpset_int(volatile int *p, int cmp, int set) return (rv); } +static inline int +atomic_fcmpset_int(volatile int *p, int *cmp, int set) +{ + int rv; + +#if defined(_RTEMS_BSD_MACHINE_ATOMIC_USE_ATOMIC) + std::atomic_int *q = + reinterpret_cast(const_cast(p)); + + rv = q->compare_exchange_strong(*cmp, set, std::memory_order_seq_cst, + std::memory_order_relaxed); +#elif defined(_RTEMS_BSD_MACHINE_ATOMIC_USE_STDATOMIC) + atomic_int *q = (atomic_int *)RTEMS_DEVOLATILE(int *, p); + + rv = atomic_compare_exchange_strong_explicit(q, cmp, set, + memory_order_seq_cst, memory_order_relaxed); +#else + rtems_interrupt_level level; + int actual; + + rtems_interrupt_disable(level); + actual = *p; + rv = actual == *cmp; + *cmp = actual; + if (rv) { + *p = set; + } + rtems_interrupt_enable(level); +#endif + + return (rv); +} + static inline int atomic_cmpset_acq_int(volatile int *p, int cmp, int set) { diff --git a/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h b/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h index fa2e946c..f0c4ceb0 100644 --- a/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h +++ b/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h @@ -45,16 +45,6 @@ #define altq_remove _bsd_altq_remove #define altq_remove_queue _bsd_altq_remove_queue #define altqs_inactive_open _bsd_altqs_inactive_open -#define arcbroadcastaddr _bsd_arcbroadcastaddr -#define arc_frag_init _bsd_arc_frag_init -#define arc_frag_next _bsd_arc_frag_next -#define arc_ifattach _bsd_arc_ifattach -#define arc_ifdetach _bsd_arc_ifdetach -#define arc_input _bsd_arc_input -#define arc_ioctl _bsd_arc_ioctl -#define arc_isphds _bsd_arc_isphds -#define arc_output _bsd_arc_output -#define arc_storelladdr _bsd_arc_storelladdr #define arp_announce_ifaddr _bsd_arp_announce_ifaddr #define arp_ifinit _bsd_arp_ifinit #define arprequest _bsd_arprequest @@ -351,9 +341,6 @@ #define bridge_control_table _bsd_bridge_control_table #define bridge_control_table_size _bsd_bridge_control_table_size #define bridge_dn_p _bsd_bridge_dn_p -#define bridge_input_p _bsd_bridge_input_p -#define bridge_linkstate_p _bsd_bridge_linkstate_p -#define bridge_output_p _bsd_bridge_output_p #define bridge_rtable_prune_period _bsd_bridge_rtable_prune_period #define bridge_rtnode_zone _bsd_bridge_rtnode_zone #define bstp_attach _bsd_bstp_attach @@ -547,6 +534,19 @@ #define chacha_encrypt_bytes _bsd_chacha_encrypt_bytes #define chacha_ivsetup _bsd_chacha_ivsetup #define chacha_keysetup _bsd_chacha_keysetup +#define _ck_epoch_addref _bsd__ck_epoch_addref +#define ck_epoch_barrier _bsd_ck_epoch_barrier +#define ck_epoch_barrier_wait _bsd_ck_epoch_barrier_wait +#define _ck_epoch_delref _bsd__ck_epoch_delref +#define ck_epoch_init _bsd_ck_epoch_init +#define ck_epoch_poll _bsd_ck_epoch_poll +#define ck_epoch_poll_deferred _bsd_ck_epoch_poll_deferred +#define ck_epoch_reclaim _bsd_ck_epoch_reclaim +#define ck_epoch_recycle _bsd_ck_epoch_recycle +#define ck_epoch_register _bsd_ck_epoch_register +#define ck_epoch_synchronize _bsd_ck_epoch_synchronize +#define ck_epoch_synchronize_wait _bsd_ck_epoch_synchronize_wait +#define ck_epoch_unregister _bsd_ck_epoch_unregister #define clean_unrhdr _bsd_clean_unrhdr #define clean_unrhdrl _bsd_clean_unrhdrl #define ClearCheckNewLink _bsd_ClearCheckNewLink @@ -692,6 +692,7 @@ #define device_get_sysctl_ctx _bsd_device_get_sysctl_ctx #define device_get_sysctl_tree _bsd_device_get_sysctl_tree #define device_get_unit _bsd_device_get_unit +#define device_has_quiet_children _bsd_device_has_quiet_children #define device_is_alive _bsd_device_is_alive #define device_is_attached _bsd_device_is_attached #define device_is_enabled _bsd_device_is_enabled @@ -704,6 +705,7 @@ #define device_probe_child _bsd_device_probe_child #define device_quiesce _bsd_device_quiesce #define device_quiet _bsd_device_quiet +#define device_quiet_children _bsd_device_quiet_children #define device_set_desc _bsd_device_set_desc #define device_set_desc_copy _bsd_device_set_desc_copy #define device_set_devclass _bsd_device_set_devclass @@ -747,7 +749,7 @@ #define dwc_otg_uninit _bsd_dwc_otg_uninit #define e1000_acquire_nvm_generic _bsd_e1000_acquire_nvm_generic #define e1000_acquire_phy _bsd_e1000_acquire_phy -#define e1000_acquire_swfw_sync_i210 _bsd_e1000_acquire_swfw_sync_i210 +#define e1000_acquire_swfw_sync _bsd_e1000_acquire_swfw_sync #define e1000_blink_led _bsd_e1000_blink_led #define e1000_blink_led_generic _bsd_e1000_blink_led_generic #define e1000_calculate_checksum _bsd_e1000_calculate_checksum @@ -809,7 +811,7 @@ #define e1000_get_cfg_done_generic _bsd_e1000_get_cfg_done_generic #define e1000_get_eee_status_i354 _bsd_e1000_get_eee_status_i354 #define e1000_get_flash_presence_i210 _bsd_e1000_get_flash_presence_i210 -#define e1000_get_hw_semaphore_generic _bsd_e1000_get_hw_semaphore_generic +#define e1000_get_hw_semaphore _bsd_e1000_get_hw_semaphore #define e1000_get_laa_state_82571 _bsd_e1000_get_laa_state_82571 #define e1000_get_pba_block_size _bsd_e1000_get_pba_block_size #define e1000_get_phy_id _bsd_e1000_get_phy_id @@ -915,7 +917,7 @@ #define e1000_power_up_phy _bsd_e1000_power_up_phy #define e1000_power_up_phy_copper _bsd_e1000_power_up_phy_copper #define e1000_promisc_set_vf _bsd_e1000_promisc_set_vf -#define e1000_put_hw_semaphore_generic _bsd_e1000_put_hw_semaphore_generic +#define e1000_put_hw_semaphore _bsd_e1000_put_hw_semaphore #define e1000_rar_set _bsd_e1000_rar_set #define e1000_read_emi_reg _bsd_e1000_read_emi_reg #define e1000_read_emi_reg_locked _bsd_e1000_read_emi_reg_locked @@ -957,7 +959,7 @@ #define e1000_read_xmdio_reg _bsd_e1000_read_xmdio_reg #define e1000_release_nvm_generic _bsd_e1000_release_nvm_generic #define e1000_release_phy _bsd_e1000_release_phy -#define e1000_release_swfw_sync_i210 _bsd_e1000_release_swfw_sync_i210 +#define e1000_release_swfw_sync _bsd_e1000_release_swfw_sync #define e1000_reload_nvm _bsd_e1000_reload_nvm #define e1000_reset_adaptive _bsd_e1000_reset_adaptive #define e1000_reset_adaptive_generic _bsd_e1000_reset_adaptive_generic @@ -1071,7 +1073,6 @@ #define encap_attach_func _bsd_encap_attach_func #define encap_detach _bsd_encap_detach #define encap_getarg _bsd_encap_getarg -#define encap_init _bsd_encap_init #define enc_xform_3des _bsd_enc_xform_3des #define enc_xform_aes_icm _bsd_enc_xform_aes_icm #define enc_xform_aes_nist_gcm _bsd_enc_xform_aes_nist_gcm @@ -1087,6 +1088,12 @@ #define enc_xform_rijndael128 _bsd_enc_xform_rijndael128 #define enc_xform_skipjack _bsd_enc_xform_skipjack #define eopnotsupp _bsd_eopnotsupp +#define epoch_call _bsd_epoch_call +#define epoch_enter_preempt _bsd_epoch_enter_preempt +#define epoch_exit_preempt _bsd_epoch_exit_preempt +#define epoch_init _bsd_epoch_init +#define epoch_wait _bsd_epoch_wait +#define epoch_wait_preempt _bsd_epoch_wait_preempt #define esp_enable _bsd_esp_enable #define esp_hdrsiz _bsd_esp_hdrsiz #define espstat _bsd_espstat @@ -1169,9 +1176,6 @@ #define eventhandler_find_list _bsd_eventhandler_find_list #define eventhandler_prune_list _bsd_eventhandler_prune_list #define eventhandler_register _bsd_eventhandler_register -#define fddi_ifattach _bsd_fddi_ifattach -#define fddi_ifdetach _bsd_fddi_ifdetach -#define fddi_ioctl _bsd_fddi_ioctl #define fdt_addrsize_cells _bsd_fdt_addrsize_cells #define fdt_data_get _bsd_fdt_data_get #define fdt_data_to_res _bsd_fdt_data_to_res @@ -1181,20 +1185,16 @@ #define fdt_get_mem_regions _bsd_fdt_get_mem_regions #define fdt_get_phyaddr _bsd_fdt_get_phyaddr #define fdt_get_range _bsd_fdt_get_range +#define fdt_get_reserved_mem _bsd_fdt_get_reserved_mem #define fdt_get_reserved_regions _bsd_fdt_get_reserved_regions -#define fdt_get_unit _bsd_fdt_get_unit #define fdt_ic_list_head _bsd_fdt_ic_list_head #define fdt_immr_addr _bsd_fdt_immr_addr #define fdt_immr_pa _bsd_fdt_immr_pa #define fdt_immr_size _bsd_fdt_immr_size #define fdt_immr_va _bsd_fdt_immr_va #define fdt_is_compatible_strict _bsd_fdt_is_compatible_strict -#define fdt_is_enabled _bsd_fdt_is_enabled -#define fdt_is_type _bsd_fdt_is_type #define fdt_parent_addr_cells _bsd_fdt_parent_addr_cells -#define fdt_pm_is_enabled _bsd_fdt_pm_is_enabled #define fdt_regsize _bsd_fdt_regsize -#define fdt_reg_to_rl _bsd_fdt_reg_to_rl #define fib4_free_nh_ext _bsd_fib4_free_nh_ext #define fib4_lookup_nh_basic _bsd_fib4_lookup_nh_basic #define fib4_lookup_nh_ext _bsd_fib4_lookup_nh_ext @@ -1272,6 +1272,8 @@ #define gif_encapcheck _bsd_gif_encapcheck #define gif_input _bsd_gif_input #define gif_output _bsd_gif_output +#define global_epoch _bsd_global_epoch +#define global_epoch_preempt _bsd_global_epoch_preempt #define gpio_alloc_intr_resource _bsd_gpio_alloc_intr_resource #define gpiobus_acquire_pin _bsd_gpiobus_acquire_pin #define gpiobus_alloc_ivars _bsd_gpiobus_alloc_ivars @@ -1284,6 +1286,12 @@ #define gpiobus_release_pin _bsd_gpiobus_release_pin #define gpio_check_flags _bsd_gpio_check_flags #define gre_input _bsd_gre_input +#define grouptaskqueue_enqueue _bsd_grouptaskqueue_enqueue +#define gtaskqueue_block _bsd_gtaskqueue_block +#define gtaskqueue_cancel _bsd_gtaskqueue_cancel +#define gtaskqueue_drain _bsd_gtaskqueue_drain +#define gtaskqueue_drain_all _bsd_gtaskqueue_drain_all +#define gtaskqueue_unblock _bsd_gtaskqueue_unblock #define handlers _bsd_handlers #define hashdestroy _bsd_hashdestroy #define hashinit _bsd_hashinit @@ -1792,6 +1800,8 @@ #define if_attach _bsd_if_attach #define if_bpfmtap _bsd_if_bpfmtap #define ifc_alloc_unit _bsd_ifc_alloc_unit +#define ifc_flags_get _bsd_ifc_flags_get +#define ifc_flags_set _bsd_ifc_flags_set #define ifc_free_unit _bsd_ifc_free_unit #define if_clearhwassist _bsd_if_clearhwassist #define if_clone_addgroup _bsd_if_clone_addgroup @@ -1804,6 +1814,7 @@ #define if_clone_list _bsd_if_clone_list #define if_cloners _bsd_if_cloners #define if_clone_simple _bsd_if_clone_simple +#define ifc_name _bsd_ifc_name #define ifc_name2unit _bsd_ifc_name2unit #define if_data_copy _bsd_if_data_copy #define if_dead _bsd_if_dead @@ -1811,6 +1822,7 @@ #define if_delgroup _bsd_if_delgroup #define if_delmulti _bsd_if_delmulti #define if_delmulti_ifma _bsd_if_delmulti_ifma +#define if_delmulti_ifma_flags _bsd_if_delmulti_ifma_flags #define if_dequeue _bsd_if_dequeue #define if_deregister_com_alloc _bsd_if_deregister_com_alloc #define if_detach _bsd_if_detach @@ -1818,6 +1830,7 @@ #define if_etherbpfmtap _bsd_if_etherbpfmtap #define if_findmulti _bsd_if_findmulti #define if_free _bsd_if_free +#define if_freemulti _bsd_if_freemulti #define if_getamcount _bsd_if_getamcount #define if_getbaudrate _bsd_if_getbaudrate #define if_getcapabilities _bsd_if_getcapabilities @@ -1849,8 +1862,10 @@ #define if_input _bsd_if_input #define ifioctl _bsd_ifioctl #define if_link_state_change _bsd_if_link_state_change +#define ifma6_restart _bsd_ifma6_restart #define if_maddr_rlock _bsd_if_maddr_rlock #define if_maddr_runlock _bsd_if_maddr_runlock +#define ifma_restart _bsd_ifma_restart #define ifmedia_add _bsd_ifmedia_add #define ifmedia_baudrate _bsd_ifmedia_baudrate #define ifmedia_init _bsd_ifmedia_init @@ -1973,7 +1988,9 @@ #define in6_inithead _bsd_in6_inithead #define in6_is_addr_deprecated _bsd_in6_is_addr_deprecated #define in6_joingroup _bsd_in6_joingroup +#define in6_joingroup_locked _bsd_in6_joingroup_locked #define in6_leavegroup _bsd_in6_leavegroup +#define in6_leavegroup_locked _bsd_in6_leavegroup_locked #define in6_localaddr _bsd_in6_localaddr #define in6_localip _bsd_in6_localip #define in6_losing _bsd_in6_losing @@ -1988,16 +2005,16 @@ #define in6_matchlen _bsd_in6_matchlen #define in6_maxmtu _bsd_in6_maxmtu #define in6_mcast_loop _bsd_in6_mcast_loop -#define in6_mc_join _bsd_in6_mc_join -#define in6_mc_join_locked _bsd_in6_mc_join_locked #define in6m_clear_recorded _bsd_in6m_clear_recorded -#define in6_mc_leave _bsd_in6_mc_leave -#define in6_mc_leave_locked _bsd_in6_mc_leave_locked #define in6m_commit _bsd_in6m_commit +#define in6m_disconnect _bsd_in6m_disconnect #define in6m_print _bsd_in6m_print #define in6m_record_source _bsd_in6m_record_source -#define in6m_release_locked _bsd_in6m_release_locked -#define in6_multi_mtx _bsd_in6_multi_mtx +#define in6m_release_deferred _bsd_in6m_release_deferred +#define in6m_release_list_deferred _bsd_in6m_release_list_deferred +#define in6_multi_free_mtx _bsd_in6_multi_free_mtx +#define in6_multi_list_mtx _bsd_in6_multi_list_mtx +#define in6_multi_sx _bsd_in6_multi_sx #define in6_newaddrmsg _bsd_in6_newaddrmsg #define in6_nigroup _bsd_in6_nigroup #define in6_nigroup_oldmcprefix _bsd_in6_nigroup_oldmcprefix @@ -2048,7 +2065,6 @@ #define in_cksum_skip _bsd_in_cksum_skip #define in_control _bsd_in_control #define in_delayed_cksum _bsd_in_delayed_cksum -#define in_delmulti _bsd_in_delmulti #define in_domifattach _bsd_in_domifattach #define in_domifdetach _bsd_in_domifdetach #define inet6ctlerrmap _bsd_inet6ctlerrmap @@ -2091,12 +2107,16 @@ #define in_mcast_loop _bsd_in_mcast_loop #define inm_clear_recorded _bsd_inm_clear_recorded #define inm_commit _bsd_inm_commit +#define inm_disconnect _bsd_inm_disconnect #define inm_lookup _bsd_inm_lookup #define inm_lookup_locked _bsd_inm_lookup_locked #define inm_print _bsd_inm_print #define inm_record_source _bsd_inm_record_source -#define inm_release_locked _bsd_inm_release_locked -#define in_multi_mtx _bsd_in_multi_mtx +#define inm_release_deferred _bsd_inm_release_deferred +#define inm_release_list_deferred _bsd_inm_release_list_deferred +#define in_multi_free_mtx _bsd_in_multi_free_mtx +#define in_multi_list_mtx _bsd_in_multi_list_mtx +#define in_multi_sx _bsd_in_multi_sx #define inp_4tuple_get _bsd_inp_4tuple_get #define inp_apply_all _bsd_inp_apply_all #define in_pcballoc _bsd_in_pcballoc @@ -2115,6 +2135,7 @@ #define in_pcbinshash _bsd_in_pcbinshash #define in_pcbinshash_nopcbgroup _bsd_in_pcbinshash_nopcbgroup #define in_pcbladdr _bsd_in_pcbladdr +#define in_pcblist_rele_rlocked _bsd_in_pcblist_rele_rlocked #define in_pcblookup _bsd_in_pcblookup #define in_pcblookup_local _bsd_in_pcblookup_local #define in_pcblookup_mbuf _bsd_in_pcblookup_mbuf @@ -2687,6 +2708,7 @@ #define mii_pollstat _bsd_mii_pollstat #define mii_tick _bsd_mii_tick #define M_IOV _bsd_M_IOV +#define M_IP6MADDR _bsd_M_IP6MADDR #define M_IP6NDP _bsd_M_IP6NDP #define M_IPSEC_INPCB _bsd_M_IPSEC_INPCB #define M_IPSEC_MISC _bsd_M_IPSEC_MISC @@ -2695,6 +2717,7 @@ #define M_IPSEC_SAQ _bsd_M_IPSEC_SAQ #define M_IPSEC_SAR _bsd_M_IPSEC_SAR #define M_IPSEC_SP _bsd_M_IPSEC_SP +#define M_IPSEC_SPDCACHE _bsd_M_IPSEC_SPDCACHE #define M_IPSEC_SR _bsd_M_IPSEC_SR #define mi_startup _bsd_mi_startup #define mld_change_state _bsd_mld_change_state @@ -2832,6 +2855,8 @@ #define nd6_timer_ch _bsd_nd6_timer_ch #define nd_defrouter _bsd_nd_defrouter #define nd_prefix _bsd_nd_prefix +#define net_epoch _bsd_net_epoch +#define net_epoch_preempt _bsd_net_epoch_preempt #define netisr_clearqdrops _bsd_netisr_clearqdrops #define netisr_dispatch _bsd_netisr_dispatch #define netisr_dispatch_src _bsd_netisr_dispatch_src @@ -2872,8 +2897,10 @@ #define OF_finddevice _bsd_OF_finddevice #define OF_getencprop _bsd_OF_getencprop #define OF_getencprop_alloc _bsd_OF_getencprop_alloc +#define OF_getencprop_alloc_multi _bsd_OF_getencprop_alloc_multi #define OF_getprop _bsd_OF_getprop #define OF_getprop_alloc _bsd_OF_getprop_alloc +#define OF_getprop_alloc_multi _bsd_OF_getprop_alloc_multi #define OF_getproplen _bsd_OF_getproplen #define OF_hasprop _bsd_OF_hasprop #define OF_init _bsd_OF_init @@ -2896,6 +2923,7 @@ #define OF_seek _bsd_OF_seek #define OF_setprop _bsd_OF_setprop #define OF_test _bsd_OF_test +#define ofw_bus_assigned_addresses_to_rl _bsd_ofw_bus_assigned_addresses_to_rl #define ofwbus_driver _bsd_ofwbus_driver #define ofw_bus_find_child _bsd_ofw_bus_find_child #define ofw_bus_find_child_device_by_phandle _bsd_ofw_bus_find_child_device_by_phandle @@ -3189,6 +3217,7 @@ #define pf_init_ruleset _bsd_pf_init_ruleset #define pf_intr _bsd_pf_intr #define pf_ioctl_lock _bsd_pf_ioctl_lock +#define pf_ioctl_maxcount _bsd_pf_ioctl_maxcount #define pfi_set_flags _bsd_pfi_set_flags #define pfi_update_status _bsd_pfi_update_status #define pf_keyhash _bsd_pf_keyhash @@ -3270,6 +3299,7 @@ #define pfr_pool_get _bsd_pfr_pool_get #define pfr_set_addrs _bsd_pfr_set_addrs #define pfr_set_tflags _bsd_pfr_set_tflags +#define pfr_table_count _bsd_pfr_table_count #define pfr_tst_addrs _bsd_pfr_tst_addrs #define pf_rules_lock _bsd_pf_rules_lock #define pfr_update_stats _bsd_pfr_update_stats @@ -3376,6 +3406,8 @@ #define pru_sopoll_notsupp _bsd_pru_sopoll_notsupp #define pru_soreceive_notsupp _bsd_pru_soreceive_notsupp #define pru_sosend_notsupp _bsd_pru_sosend_notsupp +#define qgroup_config _bsd_qgroup_config +#define qgroup_softirq _bsd_qgroup_softirq #define r12a_beacon_init _bsd_r12a_beacon_init #define r12a_beacon_set_rate _bsd_r12a_beacon_set_rate #define r12a_c_cut_rf_read _bsd_r12a_c_cut_rf_read @@ -4666,6 +4698,14 @@ #define sysctl_wunlock _bsd_sysctl_wunlock #define sys_listen _bsd_sys_listen #define system_base_info _bsd_system_base_info +#define taskqgroup_adjust _bsd_taskqgroup_adjust +#define taskqgroup_attach _bsd_taskqgroup_attach +#define taskqgroup_attach_cpu _bsd_taskqgroup_attach_cpu +#define taskqgroup_config_gtask_deinit _bsd_taskqgroup_config_gtask_deinit +#define taskqgroup_config_gtask_init _bsd_taskqgroup_config_gtask_init +#define taskqgroup_create _bsd_taskqgroup_create +#define taskqgroup_destroy _bsd_taskqgroup_destroy +#define taskqgroup_detach _bsd_taskqgroup_detach #define TB_DRAIN_WAITER _bsd_TB_DRAIN_WAITER #define tbr_dequeue_ptr _bsd_tbr_dequeue_ptr #define tbr_get _bsd_tbr_get @@ -4767,6 +4807,7 @@ #define tcp_offload_input _bsd_tcp_offload_input #define tcp_offload_output _bsd_tcp_offload_output #define tcp_offload_rcvd _bsd_tcp_offload_rcvd +#define tcp_offload_tcp_info _bsd_tcp_offload_tcp_info #define tcp_output _bsd_tcp_output #define tcp_persmax _bsd_tcp_persmax #define tcp_persmin _bsd_tcp_persmin @@ -4798,6 +4839,7 @@ #define tcps_states _bsd_tcps_states #define tcpstat _bsd_tcpstat #define tcp_state_change _bsd_tcp_state_change +#define tcp_switch_back_to_default _bsd_tcp_switch_back_to_default #define tcp_syn_backoff _bsd_tcp_syn_backoff #define tcp_timer_2msl _bsd_tcp_timer_2msl #define tcp_timer_activate _bsd_tcp_timer_activate @@ -4924,6 +4966,7 @@ #define tvtohz _bsd_tvtohz #define ucom_attach _bsd_ucom_attach #define ucom_cfg_is_gone _bsd_ucom_cfg_is_gone +#define ucom_cnops _bsd_ucom_cnops #define ucom_detach _bsd_ucom_detach #define ucom_drain _bsd_ucom_drain #define ucom_drain_all _bsd_ucom_drain_all @@ -4931,6 +4974,7 @@ #define ucom_put_data _bsd_ucom_put_data #define ucom_ref _bsd_ucom_ref #define ucom_set_pnpinfo_usb _bsd_ucom_set_pnpinfo_usb +#define ucom_set_usb_mode _bsd_ucom_set_usb_mode #define ucom_status_change _bsd_ucom_status_change #define ucom_unref _bsd_ucom_unref #define udb _bsd_udb @@ -4965,6 +5009,7 @@ #define uether_getmii _bsd_uether_getmii #define uether_getsc _bsd_uether_getsc #define uether_ifattach _bsd_uether_ifattach +#define uether_ifattach_wait _bsd_uether_ifattach_wait #define uether_ifdetach _bsd_uether_ifdetach #define uether_ifmedia_upd _bsd_uether_ifmedia_upd #define uether_init _bsd_uether_init diff --git a/rtemsbsd/include/sys/disk_zone.h b/rtemsbsd/include/sys/disk_zone.h new file mode 100644 index 00000000..936ffd88 --- /dev/null +++ b/rtemsbsd/include/sys/disk_zone.h @@ -0,0 +1 @@ +/* EMPTY */ diff --git a/rtemsbsd/include/sys/epoch.h b/rtemsbsd/include/sys/epoch.h new file mode 100644 index 00000000..25000a6d --- /dev/null +++ b/rtemsbsd/include/sys/epoch.h @@ -0,0 +1,141 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2018, Matthew Macy + * Copyright (c) 2018, embedded brains GmbH + * + * 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 _SYS_EPOCH_H_ +#define _SYS_EPOCH_H_ + +#include +#ifdef _KERNEL +#include +#include +#include +#include +#endif +#include +#include + +struct epoch_record; + +struct epoch_tracker_mutex { + SLIST_ENTRY(epoch_tracker_mutex) etm_link; /* link to add to tracker */ + rtems_mutex etm_mtx; + struct epoch_record *etm_record; +}; + +typedef struct epoch_tracker { + ck_epoch_section_t et_section; + TAILQ_ENTRY(epoch_tracker) et_link; /* link to add to record */ + struct _Thread_Control *et_td; /* owner of this tracker */ + SLIST_HEAD(, epoch_tracker_mutex) et_mtx; +} *epoch_tracker_t; +TAILQ_HEAD(epoch_tdlist, epoch_tracker); + +typedef struct ck_epoch_entry *epoch_context_t; +#define epoch_context ck_epoch_entry + +#ifdef _KERNEL +#define EPOCH_ALIGN CPU_CACHE_LINE_BYTES + +struct epoch_record { + ck_epoch_record_t er_record; + struct epoch_tdlist er_tdlist; + uint32_t er_cpuid; +} __aligned(EPOCH_ALIGN); + +typedef struct epoch { + struct ck_epoch e_epoch __aligned(EPOCH_ALIGN); + uintptr_t e_pcpu_record_offset; + int e_flags; + SLIST_ENTRY(epoch) e_link; /* List of all epochs */ +} *epoch_t; + +extern struct epoch _bsd_global_epoch; +#define global_epoch &_bsd_global_epoch + +extern struct epoch _bsd_global_epoch_preempt; +#define global_epoch_preempt &_bsd_global_epoch_preempt + +#define EPOCH_PREEMPT 0x1 +#define EPOCH_LOCKED 0x2 + +#define EPOCH_DEFINE(name, flags) \ +struct epoch name; \ +static PER_CPU_DATA_ITEM(struct epoch_record, name); \ +static void \ +epoch_##name##_sysinit(void) \ +{ \ + \ + _bsd_epoch_init(&name, PER_CPU_DATA_OFFSET(name), flags); \ +} \ +SYSINIT(epoch_##name, SI_SUB_TUNABLES, SI_ORDER_THIRD, \ + epoch_##name##_sysinit, NULL) + +void _bsd_epoch_init(epoch_t epoch, uintptr_t pcpu_record_offset, + int flags); + +void epoch_enter_preempt(epoch_t epoch); +void epoch_exit_preempt(epoch_t epoch); + +void epoch_wait(epoch_t epoch); +void epoch_wait_preempt(epoch_t epoch); + +void epoch_call(epoch_t epoch, epoch_context_t ctx, + void (*callback) (epoch_context_t)); + +int in_epoch(epoch_t epoch); +int in_epoch_verbose(epoch_t epoch, int dump_onfail); + +#define EPOCH_GET_RECORD(cpu_self, epoch) PER_CPU_DATA_GET_BY_OFFSET( \ + cpu_self, struct epoch_record, epoch->e_pcpu_record_offset) + +static __inline void +epoch_enter(epoch_t epoch) +{ + Per_CPU_Control *cpu_self; + struct epoch_record *er; + + cpu_self = _Thread_Dispatch_disable(); + er = EPOCH_GET_RECORD(cpu_self, epoch); + ck_epoch_begin(&er->er_record, NULL); +} + +static __inline void +epoch_exit(epoch_t epoch) +{ + Per_CPU_Control *cpu_self; + struct epoch_record *er; + + cpu_self = _Per_CPU_Get(); + er = EPOCH_GET_RECORD(cpu_self, epoch); + ck_epoch_end(&er->er_record, NULL); + _Thread_Dispatch_enable(cpu_self); +} +#endif /* _KERNEL */ +#endif /* _SYS_EPOCH_H_ */ diff --git a/rtemsbsd/rtems/rtems-kernel-epoch.c b/rtemsbsd/rtems/rtems-kernel-epoch.c new file mode 100644 index 00000000..9eb8487c --- /dev/null +++ b/rtemsbsd/rtems/rtems-kernel-epoch.c @@ -0,0 +1,334 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2018, Matthew Macy + * Copyright (c) 2018, embedded brains GmbH + * + * 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$ + */ + +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +EPOCH_DEFINE(_bsd_global_epoch_preempt, EPOCH_PREEMPT); + +EPOCH_DEFINE(_bsd_global_epoch, 0); + +struct epoch_pcpu { + int cb_count; + Watchdog_Control wdg; + rtems_interrupt_server_request irq_srv_req; +}; + +static PER_CPU_DATA_ITEM(struct epoch_pcpu, epoch); + +static SLIST_HEAD(, epoch) epoch_list = SLIST_HEAD_INITIALIZER(epoch_list); + +CK_STACK_CONTAINER(struct ck_epoch_entry, stack_entry, + ck_epoch_entry_container) + +void +_bsd_epoch_init(epoch_t epoch, uintptr_t pcpu_record_offset, int flags) +{ + uint32_t cpu_count; + uint32_t cpu_index; + + ck_epoch_init(&epoch->e_epoch); + epoch->e_flags = flags; + epoch->e_pcpu_record_offset = pcpu_record_offset; + + cpu_count = rtems_get_processor_count(); + + for (cpu_index = 0; cpu_index < cpu_count; ++cpu_index) { + Per_CPU_Control *cpu; + struct epoch_record *er; + + cpu = _Per_CPU_Get_by_index(cpu_index); + er = EPOCH_GET_RECORD(cpu, epoch); + bzero(er, sizeof(*er)); + ck_epoch_register(&epoch->e_epoch, &er->er_record, NULL); + TAILQ_INIT(__DEVOLATILE(struct epoch_tdlist *, + &er->er_tdlist)); + er->er_cpuid = cpu_index; + } + + SLIST_INSERT_HEAD(&epoch_list, epoch, e_link); +} + +static void +epoch_watchdog(Watchdog_Control *wdg) +{ + struct epoch_pcpu *epcpu; + + epcpu = __containerof(wdg, struct epoch_pcpu, wdg); + _Watchdog_Per_CPU_insert_ticks(&epcpu->wdg, + _Watchdog_Get_CPU(&epcpu->wdg), 1); + + if (RTEMS_PREDICT_FALSE(epcpu->cb_count != 0)) { + rtems_interrupt_server_request_submit(&epcpu->irq_srv_req); + } +} + +static void +epoch_call_handler(void *arg) +{ + struct epoch_pcpu *epcpu; + struct epoch *epoch; + ck_stack_entry_t *cursor, *head, *next; + ck_stack_t cb_stack; + + epcpu = arg; + ck_stack_init(&cb_stack); + + SLIST_FOREACH(epoch, &epoch_list, e_link) { + Per_CPU_Control *cpu_self; + struct epoch_record *er; + int npending; + + cpu_self = _Thread_Dispatch_disable(); + er = EPOCH_GET_RECORD(cpu_self, epoch); + npending = er->er_record.n_pending; + + if (npending != 0) { + ck_epoch_poll_deferred(&er->er_record, &cb_stack); + epcpu->cb_count -= npending - er->er_record.n_pending; + } + + _Thread_Dispatch_enable(cpu_self); + } + + head = ck_stack_batch_pop_npsc(&cb_stack); + for (cursor = head; cursor != NULL; cursor = next) { + struct ck_epoch_entry *entry; + + entry = ck_epoch_entry_container(cursor); + + next = CK_STACK_NEXT(cursor); + (*entry->function)(entry); + } +} + +static void +epoch_sysinit(void) +{ + uint32_t cpu_count; + uint32_t cpu_index; + + cpu_count = rtems_get_processor_count(); + + for (cpu_index = 0; cpu_index < cpu_count; ++cpu_index) { + Per_CPU_Control *cpu; + struct epoch_pcpu *epcpu; + + cpu = _Per_CPU_Get_by_index(cpu_index); + epcpu = PER_CPU_DATA_GET(cpu, struct epoch_pcpu, epoch); + + _Watchdog_Preinitialize(&epcpu->wdg, cpu); + _Watchdog_Initialize(&epcpu->wdg, epoch_watchdog); + _Watchdog_Per_CPU_insert_ticks(&epcpu->wdg, cpu, 1); + + rtems_interrupt_server_request_initialize(cpu_index, + &epcpu->irq_srv_req, epoch_call_handler, epcpu); + } +} +SYSINIT(epoch, SI_SUB_TUNABLES, SI_ORDER_SECOND, epoch_sysinit, NULL); + +static void +epoch_enter_preempt_next(epoch_t epoch, epoch_tracker_t et) +{ + Per_CPU_Control *cpu_self; + ISR_lock_Context lock_context; + Thread_Control *executing; + struct epoch_record *er; + + SLIST_INIT(&et->et_mtx); + + _ISR_lock_ISR_disable(&lock_context); + cpu_self = _Thread_Dispatch_disable_critical(&lock_context); + executing = _Per_CPU_Get_executing(cpu_self); + er = EPOCH_GET_RECORD(cpu_self, epoch); + TAILQ_INSERT_TAIL(&er->er_tdlist, et, et_link); + et->et_td = executing; + _ISR_lock_ISR_enable(&lock_context); + + ck_epoch_begin(&er->er_record, &et->et_section); + + _Thread_Pin(executing); + _Thread_Dispatch_enable(cpu_self); +} + +static void +epoch_exit_preempt_next(epoch_t epoch, epoch_tracker_t et) +{ + Per_CPU_Control *cpu_self; + ISR_lock_Context lock_context; + Thread_Control *executing; + struct epoch_record *er; + struct epoch_tracker_mutex *etm; + + _ISR_lock_ISR_disable(&lock_context); + cpu_self = _Thread_Dispatch_disable_critical(&lock_context); + executing = _Per_CPU_Get_executing(cpu_self); + er = EPOCH_GET_RECORD(cpu_self, epoch); + TAILQ_REMOVE(&er->er_tdlist, et, et_link); + _ISR_lock_ISR_enable(&lock_context); + + ck_epoch_end(&er->er_record, &et->et_section); + + _Thread_Unpin(executing, cpu_self); + _Thread_Dispatch_enable(cpu_self); + + SLIST_FOREACH(etm, &et->et_mtx, etm_link) { + rtems_mutex_unlock(&etm->etm_mtx); + } +} + +/* FIXME: Must be removed in next FreeBSD baseline update step. */ +static __thread epoch_tracker_t et; + +void +epoch_enter_preempt(epoch_t epoch) +{ + + epoch_enter_preempt_next(epoch, &et); +} + +void +epoch_exit_preempt(epoch_t epoch) +{ + + epoch_exit_preempt_next(epoch, &et); +} + +static void +epoch_block_handler(struct ck_epoch *g __unused, ck_epoch_record_t *c __unused, + void *arg __unused) +{ + cpu_spinwait(); +} + +void +epoch_wait(epoch_t epoch) +{ + Per_CPU_Control *cpu_self; + + cpu_self = _Thread_Dispatch_disable(); + ck_epoch_synchronize_wait(&epoch->e_epoch, epoch_block_handler, NULL); + _Thread_Dispatch_enable(cpu_self); +} + +static void +epoch_register_mutex(void *arg) +{ + struct epoch_tracker_mutex *etm; + struct epoch_record *er; + struct epoch_tracker *et; + + etm = arg; + er = etm->etm_record; + et = TAILQ_FIRST(&er->er_tdlist); + + if (et != NULL) { + etm->etm_mtx._Queue._owner = et->et_td; + _Thread_Resource_count_increment( et->et_td ); + SLIST_INSERT_HEAD(&et->et_mtx, etm, etm_link); + } +} + +static void +epoch_block_handler_preempt(struct ck_epoch *g __unused, + ck_epoch_record_t *cr, void *arg __unused) +{ + struct epoch_record *er; + Per_CPU_Control *cpu_self; + uint32_t cpu_self_index; + struct epoch_tracker_mutex etm; + + er = __containerof(cr, struct epoch_record, er_record); + cpu_self = _Per_CPU_Get(); + cpu_self_index = _Per_CPU_Get_index(cpu_self); + + rtems_mutex_init(&etm.etm_mtx, "epoch"); + etm.etm_record = er; + +#ifdef RTEMS_SMP + if (cpu_self_index != er->er_cpuid) { + cpu_set_t set; + + CPU_ZERO(&set); + CPU_SET((int)er->er_cpuid, &set); + _SMP_Multicast_action(sizeof(set), &set, epoch_register_mutex, + &etm); + } else { + epoch_register_mutex(&etm); + } +#else + epoch_register_mutex(&etm); +#endif + + _Thread_Dispatch_enable(cpu_self); + + rtems_mutex_lock(&etm.etm_mtx); + rtems_mutex_unlock(&etm.etm_mtx); + rtems_mutex_destroy(&etm.etm_mtx); + + _Thread_Dispatch_disable(); +} + +void +epoch_wait_preempt(epoch_t epoch) +{ + + _Thread_Dispatch_disable(); + ck_epoch_synchronize_wait(&epoch->e_epoch, epoch_block_handler_preempt, + NULL); + _Thread_Dispatch_enable(_Per_CPU_Get()); +} + +void +epoch_call(epoch_t epoch, epoch_context_t ctx, + void (*callback) (epoch_context_t)) +{ + Per_CPU_Control *cpu_self; + struct epoch_record *er; + struct epoch_pcpu *epcpu; + + cpu_self = _Thread_Dispatch_disable(); + epcpu = PER_CPU_DATA_GET(cpu_self, struct epoch_pcpu, epoch); + epcpu->cb_count += 1; + er = EPOCH_GET_RECORD(cpu_self, epoch); + ck_epoch_call(&er->er_record, ctx, callback); + _Thread_Dispatch_enable(cpu_self); +} diff --git a/rtemsbsd/rtems/rtems-kernel-jail.c b/rtemsbsd/rtems/rtems-kernel-jail.c index d6ac6363..d6ce1dd0 100644 --- a/rtemsbsd/rtems/rtems-kernel-jail.c +++ b/rtemsbsd/rtems/rtems-kernel-jail.c @@ -103,7 +103,7 @@ struct prison prison0 = { #else .pr_flags = PR_HOST|_PR_IP_SADDRSEL, #endif - .pr_allow = PR_ALLOW_ALL, + .pr_allow = PR_ALLOW_ALL_STATIC }; MTX_SYSINIT(prison0, &prison0.pr_mtx, "jail mutex", MTX_DEF); diff --git a/rtemsbsd/sys/arm/lpc/if_lpe.c b/rtemsbsd/sys/arm/lpc/if_lpe.c index 99016be3..40ac162e 100755 --- a/rtemsbsd/sys/arm/lpc/if_lpe.c +++ b/rtemsbsd/sys/arm/lpc/if_lpe.c @@ -74,6 +74,7 @@ __FBSDID("$FreeBSD$"); #include #ifdef __rtems__ #include +#include #endif /* __rtems__ */ #ifdef DEBUG @@ -224,8 +225,12 @@ lpe_attach(device_t dev) { struct lpe_softc *sc = device_get_softc(dev); struct ifnet *ifp; +#ifndef __rtems__ int rid, i; uint32_t val; +#else /* __rtems__ */ + int rid; +#endif /* __rtems__ */ sc->lpe_dev = dev; #ifndef __rtems__ @@ -241,7 +246,7 @@ lpe_attach(device_t dev) sc->lpe_enaddr[5] = 0x55; } #else /* __rtems__ */ - rtems_bsd_get_mac_address(device_get_name(sc->lpe_dev), device_get_unit(sc->lpe_dev), &sc->lpe_enaddr); + rtems_bsd_get_mac_address(device_get_name(sc->lpe_dev), device_get_unit(sc->lpe_dev), sc->lpe_enaddr); #endif /* __rtems__ */ mtx_init(&sc->lpe_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, @@ -540,6 +545,9 @@ lpe_init_locked(struct lpe_softc *sc) /* Enable receive */ mac1 = lpe_read_4(sc, LPE_MAC1); +#ifdef __rtems__ + (void)mac1; +#endif /* __rtems__ */ lpe_write_4(sc, LPE_MAC1, /*mac1 |*/ LPE_MAC1_RXENABLE | LPE_MAC1_PASSALL); lpe_write_4(sc, LPE_MAC2, LPE_MAC2_CRCENABLE | LPE_MAC2_PADCRCENABLE | @@ -815,7 +823,7 @@ static void lpe_set_rxfilter(struct lpe_softc *sc) hashh = 0; if_maddr_rlock(ifp); - TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { + CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_LINK) continue; @@ -1279,14 +1287,20 @@ lpe_init_rxbuf(struct lpe_softc *sc, int n) { struct lpe_rxdesc *rxd; struct lpe_hwdesc *hwd; +#ifndef __rtems__ struct lpe_hwstatus *hws; +#endif /* __rtems__ */ struct mbuf *m; bus_dma_segment_t segs[1]; +#ifndef __rtems__ int nsegs; +#endif /* __rtems__ */ rxd = &sc->lpe_cdata.lpe_rx_desc[n]; hwd = &sc->lpe_rdata.lpe_rx_ring[n]; +#ifndef __rtems__ hws = &sc->lpe_rdata.lpe_rx_status[n]; +#endif /* __rtems__ */ m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); if (!m) { -- cgit v1.2.3