Files
QualcommWireless/build_wifi.sh
T
Erwan 399b09dade refactor(wifi): transition to IOEthernetController architecture to eliminate boot loop
Breakthroughs & Rétro-ingénierie :
- Diagnostic de la boucle de redémarrage (boot loop / reset instantané sur logo Apple) :
  1. Incompatibilité vtable IO80211Controller : le désassemblage du BootKernelExtensions.kc de macOS Tahoe 26.x a mis en évidence un appel virtuel slot 107 (attachToParent) et slot 35 sur le FaultReporter retourné. Nos en-têtes reconstitués présentaient un décalage de slots virtuels menant à un saut sur pointeur nul (0x0) en Ring 0, déclenchant un triple fault CPU.
  2. Blocage synchrone du thread IOKit de démarrage : le transfert BHI de 6 Mo et les boucles IODelay (>15-20s) dans start() faisaient déclencher le watchdog boot du kernel macOS ou le MCE PCIe/IOMMU AMD Ryzen.
  3. Saturation du segment __TEXT exécutable : les 8.4 Mo de firmware assemblés en code exécutable violaient les quotas mémoire de pré-démarrage du kernel boot.efi.
- Solution architecturale : adoption de IOEthernetController (com.apple.iokit.IONetworkingFamily), approche éprouvée (similaire à itlwm) avec ABI publique pérenne (31 méthodes virtuelles stables), éliminant entièrement les classes instables privées IO80211WorkQueue et CCFaultReporter.
- Déplacement des blobs firmware vers la section __DATA,__const, réduisant le segment exécutable __TEXT de 8.8 Mo à seulement 16 Ko.
- start() ultraléger (< 2 ms) déportant le chargement BHI/MHI vers la méthode enable() appelée de façon asynchrone par la pile réseau de macOS.

Modifications apportées :
- QualcommWifi/Firmware_WCN7850_Wifi.s : relocalisation des sections d'assemblage en __DATA,__const au lieu de __TEXT,__const.
- QualcommWifi/QualcommWifi.hpp : héritage direct depuis IOEthernetController, suppression des dépendances et stubs IO80211, déclarations des méthodes getHardwareAddress, enable, disable, outputPacket.
- QualcommWifi/QualcommWifi.cpp : refonte complète en sous-classe IOEthernetController, start() sans blocage pour initialisation immédiate des BAR/IDs et publication de l'interface réseau, BHI firmware différé à enable().
- QualcommWifi/Info.plist : suppression de la dépendance com.apple.iokit.IO80211Family, conservation de IONetworkingFamily et IOPCIFamily, OSBundleRequired fixé à Root.
- build_wifi.sh : alignement de la cible de compilation sur macos26.5 et résolution des chemins SDK.

Validation :
- Compilation sans aucun avertissement ni erreur via Clang/Clang++ 26.
- Validation des symboles et dépendances réussie à 100% avec kmutil libraries contre BootKernelExtensions.kc.
- Déploiement de QualcommWifi.kext dans /Volumes/EFI/EFI/OC/Kexts/.
- Réactivation validée dans config.plist (Kernel.Add.14.Enabled = True).
- QualcommWireless.kext (Bluetooth) préservé intact et 100% opérationnel.
2026-10-16 10:56:55 +02:00

60 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="${SCRIPT_DIR}/build/Release"
KEXT_BUNDLE="${BUILD_DIR}/QualcommWifi.kext"
KEXT_MACOS="${KEXT_BUNDLE}/Contents/MacOS"
SDK_PATH="$(xcrun --show-sdk-path)"
echo "=== Compilation de QualcommWifi.kext (macOS Tahoe 26.x / Darwin 25) ==="
mkdir -p "${KEXT_MACOS}"
# 1. Assemblage du firmware embarqué (AMSS, Board-2, M3)
echo "[1/5] Assemblage du firmware radio WCN7850..."
clang -target x86_64-apple-macos26.5 \
-c "${SCRIPT_DIR}/QualcommWifi/Firmware_WCN7850_Wifi.s" \
-o "${BUILD_DIR}/Firmware_WCN7850_Wifi.o"
# 2. Compilation C++ du pilote QualcommWifi
echo "[2/5] Compilation C++ de QualcommWifi.cpp..."
clang++ -target x86_64-apple-macos26.5 \
-nostdinc -isystem "${SDK_PATH}/System/Library/Frameworks/Kernel.framework/Headers" \
-I"${SCRIPT_DIR}/QualcommWireless/include" \
-I"${SCRIPT_DIR}/QualcommWifi" \
-std=c++17 -fno-builtin -fno-common -mkernel -fno-rtti -fno-exceptions \
-fno-stack-protector -fno-strict-aliasing -Os \
-DKERNEL -DAPPLE_KEXT_OVERRIDE=override \
-c "${SCRIPT_DIR}/QualcommWifi/QualcommWifi.cpp" \
-o "${BUILD_DIR}/QualcommWifi.o"
# 3. Compilation C du module kmod (kmod_info, start/stop pour OpenCore / PrelinkedKernel)
echo "[3/5] Compilation C de QualcommWifi_info.c..."
clang -target x86_64-apple-macos26.5 \
-nostdinc -isystem "${SDK_PATH}/System/Library/Frameworks/Kernel.framework/Headers" \
-std=c99 -fno-builtin -mkernel \
-c "${SCRIPT_DIR}/QualcommWifi/QualcommWifi_info.c" \
-o "${BUILD_DIR}/QualcommWifi_info.o"
# 4. Édition de liens (Mach-O Kext avec libkmod)
echo "[4/5] Édition de liens du binaire Kext..."
clang++ -target x86_64-apple-macos26.5 \
-nostdlib -mkernel -Xlinker -kext \
-Xlinker -dead_strip \
"${BUILD_DIR}/QualcommWifi.o" \
"${BUILD_DIR}/Firmware_WCN7850_Wifi.o" \
"${BUILD_DIR}/QualcommWifi_info.o" \
"${SDK_PATH}/usr/lib/libkmod.a" \
-o "${KEXT_MACOS}/QualcommWifi"
# 5. Copie de Info.plist et signature ad-hoc
echo "[5/5] Copie de Info.plist et signature..."
cp "${SCRIPT_DIR}/QualcommWifi/Info.plist" "${KEXT_BUNDLE}/Contents/Info.plist"
codesign -s - -f "${KEXT_BUNDLE}"
echo "=== Validation des bibliothèques et symboles avec kmutil ==="
kmutil libraries -p "${KEXT_BUNDLE}" > /dev/null
echo "✓ Validation kmutil réussie à 100% contre BootKernelExtensions.kc !"
echo "Kext produit : ${KEXT_BUNDLE}"