File tree Expand file tree Collapse file tree 4 files changed +75
-0
lines changed
uefi-test-runner/src/proto Expand file tree Collapse file tree 4 files changed +75
-0
lines changed Original file line number Diff line number Diff line change @@ -24,6 +24,7 @@ pub fn test() {
2424 rng:: test ( ) ;
2525 shell_params:: test ( ) ;
2626 string:: test ( ) ;
27+ usb:: test ( ) ;
2728 misc:: test ( ) ;
2829
2930 // disable the ATA test on aarch64 for now. The aarch64 UEFI Firmware does not yet seem
@@ -96,3 +97,4 @@ mod shell_params;
9697mod shim;
9798mod string;
9899mod tcg;
100+ mod usb;
Original file line number Diff line number Diff line change 1+ // SPDX-License-Identifier: MIT OR Apache-2.0
2+
3+ use core:: mem;
4+ use uefi:: {
5+ Status , boot,
6+ proto:: usb:: {
7+ DeviceDescriptor ,
8+ io:: { ControlTransfer , UsbIo } ,
9+ } ,
10+ } ;
11+
12+ pub fn test ( ) {
13+ info ! ( "Testing USB I/O protocol" ) ;
14+
15+ let handles = boot:: locate_handle_buffer ( boot:: SearchType :: from_proto :: < UsbIo > ( ) )
16+ . expect ( "failed to acquire USB I/O handles" ) ;
17+
18+ for handle in handles. iter ( ) . copied ( ) {
19+ let mut io = boot:: open_protocol_exclusive :: < UsbIo > ( handle)
20+ . expect ( "failed to open USB I/O protocol" ) ;
21+
22+ let device = io
23+ . device_descriptor ( )
24+ . expect ( "failed to acquire USB device descriptor" ) ;
25+ io. config_descriptor ( )
26+ . expect ( "failed to acquire USB config descriptor" ) ;
27+ io. interface_descriptor ( )
28+ . expect ( "failed to acquire USB interface descriptor" ) ;
29+ for endpoint_index in 0 ..16 {
30+ let result = io. endpoint_descriptor ( endpoint_index) ;
31+ if result
32+ . as_ref ( )
33+ . is_err_and ( |error| error. status ( ) == Status :: NOT_FOUND )
34+ {
35+ continue ;
36+ }
37+
38+ result. expect ( "failed to acquire USB endpoint descriptor" ) ;
39+ }
40+
41+ let mut buffer = [ 0u8 ; mem:: size_of :: < DeviceDescriptor > ( ) ] ;
42+
43+ io. control_transfer (
44+ 0b1000_0000 ,
45+ 6 ,
46+ 1u16 << 8 ,
47+ 0 ,
48+ ControlTransfer :: DataIn ( & mut buffer[ ..mem:: size_of :: < DeviceDescriptor > ( ) ] ) ,
49+ 0 ,
50+ )
51+ . expect ( "failed control transfer" ) ;
52+ unsafe {
53+ assert_eq ! (
54+ device,
55+ buffer. as_ptr( ) . cast:: <DeviceDescriptor >( ) . read_unaligned( )
56+ )
57+ }
58+ }
59+ }
Original file line number Diff line number Diff line change 1+ // SPDX-License-Identifier: MIT OR Apache-2.0
2+
3+ pub fn test ( ) {
4+ info ! ( "Testing USB protocols" ) ;
5+
6+ io:: test ( ) ;
7+ }
8+
9+ mod io;
Original file line number Diff line number Diff line change @@ -438,6 +438,11 @@ pub fn run_qemu(arch: UefiArch, opt: &QemuOpt) -> Result<()> {
438438 cmd. args ( [ "-display" , "none" ] ) ;
439439 }
440440
441+ // Configure USB
442+ cmd. args ( [ "-device" , "qemu-xhci" ] ) ;
443+
444+ cmd. args ( [ "-device" , "usb-net" ] ) ;
445+
441446 // Second (FAT) disk
442447 let test_disk = tmp_dir. join ( "test_disk.fat.img" ) ;
443448 create_mbr_test_disk ( & test_disk) ?;
You can’t perform that action at this time.
0 commit comments