mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Updates to tlb to check access permissions for cbo*
This commit is contained in:
parent
f4e4aac8b5
commit
f11f88ac2b
@ -85,7 +85,7 @@ module mmu import cvw::*; #(parameter cvw_t P,
|
|||||||
.SATP_MODE(SATP_REGW[P.XLEN-1:P.XLEN-P.SVMODE_BITS]),
|
.SATP_MODE(SATP_REGW[P.XLEN-1:P.XLEN-P.SVMODE_BITS]),
|
||||||
.SATP_ASID(SATP_REGW[P.ASID_BASE+P.ASID_BITS-1:P.ASID_BASE]),
|
.SATP_ASID(SATP_REGW[P.ASID_BASE+P.ASID_BITS-1:P.ASID_BASE]),
|
||||||
.VAdr(VAdr[P.XLEN-1:0]), .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_PBMTE, .ENVCFG_HADE,
|
.VAdr(VAdr[P.XLEN-1:0]), .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_PBMTE, .ENVCFG_HADE,
|
||||||
.PrivilegeModeW, .ReadAccess, .WriteAccess,
|
.PrivilegeModeW, .ReadAccess, .WriteAccess, .CMOp,
|
||||||
.DisableTranslation, .PTE, .PageTypeWriteVal,
|
.DisableTranslation, .PTE, .PageTypeWriteVal,
|
||||||
.TLBWrite, .TLBFlush, .TLBPAdr, .TLBMiss, .TLBHit,
|
.TLBWrite, .TLBFlush, .TLBPAdr, .TLBMiss, .TLBHit,
|
||||||
.Translate, .TLBPageFault, .UpdateDA, .PBMemoryType);
|
.Translate, .TLBPageFault, .UpdateDA, .PBMemoryType);
|
||||||
|
@ -62,6 +62,7 @@ module tlb import cvw::*; #(parameter cvw_t P,
|
|||||||
input logic [1:0] PrivilegeModeW, // Current privilege level of the processeor
|
input logic [1:0] PrivilegeModeW, // Current privilege level of the processeor
|
||||||
input logic ReadAccess,
|
input logic ReadAccess,
|
||||||
input logic WriteAccess,
|
input logic WriteAccess,
|
||||||
|
input logic [3:0] CMOp,
|
||||||
input logic DisableTranslation,
|
input logic DisableTranslation,
|
||||||
input logic [P.XLEN-1:0] VAdr, // address input before translation (could be physical or virtual)
|
input logic [P.XLEN-1:0] VAdr, // address input before translation (could be physical or virtual)
|
||||||
input logic [P.XLEN-1:0] PTE, // page table entry to write
|
input logic [P.XLEN-1:0] PTE, // page table entry to write
|
||||||
@ -106,7 +107,7 @@ module tlb import cvw::*; #(parameter cvw_t P,
|
|||||||
assign VPN = VAdr[P.VPN_BITS+11:12];
|
assign VPN = VAdr[P.VPN_BITS+11:12];
|
||||||
|
|
||||||
tlbcontrol #(P, ITLB) tlbcontrol(.SATP_MODE, .VAdr, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_PBMTE, .ENVCFG_HADE,
|
tlbcontrol #(P, ITLB) tlbcontrol(.SATP_MODE, .VAdr, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_PBMTE, .ENVCFG_HADE,
|
||||||
.PrivilegeModeW, .ReadAccess, .WriteAccess, .DisableTranslation, .TLBFlush,
|
.PrivilegeModeW, .ReadAccess, .WriteAccess, .CMOp, .DisableTranslation, .TLBFlush,
|
||||||
.PTEAccessBits, .CAMHit, .Misaligned,
|
.PTEAccessBits, .CAMHit, .Misaligned,
|
||||||
.TLBMiss, .TLBHit, .TLBPageFault,
|
.TLBMiss, .TLBHit, .TLBPageFault,
|
||||||
.UpdateDA, .SV39Mode, .Translate, .PTE_N, .PBMemoryType);
|
.UpdateDA, .SV39Mode, .Translate, .PTE_N, .PBMemoryType);
|
||||||
|
@ -35,6 +35,7 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
|||||||
input logic ENVCFG_HADE, // HPTW A/D Update enable
|
input logic ENVCFG_HADE, // HPTW A/D Update enable
|
||||||
input logic [1:0] PrivilegeModeW, // Current privilege level of the processeor
|
input logic [1:0] PrivilegeModeW, // Current privilege level of the processeor
|
||||||
input logic ReadAccess, WriteAccess,
|
input logic ReadAccess, WriteAccess,
|
||||||
|
input logic [3:0] CMOp,
|
||||||
input logic DisableTranslation,
|
input logic DisableTranslation,
|
||||||
input logic TLBFlush, // Invalidate all TLB entries
|
input logic TLBFlush, // Invalidate all TLB entries
|
||||||
input logic [11:0] PTEAccessBits,
|
input logic [11:0] PTEAccessBits,
|
||||||
@ -67,7 +68,7 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
|||||||
assign Translate = (SATP_MODE != P.NO_TRANSLATE[P.SVMODE_BITS-1:0]) & (EffectivePrivilegeMode != P.M_MODE) & ~DisableTranslation;
|
assign Translate = (SATP_MODE != P.NO_TRANSLATE[P.SVMODE_BITS-1:0]) & (EffectivePrivilegeMode != P.M_MODE) & ~DisableTranslation;
|
||||||
|
|
||||||
// Determine whether TLB is being used
|
// Determine whether TLB is being used
|
||||||
assign TLBAccess = ReadAccess | WriteAccess;
|
assign TLBAccess = ReadAccess | WriteAccess | (|CMOp);
|
||||||
|
|
||||||
// Check that upper bits are legal (all 0s or all 1s)
|
// Check that upper bits are legal (all 0s or all 1s)
|
||||||
vm64check #(P) vm64check(.SATP_MODE, .VAdr, .SV39Mode, .UpperBitsUnequal);
|
vm64check #(P) vm64check(.SATP_MODE, .VAdr, .SV39Mode, .UpperBitsUnequal);
|
||||||
@ -98,6 +99,7 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
|||||||
assign InvalidAccess = ~PTE_X;
|
assign InvalidAccess = ~PTE_X;
|
||||||
end else begin:dtlb // Data TLB fault checking
|
end else begin:dtlb // Data TLB fault checking
|
||||||
logic InvalidRead, InvalidWrite;
|
logic InvalidRead, InvalidWrite;
|
||||||
|
logic InvalidCBOM, InvalidCBOZ;
|
||||||
|
|
||||||
// User mode may only load/store from user mode pages, and supervisor mode
|
// User mode may only load/store from user mode pages, and supervisor mode
|
||||||
// may only access user mode pages when STATUS_SUM is low.
|
// may only access user mode pages when STATUS_SUM is low.
|
||||||
@ -110,7 +112,9 @@ module tlbcontrol import cvw::*; #(parameter cvw_t P, ITLB = 0) (
|
|||||||
// Check for write error. Writes are invalid when the page's write bit is
|
// Check for write error. Writes are invalid when the page's write bit is
|
||||||
// low.
|
// low.
|
||||||
assign InvalidWrite = WriteAccess & ~PTE_W;
|
assign InvalidWrite = WriteAccess & ~PTE_W;
|
||||||
assign InvalidAccess = InvalidRead | InvalidWrite;
|
assign InvalidCBOM = (|CMOp[2:0]) & (~PTE_W | (~PTE_R & (~STATUS_MXR | ~PTE_X)));
|
||||||
|
assign InvalidCBOZ = CMOp[3] & ~PTE_W;
|
||||||
|
assign InvalidAccess = InvalidRead | InvalidWrite | InvalidCBOM | InvalidCBOZ;
|
||||||
assign PreUpdateDA = ~PTE_A | WriteAccess & ~PTE_D;
|
assign PreUpdateDA = ~PTE_A | WriteAccess & ~PTE_D;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user