@@ -663,25 +663,23 @@ static int mshv_vtl_alloc_context(unsigned int cpu)
663
663
return ret ;
664
664
665
665
if (cc_platform_has (CC_ATTR_SNP_SECURE_AVIC )) {
666
- struct page * page = alloc_page (GFP_KERNEL | __GFP_ZERO );
667
- void * secure_avic_page ;
666
+ struct page * secure_avic_page = alloc_page (GFP_KERNEL | __GFP_ZERO );
668
667
669
- if (!page )
668
+ if (!secure_avic_page )
670
669
return - ENOMEM ;
671
- secure_avic_page = page_address (page );
672
670
673
671
/* VMPL 2 for the VTL0 */
674
- ret = rmpadjust ((unsigned long )secure_avic_page ,
672
+ ret = rmpadjust ((unsigned long )page_address ( secure_avic_page ) ,
675
673
RMP_PG_SIZE_4K , 2 | RMPADJUST_ENABLE_READ | RMPADJUST_ENABLE_WRITE );
676
674
if (ret ) {
677
675
pr_err ("failed to adjust RMP for the secure AVIC page: %d\n" , ret );
678
- free_page ((u64 )page );
676
+ free_page ((u64 )secure_avic_page );
679
677
return - EINVAL ;
680
678
}
681
679
pr_debug ("VTL0 secure AVIC page allocated, CPU %d\n" , cpu );
682
680
683
681
/* is the environment quiet enough to capture a consistent state? */
684
- x2apic_savic_init_backing_page (secure_avic_page );
682
+ x2apic_savic_init_backing_page (page_address ( secure_avic_page ) );
685
683
per_cpu -> secure_avic_page = secure_avic_page ;
686
684
}
687
685
#endif
@@ -1889,6 +1887,41 @@ static long mshv_vtl_ioctl_guest_vsm_vmsa_pfn(void __user *user_arg)
1889
1887
1890
1888
return ret ;
1891
1889
}
1890
+
1891
+ static void secure_avic_vtl0_this_cpu (void * arg )
1892
+ {
1893
+ int cpu ;
1894
+ struct page * secure_avic_page ;
1895
+ u64 * pfn = arg ;
1896
+
1897
+ cpu = get_cpu ();
1898
+ secure_avic_page = * this_cpu_ptr (& mshv_vtl_per_cpu .secure_avic_page );
1899
+ put_cpu ();
1900
+
1901
+ * pfn = secure_avic_page ? page_to_pfn (secure_avic_page ) : - ENOMEM ;
1902
+ }
1903
+
1904
+ static long mshv_vtl_ioctl_secure_avic_vtl0_pfn (void __user * user_arg )
1905
+ {
1906
+ u64 pfn ;
1907
+ u32 cpu_id ;
1908
+ long ret ;
1909
+
1910
+ ret = copy_from_user (& cpu_id , user_arg , sizeof (cpu_id )) ? - EFAULT : 0 ;
1911
+ if (ret )
1912
+ return ret ;
1913
+
1914
+ ret = smp_call_function_single (cpu_id , secure_avic_vtl0_this_cpu , & pfn , true);
1915
+ if (ret )
1916
+ return ret ;
1917
+ ret = (long )pfn ;
1918
+ if (ret < 0 )
1919
+ return ret ;
1920
+
1921
+ ret = copy_to_user (user_arg , & pfn , sizeof (pfn )) ? - EFAULT : 0 ;
1922
+
1923
+ return ret ;
1924
+ }
1892
1925
#endif
1893
1926
1894
1927
static long
@@ -1942,6 +1975,9 @@ mshv_vtl_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
1942
1975
case MSHV_VTL_GUEST_VSM_VMSA_PFN :
1943
1976
ret = mshv_vtl_ioctl_guest_vsm_vmsa_pfn ((void __user * )arg );
1944
1977
break ;
1978
+ case MSHV_VTL_SECURE_AVIC_VTL0_PFN :
1979
+ ret = mshv_vtl_ioctl_secure_avic_vtl0_pfn ((void __user * )arg );
1980
+ break ;
1945
1981
#endif
1946
1982
1947
1983
default :
0 commit comments