Re: [PATCH] Make S390x work in qemu-kvm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Avi Kivity wrote:
> On 12/08/2009 05:35 PM, Alexander Graf wrote:
>> We now have S390x KVM support in qemu upstream.
>>
>> Unfortunately it doesn't work in qemu-kvm, because that has its own main
>> loop and slightly different calling conventions for the KVM helpers.
>>
>> So let's hack in some small compat ifdefs that make qemu-kvm work on
>> S390x!
>>
>>
>>
>>
>> diff --git a/hw/msix.c b/hw/msix.c
>> index 6d598ee..b2c2857 100644
>> --- a/hw/msix.c
>> +++ b/hw/msix.c
>> @@ -11,6 +11,8 @@
>>    * the COPYING file in the top-level directory.
>>    */
>>
>> +#ifndef __s390x__
>> +
>>    
>
> This should be CONFIG_PCI or CONFIG_PCI_MSI.  Also, better to hack it
> at the Makefile level.

That's what I did at first in a hacky way. To be honest, the new
makefile structure scares me a bit, so I'm not sure I'll easily figure
out how to do that properly :).

>
>> diff --git a/hw/msix.h b/hw/msix.h
>> index a9f7993..643b3a1 100644
>> --- a/hw/msix.h
>> +++ b/hw/msix.h
>> @@ -4,6 +4,37 @@
>>   #include "qemu-common.h"
>>   #include "pci.h"
>>
>> +#ifdef __s390x__
>>    
>
> Ditto (minus Makefile).
>
>> diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c
>> index cc21ee6..ea74955 100644
>> --- a/hw/s390-virtio.c
>> +++ b/hw/s390-virtio.c
>> @@ -179,7 +179,9 @@ static void s390_init(ram_addr_t ram_size,
>>               exit(1);
>>           }
>>
>> +#ifdef KVM_UPSTREAM
>>           cpu_synchronize_state(env);
>> +#endif
>>           env->psw.addr = KERN_IMAGE_START;
>>           env->psw.mask = 0x0000000180000000UL;
>>       }
>> @@ -236,6 +238,10 @@ static void s390_init(ram_addr_t ram_size,
>>           qdev_prop_set_drive(dev, "drive", dinfo);
>>           qdev_init_nofail(dev);
>>       }
>> +
>> +#ifndef KVM_UPSTREAM
>> +    kvm_arch_load_regs(env);
>> +#endif
>>   }
>>    
>
> Why isn't cpu_synchronize_state() suitable?

Because the KVM fd's are not available yet.

>
>>
>>   static QEMUMachine s390_machine = {
>> diff --git a/kvm-tpr-opt.c b/kvm-tpr-opt.c
>> index 2565d79..e8c4185 100644
>> --- a/kvm-tpr-opt.c
>> +++ b/kvm-tpr-opt.c
>> @@ -6,6 +6,8 @@
>>    * Licensed under the terms of the GNU GPL version 2 or higher.
>>    */
>>
>> +#ifndef __s390x__
>>    
>
> @Makefile.
>
>
>> diff --git a/kvm/include/linux/kvm.h b/kvm/include/linux/kvm.h
>> index db10887..2d241da 100644
>> --- a/kvm/include/linux/kvm.h
>> +++ b/kvm/include/linux/kvm.h
>>    
>
> Please post kvm header changes as a separate patch.

Ok.

>
>> diff --git a/qemu-kvm-helper.c b/qemu-kvm-helper.c
>> index 9420eb1..d5b75bd 100644
>> --- a/qemu-kvm-helper.c
>> +++ b/qemu-kvm-helper.c
>> @@ -30,7 +30,9 @@ void qemu_kvm_call_with_env(void (*func)(void *),
>> void *data, CPUState *newenv)
>>
>>   static void call_helper_cpuid(void *junk)
>>   {
>> +#ifndef __s390x__
>>       helper_cpuid();
>> +#endif
>>   }
>>    
>
> That just has to die (but not in your patches).  It dates from the
> pre-tcg days.

Yep. IMHO all the code duplication should die :).

