switch ( seg )
{
- case x86_seg_cs:
- __vmread(GUEST_CS_SELECTOR, &sel);
- __vmread(GUEST_CS_LIMIT, &limit);
- __vmread(GUEST_CS_BASE, ®->base);
- __vmread(GUEST_CS_AR_BYTES, &attr);
- break;
- case x86_seg_ds:
- __vmread(GUEST_DS_SELECTOR, &sel);
- __vmread(GUEST_DS_LIMIT, &limit);
- __vmread(GUEST_DS_BASE, ®->base);
- __vmread(GUEST_DS_AR_BYTES, &attr);
- break;
- case x86_seg_es:
- __vmread(GUEST_ES_SELECTOR, &sel);
- __vmread(GUEST_ES_LIMIT, &limit);
- __vmread(GUEST_ES_BASE, ®->base);
- __vmread(GUEST_ES_AR_BYTES, &attr);
- break;
- case x86_seg_fs:
- __vmread(GUEST_FS_SELECTOR, &sel);
- __vmread(GUEST_FS_LIMIT, &limit);
- __vmread(GUEST_FS_BASE, ®->base);
- __vmread(GUEST_FS_AR_BYTES, &attr);
- break;
- case x86_seg_gs:
- __vmread(GUEST_GS_SELECTOR, &sel);
- __vmread(GUEST_GS_LIMIT, &limit);
- __vmread(GUEST_GS_BASE, ®->base);
- __vmread(GUEST_GS_AR_BYTES, &attr);
- break;
- case x86_seg_ss:
- __vmread(GUEST_SS_SELECTOR, &sel);
- __vmread(GUEST_SS_LIMIT, &limit);
- __vmread(GUEST_SS_BASE, ®->base);
- __vmread(GUEST_SS_AR_BYTES, &attr);
+ case x86_seg_es ... x86_seg_gs:
+ __vmread(GUEST_SEG_SELECTOR(seg), &sel);
+ __vmread(GUEST_SEG_LIMIT(seg), &limit);
+ __vmread(GUEST_SEG_BASE(seg), ®->base);
+ __vmread(GUEST_SEG_AR_BYTES(seg), &attr);
break;
case x86_seg_tr:
__vmread(GUEST_TR_SELECTOR, &sel);
switch ( seg )
{
- case x86_seg_cs:
- __vmwrite(GUEST_CS_SELECTOR, sel);
- __vmwrite(GUEST_CS_LIMIT, limit);
- __vmwrite(GUEST_CS_BASE, base);
- __vmwrite(GUEST_CS_AR_BYTES, attr);
- break;
- case x86_seg_ds:
- __vmwrite(GUEST_DS_SELECTOR, sel);
- __vmwrite(GUEST_DS_LIMIT, limit);
- __vmwrite(GUEST_DS_BASE, base);
- __vmwrite(GUEST_DS_AR_BYTES, attr);
- break;
- case x86_seg_es:
- __vmwrite(GUEST_ES_SELECTOR, sel);
- __vmwrite(GUEST_ES_LIMIT, limit);
- __vmwrite(GUEST_ES_BASE, base);
- __vmwrite(GUEST_ES_AR_BYTES, attr);
- break;
- case x86_seg_fs:
- __vmwrite(GUEST_FS_SELECTOR, sel);
- __vmwrite(GUEST_FS_LIMIT, limit);
- __vmwrite(GUEST_FS_BASE, base);
- __vmwrite(GUEST_FS_AR_BYTES, attr);
- break;
- case x86_seg_gs:
- __vmwrite(GUEST_GS_SELECTOR, sel);
- __vmwrite(GUEST_GS_LIMIT, limit);
- __vmwrite(GUEST_GS_BASE, base);
- __vmwrite(GUEST_GS_AR_BYTES, attr);
- break;
- case x86_seg_ss:
- __vmwrite(GUEST_SS_SELECTOR, sel);
- __vmwrite(GUEST_SS_LIMIT, limit);
- __vmwrite(GUEST_SS_BASE, base);
- __vmwrite(GUEST_SS_AR_BYTES, attr);
+ case x86_seg_es ... x86_seg_gs:
+ __vmwrite(GUEST_SEG_SELECTOR(seg), sel);
+ __vmwrite(GUEST_SEG_LIMIT(seg), limit);
+ __vmwrite(GUEST_SEG_BASE(seg), base);
+ __vmwrite(GUEST_SEG_AR_BYTES(seg), attr);
break;
case x86_seg_tr:
__vmwrite(GUEST_TR_SELECTOR, sel);
VIRTUAL_PROCESSOR_ID = 0x00000000,
POSTED_INTR_NOTIFICATION_VECTOR = 0x00000002,
EPTP_INDEX = 0x00000004,
+#define GUEST_SEG_SELECTOR(sel) (GUEST_ES_SELECTOR + (sel) * 2) /* ES ... GS */
GUEST_ES_SELECTOR = 0x00000800,
GUEST_CS_SELECTOR = 0x00000802,
GUEST_SS_SELECTOR = 0x00000804,
IDT_VECTORING_ERROR_CODE = 0x0000440a,
VM_EXIT_INSTRUCTION_LEN = 0x0000440c,
VMX_INSTRUCTION_INFO = 0x0000440e,
+#define GUEST_SEG_LIMIT(sel) (GUEST_ES_LIMIT + (sel) * 2) /* ES ... GS */
GUEST_ES_LIMIT = 0x00004800,
GUEST_CS_LIMIT = 0x00004802,
GUEST_SS_LIMIT = 0x00004804,
GUEST_TR_LIMIT = 0x0000480e,
GUEST_GDTR_LIMIT = 0x00004810,
GUEST_IDTR_LIMIT = 0x00004812,
+#define GUEST_SEG_AR_BYTES(sel) (GUEST_ES_AR_BYTES + (sel) * 2) /* ES ... GS */
GUEST_ES_AR_BYTES = 0x00004814,
GUEST_CS_AR_BYTES = 0x00004816,
GUEST_SS_AR_BYTES = 0x00004818,
GUEST_CR0 = 0x00006800,
GUEST_CR3 = 0x00006802,
GUEST_CR4 = 0x00006804,
+#define GUEST_SEG_BASE(sel) (GUEST_ES_BASE + (sel) * 2) /* ES ... GS */
GUEST_ES_BASE = 0x00006806,
GUEST_CS_BASE = 0x00006808,
GUEST_SS_BASE = 0x0000680a,