@@ -1206,6 +1206,8 @@ impl From<block::Result> for Completion {
12061206mod test {
12071207 use crate :: accessors:: MemAccessor ;
12081208 use crate :: common:: * ;
1209+ use crate :: hw:: nvme:: bits:: DatasetManagementRangeDefinition ;
1210+ use crate :: hw:: nvme:: cmds:: DatasetManagementCmd ;
12091211 use crate :: vmm:: mem:: PhysMap ;
12101212
12111213 use super :: PrpIter ;
@@ -1410,4 +1412,127 @@ mod test {
14101412 }
14111413 assert_eq ! ( iter. next( ) , None ) ;
14121414 }
1415+
1416+ static RANGES : [ DatasetManagementRangeDefinition ; 3 ] = [
1417+ DatasetManagementRangeDefinition {
1418+ context_attributes : 0 ,
1419+ starting_lba : 0x1000 ,
1420+ number_logical_blocks : 0x10 ,
1421+ } ,
1422+ DatasetManagementRangeDefinition {
1423+ context_attributes : 0 ,
1424+ starting_lba : 0x2000 ,
1425+ number_logical_blocks : 0x20 ,
1426+ } ,
1427+ DatasetManagementRangeDefinition {
1428+ context_attributes : 0 ,
1429+ starting_lba : 0x3000 ,
1430+ number_logical_blocks : 0x30 ,
1431+ } ,
1432+ ] ;
1433+
1434+ #[ test]
1435+ fn test_dsmgmt_ranges ( ) {
1436+ let ( _pmap, acc_mem) = setup ( ) ;
1437+ let memctx = acc_mem. access ( ) . unwrap ( ) ;
1438+
1439+ let listaddr = 0x80000u64 ;
1440+ memctx. write_many ( GuestAddr ( listaddr) , & RANGES ) ;
1441+
1442+ let cmd = DatasetManagementCmd {
1443+ prp1 : listaddr,
1444+ prp2 : 0 ,
1445+ nr : RANGES . len ( ) as u16 ,
1446+ ad : true ,
1447+ _idw : false ,
1448+ _idr : false ,
1449+ } ;
1450+
1451+ let mut iter = cmd. ranges ( & memctx) ;
1452+ for expected in & RANGES {
1453+ assert_eq ! (
1454+ iter. next( ) ,
1455+ Some ( Ok ( * expected) ) ,
1456+ "bad range definition"
1457+ ) ;
1458+ }
1459+ assert_eq ! ( iter. next( ) , None ) ;
1460+ }
1461+
1462+ #[ test]
1463+ fn test_dsmgmt_ranges_dual ( ) {
1464+ let ( _pmap, acc_mem) = setup ( ) ;
1465+ let memctx = acc_mem. access ( ) . unwrap ( ) ;
1466+
1467+ let listaddr1 = 0x80FF0u64 ;
1468+ let listaddr2 = 0x90000u64 ;
1469+ memctx. write_many ( GuestAddr ( listaddr1) , & RANGES [ 0 ..1 ] ) ;
1470+ memctx. write_many ( GuestAddr ( listaddr2) , & RANGES [ 1 ..] ) ;
1471+
1472+ let cmd = DatasetManagementCmd {
1473+ prp1 : listaddr1,
1474+ prp2 : listaddr2,
1475+ nr : RANGES . len ( ) as u16 ,
1476+ ad : true ,
1477+ _idw : false ,
1478+ _idr : false ,
1479+ } ;
1480+
1481+ let mut iter = cmd. ranges ( & memctx) ;
1482+ for expected in & RANGES {
1483+ assert_eq ! (
1484+ iter. next( ) ,
1485+ Some ( Ok ( * expected) ) ,
1486+ "bad range definition"
1487+ ) ;
1488+ }
1489+ assert_eq ! ( iter. next( ) , None ) ;
1490+ }
1491+
1492+ #[ test]
1493+ fn test_dsmgmt_ranges_bad_dual ( ) {
1494+ let ( _pmap, acc_mem) = setup ( ) ;
1495+ let memctx = acc_mem. access ( ) . unwrap ( ) ;
1496+
1497+ let listaddr1 = 0x80FF8u64 ;
1498+ let listaddr2 = 0x90000u64 ;
1499+ memctx. write_many ( GuestAddr ( listaddr1) , & RANGES [ 0 ..1 ] ) ;
1500+ memctx. write_many ( GuestAddr ( listaddr2) , & RANGES [ 1 ..] ) ;
1501+
1502+ let cmd = DatasetManagementCmd {
1503+ prp1 : listaddr1,
1504+ prp2 : listaddr2,
1505+ nr : RANGES . len ( ) as u16 ,
1506+ ad : true ,
1507+ _idw : false ,
1508+ _idr : false ,
1509+ } ;
1510+
1511+ let mut iter = cmd. ranges ( & memctx) ;
1512+ match iter. next ( ) {
1513+ Some ( Err ( _) ) => { }
1514+ other => panic ! ( "expected alignment error, got {other:?}" ) ,
1515+ }
1516+ }
1517+
1518+ #[ test]
1519+ fn test_dsmgmt_ranges_bad_address ( ) {
1520+ let ( _pmap, acc_mem) = setup ( ) ;
1521+ let memctx = acc_mem. access ( ) . unwrap ( ) ;
1522+
1523+ let cmd = DatasetManagementCmd {
1524+ prp1 : VM_SIZE as u64 , // out of bounds
1525+ prp2 : 0 ,
1526+ nr : 1 ,
1527+ ad : true ,
1528+ _idw : false ,
1529+ _idr : false ,
1530+ } ;
1531+
1532+ let mut iter = cmd. ranges ( & memctx) ;
1533+ match iter. next ( ) {
1534+ Some ( Err ( _) ) => { }
1535+ other => panic ! ( "expected alignment error, got {other:?}" ) ,
1536+ }
1537+ }
14131538}
0 commit comments