• Nadav Har'El's avatar
    nEPT: Add EPT tables support to paging_tmpl.h · 37406aaa
    Nadav Har'El authored
    This is the first patch in a series which adds nested EPT support to KVM's
    nested VMX. Nested EPT means emulating EPT for an L1 guest so that L1 can use
    EPT when running a nested guest L2. When L1 uses EPT, it allows the L2 guest
    to set its own cr3 and take its own page faults without either of L0 or L1
    getting involved. This often significanlty improves L2's performance over the
    previous two alternatives (shadow page tables over EPT, and shadow page
    tables over shadow page tables).
    
    This patch adds EPT support to paging_tmpl.h.
    
    paging_tmpl.h contains the code for reading and writing page tables. The code
    for 32-bit and 64-bit tables is very similar, but not identical, so
    paging_tmpl.h is #include'd twice in mmu.c, once with PTTTYPE=32 and once
    with PTTYPE=64, and this generates the two sets of similar functions.
    
    There are subtle but important differences between the format of EPT tables
    and that of ordinary x86 64-bit page tables, so for nested EPT we need a
    third set of functions to read the guest EPT table and to write the shadow
    EPT table.
    
    So this patch adds third PTTYPE, PTTYPE_EPT, which creates functions (prefixed
    with "EPT") which correctly read and write EPT tables.
    Reviewed-by: default avatarXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
    Signed-off-by: default avatarNadav Har'El <nyh@il.ibm.com>
    Signed-off-by: default avatarJun Nakajima <jun.nakajima@intel.com>
    Signed-off-by: default avatarXinhao Xu <xinhao.xu@intel.com>
    Signed-off-by: default avatarYang Zhang <yang.z.zhang@Intel.com>
    Signed-off-by: default avatarGleb Natapov <gleb@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    37406aaa
paging_tmpl.h 25.4 KB