While indeed unnecessary for pv_ro_page_fault(), pv_map_ldt_shadow_page()
may run when guest user mode is active, and hence may need to switch to
the kernel page tables in order to retrieve an LDT page mapping.
Fixes: 9ff970564764 ("x86/mm: drop guest_get_eff_l1e()")
Reported-by: Manuel Bouyer <bouyer@antioche.eu.org>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Tested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Tested-by: Manuel Bouyer <bouyer@antioche.eu.org>
*/
static inline l1_pgentry_t guest_get_eff_kern_l1e(unsigned long linear)
{
+ struct vcpu *curr = current;
+ bool user_mode = !(curr->arch.flags & TF_kernel_mode);
l1_pgentry_t l1e;
- ASSERT(!paging_mode_translate(current->domain));
- ASSERT(!paging_mode_external(current->domain));
+ ASSERT(!paging_mode_translate(curr->domain));
+ ASSERT(!paging_mode_external(curr->domain));
+
+ if ( user_mode )
+ toggle_guest_pt(curr);
if ( unlikely(!__addr_ok(linear)) ||
__copy_from_user(&l1e,
sizeof(l1_pgentry_t)) )
l1e = l1e_empty();
+ if ( user_mode )
+ toggle_guest_pt(curr);
+
return l1e;
}