diff options
| author | Avi Kivity <avi@qumranet.com> | 2007-05-30 07:21:51 -0400 |
|---|---|---|
| committer | Avi Kivity <avi@qumranet.com> | 2007-07-16 05:05:43 -0400 |
| commit | ef0197e8d9273ad8fbfb1bbd30e46e42a32c79e8 (patch) | |
| tree | a3fd2b5306b41cd18b47550e5269940b3321eb75 | |
| parent | d3d25b048b9c7e5c1c20918157a71df734f71766 (diff) | |
KVM: MMU: Simplify fetch() a little bit
Signed-off-by: Avi Kivity <avi@qumranet.com>
| -rw-r--r-- | drivers/kvm/paging_tmpl.h | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/drivers/kvm/paging_tmpl.h b/drivers/kvm/paging_tmpl.h index 183d4ca9b315..e094a8ba17a8 100644 --- a/drivers/kvm/paging_tmpl.h +++ b/drivers/kvm/paging_tmpl.h | |||
| @@ -241,6 +241,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
| 241 | { | 241 | { |
| 242 | hpa_t shadow_addr; | 242 | hpa_t shadow_addr; |
| 243 | int level; | 243 | int level; |
| 244 | u64 *shadow_ent; | ||
| 244 | u64 *prev_shadow_ent = NULL; | 245 | u64 *prev_shadow_ent = NULL; |
| 245 | pt_element_t *guest_ent = walker->ptep; | 246 | pt_element_t *guest_ent = walker->ptep; |
| 246 | 247 | ||
| @@ -257,13 +258,13 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
| 257 | 258 | ||
| 258 | for (; ; level--) { | 259 | for (; ; level--) { |
| 259 | u32 index = SHADOW_PT_INDEX(addr, level); | 260 | u32 index = SHADOW_PT_INDEX(addr, level); |
| 260 | u64 *shadow_ent = ((u64 *)__va(shadow_addr)) + index; | ||
| 261 | struct kvm_mmu_page *shadow_page; | 261 | struct kvm_mmu_page *shadow_page; |
| 262 | u64 shadow_pte; | 262 | u64 shadow_pte; |
| 263 | int metaphysical; | 263 | int metaphysical; |
| 264 | gfn_t table_gfn; | 264 | gfn_t table_gfn; |
| 265 | unsigned hugepage_access = 0; | 265 | unsigned hugepage_access = 0; |
| 266 | 266 | ||
| 267 | shadow_ent = ((u64 *)__va(shadow_addr)) + index; | ||
| 267 | if (is_present_pte(*shadow_ent) || is_io_pte(*shadow_ent)) { | 268 | if (is_present_pte(*shadow_ent) || is_io_pte(*shadow_ent)) { |
| 268 | if (level == PT_PAGE_TABLE_LEVEL) | 269 | if (level == PT_PAGE_TABLE_LEVEL) |
| 269 | return shadow_ent; | 270 | return shadow_ent; |
| @@ -272,22 +273,8 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
| 272 | continue; | 273 | continue; |
| 273 | } | 274 | } |
| 274 | 275 | ||
| 275 | if (level == PT_PAGE_TABLE_LEVEL) { | 276 | if (level == PT_PAGE_TABLE_LEVEL) |
| 276 | 277 | break; | |
| 277 | if (walker->level == PT_DIRECTORY_LEVEL) { | ||
| 278 | if (prev_shadow_ent) | ||
| 279 | *prev_shadow_ent |= PT_SHADOW_PS_MARK; | ||
| 280 | FNAME(set_pde)(vcpu, *guest_ent, shadow_ent, | ||
| 281 | walker->inherited_ar, | ||
| 282 | walker->gfn); | ||
| 283 | } else { | ||
| 284 | ASSERT(walker->level == PT_PAGE_TABLE_LEVEL); | ||
| 285 | FNAME(set_pte)(vcpu, *guest_ent, shadow_ent, | ||
| 286 | walker->inherited_ar, | ||
| 287 | walker->gfn); | ||
| 288 | } | ||
| 289 | return shadow_ent; | ||
| 290 | } | ||
| 291 | 278 | ||
| 292 | if (level - 1 == PT_PAGE_TABLE_LEVEL | 279 | if (level - 1 == PT_PAGE_TABLE_LEVEL |
| 293 | && walker->level == PT_DIRECTORY_LEVEL) { | 280 | && walker->level == PT_DIRECTORY_LEVEL) { |
| @@ -310,6 +297,19 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr, | |||
| 310 | *shadow_ent = shadow_pte; | 297 | *shadow_ent = shadow_pte; |
| 311 | prev_shadow_ent = shadow_ent; | 298 | prev_shadow_ent = shadow_ent; |
| 312 | } | 299 | } |
| 300 | |||
| 301 | if (walker->level == PT_DIRECTORY_LEVEL) { | ||
| 302 | if (prev_shadow_ent) | ||
| 303 | *prev_shadow_ent |= PT_SHADOW_PS_MARK; | ||
| 304 | FNAME(set_pde)(vcpu, *guest_ent, shadow_ent, | ||
| 305 | walker->inherited_ar, walker->gfn); | ||
| 306 | } else { | ||
| 307 | ASSERT(walker->level == PT_PAGE_TABLE_LEVEL); | ||
| 308 | FNAME(set_pte)(vcpu, *guest_ent, shadow_ent, | ||
| 309 | walker->inherited_ar, | ||
| 310 | walker->gfn); | ||
| 311 | } | ||
| 312 | return shadow_ent; | ||
| 313 | } | 313 | } |
| 314 | 314 | ||
| 315 | /* | 315 | /* |
