Compare commits
	
		
			1 Commits
		
	
	
		
			7efa924510
			...
			8e1951f298
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8e1951f298 | 
| @@ -172,6 +172,66 @@ public: | |||||||
|             return 0b00000000000000000001100010001000; |             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>; |     using hart_state_type = hart_state<reg_t>; | ||||||
|  |  | ||||||
|     constexpr reg_t get_irq_mask() { |     constexpr reg_t get_irq_mask() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user