- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi everyone,
I am trying to play around with the VMX non-root mode on a E5-2640v4 CPU. I want to boot a Linux kernel at non-root mode. At first I disabled EPT and virtual APIC, then called vmlaunch to enter the non-root mode. It works well. Then I tried to enable EPT but still left the virtual APIC disabled and after the kernel entered the non-root mode, the Local APIC stopped work(cannot dispatch interrupt pending in the IRR and ISR).
I found a workaround that first triggering a PF or UD and after the kernel going back from the .fixup section, writing to the EOI manually, then the APIC will work as usual. I believe this is not a good solution and I must did something wrong. But I cannot find it.
Does anyone have some ideas? Thanks a lot!
Here is the code snippet of my workaround:
void *uaddr = NULL;
unsigned long newval = uval = 0;
unsigned long ret = 0;
asm volatile ("\n"
/* trigger a PF by dereference a NULL pointer*/
"1:\t" LOCK_PREFIX "cmpxchg %4, %2\n"
/* (or trigger UD instead) */
//"1:\tud2\n"
"2:\n"
"\t.section .fixup, \"ax\"\n"
"3:\tmov %3, %0\n"
"\tjmp 2b\n"
"\t.previous\n"
_ASM_EXTABLE_UA(1b, 3b)
: "+r" (ret), "=a" (uval), "+m" (*(uaddr))
: "i" (-EFAULT), "q" (newval), "1" (uval)
: "memory"
);
/* Write to EOI */
ack_APIC_irq();
Possibly related VMCS config:
PinBased=00000016H(All 0)
CPUBased=94006172H(ACTIVATE_SECONDARY_CONTROLS, USE_MSR_BITMAPS)
SecondaryExec=00000000H
EntryControls=000053ffH(unrelated?)
ExitControls=000fefffH / 000f6fffH (ACK_INTR_ON_EXIT set and unset both don't work)
ExceptionBitmap=00004000 PFECmask=00000000 PFECmatch=ffffffff (No VMEXIT on PF)
- Tags:
- Virtualization
Link Copied
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page