feat(tahoe): port QualcommWireless & QualcommWifi to macOS Tahoe 26.x (Darwin 25)
Breakthroughs & Reverse Engineering (macOS Tahoe 26.7.1 / Darwin 25.6.0): - Reconstructed the complete 463-slot Skywalk vtable and class layout (0x128 / 296 bytes) of IO80211Controller (__ZTV17IO80211Controller at 0xffffff8002461148) and AppleBCMWLANCore from BootKernelExtensions.kc (IO80211Family 1200.13.1, source 1566.5). - Verified IOUSBHostDevice::deviceRequest vtable slot in Tahoe's BootKernelExtensions.kc (__ZTV15IOUSBHostDevice at 0xffffff8002e72720): confirmed exact match at slot 374 (0x176, byte offset 0xbb0). - Disassembled Tahoe's /usr/sbin/bluetoothd (FindTransportType at 0x10014c700, Found_USB_Dongle at 0x1000e9559, GetProductAndVendorID at 0x1000edf2a) confirming USB transport matching on 'Bluetooth USB Host Controller' and CSR 0x0a12 descriptor spoofing. Code & Build Modifications (v1.1.0): - IO80211Controller.h: Add full 463-slot Tahoe Skywalk vtable declaration (slots 394..462, offsets 0xc50..0xe70) and exact 0x80 filler size when __IO80211_TARGET >= 260000 while preserving legacy compatibility. - QualcommWifi.hpp/.cpp: Implement Tahoe IO80211Controller pure virtual methods (isCommandProhibited, handleCardSpecific, getDRIVER_VERSION, getHARDWARE_VERSION, getCARD_CAPABILITIES, getPOWER, setPOWER, getCOUNTRY_CODE, setCOUNTRY_CODE, setGET_DEBUG_INFO, getLogger, getFaultReporterFromDriver) and guard un-reserved IONetworkController slots 6..7 on SDK 26.5. - QualcommWireless.cpp: Add non-null vtable slot sanity check prior to installing the shadow vtable hook on IOUSBHostDevice::deviceRequest. - project.pbxproj & Info.plist: Upgrade to Xcode 26.6 (MacOSX26.5.sdk), MACOSX_DEPLOYMENT_TARGET = 26.0, __IO80211_TARGET = 260000, and bump version to 1.1.0. - docs & README: Document macOS Tahoe (Darwin 25) architecture, bluetoothd offsets, and Skywalk IO80211Controller ABI.
This commit is contained in:
1 parent
820154e54b
commit
a10e097a7e
11 files changed
+262
-135
No files matched your search
@@ -1,6 +1,6 @@
|
||||
# Architecture de QualcommWireless
|
||||
|
||||
Ce document détaille l'architecture logicielle et matérielle du pilote unifié **QualcommWireless** pour les puces combinées **Qualcomm FastConnect 7800** (SoC WCN7850) sous macOS Sequoia (15.x) et versions ultérieures.
|
||||
Ce document détaille l'architecture logicielle et matérielle du pilote unifié **QualcommWireless** pour les puces combinées **Qualcomm FastConnect 7800** (SoC WCN7850) sous **macOS Tahoe (26.x / Darwin 25)** et **macOS Sequoia (15.x / Darwin 24)**.
|
||||
|
||||
---
|
||||
|
||||
@@ -10,7 +10,7 @@ Le module sans fil Qualcomm FastConnect 7800 (WCN7850) utilise une architecture
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph Host["Système Hôte (macOS Sequoia - Darwin 24)"]
|
||||
subgraph Host["Système Hôte (macOS Tahoe - Darwin 25 / Sequoia - Darwin 24)"]
|
||||
subgraph Kernel["Kernel Space (XNU / IOKit)"]
|
||||
IO80211["com.apple.iokit.IO80211Family\n(IO80211Controller)"]
|
||||
IOUSB["com.apple.iokit.IOUSBHostFamily\n(IOUSBHostDevice / Interface)"]
|
||||
|
||||
+10
-6
@@ -103,38 +103,42 @@ sequenceDiagram
|
||||
D->>USB: Connexion Magic Mouse 2 / Clavier (L2CAP)
|
||||
```
|
||||
|
||||
Grâce à cette séquence, le contrôleur Bluetooth WCN7850 opère de manière parfaitement stable sous macOS Sequoia sans aucun crash au démarrage de session.
|
||||
Grâce à cette séquence, le contrôleur Bluetooth WCN7850 opère de manière parfaitement stable sous macOS Sequoia (Darwin 24) et macOS Tahoe (Darwin 25) sans aucun crash au démarrage de session.
|
||||
|
||||
---
|
||||
|
||||
## 5. Rétro-ingénierie de `bluetoothd` (macOS 15 Sequoia) & Détection du Transport
|
||||
## 5. Rétro-ingénierie de `bluetoothd` (macOS Sequoia & macOS Tahoe) & Détection du Transport
|
||||
|
||||
### 5.1. Algorithme de sélection du transport dans `FindTransportType`
|
||||
Le désassemblage complet du binaire `/usr/sbin/bluetoothd` (fonctions à `0x100121555` et `0x1001216c6`) a révélé l'algorithme exact de détection du bus HCI :
|
||||
Le désassemblage complet du binaire `/usr/sbin/bluetoothd` sous macOS Sequoia (`0x100121555`) et sous macOS Tahoe 26.7.1 (`0x10014c700`, `Found_USB_Dongle` à `0x1000e9559`, `GetProductAndVendorID` à `0x1000edf2a`) a révélé l'algorithme exact de détection du bus HCI :
|
||||
|
||||
1. **Test 1 : `transport-encoding` dans l'arbre matériel (`IODeviceTree`)**
|
||||
- `bluetoothd` interroge la propriété `transport-encoding` sous `IODeviceTree:/chosen` ou les nœuds bluetooth.
|
||||
- S'il trouve `0x00000000`, il force immédiatement le transport USB (`"DeviceTree transport = 0x00000000"`).
|
||||
|
||||
2. **Test 2 : Matching IORegistry du service hôte USB (`0x100121620`)**
|
||||
2. **Test 2 : Matching IORegistry du service hôte USB (`0x100121620` / `0x10014c7ca`)**
|
||||
- `bluetoothd` appelle :
|
||||
```c
|
||||
IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceNameMatching("Bluetooth USB Host Controller"));
|
||||
```
|
||||
- **Découverte majeure** : Si **un service quelconque** dans l'IORegistry porte le nom `"Bluetooth USB Host Controller"`, `bluetoothd` assigne **immédiatement `Transport = 0 (USB)`** et retourne sans jamais évaluer le `board-id` de la machine !
|
||||
|
||||
3. **Test 3 : Fallback par table statique des `board-id` (`0x1001216c6`)**
|
||||
3. **Test 3 : Fallback par table statique des `board-id` (`0x1001216c6` / `0x10014c86f`)**
|
||||
- Si aucun service `"Bluetooth USB Host Controller"` n'a été trouvé, `bluetoothd` lit le `board-id` dans l'arbre IODeviceTree (`"sysBoardID %s"`).
|
||||
- Il compare l'ID à deux tables internes :
|
||||
- Table 1 : Modèles avec Bluetooth USB natif (iMac, Mac mini, MacBook Pro pré-T2).
|
||||
- Table 2 : Modèles avec Bluetooth UART natif (`MacPro7,1` / `Mac-27AD2F918AE68F61`).
|
||||
- Sur SMBIOS `MacPro7,1`, le démon sélectionne par défaut le transport UART (H4BC) et ignore complètement tout périphérique USB, affichant `Chipset: BCM_4350C2, Transport: UART, State: Off`.
|
||||
|
||||
### 5.2. Résolution native dans `QualcommWireless`
|
||||
### 5.2. Résolution native et Hook Shadow VTable dans `QualcommWireless`
|
||||
En appliquant les enseignements de la rétro-ingénierie :
|
||||
- `QualcommWireless` s'enregistre explicitement sous le nom `"Bluetooth USB Host Controller"`.
|
||||
- `fDevice->setName("Bluetooth USB Host Controller")`.
|
||||
- Injection de `transport-encoding = <00 00 00 00>` sur le périphérique et sur `IODeviceTree:/chosen`.
|
||||
- Spoofing de `idVendor = 0x0a12` (CSR) validé nativement par `Found_USB_Dongle`.
|
||||
- **Shadow VTable (`IOUSBHostDevice::deviceRequest`)** :
|
||||
- L'index vtable de `IOUSBHostDevice::deviceRequest(IOService*, StandardUSB::DeviceRequest&, void*, IOMemoryDescriptor*, uint32_t&, IOUSBHostCompletion*, uint32_t)` est résolu dynamiquement à la compilation via `DeviceRequestAccessor::getVtableIndex()` : **slot `374` (`0x176`, offset `0xbb0`)**, identique sous macOS Sequoia (`Darwin 24`) et macOS Tahoe (`Darwin 25.6.0`, `__ZTV15IOUSBHostDevice` à `0xffffff8002e72720`).
|
||||
- L'interception du descripteur de périphérique USB (`GET_DESCRIPTOR DEVICE`, 18 octets) remplace à la volée le Vendor ID `0x0489` par `0x0a12` (CSR) lors de la lecture directe par `bluetoothd` (`GetProductAndVendorID`).
|
||||
- Résultat : `bluetoothd` configure le contrôleur en USB de manière native et immédiate.
|
||||
|
||||
|
||||
+9
-8
@@ -6,9 +6,9 @@ Ce guide détaille les étapes pour compiler le kext **QualcommWireless** à par
|
||||
|
||||
## 1. Prérequis Système
|
||||
|
||||
- **Système d'exploitation hôte** : macOS Sonoma (14.x) ou macOS Sequoia (15.x).
|
||||
- **Environnement de développement** : Xcode 15+ ou 16+ avec les outils en ligne de commande (`xcode-select --install`).
|
||||
- **SDK macOS** : macOS 15.x SDK (inclus dans Xcode).
|
||||
- **Système d'exploitation hôte** : macOS Tahoe (26.x / Darwin 25), macOS Sequoia (15.x / Darwin 24) ou macOS Sonoma (14.x).
|
||||
- **Environnement de développement** : Xcode 26+ (ex. Xcode 26.6) ou Xcode 16+ avec les outils en ligne de commande (`xcode-select --install`).
|
||||
- **SDK macOS** : macOS 26.x SDK (ex. `MacOSX26.5.sdk`, inclus dans Xcode 26.6).
|
||||
- **Architectures cibles** : Binaire universel `x86_64` (Hackintosh Intel/AMD) et `arm64e` (Apple Silicon).
|
||||
|
||||
---
|
||||
@@ -27,12 +27,13 @@ QualcommWireless/
|
||||
│ ├── amss.bin # Microprogramme principal Wi-Fi
|
||||
│ ├── board-2.bin # Données de calibration radio RF
|
||||
│ └── m3.bin # Microprogramme d'économie d'énergie M3
|
||||
├── QualcommWireless/ # Code source du pilote C++ / IOKit
|
||||
│ ├── Info.plist # Descripteur et personnalités IOKit
|
||||
├── QualcommWifi/ # Code source du pilote Wi-Fi 7 natif (IO80211Controller)
|
||||
│ ├── Firmware_WCN7850_Wifi.h/.cpp# Microprogrammes Wi-Fi intégrés
|
||||
│ └── QualcommWifi.hpp/.cpp # Implémentation IO80211Controller (Tahoe Skywalk & Legacy)
|
||||
├── QualcommWireless/ # Code source du pilote Bluetooth USB (IOService)
|
||||
│ ├── Info.plist # Descripteur et personnalités IOKit (v1.1.0)
|
||||
│ ├── Firmware_WCN7850.h # Header des microprogrammes BT intégrés
|
||||
│ ├── Firmware_WCN7850_Wifi.h # Déclarations des microprogrammes Wi-Fi
|
||||
│ ├── QualcommWifi.hpp/.cpp # Implémentation du pilote Wi-Fi natif
|
||||
│ ├── QualcommWireless.hpp/.cpp # Implémentation de la partie Bluetooth USB
|
||||
│ ├── QualcommWireless.hpp/.cpp # Implémentation DFU Bluetooth & Shadow VTable
|
||||
│ └── include/ # Headers internes IOKit & 802.11
|
||||
└── QualcommWireless.xcodeproj # Projet Xcode configuré pour build KEXT
|
||||
```
|
||||
|
||||
+16
-6
@@ -1,6 +1,6 @@
|
||||
# Pile Wi-Fi Native macOS pour Qualcomm WCN7850
|
||||
|
||||
Ce document détaille l'implémentation de la pile Wi-Fi **native** (`IO80211Controller`) pour le chipset **Qualcomm FastConnect 7800 (WCN7850)** sous macOS Sequoia (Darwin 24).
|
||||
Ce document détaille l'implémentation de la pile Wi-Fi **native** (`IO80211Controller`) pour le chipset **Qualcomm FastConnect 7800 (WCN7850)** sous **macOS Tahoe (26.x / Darwin 25)** et **macOS Sequoia (15.x / Darwin 24)**.
|
||||
|
||||
---
|
||||
|
||||
@@ -27,11 +27,11 @@ graph TD
|
||||
CoreWLAN["CoreWLAN.framework"]
|
||||
AirportD["airportd (Daemon Système)"]
|
||||
Skywalk["Skywalk Family (Packet Pipeline)"]
|
||||
IO80211["IO80211Family (IO80211Controller / IO80211Interface)"]
|
||||
IO80211["IO80211Family (IO80211Controller / IO80211SkywalkInterface)"]
|
||||
end
|
||||
|
||||
subgraph Driver["QualcommWifi (Driver Kernel)"]
|
||||
IoctlHandler["Gestionnaire IOCTL Apple80211 (apple80211_ioctl)"]
|
||||
IoctlHandler["Gestionnaire IOCTL Apple80211 (handleCardSpecific / apple80211Request)"]
|
||||
ScanEngine["Moteur de Scan (Passif / Actif / Multicanal)"]
|
||||
RingDMA["Gestionnaire DMA & Anneaux MHI (CR / ER / TR)"]
|
||||
FirmwarePipeline["Pipeline de Démarrage BHI / AMSS"]
|
||||
@@ -47,7 +47,7 @@ graph TD
|
||||
|
||||
CC --> AirportD
|
||||
CoreWLAN --> AirportD
|
||||
AirportD -->|apple80211_ioctl| IO80211
|
||||
AirportD -->|Skywalk / IO80211| IO80211
|
||||
Skywalk --> IO80211
|
||||
IO80211 --> IoctlHandler
|
||||
IoctlHandler --> ScanEngine
|
||||
@@ -87,9 +87,18 @@ Le bus PCIe expose un espace MMIO BAR0 de 512 Ko. Or, les composants internes du
|
||||
|
||||
---
|
||||
|
||||
## 4. Implémentation des IOCTLs Apple80211
|
||||
## 4. ABI `IO80211Controller` sous macOS Tahoe (Darwin 25) et IOCTLs Apple80211
|
||||
|
||||
Pour qu'un pilote soit reconnu par le sous-système Wi-Fi de macOS, il doit répondre aux requêtes de configuration `apple80211_ioctl` émises par `airportd` :
|
||||
### 4.1. VTable Skywalk unifiée de `IO80211Controller` sous macOS Tahoe (`__IO80211_TARGET=260000`)
|
||||
Sous macOS Tahoe (`IO80211Family` v1200.13.1, source `1566.5`), `IO80211Controller` (taille d'instance `0x128` = 296 octets) a achevé sa transition vers `IO80211SkywalkInterface` avec une vtable de **463 entrées** (slots `394` à `462` après `IOEthernetController`) :
|
||||
- `slot 394 (0xc50)` : `isCommandProhibited(int)`
|
||||
- `slot 403 (0xc98)` : `handleCardSpecific(IO80211SkywalkInterface*, unsigned long, void*, bool)` (remplace `apple80211Request` / `apple80211SkywalkRequest`)
|
||||
- `slots 404..406 (0xca0..0xcb0)` : `hardwareOutputQueueDepth(void)`, `performCountryCodeOperation(IO80211CountryCodeOp)`, `dataLinkLayerAttachComplete(void)` (sans paramètre `IO80211Interface*`)
|
||||
- `slots 408..415 (0xcc0..0xcf8)` : accesseurs typés purs virtuels (`getDRIVER_VERSION`, `getHARDWARE_VERSION`, `getCARD_CAPABILITIES`, `getPOWER`, `setPOWER`, `getCOUNTRY_CODE`, `setCOUNTRY_CODE`, `setGET_DEBUG_INFO`)
|
||||
- `slots 424 & 432` : `getLogger(void) const` et `getFaultReporterFromDriver(void)`
|
||||
|
||||
### 4.2. Table des requêtes Apple80211 prises en charge
|
||||
Pour qu'un pilote soit reconnu par le sous-système Wi-Fi de macOS, il répond aux requêtes `APPLE80211_IOC_*` :
|
||||
|
||||
| Opération IOCTL | Rôle dans le système macOS |
|
||||
| :--- | :--- |
|
||||
@@ -114,3 +123,4 @@ La puce WCN7850 introduit les caractéristiques Wi-Fi 7 suivantes, intégrées d
|
||||
- **Modulation 4096-QAM (4K-QAM)** augmentant la densité de données de 20% par rapport au 1024-QAM du Wi-Fi 6.
|
||||
- **Multi-Link Operation (MLO)** : Capacité matérielle d'agréger ou de basculer dynamiquement entre plusieurs bandes (ex. 5 GHz + 6 GHz) pour une latence ultra-faible.
|
||||
- **Preamble Puncturing** : Évitement automatique des sous-canaux brouillés pour maximiser la bande passante utilisable.
|
||||
|
||||
Reference in new issue
Block a user