tdp_iter.rs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. // use crate::{
  2. // arch::vm::mmu::mmu::gfn_round_for_level,
  3. // mm::{virt_2_phys, PhysAddr, VirtAddr},
  4. // time::sleep,
  5. // virt::kvm::host_mem::PAGE_SHIFT,
  6. // };
  7. // use super::{
  8. // mmu::{PageLevel, PAGE_SIZE},
  9. // mmu_internal::KvmMmuPage,
  10. // };
  11. // pub const PT64_ROOT_MAX_LEVEL: usize = 5; //通常只用到4级,但是确实有5级的情况
  12. // pub const PT_LEVEL_BITS: u8 = 9; // 每个页表级别的位数
  13. // pub const PT64_ENT_PER_PAGE: u32 = 1 << 9;
  14. // pub const PTE_LEN: usize = 64;
  15. // //Bits 51:12 are from the EPT PDPTE
  16. // pub const PT64_BASE_ADDR_MASK: u64 = ((1u64 << 52) - 1) & !(PAGE_SIZE - 1);
  17. // pub fn shadow_pt_index(addr: u64, level: u8) -> u64 {
  18. // (addr >> (PAGE_SHIFT as u8 + (level - 1) * PT_LEVEL_BITS)) & ((1 << PT_LEVEL_BITS) - 1)
  19. // }
  20. // pub fn is_last_spte(pte: u64, level: u8) -> bool {
  21. // level == PageLevel::Level4K as u8 || is_large_pte(pte)
  22. // }
  23. // pub fn is_shadow_present_pte(pte: u64) -> bool {
  24. // pte & 1 << 11 != 0 //在intel手冊中:ept PTE:11 Ignored.不是很懂
  25. // }
  26. // pub fn is_large_pte(pte: u64) -> bool {
  27. // pte & 1 << 7 != 0 //在intel手冊中:ept PTE:7 Ignored.
  28. // }
  29. // ///Bits 51:12 are from the EPT PDPTE
  30. // pub fn spte_to_pfn(pte: u64) -> u64 {
  31. // (pte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT
  32. // }
  33. // #[derive(Default)]
  34. // pub struct TdpIter {
  35. // inner: TdpIterInner,
  36. // }
  37. // impl TdpIter {
  38. // pub fn start(
  39. // &self,
  40. // root_pt: usize,
  41. // root_level: u8,
  42. // min_level: u8,
  43. // next_last_level_gfn: u64,
  44. // ) -> Self {
  45. // let mut inner = self.inner.clone();
  46. // inner.start(root_pt, root_level, min_level, next_last_level_gfn);
  47. // TdpIter { inner }
  48. // }
  49. // }
  50. // ///迭代器将遍历分页结构,直到找到此 GFN 的映射。
  51. // #[derive(Default, Clone)]
  52. // pub struct TdpIterInner {
  53. // next_last_level_gfn: u64,
  54. // /// 线程上次让出时的 next_last_level_gfn。
  55. // /// 仅当 next_last_level_gfn != yielded_gfn 时让出,有助于确保前进。
  56. // pub yielded_gfn: u64,
  57. // ///指向遍历到当前 SPTE 的页表的指针
  58. // pt_path: [u64; PT64_ROOT_MAX_LEVEL],
  59. // ///指向当前 SPTE 的指针 是hva吗?
  60. // sptep: PhysAddr,
  61. // /// 当前 SPTE 映射的最低 GFN hpa>>shift?
  62. // pub gfn: u64,
  63. // ///给迭代器的根页级别
  64. // pub root_level: u8,
  65. // ///迭代器应遍历到的最低级别
  66. // pub min_level: u8,
  67. // ///迭代器在分页结构中的当前级别
  68. // pub level: u8,
  69. // ///sptep 处值的快照
  70. // pub old_spte: u64,
  71. // ///迭代器是否具有有效状态。如果迭代器走出分页结构的末端,则为 false。
  72. // ///
  73. // pub valid: bool,
  74. // }
  75. // impl TdpIterInner {
  76. // ///初始化ept iter
  77. // #[inline(never)]
  78. // pub fn start(
  79. // &mut self,
  80. // root_pt: usize,
  81. // root_level: u8,
  82. // min_level: u8,
  83. // next_last_level_gfn: u64,
  84. // ) {
  85. // // if root_pt.role.level() == 0 || root_pt.role.level() > PT64_ROOT_MAX_LEVEL as u32 {
  86. // // self.valid = false;
  87. // // return;
  88. // // }
  89. // if root_level < 1 || root_level > PT64_ROOT_MAX_LEVEL as u8 {
  90. // self.valid = false;
  91. // return;
  92. // }
  93. // self.next_last_level_gfn = next_last_level_gfn;
  94. // self.root_level = root_level as u8;
  95. // self.min_level = min_level as u8;
  96. // self.pt_path[(self.root_level - 1) as usize] = root_pt as u64;
  97. // self.yielded_gfn = self.next_last_level_gfn;
  98. // self.level = self.root_level;
  99. // self.gfn = gfn_round_for_level(self.next_last_level_gfn, self.level);
  100. // self.tdp_iter_refresh_sptep();
  101. // self.valid = true;
  102. // }
  103. // /*
  104. // * 重新计算当前GFN和level和SPTE指针,并重新读取SPTE。
  105. // */
  106. // fn tdp_iter_refresh_sptep(&mut self) {
  107. // // self.sptep = PhysAddr::new(
  108. // // (self.pt_path[self.level as usize - 1]
  109. // // + shadow_pt_index(self.gfn << PAGE_SHIFT, self.level)) as usize,
  110. // // );
  111. // // self.old_spte = read_sptep(self.sptep);
  112. // }
  113. // pub fn _next(&mut self) {
  114. // if self.try_step_down() {
  115. // return;
  116. // }
  117. // loop {
  118. // if self.try_step_side() {
  119. // return;
  120. // }
  121. // if !self.try_step_up() {
  122. // break;
  123. // }
  124. // }
  125. // self.valid = false;
  126. // }
  127. // ///在分页结构中向目标GFN下降一级。如果迭代器能够下降一级,则返回true,否则返回false。
  128. // fn try_step_down(&mut self) -> bool {
  129. // if self.level == self.min_level {
  130. // return false;
  131. // }
  132. // //在下降之前重新读取SPTE,以避免遍历到不再从此条目链接的页表中。
  133. // self.old_spte = read_sptep(self.sptep);
  134. // match spte_to_child_pt(self.old_spte, self.level) {
  135. // Some(child_pt) => {
  136. // self.level -= 1;
  137. // self.pt_path[self.level as usize - 1] = child_pt.data() as u64;
  138. // self.gfn = gfn_round_for_level(self.gfn, self.level);
  139. // self.tdp_iter_refresh_sptep();
  140. // true
  141. // }
  142. // None => false,
  143. // }
  144. // }
  145. // fn try_step_up(&mut self) -> bool {
  146. // if self.level == self.root_level {
  147. // return false;
  148. // }
  149. // self.level += 1;
  150. // self.gfn = gfn_round_for_level(self.gfn, self.level);
  151. // self.tdp_iter_refresh_sptep();
  152. // true
  153. // }
  154. // ///在当前页表的当前级别中,移动到下一个条目。下一个条目可以指向一个page backing guest memory ,
  155. // ///或者另一个页表,或者它可能是不存在的。如果迭代器能够移动到页表中的下一个条目,则返回true,
  156. // ///如果迭代器已经在当前页表的末尾,则返回false。
  157. // fn try_step_side(&mut self) -> bool {
  158. // //检查迭代器是否已经在当前页表的末尾。
  159. // if shadow_pt_index(self.gfn << PAGE_SHIFT, self.level) == (PT64_ENT_PER_PAGE - 1) as u64 {
  160. // return false;
  161. // }
  162. // self.gfn += PageLevel::kvm_pages_per_hpage(self.level);
  163. // self.next_last_level_gfn = self.gfn;
  164. // self.sptep.add(PTE_LEN); //指向下一个spte,一个spte占64位
  165. // self.old_spte = read_sptep(self.sptep);
  166. // true
  167. // }
  168. // }
  169. // impl Iterator for TdpIter {
  170. // type Item = TdpIterInner; // 返回 (gfn, spte) 元组
  171. // fn next(&mut self) -> Option<Self::Item> {
  172. // let inner = &mut self.inner;
  173. // if !inner.valid {
  174. // return None;
  175. // }
  176. // inner._next();
  177. // if inner.valid {
  178. // Some(inner.clone())
  179. // } else {
  180. // None
  181. // }
  182. // }
  183. // }
  184. // ///给定一个 SPTE 及其级别,返回一个指针,该指针包含 SPTE 所引用的子页表的hva。
  185. // ///如果没有这样的条目,则返回 null。
  186. // ///
  187. // fn spte_to_child_pt(spte: u64, level: u8) -> Option<VirtAddr> {
  188. // //没有子页表
  189. // if !is_shadow_present_pte(spte) || is_last_spte(spte, level) {
  190. // return None;
  191. // }
  192. // Some(VirtAddr::new(virt_2_phys//__va
  193. // ((spte_to_pfn(spte)<<PAGE_SHIFT) as usize
  194. // )))
  195. // }
  196. // pub fn read_sptep(sptep: PhysAddr) -> u64 {
  197. // unsafe { *(sptep.data() as *const u64) }
  198. // }