@@ -50,18 +50,46 @@ pub struct Disk {
5050// available; support having more than one disk.
5151impl Disk {
5252 pub fn new ( os : UefiOS ) -> Disk {
53- let handle = uefi:: boot:: find_handles :: < DiskIo > ( )
53+ let ( _size , handle) = uefi:: boot:: find_handles :: < DiskIo > ( )
5454 . unwrap ( )
5555 . into_iter ( )
56- . find ( |handle| {
57- let op = open_disk ( * handle) ;
58- if let Ok ( ( _, block) ) = op {
59- if block. media ( ) . is_media_present ( ) {
60- return true ;
61- }
56+ . filter_map ( |handle| {
57+ let op = open_disk ( handle) ;
58+ let Ok ( ( _, block) ) = op else {
59+ return None ;
60+ } ;
61+ let m = block. media ( ) ;
62+ if !m. is_media_present ( ) {
63+ return None ;
6264 }
63- false
65+ let size = ( m. last_block ( ) as u128 + 1 ) * ( m. block_size ( ) as u128 ) ;
66+ Some ( ( size, handle) )
6467 } )
68+ . max_by_key ( |( size, _) | * size)
69+ . expect ( "Disk not found" ) ;
70+
71+ let ( disk, block) = open_disk ( handle) . unwrap ( ) ;
72+ Disk { disk, block, os }
73+ }
74+
75+ #[ cfg( feature = "coverage" ) ]
76+ pub fn open_with_size ( os : UefiOS , base_size : i64 ) -> Disk {
77+ let ( _size, handle) = uefi:: boot:: find_handles :: < DiskIo > ( )
78+ . unwrap ( )
79+ . into_iter ( )
80+ . filter_map ( |handle| {
81+ let op = open_disk ( handle) ;
82+ let Ok ( ( _, block) ) = op else {
83+ return None ;
84+ } ;
85+ let m = block. media ( ) ;
86+ if !m. is_media_present ( ) {
87+ return None ;
88+ }
89+ let size = ( m. last_block ( ) as i64 + 1 ) * ( m. block_size ( ) as i64 ) ;
90+ Some ( ( ( size - base_size) . abs ( ) , handle) )
91+ } )
92+ . min_by_key ( |( size, _) | * size)
6593 . expect ( "Disk not found" ) ;
6694
6795 let ( disk, block) = open_disk ( handle) . unwrap ( ) ;
@@ -83,6 +111,13 @@ impl Disk {
83111 . read_disk ( self . block . media ( ) . media_id ( ) , offset, buf) ?)
84112 }
85113
114+ #[ cfg( feature = "coverage" ) ]
115+ pub fn write_ ( & mut self , offset : u64 , buf : & [ u8 ] ) -> Result < ( ) > {
116+ Ok ( self
117+ . disk
118+ . write_disk ( self . block . media ( ) . media_id ( ) , offset, buf) ?)
119+ }
120+
86121 pub async fn write ( & mut self , offset : u64 , buf : & [ u8 ] ) -> Result < ( ) > {
87122 self . os . schedule ( ) . await ;
88123 Ok ( self
0 commit comments