11use core:: ptr;
22
3- use memory_addresses:: VirtAddr ;
4- use uhyve_interface:: parameters:: { ExitParams , SerialWriteBufferParams } ;
5- use uhyve_interface:: { Hypercall , HypercallAddress } ;
3+ use memory_addresses:: { PhysAddr , VirtAddr } ;
4+ use uhyve_interface:: v2 :: parameters:: { ExitParams , SerialWriteBufferParams } ;
5+ use uhyve_interface:: v2 :: { Hypercall , HypercallAddress } ;
66
77use crate :: arch;
88use crate :: arch:: mm:: paging:: { self , virtual_to_physical} ;
99use crate :: syscalls:: interfaces:: SyscallInterface ;
1010
1111/// perform a SerialWriteBuffer hypercall with `buf` as payload.
12- #[ inline]
1312#[ cfg_attr( target_arch = "riscv64" , expect( dead_code) ) ]
1413pub ( crate ) fn serial_buf_hypercall ( buf : & [ u8 ] ) {
1514 let p = SerialWriteBufferParams {
@@ -31,9 +30,7 @@ fn data_addr<T>(data: &T) -> u64 {
3130#[ inline]
3231fn hypercall_data ( hypercall : & Hypercall < ' _ > ) -> u64 {
3332 match hypercall {
34- Hypercall :: Cmdsize ( data) => data_addr ( * data) ,
35- Hypercall :: Cmdval ( data) => data_addr ( * data) ,
36- Hypercall :: Exit ( data) => data_addr ( * data) ,
33+ Hypercall :: Exit ( exit_code) => u64:: try_from ( * exit_code) . unwrap ( ) ,
3734 Hypercall :: FileClose ( data) => data_addr ( * data) ,
3835 Hypercall :: FileLseek ( data) => data_addr ( * data) ,
3936 Hypercall :: FileOpen ( data) => data_addr ( * data) ,
@@ -50,24 +47,21 @@ fn hypercall_data(hypercall: &Hypercall<'_>) -> u64 {
5047#[ inline]
5148#[ allow( unused_variables) ] // until riscv64 is implemented
5249pub ( crate ) fn uhyve_hypercall ( hypercall : Hypercall < ' _ > ) {
53- let ptr = HypercallAddress :: from ( & hypercall) as u16 ;
50+ let mut ptr = HypercallAddress :: from ( & hypercall) as u64 ;
5451 let data = hypercall_data ( & hypercall) ;
5552
5653 #[ cfg( target_arch = "x86_64" ) ]
57- unsafe {
58- use x86_64:: instructions:: port:: Port ;
59-
60- let data =
61- u32:: try_from ( data) . expect ( "Hypercall data must lie in the first 4GiB of memory" ) ;
62- Port :: new ( ptr) . write ( data) ;
54+ {
55+ let ptr = ptr as * mut u64 ;
56+ unsafe { ptr. write_volatile ( data) } ;
6357 }
6458
6559 #[ cfg( target_arch = "aarch64" ) ]
6660 unsafe {
6761 use core:: arch:: asm;
6862 asm ! (
6963 "str x8, [{ptr}]" ,
70- ptr = in( reg) u64 :: from ( ptr) ,
64+ ptr = in( reg) ptr,
7165 in( "x8" ) data,
7266 options( nostack) ,
7367 ) ;
@@ -82,7 +76,7 @@ pub struct Uhyve;
8276impl SyscallInterface for Uhyve {
8377 fn shutdown ( & self , error_code : i32 ) -> ! {
8478 let sysexit = ExitParams { arg : error_code } ;
85- uhyve_hypercall ( Hypercall :: Exit ( & sysexit ) ) ;
79+ uhyve_hypercall ( Hypercall :: Exit ( error_code ) ) ;
8680
8781 loop {
8882 arch:: processor:: halt ( ) ;
0 commit comments