diff options
Diffstat (limited to '')
| -rw-r--r-- | shell/src/lib.rs | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/shell/src/lib.rs b/shell/src/lib.rs index 5cab122..500eaae 100644 --- a/shell/src/lib.rs +++ b/shell/src/lib.rs | |||
| @@ -50,6 +50,8 @@ pub fn run() -> ! { | |||
| 50 | "mem" => cmd_mem(), | 50 | "mem" => cmd_mem(), |
| 51 | "mmap" => cmd_mmap(), | 51 | "mmap" => cmd_mmap(), |
| 52 | "stress" => cmd_stress(args), | 52 | "stress" => cmd_stress(args), |
| 53 | "date" => cmd_date(), | ||
| 54 | "pci" => cmd_pci(), | ||
| 53 | _ => { | 55 | _ => { |
| 54 | gop_println!("unknown command: {}", cmd); | 56 | gop_println!("unknown command: {}", cmd); |
| 55 | serial_println!("unknown command: {}", cmd); | 57 | serial_println!("unknown command: {}", cmd); |
| @@ -124,11 +126,13 @@ fn cmd_help() { | |||
| 124 | gop_println!(" mem — show memory info"); | 126 | gop_println!(" mem — show memory info"); |
| 125 | gop_println!(" mmap — dump the UEFI memory map"); | 127 | gop_println!(" mmap — dump the UEFI memory map"); |
| 126 | gop_println!(" stress — stress-test heap/page allocators"); | 128 | gop_println!(" stress — stress-test heap/page allocators"); |
| 129 | gop_println!(" date — show current date/time (RTC)"); | ||
| 130 | gop_println!(" pci — list PCI devices"); | ||
| 127 | gop_println!(" halt — halt the system (hlt loop)"); | 131 | gop_println!(" halt — halt the system (hlt loop)"); |
| 128 | gop_println!(" poweroff — shut down via ACPI (ResetSystem)"); | 132 | gop_println!(" poweroff — shut down via ACPI (ResetSystem)"); |
| 129 | gop_println!(" exit — alias for poweroff"); | 133 | gop_println!(" exit — alias for poweroff"); |
| 130 | serial_println!("available commands:"); | 134 | serial_println!("available commands:"); |
| 131 | serial_println!(" help, echo, clear, hello, info, mem, mmap, stress, halt, poweroff, exit"); | 135 | serial_println!(" help, echo, clear, hello, info, mem, mmap, stress, date, pci, halt, poweroff, exit"); |
| 132 | } | 136 | } |
| 133 | 137 | ||
| 134 | fn cmd_echo(args: &str) { | 138 | fn cmd_echo(args: &str) { |
| @@ -364,6 +368,38 @@ fn cmd_halt() -> ! { | |||
| 364 | rsnix::power::halt() | 368 | rsnix::power::halt() |
| 365 | } | 369 | } |
| 366 | 370 | ||
| 371 | fn cmd_date() { | ||
| 372 | let t = rsnix::rtc::now(); | ||
| 373 | let line = alloc::format!( | ||
| 374 | "{}-{:02}-{:02} {:02}:{:02}:{:02}", | ||
| 375 | t.year, t.month, t.day, t.hour, t.minute, t.second | ||
| 376 | ); | ||
| 377 | gop_println!("{}", line); | ||
| 378 | serial_println!("{}", line); | ||
| 379 | } | ||
| 380 | |||
| 381 | fn cmd_pci() { | ||
| 382 | let devices = rsnix::pci::probe(); | ||
| 383 | let mut out = alloc::string::String::new(); | ||
| 384 | use alloc::fmt::Write; | ||
| 385 | let _ = writeln!(out, "pci: {} device(s)", devices.len()); | ||
| 386 | let _ = writeln!(out, " bus dev fn class vendor:device"); | ||
| 387 | for d in &devices { | ||
| 388 | let _ = writeln!( | ||
| 389 | out, | ||
| 390 | " {:02x}:{:02x}.{} {:<16} {:04x}:{:04x}", | ||
| 391 | d.bus, | ||
| 392 | d.device, | ||
| 393 | d.func, | ||
| 394 | rsnix::pci::class_name(d.class, d.subclass), | ||
| 395 | d.vendor, | ||
| 396 | d.device_id | ||
| 397 | ); | ||
| 398 | } | ||
| 399 | gop_print!("{}", out); | ||
| 400 | serial_print!("{}", out); | ||
| 401 | } | ||
| 402 | |||
| 367 | fn cmd_poweroff() -> ! { | 403 | fn cmd_poweroff() -> ! { |
| 368 | gop_println!("shutting down..."); | 404 | gop_println!("shutting down..."); |
| 369 | serial_println!("shutting down..."); | 405 | serial_println!("shutting down..."); |
