1
The following changes since commit 92ec7805190313c9e628f8fc4eb4f932c15247bd:
1
The following changes since commit 38d0939b86e2eef6f6a622c6f1f7befda0146595:
2
2
3
Merge tag 'pull-riscv-to-apply-20241031-1' of https://github.com/alistair23/qemu into staging (2024-10-31 16:34:25 +0000)
3
Merge tag 'pull-vfio-20241226' of https://github.com/legoater/qemu into staging (2024-12-26 04:38:38 -0500)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://gitlab.com/gaosong/qemu.git tags/pull-loongarch-20241102
7
https://gitlab.com/bibo-mao/qemu.git tags/pull-loongarch-20241227
8
8
9
for you to fetch changes up to 47b54e15bbe78722c62dfafc3e04deded820c05e:
9
for you to fetch changes up to 5e360dabedb1ab1f15cce27a134ccbe4b8e18424:
10
10
11
target/loongarch: Add steal time support on migration (2024-11-02 15:45:45 +0800)
11
target/loongarch: Use auto method with LASX feature (2024-12-27 11:33:06 +0800)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
pull-loongarch-20241102
14
pull-loongarch-20241227
15
v1 ... v2
16
1. Modify patch auther inconsistent with SOB
15
17
16
V2: Fix no 'asm/unistd_64.h' build error.
17
Add a new patch (hw/loongarch/boot: Use warn_report when no kernel filename).
18
----------------------------------------------------------------
18
----------------------------------------------------------------
19
Bibo Mao (7):
19
Bibo Mao (5):
20
target/loongarch: Add loongson binary translation feature
20
target/loongarch: Use actual operand size with vbsrl check
21
target/loongarch: Implement lbt registers save/restore function
21
hw/loongarch/virt: Create fdt table on machine creation done notification
22
target/loongarch/kvm: Implement LoongArch PMU extension
22
hw/loongarch/virt: Improve fdt table creation for CPU object
23
linux-headers: Add unistd_64.h
23
target/loongarch: Use auto method with LSX feature
24
linux-headers: loongarch: Add kvm_para.h
24
target/loongarch: Use auto method with LASX feature
25
linux-headers: Update to Linux v6.12-rc5
26
target/loongarch: Add steal time support on migration
27
25
28
Song Gao (1):
26
Guo Hongyu (1):
29
hw/loongarch/boot: Use warn_report when no kernel filename
27
target/loongarch: Fix vldi inst
30
28
31
hw/loongarch/boot.c | 5 +-
29
hw/loongarch/virt.c | 142 ++++++++++++++----------
32
include/standard-headers/drm/drm_fourcc.h | 43 +++
30
target/loongarch/cpu.c | 86 ++++++++------
33
include/standard-headers/linux/const.h | 17 ++
31
target/loongarch/cpu.h | 4 +
34
include/standard-headers/linux/ethtool.h | 226 ++++++++++++++
32
target/loongarch/kvm/kvm.c | 107 ++++++++++++++++++
35
include/standard-headers/linux/fuse.h | 22 +-
33
target/loongarch/tcg/insn_trans/trans_vec.c.inc | 4 +-
36
include/standard-headers/linux/input-event-codes.h | 2 +
34
5 files changed, 249 insertions(+), 94 deletions(-)
37
include/standard-headers/linux/pci_regs.h | 41 ++-
38
include/standard-headers/linux/virtio_balloon.h | 16 +-
39
include/standard-headers/linux/virtio_gpu.h | 1 +
40
linux-headers/asm-arm64/mman.h | 9 +
41
linux-headers/asm-arm64/unistd.h | 25 +-
42
linux-headers/asm-arm64/unistd_64.h | 324 ++++++++++++++++++++
43
linux-headers/asm-generic/unistd.h | 6 +-
44
linux-headers/asm-loongarch/kvm.h | 24 ++
45
linux-headers/asm-loongarch/kvm_para.h | 21 ++
46
linux-headers/asm-loongarch/unistd.h | 4 +-
47
linux-headers/asm-loongarch/unistd_64.h | 320 ++++++++++++++++++++
48
linux-headers/asm-riscv/kvm.h | 7 +
49
linux-headers/asm-riscv/unistd.h | 41 +--
50
linux-headers/asm-riscv/unistd_32.h | 315 ++++++++++++++++++++
51
linux-headers/asm-riscv/unistd_64.h | 325 +++++++++++++++++++++
52
linux-headers/asm-x86/kvm.h | 2 +
53
linux-headers/asm-x86/unistd_64.h | 1 +
54
linux-headers/asm-x86/unistd_x32.h | 1 +
55
linux-headers/linux/bits.h | 3 +
56
linux-headers/linux/const.h | 17 ++
57
linux-headers/linux/iommufd.h | 143 +++++++--
58
linux-headers/linux/kvm.h | 23 +-
59
linux-headers/linux/mman.h | 1 +
60
linux-headers/linux/psp-sev.h | 28 ++
61
scripts/update-linux-headers.sh | 7 +
62
target/loongarch/cpu.c | 43 +++
63
target/loongarch/cpu.h | 23 ++
64
target/loongarch/kvm/kvm.c | 225 +++++++++++++-
65
target/loongarch/loongarch-qmp-cmds.c | 2 +-
66
target/loongarch/machine.c | 30 +-
67
36 files changed, 2243 insertions(+), 100 deletions(-)
68
create mode 100644 linux-headers/asm-arm64/unistd_64.h
69
create mode 100644 linux-headers/asm-loongarch/kvm_para.h
70
create mode 100644 linux-headers/asm-loongarch/unistd_64.h
71
create mode 100644 linux-headers/asm-riscv/unistd_32.h
72
create mode 100644 linux-headers/asm-riscv/unistd_64.h
diff view generated by jsdifflib
1
From: Bibo Mao <maobibo@loongson.cn>
1
From: Guo Hongyu <guohongyu24@mails.ucas.ac.cn>
2
2
3
KVM LBT supports on LoongArch depends on the linux-header file
3
Refer to the link below for a description of the vldi instructions:
4
kvm_para.h, add header file kvm_para.h here.
4
https://jia.je/unofficial-loongarch-intrinsics-guide/lsx/misc/#synopsis_88
5
Fixed errors in vldi instruction implementation.
5
6
7
Signed-off-by: Guo Hongyu <guohongyu24@mails.ucas.ac.cn>
8
Tested-by: Xianglai Li <lixianglai@loongson.cn>
9
Signed-off-by: Xianglai Li <lixianglai@loongson.cn>
10
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
6
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
11
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
7
Acked-by: Song Gao <gaosong@loongson.cn>
8
Message-Id: <20241028023809.1554405-3-maobibo@loongson.cn>
9
Signed-off-by: Song Gao <gaosong@loongson.cn>
10
---
12
---
11
scripts/update-linux-headers.sh | 1 +
13
target/loongarch/tcg/insn_trans/trans_vec.c.inc | 2 +-
12
1 file changed, 1 insertion(+)
14
1 file changed, 1 insertion(+), 1 deletion(-)
13
15
14
diff --git a/scripts/update-linux-headers.sh b/scripts/update-linux-headers.sh
16
diff --git a/target/loongarch/tcg/insn_trans/trans_vec.c.inc b/target/loongarch/tcg/insn_trans/trans_vec.c.inc
15
index XXXXXXX..XXXXXXX 100755
17
index XXXXXXX..XXXXXXX 100644
16
--- a/scripts/update-linux-headers.sh
18
--- a/target/loongarch/tcg/insn_trans/trans_vec.c.inc
17
+++ b/scripts/update-linux-headers.sh
19
+++ b/target/loongarch/tcg/insn_trans/trans_vec.c.inc
18
@@ -XXX,XX +XXX,XX @@ EOF
20
@@ -XXX,XX +XXX,XX @@ static uint64_t vldi_get_value(DisasContext *ctx, uint32_t imm)
19
cp "$hdrdir/include/asm/unistd_64.h" "$output/linux-headers/asm-riscv/"
21
break;
20
fi
22
case 1:
21
if [ $arch = loongarch ]; then
23
/* data: {2{16'0, imm[7:0], 8'0}} */
22
+ cp "$hdrdir/include/asm/kvm_para.h" "$output/linux-headers/asm-loongarch/"
24
- data = (t << 24) | (t << 8);
23
cp "$hdrdir/include/asm/unistd_64.h" "$output/linux-headers/asm-loongarch/"
25
+ data = (t << 40) | (t << 8);
24
fi
26
break;
25
done
27
case 2:
28
/* data: {2{8'0, imm[7:0], 16'0}} */
26
--
29
--
27
2.34.1
30
2.43.5
diff view generated by jsdifflib
1
When we run “qemu-system-loongarch64 -qmp stdio -vnc none -S”,
1
Hardcoded 32 bytes is used for vbsrl emulation check, there is
2
we get an error message “Need kernel filename” and then we can't use qmp cmd to query some information.
2
problem when options lsx=on,lasx=off is used for vbsrl.v instruction
3
So, we just throw a warning and then the cpus starts running from address VIRT_FLASH0_BASE.
3
in TCG mode. It injects LASX exception rather LSX exception.
4
4
5
Signed-off-by: Song Gao <gaosong@loongson.cn>
5
Here actual operand size is used.
6
7
Cc: qemu-stable@nongnu.org
8
Fixes: df97f338076 ("target/loongarch: Implement xvreplve xvinsve0 xvpickve")
9
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Message-Id: <20241030012359.4040817-1-gaosong@loongson.cn>
8
---
12
---
9
hw/loongarch/boot.c | 5 ++---
13
target/loongarch/tcg/insn_trans/trans_vec.c.inc | 2 +-
10
1 file changed, 2 insertions(+), 3 deletions(-)
14
1 file changed, 1 insertion(+), 1 deletion(-)
11
15
12
diff --git a/hw/loongarch/boot.c b/hw/loongarch/boot.c
16
diff --git a/target/loongarch/tcg/insn_trans/trans_vec.c.inc b/target/loongarch/tcg/insn_trans/trans_vec.c.inc
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/loongarch/boot.c
18
--- a/target/loongarch/tcg/insn_trans/trans_vec.c.inc
15
+++ b/hw/loongarch/boot.c
19
+++ b/target/loongarch/tcg/insn_trans/trans_vec.c.inc
16
@@ -XXX,XX +XXX,XX @@ static void init_boot_rom(struct loongarch_boot_info *info, void *p)
20
@@ -XXX,XX +XXX,XX @@ static bool do_vbsrl_v(DisasContext *ctx, arg_vv_i *a, uint32_t oprsz)
17
static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
18
{
21
{
19
void *p, *bp;
22
int i, ofs;
20
- int64_t kernel_addr = 0;
23
21
+ int64_t kernel_addr = VIRT_FLASH0_BASE;
24
- if (!check_vec(ctx, 32)) {
22
LoongArchCPU *lacpu;
25
+ if (!check_vec(ctx, oprsz)) {
23
CPUState *cs;
26
return true;
24
25
@@ -XXX,XX +XXX,XX @@ static void loongarch_direct_kernel_boot(struct loongarch_boot_info *info)
26
kernel_addr = load_kernel_info(info);
27
} else {
28
if(!qtest_enabled()) {
29
- error_report("Need kernel filename\n");
30
- exit(1);
31
+ warn_report("No kernel provided, booting from flash drive.");
32
}
33
}
27
}
34
28
35
--
29
--
36
2.34.1
30
2.43.5
37
31
38
32
diff view generated by jsdifflib
1
From: Bibo Mao <maobibo@loongson.cn>
1
The same with ACPI table, fdt table is created on machine done
2
2
notification. Some objects like CPU objects can be created with cold-plug
3
With pv steal time supported, VM machine needs get physical address
3
method with command such as -smp x, -device la464-loongarch-cpu, so all
4
of each vcpu and notify new host during migration. Here two
4
objects finish to create when machine is done.
5
functions kvm_get_stealtime/kvm_set_stealtime, and guest steal time
6
physical address is only updated on KVM_PUT_FULL_STATE stage.
7
5
8
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
6
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
9
Reviewed-by: Song Gao <gaosong@loongson.cn>
7
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
10
Message-Id: <20240930064040.753929-1-maobibo@loongson.cn>
11
Signed-off-by: Song Gao <gaosong@loongson.cn>
12
---
8
---
13
target/loongarch/cpu.h | 3 ++
9
hw/loongarch/virt.c | 103 ++++++++++++++++++++++++--------------------
14
target/loongarch/kvm/kvm.c | 65 ++++++++++++++++++++++++++++++++++++++
10
1 file changed, 57 insertions(+), 46 deletions(-)
15
target/loongarch/machine.c | 6 ++--
16
3 files changed, 72 insertions(+), 2 deletions(-)
17
11
18
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
12
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
19
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
20
--- a/target/loongarch/cpu.h
14
--- a/hw/loongarch/virt.c
21
+++ b/target/loongarch/cpu.h
15
+++ b/hw/loongarch/virt.c
22
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
16
@@ -XXX,XX +XXX,XX @@ static void virt_build_smbios(LoongArchVirtMachineState *lvms)
23
uint64_t CSR_DBG;
17
}
24
uint64_t CSR_DERA;
18
}
25
uint64_t CSR_DSAVE;
19
26
+ struct {
20
+static void virt_fdt_setup(LoongArchVirtMachineState *lvms)
27
+ uint64_t guest_addr;
28
+ } stealtime;
29
30
#ifdef CONFIG_TCG
31
float_status fp_status;
32
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/loongarch/kvm/kvm.c
35
+++ b/target/loongarch/kvm/kvm.c
36
@@ -XXX,XX +XXX,XX @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
37
KVM_CAP_LAST_INFO
38
};
39
40
+static int kvm_get_stealtime(CPUState *cs)
41
+{
21
+{
42
+ CPULoongArchState *env = cpu_env(cs);
22
+ MachineState *machine = MACHINE(lvms);
43
+ int err;
23
+ uint32_t cpuintc_phandle, eiointc_phandle, pch_pic_phandle, pch_msi_phandle;
44
+ struct kvm_device_attr attr = {
24
+ int i;
45
+ .group = KVM_LOONGARCH_VCPU_PVTIME_CTRL,
25
+
46
+ .attr = KVM_LOONGARCH_VCPU_PVTIME_GPA,
26
+ create_fdt(lvms);
47
+ .addr = (uint64_t)&env->stealtime.guest_addr,
27
+ fdt_add_cpu_nodes(lvms);
48
+ };
28
+ fdt_add_memory_nodes(machine);
49
+
29
+ fdt_add_fw_cfg_node(lvms);
50
+ err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr);
30
+ fdt_add_flash_node(lvms);
51
+ if (err) {
31
+
52
+ return 0;
32
+ /* Add cpu interrupt-controller */
33
+ fdt_add_cpuic_node(lvms, &cpuintc_phandle);
34
+ /* Add Extend I/O Interrupt Controller node */
35
+ fdt_add_eiointc_node(lvms, &cpuintc_phandle, &eiointc_phandle);
36
+ /* Add PCH PIC node */
37
+ fdt_add_pch_pic_node(lvms, &eiointc_phandle, &pch_pic_phandle);
38
+ /* Add PCH MSI node */
39
+ fdt_add_pch_msi_node(lvms, &eiointc_phandle, &pch_msi_phandle);
40
+ /* Add pcie node */
41
+ fdt_add_pcie_node(lvms, &pch_pic_phandle, &pch_msi_phandle);
42
+
43
+ /*
44
+ * Create uart fdt node in reverse order so that they appear
45
+ * in the finished device tree lowest address first
46
+ */
47
+ for (i = VIRT_UART_COUNT; i-- > 0;) {
48
+ hwaddr base = VIRT_UART_BASE + i * VIRT_UART_SIZE;
49
+ int irq = VIRT_UART_IRQ + i - VIRT_GSI_BASE;
50
+ fdt_add_uart_node(lvms, &pch_pic_phandle, base, irq, i == 0);
53
+ }
51
+ }
54
+
52
+
55
+ err = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, attr);
53
+ fdt_add_rtc_node(lvms, &pch_pic_phandle);
56
+ if (err) {
54
+ fdt_add_ged_reset(lvms);
57
+ error_report("PVTIME: KVM_GET_DEVICE_ATTR: %s", strerror(errno));
55
+ platform_bus_add_all_fdt_nodes(machine->fdt, "/platic",
58
+ return err;
56
+ VIRT_PLATFORM_BUS_BASEADDRESS,
59
+ }
57
+ VIRT_PLATFORM_BUS_SIZE,
60
+
58
+ VIRT_PLATFORM_BUS_IRQ);
61
+ return 0;
59
+
60
+ /*
61
+ * Since lowmem region starts from 0 and Linux kernel legacy start address
62
+ * at 2 MiB, FDT base address is located at 1 MiB to avoid NULL pointer
63
+ * access. FDT size limit with 1 MiB.
64
+ * Put the FDT into the memory map as a ROM image: this will ensure
65
+ * the FDT is copied again upon reset, even if addr points into RAM.
66
+ */
67
+ qemu_fdt_dumpdtb(machine->fdt, lvms->fdt_size);
68
+ rom_add_blob_fixed_as("fdt", machine->fdt, lvms->fdt_size, FDT_BASE,
69
+ &address_space_memory);
70
+ qemu_register_reset_nosnapshotload(qemu_fdt_randomize_seeds,
71
+ rom_ptr_for_as(&address_space_memory, FDT_BASE, lvms->fdt_size));
62
+}
72
+}
63
+
73
+
64
+static int kvm_set_stealtime(CPUState *cs)
74
static void virt_done(Notifier *notifier, void *data)
65
+{
66
+ CPULoongArchState *env = cpu_env(cs);
67
+ int err;
68
+ struct kvm_device_attr attr = {
69
+ .group = KVM_LOONGARCH_VCPU_PVTIME_CTRL,
70
+ .attr = KVM_LOONGARCH_VCPU_PVTIME_GPA,
71
+ .addr = (uint64_t)&env->stealtime.guest_addr,
72
+ };
73
+
74
+ err = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, attr);
75
+ if (err) {
76
+ return 0;
77
+ }
78
+
79
+ err = kvm_vcpu_ioctl(cs, KVM_SET_DEVICE_ATTR, attr);
80
+ if (err) {
81
+ error_report("PVTIME: KVM_SET_DEVICE_ATTR %s with gpa "TARGET_FMT_lx,
82
+ strerror(errno), env->stealtime.guest_addr);
83
+ return err;
84
+ }
85
+
86
+ return 0;
87
+}
88
+
89
static int kvm_loongarch_get_regs_core(CPUState *cs)
90
{
75
{
91
int ret = 0;
76
LoongArchVirtMachineState *lvms = container_of(notifier,
92
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs, Error **errp)
77
LoongArchVirtMachineState, machine_done);
93
return ret;
78
virt_build_smbios(lvms);
94
}
79
loongarch_acpi_setup(lvms);
95
80
+ virt_fdt_setup(lvms);
96
+ ret = kvm_get_stealtime(cs);
81
}
97
+ if (ret) {
82
98
+ return ret;
83
static void virt_powerdown_req(Notifier *notifier, void *opaque)
99
+ }
84
@@ -XXX,XX +XXX,XX @@ static DeviceState *create_platform_bus(DeviceState *pch_pic)
100
+
85
}
101
ret = kvm_loongarch_get_mpstate(cs);
86
102
return ret;
87
static void virt_devices_init(DeviceState *pch_pic,
103
}
88
- LoongArchVirtMachineState *lvms,
104
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
89
- uint32_t *pch_pic_phandle,
105
return ret;
90
- uint32_t *pch_msi_phandle)
106
}
91
+ LoongArchVirtMachineState *lvms)
107
92
{
108
+ if (level >= KVM_PUT_FULL_STATE) {
93
MachineClass *mc = MACHINE_GET_CLASS(lvms);
109
+ /*
94
DeviceState *gpex_dev;
110
+ * only KVM_PUT_FULL_STATE is required, kvm kernel will clear
95
@@ -XXX,XX +XXX,XX @@ static void virt_devices_init(DeviceState *pch_pic,
111
+ * guest_addr for KVM_PUT_RESET_STATE
96
gpex_set_irq_num(GPEX_HOST(gpex_dev), i, 16 + i);
112
+ */
97
}
113
+ ret = kvm_set_stealtime(cs);
98
114
+ if (ret) {
99
- /* Add pcie node */
115
+ return ret;
100
- fdt_add_pcie_node(lvms, pch_pic_phandle, pch_msi_phandle);
116
+ }
101
-
117
+ }
102
/*
118
+
103
* Create uart fdt node in reverse order so that they appear
119
ret = kvm_loongarch_put_mpstate(cs);
104
* in the finished device tree lowest address first
120
return ret;
105
@@ -XXX,XX +XXX,XX @@ static void virt_devices_init(DeviceState *pch_pic,
121
}
106
serial_mm_init(get_system_memory(), base, 0,
122
diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
107
qdev_get_gpio_in(pch_pic, irq),
123
index XXXXXXX..XXXXXXX 100644
108
115200, serial_hd(i), DEVICE_LITTLE_ENDIAN);
124
--- a/target/loongarch/machine.c
109
- fdt_add_uart_node(lvms, pch_pic_phandle, base, irq, i == 0);
125
+++ b/target/loongarch/machine.c
110
}
126
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_tlb = {
111
127
/* LoongArch CPU state */
112
/* Network init */
128
const VMStateDescription vmstate_loongarch_cpu = {
113
@@ -XXX,XX +XXX,XX @@ static void virt_devices_init(DeviceState *pch_pic,
129
.name = "cpu",
114
sysbus_create_simple("ls7a_rtc", VIRT_RTC_REG_BASE,
130
- .version_id = 2,
115
qdev_get_gpio_in(pch_pic,
131
- .minimum_version_id = 2,
116
VIRT_RTC_IRQ - VIRT_GSI_BASE));
132
+ .version_id = 3,
117
- fdt_add_rtc_node(lvms, pch_pic_phandle);
133
+ .minimum_version_id = 3,
118
- fdt_add_ged_reset(lvms);
134
.fields = (const VMStateField[]) {
119
135
VMSTATE_UINTTL_ARRAY(env.gpr, LoongArchCPU, 32),
120
/* acpi ged */
136
VMSTATE_UINTTL(env.pc, LoongArchCPU),
121
lvms->acpi_ged = create_acpi_ged(pch_pic, lvms);
137
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_loongarch_cpu = {
122
@@ -XXX,XX +XXX,XX @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
138
VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
123
CPULoongArchState *env;
139
124
CPUState *cpu_state;
140
VMSTATE_UINT64(kvm_state_counter, LoongArchCPU),
125
int cpu, pin, i, start, num;
141
+ /* PV steal time */
126
- uint32_t cpuintc_phandle, eiointc_phandle, pch_pic_phandle, pch_msi_phandle;
142
+ VMSTATE_UINT64(env.stealtime.guest_addr, LoongArchCPU),
127
143
128
/*
144
VMSTATE_END_OF_LIST()
129
* Extended IRQ model.
145
},
130
@@ -XXX,XX +XXX,XX @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
131
memory_region_add_subregion(&lvms->system_iocsr, MAIL_SEND_ADDR,
132
sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 1));
133
134
- /* Add cpu interrupt-controller */
135
- fdt_add_cpuic_node(lvms, &cpuintc_phandle);
136
-
137
for (cpu = 0; cpu < ms->smp.cpus; cpu++) {
138
cpu_state = qemu_get_cpu(cpu);
139
cpudev = DEVICE(cpu_state);
140
@@ -XXX,XX +XXX,XX @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
141
}
142
}
143
144
- /* Add Extend I/O Interrupt Controller node */
145
- fdt_add_eiointc_node(lvms, &cpuintc_phandle, &eiointc_phandle);
146
-
147
pch_pic = qdev_new(TYPE_LOONGARCH_PIC);
148
num = VIRT_PCH_PIC_IRQ_NUM;
149
qdev_prop_set_uint32(pch_pic, "pch_pic_irq_num", num);
150
@@ -XXX,XX +XXX,XX @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
151
qdev_connect_gpio_out(DEVICE(d), i, qdev_get_gpio_in(extioi, i));
152
}
153
154
- /* Add PCH PIC node */
155
- fdt_add_pch_pic_node(lvms, &eiointc_phandle, &pch_pic_phandle);
156
-
157
pch_msi = qdev_new(TYPE_LOONGARCH_PCH_MSI);
158
start = num;
159
num = EXTIOI_IRQS - start;
160
@@ -XXX,XX +XXX,XX @@ static void virt_irq_init(LoongArchVirtMachineState *lvms)
161
qdev_get_gpio_in(extioi, i + start));
162
}
163
164
- /* Add PCH MSI node */
165
- fdt_add_pch_msi_node(lvms, &eiointc_phandle, &pch_msi_phandle);
166
-
167
- virt_devices_init(pch_pic, lvms, &pch_pic_phandle, &pch_msi_phandle);
168
+ virt_devices_init(pch_pic, lvms);
169
}
170
171
static void virt_firmware_init(LoongArchVirtMachineState *lvms)
172
@@ -XXX,XX +XXX,XX @@ static void virt_init(MachineState *machine)
173
cpu_model = LOONGARCH_CPU_TYPE_NAME("la464");
174
}
175
176
- create_fdt(lvms);
177
-
178
/* Create IOCSR space */
179
memory_region_init_io(&lvms->system_iocsr, OBJECT(machine), NULL,
180
machine, "iocsr", UINT64_MAX);
181
@@ -XXX,XX +XXX,XX @@ static void virt_init(MachineState *machine)
182
lacpu = LOONGARCH_CPU(cpu);
183
lacpu->phy_id = machine->possible_cpus->cpus[i].arch_id;
184
}
185
- fdt_add_cpu_nodes(lvms);
186
- fdt_add_memory_nodes(machine);
187
fw_cfg_add_memory(machine);
188
189
/* Node0 memory */
190
@@ -XXX,XX +XXX,XX @@ static void virt_init(MachineState *machine)
191
memmap_table,
192
sizeof(struct memmap_entry) * (memmap_entries));
193
}
194
- fdt_add_fw_cfg_node(lvms);
195
- fdt_add_flash_node(lvms);
196
197
/* Initialize the IO interrupt subsystem */
198
virt_irq_init(lvms);
199
- platform_bus_add_all_fdt_nodes(machine->fdt, "/platic",
200
- VIRT_PLATFORM_BUS_BASEADDRESS,
201
- VIRT_PLATFORM_BUS_SIZE,
202
- VIRT_PLATFORM_BUS_IRQ);
203
lvms->machine_done.notify = virt_done;
204
qemu_add_machine_init_done_notifier(&lvms->machine_done);
205
/* connect powerdown request */
206
lvms->powerdown_notifier.notify = virt_powerdown_req;
207
qemu_register_powerdown_notifier(&lvms->powerdown_notifier);
208
209
- /*
210
- * Since lowmem region starts from 0 and Linux kernel legacy start address
211
- * at 2 MiB, FDT base address is located at 1 MiB to avoid NULL pointer
212
- * access. FDT size limit with 1 MiB.
213
- * Put the FDT into the memory map as a ROM image: this will ensure
214
- * the FDT is copied again upon reset, even if addr points into RAM.
215
- */
216
- qemu_fdt_dumpdtb(machine->fdt, lvms->fdt_size);
217
- rom_add_blob_fixed_as("fdt", machine->fdt, lvms->fdt_size, FDT_BASE,
218
- &address_space_memory);
219
- qemu_register_reset_nosnapshotload(qemu_fdt_randomize_seeds,
220
- rom_ptr_for_as(&address_space_memory, FDT_BASE, lvms->fdt_size));
221
-
222
lvms->bootinfo.ram_size = ram_size;
223
loongarch_load_kernel(machine, &lvms->bootinfo);
224
}
146
--
225
--
147
2.34.1
226
2.43.5
diff view generated by jsdifflib
1
From: Bibo Mao <maobibo@loongson.cn>
1
For CPU object, possible_cpu_arch_ids() function is used rather than
2
2
smp.cpus. With command -smp x, -device la464-loongarch-cpu, smp.cpus
3
Six registers scr0 - scr3, eflags and ftop are added in percpu vmstate.
3
is not accurate for all possible CPU objects, possible_cpu_arch_ids()
4
And two functions kvm_loongarch_get_lbt/kvm_loongarch_put_lbt are added
4
is used here.
5
to save/restore lbt registers.
6
5
7
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
6
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
8
Reviewed-by: Song Gao <gaosong@loongson.cn>
7
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
9
Message-Id: <20240929070405.235200-3-maobibo@loongson.cn>
10
Signed-off-by: Song Gao <gaosong@loongson.cn>
11
---
8
---
12
target/loongarch/cpu.h | 12 ++++++++
9
hw/loongarch/virt.c | 39 +++++++++++++++++++++++++--------------
13
target/loongarch/kvm/kvm.c | 62 ++++++++++++++++++++++++++++++++++++++
10
1 file changed, 25 insertions(+), 14 deletions(-)
14
target/loongarch/machine.c | 24 +++++++++++++++
15
3 files changed, 98 insertions(+)
16
11
17
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
12
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
18
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
19
--- a/target/loongarch/cpu.h
14
--- a/hw/loongarch/virt.c
20
+++ b/target/loongarch/cpu.h
15
+++ b/hw/loongarch/virt.c
21
@@ -XXX,XX +XXX,XX @@ enum loongarch_features {
16
@@ -XXX,XX +XXX,XX @@ static void create_fdt(LoongArchVirtMachineState *lvms)
22
LOONGARCH_FEATURE_LBT, /* loongson binary translation extension */
17
static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
23
};
18
{
24
19
int num;
25
+typedef struct LoongArchBT {
20
- const MachineState *ms = MACHINE(lvms);
26
+ /* scratch registers */
21
- int smp_cpus = ms->smp.cpus;
27
+ uint64_t scr0;
22
+ MachineState *ms = MACHINE(lvms);
28
+ uint64_t scr1;
23
+ MachineClass *mc = MACHINE_GET_CLASS(ms);
29
+ uint64_t scr2;
24
+ const CPUArchIdList *possible_cpus;
30
+ uint64_t scr3;
25
+ LoongArchCPU *cpu;
31
+ /* loongarch eflags */
26
+ CPUState *cs;
32
+ uint32_t eflags;
27
+ char *nodename, *map_path;
33
+ uint32_t ftop;
28
34
+} lbt_t;
29
qemu_fdt_add_subnode(ms->fdt, "/cpus");
30
qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1);
31
qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0);
32
33
/* cpu nodes */
34
- for (num = smp_cpus - 1; num >= 0; num--) {
35
- char *nodename = g_strdup_printf("/cpus/cpu@%d", num);
36
- LoongArchCPU *cpu = LOONGARCH_CPU(qemu_get_cpu(num));
37
- CPUState *cs = CPU(cpu);
38
+ possible_cpus = mc->possible_cpu_arch_ids(ms);
39
+ for (num = 0; num < possible_cpus->len; num++) {
40
+ cs = possible_cpus->cpus[num].cpu;
41
+ if (cs == NULL) {
42
+ continue;
43
+ }
35
+
44
+
36
typedef struct CPUArchState {
45
+ nodename = g_strdup_printf("/cpus/cpu@%d", num);
37
uint64_t gpr[32];
46
+ cpu = LOONGARCH_CPU(cs);
38
uint64_t pc;
47
39
@@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState {
48
qemu_fdt_add_subnode(ms->fdt, nodename);
40
fpr_t fpr[32];
49
qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "cpu");
41
bool cf[8];
50
qemu_fdt_setprop_string(ms->fdt, nodename, "compatible",
42
uint32_t fcsr0;
51
cpu->dtb_compatible);
43
+ lbt_t lbt;
52
- if (ms->possible_cpus->cpus[cs->cpu_index].props.has_node_id) {
44
53
+ if (possible_cpus->cpus[num].props.has_node_id) {
45
uint32_t cpucfg[21];
54
qemu_fdt_setprop_cell(ms->fdt, nodename, "numa-node-id",
46
55
- ms->possible_cpus->cpus[cs->cpu_index].props.node_id);
47
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
56
+ possible_cpus->cpus[num].props.node_id);
48
index XXXXXXX..XXXXXXX 100644
57
}
49
--- a/target/loongarch/kvm/kvm.c
58
qemu_fdt_setprop_cell(ms->fdt, nodename, "reg", num);
50
+++ b/target/loongarch/kvm/kvm.c
59
qemu_fdt_setprop_cell(ms->fdt, nodename, "phandle",
51
@@ -XXX,XX +XXX,XX @@ static int kvm_loongarch_put_regs_fp(CPUState *cs)
60
@@ -XXX,XX +XXX,XX @@ static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
52
return ret;
61
62
/*cpu map */
63
qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map");
64
+ for (num = 0; num < possible_cpus->len; num++) {
65
+ cs = possible_cpus->cpus[num].cpu;
66
+ if (cs == NULL) {
67
+ continue;
68
+ }
69
70
- for (num = smp_cpus - 1; num >= 0; num--) {
71
- char *cpu_path = g_strdup_printf("/cpus/cpu@%d", num);
72
- char *map_path;
73
-
74
+ nodename = g_strdup_printf("/cpus/cpu@%d", num);
75
if (ms->smp.threads > 1) {
76
map_path = g_strdup_printf(
77
"/cpus/cpu-map/socket%d/core%d/thread%d",
78
@@ -XXX,XX +XXX,XX @@ static void fdt_add_cpu_nodes(const LoongArchVirtMachineState *lvms)
79
num % ms->smp.cores);
80
}
81
qemu_fdt_add_path(ms->fdt, map_path);
82
- qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", cpu_path);
83
+ qemu_fdt_setprop_phandle(ms->fdt, map_path, "cpu", nodename);
84
85
g_free(map_path);
86
- g_free(cpu_path);
87
+ g_free(nodename);
88
}
53
}
89
}
54
90
55
+static int kvm_loongarch_put_lbt(CPUState *cs)
56
+{
57
+ CPULoongArchState *env = cpu_env(cs);
58
+ uint64_t val;
59
+ int ret;
60
+
61
+ /* check whether vm support LBT firstly */
62
+ if (FIELD_EX32(env->cpucfg[2], CPUCFG2, LBT_ALL) != 7) {
63
+ return 0;
64
+ }
65
+
66
+ /* set six LBT registers including scr0-scr3, eflags, ftop */
67
+ ret = kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR0, &env->lbt.scr0);
68
+ ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR1, &env->lbt.scr1);
69
+ ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR2, &env->lbt.scr2);
70
+ ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR3, &env->lbt.scr3);
71
+ /*
72
+ * Be cautious, KVM_REG_LOONGARCH_LBT_FTOP is defined as 64-bit however
73
+ * lbt.ftop is 32-bit; the same with KVM_REG_LOONGARCH_LBT_EFLAGS register
74
+ */
75
+ val = env->lbt.eflags;
76
+ ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_EFLAGS, &val);
77
+ val = env->lbt.ftop;
78
+ ret |= kvm_set_one_reg(cs, KVM_REG_LOONGARCH_LBT_FTOP, &val);
79
+
80
+ return ret;
81
+}
82
+
83
+static int kvm_loongarch_get_lbt(CPUState *cs)
84
+{
85
+ CPULoongArchState *env = cpu_env(cs);
86
+ uint64_t val;
87
+ int ret;
88
+
89
+ /* check whether vm support LBT firstly */
90
+ if (FIELD_EX32(env->cpucfg[2], CPUCFG2, LBT_ALL) != 7) {
91
+ return 0;
92
+ }
93
+
94
+ /* get six LBT registers including scr0-scr3, eflags, ftop */
95
+ ret = kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR0, &env->lbt.scr0);
96
+ ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR1, &env->lbt.scr1);
97
+ ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR2, &env->lbt.scr2);
98
+ ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_SCR3, &env->lbt.scr3);
99
+ ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_EFLAGS, &val);
100
+ env->lbt.eflags = (uint32_t)val;
101
+ ret |= kvm_get_one_reg(cs, KVM_REG_LOONGARCH_LBT_FTOP, &val);
102
+ env->lbt.ftop = (uint32_t)val;
103
+
104
+ return ret;
105
+}
106
+
107
void kvm_arch_reset_vcpu(CPUState *cs)
108
{
109
CPULoongArchState *env = cpu_env(cs);
110
@@ -XXX,XX +XXX,XX @@ int kvm_arch_get_registers(CPUState *cs, Error **errp)
111
return ret;
112
}
113
114
+ ret = kvm_loongarch_get_lbt(cs);
115
+ if (ret) {
116
+ return ret;
117
+ }
118
+
119
ret = kvm_loongarch_get_mpstate(cs);
120
return ret;
121
}
122
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level, Error **errp)
123
return ret;
124
}
125
126
+ ret = kvm_loongarch_put_lbt(cs);
127
+ if (ret) {
128
+ return ret;
129
+ }
130
+
131
ret = kvm_loongarch_put_mpstate(cs);
132
return ret;
133
}
134
diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
135
index XXXXXXX..XXXXXXX 100644
136
--- a/target/loongarch/machine.c
137
+++ b/target/loongarch/machine.c
138
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_lasx = {
139
},
140
};
141
142
+static bool lbt_needed(void *opaque)
143
+{
144
+ LoongArchCPU *cpu = opaque;
145
+
146
+ return !!FIELD_EX64(cpu->env.cpucfg[2], CPUCFG2, LBT_ALL);
147
+}
148
+
149
+static const VMStateDescription vmstate_lbt = {
150
+ .name = "cpu/lbt",
151
+ .version_id = 0,
152
+ .minimum_version_id = 0,
153
+ .needed = lbt_needed,
154
+ .fields = (const VMStateField[]) {
155
+ VMSTATE_UINT64(env.lbt.scr0, LoongArchCPU),
156
+ VMSTATE_UINT64(env.lbt.scr1, LoongArchCPU),
157
+ VMSTATE_UINT64(env.lbt.scr2, LoongArchCPU),
158
+ VMSTATE_UINT64(env.lbt.scr3, LoongArchCPU),
159
+ VMSTATE_UINT32(env.lbt.eflags, LoongArchCPU),
160
+ VMSTATE_UINT32(env.lbt.ftop, LoongArchCPU),
161
+ VMSTATE_END_OF_LIST()
162
+ },
163
+};
164
+
165
#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
166
static bool tlb_needed(void *opaque)
167
{
168
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_loongarch_cpu = {
169
#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY)
170
&vmstate_tlb,
171
#endif
172
+ &vmstate_lbt,
173
NULL
174
}
175
};
176
--
91
--
177
2.34.1
92
2.43.5
diff view generated by jsdifflib
1
From: Bibo Mao <maobibo@loongson.cn>
1
Like LBT feature, add type OnOffAuto for LSX feature setting. Also
2
2
add LSX feature detection with new VM ioctl command, fallback to old
3
Loongson Binary Translation (LBT) is used to accelerate binary
3
method if it is not supported.
4
translation, which contains 4 scratch registers (scr0 to scr3), x86/ARM
5
eflags (eflags) and x87 fpu stack pointer (ftop).
6
7
Now LBT feature is added in kvm mode, not supported in TCG mode since
8
it is not emulated. Feature variable lbt is added with OnOffAuto type,
9
If lbt feature is not supported with KVM host, it reports error if there
10
is lbt=on command line.
11
12
If there is no any command line about lbt parameter, it checks whether
13
KVM host supports lbt feature and set the corresponding value in cpucfg.
14
4
15
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
5
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
16
Reviewed-by: Song Gao <gaosong@loongson.cn>
6
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
17
Message-Id: <20240929070405.235200-2-maobibo@loongson.cn>
18
Signed-off-by: Song Gao <gaosong@loongson.cn>
19
---
7
---
20
target/loongarch/cpu.c | 24 +++++++++++
8
target/loongarch/cpu.c | 38 +++++++++++++++------------
21
target/loongarch/cpu.h | 6 +++
9
target/loongarch/cpu.h | 2 ++
22
target/loongarch/kvm/kvm.c | 57 ++++++++++++++++++++++++++-
10
target/loongarch/kvm/kvm.c | 54 ++++++++++++++++++++++++++++++++++++++
23
target/loongarch/loongarch-qmp-cmds.c | 2 +-
11
3 files changed, 77 insertions(+), 17 deletions(-)
24
4 files changed, 87 insertions(+), 2 deletions(-)
25
12
26
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
13
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
27
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
28
--- a/target/loongarch/cpu.c
15
--- a/target/loongarch/cpu.c
29
+++ b/target/loongarch/cpu.c
16
+++ b/target/loongarch/cpu.c
30
@@ -XXX,XX +XXX,XX @@ static void loongarch_set_lasx(Object *obj, bool value, Error **errp)
17
@@ -XXX,XX +XXX,XX @@ static void loongarch_la464_initfn(Object *obj)
18
{
19
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
20
CPULoongArchState *env = &cpu->env;
21
+ uint32_t data = 0;
22
int i;
23
24
for (i = 0; i < 21; i++) {
25
@@ -XXX,XX +XXX,XX @@ static void loongarch_la464_initfn(Object *obj)
26
cpu->dtb_compatible = "loongarch,Loongson-3A5000";
27
env->cpucfg[0] = 0x14c010; /* PRID */
28
29
- uint32_t data = 0;
30
data = FIELD_DP32(data, CPUCFG1, ARCH, 2);
31
data = FIELD_DP32(data, CPUCFG1, PGMMU, 1);
32
data = FIELD_DP32(data, CPUCFG1, IOCSR, 1);
33
@@ -XXX,XX +XXX,XX @@ static void loongarch_la132_initfn(Object *obj)
34
{
35
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
36
CPULoongArchState *env = &cpu->env;
37
-
38
+ uint32_t data = 0;
39
int i;
40
41
for (i = 0; i < 21; i++) {
42
@@ -XXX,XX +XXX,XX @@ static void loongarch_la132_initfn(Object *obj)
43
cpu->dtb_compatible = "loongarch,Loongson-1C103";
44
env->cpucfg[0] = 0x148042; /* PRID */
45
46
- uint32_t data = 0;
47
data = FIELD_DP32(data, CPUCFG1, ARCH, 1); /* LA32 */
48
data = FIELD_DP32(data, CPUCFG1, PGMMU, 1);
49
data = FIELD_DP32(data, CPUCFG1, IOCSR, 1);
50
@@ -XXX,XX +XXX,XX @@ static void loongarch_cpu_realizefn(DeviceState *dev, Error **errp)
51
52
static bool loongarch_get_lsx(Object *obj, Error **errp)
53
{
54
- LoongArchCPU *cpu = LOONGARCH_CPU(obj);
55
- bool ret;
56
-
57
- if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LSX)) {
58
- ret = true;
59
- } else {
60
- ret = false;
61
- }
62
- return ret;
63
+ return LOONGARCH_CPU(obj)->lsx != ON_OFF_AUTO_OFF;
64
}
65
66
static void loongarch_set_lsx(Object *obj, bool value, Error **errp)
67
{
68
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
69
+ uint32_t val;
70
71
- if (value) {
72
- cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LSX, 1);
73
- } else {
74
- cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LSX, 0);
75
- cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LASX, 0);
76
+ cpu->lsx = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
77
+ if (kvm_enabled()) {
78
+ /* kvm feature detection in function kvm_arch_init_vcpu */
79
+ return;
31
}
80
}
32
}
81
+
33
82
+ /* LSX feature detection in TCG mode */
34
+static bool loongarch_get_lbt(Object *obj, Error **errp)
83
+ val = cpu->env.cpucfg[2];
35
+{
84
+ if (cpu->lsx == ON_OFF_AUTO_ON) {
36
+ return LOONGARCH_CPU(obj)->lbt != ON_OFF_AUTO_OFF;
85
+ if (FIELD_EX32(val, CPUCFG2, LSX) == 0) {
37
+}
86
+ error_setg(errp, "Failed to enable LSX in TCG mode");
38
+
87
+ return;
39
+static void loongarch_set_lbt(Object *obj, bool value, Error **errp)
88
+ }
40
+{
89
+ }
41
+ LoongArchCPU *cpu = LOONGARCH_CPU(obj);
90
+
42
+
91
+ cpu->env.cpucfg[2] = FIELD_DP32(val, CPUCFG2, LSX, value);
43
+ cpu->lbt = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
92
}
44
+}
93
45
+
94
static bool loongarch_get_lasx(Object *obj, Error **errp)
46
void loongarch_cpu_post_init(Object *obj)
95
@@ -XXX,XX +XXX,XX @@ void loongarch_cpu_post_init(Object *obj)
47
{
96
{
48
+ LoongArchCPU *cpu = LOONGARCH_CPU(obj);
97
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
49
+
98
99
+ cpu->lsx = ON_OFF_AUTO_AUTO;
50
object_property_add_bool(obj, "lsx", loongarch_get_lsx,
100
object_property_add_bool(obj, "lsx", loongarch_get_lsx,
51
loongarch_set_lsx);
101
loongarch_set_lsx);
52
object_property_add_bool(obj, "lasx", loongarch_get_lasx,
102
object_property_add_bool(obj, "lasx", loongarch_get_lasx,
53
loongarch_set_lasx);
103
@@ -XXX,XX +XXX,XX @@ void loongarch_cpu_post_init(Object *obj)
54
+ /* lbt is enabled only in kvm mode, not supported in tcg mode */
104
55
+ if (kvm_enabled()) {
105
} else {
56
+ cpu->lbt = ON_OFF_AUTO_AUTO;
106
cpu->lbt = ON_OFF_AUTO_OFF;
57
+ object_property_add_bool(obj, "lbt", loongarch_get_lbt,
107
+ cpu->pmu = ON_OFF_AUTO_OFF;
58
+ loongarch_set_lbt);
108
}
59
+ object_property_set_description(obj, "lbt",
109
}
60
+ "Set off to disable Binary Tranlation.");
110
61
+ } else {
62
+ cpu->lbt = ON_OFF_AUTO_OFF;
63
+ }
64
}
65
66
static void loongarch_cpu_init(Object *obj)
67
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
111
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
68
index XXXXXXX..XXXXXXX 100644
112
index XXXXXXX..XXXXXXX 100644
69
--- a/target/loongarch/cpu.h
113
--- a/target/loongarch/cpu.h
70
+++ b/target/loongarch/cpu.h
114
+++ b/target/loongarch/cpu.h
71
@@ -XXX,XX +XXX,XX @@ FIELD(CPUCFG2, LLFTP_VER, 15, 3)
115
@@ -XXX,XX +XXX,XX @@ typedef struct LoongArchTLB LoongArchTLB;
72
FIELD(CPUCFG2, LBT_X86, 18, 1)
73
FIELD(CPUCFG2, LBT_ARM, 19, 1)
74
FIELD(CPUCFG2, LBT_MIPS, 20, 1)
75
+FIELD(CPUCFG2, LBT_ALL, 18, 3)
76
FIELD(CPUCFG2, LSPW, 21, 1)
77
FIELD(CPUCFG2, LAM, 22, 1)
78
79
@@ -XXX,XX +XXX,XX @@ struct LoongArchTLB {
80
typedef struct LoongArchTLB LoongArchTLB;
81
#endif
116
#endif
82
117
83
+enum loongarch_features {
118
enum loongarch_features {
84
+ LOONGARCH_FEATURE_LBT, /* loongson binary translation extension */
119
+ LOONGARCH_FEATURE_LSX,
85
+};
120
LOONGARCH_FEATURE_LBT, /* loongson binary translation extension */
86
+
121
LOONGARCH_FEATURE_PMU,
87
typedef struct CPUArchState {
122
};
88
uint64_t gpr[32];
89
uint64_t pc;
90
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
123
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
91
CPULoongArchState env;
92
QEMUTimer timer;
93
uint32_t phy_id;
124
uint32_t phy_id;
94
+ OnOffAuto lbt;
125
OnOffAuto lbt;
126
OnOffAuto pmu;
127
+ OnOffAuto lsx;
95
128
96
/* 'compatible' string for this CPU for Linux device trees */
129
/* 'compatible' string for this CPU for Linux device trees */
97
const char *dtb_compatible;
130
const char *dtb_compatible;
98
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
131
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
99
index XXXXXXX..XXXXXXX 100644
132
index XXXXXXX..XXXXXXX 100644
100
--- a/target/loongarch/kvm/kvm.c
133
--- a/target/loongarch/kvm/kvm.c
101
+++ b/target/loongarch/kvm/kvm.c
134
+++ b/target/loongarch/kvm/kvm.c
102
@@ -XXX,XX +XXX,XX @@
135
@@ -XXX,XX +XXX,XX @@ static bool kvm_feature_supported(CPUState *cs, enum loongarch_features feature)
103
#include <sys/ioctl.h>
136
{
104
#include <linux/kvm.h>
137
int ret;
105
138
struct kvm_device_attr attr;
106
+#include "qapi/error.h"
139
+ uint64_t val;
107
#include "qemu/timer.h"
140
108
#include "qemu/error-report.h"
141
switch (feature) {
109
#include "qemu/main-loop.h"
142
+ case LOONGARCH_FEATURE_LSX:
110
@@ -XXX,XX +XXX,XX @@ static void kvm_loongarch_vm_stage_change(void *opaque, bool running,
111
}
112
}
113
114
+static bool kvm_feature_supported(CPUState *cs, enum loongarch_features feature)
115
+{
116
+ int ret;
117
+ struct kvm_device_attr attr;
118
+
119
+ switch (feature) {
120
+ case LOONGARCH_FEATURE_LBT:
121
+ /*
122
+ * Return all if all the LBT features are supported such as:
123
+ * KVM_LOONGARCH_VM_FEAT_X86BT
124
+ * KVM_LOONGARCH_VM_FEAT_ARMBT
125
+ * KVM_LOONGARCH_VM_FEAT_MIPSBT
126
+ */
127
+ attr.group = KVM_LOONGARCH_VM_FEAT_CTRL;
143
+ attr.group = KVM_LOONGARCH_VM_FEAT_CTRL;
128
+ attr.attr = KVM_LOONGARCH_VM_FEAT_X86BT;
144
+ attr.attr = KVM_LOONGARCH_VM_FEAT_LSX;
129
+ ret = kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
145
+ ret = kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
130
+ attr.attr = KVM_LOONGARCH_VM_FEAT_ARMBT;
146
+ if (ret == 0) {
131
+ ret |= kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
147
+ return true;
132
+ attr.attr = KVM_LOONGARCH_VM_FEAT_MIPSBT;
148
+ }
133
+ ret |= kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
149
+
134
+ return (ret == 0);
150
+ /* Fallback to old kernel detect interface */
135
+ default:
151
+ val = 0;
152
+ attr.group = KVM_LOONGARCH_VCPU_CPUCFG;
153
+ /* Cpucfg2 */
154
+ attr.attr = 2;
155
+ attr.addr = (uint64_t)&val;
156
+ ret = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr);
157
+ if (!ret) {
158
+ ret = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr);
159
+ if (ret) {
160
+ return false;
161
+ }
162
+
163
+ ret = FIELD_EX32((uint32_t)val, CPUCFG2, LSX);
164
+ return (ret != 0);
165
+ }
136
+ return false;
166
+ return false;
137
+ }
167
+
138
+}
168
case LOONGARCH_FEATURE_LBT:
139
+
169
/*
140
+static int kvm_cpu_check_lbt(CPUState *cs, Error **errp)
170
* Return all if all the LBT features are supported such as:
171
@@ -XXX,XX +XXX,XX @@ static bool kvm_feature_supported(CPUState *cs, enum loongarch_features feature)
172
return false;
173
}
174
175
+static int kvm_cpu_check_lsx(CPUState *cs, Error **errp)
141
+{
176
+{
142
+ CPULoongArchState *env = cpu_env(cs);
177
+ CPULoongArchState *env = cpu_env(cs);
143
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
178
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
144
+ bool kvm_supported;
179
+ bool kvm_supported;
145
+
180
+
146
+ kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_LBT);
181
+ kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_LSX);
147
+ if (cpu->lbt == ON_OFF_AUTO_ON) {
182
+ env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LSX, 0);
183
+ if (cpu->lsx == ON_OFF_AUTO_ON) {
148
+ if (kvm_supported) {
184
+ if (kvm_supported) {
149
+ env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LBT_ALL, 7);
185
+ env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LSX, 1);
150
+ } else {
186
+ } else {
151
+ error_setg(errp, "'lbt' feature not supported by KVM on this host");
187
+ error_setg(errp, "'lsx' feature not supported by KVM on this host");
152
+ return -ENOTSUP;
188
+ return -ENOTSUP;
153
+ }
189
+ }
154
+ } else if ((cpu->lbt == ON_OFF_AUTO_AUTO) && kvm_supported) {
190
+ } else if ((cpu->lsx == ON_OFF_AUTO_AUTO) && kvm_supported) {
155
+ env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LBT_ALL, 7);
191
+ env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LSX, 1);
156
+ }
192
+ }
157
+
193
+
158
+ return 0;
194
+ return 0;
159
+}
195
+}
160
+
196
+
161
int kvm_arch_init_vcpu(CPUState *cs)
197
static int kvm_cpu_check_lbt(CPUState *cs, Error **errp)
162
{
198
{
163
uint64_t val;
199
CPULoongArchState *env = cpu_env(cs);
164
+ int ret;
200
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
165
+ Error *local_err = NULL;
166
167
+ ret = 0;
168
qemu_add_vm_change_state_handler(kvm_loongarch_vm_stage_change, cs);
169
170
if (!kvm_get_one_reg(cs, KVM_REG_LOONGARCH_DEBUG_INST, &val)) {
171
brk_insn = val;
201
brk_insn = val;
172
}
202
}
173
203
174
- return 0;
204
+ ret = kvm_cpu_check_lsx(cs, &local_err);
175
+ ret = kvm_cpu_check_lbt(cs, &local_err);
176
+ if (ret < 0) {
205
+ if (ret < 0) {
177
+ error_report_err(local_err);
206
+ error_report_err(local_err);
178
+ }
207
+ }
179
+ return ret;
208
+
180
}
209
ret = kvm_cpu_check_lbt(cs, &local_err);
181
210
if (ret < 0) {
182
int kvm_arch_destroy_vcpu(CPUState *cs)
211
error_report_err(local_err);
183
diff --git a/target/loongarch/loongarch-qmp-cmds.c b/target/loongarch/loongarch-qmp-cmds.c
184
index XXXXXXX..XXXXXXX 100644
185
--- a/target/loongarch/loongarch-qmp-cmds.c
186
+++ b/target/loongarch/loongarch-qmp-cmds.c
187
@@ -XXX,XX +XXX,XX @@ CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
188
}
189
190
static const char *cpu_model_advertised_features[] = {
191
- "lsx", "lasx", NULL
192
+ "lsx", "lasx", "lbt", NULL
193
};
194
195
CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
196
--
212
--
197
2.34.1
213
2.43.5
diff view generated by jsdifflib
1
From: Bibo Mao <maobibo@loongson.cn>
1
Like LSX feature, add type OnOffAuto for LASX feature setting.
2
2
3
Implement PMU extension for LoongArch kvm mode. Use OnOffAuto type
4
variable pmu to check the PMU feature. If the PMU Feature is not supported
5
with KVM host, it reports error if there is pmu=on command line.
6
7
If there is no any command line about pmu parameter, it checks whether
8
KVM host supports the PMU Feature and set the corresponding value in cpucfg.
9
10
This patch is based on lbt patch located at
11
https://lore.kernel.org/qemu-devel/20240904061859.86615-1-maobibo@loongson.cn
12
13
Co-developed-by: Song Gao <gaosong@loongson.cn>
14
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
3
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
15
Reviewed-by: Song Gao <gaosong@loongson.cn>
4
Reviewed-by: Bibo Mao <maobibo@loongson.cn>
16
Message-Id: <20240918082315.2345034-1-maobibo@loongson.cn>
17
Signed-off-by: Song Gao <gaosong@loongson.cn>
18
---
5
---
19
target/loongarch/cpu.c | 19 +++++++++++++
6
target/loongarch/cpu.c | 50 +++++++++++++++++++++++------------
20
target/loongarch/cpu.h | 2 ++
7
target/loongarch/cpu.h | 2 ++
21
target/loongarch/kvm/kvm.c | 41 +++++++++++++++++++++++++++
8
target/loongarch/kvm/kvm.c | 53 ++++++++++++++++++++++++++++++++++++++
22
target/loongarch/loongarch-qmp-cmds.c | 2 +-
9
3 files changed, 89 insertions(+), 16 deletions(-)
23
4 files changed, 63 insertions(+), 1 deletion(-)
24
10
25
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
11
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
26
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
27
--- a/target/loongarch/cpu.c
13
--- a/target/loongarch/cpu.c
28
+++ b/target/loongarch/cpu.c
14
+++ b/target/loongarch/cpu.c
29
@@ -XXX,XX +XXX,XX @@ static void loongarch_set_lbt(Object *obj, bool value, Error **errp)
15
@@ -XXX,XX +XXX,XX @@ static void loongarch_set_lsx(Object *obj, bool value, Error **errp)
30
cpu->lbt = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
16
uint32_t val;
17
18
cpu->lsx = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
19
+ if (cpu->lsx == ON_OFF_AUTO_OFF) {
20
+ cpu->lasx = ON_OFF_AUTO_OFF;
21
+ if (cpu->lasx == ON_OFF_AUTO_ON) {
22
+ error_setg(errp, "Failed to disable LSX since LASX is enabled");
23
+ return;
24
+ }
25
+ }
26
+
27
if (kvm_enabled()) {
28
/* kvm feature detection in function kvm_arch_init_vcpu */
29
return;
30
@@ -XXX,XX +XXX,XX @@ static void loongarch_set_lsx(Object *obj, bool value, Error **errp)
31
error_setg(errp, "Failed to enable LSX in TCG mode");
32
return;
33
}
34
+ } else {
35
+ cpu->env.cpucfg[2] = FIELD_DP32(val, CPUCFG2, LASX, 0);
36
+ val = cpu->env.cpucfg[2];
37
}
38
39
cpu->env.cpucfg[2] = FIELD_DP32(val, CPUCFG2, LSX, value);
40
@@ -XXX,XX +XXX,XX @@ static void loongarch_set_lsx(Object *obj, bool value, Error **errp)
41
42
static bool loongarch_get_lasx(Object *obj, Error **errp)
43
{
44
- LoongArchCPU *cpu = LOONGARCH_CPU(obj);
45
- bool ret;
46
-
47
- if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LASX)) {
48
- ret = true;
49
- } else {
50
- ret = false;
51
- }
52
- return ret;
53
+ return LOONGARCH_CPU(obj)->lasx != ON_OFF_AUTO_OFF;
31
}
54
}
32
55
33
+static bool loongarch_get_pmu(Object *obj, Error **errp)
56
static void loongarch_set_lasx(Object *obj, bool value, Error **errp)
34
+{
35
+ return LOONGARCH_CPU(obj)->pmu != ON_OFF_AUTO_OFF;
36
+}
37
+
38
+static void loongarch_set_pmu(Object *obj, bool value, Error **errp)
39
+{
40
+ LoongArchCPU *cpu = LOONGARCH_CPU(obj);
41
+
42
+ cpu->pmu = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
43
+}
44
+
45
void loongarch_cpu_post_init(Object *obj)
46
{
57
{
47
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
58
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
59
+ uint32_t val;
60
61
- if (value) {
62
-    if (!FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LSX)) {
63
- cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LSX, 1);
64
-    }
65
- cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LASX, 1);
66
- } else {
67
- cpu->env.cpucfg[2] = FIELD_DP32(cpu->env.cpucfg[2], CPUCFG2, LASX, 0);
68
+ cpu->lasx = value ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF;
69
+ if ((cpu->lsx == ON_OFF_AUTO_OFF) && (cpu->lasx == ON_OFF_AUTO_ON)) {
70
+ error_setg(errp, "Failed to enable LASX since lSX is disabled");
71
+ return;
72
+ }
73
+
74
+ if (kvm_enabled()) {
75
+ /* kvm feature detection in function kvm_arch_init_vcpu */
76
+ return;
77
}
78
+
79
+ /* LASX feature detection in TCG mode */
80
+ val = cpu->env.cpucfg[2];
81
+ if (cpu->lasx == ON_OFF_AUTO_ON) {
82
+ if (FIELD_EX32(val, CPUCFG2, LASX) == 0) {
83
+ error_setg(errp, "Failed to enable LASX in TCG mode");
84
+ return;
85
+ }
86
+ }
87
+
88
+ cpu->env.cpucfg[2] = FIELD_DP32(val, CPUCFG2, LASX, value);
89
}
90
91
static bool loongarch_get_lbt(Object *obj, Error **errp)
48
@@ -XXX,XX +XXX,XX @@ void loongarch_cpu_post_init(Object *obj)
92
@@ -XXX,XX +XXX,XX @@ void loongarch_cpu_post_init(Object *obj)
49
loongarch_set_lbt);
93
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
50
object_property_set_description(obj, "lbt",
94
51
"Set off to disable Binary Tranlation.");
95
cpu->lsx = ON_OFF_AUTO_AUTO;
52
+
96
+ cpu->lasx = ON_OFF_AUTO_AUTO;
53
+ cpu->pmu = ON_OFF_AUTO_AUTO;
97
object_property_add_bool(obj, "lsx", loongarch_get_lsx,
54
+ object_property_add_bool(obj, "pmu", loongarch_get_pmu,
98
loongarch_set_lsx);
55
+ loongarch_set_pmu);
99
object_property_add_bool(obj, "lasx", loongarch_get_lasx,
56
+ object_property_set_description(obj, "pmu",
57
+ "Set off to performance monitor unit.");
58
+
59
} else {
60
cpu->lbt = ON_OFF_AUTO_OFF;
61
}
62
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
100
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
63
index XXXXXXX..XXXXXXX 100644
101
index XXXXXXX..XXXXXXX 100644
64
--- a/target/loongarch/cpu.h
102
--- a/target/loongarch/cpu.h
65
+++ b/target/loongarch/cpu.h
103
+++ b/target/loongarch/cpu.h
66
@@ -XXX,XX +XXX,XX @@ typedef struct LoongArchTLB LoongArchTLB;
104
@@ -XXX,XX +XXX,XX @@ typedef struct LoongArchTLB LoongArchTLB;
67
105
68
enum loongarch_features {
106
enum loongarch_features {
107
LOONGARCH_FEATURE_LSX,
108
+ LOONGARCH_FEATURE_LASX,
69
LOONGARCH_FEATURE_LBT, /* loongson binary translation extension */
109
LOONGARCH_FEATURE_LBT, /* loongson binary translation extension */
70
+ LOONGARCH_FEATURE_PMU,
110
LOONGARCH_FEATURE_PMU,
71
};
111
};
72
73
typedef struct LoongArchBT {
74
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
112
@@ -XXX,XX +XXX,XX @@ struct ArchCPU {
75
QEMUTimer timer;
76
uint32_t phy_id;
77
OnOffAuto lbt;
113
OnOffAuto lbt;
78
+ OnOffAuto pmu;
114
OnOffAuto pmu;
115
OnOffAuto lsx;
116
+ OnOffAuto lasx;
79
117
80
/* 'compatible' string for this CPU for Linux device trees */
118
/* 'compatible' string for this CPU for Linux device trees */
81
const char *dtb_compatible;
119
const char *dtb_compatible;
82
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
120
diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c
83
index XXXXXXX..XXXXXXX 100644
121
index XXXXXXX..XXXXXXX 100644
84
--- a/target/loongarch/kvm/kvm.c
122
--- a/target/loongarch/kvm/kvm.c
85
+++ b/target/loongarch/kvm/kvm.c
123
+++ b/target/loongarch/kvm/kvm.c
86
@@ -XXX,XX +XXX,XX @@ static bool kvm_feature_supported(CPUState *cs, enum loongarch_features feature)
124
@@ -XXX,XX +XXX,XX @@ static bool kvm_feature_supported(CPUState *cs, enum loongarch_features feature)
87
attr.attr = KVM_LOONGARCH_VM_FEAT_MIPSBT;
125
}
88
ret |= kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
126
return false;
89
return (ret == 0);
127
128
+ case LOONGARCH_FEATURE_LASX:
129
+ attr.group = KVM_LOONGARCH_VM_FEAT_CTRL;
130
+ attr.attr = KVM_LOONGARCH_VM_FEAT_LASX;
131
+ ret = kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
132
+ if (ret == 0) {
133
+ return true;
134
+ }
90
+
135
+
91
+ case LOONGARCH_FEATURE_PMU:
136
+ /* Fallback to old kernel detect interface */
92
+ attr.group = KVM_LOONGARCH_VM_FEAT_CTRL;
137
+ val = 0;
93
+ attr.attr = KVM_LOONGARCH_VM_FEAT_PMU;
138
+ attr.group = KVM_LOONGARCH_VCPU_CPUCFG;
94
+ ret = kvm_vm_ioctl(kvm_state, KVM_HAS_DEVICE_ATTR, &attr);
139
+ /* Cpucfg2 */
95
+ return (ret == 0);
140
+ attr.attr = 2;
141
+ attr.addr = (uint64_t)&val;
142
+ ret = kvm_vcpu_ioctl(cs, KVM_HAS_DEVICE_ATTR, &attr);
143
+ if (!ret) {
144
+ ret = kvm_vcpu_ioctl(cs, KVM_GET_DEVICE_ATTR, &attr);
145
+ if (ret) {
146
+ return false;
147
+ }
96
+
148
+
97
default:
149
+ ret = FIELD_EX32((uint32_t)val, CPUCFG2, LASX);
98
return false;
150
+ return (ret != 0);
99
}
151
+ }
152
+ return false;
100
+
153
+
101
+ return false;
154
case LOONGARCH_FEATURE_LBT:
102
}
155
/*
103
156
* Return all if all the LBT features are supported such as:
104
static int kvm_cpu_check_lbt(CPUState *cs, Error **errp)
157
@@ -XXX,XX +XXX,XX @@ static int kvm_cpu_check_lsx(CPUState *cs, Error **errp)
105
@@ -XXX,XX +XXX,XX @@ static int kvm_cpu_check_lbt(CPUState *cs, Error **errp)
106
return 0;
158
return 0;
107
}
159
}
108
160
109
+static int kvm_cpu_check_pmu(CPUState *cs, Error **errp)
161
+static int kvm_cpu_check_lasx(CPUState *cs, Error **errp)
110
+{
162
+{
163
+ CPULoongArchState *env = cpu_env(cs);
111
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
164
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
112
+ CPULoongArchState *env = cpu_env(cs);
113
+ bool kvm_supported;
165
+ bool kvm_supported;
114
+
166
+
115
+ kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_PMU);
167
+ kvm_supported = kvm_feature_supported(cs, LOONGARCH_FEATURE_LASX);
116
+ if (cpu->pmu == ON_OFF_AUTO_ON) {
168
+ env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LASX, 0);
117
+ if (!kvm_supported) {
169
+ if (cpu->lasx == ON_OFF_AUTO_ON) {
118
+ error_setg(errp, "'pmu' feature not supported by KVM on the host");
170
+ if (kvm_supported) {
171
+ env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LASX, 1);
172
+ } else {
173
+ error_setg(errp, "'lasx' feature not supported by KVM on host");
119
+ return -ENOTSUP;
174
+ return -ENOTSUP;
120
+ }
175
+ }
121
+ } else if (cpu->pmu != ON_OFF_AUTO_AUTO) {
176
+ } else if ((cpu->lasx == ON_OFF_AUTO_AUTO) && kvm_supported) {
122
+ /* disable pmu if ON_OFF_AUTO_OFF is set */
177
+ env->cpucfg[2] = FIELD_DP32(env->cpucfg[2], CPUCFG2, LASX, 1);
123
+ kvm_supported = false;
124
+ }
178
+ }
125
+
179
+
126
+ if (kvm_supported) {
127
+ env->cpucfg[6] = FIELD_DP32(env->cpucfg[6], CPUCFG6, PMP, 1);
128
+ env->cpucfg[6] = FIELD_DP32(env->cpucfg[6], CPUCFG6, PMNUM, 3);
129
+ env->cpucfg[6] = FIELD_DP32(env->cpucfg[6], CPUCFG6, PMBITS, 63);
130
+ env->cpucfg[6] = FIELD_DP32(env->cpucfg[6], CPUCFG6, UPM, 1);
131
+ }
132
+ return 0;
180
+ return 0;
133
+}
181
+}
134
+
182
+
135
int kvm_arch_init_vcpu(CPUState *cs)
183
static int kvm_cpu_check_lbt(CPUState *cs, Error **errp)
136
{
184
{
137
uint64_t val;
185
CPULoongArchState *env = cpu_env(cs);
138
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
186
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
139
if (ret < 0) {
140
error_report_err(local_err);
187
error_report_err(local_err);
141
}
188
}
142
+
189
143
+ ret = kvm_cpu_check_pmu(cs, &local_err);
190
+ ret = kvm_cpu_check_lasx(cs, &local_err);
144
+ if (ret < 0) {
191
+ if (ret < 0) {
145
+ error_report_err(local_err);
192
+ error_report_err(local_err);
146
+ }
193
+ }
147
+
194
+
148
return ret;
195
ret = kvm_cpu_check_lbt(cs, &local_err);
149
}
196
if (ret < 0) {
150
197
error_report_err(local_err);
151
diff --git a/target/loongarch/loongarch-qmp-cmds.c b/target/loongarch/loongarch-qmp-cmds.c
152
index XXXXXXX..XXXXXXX 100644
153
--- a/target/loongarch/loongarch-qmp-cmds.c
154
+++ b/target/loongarch/loongarch-qmp-cmds.c
155
@@ -XXX,XX +XXX,XX @@ CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
156
}
157
158
static const char *cpu_model_advertised_features[] = {
159
- "lsx", "lasx", "lbt", NULL
160
+ "lsx", "lasx", "lbt", "pmu", NULL
161
};
162
163
CpuModelExpansionInfo *qmp_query_cpu_model_expansion(CpuModelExpansionType type,
164
--
198
--
165
2.34.1
199
2.43.5
diff view generated by jsdifflib
Deleted patch
1
From: Bibo Mao <maobibo@loongson.cn>
2
1
3
since 6.11, unistd.h includes header file unistd_64.h directly on
4
some platforms, here add unistd_64.h on these platforms. Affected
5
platforms are ARM64, LoongArch64 and Riscv. Otherwise there will
6
be compiling error such as:
7
8
linux-headers/asm/unistd.h:3:10: fatal error: asm/unistd_64.h: No such file or directory
9
#include <asm/unistd_64.h>
10
11
Signed-off-by: Bibo Mao <maobibo@loongson.cn>
12
Acked-by: Song Gao <gaosong@loongson.cn>
13
Message-Id: <20241028023809.1554405-2-maobibo@loongson.cn>
14
Signed-off-by: Song Gao <gaosong@loongson.cn>
15
---
16
scripts/update-linux-headers.sh | 6 ++++++
17
1 file changed, 6 insertions(+)
18
19
diff --git a/scripts/update-linux-headers.sh b/scripts/update-linux-headers.sh
20
index XXXXXXX..XXXXXXX 100755
21
--- a/scripts/update-linux-headers.sh
22
+++ b/scripts/update-linux-headers.sh
23
@@ -XXX,XX +XXX,XX @@ EOF
24
fi
25
if [ $arch = arm64 ]; then
26
cp "$hdrdir/include/asm/sve_context.h" "$output/linux-headers/asm-arm64/"
27
+ cp "$hdrdir/include/asm/unistd_64.h" "$output/linux-headers/asm-arm64/"
28
fi
29
if [ $arch = x86 ]; then
30
cp "$hdrdir/include/asm/unistd_32.h" "$output/linux-headers/asm-x86/"
31
@@ -XXX,XX +XXX,XX @@ EOF
32
fi
33
if [ $arch = riscv ]; then
34
cp "$hdrdir/include/asm/ptrace.h" "$output/linux-headers/asm-riscv/"
35
+ cp "$hdrdir/include/asm/unistd_32.h" "$output/linux-headers/asm-riscv/"
36
+ cp "$hdrdir/include/asm/unistd_64.h" "$output/linux-headers/asm-riscv/"
37
+ fi
38
+ if [ $arch = loongarch ]; then
39
+ cp "$hdrdir/include/asm/unistd_64.h" "$output/linux-headers/asm-loongarch/"
40
fi
41
done
42
arch=
43
--
44
2.34.1
diff view generated by jsdifflib