@@ -24,9 +24,10 @@ impl VDevice {
2424 self . id
2525 }
2626
27- pub fn run ( & self ) {
28- let mut dev = self . raw . lock ( ) ;
29- dev. run ( ) ;
27+ pub fn try_invoke ( & self ) {
28+ if let Some ( mut dev) = self . raw . try_lock ( ) {
29+ dev. invoke ( ) ;
30+ }
3031 }
3132}
3233
@@ -84,7 +85,7 @@ impl VDeviceList {
8485
8586 pub fn handle_mmio_read ( & self , addr : GuestPhysAddr , width : AccessWidth ) -> Option < usize > {
8687 let mmio = & self . mmio ;
87- for ( id, region) in unsafe { & ( * mmio. inner . get ( ) ) . regions } {
88+ for ( & id, region) in unsafe { & ( * mmio. inner . get ( ) ) . regions } {
8889 if addr >= region. gpa ( )
8990 && addr. as_usize ( ) + width. size ( ) <= region. gpa ( ) . as_usize ( ) + region. size ( )
9091 {
@@ -94,7 +95,7 @@ impl VDeviceList {
9495 width,
9596 id
9697 ) ;
97- self . get_device ( * id ) . unwrap ( ) . run ( ) ;
98+ self . device_try_invoke ( id ) ;
9899
99100 let offset = addr. as_usize ( ) - region. gpa ( ) . as_usize ( ) ;
100101 let access_ptr = unsafe { region. hva ( ) . as_ptr ( ) . add ( offset) } ;
@@ -109,6 +110,45 @@ impl VDeviceList {
109110 }
110111 None
111112 }
113+
114+ pub fn handle_mmio_write (
115+ & self ,
116+ addr : GuestPhysAddr ,
117+ width : AccessWidth ,
118+ data : usize ,
119+ ) -> Option < ( ) > {
120+ let mmio = & self . mmio ;
121+ for ( & id, region) in unsafe { & ( * mmio. inner . get ( ) ) . regions } {
122+ if addr >= region. gpa ( )
123+ && addr. as_usize ( ) + width. size ( ) <= region. gpa ( ) . as_usize ( ) + region. size ( )
124+ {
125+ debug ! (
126+ "VDev MMIO write addr={:#x} width={:?} data={:#x} dev_id={}" ,
127+ addr. as_usize( ) ,
128+ width,
129+ data,
130+ id
131+ ) ;
132+
133+ let offset = addr. as_usize ( ) - region. gpa ( ) . as_usize ( ) ;
134+ let access_ptr = unsafe { region. hva ( ) . as_ptr ( ) . add ( offset) } ;
135+ match width {
136+ AccessWidth :: Byte => unsafe { * ( access_ptr as * mut u8 ) = data as u8 } ,
137+ AccessWidth :: Word => unsafe { * ( access_ptr as * mut u16 ) = data as u16 } ,
138+ AccessWidth :: Dword => unsafe { * ( access_ptr as * mut u32 ) = data as u32 } ,
139+ AccessWidth :: Qword => unsafe { * ( access_ptr as * mut u64 ) = data as u64 } ,
140+ } ;
141+
142+ self . device_try_invoke ( id) ;
143+ return Some ( ( ) ) ;
144+ }
145+ }
146+ None
147+ }
148+
149+ fn device_try_invoke ( & self , id : u32 ) {
150+ self . get_device ( * id) . unwrap ( ) . try_invoke ( ) ;
151+ }
112152}
113153
114154#[ derive( Clone ) ]
@@ -140,7 +180,7 @@ impl VirtPlatformOp for VDevPlat {
140180 todo ! ( )
141181 }
142182
143- fn invoke_irq ( & self , irq : IrqNum ) {
183+ fn send_irq ( & self , irq : IrqNum ) {
144184 todo ! ( )
145185 }
146186}
0 commit comments