void IllegalCreateQs_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Test CreateResources_r10b has run prior. * \endverbatim */ // Lookup objs which were created in a prior test within group SharedACQPtr acq = CAST_TO_ACQ(gRsrcMngr->GetObj(ACQ_GROUP_ID)) SharedASQPtr asq = CAST_TO_ASQ(gRsrcMngr->GetObj(ASQ_GROUP_ID)) uint32_t numEntries = 2; uint8_t dword; uint32_t mask; uint32_t value; { LOG_NRM("Create IOCQ ID #%d but toxify its QID to 0", IOQ_ID); SharedIOCQPtr iocq = SharedIOCQPtr(new IOCQ(mFd)); iocq->Init(IOQ_ID, numEntries, true, 0); LOG_NRM("Form a Create IOCQ cmd"); SharedCreateIOCQPtr iocqCmd = SharedCreateIOCQPtr(new CreateIOCQ()); iocqCmd->Init(iocq); dword = 10; mask = 0xFFFF; value = 0; SendToxicCmd(asq, acq, iocqCmd, dword, mask, value, CESTAT_INVALID_QID); } { LOG_NRM("Create IOSQ ID #%d but toxify its QID to 0", IOQ_ID); SharedIOSQPtr iosq = SharedIOSQPtr(new IOSQ(mFd)); iosq->Init(IOQ_ID, numEntries, IOQ_ID, 0); LOG_NRM("Form a Create IOSQ cmd"); SharedCreateIOSQPtr iosqCmd = SharedCreateIOSQPtr(new CreateIOSQ()); iosqCmd->Init(iosq); dword = 10; mask = 0xFFFF; value = 0; SendToxicCmd(asq, acq, iosqCmd, dword, mask, value, CESTAT_INVALID_QID); } { LOG_NRM("Create IOSQ ID #%d but wrongly associate to ACQ", IOQ_ID); SharedIOSQPtr iosq = SharedIOSQPtr(new IOSQ(mFd)); iosq->Init(IOQ_ID, numEntries, IOQ_ID, 0); LOG_NRM("Form a Create IOSQ cmd"); SharedCreateIOSQPtr iosqCmd = SharedCreateIOSQPtr(new CreateIOSQ()); iosqCmd->Init(iosq); dword = 11; mask = 0xFFFF0000; value = 0; SendToxicCmd(asq, acq, iosqCmd, dword, mask, value, CESTAT_CQ_INVALID); } }
void InvalidMSIXIRQ_r10b::RunCoreTest() { /** \verbatim * Assumptions: * 1) Requires test createResources_r10b to execute 1st * \endverbatim */ bool capable; uint16_t numIrqSupport; // Only allowed to execute if DUT supports MSI-X IRQ's if (gCtrlrConfig->IsMSIXCapable(capable, numIrqSupport) == false) throw FrmwkEx(HERE); else if (capable == false) { LOG_NRM("DUT does not support MSI-X IRQ's; unable to execute test"); return; } if (gCtrlrConfig->SetState(ST_DISABLE) == false) throw FrmwkEx(HERE); LOG_NRM("Notify DUT we plan on using all IRQ's that it supports"); if (gCtrlrConfig->SetIrqScheme(INT_MSIX, numIrqSupport) == false) { throw FrmwkEx(HERE, "Unable to use %d IRQ's, but DUT reports it supports", numIrqSupport); } gCtrlrConfig->SetCSS(CtrlrConfig::CSS_NVM_CMDSET); if (gCtrlrConfig->SetState(ST_ENABLE) == false) throw FrmwkEx(HERE); // Lookup objs which were created in a prior test within group SharedASQPtr asq = CAST_TO_ASQ(gRsrcMngr->GetObj(ASQ_GROUP_ID)) SharedACQPtr acq = CAST_TO_ACQ(gRsrcMngr->GetObj(ACQ_GROUP_ID)) LOG_NRM("Set legal IOCQ element size"); gCtrlrConfig->SetIOCQES(gInformative->GetIdentifyCmdCtrlr()-> GetValue(IDCTRLRCAP_CQES) & 0xf); // This test expects the DUT to reject the usage of illegal/unsupported // MSIX IRQ vectors, thus they should never be used. In order to safely fool // dnvme's safeguards, thus preventing a kernel crash, we need to issue a // legal cmd and allow dnvme to do it job. Then just before ringing the // doorbell inject a toxic illegal MSIX IRQ vector, the guts of this test. // So lets prepare that "legal" cmd here and then corrupt/toxify it later. LOG_NRM("Last supported MSIX IRQ vec = %d", (numIrqSupport - 1)); for (uint32_t i = numIrqSupport; i <= CtrlrConfig::MAX_MSIX_IRQ_VEC; i++) { // We must re-init the objects because a failed attempt at creating an // IOCQ forces dnvme to deconstruct the entire thing when it is reaped. LOG_NRM("Create the IOCQ and the cmd to issue to the DUT"); SharedIOCQPtr iocq = SharedIOCQPtr(new IOCQ(gDutFd)); LOG_NRM("Allocate contiguous memory; IOCQ has ID=%d", IOQ_ID); iocq->Init(IOQ_ID, NUM_IOQ_ENTRY, true, (numIrqSupport - 1)); SharedCreateIOCQPtr createIOCQCmd = SharedCreateIOCQPtr(new CreateIOCQ()); createIOCQCmd->Init(iocq); SendToxicCmd(asq, acq, createIOCQCmd, i); } }