def test_create_sq_with_invalid_prp_offset(nvme0): prp = PRP(4096) cq = IOCQ(nvme0, 1, 10, prp) #Spec NVM-Express-1_4-2019.06.10-Ratified #Figure 153: In both cases, the PRP Entry shall have an offset of 0h. prp.offset = 0 IOSQ(nvme0, 1, 10, prp, cqid=1).delete() prp.offset = 2048 with pytest.warns(UserWarning, match="ERROR status: 00/13"): IOSQ(nvme0, 1, 10, prp, cqid=1).delete() prp.offset = 2050 with pytest.warns(UserWarning, match="ERROR status: 00/13"): IOSQ(nvme0, 1, 10, prp, cqid=1).delete() prp.offset = 4095 with pytest.warns(UserWarning, match="ERROR status: 00/13"): IOSQ(nvme0, 2, 10, prp, cqid=1).delete() prp.offset = 255 with pytest.warns(UserWarning, match="ERROR status: 00/13"): IOSQ(nvme0, 2, 10, prp, cqid=1).delete() cq.delete()
def test_read_invalid_prp_address_offset(nvme0, cq, sq): # first cmd, invalid prp offset buf = PRP(4096, ptype=0xbeef, pvalue=100) first_byte = buf[0] logging.info(buf.dump(16)) cmd = SQE(1, 1) buf.offset = 1 cmd.prp1 = buf cmd[10] = 1 cmd[11] = 0 cmd[12] = 1 sq[0] = cmd sq.tail = 1 time.sleep(0.1) status = (cq[0][3] >> 17) & 0x7ff if status == 0: # write success, check data cmd = SQE(2, 1) buf = PRP(4096) cmd.prp1 = buf cmd[10] = 1 cmd[11] = 0 cmd[12] = 1 sq[1] = cmd sq.tail = 2 time.sleep(0.1) status = (cq[1][3] >> 17) & 0x7ff assert status == 0 logging.info(buf.dump(16)) assert first_byte == buf[0] else: assert status == 0x0013 # invalid namespace or format
def test_create_sq_invalid_queue_address_offset(nvme0): cq = IOCQ(nvme0, 3, 10, PRP(4096)) queue = PRP(4096) queue.offset = 1 with pytest.warns(UserWarning, match="ERROR status: 00/13"): IOSQ(nvme0, 1, 10, queue, cqid=3) cq.delete()
def test_invalid_offset_prp_in_list(nvme0): cq = IOCQ(nvme0, 1, 10, PRP()) sq = IOSQ(nvme0, 1, 10, PRP(), cqid=1) buf = PRP(ptype=32, pvalue=0xffffffff) buf.offset = 0x10 prp_list = PRPList() prp_list.offset = 0x20 for i in range(8): tmp = PRP(ptype=32, pvalue=0xffffffff) tmp.offset = 0x10 prp_list[i] = tmp logging.info(prp_list.dump(64)) print(buf.dump(32)) for i in range(8): print(prp_list[i].dump(32)) cmd = SQE(2, 1) cmd.prp1 = buf cmd.prp2 = prp_list cmd[12] = 0x4000001f sq[0] = cmd logging.info(sq[0]) sq.tail = 1 while CQE(cq[0]).p == 0: pass cq.head = 1 logging.info(cq[0]) logging.info(hex(cq[0][3] >> 17)) print(buf.dump(32)) for i in range(8): print(prp_list[i].dump(32)) status = (cq[0][3] >> 17) & 0x3ff assert status == 0x0013 or status == 0 sq.delete() cq.delete()
def test_create_cq_invalid_queue_address_offset(nvme0): queue = PRP(4096) queue.offset = 1 with pytest.warns(UserWarning, match="ERROR status: 00/13"): IOCQ(nvme0, 1, 10, queue)