On 06/12/11 19:54, Sasha Levin wrote:
> Can we possibly do it by getting the generic code to call both
> 'kvm_cpu__arch_emulate_io' and 'kvm_cpu__arch_emulate_mmio', and have
> the ppc code have an empty static for 'kvm_cpu__arch_emulate_io'?

Yeah that's nicer, I'll make that change... less invasive.


Cheers,


Matt


> 
> On Tue, 2011-12-06 at 14:43 +1100, Matt Evans wrote:
>> Different architectures will deal with MMIO exits differently.  For example,
>> KVM_EXIT_IO is x86-specific, and I/O cycles are often synthesisted by 
>> steering
>> into windows in PCI bridges on other architectures.
>>
>> This patch moves the IO/MMIO exit code from the main runloop into 
>> x86/kvm-cpu.c
>>
>> Signed-off-by: Matt Evans <[email protected]>
>> ---
>>  tools/kvm/include/kvm/kvm-cpu.h |    1 +
>>  tools/kvm/kvm-cpu.c             |   37 +++++--------------------------------
>>  tools/kvm/x86/kvm-cpu.c         |   37 +++++++++++++++++++++++++++++++++++++
>>  3 files changed, 43 insertions(+), 32 deletions(-)
>>
>> diff --git a/tools/kvm/include/kvm/kvm-cpu.h 
>> b/tools/kvm/include/kvm/kvm-cpu.h
>> index 15618f1..6f38c0c 100644
>> --- a/tools/kvm/include/kvm/kvm-cpu.h
>> +++ b/tools/kvm/include/kvm/kvm-cpu.h
>> @@ -13,6 +13,7 @@ void kvm_cpu__run(struct kvm_cpu *vcpu);
>>  void kvm_cpu__reboot(void);
>>  int kvm_cpu__start(struct kvm_cpu *cpu);
>>  bool kvm_cpu__handle_exit(struct kvm_cpu *vcpu);
>> +bool kvm_cpu__emulate_io(struct kvm_cpu *cpu, struct kvm_run *kvm_run);
>>  
>>  int kvm_cpu__get_debug_fd(void);
>>  void kvm_cpu__set_debug_fd(int fd);
>> diff --git a/tools/kvm/kvm-cpu.c b/tools/kvm/kvm-cpu.c
>> index 884a89f..c9fbc81 100644
>> --- a/tools/kvm/kvm-cpu.c
>> +++ b/tools/kvm/kvm-cpu.c
>> @@ -103,49 +103,22 @@ int kvm_cpu__start(struct kvm_cpu *cpu)
>>                      kvm_cpu__show_registers(cpu);
>>                      kvm_cpu__show_code(cpu);
>>                      break;
>> -            case KVM_EXIT_IO: {
>> -                    bool ret;
>> -
>> -                    ret = kvm__emulate_io(cpu->kvm,
>> -                                    cpu->kvm_run->io.port,
>> -                                    (u8 *)cpu->kvm_run +
>> -                                    cpu->kvm_run->io.data_offset,
>> -                                    cpu->kvm_run->io.direction,
>> -                                    cpu->kvm_run->io.size,
>> -                                    cpu->kvm_run->io.count);
>> -
>> -                    if (!ret)
>> +            case KVM_EXIT_IO:
>> +            case KVM_EXIT_MMIO:
>> +                    if (!kvm_cpu__emulate_io(cpu, cpu->kvm_run))
>>                              goto panic_kvm;
>>                      break;
>> -            }
>> -            case KVM_EXIT_MMIO: {
>> -                    bool ret;
>> -
>> -                    ret = kvm__emulate_mmio(cpu->kvm,
>> -                                    cpu->kvm_run->mmio.phys_addr,
>> -                                    cpu->kvm_run->mmio.data,
>> -                                    cpu->kvm_run->mmio.len,
>> -                                    cpu->kvm_run->mmio.is_write);
>> -
>> -                    if (!ret)
>> -                            goto panic_kvm;
>> -                    break;
>> -            }
>>              case KVM_EXIT_INTR:
>>                      if (cpu->is_running)
>>                              break;
>>                      goto exit_kvm;
>>              case KVM_EXIT_SHUTDOWN:
>>                      goto exit_kvm;
>> -            default: {
>> -                    bool ret;
>> -
>> -                    ret = kvm_cpu__handle_exit(cpu);
>> -                    if (!ret)
>> +            default:
>> +                    if (!kvm_cpu__handle_exit(cpu))
>>                              goto panic_kvm;
>>                      break;
>>              }
>> -            }
>>              kvm_cpu__handle_coalesced_mmio(cpu);
>>      }
>>  
>> diff --git a/tools/kvm/x86/kvm-cpu.c b/tools/kvm/x86/kvm-cpu.c
>> index a0d10cc..665d742 100644
>> --- a/tools/kvm/x86/kvm-cpu.c
>> +++ b/tools/kvm/x86/kvm-cpu.c
>> @@ -217,6 +217,43 @@ bool kvm_cpu__handle_exit(struct kvm_cpu *vcpu)
>>      return false;
>>  }
>>  
>> +bool kvm_cpu__emulate_io(struct kvm_cpu *cpu, struct kvm_run *kvm_run)
>> +{
>> +    bool ret;
>> +    switch (kvm_run->exit_reason) {
>> +    case KVM_EXIT_IO: {
>> +            ret = kvm__emulate_io(cpu->kvm,
>> +                                  cpu->kvm_run->io.port,
>> +                                  (u8 *)cpu->kvm_run +
>> +                                  cpu->kvm_run->io.data_offset,
>> +                                  cpu->kvm_run->io.direction,
>> +                                  cpu->kvm_run->io.size,
>> +                                  cpu->kvm_run->io.count);
>> +
>> +            if (!ret)
>> +                    goto panic_kvm;
>> +            break;
>> +    }
>> +    case KVM_EXIT_MMIO: {
>> +            ret = kvm__emulate_mmio(cpu->kvm,
>> +                                    cpu->kvm_run->mmio.phys_addr,
>> +                                    cpu->kvm_run->mmio.data,
>> +                                    cpu->kvm_run->mmio.len,
>> +                                    cpu->kvm_run->mmio.is_write);
>> +
>> +            if (!ret)
>> +                    goto panic_kvm;
>> +            break;
>> +    }
>> +    default:
>> +            pr_warning("Unknown exit reason %d in %s\n", 
>> kvm_run->exit_reason, __FUNCTION__);
>> +            return false;
>> +    }
>> +    return true;
>> +panic_kvm:
>> +    return false;
>> +}
>> +
>>  static void print_dtable(const char *name, struct kvm_dtable *dtable)
>>  {
>>      dprintf(debug_fd, " %s                 %016llx  %08hx\n",
>> --
>> To unsubscribe from this list: send the line "unsubscribe kvm" in
>> the body of a message to [email protected]
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to