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_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, | ||||
|           .PrivilegeModeW, .ReadAccess, .WriteAccess, | ||||
|           .PrivilegeModeW, .ReadAccess, .WriteAccess, .CMOp, | ||||
|           .DisableTranslation, .PTE, .PageTypeWriteVal, | ||||
|           .TLBWrite, .TLBFlush, .TLBPAdr, .TLBMiss, .TLBHit,  | ||||
|           .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                     ReadAccess,  | ||||
|   input  logic                     WriteAccess, | ||||
|   input  logic [3:0]               CMOp, | ||||
|   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]        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]; | ||||
| 
 | ||||
|   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,  | ||||
|     .TLBMiss, .TLBHit, .TLBPageFault,  | ||||
|     .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 [1:0]               PrivilegeModeW,     // Current privilege level of the processeor
 | ||||
|   input  logic                     ReadAccess, WriteAccess, | ||||
|   input  logic [3:0]               CMOp, | ||||
|   input  logic                     DisableTranslation, | ||||
|   input  logic                     TLBFlush,           // Invalidate all TLB entries
 | ||||
|   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;  | ||||
| 
 | ||||
|   // 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)
 | ||||
|   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; | ||||
|  end else begin:dtlb // Data TLB fault checking
 | ||||
|     logic InvalidRead, InvalidWrite; | ||||
|     logic InvalidCBOM, InvalidCBOZ; | ||||
| 
 | ||||
|     // User mode may only load/store from user mode pages, and supervisor mode
 | ||||
|     // 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
 | ||||
|     // low.
 | ||||
|     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; | ||||
|   end | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user