@@ -1777,6 +1777,11 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
case p2m_access_rwx:
violation = 0;
break;
+ case p2m_access_spp:
+ printk("SPP: spp write protect: acc mode:%d\n", npfec.write_access);
+ violation = npfec.write_access;
+ rc = HVM_SPP_WRITE_PROTECTED;
+ goto out_put_gfn;
}
if ( violation )
@@ -3295,6 +3295,9 @@ static void ept_handle_violation(ept_qual_t q, paddr_t gpa)
nestedhvm_paging_mode_hap(current ) )
__vmwrite(EPT_POINTER, get_shadow_eptp(current));
return;
+ case HVM_SPP_WRITE_PROTECTED:
+ update_guest_eip();
+ return;
case -1: // This vioaltion should be injected to L1 VMM
vcpu_nestedhvm(current).nv_vmexit_pending = 1;
return;
@@ -214,6 +214,7 @@ static void ept_p2m_type_to_flags(struct p2m_domain *p2m, ept_entry_t *entry,
entry->x = 0;
break;
case p2m_access_rwx:
+ case p2m_access_spp:
break;
}
@@ -756,6 +757,7 @@ ept_spp_update_wp(struct p2m_domain *p2m, unsigned long gfn)
new_entry = atomic_read_ept_entry(ept_entry);
new_entry.spp = 1;
new_entry.w = 0;
+ new_entry.access = p2m_access_spp;
write_atomic(&(ept_entry->epte), new_entry.epte);
ept_sync_domain(p2m);
@@ -80,6 +80,8 @@ enum hvm_intblk {
#define HVM_EVENT_VECTOR_UNSET (-1)
#define HVM_EVENT_VECTOR_UPDATING (-2)
+#define HVM_SPP_WRITE_PROTECTED 2
+
/*
* The hardware virtual machine (HVM) interface abstracts away from the
* x86/x86_64 CPU virtualization assist specifics. Currently this interface
@@ -54,6 +54,7 @@ typedef enum {
p2m_access_n2rwx = 9, /* Special: page goes from N to RWX on access, *
* generates an event but does not pause the
* vcpu */
+ p2m_access_spp = 0x0d,
/* NOTE: Assumed to be only 4 bits right now on x86. */
} p2m_access_t;