aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorBibo Mao <maobibo@loongson.cn>2024-05-14 10:51:09 +0800
committerSong Gao <gaosong@loongson.cn>2024-05-23 09:30:41 +0800
commita7701b61f62ecef787ec4c64569bf5a1e892197c (patch)
treed06a6ac099f4253a8eca51b997aad67f59873a86 /hw
parent07c0866103d4aa2dd83c7c3e7898843e28e3893a (diff)
downloadqemu-a7701b61f62ecef787ec4c64569bf5a1e892197c.zip
qemu-a7701b61f62ecef787ec4c64569bf5a1e892197c.tar.gz
qemu-a7701b61f62ecef787ec4c64569bf5a1e892197c.tar.bz2
hw/loongarch: Add VM mode in IOCSR feature register in kvm mode
If VM runs in kvm mode, VM mode is added in IOCSR feature register. So guest can detect kvm hypervisor type and enable possible pv functions. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Reviewed-by: Song Gao <gaosong@loongson.cn> Message-Id: <20240514025109.3238398-1-maobibo@loongson.cn> Signed-off-by: Song Gao <gaosong@loongson.cn>
Diffstat (limited to 'hw')
-rw-r--r--hw/loongarch/virt.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
index f0640d2..95f9ed5 100644
--- a/hw/loongarch/virt.c
+++ b/hw/loongarch/virt.c
@@ -10,6 +10,7 @@
#include "qapi/error.h"
#include "hw/boards.h"
#include "hw/char/serial.h"
+#include "sysemu/kvm.h"
#include "sysemu/sysemu.h"
#include "sysemu/qtest.h"
#include "sysemu/runstate.h"
@@ -840,18 +841,23 @@ static void virt_iocsr_misc_write(void *opaque, hwaddr addr,
static uint64_t virt_iocsr_misc_read(void *opaque, hwaddr addr, unsigned size)
{
+ uint64_t ret;
+
switch (addr) {
case VERSION_REG:
return 0x11ULL;
case FEATURE_REG:
- return 1ULL << IOCSRF_MSI | 1ULL << IOCSRF_EXTIOI |
- 1ULL << IOCSRF_CSRIPI;
+ ret = BIT(IOCSRF_MSI) | BIT(IOCSRF_EXTIOI) | BIT(IOCSRF_CSRIPI);
+ if (kvm_enabled()) {
+ ret |= BIT(IOCSRF_VM);
+ }
+ return ret;
case VENDOR_REG:
return 0x6e6f73676e6f6f4cULL; /* "Loongson" */
case CPUNAME_REG:
return 0x303030354133ULL; /* "3A5000" */
case MISC_FUNC_REG:
- return 1ULL << IOCSRM_EXTIOI_EN;
+ return BIT_ULL(IOCSRM_EXTIOI_EN);
}
return 0ULL;
}