From 303331cc8fa1253ea599c3352905c3f38984baae Mon Sep 17 00:00:00 2001 From: Yuecheng-CAM Date: Sun, 20 Oct 2024 23:17:01 +0100 Subject: [PATCH] implement C_GET_HIGH --- src_Core/ISA/ISA_Decls_CHERI.bsv | 1 + src_Core/RISCY_OOO/procs/lib/Decode.bsv | 6 ++++++ src_Core/RISCY_OOO/procs/lib/Exec.bsv | 6 ++++++ src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv | 1 + 4 files changed, 14 insertions(+) diff --git a/src_Core/ISA/ISA_Decls_CHERI.bsv b/src_Core/ISA/ISA_Decls_CHERI.bsv index 3dbd9dd..21ee1a7 100755 --- a/src_Core/ISA/ISA_Decls_CHERI.bsv +++ b/src_Core/ISA/ISA_Decls_CHERI.bsv @@ -184,6 +184,7 @@ Bit #(5) f5rs2_cap_CGetAddr = 5'h0f; Bit #(5) f5rs2_cap_CClearFPReg = 5'h10; Bit #(5) f5rs2_cap_CSealEntry = 5'h11; Bit #(5) f5rs2_cap_CLoadTags = 5'h12; +Bit #(5) f5rs2_cap_CGetHigh = 5'h17; // 5'h13 unused Bit #(5) f5rs2_cap_JALR_PCC = 5'h14; // 5'h15-5'h1f unused (5'h1f reserved for 1-reg instructions) diff --git a/src_Core/RISCY_OOO/procs/lib/Decode.bsv b/src_Core/RISCY_OOO/procs/lib/Decode.bsv index 8712175..ac3c73e 100644 --- a/src_Core/RISCY_OOO/procs/lib/Decode.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Decode.bsv @@ -1303,6 +1303,12 @@ function DecodeResult decode(Instruction inst, Bool cap_mode); regs.src1 = Valid(tagged Gpr rs1); dInst.capFunc = CapInspect (GetType); end + f5rs2_cap_CGetHigh: begin + dInst.iType = Cap; + regs.dst = Valid(tagged Gpr rd); + regs.src1 = Valid(tagged Gpr rs1); + dInst.capFunc = CapInspect (GetHigh); + end f5rs2_cap_CLoadTags: begin dInst.iType = Ld; dInst.imm = Valid(0); diff --git a/src_Core/RISCY_OOO/procs/lib/Exec.bsv b/src_Core/RISCY_OOO/procs/lib/Exec.bsv index c408936..e4b25c5 100644 --- a/src_Core/RISCY_OOO/procs/lib/Exec.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Exec.bsv @@ -308,6 +308,8 @@ function Data capInspect(CapPipe a, CapPipe b, CapInspectFunc func); zeroExtend(getFlags(a)); tagged GetPerm : zeroExtend(getPerms(a)); + tagged GetHigh : + zeroExtend(getHigh(pack(toMem(a)))); tagged GetType : tpl_1(extractType(a)); tagged ToPtr : @@ -624,7 +626,11 @@ function MemTaggedData gatherLoad( Addr addr, ByteOrTagEn byteOrTagEn return dataToMemTaggedData(extend(dataVec[offset])); end endfunction +function Bit#(64) getHigh(CapMem cap); + Bit #(129) cap_mem_bits = unpack(pack(cap)); + return cap_mem_bits[128-1:64]; +endfunction function Tuple2#(ByteEn, Data) scatterStore(Addr addr, ByteEn byteEn, Data data); Bit#(IndxShamt) offset = truncate(addr); if(byteEn[7]) begin diff --git a/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv b/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv index 208a2e6..fdb4da5 100644 --- a/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv +++ b/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv @@ -363,6 +363,7 @@ typedef union tagged { void GetFlags; void GetPerm; void GetType; + void GetHigh; void ToPtr; } CapInspectFunc deriving(Bits, Eq, FShow);