В качестве исследования безопасности я пишу собственный драйвер IOKit. Драйвер регистрируется через уровень питания для драйверов, от которых он зависит. (услуги USB). Функция setPowerState
вызывается, и драйвер корректно завершает работу.
Проблема в том, что случайным образом это вызывает проблемы со сном и пробуждением, и машина перезагружается. На самом деле сброс происходит во время пробуждения машины после того, как она вошла в спящий режим (видимо, пытается перейти в спящий режим)
Вопрос в том, как я могу отладить или решить эту проблему? Я использую отладку ядра FireWire, чтобы посмотреть, что происходит, но отладчик и точки останова вызывают задержки в механизме синхронизации сна, и все в беспорядке.
Данные в Интернете довольно слабые по этой проблеме, но полны жалоб на машины OSX, вызывающие сбои пробуждения во сне на чистых машинах.
Я тестирую его на разных машинах и версиях ядра, и он сохраняется.
Любая подсказка поможет.
РЕДАКТИРОВАТЬ: Дополнительный код
enum
{
kOffPowerState, kStandbyPowerState, kIdlePowertState, kOnPowerState, kNumPowerStates
};
static IOPMPowerState gPowerStates[kNumPowerStates] =
{
//kOffPowerState
{kIOPMPowerStateVersion1, 0,0,0,0,0,0,0,0,0,0,0},
//kStandbyPowerState
{kIOPMPowerStateVersion1, kIOPMPowerOn, kIOPMPowerOn, kIOPMPowerOn, 0,0,0,0,0,0,0,0},
//kIdlePowerState
{kIOPMPowerStateVersion1, kIOPMPowerOn, kIOPMPowerOn, kIOPMPowerOn, 0,0,0,0,0,0,0,0},
//kOnPowerState
{kIOPMPowerStateVersion1, kIOPMPowerOn | kIOPMDeviceUsable, kIOPMPowerOn, kIOPMPowerOn, 0,0,0,0,0,0,0,0}
};
bool driver::start(IOService* provider)
{
IOLog("driver::start\n");
if (IOService::start(provider) == false)
return false;
PMinit();
provider->joinPMtree(this);
makeUsable();
changePowerStateTo(0);
registerPowerDriver(this, gPowerStates, kNumPowerStates);
registerService();
return true;
}
IOReturn driver::setPowerState (unsigned long whichState, IOService * whatDevice)
{
IOLog("driver::setPowerState (%lu)\n", whichState);
if (whichState == 0)
IOLog("driver: shutdown (%lu)\n", whichState);
return kIOPMAckImplied;
}