>
>> @@ -157,7 +157,7 @@ static void init_slots(void)
>>
>>   static int get_free_slot(kvm_context_t kvm)
>>   {
>> -    int i;
>> +    int i = 0;
>>       int tss_ext;
>>
>>   #if defined(KVM_CAP_SET_TSS_ADDR)&&  !defined(__s390__)
>> @@ -171,10 +171,12 @@ static int get_free_slot(kvm_context_t kvm)
>>        * slot 0 to hold the extended memory, as the vmx will use the
>> last 3
>>        * pages of this slot.
>>        */
>> +#ifndef __s390x__
>>       if (tss_ext>  0)
>>           i = 0;
>>       else
>>           i = 1;
>> +#endif
>>    
>
> That should conditioned on x86, not s390.  While you're at it, drop
> the i = 0 assignment please.

So it's useless for IA64 as well?

>
>>
>>       for (; i<  KVM_MAX_NUM_MEM_REGIONS; ++i)
>>           if (!slots[i].len)
>> @@ -450,6 +452,14 @@ static void kvm_create_vcpu(CPUState *env, int id)
>>       env->kvm_fd = r;
>>       env->kvm_state = kvm_state;
>>
>> +#ifdef __s390x__
>> +    r = kvm_vcpu_ioctl(env, KVM_S390_INITIAL_RESET, 0);
>> +    if (r<  0) {
>> +        fprintf(stderr, "kvm_s390_initial_reset: %m\n");
>> +        exit(1);
>> +    }
>> +#endif
>>    
>
> Isn't there an arch hook for this?
>
> TARGET_S390 or similar.

Yes, there is. I figured this is just a temporary hack, so who cares :-).

>
>>           switch (run->exit_reason) {
>>           case KVM_EXIT_UNKNOWN:
>> @@ -981,14 +990,6 @@ int kvm_run(CPUState *env)
>>           case KVM_EXIT_SHUTDOWN:
>>               r = handle_shutdown(kvm, env);
>>               break;
>> -#if defined(__s390__)
>> -        case KVM_EXIT_S390_SIEIC:
>> -            r = kvm_s390_handle_intercept(kvm, env, run);
>> -            break;
>> -        case KVM_EXIT_S390_RESET:
>> -            r = kvm_s390_handle_reset(kvm, env, run);
>> -            break;
>> -#endif
>>    
>
> Ditto.

Ditto what? This is code removal.

>
>>
>> +#ifdef __s390x__
>> +static
>> +#endif
>>    
>
> Lovely.  Why?

Because it collided with the init function provided by target-s390x/kvm.c.

>
>>
>>   int kvm_arch_init_vcpu(CPUState *env)
>>   {
>> @@ -86,12 +88,27 @@ int kvm_arch_init_vcpu(CPUState *env)
>>       return ret;
>>   }
>>
>> +#ifdef KVM_UPSTREAM
>>   void kvm_arch_reset_vcpu(CPUState *env)
>> +#else
>> +void kvm_arch_cpu_reset(CPUState *env)
>> +#endif
>>    
>
> :(

Yeah, feel like getting the naming a bit closer? :)

>
>> index 0000000..9a6bcd6
>> --- /dev/null
>> +++ b/target-s390x/libkvm.h
>> @@ -0,0 +1,26 @@
>> +/*
>> + * This header is for functions&  variables that will ONLY be
>> + * used inside libkvm for x86.
>> + * THESE ARE NOT EXPOSED TO THE USER AND ARE ONLY FOR USE
>> + * WITHIN LIBKVM.
>> + *
>> + * derived from libkvm.c
>> + *
>> + * Copyright (C) 2006 Qumranet, Inc.
>> + *
>> + * Authors:
>> + *    Avi Kivity<avi@xxxxxxxxxxxx>
>> + *    Yaniv Kamay<yaniv@xxxxxxxxxxxx>
>> + *
>> + * This work is licensed under the GNU LGPL license, version 2.
>> + */
>> +
>> +#ifndef KVM_X86_H
>> +#define KVM_X86_H
>> +
>> +#define PAGE_SIZE 4096ul
>> +#define PAGE_MASK (~(PAGE_SIZE - 1))
>> +
>> +#define smp_wmb()   asm volatile("" ::: "memory")
>> +
>> +#endif
>>    
>
> I thought we no longer include libkvm.h!
>


Some file failed to build without it. IIRC because PAGE_* was not defined.

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

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux