[PATCH 1/1] cpu_riscv64.c: add update() implementation

Andrea Bolognani abologna at redhat.com
Fri Apr 28 15:40:52 UTC 2023


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

> 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>

-- 
Andrea Bolognani / Red Hat / Virtualization



More information about the libvir-list mailing list