Lines Matching refs:iter

11 static void tdp_iter_refresh_sptep(struct tdp_iter *iter)
13 iter->sptep = iter->pt_path[iter->level - 1] +
14 SHADOW_PT_INDEX(iter->gfn << PAGE_SHIFT, iter->level);
15 iter->old_spte = READ_ONCE(*iter->sptep);
27 void tdp_iter_start(struct tdp_iter *iter, u64 *root_pt, int root_level,
33 iter->next_last_level_gfn = next_last_level_gfn;
34 iter->yielded_gfn = iter->next_last_level_gfn;
35 iter->root_level = root_level;
36 iter->min_level = min_level;
37 iter->level = root_level;
38 iter->pt_path[iter->level - 1] = root_pt;
40 iter->gfn = round_gfn_for_level(iter->next_last_level_gfn, iter->level);
41 tdp_iter_refresh_sptep(iter);
43 iter->valid = true;
67 static bool try_step_down(struct tdp_iter *iter)
71 if (iter->level == iter->min_level)
78 iter->old_spte = READ_ONCE(*iter->sptep);
80 child_pt = spte_to_child_pt(iter->old_spte, iter->level);
84 iter->level--;
85 iter->pt_path[iter->level - 1] = child_pt;
86 iter->gfn = round_gfn_for_level(iter->next_last_level_gfn, iter->level);
87 tdp_iter_refresh_sptep(iter);
99 static bool try_step_side(struct tdp_iter *iter)
105 if (SHADOW_PT_INDEX(iter->gfn << PAGE_SHIFT, iter->level) ==
109 iter->gfn += KVM_PAGES_PER_HPAGE(iter->level);
110 iter->next_last_level_gfn = iter->gfn;
111 iter->sptep++;
112 iter->old_spte = READ_ONCE(*iter->sptep);
122 static bool try_step_up(struct tdp_iter *iter)
124 if (iter->level == iter->root_level)
127 iter->level++;
128 iter->gfn = round_gfn_for_level(iter->gfn, iter->level);
129 tdp_iter_refresh_sptep(iter);
150 void tdp_iter_next(struct tdp_iter *iter)
152 if (try_step_down(iter))
156 if (try_step_side(iter))
158 } while (try_step_up(iter));
159 iter->valid = false;
162 u64 *tdp_iter_root_pt(struct tdp_iter *iter)
164 return iter->pt_path[iter->root_level - 1];