mirror of
				https://github.com/riscv-software-src/opensbi
				synced 2025-11-03 21:48:45 +00:00 
			
		
		
		
	lib: sbi: Refine the settings for switching to Virtual Supervisor Mode.
Although Mstatus.MPV is set, before executing mret, access to VS mode registers should use the actual register addresses, not the pseudonyms of S registers. Signed-off-by: Pope B.Lei <popeblei@gmail.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
		
							parent
							
								
									033104da08
								
							
						
					
					
						commit
						1d89a9da64
					
				@ -1046,10 +1046,17 @@ sbi_hart_switch_mode(unsigned long arg0, unsigned long arg1,
 | 
			
		||||
	csr_write(CSR_MEPC, next_addr);
 | 
			
		||||
 | 
			
		||||
	if (next_mode == PRV_S) {
 | 
			
		||||
		csr_write(CSR_STVEC, next_addr);
 | 
			
		||||
		csr_write(CSR_SSCRATCH, 0);
 | 
			
		||||
		csr_write(CSR_SIE, 0);
 | 
			
		||||
		csr_write(CSR_SATP, 0);
 | 
			
		||||
		if (next_virt) {
 | 
			
		||||
			csr_write(CSR_VSTVEC, next_addr);
 | 
			
		||||
			csr_write(CSR_VSSCRATCH, 0);
 | 
			
		||||
			csr_write(CSR_VSIE, 0);
 | 
			
		||||
			csr_write(CSR_VSATP, 0);
 | 
			
		||||
		} else {
 | 
			
		||||
			csr_write(CSR_STVEC, next_addr);
 | 
			
		||||
			csr_write(CSR_SSCRATCH, 0);
 | 
			
		||||
			csr_write(CSR_SIE, 0);
 | 
			
		||||
			csr_write(CSR_SATP, 0);
 | 
			
		||||
		}
 | 
			
		||||
	} else if (next_mode == PRV_U) {
 | 
			
		||||
		if (misa_extension('N')) {
 | 
			
		||||
			csr_write(CSR_UTVEC, next_addr);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user