@@ -1557,6 +1557,9 @@ mod tests {
1557
1557
use super :: * ;
1558
1558
use Kvm ;
1559
1559
1560
+ #[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
1561
+ use std:: { fs:: OpenOptions , ptr:: null_mut} ;
1562
+
1560
1563
use libc:: EFD_NONBLOCK ;
1561
1564
1562
1565
#[ test]
@@ -2054,4 +2057,71 @@ mod tests {
2054
2057
let mut init: kvm_sev_cmd = Default :: default ( ) ;
2055
2058
assert ! ( vm. encrypt_op_sev( & mut init) . is_ok( ) ) ;
2056
2059
}
2060
+
2061
+ #[ test]
2062
+ #[ cfg( any( target_arch = "x86" , target_arch = "x86_64" ) ) ]
2063
+ #[ cfg_attr( not( has_sev) , ignore) ]
2064
+ fn test_register_unregister_enc_memory_region ( ) {
2065
+ let sev = OpenOptions :: new ( )
2066
+ . read ( true )
2067
+ . write ( true )
2068
+ . open ( "/dev/sev" )
2069
+ . unwrap ( ) ;
2070
+
2071
+ let kvm = Kvm :: new ( ) . unwrap ( ) ;
2072
+ let vm = kvm. create_vm ( ) . unwrap ( ) ;
2073
+
2074
+ // Perform SEV launch sequence according to
2075
+ // https://www.kernel.org/doc/Documentation/virtual/kvm/amd-memory-encryption.rst
2076
+
2077
+ let mut init: kvm_sev_cmd = Default :: default ( ) ;
2078
+ assert ! ( vm. encrypt_op_sev( & mut init) . is_ok( ) ) ;
2079
+
2080
+ let start_data: kvm_sev_launch_start = Default :: default ( ) ;
2081
+ let mut start = kvm_sev_cmd {
2082
+ id : sev_cmd_id_KVM_SEV_LAUNCH_START,
2083
+ data : & start_data as * const kvm_sev_launch_start as _ ,
2084
+ sev_fd : sev. as_raw_fd ( ) as _ ,
2085
+ ..Default :: default ( )
2086
+ } ;
2087
+ assert ! ( vm. encrypt_op_sev( & mut start) . is_ok( ) ) ;
2088
+
2089
+ let addr = unsafe {
2090
+ libc:: mmap (
2091
+ null_mut ( ) ,
2092
+ 4096 ,
2093
+ libc:: PROT_READ | libc:: PROT_WRITE ,
2094
+ libc:: MAP_PRIVATE | libc:: MAP_ANONYMOUS ,
2095
+ -1 ,
2096
+ 0 ,
2097
+ )
2098
+ } ;
2099
+ assert_ne ! ( addr, libc:: MAP_FAILED ) ;
2100
+
2101
+ assert_eq ! (
2102
+ vm. register_enc_memory_region( & Default :: default ( ) )
2103
+ . unwrap_err( )
2104
+ . errno( ) ,
2105
+ libc:: EINVAL
2106
+ ) ;
2107
+ assert_eq ! (
2108
+ vm. unregister_enc_memory_region( & Default :: default ( ) )
2109
+ . unwrap_err( )
2110
+ . errno( ) ,
2111
+ libc:: EINVAL
2112
+ ) ;
2113
+
2114
+ let memory_region = kvm_enc_region {
2115
+ addr : addr as _ ,
2116
+ size : 4096 ,
2117
+ } ;
2118
+ assert_eq ! (
2119
+ vm. unregister_enc_memory_region( & memory_region)
2120
+ . unwrap_err( )
2121
+ . errno( ) ,
2122
+ libc:: EINVAL
2123
+ ) ;
2124
+ assert ! ( vm. register_enc_memory_region( & memory_region) . is_ok( ) ) ;
2125
+ assert ! ( vm. unregister_enc_memory_region( & memory_region) . is_ok( ) ) ;
2126
+ }
2057
2127
}
0 commit comments