diff --git a/QualcommWifi/Info.plist b/QualcommWifi/Info.plist
new file mode 100644
index 0000000..bceb61a
--- /dev/null
+++ b/QualcommWifi/Info.plist
@@ -0,0 +1,59 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ QualcommWifi
+ CFBundleIdentifier
+ com.nawrhehe.QualcommWifi
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ QualcommWifi
+ CFBundlePackageType
+ KEXT
+ CFBundleShortVersionString
+ 1.1.0
+ CFBundleVersion
+ 1.1.0
+ IOKitPersonalities
+
+ QualcommWifi_PCIe
+
+ CFBundleIdentifier
+ com.nawrhehe.QualcommWifi
+ IOClass
+ QualcommWifi
+ IOMatchCategory
+ IODefaultMatchCategory
+ IOPCIPrimaryMatch
+ 0x110717cb
+ IOProbeScore
+ 20000
+ IOProviderClass
+ IOPCIDevice
+
+
+ OSBundleLibraries
+
+ com.apple.iokit.IO80211Family
+ 1200.0
+ com.apple.iokit.IONetworkingFamily
+ 3.2
+ com.apple.iokit.IOPCIFamily
+ 2.9
+ com.apple.kpi.bsd
+ 15.0
+ com.apple.kpi.iokit
+ 15.0
+ com.apple.kpi.libkern
+ 15.0
+ com.apple.kpi.mach
+ 15.0
+
+ OSBundleRequired
+ Network-Root
+
+
diff --git a/QualcommWifi/QualcommWifi.cpp b/QualcommWifi/QualcommWifi.cpp
index 72a2bd3..260eead 100644
--- a/QualcommWifi/QualcommWifi.cpp
+++ b/QualcommWifi/QualcommWifi.cpp
@@ -5,6 +5,7 @@
#include
#define super IO80211Controller
+OSDefineMetaClassAndStructors(QualcommFaultReporter, OSObject)
OSDefineMetaClassAndStructors(QualcommWifi, IO80211Controller)
bool QualcommWifi::init(OSDictionary *dictionary) {
@@ -29,10 +30,14 @@ bool QualcommWifi::init(OSDictionary *dictionary) {
fDmaPhysAddr = 0;
fDmaVirtAddr = nullptr;
fDmaPrepared = false;
+ fWorkQueue = nullptr;
+ fFaultReporter = nullptr;
return true;
}
void QualcommWifi::free(void) {
+ OSSafeReleaseNULL(fFaultReporter);
+ OSSafeReleaseNULL(fWorkQueue);
super::free();
}
@@ -532,7 +537,20 @@ bool QualcommWifi::loadBhiFirmware(void) {
}
bool QualcommWifi::start(IOService *provider) {
+#if __IO80211_TARGET >= 260000
+ // Pré-allocation de l'infrastructure macOS Tahoe requise par IO80211Controller::start
+ if (!createWorkQueue()) {
+ IOLog("QualcommWifi: Erreur critique - Impossible d'allouer IO80211WorkQueue !\n");
+ return false;
+ }
+ if (!getFaultReporterFromDriver()) {
+ IOLog("QualcommWifi: Erreur critique - Impossible d'allouer le FaultReporter !\n");
+ return false;
+ }
+#endif
+
if (!super::start(provider)) {
+ IOLog("QualcommWifi: Erreur - Echec de IO80211Controller::start(provider) !\n");
return false;
}
@@ -1035,12 +1053,37 @@ IOReturn QualcommWifi::setGET_DEBUG_INFO(IO80211SkywalkInterface *iface, apple80
return kIOReturnSuccess;
}
+bool QualcommWifi::createWorkQueue(void) {
+ if (!fWorkQueue) {
+ fWorkQueue = IO80211WorkQueue::workQueue();
+ if (fWorkQueue) {
+ IOLog("QualcommWifi: IO80211WorkQueue creee avec succes (%p).\n", fWorkQueue);
+ } else {
+ IOLog("QualcommWifi: Echec de creation de IO80211WorkQueue !\n");
+ }
+ }
+ return (fWorkQueue != nullptr);
+}
+
+IO80211WorkQueue* QualcommWifi::getWorkQueue(void) const {
+ return fWorkQueue;
+}
+
void* QualcommWifi::getLogger(void) const {
return nullptr;
}
void* QualcommWifi::getFaultReporterFromDriver(void) {
- return nullptr;
+ if (!fFaultReporter) {
+ fFaultReporter = new QualcommFaultReporter;
+ if (fFaultReporter) {
+ fFaultReporter->init();
+ IOLog("QualcommWifi: FaultReporter (QualcommFaultReporter) cree avec succes (%p).\n", fFaultReporter);
+ } else {
+ IOLog("QualcommWifi: Echec de creation du QualcommFaultReporter !\n");
+ }
+ }
+ return fFaultReporter;
}
#else
SInt32 QualcommWifi::apple80211Request(unsigned int req_type, int req_val, IO80211Interface* iface, void* req_data) {
diff --git a/QualcommWifi/QualcommWifi.hpp b/QualcommWifi/QualcommWifi.hpp
index 0c0cb21..3b00b5d 100644
--- a/QualcommWifi/QualcommWifi.hpp
+++ b/QualcommWifi/QualcommWifi.hpp
@@ -174,8 +174,18 @@ struct mhi_ring_element {
#include
#include
#include
+#include
#include "Firmware_WCN7850_Wifi.h"
+// Classe FaultReporter pour satisfaire findAndAttachToFaultReporter sous macOS Tahoe
+class QualcommFaultReporter : public OSObject {
+ OSDeclareDefaultStructors(QualcommFaultReporter)
+public:
+ virtual bool init() override {
+ return OSObject::init();
+ }
+};
+
class QualcommWifi : public IO80211Controller {
OSDeclareDefaultStructors(QualcommWifi)
@@ -204,6 +214,10 @@ private:
void *fDmaVirtAddr;
bool fDmaPrepared;
+ // Infrastructure macOS Tahoe IO80211Family
+ IO80211WorkQueue *fWorkQueue;
+ QualcommFaultReporter *fFaultReporter;
+
UInt32 read32(UInt32 offset);
void write32(UInt32 offset, UInt32 value);
@@ -237,6 +251,8 @@ public:
#if __IO80211_TARGET >= 260000
// macOS Tahoe 26.x (Darwin 25) Skywalk IO80211Controller overrides
virtual bool isCommandProhibited(int command) override;
+ virtual bool createWorkQueue(void) override;
+ virtual IO80211WorkQueue* getWorkQueue(void) const override;
virtual IOReturn handleCardSpecific(IO80211SkywalkInterface *iface, unsigned long req_type, void *req_data, bool isSet) override;
virtual UInt32 hardwareOutputQueueDepth(void) override;
virtual SInt32 performCountryCodeOperation(IO80211CountryCodeOp op) override;
diff --git a/QualcommWireless/include/IOKit/80211/IO80211Controller.h b/QualcommWireless/include/IOKit/80211/IO80211Controller.h
index d5870d7..b118743 100644
--- a/QualcommWireless/include/IOKit/80211/IO80211Controller.h
+++ b/QualcommWireless/include/IOKit/80211/IO80211Controller.h
@@ -30,6 +30,7 @@
#include "apple80211_ioctl.h"
#include "IO80211SkywalkInterface.h"
#include "IO80211WorkLoop.h"
+#include "IO80211WorkQueue.h"
#define AUTH_TIMEOUT 15 // seconds
diff --git a/QualcommWireless/include/IOKit/80211/IO80211WorkQueue.h b/QualcommWireless/include/IOKit/80211/IO80211WorkQueue.h
new file mode 100644
index 0000000..2c9f2df
--- /dev/null
+++ b/QualcommWireless/include/IOKit/80211/IO80211WorkQueue.h
@@ -0,0 +1,13 @@
+#ifndef _IO80211WORKQUEUE_H
+#define _IO80211WORKQUEUE_H
+
+#include
+
+class IO80211WorkQueue : public IOWorkLoop {
+ OSDeclareDefaultStructors(IO80211WorkQueue)
+
+public:
+ static IO80211WorkQueue* workQueue();
+};
+
+#endif /* _IO80211WORKQUEUE_H */
diff --git a/build_wifi.sh b/build_wifi.sh
new file mode 100755
index 0000000..565e93d
--- /dev/null
+++ b/build_wifi.sh
@@ -0,0 +1,46 @@
+#!/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"
+
+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/4] Assemblage du firmware radio WCN7850..."
+clang -target x86_64-apple-macos15.0 \
+ -c "${SCRIPT_DIR}/QualcommWifi/Firmware_WCN7850_Wifi.s" \
+ -o "${BUILD_DIR}/Firmware_WCN7850_Wifi.o"
+
+# 2. Compilation C++ du pilote QualcommWifi
+echo "[2/4] Compilation C++ de QualcommWifi.cpp..."
+clang++ -target x86_64-apple-macos15.0 \
+ -nostdinc -isystem /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/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 -D__IO80211_TARGET=260000 -DAPPLE_KEXT_OVERRIDE=override \
+ -c "${SCRIPT_DIR}/QualcommWifi/QualcommWifi.cpp" \
+ -o "${BUILD_DIR}/QualcommWifi.o"
+
+# 3. Édition de liens (Mach-O Kext)
+echo "[3/4] Édition de liens du binaire Kext..."
+clang++ -target x86_64-apple-macos15.0 \
+ -nostdlib -mkernel -Xlinker -kext \
+ -Xlinker -dead_strip \
+ "${BUILD_DIR}/QualcommWifi.o" "${BUILD_DIR}/Firmware_WCN7850_Wifi.o" \
+ -o "${KEXT_MACOS}/QualcommWifi"
+
+# 4. Copie de Info.plist
+echo "[4/4] Copie de Info.plist..."
+cp "${SCRIPT_DIR}/QualcommWifi/Info.plist" "${KEXT_BUNDLE}/Contents/Info.plist"
+
+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}"