Avi Kivity wrote:
> Liu, Eric E wrote:
>>> From d56731ffc6d5742a88a157dfe0e4344d35f7db58 Mon Sep 17 00:00:00
>>> 2001 
>> From: Feng(Eric) Liu <[EMAIL PROTECTED]>
>> Date: Mon, 31 Mar 2008 10:08:55 -0400
>> Subject: [PATCH] KVM: Add some trace entries in current code and
>> define some interfaces for userspace app to contrl and use tracing
>> data. 
>> 
>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>> index 9951ec9..8f70405 100644
>> --- a/arch/x86/kvm/vmx.c
>> +++ b/arch/x86/kvm/vmx.c
>> @@ -1794,6 +1794,10 @@ static void vmx_inject_irq(struct kvm_vcpu
>>  *vcpu, int irq) {
>>      struct vcpu_vmx *vmx = to_vmx(vcpu);
>> 
>> +    KVMTRACE_1D(INJ_VIRQ, vcpu,
>> +                (u32)(irq | INTR_TYPE_SOFT_INTR |
>> INTR_INFO_VALID_MASK),
>> +                handler);
>> +
>> 
> 
> Why not just send irq as data?
> 

You are right, we only need to trace irq as data.

>>      if (vcpu->arch.rmode.active) {
>>              vmx->rmode.irq.pending = true;
>>              vmx->rmode.irq.vector = irq;
>> @@ -1944,6 +1948,7 @@ static int handle_exception(struct kvm_vcpu
>>              *vcpu, struct kvm_run *kvm_run) error_code =
>>      vmcs_read32(VM_EXIT_INTR_ERROR_CODE); if
>>              (is_page_fault(intr_info)) { cr2 =
vmcs_readl(EXIT_QUALIFICATION);
>> +            KVMTRACE_2D(PAGE_FAULT, vcpu, error_code, (u32)cr2,
>> handler);
>> 
> 
> High order 32 bits of cr2 are lost.
>

May I use  KVMTRACE_3D(PAGE_FAULT, vcpu, error_code, (u32)cr2,
(u32)((u64)cr2 >> 32), handler) to handle this?
for 32bit gust, it traces some excess data, but after all for 64bit
guest, we don't lost high order bits.

>>              return kvm_mmu_page_fault(vcpu, cr2, error_code);
}
>> 
>> @@ -1972,6 +1977,7 @@ static int handle_external_interrupt(struct
>>                                   kvm_vcpu *vcpu, struct kvm_run
*kvm_run)
>>  {
>>      ++vcpu->stat.irq_exits;
>> +    KVMTRACE_1D(INTR, vcpu, vmcs_read32(VM_EXIT_INTR_INFO),
>> handler);
>>      return 1;
>>  }
>> 
>> @@ -2029,6 +2035,8 @@ static int handle_cr(struct kvm_vcpu *vcpu,
>>      struct kvm_run *kvm_run) reg = (exit_qualification >> 8) & 15;
>>      switch ((exit_qualification >> 4) & 3) {
>>      case 0: /* mov to cr */
>> +            KVMTRACE_2D(CR_WRITE, vcpu, (u32)cr,
>> (u32)vcpu->arch.regs[reg],
>> +                        handler);
>> 
> 
> High order bits are lost.
>

same to above.
 
>>      if (vmx_set_msr(vcpu, ecx, data) != 0) {
>>              kvm_inject_gp(vcpu, 0);
>>              return 1;
>> @@ -2181,6 +2201,9 @@ static int handle_interrupt_window(struct
>>      kvm_vcpu *vcpu, cpu_based_vm_exec_control =
>> vmcs_read32(CPU_BASED_VM_EXEC_CONTROL);
>>      cpu_based_vm_exec_control &= ~CPU_BASED_VIRTUAL_INTR_PENDING;
>>      vmcs_write32(CPU_BASED_VM_EXEC_CONTROL,
>> cpu_based_vm_exec_control);
>> +
>> +    KVMTRACE_1D(PEND_INTR, vcpu, cpu_based_vm_exec_control,
>> handler);
>> 
> 
> Can record 0 unconditionally here, no?
> 

agree.

>> @@ -2271,6 +2296,9 @@ static int kvm_handle_exit(struct kvm_run
>> *kvm_run, struct kvm_vcpu *vcpu)
>>      struct vcpu_vmx *vmx = to_vmx(vcpu);
>>      u32 vectoring_info = vmx->idt_vectoring_info;
>> 
>> +    KVMTRACE_2D(VMEXIT, vcpu, exit_reason,
>> (u32)vmcs_readl(GUEST_RIP),
>> +                entryexit);
>> +
>>      if (unlikely(vmx->fail)) {
>>              kvm_run->exit_reason = KVM_EXIT_FAIL_ENTRY;
>>              kvm_run->fail_entry.hardware_entry_failure_reason
>> @@ -2351,7 +2379,7 @@ static void vmx_intr_assist(struct kvm_vcpu
>>                      *vcpu)
enable_irq_window(vcpu); return;
>>              }
>> -
>> +            KVMTRACE_1D(INJ_VIRQ, vcpu, idtv_info_field, handler);
>> 
> 
> Probably need a different marker than INJ_VIRQ, as this is on exit,
> not entry.
>

Is the marker REDELIVER_EVT ok for this?

>>      if (!count) {
>>              kvm_x86_ops->skip_emulated_instruction(vcpu);
>>              return 1;
>> @@ -2428,6 +2445,7 @@ void kvm_arch_exit(void)
>>  int kvm_emulate_halt(struct kvm_vcpu *vcpu)
>>  {
>>      ++vcpu->stat.halt_exits;
>> +    KVMTRACE_0D(HLT, vcpu, handler);
>>      if (irqchip_in_kernel(vcpu->kvm)) {
>>              vcpu->arch.mp_state = VCPU_MP_STATE_HALTED;
>>              kvm_vcpu_block(vcpu);
>> 
> 
> Would be nice to have an UNHLT to see how long sleeps are.  But this
> will probably be seen by the irq injection.

I think from the cycles Between VMEXIT( caused by halt) and VMENTRY we
can evaluate how long sleeps are. 
Thank you again.

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Register now and save $200. Hurry, offer ends at 11:59 p.m., 
Monday, April 7! Use priority code J8TLD2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to