Skip to content

Commit be7efe1

Browse files
authored
Merge pull request #8 from cdf/detection-fix
Detection fix
2 parents 0ccd95e + 326f97c commit be7efe1

File tree

4 files changed

+65
-54
lines changed

4 files changed

+65
-54
lines changed

Changelog.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
Innie Changelog
22
===============
3-
#### v1.2.1
4-
- Initial release
3+
#### v1.3.1
4+
- Improve handling of multiple pci roots
5+
- Fix detection bug
56

67
#### v1.3.0
78
- Improve detection logic
89
- Rewrite to use I/O Kit startup
10+
11+
#### v1.2.1
12+
- Initial release

Innie.xcodeproj/project.pbxproj

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 50;
6+
objectVersion = 54;
77
objects = {
88

99
/* Begin PBXBuildFile section */
@@ -111,7 +111,7 @@
111111
6F8EC8ED1E2EBE80005DA7AE /* Project object */ = {
112112
isa = PBXProject;
113113
attributes = {
114-
LastUpgradeCheck = 1020;
114+
LastUpgradeCheck = 1400;
115115
ORGANIZATIONNAME = "";
116116
TargetAttributes = {
117117
6F8EC8F51E2EBE80005DA7AE = {
@@ -153,6 +153,7 @@
153153
/* Begin PBXShellScriptBuildPhase section */
154154
0F53D5E824D828CC00EF1BA1 /* Archive */ = {
155155
isa = PBXShellScriptBuildPhase;
156+
alwaysOutOfDate = 1;
156157
buildActionMask = 2147483647;
157158
files = (
158159
);
@@ -163,7 +164,7 @@
163164
);
164165
runOnlyForDeploymentPostprocessing = 0;
165166
shellPath = /bin/bash;
166-
shellScript = "cd \"${TARGET_BUILD_DIR}\"\n\ndist=(\"$FULL_PRODUCT_NAME\")\nif [ -d \"$DWARF_DSYM_FILE_NAME\" ]; then dist+=(\"$DWARF_DSYM_FILE_NAME\"); fi\n\narchive=\"${PRODUCT_NAME}-${MODULE_VERSION}-$(echo $CONFIGURATION | tr /a-z/ /A-Z/).zip\"\nrm -rf *.zip\nif [ \"$CONFIGURATION\" == \"Release\" ]; then\n strip -x -T \"${EXECUTABLE_PATH}\" &>/dev/null || strip -x \"${EXECUTABLE_PATH}\"\nfi\nzip -qry \"${archive}\" \"${dist[@]}\"\n";
167+
shellScript = "cd \"${TARGET_BUILD_DIR}\"\ndist=(\"$FULL_PRODUCT_NAME\")\narchive=\"${PRODUCT_NAME}-${MODULE_VERSION}-$(echo $CONFIGURATION | tr /a-z/ /A-Z/).zip\"\nrm -rf *.zip\nzip -qry \"${archive}\" \"${dist[@]}\"\n";
167168
};
168169
/* End PBXShellScriptBuildPhase section */
169170

@@ -201,11 +202,13 @@
201202
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
202203
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
203204
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
205+
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
204206
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
205207
CLANG_WARN_STRICT_PROTOTYPES = YES;
206208
CLANG_WARN_SUSPICIOUS_MOVE = YES;
207209
CLANG_WARN_UNREACHABLE_CODE = YES;
208210
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
211+
DEAD_CODE_STRIPPING = YES;
209212
DEBUG_INFORMATION_FORMAT = dwarf;
210213
ENABLE_STRICT_OBJC_MSGSEND = YES;
211214
ENABLE_TESTABILITY = YES;
@@ -252,11 +255,13 @@
252255
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
253256
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
254257
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
258+
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
255259
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
256260
CLANG_WARN_STRICT_PROTOTYPES = YES;
257261
CLANG_WARN_SUSPICIOUS_MOVE = YES;
258262
CLANG_WARN_UNREACHABLE_CODE = YES;
259263
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
264+
DEAD_CODE_STRIPPING = YES;
260265
DEBUG_INFORMATION_FORMAT = dwarf;
261266
ENABLE_STRICT_OBJC_MSGSEND = YES;
262267
GCC_C_LANGUAGE_STANDARD = c11;
@@ -279,13 +284,14 @@
279284
6F8EC9011E2EBE80005DA7AE /* Debug */ = {
280285
isa = XCBuildConfiguration;
281286
buildSettings = {
287+
CLANG_ANALYZER_DEADCODE_DEADSTORES = NO;
288+
CLANG_ANALYZER_DIVIDE_BY_ZERO = NO;
289+
CLANG_ANALYZER_NULL_DEREFERENCE = NO;
282290
CLANG_ENABLE_OBJC_WEAK = YES;
283291
CODE_SIGN_IDENTITY = "";
284-
CODE_SIGN_STYLE = Manual;
285-
COPY_PHASE_STRIP = NO;
286-
CURRENT_PROJECT_VERSION = 1.3.0;
292+
CURRENT_PROJECT_VERSION = 1.3.1;
293+
DEAD_CODE_STRIPPING = YES;
287294
DEPLOYMENT_POSTPROCESSING = YES;
288-
DEVELOPMENT_TEAM = "";
289295
GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS = NO;
290296
GCC_ENABLE_KERNEL_DEVELOPMENT = NO;
291297
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
@@ -295,14 +301,15 @@
295301
"$(inherited)",
296302
);
297303
INFOPLIST_FILE = "$(SRCROOT)/Innie/Info.plist";
304+
INSTALL_PATH = "$(DEFAULT_KEXT_INSTALL_PATH)";
298305
LIBRARY_SEARCH_PATHS = (
299306
"$(PROJECT_DIR)/MacKernelSDK/Library/x86_64",
300307
"$(inherited)",
301308
);
302-
MACOSX_DEPLOYMENT_TARGET = 10.9;
303-
MARKETING_VERSION = 1.3.0;
309+
MACOSX_DEPLOYMENT_TARGET = 10.13;
310+
MARKETING_VERSION = 1.3.1;
304311
MODULE_NAME = com.cdf.Innie;
305-
MODULE_VERSION = 1.3.0;
312+
MODULE_VERSION = 1.3.1;
306313
OTHER_CFLAGS = (
307314
"-mmmx",
308315
"-msse",
@@ -319,8 +326,9 @@
319326
"-Wno-vla",
320327
);
321328
OTHER_LDFLAGS = "-static";
322-
PRODUCT_BUNDLE_IDENTIFIER = "$(MODULE_NAME)";
329+
PRODUCT_BUNDLE_IDENTIFIER = com.cdf.Innie;
323330
PRODUCT_NAME = "$(TARGET_NAME)";
331+
RUN_CLANG_STATIC_ANALYZER = YES;
324332
WRAPPER_EXTENSION = kext;
325333
};
326334
name = Debug;
@@ -330,28 +338,26 @@
330338
buildSettings = {
331339
CLANG_ENABLE_OBJC_WEAK = YES;
332340
CODE_SIGN_IDENTITY = "";
333-
CODE_SIGN_STYLE = Manual;
334-
CURRENT_PROJECT_VERSION = 1.3.0;
341+
CURRENT_PROJECT_VERSION = 1.3.1;
335342
DEAD_CODE_STRIPPING = YES;
336343
DEPLOYMENT_POSTPROCESSING = YES;
337-
DEVELOPMENT_TEAM = "";
338344
GCC_ENABLE_FLOATING_POINT_LIBRARY_CALLS = NO;
339345
GCC_ENABLE_KERNEL_DEVELOPMENT = NO;
340-
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
346+
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
341347
GCC_PREPROCESSOR_DEFINITIONS = (
342348
"MODULE_VERSION=$(MODULE_VERSION)",
343349
"PRODUCT_NAME=$(PRODUCT_NAME)",
344350
);
345351
INFOPLIST_FILE = "$(SRCROOT)/Innie/Info.plist";
352+
INSTALL_PATH = "$(DEFAULT_KEXT_INSTALL_PATH)";
346353
LIBRARY_SEARCH_PATHS = (
347354
"$(PROJECT_DIR)/MacKernelSDK/Library/x86_64",
348355
"$(inherited)",
349356
);
350-
LLVM_LTO = YES;
351-
MACOSX_DEPLOYMENT_TARGET = 10.9;
352-
MARKETING_VERSION = 1.3.0;
357+
MACOSX_DEPLOYMENT_TARGET = 10.13;
358+
MARKETING_VERSION = 1.3.1;
353359
MODULE_NAME = com.cdf.Innie;
354-
MODULE_VERSION = 1.3.0;
360+
MODULE_VERSION = 1.3.1;
355361
OTHER_CFLAGS = (
356362
"-mmmx",
357363
"-msse",
@@ -370,7 +376,6 @@
370376
OTHER_LDFLAGS = "-static";
371377
PRODUCT_BUNDLE_IDENTIFIER = "$(MODULE_NAME)";
372378
PRODUCT_NAME = "$(TARGET_NAME)";
373-
STRIP_STYLE = "non-global";
374379
WRAPPER_EXTENSION = kext;
375380
};
376381
name = Release;

Innie/Info.plist

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<plist version="1.0">
44
<dict>
55
<key>CFBundleDevelopmentRegion</key>
6-
<string>en</string>
6+
<string>$(DEVELOPMENT_LANGUAGE)</string>
77
<key>CFBundleExecutable</key>
88
<string>$(EXECUTABLE_NAME)</string>
99
<key>CFBundleIdentifier</key>
@@ -13,7 +13,7 @@
1313
<key>CFBundleName</key>
1414
<string>$(PRODUCT_NAME)</string>
1515
<key>CFBundlePackageType</key>
16-
<string>KEXT</string>
16+
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
1717
<key>CFBundleShortVersionString</key>
1818
<string>$(MARKETING_VERSION)</string>
1919
<key>CFBundleVersion</key>
@@ -35,7 +35,7 @@
3535
</dict>
3636
</dict>
3737
<key>NSHumanReadableCopyright</key>
38-
<string>Copyright © 2020 cdf. All rights reserved.</string>
38+
<string>Copyright © 2020-2022 cdf. All rights reserved.</string>
3939
<key>OSBundleLibraries</key>
4040
<dict>
4141
<key>com.apple.kpi.iokit</key>

Innie/Innie.cpp

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,21 @@
1111

1212
#include "Innie.hpp"
1313

14-
#define super IOService
15-
1614
OSDefineMetaClassAndStructors(Innie, IOService)
1715

1816
bool Innie::init(OSDictionary *dict) {
19-
if (!super::init())
17+
if (!IOService::init())
2018
return false;
2119

2220
return true;
2321
}
2422

2523
void Innie::free(void) {
26-
super::free();
24+
IOService::free();
2725
}
2826

2927
IOService *Innie::probe(IOService *provider, SInt32 *score) {
30-
if (super::probe(provider, score)==0)
28+
if (IOService::probe(provider, score)==0)
3129
return 0;
3230

3331
return this;
@@ -36,43 +34,47 @@ IOService *Innie::probe(IOService *provider, SInt32 *score) {
3634
bool Innie::start(IOService *provider) {
3735
DBGLOG("starting\n");
3836

39-
if (!super::start(provider))
37+
if (!IOService::start(provider))
4038
return false;
4139

4240
processRoot();
43-
super::registerService();
41+
IOService::registerService();
4442
return true;
4543
}
4644

4745
void Innie::stop(IOService *provider) {
48-
super::stop(provider);
46+
IOService::stop(provider);
4947
}
5048

49+
5150
void Innie::processRoot() {
52-
if (auto entry = IORegistryEntry::fromPath("/AppleACPIPlatformExpert", gIOServicePlane)) {
51+
if (auto entry = IORegistryEntry::fromPath("/", gIODTPlane)) {
5352
IORegistryEntry *pciRoot = nullptr;
53+
bool ready = false, found = false;
5454
size_t repeat = 0;
55-
bool found = false;
56-
5755
do {
58-
if (auto iterator = entry->getChildIterator(gIOServicePlane)) {
56+
if (auto iterator = entry->getChildIterator(gIODTPlane)) {
5957
while ((pciRoot = OSDynamicCast(IORegistryEntry, iterator->getNextObject())) != nullptr) {
6058
const char *name = pciRoot->getName();
6159
if (name && !strncmp("PC", name, 2)) {
62-
found = true;
63-
DBGLOG("found PCI root %s", pciRoot->getName());
64-
while (OSDynamicCast(OSBoolean, pciRoot->getProperty("IOPCIConfigured")) != kOSBooleanTrue) {
65-
DBGLOG("waiting for PCI root to be configured");
66-
IOSleep(1);
60+
if (ready) {
61+
DBGLOG("found PCI root %s", pciRoot->getName());
62+
found = true;
63+
while (OSDynamicCast(OSBoolean, pciRoot->getProperty("IOPCIConfigured")) != kOSBooleanTrue) {
64+
DBGLOG("waiting for PCI root to be configured");
65+
IOSleep(10);
66+
}
67+
recurseBridge(pciRoot);
68+
} else {
69+
IOSleep(1000); // Wait for other roots
70+
ready = true;
71+
break;
6772
}
68-
recurseBridge(pciRoot);
6973
}
7074
}
7175
iterator->release();
7276
}
7377
} while (repeat++ < 0x10000000 && !found);
74-
75-
DBGLOG("found PCI root in %lu attempts", repeat);
7678
entry->release();
7779
}
7880
}
@@ -98,9 +100,9 @@ void Innie::recurseBridge(IORegistryEntry *entry) {
98100
}
99101
if (code == classCode::PCIBridge) {
100102
DBGLOG("found bridge %s", childEntry->getName());
101-
while (OSDynamicCast(OSBoolean, childEntry->getProperty("IOPCIResourced")) != kOSBooleanTrue) {
102-
DBGLOG("waiting for bridge to be resourced");
103-
IOSleep(1);
103+
while (OSDynamicCast(OSBoolean, childEntry->getProperty("IOPCIConfigured")) != kOSBooleanTrue) {
104+
DBGLOG("waiting for PCI bridge to be configured");
105+
IOSleep(10);
104106
}
105107
recurseBridge(childEntry);
106108
}
@@ -110,17 +112,17 @@ void Innie::recurseBridge(IORegistryEntry *entry) {
110112
iterator->release();
111113
}
112114
}
113-
115+
114116
void Innie::internalizeDevice(IORegistryEntry *entry) {
115117
DBGLOG("adding built-in property");
116-
117118
setBuiltIn(entry);
118119

119-
// Stop if entry is not yet resourced
120-
if (OSDynamicCast(OSBoolean, entry->getProperty("IOPCIResourced")) != kOSBooleanTrue)
121-
return;
120+
while (OSDynamicCast(OSBoolean, entry->getProperty("IOPCIResourced")) != kOSBooleanTrue) {
121+
DBGLOG("waiting for device to be resourced");
122+
IOSleep(10);
123+
}
122124

123-
// Otherwise update existing properties
125+
// Proceed to update other properties
124126
if (auto driverIterator = IORegistryIterator::iterateOver(entry, gIOServicePlane, kIORegistryIterateRecursively)) {
125127
IORegistryEntry *driverEntry = nullptr;
126128
while ((driverEntry = OSDynamicCast(IORegistryEntry, driverIterator->getNextObject())) != nullptr) {

0 commit comments

Comments
 (0)