lib.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #![no_std]
  2. pub mod vm {
  3. use core::arch::asm;
  4. #[inline(always)]
  5. pub fn invlpg(vaddr: usize) {
  6. unsafe {
  7. asm!(
  8. "invlpg ({})",
  9. in(reg) vaddr,
  10. options(att_syntax)
  11. );
  12. }
  13. }
  14. #[inline(always)]
  15. pub fn invlpg_all() {
  16. unsafe {
  17. asm!(
  18. "mov %cr3, %rax",
  19. "mov %rax, %cr3",
  20. out("rax") _,
  21. options(att_syntax)
  22. );
  23. }
  24. }
  25. #[inline(always)]
  26. pub fn get_cr3() -> usize {
  27. let cr3: usize;
  28. unsafe {
  29. asm!(
  30. "mov %cr3, {0}",
  31. out(reg) cr3,
  32. options(att_syntax)
  33. );
  34. }
  35. cr3
  36. }
  37. #[inline(always)]
  38. pub fn set_cr3(pfn: usize) {
  39. unsafe {
  40. asm!(
  41. "mov {0}, %cr3",
  42. in(reg) pfn,
  43. options(att_syntax)
  44. );
  45. }
  46. }
  47. #[inline(always)]
  48. pub fn get_cr2() -> usize {
  49. let cr2: usize;
  50. unsafe {
  51. asm!(
  52. "mov %cr2, {}",
  53. out(reg) cr2,
  54. options(att_syntax)
  55. );
  56. }
  57. cr2
  58. }
  59. }
  60. pub mod interrupt;
  61. pub mod io;
  62. pub mod task;