Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


added all the SVM flags, codes, masks, and addresses
[palacios.git] / palacios / include / geekos / vmcb.h
index 9e7bf58..212daaf 100644 (file)
@@ -154,8 +154,26 @@ union SVM_Instr_Intercepts {
 };
 
 
+union Guest_Control {
+  ulong_t bitmap                  PACKED;
+  struct {
+    uchar_t V_TPR                 PACKED;
+    uint_t V_IRQ      : 1         PACKED;
+    uint_t rsvd1      : 7         PACKED;
+    uint_t V_INTR_PRIO : 4        PACKED;
+    uint_t V_IGN_TPR  : 1         PACKED;
+    uint_t rsvd2      : 3         PACKED;
+    uint_t V_INTR_MASKING : 1     PACKED;
+    uint_t rsvd3      : 7         PACKED;
+    uchar_t V_INTR_VECTOR         PACKED;
+    uint_t rsvd4      : 24        PACKED;
+  } ctrls;
+};
+
+
 
 typedef struct VMCB_Control_Area {
+  // offset 0x0
   union Ctrl_Registers cr_reads        PACKED;
   union Ctrl_Registers cr_writes       PACKED;
   union Debug_Registers dr_reads       PACKED;
@@ -163,13 +181,145 @@ typedef struct VMCB_Control_Area {
   union Exception_Vectors exceptions   PACKED;
   union Instr_Intercepts instrs        PACKED;
   union SVM_Instr_Intercepts svm_instrs PACKED;
-  char rsvd1[43]                       PACKED;
+
+  uchar_t rsvd1[43]                    PACKED;
+
+  // offset 0x040
+  ullong_t IOPM_BASE_PA                PACKED;
+  ullong_t MSRPM_BASE_PA               PACKED;
+  ullong_t TSC_OFFSET                  PACKED;
+
+  ulong_t guest_ASID                   PACKED;
+  uchar_t TLB_CONTROL                  PACKED;
+
+  uchar_t rsvd2[3]                     PACKED;
+
+  union Guest_Control guest_ctrl       PACKED;
   
+  ulong_t interrupt_shadow  : 1        PACKED;
+  ulong_t rsvd3             : 31       PACKED;
+  ulong_t rsvd4                        PACKED;
+
+  ullong_t exit_code                   PACKED;
+  ullong_t exit_info1                  PACKED;
+  ullong_t exit_info2                  PACKED;
+
+  /* This could be a typo in the manual....
+   * It doesn't actually say that there is a reserved bit
+   * But it does say that the EXITINTINFO field is in bits 63-1
+   * ALL other occurances mention a 1 bit reserved field
+   */
+  ulong_t rsvd5             : 1        PACKED;
+  ullong_t exit_int_info    : 63       PACKED;
+  /* ** */
+
+  ulong_t NP_ENABLE         : 1        PACKED;
+  ullong_t rsvd6            : 63       PACKED;
+
+  uchar_t rsvd7[15]                    PACKED;
+
+  // Offset 0xA8
+  ullong_t EVENTINJ                    PACKED;
+
+
+  /* This could be a typo in the manual....
+   * It doesn't actually say that there is a reserved bit
+   * But it does say that the EXITINTINFO field is in bits 63-1
+   * ALL other occurances mention a 1 bit reserved field
+   */
+  ulong_t rsvd8             : 1        PACKED;
+  ullong_t N_CR3            : 63       PACKED;
+  /* ** */
+
+  ulong_t LBR_VIRTUALIZATION_ENABLE  : 1  PACKED;
+  ullong_t rsvd9            : 63       PACKED;
+
+} vmcb_ctrl_t;
+
+
+
+
+
+
+struct vmcb_selector {
+  ushort_t selector                   PACKED;
+  ushort_t attrib                     PACKED;
+  ulong_t  limit                      PACKED;
+  ullong_t base                       PACKED;
+}
+
+
+
+
+
+
+
+typedef struct VMCB_State_Save_Area {
+  struct vmcb_selector es            PACKED; // only lower 32 bits of base are implemented
+  struct vmcb_selector cs            PACKED; // only lower 32 bits of base are implemented
+  struct vmcb_selector ss            PACKED; // only lower 32 bits of base are implemented
+  struct vmcb_selector ds            PACKED; // only lower 32 bits of base are implemented
+  struct vmcb_selector fs            PACKED; 
+  struct vmcb_selector gs            PACKED; 
+
+  struct vmcb_selector gdtr          PACKED; // selector+attrib are reserved, only lower 16 bits of limit are implemented
+  struct vmcb_selector ldtr          PACKED; 
+  struct vmcb_selector idtr          PACKED; // selector+attrib are reserved, only lower 16 bits of limit are implemented
+  struct vmcb_selector tr            PACKED; 
+
+  uchar_t rsvd1[42]                  PACKED;
+
+  //offset 0x0cb
+  uchar_t cpl                        PACKED; // if the guest is real-mode then the CPL is forced to 0
+                                             // if the guest is virtual-mode then the CPL is forced to 3
+
+  ulong_t rsvd2                      PACKED;
+
+  // offset 0x0d0
+  ullong_t efer                      PACKED;
+
+  uchar_t rsvd3[111]                 PACKED;
+  
+  //offset 0x148
+  ullong_t cr4                       PACKED;
+  ullong_t cr3                       PACKED;
+  ullong_t cr0                       PACKED;
+  ullong_t dr7                       PACKED;
+  ullong_t dr6                       PACKED;
+  ullong_t rflags                    PACKED;
+  ullong_t rip                       PACKED;
+
+  uchar_t rsvd4[87]                  PACKED;
+  
+  //offset 0x1d8
+  ullong_t rsp                       PACKED;
+
+  uchar_t rsvd5[23]                  PACKED;
+
+  //offset 0x1f8
+  ullong_t rax                       PACKED;
+  ullong_t star                      PACKED;
+  ullong_t lstar                     PACKED;
+  ullong_t cstar                     PACKED;
+  ullong_t sfmask                    PACKED;
+  ullong_t KernelGsBase              PACKED;
+  ullong_t sysenter_cs               PACKED;
+  ullong_t sysenter_esp              PACKED;
+  ullong_t sysenter_eip              PACKED;
+  ullong_t cr2                       PACKED;
 
 
-} svm_vmcb_t;
+  uchar_t rsvd6[31]                  PACKED;
 
+  //offset 0x268
+  ullong_t g_pat                     PACKED; // Guest PAT                          -- only used if nested paging is enabled
+  ullong_t dbgctl                    PACKED; // Guest DBGCTL MSR                   -- only used if the LBR registers are virtualized
+  ullong_t br_from                   PACKED; // Guest LastBranchFromIP MSR         -- only used if the LBR registers are virtualized
+  ullong_t br_to                     PACKED; // Guest LastBranchToIP MSR           -- only used if the LBR registers are virtualized
+  ullong_t lastexcpfrom              PACKED; // Guest LastExceptionFromIP MSR      -- only used if the LBR registers are virtualized
+  ullong_t lastexcpto                PACKED; // Guest LastExceptionToIP MSR        -- only used if the LBR registers are virtualized
 
+} vmcb_saved_state_t;
 
 
 #endif