More concise FShow for CapChecks

This commit is contained in:
Peter Rugg
2020-04-20 21:28:09 +01:00
parent b4be80eba1
commit 8e01cf68df
2 changed files with 42 additions and 19 deletions

View File

@@ -0,0 +1,18 @@
`CAP_CHECK_FIELD(src1_tag,"src1_tag")
`CAP_CHECK_FIELD(src2_tag,"src2_tag")
`CAP_CHECK_FIELD(src1_sealed_with_type,"src1_sealed_with_type")
`CAP_CHECK_FIELD(src1_unsealed,"src1_unsealed")
`CAP_CHECK_FIELD(src2_unsealed,"src2_unsealed")
`CAP_CHECK_FIELD(src1_sealed,"src1_sealed")
`CAP_CHECK_FIELD(src2_sealed,"src2_sealed")
`CAP_CHECK_FIELD(src1_src2_types_match,"src1_src2_types_match")
`CAP_CHECK_FIELD(src1_permit_ccall,"src1_permit_ccall")
`CAP_CHECK_FIELD(src2_permit_ccall,"src2_permit_ccall")
`CAP_CHECK_FIELD(src1_permit_x,"src1_permit_x")
`CAP_CHECK_FIELD(src2_no_permit_x,"src2_no_permit_x")
`CAP_CHECK_FIELD(src2_permit_unseal,"src2_permit_unseal")
`CAP_CHECK_FIELD(src2_permit_seal,"src2_permit_seal")
`CAP_CHECK_FIELD(src2_points_to_src1_type,"src2_points_to_src1_type")
`CAP_CHECK_FIELD(src2_addr_valid_type,"src2_addr_valid_type")
`CAP_CHECK_FIELD(src1_perm_subset_src2,"src1_perm_subset_src2")
`CAP_CHECK_FIELD(src1_derivable,"src1_derivable")

View File

@@ -709,24 +709,9 @@ typedef Bit#(65) CapTop;
typedef Bit#(32) ImmData; // 32-bit decoded immediate data
typedef struct {
Bool src1_tag;
Bool src2_tag;
Bool src1_sealed_with_type;
Bool src1_unsealed;
Bool src2_unsealed;
Bool src1_sealed;
Bool src2_sealed;
Bool src1_src2_types_match;
Bool src1_permit_ccall;
Bool src2_permit_ccall;
Bool src1_permit_x;
Bool src2_no_permit_x;
Bool src2_permit_unseal;
Bool src2_permit_seal;
Bool src2_points_to_src1_type;
Bool src2_addr_valid_type;
Bool src1_perm_subset_src2;
Bool src1_derivable;
`define CAP_CHECK_FIELD(x,s) Bool x;
`include "CapChecks.bsvi"
`undef CAP_CHECK_FIELD
Bool check_enable;
CheckAuthoritySrc check_authority_src;
@@ -736,7 +721,27 @@ typedef struct {
Bit#(6) rn1;
Bit#(6) rn2;
} CapChecks deriving(Bits, Eq, FShow);
} CapChecks deriving(Bits, Eq);
instance FShow#(CapChecks);
function Fmt fshow(CapChecks x);
let ret = $format("CapChecks {",
"rn1 ", fshow(x.rn1), ", rn2 ", fshow(x.rn2));
`define CAP_CHECK_FIELD(f,s) if (x.f) ret = ret + $format(", ", s);
`include "CapChecks.bsvi"
`undef CAP_CHECK_FIELD
if (x.check_enable)
ret = $format(ret, ", bounds check: ",
"auth ", fshow(x.check_authority_src), ", ",
"low ", fshow(x.check_low_src), ", ",
"high ", fshow(x.check_high_src), ", ",
"inclusive ", fshow(x.check_inclusive));
return $format(ret, "}");
endfunction
endinstance
typedef CSR_XCapCause CapException;