File tree Expand file tree Collapse file tree 3 files changed +14
-1
lines changed Expand file tree Collapse file tree 3 files changed +14
-1
lines changed Original file line number Diff line number Diff line change 117
117
#define HGATP_MODE_SV32X4 _AC(1, UL)
118
118
#define HGATP_MODE_SV39X4 _AC(8, UL)
119
119
#define HGATP_MODE_SV48X4 _AC(9, UL)
120
+ #define HGATP_MODE_SV57X4 _AC(10, UL)
120
121
121
122
#define HGATP32_MODE_SHIFT 31
122
123
#define HGATP32_VMID_SHIFT 22
Original file line number Diff line number Diff line change @@ -105,6 +105,9 @@ int kvm_arch_init(void *opaque)
105
105
case HGATP_MODE_SV48X4 :
106
106
str = "Sv48x4" ;
107
107
break ;
108
+ case HGATP_MODE_SV57X4 :
109
+ str = "Sv57x4" ;
110
+ break ;
108
111
default :
109
112
return - ENODEV ;
110
113
}
Original file line number Diff line number Diff line change @@ -751,14 +751,23 @@ void kvm_riscv_gstage_update_hgatp(struct kvm_vcpu *vcpu)
751
751
void kvm_riscv_gstage_mode_detect (void )
752
752
{
753
753
#ifdef CONFIG_64BIT
754
+ /* Try Sv57x4 G-stage mode */
755
+ csr_write (CSR_HGATP , HGATP_MODE_SV57X4 << HGATP_MODE_SHIFT );
756
+ if ((csr_read (CSR_HGATP ) >> HGATP_MODE_SHIFT ) == HGATP_MODE_SV57X4 ) {
757
+ gstage_mode = (HGATP_MODE_SV57X4 << HGATP_MODE_SHIFT );
758
+ gstage_pgd_levels = 5 ;
759
+ goto skip_sv48x4_test ;
760
+ }
761
+
754
762
/* Try Sv48x4 G-stage mode */
755
763
csr_write (CSR_HGATP , HGATP_MODE_SV48X4 << HGATP_MODE_SHIFT );
756
764
if ((csr_read (CSR_HGATP ) >> HGATP_MODE_SHIFT ) == HGATP_MODE_SV48X4 ) {
757
765
gstage_mode = (HGATP_MODE_SV48X4 << HGATP_MODE_SHIFT );
758
766
gstage_pgd_levels = 4 ;
759
767
}
760
- csr_write ( CSR_HGATP , 0 );
768
+ skip_sv48x4_test :
761
769
770
+ csr_write (CSR_HGATP , 0 );
762
771
__kvm_riscv_hfence_gvma_all ();
763
772
#endif
764
773
}
You can’t perform that action at this time.
0 commit comments