fail.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. use crate::{
  2. dt::{self, ParseDeviceTreeError, Tree},
  3. dynamic, reset,
  4. };
  5. use riscv::register::mstatus;
  6. use serde_device_tree::Dtb;
  7. #[cold]
  8. pub fn device_tree_format(err: dt::ParseDeviceTreeError) -> Dtb {
  9. match err {
  10. ParseDeviceTreeError::Format => error!("- FDT format error"),
  11. }
  12. reset::fail()
  13. }
  14. #[cold]
  15. pub fn device_tree_deserialize<'a>(err: serde_device_tree::Error) -> Tree<'a> {
  16. error!("Device tree deserialization error: {:?}", err);
  17. reset::fail()
  18. }
  19. #[cold]
  20. pub fn invalid_dynamic_data(err: dynamic::DynamicError) -> (mstatus::MPP, usize) {
  21. error!("Invalid data in dynamic information:");
  22. if err.invalid_mpp {
  23. error!("- dynamic information contains invalid privilege mode");
  24. }
  25. if err.invalid_next_addr {
  26. error!("- dynamic information contains invalid next jump address");
  27. }
  28. let explain_next_mode = match err.bad_info.next_mode {
  29. 3 => "Machine",
  30. 1 => "Supervisor",
  31. 0 => "User",
  32. _ => "Invalid",
  33. };
  34. error!(
  35. "help: dynamic information contains magic value 0x{:x}, version {}, next jump address 0x{:x}, next privilege mode {} ({}), options {:x}, boot hart ID {}",
  36. err.bad_info.magic, err.bad_info.version, err.bad_info.next_addr, err.bad_info.next_mode, explain_next_mode, err.bad_info.options, err.bad_info.boot_hart
  37. );
  38. reset::fail()
  39. }
  40. #[cold]
  41. pub fn no_dynamic_info_available(err: dynamic::DynamicReadError) -> dynamic::DynamicInfo {
  42. if let Some(bad_paddr) = err.bad_paddr {
  43. error!(
  44. "No dynamic information available at address 0x{:x}",
  45. bad_paddr
  46. );
  47. } else {
  48. error!("No valid dynamic information available:");
  49. if let Some(bad_magic) = err.bad_magic {
  50. error!(
  51. "- tried to identify dynamic information, but found invalid magic number 0x{:x}",
  52. bad_magic
  53. );
  54. }
  55. if let Some(bad_version) = err.bad_version {
  56. error!("- tries to identify version of dynamic information, but the version number {} is not supported", bad_version);
  57. }
  58. if err.bad_magic.is_none() {
  59. error!("help: magic number is valid")
  60. }
  61. if err.bad_version.is_none() {
  62. error!("help: dynamic information version is valid")
  63. }
  64. }
  65. reset::fail()
  66. }