1 #include <geekos/vmcs.h>
2 #include <geekos/serial.h>
7 char *exception_names[] = {
13 "#BR (BOUND Range Exceeded)",
14 "#UD (Invalid Opcode)",
15 "#NM (No Math Coprocessor)",
17 "Coprocessor Segment Overrun",
19 "#NP (Segment Not Present)",
20 "#SS (Stack Segment Fault)",
21 "#GP (General Protection Fault)",
24 "#MF (Math Fault x87)",
25 "#AC (Alignment Check)",
26 "#MC (Machine Check)",
27 "#XF (SIMD FP Exception)",
266 char *exception_type_names[] = {
267 "External Interrupt",
270 "Hardware Exception",
273 "Software Exception",
278 // Ignores "HIGH" addresses - 32 bit only for now
282 #define CHK_VMCS_READ(tag, val) {if (VMCS_READ(tag, val) != 0) return -1;}
283 #define CHK_VMCS_WRITE(tag, val) {if (VMCS_WRITE(tag, val) != 0) return -1;}
287 int CopyOutVMCSGuestStateArea(struct VMCSGuestStateArea *p) {
288 CHK_VMCS_READ(GUEST_CR0, &(p->cr0));
289 CHK_VMCS_READ(GUEST_CR3, &(p->cr3));
290 CHK_VMCS_READ(GUEST_CR4, &(p->cr4));
291 CHK_VMCS_READ(GUEST_DR7, &(p->dr7));
292 CHK_VMCS_READ(GUEST_RSP, &(p->rsp));
293 CHK_VMCS_READ(GUEST_RIP, &(p->rip));
294 CHK_VMCS_READ(GUEST_RFLAGS, &(p->rflags));
295 CHK_VMCS_READ(VMCS_GUEST_CS_SELECTOR, &(p->cs.selector));
296 CHK_VMCS_READ(VMCS_GUEST_SS_SELECTOR, &(p->ss.selector));
297 CHK_VMCS_READ(VMCS_GUEST_DS_SELECTOR, &(p->ds.selector));
298 CHK_VMCS_READ(VMCS_GUEST_ES_SELECTOR, &(p->es.selector));
299 CHK_VMCS_READ(VMCS_GUEST_FS_SELECTOR, &(p->fs.selector));
300 CHK_VMCS_READ(VMCS_GUEST_GS_SELECTOR, &(p->gs.selector));
301 CHK_VMCS_READ(VMCS_GUEST_LDTR_SELECTOR, &(p->ldtr.selector));
302 CHK_VMCS_READ(VMCS_GUEST_TR_SELECTOR, &(p->tr.selector));
303 CHK_VMCS_READ(GUEST_CS_BASE, &(p->cs.baseAddr));
304 CHK_VMCS_READ(GUEST_SS_BASE, &(p->ss.baseAddr));
305 CHK_VMCS_READ(GUEST_DS_BASE, &(p->ds.baseAddr));
306 CHK_VMCS_READ(GUEST_ES_BASE, &(p->es.baseAddr));
307 CHK_VMCS_READ(GUEST_FS_BASE, &(p->fs.baseAddr));
308 CHK_VMCS_READ(GUEST_GS_BASE, &(p->gs.baseAddr));
309 CHK_VMCS_READ(GUEST_LDTR_BASE, &(p->ldtr.baseAddr));
310 CHK_VMCS_READ(GUEST_TR_BASE, &(p->tr.baseAddr));
311 CHK_VMCS_READ(GUEST_CS_LIMIT, &(p->cs.limit));
312 CHK_VMCS_READ(GUEST_SS_LIMIT, &(p->ss.limit));
313 CHK_VMCS_READ(GUEST_DS_LIMIT, &(p->ds.limit));
314 CHK_VMCS_READ(GUEST_ES_LIMIT, &(p->es.limit));
315 CHK_VMCS_READ(GUEST_FS_LIMIT, &(p->fs.limit));
316 CHK_VMCS_READ(GUEST_GS_LIMIT, &(p->gs.limit));
317 CHK_VMCS_READ(GUEST_LDTR_LIMIT, &(p->ldtr.limit));
318 CHK_VMCS_READ(GUEST_TR_LIMIT, &(p->tr.limit));
319 CHK_VMCS_READ(GUEST_CS_ACCESS, &(p->cs.access));
320 CHK_VMCS_READ(GUEST_SS_ACCESS, &(p->ss.access));
321 CHK_VMCS_READ(GUEST_DS_ACCESS, &(p->ds.access));
322 CHK_VMCS_READ(GUEST_ES_ACCESS, &(p->es.access));
323 CHK_VMCS_READ(GUEST_FS_ACCESS, &(p->fs.access));
324 CHK_VMCS_READ(GUEST_GS_ACCESS, &(p->gs.access));
325 CHK_VMCS_READ(GUEST_LDTR_ACCESS, &(p->ldtr.access));
326 CHK_VMCS_READ(GUEST_TR_ACCESS, &(p->tr.access));
327 CHK_VMCS_READ(GUEST_GDTR_BASE, &(p->gdtr.baseAddr));
328 CHK_VMCS_READ(GUEST_IDTR_BASE, &(p->idtr.baseAddr));
329 CHK_VMCS_READ(GUEST_GDTR_LIMIT, &(p->gdtr.limit));
330 CHK_VMCS_READ(GUEST_IDTR_LIMIT, &(p->idtr.limit));
331 CHK_VMCS_READ(GUEST_IA32_DEBUGCTL, &(p->dbg_ctrl));
332 CHK_VMCS_READ(GUEST_IA32_DEBUGCTL_HIGH, ((char *)&(p->dbg_ctrl)) + 4);
333 CHK_VMCS_READ(GUEST_IA32_SYSENTER_CS, &(p->sysenter_cs));
334 CHK_VMCS_READ(GUEST_IA32_SYSENTER_ESP, &(p->sysenter_esp));
335 CHK_VMCS_READ(GUEST_IA32_SYSENTER_EIP, &(p->sysenter_eip));
336 CHK_VMCS_READ(GUEST_SMBASE, &(p->smbase));
338 CHK_VMCS_READ(GUEST_ACTIVITY_STATE, &(p->activity));
339 CHK_VMCS_READ(GUEST_INT_STATE, &(p->interrupt_state));
340 CHK_VMCS_READ(GUEST_PENDING_DEBUG_EXCS, &(p->pending_dbg_exceptions));
341 CHK_VMCS_READ(VMCS_LINK_PTR, &(p->vmcs_link));
342 CHK_VMCS_READ(VMCS_LINK_PTR_HIGH, ((char *)&(p->vmcs_link)) + 4);
347 int CopyInVMCSGuestStateArea(struct VMCSGuestStateArea *p) {
348 CHK_VMCS_WRITE(GUEST_CR0, &(p->cr0));
349 CHK_VMCS_WRITE(GUEST_CR3, &(p->cr3));
350 CHK_VMCS_WRITE(GUEST_CR4, &(p->cr4));
351 CHK_VMCS_WRITE(GUEST_DR7, &(p->dr7));
352 CHK_VMCS_WRITE(GUEST_RSP, &(p->rsp));
353 CHK_VMCS_WRITE(GUEST_RIP, &(p->rip));
354 CHK_VMCS_WRITE(GUEST_RFLAGS, &(p->rflags));
355 CHK_VMCS_WRITE(VMCS_GUEST_CS_SELECTOR, &(p->cs.selector));
356 CHK_VMCS_WRITE(VMCS_GUEST_SS_SELECTOR, &(p->ss.selector));
357 CHK_VMCS_WRITE(VMCS_GUEST_DS_SELECTOR, &(p->ds.selector));
358 CHK_VMCS_WRITE(VMCS_GUEST_ES_SELECTOR, &(p->es.selector));
359 CHK_VMCS_WRITE(VMCS_GUEST_FS_SELECTOR, &(p->fs.selector));
360 CHK_VMCS_WRITE(VMCS_GUEST_GS_SELECTOR, &(p->gs.selector));
361 CHK_VMCS_WRITE(VMCS_GUEST_LDTR_SELECTOR, &(p->ldtr.selector));
362 CHK_VMCS_WRITE(VMCS_GUEST_TR_SELECTOR, &(p->tr.selector));
363 CHK_VMCS_WRITE(GUEST_CS_BASE, &(p->cs.baseAddr));
364 CHK_VMCS_WRITE(GUEST_SS_BASE, &(p->ss.baseAddr));
365 CHK_VMCS_WRITE(GUEST_DS_BASE, &(p->ds.baseAddr));
366 CHK_VMCS_WRITE(GUEST_ES_BASE, &(p->es.baseAddr));
367 CHK_VMCS_WRITE(GUEST_FS_BASE, &(p->fs.baseAddr));
368 CHK_VMCS_WRITE(GUEST_GS_BASE, &(p->gs.baseAddr));
369 CHK_VMCS_WRITE(GUEST_LDTR_BASE, &(p->ldtr.baseAddr));
370 CHK_VMCS_WRITE(GUEST_TR_BASE, &(p->tr.baseAddr));
371 CHK_VMCS_WRITE(GUEST_CS_LIMIT, &(p->cs.limit));
372 CHK_VMCS_WRITE(GUEST_SS_LIMIT, &(p->ss.limit));
373 CHK_VMCS_WRITE(GUEST_DS_LIMIT, &(p->ds.limit));
374 CHK_VMCS_WRITE(GUEST_ES_LIMIT, &(p->es.limit));
375 CHK_VMCS_WRITE(GUEST_FS_LIMIT, &(p->fs.limit));
376 CHK_VMCS_WRITE(GUEST_GS_LIMIT, &(p->gs.limit));
377 CHK_VMCS_WRITE(GUEST_LDTR_LIMIT, &(p->ldtr.limit));
378 CHK_VMCS_WRITE(GUEST_TR_LIMIT, &(p->tr.limit));
379 CHK_VMCS_WRITE(GUEST_CS_ACCESS, &(p->cs.access));
380 CHK_VMCS_WRITE(GUEST_SS_ACCESS, &(p->ss.access));
381 CHK_VMCS_WRITE(GUEST_DS_ACCESS, &(p->ds.access));
382 CHK_VMCS_WRITE(GUEST_ES_ACCESS, &(p->es.access));
383 CHK_VMCS_WRITE(GUEST_FS_ACCESS, &(p->fs.access));
384 CHK_VMCS_WRITE(GUEST_GS_ACCESS, &(p->gs.access));
385 CHK_VMCS_WRITE(GUEST_LDTR_ACCESS, &(p->ldtr.access));
386 CHK_VMCS_WRITE(GUEST_TR_ACCESS, &(p->tr.access));
387 CHK_VMCS_WRITE(GUEST_GDTR_BASE, &(p->gdtr.baseAddr));
388 CHK_VMCS_WRITE(GUEST_IDTR_BASE, &(p->idtr.baseAddr));
389 CHK_VMCS_WRITE(GUEST_GDTR_LIMIT, &(p->gdtr.limit));
390 CHK_VMCS_WRITE(GUEST_IDTR_LIMIT, &(p->idtr.limit));
391 CHK_VMCS_WRITE(GUEST_IA32_DEBUGCTL, &(p->dbg_ctrl));
392 CHK_VMCS_WRITE(GUEST_IA32_DEBUGCTL_HIGH, ((char *)&(p->dbg_ctrl)) + 4);
393 CHK_VMCS_WRITE(GUEST_IA32_SYSENTER_CS, &(p->sysenter_cs));
394 CHK_VMCS_WRITE(GUEST_IA32_SYSENTER_ESP, &(p->sysenter_esp));
395 CHK_VMCS_WRITE(GUEST_IA32_SYSENTER_EIP, &(p->sysenter_eip));
396 CHK_VMCS_WRITE(GUEST_SMBASE, &(p->smbase));
398 CHK_VMCS_WRITE(GUEST_ACTIVITY_STATE, &(p->activity));
399 CHK_VMCS_WRITE(GUEST_INT_STATE, &(p->interrupt_state));
400 CHK_VMCS_WRITE(GUEST_PENDING_DEBUG_EXCS, &(p->pending_dbg_exceptions));
401 CHK_VMCS_WRITE(VMCS_LINK_PTR, &(p->vmcs_link));
402 CHK_VMCS_WRITE(VMCS_LINK_PTR_HIGH, ((char *)&(p->vmcs_link)) + 4);
408 int CopyOutVMCSHostStateArea(struct VMCSHostStateArea *p) {
409 CHK_VMCS_READ(HOST_CR0, &(p->cr0));
410 CHK_VMCS_READ(HOST_CR3, &(p->cr3));
411 CHK_VMCS_READ(HOST_CR4, &(p->cr4));
412 CHK_VMCS_READ(HOST_RSP, &(p->rsp));
413 CHK_VMCS_READ(HOST_RIP, &(p->rip));
414 CHK_VMCS_READ(VMCS_HOST_CS_SELECTOR, &(p->csSelector));
415 CHK_VMCS_READ(VMCS_HOST_SS_SELECTOR, &(p->ssSelector));
416 CHK_VMCS_READ(VMCS_HOST_DS_SELECTOR, &(p->dsSelector));
417 CHK_VMCS_READ(VMCS_HOST_ES_SELECTOR, &(p->esSelector));
418 CHK_VMCS_READ(VMCS_HOST_FS_SELECTOR, &(p->fsSelector));
419 CHK_VMCS_READ(VMCS_HOST_GS_SELECTOR, &(p->gsSelector));
420 CHK_VMCS_READ(VMCS_HOST_TR_SELECTOR, &(p->trSelector));
421 CHK_VMCS_READ(HOST_FS_BASE, &(p->fsBaseAddr));
422 CHK_VMCS_READ(HOST_GS_BASE, &(p->gsBaseAddr));
423 CHK_VMCS_READ(HOST_TR_BASE, &(p->trBaseAddr));
424 CHK_VMCS_READ(HOST_GDTR_BASE, &(p->gdtrBaseAddr));
425 CHK_VMCS_READ(HOST_IDTR_BASE, &(p->idtrBaseAddr));
426 CHK_VMCS_READ(HOST_IA32_SYSENTER_CS, &(p->sysenter_cs));
427 CHK_VMCS_READ(HOST_IA32_SYSENTER_ESP, &(p->sysenter_esp));
428 CHK_VMCS_READ(HOST_IA32_SYSENTER_EIP, &(p->sysenter_eip));
434 int CopyInVMCSHostStateArea(struct VMCSHostStateArea *p) {
435 CHK_VMCS_WRITE(HOST_CR0, &(p->cr0));
436 CHK_VMCS_WRITE(HOST_CR3, &(p->cr3));
437 CHK_VMCS_WRITE(HOST_CR4, &(p->cr4));
438 CHK_VMCS_WRITE(HOST_RSP, &(p->rsp));
439 CHK_VMCS_WRITE(HOST_RIP, &(p->rip));
440 CHK_VMCS_WRITE(VMCS_HOST_CS_SELECTOR, &(p->csSelector));
441 CHK_VMCS_WRITE(VMCS_HOST_SS_SELECTOR, &(p->ssSelector));
442 CHK_VMCS_WRITE(VMCS_HOST_DS_SELECTOR, &(p->dsSelector));
443 CHK_VMCS_WRITE(VMCS_HOST_ES_SELECTOR, &(p->esSelector));
444 CHK_VMCS_WRITE(VMCS_HOST_FS_SELECTOR, &(p->fsSelector));
445 CHK_VMCS_WRITE(VMCS_HOST_GS_SELECTOR, &(p->gsSelector));
446 CHK_VMCS_WRITE(VMCS_HOST_TR_SELECTOR, &(p->trSelector));
447 CHK_VMCS_WRITE(HOST_FS_BASE, &(p->fsBaseAddr));
448 CHK_VMCS_WRITE(HOST_GS_BASE, &(p->gsBaseAddr));
449 CHK_VMCS_WRITE(HOST_TR_BASE, &(p->trBaseAddr));
450 CHK_VMCS_WRITE(HOST_GDTR_BASE, &(p->gdtrBaseAddr));
451 CHK_VMCS_WRITE(HOST_IDTR_BASE, &(p->idtrBaseAddr));
452 CHK_VMCS_WRITE(HOST_IA32_SYSENTER_CS, &(p->sysenter_cs));
453 CHK_VMCS_WRITE(HOST_IA32_SYSENTER_ESP, &(p->sysenter_esp));
454 CHK_VMCS_WRITE(HOST_IA32_SYSENTER_EIP, &(p->sysenter_eip));
459 int CopyOutVMCSExitCtrlFields(struct VMCSExitCtrlFields *p)
461 CHK_VMCS_READ(VM_EXIT_CTRLS,&(p->exitCtrls));
462 CHK_VMCS_READ(VM_EXIT_MSR_STORE_COUNT,&(p->msrStoreCount));
463 CHK_VMCS_READ(VM_EXIT_MSR_STORE_ADDR,&(p->msrStoreAddr));
464 CHK_VMCS_READ(VM_EXIT_MSR_LOAD_COUNT,&(p->msrLoadCount));
465 CHK_VMCS_READ(VM_EXIT_MSR_LOAD_ADDR,&(p->msrLoadAddr));
469 int CopyInVMCSExitCtrlFields(struct VMCSExitCtrlFields *p)
471 CHK_VMCS_WRITE(VM_EXIT_CTRLS,&(p->exitCtrls));
472 CHK_VMCS_WRITE(VM_EXIT_MSR_STORE_COUNT,&(p->msrStoreCount));
473 CHK_VMCS_WRITE(VM_EXIT_MSR_STORE_ADDR,&(p->msrStoreAddr));
474 CHK_VMCS_WRITE(VM_EXIT_MSR_LOAD_COUNT,&(p->msrLoadCount));
475 CHK_VMCS_WRITE(VM_EXIT_MSR_LOAD_ADDR,&(p->msrLoadAddr));
480 int CopyOutVMCSEntryCtrlFields(struct VMCSEntryCtrlFields *p)
482 CHK_VMCS_READ(VM_ENTRY_CTRLS,&(p->entryCtrls));
483 CHK_VMCS_READ(VM_ENTRY_MSR_LOAD_COUNT,&(p->msrLoadCount));
484 CHK_VMCS_READ(VM_ENTRY_MSR_LOAD_ADDR,&(p->msrLoadAddr));
485 CHK_VMCS_READ(VM_ENTRY_INT_INFO_FIELD,&(p->intInfo));
486 CHK_VMCS_READ(VM_ENTRY_EXCEPTION_ERROR,&(p->exceptionErrorCode));
487 CHK_VMCS_READ(VM_ENTRY_INSTR_LENGTH,&(p->instrLength));
491 int CopyInVMCSEntryCtrlFields(struct VMCSEntryCtrlFields *p)
493 CHK_VMCS_WRITE(VM_ENTRY_CTRLS,&(p->entryCtrls));
494 CHK_VMCS_WRITE(VM_ENTRY_MSR_LOAD_COUNT,&(p->msrLoadCount));
495 CHK_VMCS_WRITE(VM_ENTRY_MSR_LOAD_ADDR,&(p->msrLoadAddr));
496 CHK_VMCS_WRITE(VM_ENTRY_INT_INFO_FIELD,&(p->intInfo));
497 CHK_VMCS_WRITE(VM_ENTRY_EXCEPTION_ERROR,&(p->exceptionErrorCode));
498 CHK_VMCS_WRITE(VM_ENTRY_INSTR_LENGTH,&(p->instrLength));
502 int CopyOutVMCSExitInfoFields(struct VMCSExitInfoFields *p) {
503 CHK_VMCS_READ(EXIT_REASON,&(p->reason));
504 CHK_VMCS_READ(EXIT_QUALIFICATION,&(p->qualification));
505 CHK_VMCS_READ(VM_EXIT_INT_INFO,&(p->intInfo));
506 CHK_VMCS_READ(VM_EXIT_INT_ERROR,&(p->intErrorCode));
507 CHK_VMCS_READ(IDT_VECTOR_INFO,&(p->idtVectorInfo));
508 CHK_VMCS_READ(IDT_VECTOR_ERROR,&(p->idtVectorErrorCode));
509 CHK_VMCS_READ(VM_EXIT_INSTR_LENGTH,&(p->instrLength));
510 CHK_VMCS_READ(GUEST_LINEAR_ADDR,&(p->guestLinearAddr));
511 CHK_VMCS_READ(VMX_INSTR_INFO,&(p->instrInfo));
512 CHK_VMCS_READ(IO_RCX,&(p->ioRCX));
513 CHK_VMCS_READ(IO_RSI,&(p->ioRSI));
514 CHK_VMCS_READ(IO_RDI,&(p->ioRDI));
515 CHK_VMCS_READ(IO_RIP,&(p->ioRIP));
516 CHK_VMCS_READ(VM_INSTR_ERROR,&(p->instrErrorField));
521 int CopyOutVMCSExecCtrlFields(struct VMCSExecCtrlFields *p)
523 CHK_VMCS_READ(PIN_VM_EXEC_CTRLS,&(p->pinCtrls));
524 CHK_VMCS_READ(PROC_VM_EXEC_CTRLS,&(p->procCtrls));
525 CHK_VMCS_READ(EXCEPTION_BITMAP,&(p->execBitmap));
526 CHK_VMCS_READ(PAGE_FAULT_ERROR_MASK,&(p->pageFaultErrorMask));
527 CHK_VMCS_READ(PAGE_FAULT_ERROR_MATCH,&(p->pageFaultErrorMatch));
528 CHK_VMCS_READ(IO_BITMAP_A_ADDR,&(p->ioBitmapA));
529 CHK_VMCS_READ(IO_BITMAP_B_ADDR,&(p->ioBitmapB));
530 CHK_VMCS_READ(TSC_OFFSET,&(p->tscOffset));
531 CHK_VMCS_READ(CR0_GUEST_HOST_MASK,&(p->cr0GuestHostMask));
532 CHK_VMCS_READ(CR0_READ_SHADOW,&(p->cr0ReadShadow));
533 CHK_VMCS_READ(CR4_GUEST_HOST_MASK,&(p->cr4GuestHostMask));
534 CHK_VMCS_READ(CR4_READ_SHADOW,&(p->cr4ReadShadow));
535 CHK_VMCS_READ(CR3_TARGET_COUNT, &(p->cr3TargetCount));
536 CHK_VMCS_READ(CR3_TARGET_VALUE_0, &(p->cr3TargetValue0));
537 CHK_VMCS_READ(CR3_TARGET_VALUE_1, &(p->cr3TargetValue1));
538 CHK_VMCS_READ(CR3_TARGET_VALUE_2, &(p->cr3TargetValue2));
539 CHK_VMCS_READ(CR3_TARGET_VALUE_3, &(p->cr3TargetValue3));
540 CHK_VMCS_READ(VIRT_APIC_PAGE_ADDR, &(p->virtApicPageAddr));
541 CHK_VMCS_READ(TPR_THRESHOLD, &(p->tprThreshold));
542 CHK_VMCS_READ(MSR_BITMAPS, &(p->MSRBitmapsBaseAddr));
543 CHK_VMCS_READ(VMCS_EXEC_PTR,&(p->vmcsExecPtr));
548 int CopyInVMCSExecCtrlFields(struct VMCSExecCtrlFields *p)
550 CHK_VMCS_WRITE(PIN_VM_EXEC_CTRLS,&(p->pinCtrls));
551 CHK_VMCS_WRITE(PROC_VM_EXEC_CTRLS,&(p->procCtrls));
552 CHK_VMCS_WRITE(EXCEPTION_BITMAP,&(p->execBitmap));
553 CHK_VMCS_WRITE(PAGE_FAULT_ERROR_MASK,&(p->pageFaultErrorMask));
554 CHK_VMCS_WRITE(PAGE_FAULT_ERROR_MATCH,&(p->pageFaultErrorMatch));
555 CHK_VMCS_WRITE(IO_BITMAP_A_ADDR,&(p->ioBitmapA));
556 CHK_VMCS_WRITE(IO_BITMAP_B_ADDR,&(p->ioBitmapB));
557 CHK_VMCS_WRITE(TSC_OFFSET,&(p->tscOffset));
558 CHK_VMCS_WRITE(CR0_GUEST_HOST_MASK,&(p->cr0GuestHostMask));
559 CHK_VMCS_WRITE(CR0_READ_SHADOW,&(p->cr0ReadShadow));
560 CHK_VMCS_WRITE(CR4_GUEST_HOST_MASK,&(p->cr4GuestHostMask));
561 CHK_VMCS_WRITE(CR4_READ_SHADOW,&(p->cr4ReadShadow));
562 CHK_VMCS_WRITE(CR3_TARGET_COUNT, &(p->cr3TargetCount));
563 CHK_VMCS_WRITE(CR3_TARGET_VALUE_0, &(p->cr3TargetValue0));
564 CHK_VMCS_WRITE(CR3_TARGET_VALUE_1, &(p->cr3TargetValue1));
565 CHK_VMCS_WRITE(CR3_TARGET_VALUE_2, &(p->cr3TargetValue2));
566 CHK_VMCS_WRITE(CR3_TARGET_VALUE_3, &(p->cr3TargetValue3));
567 CHK_VMCS_WRITE(VIRT_APIC_PAGE_ADDR, &(p->virtApicPageAddr));
568 CHK_VMCS_WRITE(TPR_THRESHOLD, &(p->tprThreshold));
569 CHK_VMCS_WRITE(MSR_BITMAPS, &(p->MSRBitmapsBaseAddr));
570 CHK_VMCS_WRITE(VMCS_EXEC_PTR,&(p->vmcsExecPtr));
575 int CopyOutVMCSData(struct VMCSData *p) {
576 if (CopyOutVMCSGuestStateArea(&(p->guestStateArea)) != 0) {
579 if (CopyOutVMCSHostStateArea(&(p->hostStateArea)) != 0) {
582 if (CopyOutVMCSExecCtrlFields(&(p->execCtrlFields)) != 0) {
585 if (CopyOutVMCSExitCtrlFields(&(p->exitCtrlFields)) != 0) {
588 if (CopyOutVMCSEntryCtrlFields(&(p->entryCtrlFields)) != 0) {
591 if (CopyOutVMCSExitInfoFields(&(p->exitInfoFields)) != 0) {
598 int CopyInVMCSData(struct VMCSData *p) {
599 if (CopyInVMCSGuestStateArea(&(p->guestStateArea)) != 0) {
602 if (CopyInVMCSHostStateArea(&(p->hostStateArea)) != 0) {
605 if (CopyInVMCSExecCtrlFields(&(p->execCtrlFields)) != 0) {
608 if (CopyInVMCSExitCtrlFields(&(p->exitCtrlFields)) != 0) {
611 if (CopyInVMCSEntryCtrlFields(&(p->entryCtrlFields)) != 0) {
618 void SerialPrint_VMX_Regs(struct VMXRegs * regs) {
619 SerialPrint("==>VMX Register values:\n");
620 SerialPrint("EAX: %x\n", regs->eax);
621 SerialPrint("ECX: %x\n", regs->ecx);
622 SerialPrint("EDX: %x\n", regs->edx);
623 SerialPrint("EBX: %x\n", regs->ebx);
624 SerialPrint("ESP: %x\n", regs->esp);
625 SerialPrint("EBP: %x\n", regs->ebp);
626 SerialPrint("ESI: %x\n", regs->esi);
627 SerialPrint("EDI: %x\n", regs->edi);
632 void SerialPrint_VMCSSegment(char * segname, struct VMCSSegment * seg, int abbr) {
633 SerialPrint("Segment: %s\n", segname);
635 SerialPrint("\tSelector: %x\n", (uint_t)seg->selector);
636 SerialPrint("\tAccess: %x\n", *(uint_t*)&(seg->access));
638 SerialPrint("\tBase Addr: %x\n", (uint_t)seg->baseAddr);
639 SerialPrint("\tLimit: %x\n", (uint_t)seg->limit);
644 void SerialPrint_VMCSGuestStateArea(struct VMCSGuestStateArea * guestState) {
645 SerialPrint("==>Guest State Area\n");
646 SerialPrint("==>==> Guest Register State\n");
647 SerialPrint("GUEST_CR0: %x\n",(uint_t) guestState->cr0);
648 SerialPrint("GUEST_CR3: %x\n",(uint_t)guestState->cr3);
649 SerialPrint("GUEST_CR4: %x\n",(uint_t)guestState->cr4);
650 SerialPrint("GUEST_DR7: %x\n",(uint_t)guestState->dr7);
651 SerialPrint("GUEST_RSP: %x\n",(uint_t)guestState->rsp);
652 SerialPrint("GUEST_RIP: %x\n",(uint_t)guestState->rip);
653 SerialPrint("GUEST_RFLAGS: %x\n",(uint_t)guestState->rflags);
655 SerialPrint_VMCSSegment("Guest CS", &(guestState->cs), 0);
656 SerialPrint_VMCSSegment("Guest SS", &(guestState->ss), 0);
657 SerialPrint_VMCSSegment("Guest DS",&(guestState->ds), 0);
658 SerialPrint_VMCSSegment("Guest ES", &(guestState->es), 0);
659 SerialPrint_VMCSSegment("Guest FS", &(guestState->fs), 0);
660 SerialPrint_VMCSSegment("Guest GS", &(guestState->gs), 0);
661 SerialPrint_VMCSSegment("Guest LDTR", &(guestState->ldtr), 0);
662 SerialPrint_VMCSSegment("Guest TR", &(guestState->tr), 0);
663 SerialPrint_VMCSSegment("Guest GDTR", &(guestState->gdtr), 1);
664 SerialPrint_VMCSSegment("Guest IDTR", &(guestState->idtr), 1);
667 SerialPrint("GUEST_IA32_DEBUGCTL: %x\n",(uint_t)(guestState->dbg_ctrl & 0xffffffff));
668 SerialPrint("GUEST_IA32_DEBUGCTL_HIGH: %x\n",(uint_t)(guestState->dbg_ctrl >> 32) & 0xffffffff);
669 SerialPrint("GUEST_IA32_SYSENTER_CS: %x\n",guestState->sysenter_cs);
670 SerialPrint("GUEST_IA32_SYSENTER_ESP: %x\n",(uint_t)guestState->sysenter_esp);
671 SerialPrint("GUEST_IA32_SYSENTER_EIP: %x\n",(uint_t)guestState->sysenter_eip);
672 SerialPrint("GUEST_SMBASE: %x\n", (uint_t)guestState->smbase);
674 SerialPrint("==>==> Guest Non-Register State\n");
675 SerialPrint("GUEST_ACTIVITY_STATE: %x\n", (uint_t)guestState->activity);
676 SerialPrint("GUEST_INT_STATE: %x\n", (uint_t)guestState->interrupt_state);
677 SerialPrint("GUEST_PENDING_DEBUG_EXCS: %x\n", (uint_t)guestState->pending_dbg_exceptions);
678 SerialPrint("VMCS_LINK_PTR: %x\n", (uint_t)guestState->vmcs_link & 0xffffffff);
679 SerialPrint("VMCS_LINK_PTR_HIGH: %x\n", (uint_t)(guestState->vmcs_link >> 32) & 0xffffffff);
683 void SerialPrint_VMCSHostStateArea(struct VMCSHostStateArea * hostState) {
684 SerialPrint("\n==> Host State Area\n");
685 SerialPrint("HOST_CR0: %x\n", (uint_t)hostState->cr0);
686 SerialPrint("HOST_CR3: %x\n", (uint_t)hostState->cr3);
687 SerialPrint("HOST_CR4: %x\n", (uint_t)hostState->cr4);
688 SerialPrint("HOST_RSP: %x\n", (uint_t)hostState->rsp);
689 SerialPrint("HOST_RIP: %x\n", (uint_t)hostState->rip);
690 SerialPrint("VMCS_HOST_CS_SELECTOR: %x\n", (uint_t)hostState->csSelector);
691 SerialPrint("VMCS_HOST_SS_SELECTOR: %x\n", (uint_t)hostState->ssSelector);
692 SerialPrint("VMCS_HOST_DS_SELECTOR: %x\n", (uint_t)hostState->dsSelector);
693 SerialPrint("VMCS_HOST_ES_SELECTOR: %x\n", (uint_t)hostState->esSelector);
694 SerialPrint("VMCS_HOST_FS_SELECTOR: %x\n", (uint_t)hostState->fsSelector);
695 SerialPrint("VMCS_HOST_GS_SELECTOR: %x\n", (uint_t)hostState->gsSelector);
696 SerialPrint("VMCS_HOST_TR_SELECTOR: %x\n", (uint_t)hostState->trSelector);
697 SerialPrint("HOST_FS_BASE: %x\n", (uint_t)hostState->fsBaseAddr);
698 SerialPrint("HOST_GS_BASE: %x\n", (uint_t)hostState->gsBaseAddr);
699 SerialPrint("HOST_TR_BASE: %x\n", (uint_t)hostState->trBaseAddr);
700 SerialPrint("HOST_GDTR_BASE: %x\n", (uint_t)hostState->gdtrBaseAddr);
701 SerialPrint("HOST_IDTR_BASE: %x\n", (uint_t)hostState->idtrBaseAddr);
702 SerialPrint("HOST_IA32_SYSENTER_CS: %x\n", (uint_t)hostState->sysenter_cs);
703 SerialPrint("HOST_IA32_SYSENTER_ESP: %x\n", (uint_t)hostState->sysenter_esp);
704 SerialPrint("HOST_IA32_SYSENTER_EIP: %x\n", (uint_t)hostState->sysenter_eip);
707 void SerialPrint_VMCSExecCtrlFields(struct VMCSExecCtrlFields * execCtrls) {
708 SerialPrint("\n==> VM-Execution Controls:\n");
709 SerialPrint("PIN_VM_EXEC_CTRLS: %x\n", (uint_t) execCtrls->pinCtrls);
710 SerialPrint("PROC_VM_EXEC_CTRLS: %x\n", (uint_t) execCtrls->procCtrls);
711 SerialPrint("EXCEPTION_BITMAP: %x\n", (uint_t) execCtrls->execBitmap);
712 SerialPrint("PAGE_FAULT_ERROR_MASK: %x\n", (uint_t) execCtrls->pageFaultErrorMask);
713 SerialPrint("PAGE_FAULT_ERROR_MATCH: %x\n", (uint_t) execCtrls->pageFaultErrorMatch);
714 SerialPrint("IO_BITMAP_A_ADDR: %x\n", (uint_t) execCtrls->ioBitmapA);
715 // SerialPrint("IO_BITMAP_A_ADDR_HIGH: %x\n", (uint_t) execCtrls->);
716 SerialPrint("IO_BITMAP_B_ADDR: %x\n", (uint_t) execCtrls->ioBitmapB);
717 // SerialPrint("IO_BITMAP_B_ADDR_HIGH: %x\n", (uint_t) execCtrls->);
718 SerialPrint("TSC_OFFSET: %x\n", (uint_t) execCtrls->tscOffset & 0xffffffff);
719 SerialPrint("TSC_OFFSET_HIGH: %x\n", (uint_t) (execCtrls->tscOffset >> 32) & 0xffffffff);
720 SerialPrint("CR0_GUEST_HOST_MASK: %x\n", (uint_t) execCtrls->cr0GuestHostMask);
721 SerialPrint("CR0_READ_SHADOW: %x\n", (uint_t) execCtrls->cr0ReadShadow);
722 SerialPrint("CR4_GUEST_HOST_MASK: %x\n", (uint_t) execCtrls->cr4GuestHostMask);
723 SerialPrint("CR4_READ_SHADOW: %x\n", (uint_t) execCtrls->cr4ReadShadow);
724 SerialPrint("CR3_TARGET_COUNT: %x\n", (uint_t) execCtrls->cr3TargetCount);
725 SerialPrint("CR3_TARGET_VALUE_0: %x\n", (uint_t) execCtrls->cr3TargetValue0);
726 SerialPrint("CR3_TARGET_VALUE_1: %x\n", (uint_t) execCtrls->cr3TargetValue1);
727 SerialPrint("CR3_TARGET_VALUE_2: %x\n", (uint_t) execCtrls->cr3TargetValue2);
728 SerialPrint("CR3_TARGET_VALUE_3: %x\n", (uint_t) execCtrls->cr3TargetValue3);
729 SerialPrint("VIRT_APIC_PAGE_ADDR: %x\n", (uint_t) execCtrls->virtApicPageAddr & 0xffffffff);
730 SerialPrint("VIRT_APIC_PAGE_ADDR_HIGH: %x\n", (uint_t) (execCtrls->virtApicPageAddr >> 32) & 0xffffffff);
731 SerialPrint("TPR_THRESHOLD: %x\n", (uint_t) execCtrls->tprThreshold);
732 SerialPrint("MSR_BITMAPS: %x\n", (uint_t) execCtrls->MSRBitmapsBaseAddr & 0xffffffff);
733 SerialPrint("MSR_BITMAPS_HIGH: %x\n", (uint_t) (execCtrls->MSRBitmapsBaseAddr >> 32) & 0xffffffff);
734 SerialPrint("VMCS_EXEC_PTR: %x\n", (uint_t) execCtrls->vmcsExecPtr & 0xffffffff);
735 SerialPrint("VMCS_EXEC_PTR_HIGH: %x\n", (uint_t) (execCtrls->vmcsExecPtr >> 32) & 0xffffffff);
738 void SerialPrint_VMCSExitCtrlFields(struct VMCSExitCtrlFields * exitCtrls) {
739 SerialPrint("\n==> VM Exit Controls\n");
740 SerialPrint("VM_EXIT_CTRLS: %x\n", (uint_t) exitCtrls->exitCtrls);
741 SerialPrint("VM_EXIT_MSR_STORE_COUNT: %x\n", (uint_t) exitCtrls->msrStoreCount);
742 SerialPrint("VM_EXIT_MSR_STORE_ADDR: %x\n", (uint_t) exitCtrls->msrStoreAddr & 0xffffffff);
743 SerialPrint("VM_EXIT_MSR_STORE_ADDR_HIGH: %x\n", (uint_t) (exitCtrls->msrStoreAddr >> 32) & 0xffffffff);
744 SerialPrint("VM_EXIT_MSR_LOAD_COUNT: %x\n", (uint_t) exitCtrls->msrLoadCount);
745 SerialPrint("VM_EXIT_MSR_LOAD_ADDR: %x\n", (uint_t) exitCtrls->msrLoadAddr & 0xffffffff);
746 SerialPrint("VM_EXIT_MSR_LOAD_ADDR_HIGH: %x\n", (uint_t) (exitCtrls->msrLoadAddr >> 32) & 0xffffffff);
749 void SerialPrint_VMCSEntryCtrlFields(struct VMCSEntryCtrlFields * entryCtrls) {
750 SerialPrint("\n==> VM Entry Controls\n");
751 SerialPrint("VM_ENTRY_CTRLS: %x\n", (uint_t) entryCtrls->entryCtrls);
752 SerialPrint("VM_ENTRY_MSR_LOAD_COUNT: %x\n", (uint_t) entryCtrls->msrLoadCount);
753 SerialPrint("VM_ENTRY_MSR_LOAD_ADDR: %x\n", (uint_t) entryCtrls->msrLoadAddr & 0xffffffff);
754 SerialPrint("VM_ENTRY_MSR_LOAD_ADDR_HIGH: %x\n", (uint_t) (entryCtrls->msrLoadAddr >> 32) & 0xffffffff);
755 SerialPrint("VM_ENTRY_INT_INFO_FIELD: %x\n", (uint_t) entryCtrls->intInfo);
756 SerialPrint("VM_ENTRY_EXCEPTION_ERROR: %x\n", (uint_t) entryCtrls->exceptionErrorCode);
757 SerialPrint("VM_ENTRY_INSTR_LENGTH: %x\n", (uint_t) entryCtrls->instrLength);
760 void SerialPrint_VMCSExitInfoFields(struct VMCSExitInfoFields * exitInfo) {
761 SerialPrint("\n==> VM Exit Info\n");
762 SerialPrint("EXIT_REASON: %x\n", (uint_t) exitInfo->reason);
763 SerialPrint("EXIT_QUALIFICATION: %x\n", (uint_t) exitInfo->qualification);
764 SerialPrint("VM_EXIT_INT_INFO: %x\n", (uint_t) exitInfo->intInfo);
765 SerialPrint("VM_EXIT_INT_ERROR: %x\n", (uint_t) exitInfo->intErrorCode);
766 SerialPrint("IDT_VECTOR_INFO: %x\n", (uint_t) exitInfo->idtVectorInfo);
767 SerialPrint("IDT_VECTOR_ERROR: %x\n", (uint_t) exitInfo->idtVectorErrorCode);
768 SerialPrint("VM_EXIT_INSTR_LENGTH: %x\n", (uint_t) exitInfo->instrLength);
769 SerialPrint("GUEST_LINEAR_ADDR: %x\n", (uint_t) exitInfo->guestLinearAddr);
770 SerialPrint("VMX_INSTR_INFO: %x\n", (uint_t) exitInfo->instrInfo);
771 SerialPrint("IO_RCX: %x\n", (uint_t) exitInfo->ioRCX);
772 SerialPrint("IO_RSI: %x\n", (uint_t) exitInfo->ioRSI);
773 SerialPrint("IO_RDI: %x\n", (uint_t) exitInfo->ioRDI);
774 SerialPrint("IO_RIP: %x\n", (uint_t) exitInfo->ioRIP);
775 SerialPrint("VM_INSTR_ERROR: %x\n", (uint_t) exitInfo->instrErrorField);
779 void SerialPrint_VMCSData(struct VMCSData * vmcs) {
780 SerialPrint("VMCSData Structure\n");
782 SerialPrint_VMCSGuestStateArea(&(vmcs->guestStateArea));
783 SerialPrint_VMCSHostStateArea(&(vmcs->hostStateArea));
784 SerialPrint_VMCSExecCtrlFields(&(vmcs->execCtrlFields));
785 SerialPrint_VMCSExitCtrlFields(&(vmcs->exitCtrlFields));
786 SerialPrint_VMCSEntryCtrlFields(&(vmcs->entryCtrlFields));
787 SerialPrint_VMCSExitInfoFields(&(vmcs->exitInfoFields));