[PATCH 1/1] cpu_riscv64.c: add update() implementation
Daniel Henrique Barboza
dbarboza at ventanamicro.com
Fri Apr 28 17:15:04 UTC 2023
On 4/28/23 12:40, Andrea Bolognani wrote:
> On Thu, Apr 27, 2023 at 06:04:10PM -0300, Daniel Henrique Barboza wrote:
>> At this moment it is not possible to launch a 'riscv64' domain of type
>> 'qemu' (i.e. TCG) and machine 'virt' in a x86 host:
>>
>> $ sudo ./run tools/virsh start riscv-virt1
>> error: Failed to start domain 'riscv-virt1'
>> error: this function is not supported by the connection driver:
>> cannot update guest CPU for riscv64 architecture
>
> I get a different error message, specifically
>
> unsupported configuration: CPU mode 'custom' for riscv64 qemu
> domain on x86_64 host is not supported by hypervisor
>
Ha, I believe the patch is still relevant but I did a serious mess in the commit
message :(
The difference between what we're seeing is that I used a QEMU from riscv-to-apply.next
from the maintainer tree [1] instead of master. That tree has the following patch:
commit c13dfff2ded9cf2098a07e2426ffcad674602030
Author: Daniel Henrique Barboza <dbarboza at ventanamicro.com>
Date: Tue Apr 11 15:35:10 2023 -0300
target/riscv: add query-cpy-definitions support
With this QEMU, two things you're not seeing will start to happen:
- virQEMUCapsGetMachineDefaultCPU() will return the 'rv64' CPU, and
qemuDomainDefSetDefaultCPU() will add the <cpu> element during PostParse()
time;
- the error you're seeing from virQEMUCapsIsCPUModeSupported() won't happen
because this:
cpus = virQEMUCapsGetAccel(qemuCaps, type)->cpuModels;
return cpus && cpus->ncpus > 0;
won't return NULL anymore. You'll error out in the same point I am right now,
in virCPUUpdate(), because there's no driver->update() for the RISC-V driver.
I apologize for the confusion. I'll re-send the patch with a proper description:
we need the update() implementation to support the <cpu> definition. I'll also
make sure to test with QEMU master this time.
Thanks,
Daniel
[1] https://github.com/alistair23/qemu/tree/riscv-to-apply.next
>> A guest CPU definition will be added if absent by
>> qemuDomainSetDefaultCPU():
>
> No such function exists, did you mean qemuDomainDefSetDefaultCPU()?
>
>> <cpu mode='custom' match='exact' check='none'>
>> <model fallback='forbid'>rv64</model>
>> </cpu>
>
> Note that I only started seeing the error message mentioned above
> after I manually added this snippet to my domain XML.
>
> If I don't do that, the <cpu> element doesn't show up at all and the
> VM can be started just fine.
>
>> struct cpuArchDriver cpuDriverRiscv64 = {
>> .name = "riscv64",
>> .arch = archs,
>> @@ -54,6 +80,6 @@ struct cpuArchDriver cpuDriverRiscv64 = {
>> .decode = NULL,
>> .encode = NULL,
>> .baseline = NULL,
>> - .update = NULL,
>> + .update = virCPUriscvUpdate,
>> .validateFeatures = virCPURiscv64ValidateFeatures,
>
> You should follow the naming convention already established for the
> file.
>
> I have not actually looked at the code yet. In theory the changes
> sound fine, but the current situation as you describe it differs
> enough from what I'm seeing here that I want to make sure we're on
> the same page before spending any time on that. Are you working off
> master? Do you have additional patches applied locally?
>
> The full XML for the VM that I'm using for testing is below.
>
>
> ----- 8< ----- 8< ----- 8< ----- 8< ----- 8< ----- 8< ----- 8< -----
>
> <domain type='qemu'>
> <name>ubuntu-riscv</name>
> <uuid>586faf27-2bf8-49cb-9601-9a62fe3de28d</uuid>
> <memory unit='KiB'>4194304</memory>
> <currentMemory unit='KiB'>4194304</currentMemory>
> <vcpu placement='static'>8</vcpu>
> <os>
> <type arch='riscv64' machine='virt'>hvm</type>
> <kernel>/var/lib/libvirt/images/riscv.u-boot.bin</kernel>
> <boot dev='hd'/>
> </os>
> <clock offset='utc'/>
> <on_poweroff>destroy</on_poweroff>
> <on_reboot>restart</on_reboot>
> <on_crash>destroy</on_crash>
> <devices>
> <emulator>/usr/bin/qemu-system-riscv64</emulator>
> <disk type='file' device='disk'>
> <driver name='qemu' type='qcow2'/>
> <source file='/var/lib/libvirt/images/ubuntu-riscv.qcow2'/>
> <target dev='vda' bus='virtio'/>
> <address type='pci' domain='0x0000' bus='0x04' slot='0x00'
> function='0x0'/>
> </disk>
> <controller type='usb' index='0' model='qemu-xhci'>
> <address type='pci' domain='0x0000' bus='0x02' slot='0x00'
> function='0x0'/>
> </controller>
> <controller type='pci' index='0' model='pcie-root'/>
> <controller type='pci' index='1' model='pcie-root-port'>
> <model name='pcie-root-port'/>
> <target chassis='1' port='0x8'/>
> <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> function='0x0' multifunction='on'/>
> </controller>
> <controller type='pci' index='2' model='pcie-root-port'>
> <model name='pcie-root-port'/>
> <target chassis='2' port='0x9'/>
> <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> function='0x1'/>
> </controller>
> <controller type='pci' index='3' model='pcie-root-port'>
> <model name='pcie-root-port'/>
> <target chassis='3' port='0xa'/>
> <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> function='0x2'/>
> </controller>
> <controller type='pci' index='4' model='pcie-root-port'>
> <model name='pcie-root-port'/>
> <target chassis='4' port='0xb'/>
> <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> function='0x3'/>
> </controller>
> <controller type='pci' index='5' model='pcie-root-port'>
> <model name='pcie-root-port'/>
> <target chassis='5' port='0xc'/>
> <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> function='0x4'/>
> </controller>
> <controller type='pci' index='6' model='pcie-root-port'>
> <model name='pcie-root-port'/>
> <target chassis='6' port='0xd'/>
> <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> function='0x5'/>
> </controller>
> <controller type='pci' index='7' model='pcie-root-port'>
> <model name='pcie-root-port'/>
> <target chassis='7' port='0xe'/>
> <address type='pci' domain='0x0000' bus='0x00' slot='0x01'
> function='0x6'/>
> </controller>
> <controller type='virtio-serial' index='0'>
> <address type='pci' domain='0x0000' bus='0x03' slot='0x00'
> function='0x0'/>
> </controller>
> <interface type='network'>
> <mac address='52:54:00:30:b4:bd'/>
> <source network='default'/>
> <model type='virtio'/>
> <address type='pci' domain='0x0000' bus='0x01' slot='0x00'
> function='0x0'/>
> </interface>
> <serial type='pty'>
> <target type='system-serial' port='0'>
> <model name='16550a'/>
> </target>
> </serial>
> <console type='pty'>
> <target type='serial' port='0'/>
> </console>
> <channel type='unix'>
> <target type='virtio' name='org.qemu.guest_agent.0'/>
> <address type='virtio-serial' controller='0' bus='0' port='1'/>
> </channel>
> <audio id='1' type='none'/>
> <memballoon model='virtio'>
> <address type='pci' domain='0x0000' bus='0x05' slot='0x00'
> function='0x0'/>
> </memballoon>
> <rng model='virtio'>
> <backend model='random'>/dev/urandom</backend>
> <address type='pci' domain='0x0000' bus='0x06' slot='0x00'
> function='0x0'/>
> </rng>
> </devices>
> </domain>
>
More information about the libvir-list
mailing list