kern_return_t pmem_iokit_enumerate_pci(pmem_pci_callback_t callback, void *ctx) { kern_return_t error = KERN_FAILURE; OSObject *obj = nullptr; OSDictionary *search = nullptr; OSIterator *iter = nullptr; IOPCIDevice *dev = nullptr; IODeviceMemory *mem = nullptr; IOItemCount mem_count = 0; int cmp; search = IOService::serviceMatching("IOPCIDevice"); iter = IOService::getMatchingServices(search); if (!iter) { pmem_error("Couldn't find any PCI devices."); goto bail; } while ((obj = iter->getNextObject())) { cmp = strncmp("IOPCIDevice", obj->getMetaClass()->getClassName(), strlen("IOPCIDevice")); if (cmp != 0) { // I haven't seen the above return anything other than // PCI devices, but Apple's documentation is sparse (which // is a nice word for what it is) and doesn't actually // say anything about what's guaranteed to be returned. // I'd just as well rather not chance it. pmem_warn("Expected IOPCIDevice but got %s - skipping.", obj->getMetaClass()->getClassName()); continue; } dev = (IOPCIDevice *)obj; mem_count = dev->getDeviceMemoryCount(); pmem_debug("Found PCI device %s", dev->getName()); for (unsigned idx = 0; idx < mem_count; ++idx) { pmem_debug("Memory segment %d found.", idx); mem = dev->getDeviceMemoryWithIndex(idx); pmem_signal_t signal = callback(dev, mem, idx, ctx); if (signal == pmem_Stop) { error = KERN_FAILURE; goto bail; } } } error = KERN_SUCCESS; bail: if (iter) { iter->release(); } if (search) { search->release(); } return error; }
OSArray * ACPIBacklightPanel::queryACPISupportedBrightnessLevels() { DbgLog("%s::%s()\n", this->getName(),__FUNCTION__); OSObject * ret; backLightDevice->evaluateObject("_BCL", &ret); OSArray * data = OSDynamicCast(OSArray, ret); if (data) { DbgLog("%s: %s _BCL %d\n", this->getName(), backLightDevice->getName(), data->getCount() ); return data; } else { DbgLog("%s: Cast Error _BCL is %s\n", this->getName(), ret ? ret->getMetaClass()->getClassName() : "ret=NULL"); } OSSafeRelease(ret); return NULL; }
OSReturn NoSleepExtension::readNVRAM(UInt8 *value) { #ifdef DEBUG IOLog("%s[%p]::%s(%p)\n", getName(), this, __FUNCTION__, value); #endif OSReturn ret = kOSReturnError; IORegistryEntry *entry = IORegistryEntry::fromPath( "/options", gIODTPlane ); if ( entry ) { OSObject *rawValue = entry->getProperty(IORegistrySleepSuppressionMode); if(rawValue != NULL) { #ifdef DEBUG IOLog("%s: rawValueClassName: %s\n", getName(), rawValue->getMetaClass()->getClassName()); #endif OSData *data = OSDynamicCast(OSData, rawValue); if(data->getLength() == 1) { *value = ((UInt8 *)data->getBytesNoCopy())[0]; ret = kOSReturnSuccess; #ifdef DEBUG IOLog("%s: reading nvram, value: 0x%02x\n", getName(), (*value)); #endif } #ifdef DEBUG else { IOLog("%s: read error: data->Len %s 1\n", getName(), (data->getLength() == 1)?"==":"!="); } #endif } entry->release(); } return ret; }
OSObject * OSUnserializeBinary(const char *buffer, size_t bufferSize, OSString **errorString) { OSObject ** objsArray; uint32_t objsCapacity; enum { objsCapacityMax = 16*1024*1024 }; uint32_t objsIdx; OSObject ** stackArray; uint32_t stackCapacity; enum { stackCapacityMax = 64 }; uint32_t stackIdx; OSObject * result; OSObject * parent; OSDictionary * dict; OSArray * array; OSSet * set; OSDictionary * newDict; OSArray * newArray; OSSet * newSet; OSObject * o; OSSymbol * sym; OSString * str; size_t bufferPos; const uint32_t * next; uint32_t key, len, wordLen; bool end, newCollect, isRef; unsigned long long value; bool ok; if (errorString) *errorString = 0; if (bufferSize < sizeof(kOSSerializeBinarySignature)) return (NULL); if (0 != strcmp(kOSSerializeBinarySignature, buffer)) return (NULL); if (3 & ((uintptr_t) buffer)) return (NULL); bufferPos = sizeof(kOSSerializeBinarySignature); next = (typeof(next)) (((uintptr_t) buffer) + bufferPos); DEBG("---------OSUnserializeBinary(%p)\n", buffer); objsArray = stackArray = NULL; objsIdx = objsCapacity = 0; stackIdx = stackCapacity = 0; result = 0; parent = 0; dict = 0; array = 0; set = 0; sym = 0; ok = true; while (ok) { bufferPos += sizeof(*next); if (!(ok = (bufferPos <= bufferSize))) break; key = *next++; len = (key & kOSSerializeDataMask); wordLen = (len + 3) >> 2; end = (0 != (kOSSerializeEndCollecton & key)); DEBG("key 0x%08x: 0x%04x, %d\n", key, len, end); newCollect = isRef = false; o = 0; newDict = 0; newArray = 0; newSet = 0; switch (kOSSerializeTypeMask & key) { case kOSSerializeDictionary: o = newDict = OSDictionary::withCapacity(len); newCollect = (len != 0); break; case kOSSerializeArray: o = newArray = OSArray::withCapacity(len); newCollect = (len != 0); break; case kOSSerializeSet: o = newSet = OSSet::withCapacity(len); newCollect = (len != 0); break; case kOSSerializeObject: if (len >= objsIdx) break; o = objsArray[len]; isRef = true; break; case kOSSerializeNumber: bufferPos += sizeof(long long); if (bufferPos > bufferSize) break; if ((len != 32) && (len != 64) && (len != 16) && (len != 8)) break; value = next[1]; value <<= 32; value |= next[0]; o = OSNumber::withNumber(value, len); next += 2; break; case kOSSerializeSymbol: bufferPos += (wordLen * sizeof(uint32_t)); if (bufferPos > bufferSize) break; if (len < 2) break; if (0 != ((const char *)next)[len-1]) break; o = (OSObject *) OSSymbol::withCString((const char *) next); next += wordLen; break; case kOSSerializeString: bufferPos += (wordLen * sizeof(uint32_t)); if (bufferPos > bufferSize) break; o = OSString::withStringOfLength((const char *) next, len); next += wordLen; break; case kOSSerializeData: bufferPos += (wordLen * sizeof(uint32_t)); if (bufferPos > bufferSize) break; o = OSData::withBytes(next, len); next += wordLen; break; case kOSSerializeBoolean: o = (len ? kOSBooleanTrue : kOSBooleanFalse); break; default: break; } if (!(ok = (o != 0))) break; if (!isRef) { setAtIndex(objs, objsIdx, o); if (!ok) { o->release(); break; } objsIdx++; } if (dict) { if (!sym) sym = (OSSymbol *) o; else { str = sym; sym = OSDynamicCast(OSSymbol, sym); if (!sym && (str = OSDynamicCast(OSString, str))) { sym = const_cast<OSSymbol *>(OSSymbol::withString(str)); ok = (sym != 0); if (!ok) break; } DEBG("%s = %s\n", sym->getCStringNoCopy(), o->getMetaClass()->getClassName()); if (o != dict) ok = dict->setObject(sym, o); if (sym && (sym != str)) sym->release(); sym = 0; } } else if (array) ok = array->setObject(o); else if (set) ok = set->setObject(o); else if (result) ok = false; else { assert(!parent); result = o; } if (!ok) break; if (end) parent = 0; if (newCollect) { stackIdx++; setAtIndex(stack, stackIdx, parent); if (!ok) break; DEBG("++stack[%d] %p\n", stackIdx, parent); parent = o; dict = newDict; array = newArray; set = newSet; end = false; } if (end) { while (stackIdx) { parent = stackArray[stackIdx]; DEBG("--stack[%d] %p\n", stackIdx, parent); stackIdx--; if (parent) break; } if (!parent) break; set = 0; dict = 0; array = 0; if (!(dict = OSDynamicCast(OSDictionary, parent))) { if (!(array = OSDynamicCast(OSArray, parent))) ok = (0 != (set = OSDynamicCast(OSSet, parent))); } } } DEBG("ret %p\n", result); if (!ok) result = 0; if (objsCapacity) { for (len = (result != 0); len < objsIdx; len++) objsArray[len]->release(); kfree(objsArray, objsCapacity * sizeof(*objsArray)); } if (stackCapacity) kfree(stackArray, stackCapacity * sizeof(*stackArray)); return (result); }