config.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /// mm
  2. pub mod mm {
  3. pub const ROOT_PAGE_TABLE_PHYS_ADDR: usize = 0x8040_0000;
  4. pub const ROOT_PAGE_TABLE_PFN: usize = ROOT_PAGE_TABLE_PHYS_ADDR >> 12;
  5. pub const PAGE_TABLE_PHYS_END: usize = 0x8080_0000;
  6. pub const PHYS_MAP_VIRT: usize = 0xFFFF_FF00_0000_0000;
  7. pub const KIMAGE_PHYS_BASE: usize = 0x8020_0000;
  8. pub const KIMAGE_VIRT_BASE: usize = 0xFFFF_FFFF_FFC0_0000;
  9. pub const PAGE_SIZE: usize = 0x1000;
  10. #[derive(Clone, Copy)]
  11. pub enum PageSize {
  12. _4KbPage = 4096,
  13. _2MbPage = 2 * 1024 * 1024,
  14. _1GbPage = 1 * 1024 * 1024 * 1024,
  15. }
  16. }
  17. /// smp
  18. pub mod smp {
  19. use spin::Once;
  20. pub static NUM_HARTS: Once<usize> = Once::new();
  21. pub fn set_num_harts(num: usize) {
  22. NUM_HARTS.call_once(|| num);
  23. }
  24. pub fn get_num_harts() -> usize {
  25. *NUM_HARTS.get().expect("NUM_HARTS should be initialized by now")
  26. }
  27. }
  28. pub mod platform {
  29. pub mod virt {
  30. pub const PLIC_BASE: usize = 0x0C00_0000;
  31. pub const PLIC_ENABLE_PER_HART_OFFSET: usize = 0x80; // 每个 Hart使能块 0x80 字节 (128 字节)
  32. pub const PLIC_THRESHOLD_CLAIM_COMPLETE_PER_HART_OFFSET: usize = 0x1000; // 每个 Hart/上下文块 0x1000 字节 (4KB)
  33. pub const PLIC_PRIORITY_OFFSET: usize = 0x0000_0000;
  34. pub const PLIC_PENDING_OFFSET: usize = 0x0000_1000;
  35. pub const PLIC_ENABLE_OFFSET: usize = 0x0000_2000; // Varies by context and mode (M/S/U)
  36. pub const PLIC_THRESHOLD_OFFSET: usize = 0x0020_0000; // Varies by context and mode (M/S/U)
  37. pub const PLIC_CLAIM_COMPLETE_OFFSET: usize = 0x0020_0004; // Varies by context and mode (M/S/U)
  38. // PLIC Context IDs for S-mode (assuming hart 0's S-mode context is 1, hart 1's is 3, etc.)
  39. // A common pattern is: context_id = hart_id * 2 + 1 (for S-mode)
  40. pub const PLIC_S_MODE_CONTEXT_STRIDE: usize = 2;
  41. // CLINT (Core Local Interruptor) memory-mapped registers
  42. // Base address for CLINT on QEMU virt platform
  43. pub const CLINT_BASE: usize = 0x200_0000;
  44. pub const CLINT_MSIP_OFFSET: usize = 0x0000; // Machine-mode Software Interrupt Pending (MSIP)
  45. pub const CLINT_MTIMECMP_OFFSET: usize = 0x4000; // Machine-mode Timer Compare (MTIMECMP)
  46. pub const CLINT_MTIME_OFFSET: usize = 0xBFF8;
  47. pub const CPU_FREQ_HZ: u64 = 10_000_000;
  48. }
  49. }