// Initialization function for Apple's Mobile File Integrity (AMFI) system
initializeAppleMobileFileIntegrity() {

    // Allocating and locking mutex for thread safety
    lock = IOLockAlloc();
    lck_mtx_lock(lock);

    // Checking if driver lock is not already set
    if (OSCompareAndSwapPtr(0, lock, &driverLock))
        // Initializing AMFI lock group
        AMFILockGroup = lck_grp_alloc_init("AMFI", 0);

        // Initializing library constraints
        initLibraryConstraints();

        // Registering system control variable
        sysctl_register_oid(&sysctl__hw_features_allows_security_research);

        // Selecting personalized chip(pointer to img4_chip_t)
        chip = img4_chip_select_personalized_ap();

        // Instantiating chip and checking for errors
        chip_error = img4_chip_instantiate(chip);
        if (chip_error)
            panic("AMFI: No chip from IMG4? errno" + chip_error);

        // Checking chip properties to enable security research (Apple Security Research Device Program - https://security.apple.com/research-device/?)
        if (allow_security_reserach(chip))
            allows_security_research = 1;

        // Checking for boot-arg, e.g.:
        // sudo nvram boot-args="amfi_get_out_of_my_way=1"
        if (PE_parse_boot_argn("amfi_allow_research"))
            IOLog("AMFI: Allowing research due to amfi_allow_research boot-arg");
            allows_security_research = 1;

        // Without this boor-arg, the entitlements get-task-allow and task_for_pid-allow are required to use task_for_pid if binary is signed
        if (PE_parse_boot_argn("amfi_unrestrict_task_for_pid"))
            IOLog("unrestricted task_for_pid enabled by boot-arg");
            unrestricted_debugging = 1;
            boot_device = 1;

        if (PE_parse_boot_argn("amfi_dev_mode_policy"))
            IOLog("developer mode internal policy disabled by boot-arg");
            dev_mode = 1

        if (PE_parse_boot_argn("amfi_allow_any_signature" | "amfi_get_out_of_my_way"))
            IOLog("signature enforcement disabled by boot-arg");
            IOLog("library validation will not mark external binaries as platform"); // NOT SURE

        if (PE_parse_boot_argn("amfi_unrestricted_local_signing"))
            IOLog("unrestricted AMFI local signing enabled by boot-arg");

        if (PE_parse_boot_argn("amfi_ready_to_roll"))
            IOLog("practice a key roll");
            readyToRoll = true;
        
        // Disabling code signing enforcement based on the boot-arg
        if (PE_parse_boot_argn("cs_enforcement_disable"))
            IOLog("cs_enforcement disabled by boot-arg")
        
        // Finalizing initialization
        InitializeDenylist();
        _initializeCoreEntitlementsSupport(1); // Initialize support for entitlements and AMFI trust cache interface
        // Initialize UDID enforcement the exemption profile (define components allowed to execute despite AMFI
        precookExemptionProfile(); 
        jitHashCacheLock = IOLockAlloc()
        dyldSimCacheLock = IOLockAlloc()
        supplementalSigningInit(); // Another lock

        // Access device tree to get model name
        model_name = IORegistryEntry::fromPath("/")
        model_name = OSMetaClassBase::safeMetaCast(OSData::gMetaClass)
        IOLog("AMFI: queried model name from device tree:" + model_name);

        // Check if the model is iPhone
        // If true disable Swift Playgrounds JIT services && some CS features
        if (model_name == 'iPhone')
            IOLog("AMFI: disabling Swift Playgrounds JIT services on iPhone devices");
            _swiftPlaygroundsJIT == 0
            disable_code_signing_feature(0x10000000);
            disable_code_signing_feature(0x20000000);

        // For not iPhones - initialize function pointers to AMFI handlers for various security checks
        if (_swiftPlaygroundsJIT)
            pointers_list = {
                _cred_check_label_update_execve
                _cred_label_associate
                _cred_label_destroy
                _cred_label_init
                _cred_label_update_execve
                _proc_check_inherit_ipc_ports
                _vnode_check_signature          // Code Signature validation handler
                _file_check_library_validation  // Library validation handler
                _policy_initbsd
                _policy_syscall                 // MAC policy-multiplexed system call (mpo_policy_syscall_t) handler 
                _task_id_token_get_task
                _cred_label_associate_kernel
                _proc_check_launch_constraints  // Check launch constraints for a process
                amfi_exc_action_check_exception_send
                amfi_exc_action_label_associate
                amfi_exc_action_label_populate
                amfi_exc_action_label_destroy
                amfi_exc_action_label_init
                amfi_exc_action_label_update
                macos_task_get_movable_control_port
                hsp_proc_check_map_anon
                macos_task_policy
                macos_task_control_policy
                macos_proc_check_run_cs_invalid
                hook_vnode_check_setextattr
                hook_vnode_check_getextattr
                _file_check_mmap
                _vnode_notify_open
                core_dump_policy
            }

            // Register MAC policy
            mac_policy_register("AMFI", amfiPolicyHandle, 0)

            // Set security policies and constraints for AMFI
            configurationSettingsInit(); 

            // Initialize a lock for exception list
            hardeningInit()

        // Unlocking driver lock
        lck_mtx_unlock(driverLock);

    // Unlocking mutex and freeing memory
    lck_mtx_unlock(lock);
    IOLockFree(lock);
    lck_mtx_lock(driverLock);
}
