Skip to contentSkip to conversation

A question about how kvm switch context to guest

DISCUSSION Zhengwang Ruan 2 participants 3 messages Jul 3, 2012 – Jul 4, 2012 KVM

lore
Share & tools
lore
#0 lore raw

Hi kashyapc & all,

I see a piece of code in vmx_vcpu_run as below, is it used to switch context to a guest? Kvm don't used "vmlaunch" or "vmresume" to launch or resume a guest? Why does kvm need to manually switch context by filling registers using stored register copies?

===============

asm(

        /* Store host registers */
        "push %%"R"dx; push %%"R"bp;"
        "push %%"R"cx \n\t" /* placeholder for guest rcx */
        "push %%"R"cx \n\t"
        "cmp %%"R"sp, %c[host_rsp](%0) \n\t"
        "je 1f \n\t"
        "mov %%"R"sp, %c[host_rsp](%0) \n\t"
        __ex(ASM_VMX_VMWRITE_RSP_RDX) "\n\t"
        "1: \n\t"
        /* Reload cr2 if changed */
        "mov %c[cr2](%0), %%"R"ax \n\t"
        "mov %%cr2, %%"R"dx \n\t"
        "cmp %%"R"ax, %%"R"dx \n\t"
        "je 2f \n\t"
        "mov %%"R"ax, %%cr2 \n\t"
        "2: \n\t"
        /* Check if vmlaunch of vmresume is needed */
        "cmpl $0, %c[launched](%0) \n\t"
        /* Load guest registers.  Don't clobber flags. */
        "mov %c[rax](%0), %%"R"ax \n\t"
        "mov %c[rbx](%0), %%"R"bx \n\t"
        "mov %c[rdx](%0), %%"R"dx \n\t"
        "mov %c[rsi](%0), %%"R"si \n\t"
        "mov %c[rdi](%0), %%"R"di \n\t"
        "mov %c[rbp](%0), %%"R"bp \n\t"

========

Thanks,

Zhengwang

#1 lore raw
Quoted 5 lines · Zhengwang Ruan

Hi kashyapc & all,

I see a piece of code in vmx_vcpu_run as below, is it used to switch context to a guest? Kvm don't used "vmlaunch" or "vmresume" to launch or resume a guest?

You trimmed the bit that contains vmlaunch/vmresume.

Why does kvm need to manually switch context by filling

Quoted 1 line

registers using stored register copies?

Those registers don't get automatically switched by the hardware.

Quoted 30 lines

===============

asm(

        /* Store host registers */
        "push %%"R"dx; push %%"R"bp;"
        "push %%"R"cx \n\t" /* placeholder for guest rcx */
        "push %%"R"cx \n\t"
        "cmp %%"R"sp, %c[host_rsp](%0) \n\t"
        "je 1f \n\t"
        "mov %%"R"sp, %c[host_rsp](%0) \n\t"
        __ex(ASM_VMX_VMWRITE_RSP_RDX) "\n\t"
        "1: \n\t"
        /* Reload cr2 if changed */
        "mov %c[cr2](%0), %%"R"ax \n\t"
        "mov %%cr2, %%"R"dx \n\t"
        "cmp %%"R"ax, %%"R"dx \n\t"
        "je 2f \n\t"
        "mov %%"R"ax, %%cr2 \n\t"
        "2: \n\t"
        /* Check if vmlaunch of vmresume is needed */
        "cmpl $0, %c[launched](%0) \n\t"
        /* Load guest registers.  Don't clobber flags. */
        "mov %c[rax](%0), %%"R"ax \n\t"
        "mov %c[rbx](%0), %%"R"bx \n\t"
        "mov %c[rdx](%0), %%"R"dx \n\t"
        "mov %c[rsi](%0), %%"R"si \n\t"
        "mov %c[rdi](%0), %%"R"di \n\t"
        "mov %c[rbp](%0), %%"R"bp \n\t"
Signature · 1 line
error compiling committee.c: too many arguments to function
#2 lore raw

-------- Original Message --------
From: Avi Kivity
Sent: 2012年07月04日 星期三 16时47分40秒
To: Zhengwang Ruan
Subject: Re: A question about how kvm switch context to guest

Quoted 11 lines · Zhengwang Ruan
Quoted 5 lines

Hi kashyapc& all,

I see a piece of code in vmx_vcpu_run as below, is it used to switch context to a guest? Kvm don't used "vmlaunch" or "vmresume" to launch or resume a guest?

You trimmed the bit that contains vmlaunch/vmresume.

Why does kvm need to manually switch context by filling

Quoted 1 line

registers using stored register copies?

Those registers don't get automatically switched by the hardware.

Avi,

got it! thank you!

Regards,

Zhengwang

Quoted 31 lines
Quoted 30 lines

===============

asm(

         /* Store host registers */
         "push %%"R"dx; push %%"R"bp;"
         "push %%"R"cx \n\t" /* placeholder for guest rcx */
         "push %%"R"cx \n\t"
         "cmp %%"R"sp, %c[host_rsp](%0) \n\t"
         "je 1f \n\t"
         "mov %%"R"sp, %c[host_rsp](%0) \n\t"
         __ex(ASM_VMX_VMWRITE_RSP_RDX) "\n\t"
         "1: \n\t"
         /* Reload cr2 if changed */
         "mov %c[cr2](%0), %%"R"ax \n\t"
         "mov %%cr2, %%"R"dx \n\t"
         "cmp %%"R"ax, %%"R"dx \n\t"
         "je 2f \n\t"
         "mov %%"R"ax, %%cr2 \n\t"
         "2: \n\t"
         /* Check if vmlaunch of vmresume is needed */
         "cmpl $0, %c[launched](%0) \n\t"
         /* Load guest registers.  Don't clobber flags. */
         "mov %c[rax](%0), %%"R"ax \n\t"
         "mov %c[rbx](%0), %%"R"bx \n\t"
         "mov %c[rdx](%0), %%"R"dx \n\t"
         "mov %c[rsi](%0), %%"R"si \n\t"
         "mov %c[rdi](%0), %%"R"di \n\t"
         "mov %c[rbp](%0), %%"R"bp \n\t"