4343
4444namespace microv
4545{
46+ // / <!-- description -->
47+ // / @brief Handle emulation of port IO read/write accesses
48+ // /
49+ // / <!-- input/outputs -->
50+ // / @param mut_sys the bf_syscall_t to use
51+ // / @param pmut_mut_exit_io mv_exit_io_t pointer to use
52+ // / @param data_mask bitmask to apply to either the read or
53+ // / write
54+ // / @return void
55+ // /
56+ [[nodiscard]] constexpr auto
57+ handle_io (
58+ syscall::bf_syscall_t &mut_sys,
59+ hypercall::mv_exit_io_t *pmut_mut_exit_io,
60+ bsl::safe_u64 const &data_mask) noexcept
61+ {
62+ auto const rax{mut_sys.bf_tls_rax ()};
63+ if (hypercall::MV_EXIT_IO_OUT == pmut_mut_exit_io->type ) {
64+ pmut_mut_exit_io->data = (data_mask & rax).get ();
65+ }
66+ else {
67+ mut_sys.bf_tls_set_rax ((data_mask & pmut_mut_exit_io->data ));
68+ }
69+ }
70+
4671 // / <!-- description -->
4772 // / @brief Dispatches IO VMExits.
4873 // /
@@ -91,7 +116,6 @@ namespace microv
91116 constexpr auto exitqual_idx{syscall::bf_reg_t ::bf_reg_t_exit_qualification};
92117 auto const exitqual{mut_sys.bf_vs_op_read (vsid, exitqual_idx)};
93118
94- auto const rax{mut_sys.bf_tls_rax ()};
95119 auto const rcx{mut_sys.bf_tls_rcx ()};
96120 auto const rdx{mut_sys.bf_tls_rdx ()};
97121
@@ -131,8 +155,7 @@ namespace microv
131155 mut_exit_io->type = hypercall::MV_EXIT_IO_OUT.get ();
132156 }
133157 else {
134- bsl::error () << " MV_EXIT_IO_IN not implemented\n " << bsl::here ();
135- return bsl::errc_failure;
158+ mut_exit_io->type = hypercall::MV_EXIT_IO_IN.get ();
136159 }
137160
138161 constexpr auto bytes1{0_u64};
@@ -142,7 +165,7 @@ namespace microv
142165 if (bytes4 == ((exitqual & size_mask) >> size_shft)) {
143166 constexpr auto data_mask{0x00000000FFFFFFFF_u64};
144167 mut_exit_io->size = hypercall::mv_bit_size_t ::mv_bit_size_t_32;
145- mut_exit_io-> data = (data_mask & rax) .get ();
168+ handle_io (mut_sys, mut_exit_io .get (), data_mask );
146169 }
147170 else {
148171 bsl::touch ();
@@ -151,7 +174,7 @@ namespace microv
151174 if (bytes2 == ((exitqual & size_mask) >> size_shft)) {
152175 constexpr auto data_mask{0x000000000000FFFF_u64};
153176 mut_exit_io->size = hypercall::mv_bit_size_t ::mv_bit_size_t_16;
154- mut_exit_io-> data = (data_mask & rax) .get ();
177+ handle_io (mut_sys, mut_exit_io .get (), data_mask );
155178 }
156179 else {
157180 bsl::touch ();
@@ -160,7 +183,7 @@ namespace microv
160183 if (bytes1 == ((exitqual & size_mask) >> size_shft)) {
161184 constexpr auto data_mask{0x00000000000000FF_u64};
162185 mut_exit_io->size = hypercall::mv_bit_size_t ::mv_bit_size_t_8;
163- mut_exit_io-> data = (data_mask & rax) .get ();
186+ handle_io (mut_sys, mut_exit_io .get (), data_mask );
164187 }
165188 else {
166189 bsl::touch ();
0 commit comments