@@ -507,6 +507,17 @@ function BoundsInfo#(CapAddrW) getBoundsInfoFat (CapFat cap, TempFields tf)
507
507
508
508
Bool repSplit = alwaysRep ? False : ! unpack ( reduceOr ( addrUpperHi)) ;
509
509
510
+ // compute valid / malformed bounds
511
+ // ////////////////////////////////////////////////////////////////////////////
512
+
513
+ Bool malformedMSB = (( exp == resetExp) && ( baseBits != 0 ))
514
+ || (( exp == resetExp - 1 ) && ( msb( baseBits) != 0 )) ;
515
+ Bool malformedLSB = ( exp > resetExp) ;
516
+ `ifdef CAP64
517
+ malformedLSB = malformedLSB || ( exp == 0 ) ;
518
+ `endif
519
+ Bool malformed = ( cap.format != Exp0) && ( malformedMSB || malformedLSB) ;
520
+
510
521
// return populated BoundsInfo structure
511
522
// ////////////////////////////////////////////////////////////////////////////
512
523
@@ -516,7 +527,8 @@ function BoundsInfo#(CapAddrW) getBoundsInfoFat (CapFat cap, TempFields tf)
516
527
, repBase : repBase
517
528
, repTop : repTop
518
529
, repLength : repLength
519
- , repSplit : repSplit } ;
530
+ , repSplit : repSplit
531
+ , malformed : malformed } ;
520
532
endfunction
521
533
522
534
function CapAddr getBotFat( CapFat cap, TempFields tf) ;
@@ -1269,6 +1281,7 @@ instance CHERICap #(CapMem, 0, 0, CapAddrW, CapW, TSub#(MW, 2));
1269
1281
1270
1282
// capability architectural bounds queries
1271
1283
// ////////////////////////////////////////////////////////////////////////////
1284
+ function areCapBoundsValid = error ( " areCapBoundsValid not implemented for CapMem" ) ;
1272
1285
function getBoundsInfo = error ( " getBoundsInfo not implemented for CapMem" ) ;
1273
1286
// function getBase = error ("getBase not implemented for CapMem");
1274
1287
// function getTop = error ("getTop not implemented for CapMem");
@@ -1435,6 +1448,7 @@ instance CHERICap #(CapReg, 0, 0, CapAddrW, CapW, TSub#(MW, 2));
1435
1448
1436
1449
// capability architectural bounds queries
1437
1450
// ////////////////////////////////////////////////////////////////////////////
1451
+ function areCapBoundsValid = error ( " areCapBoundsValid not implemented for CapReg" ) ;
1438
1452
function getBoundsInfo = error ( " getBoundsInfo not implemented for CapReg" ) ;
1439
1453
// function getBase = error ("getBase not implemented for CapReg");
1440
1454
// function getTop = error ("getTop not implemented for CapReg");
@@ -1575,6 +1589,8 @@ instance CHERICap #(CapPipe, 0, 0, CapAddrW, CapW, TSub#(MW, 2));
1575
1589
return Exact { exact : result.v, value : cap } ;
1576
1590
endfunction
1577
1591
1592
+ function areCapBoundsValid ( cap) = ! getBoundsInfoFat( cap.capFat, cap.tempFields) .malformed;
1593
+
1578
1594
function getBoundsInfo ( cap) = getBoundsInfoFat ( cap.capFat, cap.tempFields) ;
1579
1595
1580
1596
function getBase ( cap) = getBotFat( cap.capFat, cap.tempFields) ;
0 commit comments