//! pci — list PCI devices via the exports table. #![no_std] #![no_main] #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { loop { core::hint::spin_loop(); } } fn put(exports: &rsapi::Exports, buf: &[u8]) { (exports.put_line)(rsapi::Line { ptr: buf.as_ptr(), len: buf.len() }); } fn hex2(b: u8, out: &mut [u8]) { let hi = b >> 4; let lo = b & 0xf; out[0] = if hi < 10 { b'0' + hi } else { b'a' + hi - 10 }; out[1] = if lo < 10 { b'0' + lo } else { b'a' + lo - 10 }; } #[unsafe(no_mangle)] pub extern "C" fn efi_main(exports: &'static rsapi::Exports, _argc: usize, _argv: *const rsapi::Arg) -> i32 { let count = (exports.pci_probe)(); let mut i = 0u32; while i < count { let mut d = rsapi::PciDevice { bus: 0, device: 0, function: 0, class: 0, subclass: 0, vendor: 0, device_id: 0 }; if (exports.pci_device)(i, &mut d) { // "XX:XX.F class=XX:XX ven=XXXX dev=XXXX" = 42 bytes max let mut buf = [0u8; 42]; hex2(d.bus, &mut buf[0..2]); buf[2] = b':'; hex2(d.device, &mut buf[3..5]); buf[5] = b'.'; buf[6] = b'0' + d.function; let class_lbl = b" class="; buf[7..7+class_lbl.len()].copy_from_slice(class_lbl); let o = 7 + class_lbl.len(); hex2(d.class, &mut buf[o..o+2]); buf[o+2] = b':'; hex2(d.subclass, &mut buf[o+3..o+5]); let ven_lbl = b" ven="; buf[o+5..o+5+ven_lbl.len()].copy_from_slice(ven_lbl); let v = o + 5 + ven_lbl.len(); hex2((d.vendor >> 8) as u8, &mut buf[v..v+2]); hex2((d.vendor & 0xff) as u8, &mut buf[v+2..v+4]); let dev_lbl = b" dev="; buf[v+4..v+4+dev_lbl.len()].copy_from_slice(dev_lbl); let dd = v + 4 + dev_lbl.len(); hex2((d.device_id >> 8) as u8, &mut buf[dd..dd+2]); hex2((d.device_id & 0xff) as u8, &mut buf[dd+2..dd+4]); put(exports, &buf[..dd+4]); } i += 1; } 0 }