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(a)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>