Compare commits
	
		
			1 Commits
		
	
	
		
			7efa924510
			...
			8e1951f298
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8e1951f298 | 
| @@ -172,6 +172,66 @@ public: | ||||
|             return 0b00000000000000000001100010001000; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     // specialization 64bit | ||||
|     template <typename T> class hart_state<T, typename std::enable_if<std::is_same<T, uint64_t>::value>::type> { | ||||
|     public: | ||||
|         BEGIN_BF_DECL(mstatus_t, T); | ||||
|         // SD bit is read-only and is set when either the FS or XS bits encode a Dirty state (i.e., SD=((FS==11) OR XS==11))) | ||||
|         BF_FIELD(SD, 63, 1); | ||||
|         // value of XLEN for S-mode | ||||
|         BF_FIELD(SXL, 34, 2); | ||||
|         // value of XLEN for U-mode | ||||
|         BF_FIELD(UXL, 32, 2); | ||||
|         // Trap SRET | ||||
|         BF_FIELD(TSR, 22, 1); | ||||
|         // Timeout Wait | ||||
|         BF_FIELD(TW, 21, 1); | ||||
|         // Trap Virtual Memory | ||||
|         BF_FIELD(TVM, 20, 1); | ||||
|         // Make eXecutable Readable | ||||
|         BF_FIELD(MXR, 19, 1); | ||||
|         // permit Supervisor User Memory access | ||||
|         BF_FIELD(SUM, 18, 1); | ||||
|         // Modify PRiVilege | ||||
|         BF_FIELD(MPRV, 17, 1); | ||||
|         // status of additional user-mode extensions and associated state, All off/None dirty or clean, some on/None dirty, some clean/Some dirty | ||||
|         BF_FIELD(XS, 15, 2); | ||||
|         // floating-point unit status Off/Initial/Clean/Dirty | ||||
|         BF_FIELD(FS, 13, 2); | ||||
|         // machine previous privilege | ||||
|         BF_FIELD(MPP, 11, 2); | ||||
|         // supervisor previous privilege | ||||
|         BF_FIELD(SPP, 8, 1); | ||||
|         // previous machine interrupt-enable | ||||
|         BF_FIELD(MPIE, 7, 1); | ||||
|         // previous supervisor interrupt-enable | ||||
|         BF_FIELD(SPIE, 5, 1); | ||||
|         // previous user interrupt-enable | ||||
|         BF_FIELD(UPIE, 4, 1); | ||||
|         // machine interrupt-enable | ||||
|         BF_FIELD(MIE, 3, 1); | ||||
|         // supervisor interrupt-enable | ||||
|         BF_FIELD(SIE, 1, 1); | ||||
|         // user interrupt-enable | ||||
|         BF_FIELD(UIE, 0, 1); | ||||
|         END_BF_DECL(); | ||||
|  | ||||
|         mstatus_t mstatus; | ||||
|  | ||||
|         static const reg_t mstatus_reset_val = 0xa00000000; | ||||
|  | ||||
|         void write_mstatus(T val) { | ||||
|             auto mask = get_mask() &0xff; // MPP is hardcode as 0x3 | ||||
|             auto new_val = (mstatus.backing.val & ~mask) | (val & mask); | ||||
|             mstatus = new_val; | ||||
|         } | ||||
|  | ||||
|         static constexpr T get_mask() { | ||||
|             return 0x8000000f007ff9ddULL; // 0b1...0 1111 0000 0000 0111 1111 1111 1001 1011 1011 | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     using hart_state_type = hart_state<reg_t>; | ||||
|  | ||||
|     constexpr reg_t get_irq_mask() { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user