23.08.2013, в 15:23, Udo Steinberg udo@hypervisor.org написал(а):
On Fri, 23 Aug 2013 15:13:35 +0400 Sartakov A. Vasily (SAV) wrote:
SAV> Could you please describe how to get access to a context of virtual machine? SAV> How can I modify context of virtual machine from Vancouver? SAV> When system switches into Vancouver, for example by pressing a special keyboard key, where is stored context of VM? in allocated VMCB? Can I read and modify its from Vancouver?
If you look at git/nul/vancouver/apps/vancouver/vancouver.cc you'll see functions like:
VM_FUNC(PT_VMX + 31, vmx_rdmsr, MTD_RIP_LEN | MTD_GPR_ACDB | MTD_TSC | MTD_SYSENTER | MTD_STATE, handle_vcpu(pid, true, CpuMessage::TYPE_RDMSR, tls, utcb);)
This is the handler for VMX portal 31, which handles emulation of the RDMSR instruction (see NOVA specification Section 7.2 for a list of intercepts). The portal is configured to transfer a subset of the architectural state according to the MTD bits (see Section 7.4). The hypervisor stores the requested state into the UTCB, where the VMM can read and modify it. Section 7.3 shows the layout of the UTCB with all the state fields.
Thanks, now it is clear: NOVA can intercept commands from guest machine, then call VM functions via portal with saved state in UTCB.
I do not understand several things about messaging:
I see several reply functions and I know where they are called. for example:
sigma0.cc, +1659: case MessageConsole::TYPE_START:
And I see, that this message is send from function handle_console_switching
hostvga.cc, +179: by calling msg1(MessageConsole::TYPE_START, num -1);
I hit a key, a key is processed by host driver, driver decides that this is a command for VM switching, host driver sends message to sigma0, sigma0 does something.
What about other commands, like MessageHostOp::OP_GET_MODULE? I see that all modules has a handler for this message, but I do not see who and how call them.