コード例 #1
0
ファイル: tnvmeHelpers.cpp プロジェクト: 10jul/tnvme
bool
CompareGolden(Golden &golden)
{
    string work;

    try {   // The objects to perform this work throw exceptions
        FileSystem::SetBaseDumpDir(false);   // Log into GrpPending
        if (gCtrlrConfig->SetState(ST_DISABLE_COMPLETELY) == false)
            throw FrmwkEx(HERE);

        LOG_NRM("Prepare the admin Q's to setup this request");
        SharedACQPtr acq = SharedACQPtr(new ACQ(gDutFd));
        acq->Init(2);
        SharedASQPtr asq = SharedASQPtr(new ASQ(gDutFd));
        asq->Init(2);
        gCtrlrConfig->SetCSS(CtrlrConfig::CSS_NVM_CMDSET);
        if (gCtrlrConfig->SetState(ST_ENABLE) == false)
            throw FrmwkEx(HERE);

        SharedIdentifyPtr idCmd = SharedIdentifyPtr(new Identify());
        SharedMemBufferPtr idMem = SharedMemBufferPtr(new MemBuffer());
        idMem->InitAlignment(Identify::IDEAL_DATA_SIZE, sizeof(uint64_t), true, 0);
        send_64b_bitmask prpReq =
            (send_64b_bitmask)(MASK_PRP1_PAGE | MASK_PRP2_PAGE);
        idCmd->SetPrpBuffer(prpReq, idMem);

        for (size_t i = 0; i < golden.cmds.size(); i++) {
            LOG_NRM("Identify cmd #%ld", i);
            LOG_NRM("  Identify:DW1.nsid = 0x%02x", golden.cmds[i].nsid);
            LOG_NRM("  Identify.DW10.cns = %c", golden.cmds[i].cns ? 'T' : 'F');
            LOG_NRM("  sizeof(Identify.raw) = %ld", golden.cmds[i].raw.size());
            LOG_NRM("  sizeof(Identify.mask) = %ld",
                golden.cmds[i].mask.size());

            LOG_NRM("Formulate an identical identify cmd to issue");
            idCmd->SetCNS(golden.cmds[i].cns);
            idCmd->SetNSID(golden.cmds[i].nsid);

            idMem->InitAlignment(Identify::IDEAL_DATA_SIZE, sizeof(uint64_t),
                true, 0);
            work = str(boost::format("IdCmd%d") % i);
            IO::SendAndReapCmd("tnvme", "golden", SYSTEMWIDE_CMD_WAIT_ms, asq,
                acq, idCmd, work, false);

            uint8_t goldenData;
            uint8_t dutData;
            for (size_t j = 0; j < golden.cmds[i].raw.size(); j++ ) {
                goldenData = (golden.cmds[i].raw[j] & golden.cmds[i].mask[j]);
                dutData = (idMem->GetAt(j) & golden.cmds[i].mask[j]);
                if (goldenData != dutData) {
                    idMem->Dump(FileSystem::PrepDumpFile("tnvme", "golden",
                        "identify", "dut.miscompare"), "DUT data miscompare");
                    SharedMemBufferPtr userMem = SharedMemBufferPtr(
                        new MemBuffer(golden.cmds[i].raw));
                    userMem->Dump(FileSystem::PrepDumpFile("tnvme", "golden",
                        "identify", "cmdline.miscompare"),
                        "Golden user data miscompare");
                    LOG_ERR("golden=0x%02X, mask=0x%02X, DUT=0x%02X",
                        golden.cmds[i].raw[j], golden.cmds[i].mask[j],
                        idMem->GetAt(j));
                    throw FrmwkEx(HERE,
                        "Golden ID data miscompare @ offset = %ld", j);
                }
            }
        }

        LOG_NRM("The operation succeeded to compare golden data");
    } catch (...) {
        LOG_ERR("Operation failed to compare golden data");
        gCtrlrConfig->SetState(ST_DISABLE_COMPLETELY);
        return false;
    }

    gCtrlrConfig->SetState(ST_DISABLE_COMPLETELY);
    return true;
}