@@ -14,11 +14,15 @@ See the License for the specific language governing permissions and
1414limitations under the License.
1515*/
1616
17- use core:: arch:: asm;
1817use core:: ffi:: { CStr , c_char} ;
1918
2019use hyperlight_common:: outb:: OutBAction ;
2120
21+ #[ cfg_attr( target_arch = "x86_64" , path = "arch/amd64/exit.rs" ) ]
22+ #[ cfg_attr( target_arch = "aarch64" , path = "arch/aarch64/exit.rs" ) ]
23+ mod arch;
24+ pub ( crate ) use arch:: out32;
25+
2226/// Exits the VM with an Abort OUT action and code 0.
2327#[ unsafe( no_mangle) ]
2428pub extern "C" fn abort ( ) -> ! {
@@ -87,46 +91,6 @@ pub(crate) fn outb(port: u16, data: &[u8]) {
8791 }
8892}
8993
90- /// OUT function for sending a 32-bit value to the host.
91- /// `out32` can be called from an exception context, so we must be careful
92- /// with the tracing state that might be locked at that time.
93- /// The tracing state calls `try_lock` internally to avoid deadlocks.
94- /// Furthermore, the instrument macro is not used here to avoid creating spans
95- /// in exception contexts. Because if the trace state is already locked, trying to create a span
96- /// would cause a panic, which is undesirable in exception handling.
97- pub ( crate ) unsafe fn out32 ( port : u16 , val : u32 ) {
98- #[ cfg( all( feature = "trace_guest" , target_arch = "x86_64" ) ) ]
99- {
100- if let Some ( ( ptr, len) ) = hyperlight_guest_tracing:: serialized_data ( ) {
101- // If tracing is enabled and there is data to send, send it along with the OUT action
102- unsafe {
103- asm ! ( "out dx, eax" ,
104- in( "dx" ) port,
105- in( "eax" ) val,
106- in( "r8" ) OutBAction :: TraceBatch as u64 ,
107- in( "r9" ) ptr,
108- in( "r10" ) len,
109- options( preserves_flags, nomem, nostack)
110- )
111- } ;
112-
113- // Reset the trace state after sending the batch
114- // This clears all existing spans/events ensuring a clean state for the next operations
115- // The trace state is expected to be flushed before this call
116- hyperlight_guest_tracing:: reset ( ) ;
117- } else {
118- // If tracing is not enabled, just send the value
119- unsafe {
120- asm ! ( "out dx, eax" , in( "dx" ) port, in( "eax" ) val, options( preserves_flags, nomem, nostack) )
121- } ;
122- }
123- }
124- #[ cfg( not( all( feature = "trace_guest" , target_arch = "x86_64" ) ) ) ]
125- unsafe {
126- asm ! ( "out dx, eax" , in( "dx" ) port, in( "eax" ) val, options( preserves_flags, nomem, nostack) ) ;
127- }
128- }
129-
13094/// Prints a message using `OutBAction::DebugPrint`. It transmits bytes of a message
13195/// through several VMExists and, with such, it is slower than
13296/// `print_output_with_host_print`.
0 commit comments