Skip to content
  • Daniel Henrique Barboza's avatar
    136cb9cc
    target/riscv/kvm.c: fix mvendorid size in vcpu_set_machine_ids() · 136cb9cc
    Daniel Henrique Barboza authored
    
    
    cpu->cfg.mvendorid is a 32 bit field and kvm_set_one_reg() always write
    a target_ulong val, i.e. a 64 bit field in a 64 bit host.
    
    Given that we're passing a pointer to the mvendorid field, the reg is
    reading 64 bits starting from mvendorid and going 32 bits in the next
    field, marchid. Here's an example:
    
    $ ./qemu-system-riscv64 -machine virt,accel=kvm -m 2G -smp 1 \
       -cpu rv64,marchid=0xab,mvendorid=0xcd,mimpid=0xef(...)
    
    (inside the guest)
     # cat /proc/cpuinfo
    processor	: 0
    hart		: 0
    isa		: rv64imafdc_zicbom_zicboz_zihintpause_zbb_sstc
    mmu		: sv57
    mvendorid	: 0xab000000cd
    marchid		: 0xab
    mimpid		: 0xef
    
    'mvendorid' was written as a combination of 0xab (the value from the
    adjacent field, marchid) and its intended value 0xcd.
    
    Fix it by assigning cpu->cfg.mvendorid to a target_ulong var 'reg' and
    use it as input for kvm_set_one_reg(). Here's the result with this patch
    applied and using the same QEMU command line:
    
     # cat /proc/cpuinfo
    processor	: 0
    hart		: 0
    isa		: rv64imafdc_zicbom_zicboz_zihintpause_zbb_sstc
    mmu		: sv57
    mvendorid	: 0xcd
    marchid		: 0xab
    mimpid		: 0xef
    
    This bug affects only the generic (rv64) CPUs when running with KVM in a
    64 bit env since the 'host' CPU does not allow the machine IDs to be
    changed via command line.
    
    Fixes: 1fb5a622 ("target/riscv: handle mvendorid/marchid/mimpid for KVM CPUs")
    Signed-off-by: default avatarDaniel Henrique Barboza <dbarboza@ventanamicro.com>
    Acked-by: default avatarAlistair Francis <alistair.francis@wdc.com>
    Reviewed-by: default avatarAndrew Jones <ajones@ventanamicro.com>
    Message-ID: <20230802180058.281385-1-dbarboza@ventanamicro.com>
    Signed-off-by: default avatarAlistair Francis <alistair.francis@wdc.com>
    136cb9cc
    target/riscv/kvm.c: fix mvendorid size in vcpu_set_machine_ids()
    Daniel Henrique Barboza authored
    
    
    cpu->cfg.mvendorid is a 32 bit field and kvm_set_one_reg() always write
    a target_ulong val, i.e. a 64 bit field in a 64 bit host.
    
    Given that we're passing a pointer to the mvendorid field, the reg is
    reading 64 bits starting from mvendorid and going 32 bits in the next
    field, marchid. Here's an example:
    
    $ ./qemu-system-riscv64 -machine virt,accel=kvm -m 2G -smp 1 \
       -cpu rv64,marchid=0xab,mvendorid=0xcd,mimpid=0xef(...)
    
    (inside the guest)
     # cat /proc/cpuinfo
    processor	: 0
    hart		: 0
    isa		: rv64imafdc_zicbom_zicboz_zihintpause_zbb_sstc
    mmu		: sv57
    mvendorid	: 0xab000000cd
    marchid		: 0xab
    mimpid		: 0xef
    
    'mvendorid' was written as a combination of 0xab (the value from the
    adjacent field, marchid) and its intended value 0xcd.
    
    Fix it by assigning cpu->cfg.mvendorid to a target_ulong var 'reg' and
    use it as input for kvm_set_one_reg(). Here's the result with this patch
    applied and using the same QEMU command line:
    
     # cat /proc/cpuinfo
    processor	: 0
    hart		: 0
    isa		: rv64imafdc_zicbom_zicboz_zihintpause_zbb_sstc
    mmu		: sv57
    mvendorid	: 0xcd
    marchid		: 0xab
    mimpid		: 0xef
    
    This bug affects only the generic (rv64) CPUs when running with KVM in a
    64 bit env since the 'host' CPU does not allow the machine IDs to be
    changed via command line.
    
    Fixes: 1fb5a622 ("target/riscv: handle mvendorid/marchid/mimpid for KVM CPUs")
    Signed-off-by: default avatarDaniel Henrique Barboza <dbarboza@ventanamicro.com>
    Acked-by: default avatarAlistair Francis <alistair.francis@wdc.com>
    Reviewed-by: default avatarAndrew Jones <ajones@ventanamicro.com>
    Message-ID: <20230802180058.281385-1-dbarboza@ventanamicro.com>
    Signed-off-by: default avatarAlistair Francis <alistair.francis@wdc.com>
Loading