From 6430d5ffb6cf76fb1dbd604d219d28e2c0922ac0 Mon Sep 17 00:00:00 2001 From: lixianglai Date: Tue, 10 Jan 2023 02:11:16 -0500 Subject: [PATCH] qemu support for loongarch. Add the following features to Loongarch: acpi simulation, rtc simulation, apic simulation, cpu and memory hotplug, north bridge simulation, loongarch cpu simulation, loongarch machine simulation, loongarch timer simulation, gdb feature. Signed-off-by: lixianglai --- BinDir.tar.gz | Bin 1602438 -> 2434824 bytes qemu-support-for-loongarch.patch | 30942 +++++++++++++++++++++++++++++ qemu.spec | 47 +- 3 files changed, 30984 insertions(+), 5 deletions(-) create mode 100644 qemu-support-for-loongarch.patch diff --git a/BinDir.tar.gz b/BinDir.tar.gz index 9d090b54e78449dd0b521b29676dc5021cb7603e..dd271d9116257dbe73739231f60952aeaed3cf50 100644 GIT binary patch delta 963137 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%0DwKM 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 tq*t$T*WgoauAP<6wjKJyOnbr*OAR#< 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%0A!2P$>i>qZ(Udi@QN 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

#NEPAvlaS0yJ-V-#!DObq%*9A80O>J+T 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 Yy`awhd48`2Em87Y1>OIkyLx{H` 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 z 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

R09!lXtU1;JXE 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%0D#qz^JBu{8e{xVK8s+2p=7;p)G$!^MRg`I( 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 diff --git a/qemu-support-for-loongarch.patch b/qemu-support-for-loongarch.patch new file mode 100644 index 00000000..cfa29724 --- /dev/null +++ b/qemu-support-for-loongarch.patch @@ -0,0 +1,30942 @@ +From 42f8a190c64170db1e1db31625c148aa7f46dbad Mon Sep 17 00:00:00 2001 +From: lixianglai +Date: Tue, 21 Mar 2023 04:34:19 -0400 +Subject: [PATCH] qemu-support-for-loongarch + +Signed-off-by: lixianglai +--- + .../devices/loongarch64-softmmu/default.mak | 158 + + configs/targets/loongarch64-softmmu.mak | 3 + + configure | 5 + + disas/loongarch.c | 2736 +++++++++++++ + disas/meson.build | 1 + + gdb-xml/loongarch-base64.xml | 45 + + gdb-xml/loongarch-fpu.xml | 50 + + hw/acpi/Kconfig | 8 + + hw/acpi/larch_7a.c | 616 +++ + hw/acpi/meson.build | 1 + + hw/loongarch/Kconfig | 17 + + hw/loongarch/acpi-build.c | 827 ++++ + hw/loongarch/acpi-build.h | 32 + + hw/loongarch/apic.c | 689 ++++ + hw/loongarch/ioapic.c | 419 ++ + hw/loongarch/iocsr.c | 227 ++ + hw/loongarch/ipi.c | 284 ++ + hw/loongarch/larch_3a.c | 2063 ++++++++++ + hw/loongarch/larch_hotplug.c | 377 ++ + hw/loongarch/larch_int.c | 87 + + hw/loongarch/ls7a_nb.c | 289 ++ + hw/loongarch/meson.build | 15 + + hw/loongarch/sysbus-fdt.c | 178 + + hw/meson.build | 1 + + hw/timer/Kconfig | 2 + + hw/timer/ls7a_rtc.c | 343 ++ + hw/timer/meson.build | 1 + + include/disas/dis-asm.h | 3 +- + include/elf.h | 2 + + include/hw/acpi/ls7a.h | 79 + + include/hw/loongarch/bios.h | 24 + + include/hw/loongarch/cpudevs.h | 71 + + include/hw/loongarch/larch.h | 164 + + include/hw/loongarch/ls7a.h | 167 + + include/hw/loongarch/sysbus-fdt.h | 33 + + include/qemu/osdep.h | 4 + + include/sysemu/arch_init.h | 1 + + linux-headers/asm-loongarch64/bitsperlong.h | 25 + + linux-headers/asm-loongarch64/kvm.h | 351 ++ + linux-headers/asm-loongarch64/sgidefs.h | 31 + + linux-headers/asm-loongarch64/unistd.h | 22 + + linux-headers/linux/kvm.h | 25 + + linux-user/elfload.c | 64 + + linux-user/loongarch64/cpu_loop.c | 179 + + linux-user/loongarch64/meson.build | 6 + + linux-user/loongarch64/signal.c | 218 ++ + linux-user/loongarch64/sockbits.h | 18 + + linux-user/loongarch64/syscall_nr.h | 304 ++ + linux-user/loongarch64/target_cpu.h | 47 + + linux-user/loongarch64/target_elf.h | 24 + + linux-user/loongarch64/target_fcntl.h | 23 + + linux-user/loongarch64/target_signal.h | 40 + + linux-user/loongarch64/target_structs.h | 63 + + linux-user/loongarch64/target_syscall.h | 63 + + linux-user/loongarch64/termbits.h | 241 ++ + linux-user/meson.build | 1 + + linux-user/qemu.h | 2 +- + linux-user/syscall.c | 3 + + linux-user/syscall_defs.h | 10 +- + meson.build | 7 +- + pc-bios/meson.build | 2 + + qapi/machine-target.json | 6 +- + qapi/machine.json | 2 +- + qapi/misc-target.json | 1 + + qemu-options.hx | 2 +- + softmmu/qdev-monitor.c | 2 +- + target/Kconfig | 1 + + target/loongarch64/Kconfig | 2 + + target/loongarch64/arch_dump.c | 179 + + target/loongarch64/cpu-csr.h | 880 +++++ + target/loongarch64/cpu-param.h | 46 + + target/loongarch64/cpu-qom.h | 54 + + target/loongarch64/cpu.c | 575 +++ + target/loongarch64/cpu.h | 359 ++ + target/loongarch64/csr_helper.c | 697 ++++ + target/loongarch64/fpu.c | 25 + + target/loongarch64/fpu_helper.c | 891 +++++ + target/loongarch64/fpu_helper.h | 127 + + target/loongarch64/gdbstub.c | 164 + + target/loongarch64/helper.c | 726 ++++ + target/loongarch64/helper.h | 178 + + target/loongarch64/insn.decode | 532 +++ + target/loongarch64/instmap.h | 217 + + target/loongarch64/internal.h | 207 + + target/loongarch64/kvm.c | 1366 +++++++ + target/loongarch64/kvm_larch.h | 49 + + target/loongarch64/larch-defs.h | 42 + + target/loongarch64/machine.c | 423 ++ + target/loongarch64/meson.build | 35 + + target/loongarch64/op_helper.c | 485 +++ + target/loongarch64/stabletimer.c | 117 + + target/loongarch64/tlb_helper.c | 641 +++ + target/loongarch64/trans.inc.c | 3482 +++++++++++++++++ + target/loongarch64/translate.c | 2705 +++++++++++++ + target/meson.build | 1 + + tcg/loongarch64/tcg-insn-defs.c.inc | 985 +++++ + tcg/loongarch64/tcg-target-con-set.h | 39 + + tcg/loongarch64/tcg-target-con-str.h | 36 + + tcg/loongarch64/tcg-target.c.inc | 1727 ++++++++ + tcg/loongarch64/tcg-target.h | 168 + + 100 files changed, 29953 insertions(+), 12 deletions(-) + create mode 100644 configs/devices/loongarch64-softmmu/default.mak + create mode 100644 configs/targets/loongarch64-softmmu.mak + create mode 100644 disas/loongarch.c + create mode 100644 gdb-xml/loongarch-base64.xml + create mode 100644 gdb-xml/loongarch-fpu.xml + create mode 100644 hw/acpi/larch_7a.c + create mode 100644 hw/loongarch/Kconfig + create mode 100644 hw/loongarch/acpi-build.c + create mode 100644 hw/loongarch/acpi-build.h + create mode 100644 hw/loongarch/apic.c + create mode 100644 hw/loongarch/ioapic.c + create mode 100644 hw/loongarch/iocsr.c + create mode 100644 hw/loongarch/ipi.c + create mode 100644 hw/loongarch/larch_3a.c + create mode 100644 hw/loongarch/larch_hotplug.c + create mode 100644 hw/loongarch/larch_int.c + create mode 100644 hw/loongarch/ls7a_nb.c + create mode 100644 hw/loongarch/meson.build + create mode 100644 hw/loongarch/sysbus-fdt.c + create mode 100644 hw/timer/ls7a_rtc.c + create mode 100644 include/hw/acpi/ls7a.h + create mode 100644 include/hw/loongarch/bios.h + create mode 100644 include/hw/loongarch/cpudevs.h + create mode 100644 include/hw/loongarch/larch.h + create mode 100644 include/hw/loongarch/ls7a.h + create mode 100644 include/hw/loongarch/sysbus-fdt.h + create mode 100644 linux-headers/asm-loongarch64/bitsperlong.h + create mode 100644 linux-headers/asm-loongarch64/kvm.h + create mode 100644 linux-headers/asm-loongarch64/sgidefs.h + create mode 100644 linux-headers/asm-loongarch64/unistd.h + create mode 100644 linux-user/loongarch64/cpu_loop.c + create mode 100644 linux-user/loongarch64/meson.build + create mode 100644 linux-user/loongarch64/signal.c + create mode 100644 linux-user/loongarch64/sockbits.h + create mode 100644 linux-user/loongarch64/syscall_nr.h + create mode 100644 linux-user/loongarch64/target_cpu.h + create mode 100644 linux-user/loongarch64/target_elf.h + create mode 100644 linux-user/loongarch64/target_fcntl.h + create mode 100644 linux-user/loongarch64/target_signal.h + create mode 100644 linux-user/loongarch64/target_structs.h + create mode 100644 linux-user/loongarch64/target_syscall.h + create mode 100644 linux-user/loongarch64/termbits.h + create mode 100644 target/loongarch64/Kconfig + create mode 100644 target/loongarch64/arch_dump.c + create mode 100644 target/loongarch64/cpu-csr.h + create mode 100644 target/loongarch64/cpu-param.h + create mode 100644 target/loongarch64/cpu-qom.h + create mode 100644 target/loongarch64/cpu.c + create mode 100644 target/loongarch64/cpu.h + create mode 100644 target/loongarch64/csr_helper.c + create mode 100644 target/loongarch64/fpu.c + create mode 100644 target/loongarch64/fpu_helper.c + create mode 100644 target/loongarch64/fpu_helper.h + create mode 100644 target/loongarch64/gdbstub.c + create mode 100644 target/loongarch64/helper.c + create mode 100644 target/loongarch64/helper.h + create mode 100644 target/loongarch64/insn.decode + create mode 100644 target/loongarch64/instmap.h + create mode 100644 target/loongarch64/internal.h + create mode 100644 target/loongarch64/kvm.c + create mode 100644 target/loongarch64/kvm_larch.h + create mode 100644 target/loongarch64/larch-defs.h + create mode 100644 target/loongarch64/machine.c + create mode 100644 target/loongarch64/meson.build + create mode 100644 target/loongarch64/op_helper.c + create mode 100644 target/loongarch64/stabletimer.c + create mode 100644 target/loongarch64/tlb_helper.c + create mode 100644 target/loongarch64/trans.inc.c + create mode 100644 target/loongarch64/translate.c + create mode 100644 tcg/loongarch64/tcg-insn-defs.c.inc + create mode 100644 tcg/loongarch64/tcg-target-con-set.h + create mode 100644 tcg/loongarch64/tcg-target-con-str.h + create mode 100644 tcg/loongarch64/tcg-target.c.inc + create mode 100644 tcg/loongarch64/tcg-target.h + +diff --git a/configs/devices/loongarch64-softmmu/default.mak b/configs/devices/loongarch64-softmmu/default.mak +new file mode 100644 +index 0000000000..c4cc246833 +--- /dev/null ++++ b/configs/devices/loongarch64-softmmu/default.mak +@@ -0,0 +1,158 @@ ++# Default configuration for loongarch-softmmu ++ ++CONFIG_PCI=y ++CONFIG_ACPI_PCI=y ++# For now, CONFIG_IDE_CORE requires ISA, so we enable it here ++CONFIG_ISA_BUS=y ++CONFIG_VIRTIO_PCI=y ++ ++CONFIG_VGA_PCI=y ++CONFIG_ACPI_SMBUS=y ++CONFIG_VHOST_USER_SCSI=y ++CONFIG_VHOST_USER_BLK=y ++CONFIG_VIRTIO=y ++CONFIG_VIRTIO_BALLOON=y ++CONFIG_VIRTIO_BLK=y ++CONFIG_VIRTIO_CRYPTO=y ++CONFIG_VIRTIO_GPU=y ++CONFIG_VIRTIO_INPUT=y ++CONFIG_VIRTIO_NET=y ++CONFIG_VIRTIO_RNG=y ++CONFIG_SCSI=y ++CONFIG_VIRTIO_SCSI=y ++CONFIG_VIRTIO_SERIAL=y ++ ++CONFIG_USB_UHCI=y ++CONFIG_USB_OHCI=y ++CONFIG_USB_OHCI_PCI=y ++CONFIG_USB_XHCI=y ++CONFIG_USB_XHCI_NEC=y ++CONFIG_NE2000_PCI=y ++CONFIG_EEPRO100_PCI=y ++CONFIG_PCNET_PCI=y ++CONFIG_PCNET_COMMON=y ++CONFIG_AC97=y ++CONFIG_HDA=y ++CONFIG_ES1370=y ++CONFIG_SCSI=y ++CONFIG_LSI_SCSI_PCI=y ++CONFIG_VMW_PVSCSI_SCSI_PCI=y ++CONFIG_MEGASAS_SCSI_PCI=y ++CONFIG_MPTSAS_SCSI_PCI=y ++CONFIG_RTL8139_PCI=y ++CONFIG_E1000_PCI=y ++CONFIG_IDE_CORE=y ++CONFIG_IDE_QDEV=y ++CONFIG_IDE_PCI=y ++CONFIG_AHCI=y ++CONFIG_AHCI_ICH9=y ++CONFIG_ESP=y ++CONFIG_ESP_PCI=y ++CONFIG_SERIAL=y ++CONFIG_SERIAL_ISA=y ++CONFIG_SERIAL_PCI=y ++CONFIG_CAN_BUS=y ++CONFIG_CAN_SJA1000=y ++CONFIG_CAN_PCI=y ++CONFIG_USB_UHCI=y ++CONFIG_USB_OHCI=y ++CONFIG_USB_XHCI=y ++CONFIG_USB_XHCI_NEC=y ++CONFIG_NE2000_PCI=y ++CONFIG_EEPRO100_PCI=y ++CONFIG_PCNET_PCI=y ++CONFIG_PCNET_COMMON=y ++CONFIG_AC97=y ++CONFIG_HDA=y ++CONFIG_ES1370=y ++CONFIG_SCSI=y ++CONFIG_LSI_SCSI_PCI=y ++CONFIG_VMW_PVSCSI_SCSI_PCI=y ++CONFIG_MEGASAS_SCSI_PCI=y ++CONFIG_MPTSAS_SCSI_PCI=y ++CONFIG_RTL8139_PCI=y ++CONFIG_E1000_PCI=y ++CONFIG_IDE_CORE=y ++CONFIG_IDE_QDEV=y ++CONFIG_IDE_PCI=y ++CONFIG_AHCI=y ++CONFIG_ESP=y ++CONFIG_ESP_PCI=y ++CONFIG_SERIAL=y ++CONFIG_SERIAL_ISA=y ++CONFIG_SERIAL_PCI=y ++CONFIG_CAN_BUS=y ++CONFIG_CAN_SJA1000=y ++CONFIG_CAN_PCI=y ++ ++CONFIG_SPICE=y ++CONFIG_QXL=y ++CONFIG_ESP=y ++CONFIG_SCSI=y ++CONFIG_VGA_ISA=y ++CONFIG_VGA_ISA_MM=y ++CONFIG_VGA_CIRRUS=y ++CONFIG_VMWARE_VGA=y ++CONFIG_VIRTIO_VGA=y ++CONFIG_SERIAL=y ++CONFIG_SERIAL_ISA=y ++CONFIG_PARALLEL=y ++CONFIG_I8254=y ++CONFIG_PCSPK=y ++CONFIG_PCKBD=y ++CONFIG_FDC=y ++CONFIG_ACPI=y ++CONFIG_ACPI_MEMORY_HOTPLUG=y ++CONFIG_ACPI_NVDIMM=y ++CONFIG_ACPI_CPU_HOTPLUG=y ++CONFIG_APM=y ++CONFIG_I8257=y ++CONFIG_PIIX4=y ++CONFIG_IDE_ISA=y ++CONFIG_IDE_PIIX=y ++CONFIG_MIPSNET=y ++CONFIG_PFLASH_CFI01=y ++CONFIG_I8259=y ++CONFIG_MC146818RTC=y ++CONFIG_ISA_TESTDEV=y ++CONFIG_EMPTY_SLOT=y ++CONFIG_I2C=y ++CONFIG_DIMM=y ++CONFIG_MEM_DEVICE=y ++ ++# Arch Specified CONFIG defines ++CONFIG_IDE_VIA=y ++CONFIG_VT82C686=y ++CONFIG_RC4030=y ++CONFIG_DP8393X=y ++CONFIG_DS1225Y=y ++CONFIG_FITLOADER=y ++CONFIG_SMBIOS=y ++ ++CONFIG_PCIE_PORT=y ++CONFIG_I82801B11=y ++CONFIG_XIO3130=y ++CONFIG_PCI_EXPRESS=y ++CONFIG_MSI_NONBROKEN=y ++CONFIG_IOH3420=y ++CONFIG_SD=y ++CONFIG_SDHCI=y ++CONFIG_VIRTFS=y ++CONFIG_VIRTIO_9P=y ++CONFIG_USB_EHCI=y ++CONFIG_USB_EHCI_PCI=y ++CONFIG_USB_EHCI_SYSBUS=y ++CONFIG_USB_STORAGE_BOT=y ++CONFIG_TPM_EMULATOR=y ++CONFIG_TPM_TIS=y ++CONFIG_PLATFORM_BUS=y ++CONFIG_TPM_TIS_SYSBUS=y ++CONFIG_ACPI_LOONGARCH=y ++CONFIG_LS7A_RTC=y ++ ++#vfio config ++CONFIG_VFIO=y ++CONFIG_VFIO_PCI=y ++CONFIG_VFIO_PLATFORM=y ++CONFIG_VFIO_XGMAC=y ++CONFIG_VFIO_AMD_XGBE=y +diff --git a/configs/targets/loongarch64-softmmu.mak b/configs/targets/loongarch64-softmmu.mak +new file mode 100644 +index 0000000000..c42dfbbd9c +--- /dev/null ++++ b/configs/targets/loongarch64-softmmu.mak +@@ -0,0 +1,3 @@ ++TARGET_ARCH=loongarch64 ++TARGET_SUPPORTS_MTTCG=y ++TARGET_XML_FILES= gdb-xml/loongarch-base64.xml gdb-xml/loongarch-fpu.xml +diff --git a/configure b/configure +index 2576d1c693..a84dc891cc 100755 +--- a/configure ++++ b/configure +@@ -579,6 +579,8 @@ elif check_define __arm__ ; then + cpu="arm" + elif check_define __aarch64__ ; then + cpu="aarch64" ++elif check_define __loongarch__ ; then ++ cpu="loongarch64" + else + cpu=$(uname -m) + fi +@@ -604,6 +606,9 @@ case "$cpu" in + aarch64) + cpu="aarch64" + ;; ++ loongarch64) ++ cpu="loongarch64" ++ ;; + mips*) + cpu="mips" + ;; +diff --git a/disas/loongarch.c b/disas/loongarch.c +new file mode 100644 +index 0000000000..b3f38e99ab +--- /dev/null ++++ b/disas/loongarch.c +@@ -0,0 +1,2736 @@ ++/* ++ * QEMU Loongarch Disassembler ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ */ ++ ++#include "qemu/osdep.h" ++#include "disas/dis-asm.h" ++ ++#define INSNLEN 4 ++ ++/* types */ ++typedef uint16_t la_opcode; ++ ++/* enums */ ++typedef enum { ++ la_op_illegal = 0, ++ la_op_gr2scr = 1, ++ la_op_scr2gr = 2, ++ la_op_clo_w = 3, ++ la_op_clz_w = 4, ++ la_op_cto_w = 5, ++ la_op_ctz_w = 6, ++ la_op_clo_d = 7, ++ la_op_clz_d = 8, ++ la_op_cto_d = 9, ++ la_op_ctz_d = 10, ++ la_op_revb_2h = 11, ++ la_op_revb_4h = 12, ++ la_op_revb_2w = 13, ++ la_op_revb_d = 14, ++ la_op_revh_2w = 15, ++ la_op_revh_d = 16, ++ la_op_bitrev_4b = 17, ++ la_op_bitrev_8b = 18, ++ la_op_bitrev_w = 19, ++ la_op_bitrev_d = 20, ++ la_op_ext_w_h = 21, ++ la_op_ext_w_b = 22, ++ la_op_rdtime_d = 23, ++ la_op_cpucfg = 24, ++ la_op_asrtle_d = 25, ++ la_op_asrtgt_d = 26, ++ la_op_alsl_w = 27, ++ la_op_alsl_wu = 28, ++ la_op_bytepick_w = 29, ++ la_op_bytepick_d = 30, ++ la_op_add_w = 31, ++ la_op_add_d = 32, ++ la_op_sub_w = 33, ++ la_op_sub_d = 34, ++ la_op_slt = 35, ++ la_op_sltu = 36, ++ la_op_maskeqz = 37, ++ la_op_masknez = 38, ++ la_op_nor = 39, ++ la_op_and = 40, ++ la_op_or = 41, ++ la_op_xor = 42, ++ la_op_orn = 43, ++ la_op_andn = 44, ++ la_op_sll_w = 45, ++ la_op_srl_w = 46, ++ la_op_sra_w = 47, ++ la_op_sll_d = 48, ++ la_op_srl_d = 49, ++ la_op_sra_d = 50, ++ la_op_rotr_w = 51, ++ la_op_rotr_d = 52, ++ la_op_mul_w = 53, ++ la_op_mulh_w = 54, ++ la_op_mulh_wu = 55, ++ la_op_mul_d = 56, ++ la_op_mulh_d = 57, ++ la_op_mulh_du = 58, ++ la_op_mulw_d_w = 59, ++ la_op_mulw_d_wu = 60, ++ la_op_div_w = 61, ++ la_op_mod_w = 62, ++ la_op_div_wu = 63, ++ la_op_mod_wu = 64, ++ la_op_div_d = 65, ++ la_op_mod_d = 66, ++ la_op_div_du = 67, ++ la_op_mod_du = 68, ++ la_op_crc_w_b_w = 69, ++ la_op_crc_w_h_w = 70, ++ la_op_crc_w_w_w = 71, ++ la_op_crc_w_d_w = 72, ++ la_op_crcc_w_b_w = 73, ++ la_op_crcc_w_h_w = 74, ++ la_op_crcc_w_w_w = 75, ++ la_op_crcc_w_d_w = 76, ++ la_op_break = 77, ++ la_op_dbcl = 78, ++ la_op_syscall = 79, ++ la_op_alsl_d = 80, ++ la_op_slli_w = 81, ++ la_op_slli_d = 82, ++ la_op_srli_w = 83, ++ la_op_srli_d = 84, ++ la_op_srai_w = 85, ++ la_op_srai_d = 86, ++ la_op_rotri_w = 87, ++ la_op_rotri_d = 88, ++ la_op_bstrins_w = 89, ++ la_op_bstrpick_w = 90, ++ la_op_bstrins_d = 91, ++ la_op_bstrpick_d = 92, ++ la_op_fadd_s = 93, ++ la_op_fadd_d = 94, ++ la_op_fsub_s = 95, ++ la_op_fsub_d = 96, ++ la_op_fmul_s = 97, ++ la_op_fmul_d = 98, ++ la_op_fdiv_s = 99, ++ la_op_fdiv_d = 100, ++ la_op_fmax_s = 101, ++ la_op_fmax_d = 102, ++ la_op_fmin_s = 103, ++ la_op_fmin_d = 104, ++ la_op_fmaxa_s = 105, ++ la_op_fmaxa_d = 106, ++ la_op_fmina_s = 107, ++ la_op_fmina_d = 108, ++ la_op_fscaleb_s = 109, ++ la_op_fscaleb_d = 110, ++ la_op_fcopysign_s = 111, ++ la_op_fcopysign_d = 112, ++ la_op_fabs_s = 113, ++ la_op_fabs_d = 114, ++ la_op_fneg_s = 115, ++ la_op_fneg_d = 116, ++ la_op_flogb_s = 117, ++ la_op_flogb_d = 118, ++ la_op_fclass_s = 119, ++ la_op_fclass_d = 120, ++ la_op_fsqrt_s = 121, ++ la_op_fsqrt_d = 122, ++ la_op_frecip_s = 123, ++ la_op_frecip_d = 124, ++ la_op_frsqrt_s = 125, ++ la_op_frsqrt_d = 126, ++ la_op_fmov_s = 127, ++ la_op_fmov_d = 128, ++ la_op_movgr2fr_w = 129, ++ la_op_movgr2fr_d = 130, ++ la_op_movgr2frh_w = 131, ++ la_op_movfr2gr_s = 132, ++ la_op_movfr2gr_d = 133, ++ la_op_movfrh2gr_s = 134, ++ la_op_movgr2fcsr = 135, ++ la_op_movfcsr2gr = 136, ++ la_op_movfr2cf = 137, ++ la_op_movcf2fr = 138, ++ la_op_movgr2cf = 139, ++ la_op_movcf2gr = 140, ++ la_op_fcvt_s_d = 141, ++ la_op_fcvt_d_s = 142, ++ ++ la_op_ftintrm_w_s = 143, ++ la_op_ftintrm_w_d = 144, ++ la_op_ftintrm_l_s = 145, ++ la_op_ftintrm_l_d = 146, ++ la_op_ftintrp_w_s = 147, ++ la_op_ftintrp_w_d = 148, ++ la_op_ftintrp_l_s = 149, ++ la_op_ftintrp_l_d = 150, ++ la_op_ftintrz_w_s = 151, ++ la_op_ftintrz_w_d = 152, ++ la_op_ftintrz_l_s = 153, ++ la_op_ftintrz_l_d = 154, ++ la_op_ftintrne_w_s = 155, ++ la_op_ftintrne_w_d = 156, ++ la_op_ftintrne_l_s = 157, ++ la_op_ftintrne_l_d = 158, ++ la_op_ftint_w_s = 159, ++ la_op_ftint_w_d = 160, ++ la_op_ftint_l_s = 161, ++ la_op_ftint_l_d = 162, ++ la_op_ffint_s_w = 163, ++ la_op_ffint_s_l = 164, ++ la_op_ffint_d_w = 165, ++ la_op_ffint_d_l = 166, ++ la_op_frint_s = 167, ++ la_op_frint_d = 168, ++ ++ la_op_slti = 169, ++ la_op_sltui = 170, ++ la_op_addi_w = 171, ++ la_op_addi_d = 172, ++ la_op_lu52i_d = 173, ++ la_op_addi = 174, ++ la_op_ori = 175, ++ la_op_xori = 176, ++ ++ la_op_csrxchg = 177, ++ la_op_cacop = 178, ++ la_op_lddir = 179, ++ la_op_ldpte = 180, ++ la_op_iocsrrd_b = 181, ++ la_op_iocsrrd_h = 182, ++ la_op_iocsrrd_w = 183, ++ la_op_iocsrrd_d = 184, ++ la_op_iocsrwr_b = 185, ++ la_op_iocsrwr_h = 186, ++ la_op_iocsrwr_w = 187, ++ la_op_iocsrwr_d = 188, ++ la_op_tlbclr = 189, ++ la_op_tlbflush = 190, ++ la_op_tlbsrch = 191, ++ la_op_tlbrd = 192, ++ la_op_tlbwr = 193, ++ la_op_tlbfill = 194, ++ la_op_ertn = 195, ++ la_op_idle = 196, ++ la_op_invtlb = 197, ++ ++ la_op_fmadd_s = 198, ++ la_op_fmadd_d = 199, ++ la_op_fmsub_s = 200, ++ la_op_fmsub_d = 201, ++ la_op_fnmadd_s = 202, ++ la_op_fnmadd_d = 203, ++ la_op_fnmsub_s = 204, ++ la_op_fnmsub_d = 205, ++ la_op_fcmp_cond_s = 206, ++ la_op_fcmp_cond_d = 207, ++ la_op_fsel = 208, ++ la_op_addu16i_d = 209, ++ la_op_lu12i_w = 210, ++ la_op_lu32i_d = 211, ++ la_op_pcaddi = 212, ++ la_op_pcalau12i = 213, ++ la_op_pcaddu12i = 214, ++ la_op_pcaddu18i = 215, ++ ++ la_op_ll_w = 216, ++ la_op_sc_w = 217, ++ la_op_ll_d = 218, ++ la_op_sc_d = 219, ++ la_op_ldptr_w = 220, ++ la_op_stptr_w = 221, ++ la_op_ldptr_d = 222, ++ la_op_stptr_d = 223, ++ la_op_ld_b = 224, ++ la_op_ld_h = 225, ++ la_op_ld_w = 226, ++ la_op_ld_d = 227, ++ la_op_st_b = 228, ++ la_op_st_h = 229, ++ la_op_st_w = 230, ++ la_op_st_d = 231, ++ la_op_ld_bu = 232, ++ la_op_ld_hu = 233, ++ la_op_ld_wu = 234, ++ la_op_preld = 235, ++ la_op_fld_s = 236, ++ la_op_fst_s = 237, ++ la_op_fld_d = 238, ++ la_op_fst_d = 239, ++ la_op_ldl_w = 240, ++ la_op_ldr_w = 241, ++ la_op_ldl_d = 242, ++ la_op_ldr_d = 243, ++ la_op_stl_d = 244, ++ la_op_str_d = 245, ++ la_op_ldx_b = 246, ++ la_op_ldx_h = 247, ++ la_op_ldx_w = 248, ++ la_op_ldx_d = 249, ++ la_op_stx_b = 250, ++ la_op_stx_h = 251, ++ la_op_stx_w = 252, ++ la_op_stx_d = 253, ++ la_op_ldx_bu = 254, ++ la_op_ldx_hu = 255, ++ la_op_ldx_wu = 256, ++ la_op_fldx_s = 257, ++ la_op_fldx_d = 258, ++ la_op_fstx_s = 259, ++ la_op_fstx_d = 260, ++ ++ la_op_amswap_w = 261, ++ la_op_amswap_d = 262, ++ la_op_amadd_w = 263, ++ la_op_amadd_d = 264, ++ la_op_amand_w = 265, ++ la_op_amand_d = 266, ++ la_op_amor_w = 267, ++ la_op_amor_d = 268, ++ la_op_amxor_w = 269, ++ la_op_amxor_d = 270, ++ la_op_ammax_w = 271, ++ la_op_ammax_d = 272, ++ la_op_ammin_w = 273, ++ la_op_ammin_d = 274, ++ la_op_ammax_wu = 275, ++ la_op_ammax_du = 276, ++ la_op_ammin_wu = 277, ++ la_op_ammin_du = 278, ++ la_op_amswap_db_w = 279, ++ la_op_amswap_db_d = 280, ++ la_op_amadd_db_w = 281, ++ la_op_amadd_db_d = 282, ++ la_op_amand_db_w = 283, ++ la_op_amand_db_d = 284, ++ la_op_amor_db_w = 285, ++ la_op_amor_db_d = 286, ++ la_op_amxor_db_w = 287, ++ la_op_amxor_db_d = 288, ++ la_op_ammax_db_w = 289, ++ la_op_ammax_db_d = 290, ++ la_op_ammin_db_w = 291, ++ la_op_ammin_db_d = 292, ++ la_op_ammax_db_wu = 293, ++ la_op_ammax_db_du = 294, ++ la_op_ammin_db_wu = 295, ++ la_op_ammin_db_du = 296, ++ la_op_dbar = 297, ++ la_op_ibar = 298, ++ la_op_fldgt_s = 299, ++ la_op_fldgt_d = 300, ++ la_op_fldle_s = 301, ++ la_op_fldle_d = 302, ++ la_op_fstgt_s = 303, ++ la_op_fstgt_d = 304, ++ ls_op_fstle_s = 305, ++ la_op_fstle_d = 306, ++ la_op_ldgt_b = 307, ++ la_op_ldgt_h = 308, ++ la_op_ldgt_w = 309, ++ la_op_ldgt_d = 310, ++ la_op_ldle_b = 311, ++ la_op_ldle_h = 312, ++ la_op_ldle_w = 313, ++ la_op_ldle_d = 314, ++ la_op_stgt_b = 315, ++ la_op_stgt_h = 316, ++ la_op_stgt_w = 317, ++ la_op_stgt_d = 318, ++ la_op_stle_b = 319, ++ la_op_stle_h = 320, ++ la_op_stle_w = 321, ++ la_op_stle_d = 322, ++ la_op_beqz = 323, ++ la_op_bnez = 324, ++ la_op_bceqz = 325, ++ la_op_bcnez = 326, ++ la_op_jirl = 327, ++ la_op_b = 328, ++ la_op_bl = 329, ++ la_op_beq = 330, ++ la_op_bne = 331, ++ la_op_blt = 332, ++ la_op_bge = 333, ++ la_op_bltu = 334, ++ la_op_bgeu = 335, ++ ++ /* vz insn */ ++ la_op_hvcl = 336, ++ ++} la_op; ++ ++typedef enum { ++ la_codec_illegal, ++ la_codec_empty, ++ la_codec_2r, ++ la_codec_2r_u5, ++ la_codec_2r_u6, ++ la_codec_2r_2bw, ++ la_codec_2r_2bd, ++ la_codec_3r, ++ la_codec_3r_rd0, ++ la_codec_3r_sa2, ++ la_codec_3r_sa3, ++ la_codec_4r, ++ la_codec_r_im20, ++ la_codec_2r_im16, ++ la_codec_2r_im14, ++ la_codec_2r_im12, ++ la_codec_im5_r_im12, ++ la_codec_2r_im8, ++ la_codec_r_sd, ++ la_codec_r_sj, ++ la_codec_r_cd, ++ la_codec_r_cj, ++ la_codec_r_seq, ++ la_codec_code, ++ la_codec_whint, ++ la_codec_invtlb, ++ la_codec_r_ofs21, ++ la_codec_cj_ofs21, ++ la_codec_ofs26, ++ la_codec_cond, ++ la_codec_sel, ++ ++} la_codec; ++ ++#define la_fmt_illegal "nte" ++#define la_fmt_empty "nt" ++#define la_fmt_sd_rj "ntA,1" ++#define la_fmt_rd_sj "nt0,B" ++#define la_fmt_rd_rj "nt0,1" ++#define la_fmt_rj_rk "nt1,2" ++#define la_fmt_rj_seq "nt1,x" ++#define la_fmt_rd_si20 "nt0,i(x)" ++#define la_fmt_rd_rj_ui5 "nt0,1,C" ++#define la_fmt_rd_rj_ui6 "nt0,1.C" ++#define la_fmt_rd_rj_level "nt0,1,x" ++#define la_fmt_rd_rj_msbw_lsbw "nt0,1,C,D" ++#define la_fmt_rd_rj_msbd_lsbd "nt0,1,C,D" ++#define la_fmt_rd_rj_si12 "nt0,1,i(x)" ++#define la_fmt_hint_rj_si12 "ntE,1,i(x)" ++#define la_fmt_rd_rj_csr "nt0,1,x" ++#define la_fmt_rd_rj_si14 "nt0,1,i(x)" ++#define la_fmt_rd_rj_si16 "nt0,1,i(x)" ++#define la_fmt_rd_rj_rk "nt0,1,2" ++#define la_fmt_fd_rj_rk "nt3,1,2" ++#define la_fmt_rd_rj_rk_sa2 "nt0,1,2,D" ++#define la_fmt_rd_rj_rk_sa3 "nt0,1,2,D" ++#define la_fmt_fd_rj "nt3,1" ++#define la_fmt_rd_fj "nt0,4" ++#define la_fmt_fd_fj "nt3,4" ++#define la_fmt_fd_fj_si12 "nt3,4,i(x)" ++#define la_fmt_fcsrd_rj "ntF,1" ++#define la_fmt_rd_fcsrs "nt0,G" ++#define la_fmt_cd_fj "ntH,4" ++#define la_fmt_fd_cj "nt3,I" ++#define la_fmt_fd_fj_fk "nt3,4,5" ++#define la_fmt_code "ntJ" ++#define la_fmt_whint "ntx" ++#define la_fmt_invtlb "ntx,1,2" /* op,rj,rk */ ++#define la_fmt_offs26 "nto(X)p" ++#define la_fmt_rj_offs21 "nt1,o(X)p" ++#define la_fmt_cj_offs21 "ntQ,o(X)p" ++#define la_fmt_rd_rj_offs16 "nt0,1,o(X)" ++#define la_fmt_rj_rd_offs16 "nt1,0,o(X)p" ++#define la_fmt_s_cd_fj_fk "K.stH,4,5" ++#define la_fmt_d_cd_fj_fk "K.dtH,4,5" ++#define la_fmt_fd_fj_fk_fa "nt3,4,5,6" ++#define la_fmt_fd_fj_fk_ca "nt3,4,5,L" ++#define la_fmt_cop_rj_si12 "ntM,1,i(x)" ++ ++/* structures */ ++ ++typedef struct { ++ uint32_t pc; ++ uint32_t insn; ++ int32_t imm; ++ int32_t imm2; ++ uint16_t op; ++ uint16_t code; ++ uint8_t codec; ++ uint8_t r1; ++ uint8_t r2; ++ uint8_t r3; ++ uint8_t r4; ++ uint8_t bit; ++} la_decode; ++ ++typedef struct { ++ const char *const name; ++ const la_codec codec; ++ const char *const format; ++} la_opcode_data; ++ ++/* reg names */ ++const char *const loongarch_r_normal_name[32] = { ++ "$r0", "$r1", "$r2", "$r3", "$r4", "$r5", "$r6", "$r7", ++ "$r8", "$r9", "$r10", "$r11", "$r12", "$r13", "$r14", "$r15", ++ "$r16", "$r17", "$r18", "$r19", "$r20", "$r21", "$r22", "$r23", ++ "$r24", "$r25", "$r26", "$r27", "$r28", "$r29", "$r30", "$r31", ++}; ++ ++const char *const loongarch_f_normal_name[32] = { ++ "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7", ++ "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15", ++ "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23", ++ "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31", ++}; ++ ++const char *const loongarch_cr_normal_name[4] = { ++ "$scr0", ++ "$scr1", ++ "$scr2", ++ "$scr3", ++}; ++ ++const char *const loongarch_c_normal_name[8] = { ++ "$fcc0", "$fcc1", "$fcc2", "$fcc3", "$fcc4", "$fcc5", "$fcc6", "$fcc7", ++}; ++ ++/* instruction data */ ++const la_opcode_data opcode_la[] = { ++ { "illegal", la_codec_illegal, la_fmt_illegal }, ++ { "gr2scr", la_codec_r_sd, la_fmt_sd_rj }, ++ { "scr2gr", la_codec_r_sj, la_fmt_rd_sj }, ++ { "clo.w", la_codec_2r, la_fmt_rd_rj }, ++ { "clz.w", la_codec_2r, la_fmt_rd_rj }, ++ { "cto.w", la_codec_2r, la_fmt_rd_rj }, ++ { "ctz.w", la_codec_2r, la_fmt_rd_rj }, ++ { "clo.d", la_codec_2r, la_fmt_rd_rj }, ++ { "clz.d", la_codec_2r, la_fmt_rd_rj }, ++ { "cto.d", la_codec_2r, la_fmt_rd_rj }, ++ { "ctz_d", la_codec_2r, la_fmt_rd_rj }, ++ { "revb.2h", la_codec_2r, la_fmt_rd_rj }, ++ { "revb.4h", la_codec_2r, la_fmt_rd_rj }, ++ { "revb.2w", la_codec_2r, la_fmt_rd_rj }, ++ { "revb.d", la_codec_2r, la_fmt_rd_rj }, ++ { "revh.2w", la_codec_2r, la_fmt_rd_rj }, ++ { "revh.d", la_codec_2r, la_fmt_rd_rj }, ++ { "bitrev.4b", la_codec_2r, la_fmt_rd_rj }, ++ { "bitrev.8b", la_codec_2r, la_fmt_rd_rj }, ++ { "bitrev.w", la_codec_2r, la_fmt_rd_rj }, ++ { "bitrev.d", la_codec_2r, la_fmt_rd_rj }, ++ { "ext.w.h", la_codec_2r, la_fmt_rd_rj }, ++ { "ext.w.b", la_codec_2r, la_fmt_rd_rj }, ++ { "rdtime.d", la_codec_2r, la_fmt_rd_rj }, ++ { "cpucfg", la_codec_2r, la_fmt_rd_rj }, ++ { "asrtle.d", la_codec_3r_rd0, la_fmt_rj_rk }, ++ { "asrtgt.d", la_codec_3r_rd0, la_fmt_rj_rk }, ++ { "alsl.w", la_codec_3r_sa2, la_fmt_rd_rj_rk_sa2 }, ++ { "alsl.wu", la_codec_3r_sa2, la_fmt_rd_rj_rk_sa2 }, ++ { "bytepick.w", la_codec_3r_sa2, la_fmt_rd_rj_rk_sa2 }, ++ { "bytepick.d", la_codec_3r_sa3, la_fmt_rd_rj_rk_sa3 }, ++ { "add.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "add.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "sub.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "sub.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "slt", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "sltu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "maskeqz", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "masknez", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "nor", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "and", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "or", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "xor", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "orn", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "andn", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "sll.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "srl.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "sra.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "sll.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "srl.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "sra.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "rotr.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "rotr.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mul.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mulh.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mulh.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mul.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mulh.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mulh.du", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mulw.d.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mulw.d.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "div.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mod.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "div.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mod.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "div.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mod.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "div.du", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "mod.du", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "crc.w.b.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "crc.w.h.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "crc.w.w.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "crc.w.d.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "crcc.w.b.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "crcc.w.h.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "crcc.w.w.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "crcc.w.d.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "break", la_codec_code, la_fmt_code }, ++ { "dbcl", la_codec_code, la_fmt_code }, ++ { "syscall", la_codec_code, la_fmt_code }, ++ { "alsl.d", la_codec_3r_sa2, la_fmt_rd_rj_rk_sa2 }, ++ { "slli.w", la_codec_2r_u5, la_fmt_rd_rj_ui5 }, ++ { "slli.d", la_codec_2r_u6, la_fmt_rd_rj_ui6 }, ++ { "srli.w", la_codec_2r_u5, la_fmt_rd_rj_ui5 }, ++ { "srli.d", la_codec_2r_u6, la_fmt_rd_rj_ui6 }, ++ { "srai.w", la_codec_2r_u5, la_fmt_rd_rj_ui5 }, ++ { "srai.d", la_codec_2r_u6, la_fmt_rd_rj_ui6 }, ++ { "rotri.w", la_codec_2r_u5, la_fmt_rd_rj_ui5 }, ++ { "rotri.d", la_codec_2r_u6, la_fmt_rd_rj_ui6 }, ++ { "bstrins.w", la_codec_2r_2bw, la_fmt_rd_rj_msbw_lsbw }, ++ { "bstrpick.w", la_codec_2r_2bw, la_fmt_rd_rj_msbw_lsbw }, ++ { "bstrins.d", la_codec_2r_2bd, la_fmt_rd_rj_msbd_lsbd }, ++ { "bstrpick.d", la_codec_2r_2bd, la_fmt_rd_rj_msbd_lsbd }, ++ { "fadd.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fadd.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fsub.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fsub.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmul.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmul.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fdiv.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fdiv.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmax.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmax.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmin.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmin.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmaxa.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmaxa.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmina.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fmina.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fscaleb.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fscaleb.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fcopysign.s", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fcopysign.d", la_codec_3r, la_fmt_fd_fj_fk }, ++ { "fabs.s", la_codec_2r, la_fmt_fd_fj }, ++ { "fabs.d", la_codec_2r, la_fmt_fd_fj }, ++ { "fneg.s", la_codec_2r, la_fmt_fd_fj }, ++ { "fneg.d", la_codec_2r, la_fmt_fd_fj }, ++ { "flogb.s", la_codec_2r, la_fmt_fd_fj }, ++ { "flogb.d", la_codec_2r, la_fmt_fd_fj }, ++ { "fclass.s", la_codec_2r, la_fmt_fd_fj }, ++ { "fclass.d", la_codec_2r, la_fmt_fd_fj }, ++ { "fsqrt.s", la_codec_2r, la_fmt_fd_fj }, ++ { "fsqrt.d", la_codec_2r, la_fmt_fd_fj }, ++ { "frecip.s", la_codec_2r, la_fmt_fd_fj }, ++ { "frecip.d", la_codec_2r, la_fmt_fd_fj }, ++ { "frsqrt.s", la_codec_2r, la_fmt_fd_fj }, ++ { "frsqrt.d", la_codec_2r, la_fmt_fd_fj }, ++ { "fmov.s", la_codec_2r, la_fmt_fd_fj }, ++ { "fmov.d", la_codec_2r, la_fmt_fd_fj }, ++ { "movgr2fr.w", la_codec_2r, la_fmt_fd_rj }, ++ { "movgr2fr.d", la_codec_2r, la_fmt_fd_rj }, ++ { "movgr2frh.w", la_codec_2r, la_fmt_fd_rj }, ++ { "movfr2gr.s", la_codec_2r, la_fmt_rd_fj }, ++ { "movfr2gr.d", la_codec_2r, la_fmt_rd_fj }, ++ { "movfrh2gr.s", la_codec_2r, la_fmt_rd_fj }, ++ { "movgr2fcsr", la_codec_2r, la_fmt_fcsrd_rj }, ++ { "movfcsr2gr", la_codec_2r, la_fmt_rd_fcsrs }, ++ { "movfr2cf", la_codec_r_cd, la_fmt_cd_fj }, ++ { "movcf2fr", la_codec_r_cj, la_fmt_fd_cj }, ++ { "movgr2cf", la_codec_r_cd, la_fmt_cd_fj }, ++ { "movcf2gr", la_codec_r_cj, la_fmt_fd_cj }, ++ { "fcvt.s.d", la_codec_2r, la_fmt_fd_fj }, ++ { "fcvt.d.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrm.w.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrm.w.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrm.l.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrm.l.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrp.w.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrp.w.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrp.l.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrp.l.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrz.w.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrz.w.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrz.l.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrz.l.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrne.w.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrne.w.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrne.l.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftintrne.l.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftint.w.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftint.w.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ftint.l.s", la_codec_2r, la_fmt_fd_fj }, ++ { "ftint.l.d", la_codec_2r, la_fmt_fd_fj }, ++ { "ffint.s.w", la_codec_2r, la_fmt_fd_fj }, ++ { "ffint.s.l", la_codec_2r, la_fmt_fd_fj }, ++ { "ffint.d.w", la_codec_2r, la_fmt_fd_fj }, ++ { "ffint.d.l", la_codec_2r, la_fmt_fd_fj }, ++ { "frint.s", la_codec_2r, la_fmt_fd_fj }, ++ { "frint.d", la_codec_2r, la_fmt_fd_fj }, ++ { "slti", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "sltui", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "addi.w", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "addi.d", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "lu52i.d", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "addi", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ori", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "xori", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "csrxchg", la_codec_2r_im14, la_fmt_rd_rj_csr }, ++ { "cacop", la_codec_im5_r_im12, la_fmt_cop_rj_si12 }, ++ { "lddir", la_codec_2r_im8, la_fmt_rd_rj_level }, ++ { "ldpte", la_codec_r_seq, la_fmt_rj_seq }, ++ { "iocsrrd.b", la_codec_2r, la_fmt_rd_rj }, ++ { "iocsrrd.h", la_codec_2r, la_fmt_rd_rj }, ++ { "iocsrrd.w", la_codec_2r, la_fmt_rd_rj }, ++ { "iocsrrd.d", la_codec_2r, la_fmt_rd_rj }, ++ { "iocsrwr.b", la_codec_2r, la_fmt_rd_rj }, ++ { "iocsrwr.h", la_codec_2r, la_fmt_rd_rj }, ++ { "iocsrwr.w", la_codec_2r, la_fmt_rd_rj }, ++ { "iocsrwr.d", la_codec_2r, la_fmt_rd_rj }, ++ { "tlbclr", la_codec_empty, la_fmt_empty }, ++ { "tlbflush", la_codec_empty, la_fmt_empty }, ++ { "tlbsrch", la_codec_empty, la_fmt_empty }, ++ { "tlbrd", la_codec_empty, la_fmt_empty }, ++ { "tlbwr", la_codec_empty, la_fmt_empty }, ++ { "tlbfill", la_codec_empty, la_fmt_empty }, ++ { "ertn", la_codec_empty, la_fmt_empty }, ++ { "idle", la_codec_whint, la_fmt_whint }, ++ { "invtlb", la_codec_invtlb, la_fmt_invtlb }, ++ { "fmadd.s", la_codec_4r, la_fmt_fd_fj_fk_fa }, ++ { "fmadd.d", la_codec_4r, la_fmt_fd_fj_fk_fa }, ++ { "fmsub.s", la_codec_4r, la_fmt_fd_fj_fk_fa }, ++ { "fmsub.d", la_codec_4r, la_fmt_fd_fj_fk_fa }, ++ { "fnmadd.s", la_codec_4r, la_fmt_fd_fj_fk_fa }, ++ { "fnmadd.d", la_codec_4r, la_fmt_fd_fj_fk_fa }, ++ { "fnmsub.s", la_codec_4r, la_fmt_fd_fj_fk_fa }, ++ { "fnmsub.d", la_codec_4r, la_fmt_fd_fj_fk_fa }, ++ { "fcmp.cond.s", la_codec_cond, la_fmt_s_cd_fj_fk }, ++ { "fcmp.cond.d", la_codec_cond, la_fmt_d_cd_fj_fk }, ++ { "fsel", la_codec_sel, la_fmt_fd_fj_fk_ca }, ++ { "addu16i.d", la_codec_2r_im16, la_fmt_rd_rj_si16 }, ++ { "lu12i.w", la_codec_r_im20, la_fmt_rd_si20 }, ++ { "lu32i.d", la_codec_r_im20, la_fmt_rd_si20 }, ++ { "pcaddi", la_codec_r_im20, la_fmt_rd_si20 }, ++ { "pcalau12i", la_codec_r_im20, la_fmt_rd_si20 }, ++ { "pcaddu12i", la_codec_r_im20, la_fmt_rd_si20 }, ++ { "pcaddu18i", la_codec_r_im20, la_fmt_rd_si20 }, ++ { "ll.w", la_codec_2r_im14, la_fmt_rd_rj_si14 }, ++ { "sc.w", la_codec_2r_im14, la_fmt_rd_rj_si14 }, ++ { "ll.d", la_codec_2r_im14, la_fmt_rd_rj_si14 }, ++ { "sc.d", la_codec_2r_im14, la_fmt_rd_rj_si14 }, ++ { "ldptr.w", la_codec_2r_im14, la_fmt_rd_rj_si14 }, ++ { "stptr.w", la_codec_2r_im14, la_fmt_rd_rj_si14 }, ++ { "ldptr.d", la_codec_2r_im14, la_fmt_rd_rj_si14 }, ++ { "stptr.d", la_codec_2r_im14, la_fmt_rd_rj_si14 }, ++ { "ld.b", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ld.h", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ld.w", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ld.d", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "st.b", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "st.h", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "st.w", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "st.d", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ld.bu", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ld.hu", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ld.wu", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "preld", la_codec_2r_im12, la_fmt_hint_rj_si12 }, ++ { "fld.s", la_codec_2r_im12, la_fmt_fd_fj_si12 }, ++ { "fst.s", la_codec_2r_im12, la_fmt_fd_fj_si12 }, ++ { "fld.d", la_codec_2r_im12, la_fmt_fd_fj_si12 }, ++ { "fst.d", la_codec_2r_im12, la_fmt_fd_fj_si12 }, ++ { "ldl.w", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ldr.w", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ldl.d", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ldr.d", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "stl.d", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "str.d", la_codec_2r_im12, la_fmt_rd_rj_si12 }, ++ { "ldx.b", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldx.h", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldx.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldx.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stx.b", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stx.h", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stx.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stx.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldx.bu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldx.hu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldx.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "fldx.s", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fldx.d", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fstx.s", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fstx.d", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "amswap.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amswap.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amadd.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amadd.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amand.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amand.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amor.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amor.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amxor.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amxor.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammax.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammax.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammin.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammin.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammax.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammax.du", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammin.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammin.du", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amswap.db.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amswap.db.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amadd.db.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amadd.db.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amand.db.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amand.db.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amor.db.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amor.db.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amxor.db.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "amxor.db.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammax.db.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammax.db.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammin.db.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammin.db.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammax.db.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammax.db.du", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammin.db.wu", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ammin.db.du", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "dbar", la_codec_whint, la_fmt_whint }, ++ { "ibar", la_codec_whint, la_fmt_whint }, ++ { "fldgt.s", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fldgt.d", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fldle.s", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fldle.d", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fstgt.s", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fstgt.d", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fstle.s", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "fstle.d", la_codec_3r, la_fmt_fd_rj_rk }, ++ { "ldgt.b", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldgt.h", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldgt.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldgt.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldle.b", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldle.h", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldle.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "ldle.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stgt.b", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stgt.h", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stgt.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stgt.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stle.b", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stle.h", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stle.w", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "stle.d", la_codec_3r, la_fmt_rd_rj_rk }, ++ { "beqz", la_codec_r_ofs21, la_fmt_rj_offs21 }, ++ { "bnez", la_codec_r_ofs21, la_fmt_rj_offs21 }, ++ { "bceqz", la_codec_cj_ofs21, la_fmt_cj_offs21 }, ++ { "bcnez", la_codec_cj_ofs21, la_fmt_cj_offs21 }, ++ { "jirl", la_codec_2r_im16, la_fmt_rd_rj_offs16 }, ++ { "b", la_codec_ofs26, la_fmt_offs26 }, ++ { "bl", la_codec_ofs26, la_fmt_offs26 }, ++ { "beq", la_codec_2r_im16, la_fmt_rj_rd_offs16 }, ++ { "bne", la_codec_2r_im16, la_fmt_rj_rd_offs16 }, ++ { "blt", la_codec_2r_im16, la_fmt_rj_rd_offs16 }, ++ { "bge", la_codec_2r_im16, la_fmt_rj_rd_offs16 }, ++ { "bltu", la_codec_2r_im16, la_fmt_rj_rd_offs16 }, ++ { "bgeu", la_codec_2r_im16, la_fmt_rj_rd_offs16 }, ++ ++ /* vz insn */ ++ { "hvcl", la_codec_code, la_fmt_code }, ++ ++}; ++ ++/* decode opcode */ ++static void decode_insn_opcode(la_decode *dec) ++{ ++ uint32_t insn = dec->insn; ++ uint16_t op = la_op_illegal; ++ switch ((insn >> 26) & 0x3f) { ++ case 0x0: ++ switch ((insn >> 22) & 0xf) { ++ case 0x0: ++ switch ((insn >> 18) & 0xf) { ++ case 0x0: ++ switch ((insn >> 15) & 0x7) { ++ case 0x0: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x2: ++ switch ((insn >> 2) & 0x7) { ++ case 0x0: ++ op = la_op_gr2scr; ++ break; ++ } ++ break; ++ case 0x3: ++ switch ((insn >> 7) & 0x7) { ++ case 0x0: ++ op = la_op_scr2gr; ++ break; ++ } ++ break; ++ case 0x4: ++ op = la_op_clo_w; ++ break; ++ case 0x5: ++ op = la_op_clz_w; ++ break; ++ case 0x6: ++ op = la_op_cto_w; ++ break; ++ case 0x7: ++ op = la_op_ctz_w; ++ break; ++ case 0x8: ++ op = la_op_clo_d; ++ break; ++ case 0x9: ++ op = la_op_clz_d; ++ break; ++ case 0xa: ++ op = la_op_cto_d; ++ break; ++ case 0xb: ++ op = la_op_ctz_d; ++ break; ++ case 0xc: ++ op = la_op_revb_2h; ++ break; ++ case 0xd: ++ op = la_op_revb_4h; ++ break; ++ case 0xe: ++ op = la_op_revb_2w; ++ break; ++ case 0xf: ++ op = la_op_revb_d; ++ break; ++ case 0x10: ++ op = la_op_revh_2w; ++ break; ++ case 0x11: ++ op = la_op_revh_d; ++ break; ++ case 0x12: ++ op = la_op_bitrev_4b; ++ break; ++ case 0x13: ++ op = la_op_bitrev_8b; ++ break; ++ case 0x14: ++ op = la_op_bitrev_w; ++ break; ++ case 0x15: ++ op = la_op_bitrev_d; ++ break; ++ case 0x16: ++ op = la_op_ext_w_h; ++ break; ++ case 0x17: ++ op = la_op_ext_w_b; ++ break; ++ case 0x1a: ++ op = la_op_rdtime_d; ++ break; ++ case 0x1b: ++ op = la_op_cpucfg; ++ break; ++ } ++ break; ++ case 0x2: ++ switch (insn & 0x0000001f) { ++ case 0x00000000: ++ op = la_op_asrtle_d; ++ break; ++ } ++ break; ++ case 0x3: ++ switch (insn & 0x0000001f) { ++ case 0x00000000: ++ op = la_op_asrtgt_d; ++ break; ++ } ++ break; ++ } ++ break; ++ case 0x1: ++ switch ((insn >> 17) & 0x1) { ++ case 0x0: ++ op = la_op_alsl_w; ++ break; ++ case 0x1: ++ op = la_op_alsl_wu; ++ break; ++ } ++ break; ++ case 0x2: ++ switch ((insn >> 17) & 0x1) { ++ case 0x0: ++ op = la_op_bytepick_w; ++ break; ++ } ++ break; ++ case 0x3: ++ op = la_op_bytepick_d; ++ break; ++ case 0x4: ++ switch ((insn >> 15) & 0x7) { ++ case 0x0: ++ op = la_op_add_w; ++ break; ++ case 0x1: ++ op = la_op_add_d; ++ break; ++ case 0x2: ++ op = la_op_sub_w; ++ break; ++ case 0x3: ++ op = la_op_sub_d; ++ break; ++ case 0x4: ++ op = la_op_slt; ++ break; ++ case 0x5: ++ op = la_op_sltu; ++ break; ++ case 0x6: ++ op = la_op_maskeqz; ++ break; ++ case 0x7: ++ op = la_op_masknez; ++ break; ++ } ++ break; ++ case 0x5: ++ switch ((insn >> 15) & 0x7) { ++ case 0x0: ++ op = la_op_nor; ++ break; ++ case 0x1: ++ op = la_op_and; ++ break; ++ case 0x2: ++ op = la_op_or; ++ break; ++ case 0x3: ++ op = la_op_xor; ++ break; ++ case 0x4: ++ op = la_op_orn; ++ break; ++ case 0x5: ++ op = la_op_andn; ++ break; ++ case 0x6: ++ op = la_op_sll_w; ++ break; ++ case 0x7: ++ op = la_op_srl_w; ++ break; ++ } ++ break; ++ case 0x6: ++ switch ((insn >> 15) & 0x7) { ++ case 0x0: ++ op = la_op_sra_w; ++ break; ++ case 0x1: ++ op = la_op_sll_d; ++ break; ++ case 0x2: ++ op = la_op_srl_d; ++ break; ++ case 0x3: ++ op = la_op_sra_d; ++ break; ++ case 0x6: ++ op = la_op_rotr_w; ++ break; ++ case 0x7: ++ op = la_op_rotr_d; ++ break; ++ } ++ break; ++ case 0x7: ++ switch ((insn >> 15) & 0x7) { ++ case 0x0: ++ op = la_op_mul_w; ++ break; ++ case 0x1: ++ op = la_op_mulh_w; ++ break; ++ case 0x2: ++ op = la_op_mulh_wu; ++ break; ++ case 0x3: ++ op = la_op_mul_d; ++ break; ++ case 0x4: ++ op = la_op_mulh_d; ++ break; ++ case 0x5: ++ op = la_op_mulh_du; ++ break; ++ case 0x6: ++ op = la_op_mulw_d_w; ++ break; ++ case 0x7: ++ op = la_op_mulw_d_wu; ++ break; ++ } ++ break; ++ case 0x8: ++ switch ((insn >> 15) & 0x7) { ++ case 0x0: ++ op = la_op_div_w; ++ break; ++ case 0x1: ++ op = la_op_mod_w; ++ break; ++ case 0x2: ++ op = la_op_div_wu; ++ break; ++ case 0x3: ++ op = la_op_mod_wu; ++ break; ++ case 0x4: ++ op = la_op_div_d; ++ break; ++ case 0x5: ++ op = la_op_mod_d; ++ break; ++ case 0x6: ++ op = la_op_div_du; ++ break; ++ case 0x7: ++ op = la_op_mod_du; ++ break; ++ } ++ break; ++ case 0x9: ++ switch ((insn >> 15) & 0x7) { ++ case 0x0: ++ op = la_op_crc_w_b_w; ++ break; ++ case 0x1: ++ op = la_op_crc_w_h_w; ++ break; ++ case 0x2: ++ op = la_op_crc_w_w_w; ++ break; ++ case 0x3: ++ op = la_op_crc_w_d_w; ++ break; ++ case 0x4: ++ op = la_op_crcc_w_b_w; ++ break; ++ case 0x5: ++ op = la_op_crcc_w_h_w; ++ break; ++ case 0x6: ++ op = la_op_crcc_w_w_w; ++ break; ++ case 0x7: ++ op = la_op_crcc_w_d_w; ++ break; ++ } ++ break; ++ case 0xa: ++ switch ((insn >> 15) & 0x7) { ++ case 0x4: ++ op = la_op_break; ++ break; ++ case 0x5: ++ op = la_op_dbcl; ++ break; ++ case 0x6: ++ op = la_op_syscall; ++ break; ++ case 0x7: ++ op = la_op_hvcl; ++ break; ++ } ++ break; ++ case 0xb: ++ switch ((insn >> 17) & 0x1) { ++ case 0x0: ++ op = la_op_alsl_d; ++ break; ++ } ++ break; ++ } ++ break; ++ case 0x1: ++ switch ((insn >> 21) & 0x1) { ++ case 0x0: ++ switch ((insn >> 16) & 0x1f) { ++ case 0x0: ++ switch ((insn >> 15) & 0x1) { ++ case 0x1: ++ op = la_op_slli_w; ++ break; ++ } ++ break; ++ case 0x1: ++ op = la_op_slli_d; ++ break; ++ case 0x4: ++ switch ((insn >> 15) & 0x1) { ++ case 0x1: ++ op = la_op_srli_w; ++ break; ++ } ++ break; ++ case 0x5: ++ op = la_op_srli_d; ++ break; ++ case 0x8: ++ switch ((insn >> 15) & 0x1) { ++ case 0x1: ++ op = la_op_srai_w; ++ break; ++ } ++ break; ++ case 0x9: ++ op = la_op_srai_d; ++ break; ++ case 0xc: ++ switch ((insn >> 15) & 0x1) { ++ case 0x1: ++ op = la_op_rotri_w; ++ break; ++ } ++ break; ++ case 0xd: ++ op = la_op_rotri_d; ++ break; ++ } ++ break; ++ case 0x1: ++ switch ((insn >> 15) & 0x1) { ++ case 0x0: ++ op = la_op_bstrins_w; ++ break; ++ case 0x1: ++ op = la_op_bstrpick_w; ++ break; ++ } ++ break; ++ } ++ break; ++ case 0x2: ++ op = la_op_bstrins_d; ++ break; ++ case 0x3: ++ op = la_op_bstrpick_d; ++ break; ++ case 0x4: ++ switch ((insn >> 15) & 0x7f) { ++ case 0x1: ++ op = la_op_fadd_s; ++ break; ++ case 0x2: ++ op = la_op_fadd_d; ++ break; ++ case 0x5: ++ op = la_op_fsub_s; ++ break; ++ case 0x6: ++ op = la_op_fsub_d; ++ break; ++ case 0x9: ++ op = la_op_fmul_s; ++ break; ++ case 0xa: ++ op = la_op_fmul_d; ++ break; ++ case 0xd: ++ op = la_op_fdiv_s; ++ break; ++ case 0xe: ++ op = la_op_fdiv_d; ++ break; ++ case 0x11: ++ op = la_op_fmax_s; ++ break; ++ case 0x12: ++ op = la_op_fmax_d; ++ break; ++ case 0x15: ++ op = la_op_fmin_s; ++ break; ++ case 0x16: ++ op = la_op_fmin_d; ++ break; ++ case 0x19: ++ op = la_op_fmaxa_s; ++ break; ++ case 0x1a: ++ op = la_op_fmaxa_d; ++ break; ++ case 0x1d: ++ op = la_op_fmina_s; ++ break; ++ case 0x1e: ++ op = la_op_fmina_d; ++ break; ++ case 0x21: ++ op = la_op_fscaleb_s; ++ break; ++ case 0x22: ++ op = la_op_fscaleb_d; ++ break; ++ case 0x25: ++ op = la_op_fcopysign_s; ++ break; ++ case 0x26: ++ op = la_op_fcopysign_d; ++ break; ++ case 0x28: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x1: ++ op = la_op_fabs_s; ++ break; ++ case 0x2: ++ op = la_op_fabs_d; ++ break; ++ case 0x5: ++ op = la_op_fneg_s; ++ break; ++ case 0x6: ++ op = la_op_fneg_d; ++ break; ++ case 0x9: ++ op = la_op_flogb_s; ++ break; ++ case 0xa: ++ op = la_op_flogb_d; ++ break; ++ case 0xd: ++ op = la_op_fclass_s; ++ break; ++ case 0xe: ++ op = la_op_fclass_d; ++ break; ++ case 0x11: ++ op = la_op_fsqrt_s; ++ break; ++ case 0x12: ++ op = la_op_fsqrt_d; ++ break; ++ case 0x15: ++ op = la_op_frecip_s; ++ break; ++ case 0x16: ++ op = la_op_frecip_d; ++ break; ++ case 0x19: ++ op = la_op_frsqrt_s; ++ break; ++ case 0x1a: ++ op = la_op_frsqrt_d; ++ break; ++ } ++ break; ++ case 0x29: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x5: ++ op = la_op_fmov_s; ++ break; ++ case 0x6: ++ op = la_op_fmov_d; ++ break; ++ case 0x9: ++ op = la_op_movgr2fr_w; ++ break; ++ case 0xa: ++ op = la_op_movgr2fr_d; ++ break; ++ case 0xb: ++ op = la_op_movgr2frh_w; ++ break; ++ case 0xd: ++ op = la_op_movfr2gr_s; ++ break; ++ case 0xe: ++ op = la_op_movfr2gr_d; ++ break; ++ case 0xf: ++ op = la_op_movfrh2gr_s; ++ break; ++ case 0x10: ++ op = la_op_movgr2fcsr; ++ break; ++ case 0x12: ++ op = la_op_movfcsr2gr; ++ break; ++ case 0x14: ++ switch ((insn >> 3) & 0x3) { ++ case 0x0: ++ op = la_op_movfr2cf; ++ break; ++ } ++ break; ++ case 0x15: ++ switch ((insn >> 8) & 0x3) { ++ case 0x0: ++ op = la_op_movcf2fr; ++ break; ++ } ++ break; ++ case 0x16: ++ switch ((insn >> 3) & 0x3) { ++ case 0x0: ++ op = la_op_movgr2cf; ++ break; ++ } ++ break; ++ case 0x17: ++ switch ((insn >> 8) & 0x3) { ++ case 0x0: ++ op = la_op_movcf2gr; ++ break; ++ } ++ break; ++ } ++ break; ++ case 0x32: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x6: ++ op = la_op_fcvt_s_d; ++ break; ++ case 0x9: ++ op = la_op_fcvt_d_s; ++ break; ++ } ++ break; ++ case 0x34: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x1: ++ op = la_op_ftintrm_w_s; ++ break; ++ case 0x2: ++ op = la_op_ftintrm_w_d; ++ break; ++ case 0x9: ++ op = la_op_ftintrm_l_s; ++ break; ++ case 0xa: ++ op = la_op_ftintrm_l_d; ++ break; ++ case 0x11: ++ op = la_op_ftintrp_w_s; ++ break; ++ case 0x12: ++ op = la_op_ftintrp_w_d; ++ break; ++ case 0x19: ++ op = la_op_ftintrp_l_s; ++ break; ++ case 0x1a: ++ op = la_op_ftintrp_l_d; ++ break; ++ } ++ break; ++ case 0x35: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x1: ++ op = la_op_ftintrz_w_s; ++ break; ++ case 0x2: ++ op = la_op_ftintrz_w_d; ++ break; ++ case 0x9: ++ op = la_op_ftintrz_l_s; ++ break; ++ case 0xa: ++ op = la_op_ftintrz_l_d; ++ break; ++ case 0x11: ++ op = la_op_ftintrne_w_s; ++ break; ++ case 0x12: ++ op = la_op_ftintrne_w_d; ++ break; ++ case 0x19: ++ op = la_op_ftintrne_l_s; ++ break; ++ case 0x1a: ++ op = la_op_ftintrne_l_d; ++ break; ++ } ++ break; ++ case 0x36: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x1: ++ op = la_op_ftint_w_s; ++ break; ++ case 0x2: ++ op = la_op_ftint_w_d; ++ break; ++ case 0x9: ++ op = la_op_ftint_l_s; ++ break; ++ case 0xa: ++ op = la_op_ftint_l_d; ++ break; ++ } ++ break; ++ case 0x3a: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x4: ++ op = la_op_ffint_s_w; ++ break; ++ case 0x6: ++ op = la_op_ffint_s_l; ++ break; ++ case 0x8: ++ op = la_op_ffint_d_w; ++ break; ++ case 0xa: ++ op = la_op_ffint_d_l; ++ break; ++ } ++ break; ++ case 0x3c: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x11: ++ op = la_op_frint_s; ++ break; ++ case 0x12: ++ op = la_op_frint_d; ++ break; ++ } ++ break; ++ } ++ break; ++ case 0x8: ++ op = la_op_slti; ++ break; ++ case 0x9: ++ op = la_op_sltui; ++ break; ++ case 0xa: ++ op = la_op_addi_w; ++ break; ++ case 0xb: ++ op = la_op_addi_d; ++ break; ++ case 0xc: ++ op = la_op_lu52i_d; ++ break; ++ case 0xd: ++ op = la_op_addi; ++ break; ++ case 0xe: ++ op = la_op_ori; ++ break; ++ case 0xf: ++ op = la_op_xori; ++ break; ++ } ++ break; ++ case 0x1: ++ switch ((insn >> 24) & 0x3) { ++ case 0x0: ++ op = la_op_csrxchg; ++ break; ++ case 0x2: ++ switch ((insn >> 22) & 0x3) { ++ case 0x0: ++ op = la_op_cacop; ++ break; ++ case 0x1: ++ switch ((insn >> 18) & 0xf) { ++ case 0x0: ++ op = la_op_lddir; ++ break; ++ case 0x1: ++ switch (insn & 0x0000001f) { ++ case 0x00000000: ++ op = la_op_ldpte; ++ break; ++ } ++ break; ++ case 0x2: ++ switch ((insn >> 15) & 0x7) { ++ case 0x0: ++ switch ((insn >> 10) & 0x1f) { ++ case 0x0: ++ op = la_op_iocsrrd_b; ++ break; ++ case 0x1: ++ op = la_op_iocsrrd_h; ++ break; ++ case 0x2: ++ op = la_op_iocsrrd_w; ++ break; ++ case 0x3: ++ op = la_op_iocsrrd_d; ++ break; ++ case 0x4: ++ op = la_op_iocsrwr_b; ++ break; ++ case 0x5: ++ op = la_op_iocsrwr_h; ++ break; ++ case 0x6: ++ op = la_op_iocsrwr_w; ++ break; ++ case 0x7: ++ op = la_op_iocsrwr_d; ++ break; ++ case 0x8: ++ switch (insn & 0x000003ff) { ++ case 0x00000000: ++ op = la_op_tlbclr; ++ break; ++ } ++ break; ++ case 0x9: ++ switch (insn & 0x000003ff) { ++ case 0x00000000: ++ op = la_op_tlbflush; ++ break; ++ } ++ break; ++ case 0xa: ++ switch (insn & 0x000003ff) { ++ case 0x00000000: ++ op = la_op_tlbsrch; ++ break; ++ } ++ break; ++ case 0xb: ++ switch (insn & 0x000003ff) { ++ case 0x00000000: ++ op = la_op_tlbrd; ++ break; ++ } ++ break; ++ case 0xc: ++ switch (insn & 0x000003ff) { ++ case 0x00000000: ++ op = la_op_tlbwr; ++ break; ++ } ++ break; ++ case 0xd: ++ switch (insn & 0x000003ff) { ++ case 0x00000000: ++ op = la_op_tlbfill; ++ break; ++ } ++ break; ++ case 0xe: ++ switch (insn & 0x000003ff) { ++ case 0x00000000: ++ op = la_op_ertn; ++ break; ++ } ++ break; ++ } ++ break; ++ case 0x1: ++ op = la_op_idle; ++ break; ++ case 0x3: ++ op = la_op_invtlb; ++ break; ++ } ++ break; ++ } ++ break; ++ } ++ break; ++ } ++ break; ++ case 0x2: ++ switch ((insn >> 20) & 0x3f) { ++ case 0x1: ++ op = la_op_fmadd_s; ++ break; ++ case 0x2: ++ op = la_op_fmadd_d; ++ break; ++ case 0x5: ++ op = la_op_fmsub_s; ++ break; ++ case 0x6: ++ op = la_op_fmsub_d; ++ break; ++ case 0x9: ++ op = la_op_fnmadd_s; ++ break; ++ case 0xa: ++ op = la_op_fnmadd_d; ++ break; ++ case 0xd: ++ op = la_op_fnmsub_s; ++ break; ++ case 0xe: ++ op = la_op_fnmsub_d; ++ break; ++ } ++ break; ++ case 0x3: ++ switch ((insn >> 20) & 0x3f) { ++ case 0x1: ++ switch ((insn >> 3) & 0x3) { ++ case 0x0: ++ op = la_op_fcmp_cond_s; ++ break; ++ } ++ break; ++ case 0x2: ++ switch ((insn >> 3) & 0x3) { ++ case 0x0: ++ op = la_op_fcmp_cond_d; ++ break; ++ } ++ break; ++ case 0x10: ++ switch ((insn >> 18) & 0x3) { ++ case 0x0: ++ op = la_op_fsel; ++ break; ++ } ++ break; ++ } ++ break; ++ case 0x4: ++ op = la_op_addu16i_d; ++ break; ++ case 0x5: ++ switch ((insn >> 25) & 0x1) { ++ case 0x0: ++ op = la_op_lu12i_w; ++ break; ++ case 0x1: ++ op = la_op_lu32i_d; ++ break; ++ } ++ break; ++ case 0x6: ++ switch ((insn >> 25) & 0x1) { ++ case 0x0: ++ op = la_op_pcaddi; ++ break; ++ case 0x1: ++ op = la_op_pcalau12i; ++ break; ++ } ++ break; ++ case 0x7: ++ switch ((insn >> 25) & 0x1) { ++ case 0x0: ++ op = la_op_pcaddu12i; ++ break; ++ case 0x1: ++ op = la_op_pcaddu18i; ++ break; ++ } ++ break; ++ case 0x8: ++ switch ((insn >> 24) & 0x3) { ++ case 0x0: ++ op = la_op_ll_w; ++ break; ++ case 0x1: ++ op = la_op_sc_w; ++ break; ++ case 0x2: ++ op = la_op_ll_d; ++ break; ++ case 0x3: ++ op = la_op_sc_d; ++ break; ++ } ++ break; ++ case 0x9: ++ switch ((insn >> 24) & 0x3) { ++ case 0x0: ++ op = la_op_ldptr_w; ++ break; ++ case 0x1: ++ op = la_op_stptr_w; ++ break; ++ case 0x2: ++ op = la_op_ldptr_d; ++ break; ++ case 0x3: ++ op = la_op_stptr_d; ++ break; ++ } ++ break; ++ case 0xa: ++ switch ((insn >> 22) & 0xf) { ++ case 0x0: ++ op = la_op_ld_b; ++ break; ++ case 0x1: ++ op = la_op_ld_h; ++ break; ++ case 0x2: ++ op = la_op_ld_w; ++ break; ++ case 0x3: ++ op = la_op_ld_d; ++ break; ++ case 0x4: ++ op = la_op_st_b; ++ break; ++ case 0x5: ++ op = la_op_st_h; ++ break; ++ case 0x6: ++ op = la_op_st_w; ++ break; ++ case 0x7: ++ op = la_op_st_d; ++ break; ++ case 0x8: ++ op = la_op_ld_bu; ++ break; ++ case 0x9: ++ op = la_op_ld_hu; ++ break; ++ case 0xa: ++ op = la_op_ld_wu; ++ break; ++ case 0xb: ++ op = la_op_preld; ++ break; ++ case 0xc: ++ op = la_op_fld_s; ++ break; ++ case 0xd: ++ op = la_op_fst_s; ++ break; ++ case 0xe: ++ op = la_op_fld_d; ++ break; ++ case 0xf: ++ op = la_op_fst_d; ++ break; ++ } ++ break; ++ case 0xb: ++ switch ((insn >> 22) & 0xf) { ++ case 0x8: ++ op = la_op_ldl_w; ++ break; ++ case 0x9: ++ op = la_op_ldr_w; ++ break; ++ case 0xa: ++ op = la_op_ldl_d; ++ break; ++ case 0xb: ++ op = la_op_ldr_d; ++ break; ++ case 0xe: ++ op = la_op_stl_d; ++ break; ++ case 0xf: ++ op = la_op_str_d; ++ break; ++ } ++ break; ++ case 0xe: ++ switch ((insn >> 15) & 0x7ff) { ++ case 0x0: ++ op = la_op_ldx_b; ++ break; ++ case 0x8: ++ op = la_op_ldx_h; ++ break; ++ case 0x10: ++ op = la_op_ldx_w; ++ break; ++ case 0x18: ++ op = la_op_ldx_d; ++ break; ++ case 0x20: ++ op = la_op_stx_b; ++ break; ++ case 0x28: ++ op = la_op_stx_h; ++ break; ++ case 0x30: ++ op = la_op_stx_w; ++ break; ++ case 0x38: ++ op = la_op_stx_d; ++ break; ++ case 0x40: ++ op = la_op_ldx_bu; ++ break; ++ case 0x48: ++ op = la_op_ldx_hu; ++ break; ++ case 0x50: ++ op = la_op_ldx_wu; ++ break; ++ case 0x60: ++ op = la_op_fldx_s; ++ break; ++ case 0x68: ++ op = la_op_fldx_d; ++ break; ++ case 0x70: ++ op = la_op_fstx_s; ++ break; ++ case 0x78: ++ op = la_op_fstx_d; ++ break; ++ case 0xc0: ++ op = la_op_amswap_w; ++ break; ++ case 0xc1: ++ op = la_op_amswap_d; ++ break; ++ case 0xc2: ++ op = la_op_amadd_w; ++ break; ++ case 0xc3: ++ op = la_op_amadd_d; ++ break; ++ case 0xc4: ++ op = la_op_amand_w; ++ break; ++ case 0xc5: ++ op = la_op_amand_d; ++ break; ++ case 0xc6: ++ op = la_op_amor_w; ++ break; ++ case 0xc7: ++ op = la_op_amor_d; ++ break; ++ case 0xc8: ++ op = la_op_amxor_w; ++ break; ++ case 0xc9: ++ op = la_op_amxor_d; ++ break; ++ case 0xca: ++ op = la_op_ammax_w; ++ break; ++ case 0xcb: ++ op = la_op_ammax_d; ++ break; ++ case 0xcc: ++ op = la_op_ammin_w; ++ break; ++ case 0xcd: ++ op = la_op_ammin_d; ++ break; ++ case 0xce: ++ op = la_op_ammax_wu; ++ break; ++ case 0xcf: ++ op = la_op_ammax_du; ++ break; ++ case 0xd0: ++ op = la_op_ammin_wu; ++ break; ++ case 0xd1: ++ op = la_op_ammin_du; ++ break; ++ case 0xd2: ++ op = la_op_amswap_db_w; ++ break; ++ case 0xd3: ++ op = la_op_amswap_db_d; ++ break; ++ case 0xd4: ++ op = la_op_amadd_db_w; ++ break; ++ case 0xd5: ++ op = la_op_amadd_db_d; ++ break; ++ case 0xd6: ++ op = la_op_amand_db_w; ++ break; ++ case 0xd7: ++ op = la_op_amand_db_d; ++ break; ++ case 0xd8: ++ op = la_op_amor_db_w; ++ break; ++ case 0xd9: ++ op = la_op_amor_db_d; ++ break; ++ case 0xda: ++ op = la_op_amxor_db_w; ++ break; ++ case 0xdb: ++ op = la_op_amxor_db_d; ++ break; ++ case 0xdc: ++ op = la_op_ammax_db_w; ++ break; ++ case 0xdd: ++ op = la_op_ammax_db_d; ++ break; ++ case 0xde: ++ op = la_op_ammin_db_w; ++ break; ++ case 0xdf: ++ op = la_op_ammin_db_d; ++ break; ++ case 0xe0: ++ op = la_op_ammax_db_wu; ++ break; ++ case 0xe1: ++ op = la_op_ammax_db_du; ++ break; ++ case 0xe2: ++ op = la_op_ammin_db_wu; ++ break; ++ case 0xe3: ++ op = la_op_ammin_db_du; ++ break; ++ case 0xe4: ++ op = la_op_dbar; ++ break; ++ case 0xe5: ++ op = la_op_ibar; ++ break; ++ case 0xe8: ++ op = la_op_fldgt_s; ++ break; ++ case 0xe9: ++ op = la_op_fldgt_d; ++ break; ++ case 0xea: ++ op = la_op_fldle_s; ++ break; ++ case 0xeb: ++ op = la_op_fldle_d; ++ break; ++ case 0xec: ++ op = la_op_fstgt_s; ++ break; ++ case 0xed: ++ op = la_op_fstgt_d; ++ break; ++ case 0xee: ++ op = ls_op_fstle_s; ++ break; ++ case 0xef: ++ op = la_op_fstle_d; ++ break; ++ case 0xf0: ++ op = la_op_ldgt_b; ++ break; ++ case 0xf1: ++ op = la_op_ldgt_h; ++ break; ++ case 0xf2: ++ op = la_op_ldgt_w; ++ break; ++ case 0xf3: ++ op = la_op_ldgt_d; ++ break; ++ case 0xf4: ++ op = la_op_ldle_b; ++ break; ++ case 0xf5: ++ op = la_op_ldle_h; ++ break; ++ case 0xf6: ++ op = la_op_ldle_w; ++ break; ++ case 0xf7: ++ op = la_op_ldle_d; ++ break; ++ case 0xf8: ++ op = la_op_stgt_b; ++ break; ++ case 0xf9: ++ op = la_op_stgt_h; ++ break; ++ case 0xfa: ++ op = la_op_stgt_w; ++ break; ++ case 0xfb: ++ op = la_op_stgt_d; ++ break; ++ case 0xfc: ++ op = la_op_stle_b; ++ break; ++ case 0xfd: ++ op = la_op_stle_h; ++ break; ++ case 0xfe: ++ op = la_op_stle_w; ++ break; ++ case 0xff: ++ op = la_op_stle_d; ++ break; ++ } ++ break; ++ case 0x10: ++ op = la_op_beqz; ++ break; ++ case 0x11: ++ op = la_op_bnez; ++ break; ++ case 0x12: ++ switch ((insn >> 8) & 0x3) { ++ case 0x0: ++ op = la_op_bceqz; ++ break; ++ case 0x1: ++ op = la_op_bcnez; ++ break; ++ } ++ break; ++ case 0x13: ++ op = la_op_jirl; ++ break; ++ case 0x14: ++ op = la_op_b; ++ break; ++ case 0x15: ++ op = la_op_bl; ++ break; ++ case 0x16: ++ op = la_op_beq; ++ break; ++ case 0x17: ++ op = la_op_bne; ++ break; ++ case 0x18: ++ op = la_op_blt; ++ break; ++ case 0x19: ++ op = la_op_bge; ++ break; ++ case 0x1a: ++ op = la_op_bltu; ++ break; ++ case 0x1b: ++ op = la_op_bgeu; ++ break; ++ default: ++ op = la_op_illegal; ++ break; ++ } ++ dec->op = op; ++} ++ ++/* operand extractors */ ++#define IM_5 5 ++#define IM_8 8 ++#define IM_12 12 ++#define IM_14 14 ++#define IM_15 15 ++#define IM_16 16 ++#define IM_20 20 ++#define IM_21 21 ++#define IM_26 26 ++ ++static uint32_t operand_r1(uint32_t insn) ++{ ++ return insn & 0x1f; ++} ++ ++static uint32_t operand_r2(uint32_t insn) ++{ ++ return (insn >> 5) & 0x1f; ++} ++ ++static uint32_t operand_r3(uint32_t insn) ++{ ++ return (insn >> 10) & 0x1f; ++} ++ ++static uint32_t operand_r4(uint32_t insn) ++{ ++ return (insn >> 15) & 0x1f; ++} ++ ++static uint32_t operand_u6(uint32_t insn) ++{ ++ return (insn >> 10) & 0x3f; ++} ++ ++static uint32_t operand_bw1(uint32_t insn) ++{ ++ return (insn >> 10) & 0x1f; ++} ++ ++static uint32_t operand_bw2(uint32_t insn) ++{ ++ return (insn >> 16) & 0x1f; ++} ++ ++static uint32_t operand_bd1(uint32_t insn) ++{ ++ return (insn >> 10) & 0x3f; ++} ++ ++static uint32_t operand_bd2(uint32_t insn) ++{ ++ return (insn >> 16) & 0x3f; ++} ++ ++static uint32_t operand_sa2(uint32_t insn) ++{ ++ return (insn >> 15) & 0x3; ++} ++ ++static uint32_t operand_sa3(uint32_t insn) ++{ ++ return (insn >> 15) & 0x3; ++} ++ ++static int32_t operand_im20(uint32_t insn) ++{ ++ int32_t imm = (int32_t)((insn >> 5) & 0xfffff); ++ return imm > (1 << 19) ? imm - (1 << 20) : imm; ++} ++ ++static int32_t operand_im16(uint32_t insn) ++{ ++ int32_t imm = (int32_t)((insn >> 10) & 0xffff); ++ return imm > (1 << 15) ? imm - (1 << 16) : imm; ++} ++ ++static int32_t operand_im14(uint32_t insn) ++{ ++ int32_t imm = (int32_t)((insn >> 10) & 0x3fff); ++ return imm > (1 << 13) ? imm - (1 << 14) : imm; ++} ++ ++static int32_t operand_im12(uint32_t insn) ++{ ++ int32_t imm = (int32_t)((insn >> 10) & 0xfff); ++ return imm > (1 << 11) ? imm - (1 << 12) : imm; ++} ++ ++static int32_t operand_im8(uint32_t insn) ++{ ++ int32_t imm = (int32_t)((insn >> 10) & 0xff); ++ return imm > (1 << 7) ? imm - (1 << 8) : imm; ++} ++ ++static uint32_t operand_sd(uint32_t insn) ++{ ++ return insn & 0x3; ++} ++ ++static uint32_t operand_sj(uint32_t insn) ++{ ++ return (insn >> 5) & 0x3; ++} ++ ++static uint32_t operand_cd(uint32_t insn) ++{ ++ return insn & 0x7; ++} ++ ++static uint32_t operand_cj(uint32_t insn) ++{ ++ return (insn >> 5) & 0x7; ++} ++ ++static uint32_t operand_code(uint32_t insn) ++{ ++ return insn & 0x7fff; ++} ++ ++static int32_t operand_whint(uint32_t insn) ++{ ++ int32_t imm = (int32_t)(insn & 0x7fff); ++ return imm > (1 << 14) ? imm - (1 << 15) : imm; ++} ++ ++static int32_t operand_invop(uint32_t insn) ++{ ++ int32_t imm = (int32_t)(insn & 0x1f); ++ return imm > (1 << 4) ? imm - (1 << 5) : imm; ++} ++ ++static int32_t operand_ofs21(uint32_t insn) ++{ ++ int32_t imm = (((int32_t)insn & 0x1f) << 16) | ((insn >> 10) & 0xffff); ++ return imm > (1 << 20) ? imm - (1 << 21) : imm; ++} ++ ++static int32_t operand_ofs26(uint32_t insn) ++{ ++ int32_t imm = (((int32_t)insn & 0x3ff) << 16) | ((insn >> 10) & 0xffff); ++ return imm > (1 << 25) ? imm - (1 << 26) : imm; ++} ++ ++static uint32_t operand_fcond(uint32_t insn) ++{ ++ return (insn >> 15) & 0x1f; ++} ++ ++static uint32_t operand_sel(uint32_t insn) ++{ ++ return (insn >> 15) & 0x7; ++} ++ ++/* decode operands */ ++static void decode_insn_operands(la_decode *dec) ++{ ++ uint32_t insn = dec->insn; ++ dec->codec = opcode_la[dec->op].codec; ++ switch (dec->codec) { ++ case la_codec_illegal: ++ case la_codec_empty: ++ break; ++ case la_codec_2r: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ break; ++ case la_codec_2r_u5: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ break; ++ case la_codec_2r_u6: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_u6(insn); ++ break; ++ case la_codec_2r_2bw: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_bw1(insn); ++ dec->r4 = operand_bw2(insn); ++ break; ++ case la_codec_2r_2bd: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_bd1(insn); ++ dec->r4 = operand_bd2(insn); ++ break; ++ case la_codec_3r: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ break; ++ case la_codec_3r_rd0: ++ dec->r1 = 0; ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ break; ++ case la_codec_3r_sa2: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ dec->r4 = operand_sa2(insn); ++ break; ++ case la_codec_3r_sa3: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ dec->r4 = operand_sa3(insn); ++ break; ++ case la_codec_4r: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ dec->r4 = operand_r4(insn); ++ break; ++ case la_codec_r_im20: ++ dec->r1 = operand_r1(insn); ++ dec->imm = operand_im20(insn); ++ dec->bit = IM_20; ++ break; ++ case la_codec_2r_im16: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->imm = operand_im16(insn); ++ dec->bit = IM_16; ++ break; ++ case la_codec_2r_im14: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->imm = operand_im14(insn); ++ dec->bit = IM_14; ++ break; ++ case la_codec_im5_r_im12: ++ dec->imm2 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->imm = operand_im12(insn); ++ dec->bit = IM_12; ++ break; ++ case la_codec_2r_im12: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->imm = operand_im12(insn); ++ dec->bit = IM_12; ++ break; ++ case la_codec_2r_im8: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->imm = operand_im8(insn); ++ dec->bit = IM_8; ++ break; ++ case la_codec_r_sd: ++ dec->r1 = operand_sd(insn); ++ dec->r2 = operand_r2(insn); ++ break; ++ case la_codec_r_sj: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_sj(insn); ++ break; ++ case la_codec_r_cd: ++ dec->r1 = operand_cd(insn); ++ dec->r2 = operand_r2(insn); ++ break; ++ case la_codec_r_cj: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_cj(insn); ++ break; ++ case la_codec_r_seq: ++ dec->r1 = 0; ++ dec->r2 = operand_r1(insn); ++ dec->imm = operand_im8(insn); ++ dec->bit = IM_8; ++ break; ++ case la_codec_code: ++ dec->code = operand_code(insn); ++ break; ++ case la_codec_whint: ++ dec->imm = operand_whint(insn); ++ dec->bit = IM_15; ++ break; ++ case la_codec_invtlb: ++ dec->imm = operand_invop(insn); ++ dec->bit = IM_5; ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ break; ++ case la_codec_r_ofs21: ++ dec->imm = operand_ofs21(insn); ++ dec->bit = IM_21; ++ dec->r2 = operand_r2(insn); ++ break; ++ case la_codec_cj_ofs21: ++ dec->imm = operand_ofs21(insn); ++ dec->bit = IM_21; ++ dec->r2 = operand_cj(insn); ++ break; ++ case la_codec_ofs26: ++ dec->imm = operand_ofs26(insn); ++ dec->bit = IM_26; ++ break; ++ case la_codec_cond: ++ dec->r1 = operand_cd(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ dec->r4 = operand_fcond(insn); ++ break; ++ case la_codec_sel: ++ dec->r1 = operand_r1(insn); ++ dec->r2 = operand_r2(insn); ++ dec->r3 = operand_r3(insn); ++ dec->r4 = operand_sel(insn); ++ break; ++ } ++} ++ ++/* format instruction */ ++ ++static void append(char *s1, const char *s2, size_t n) ++{ ++ size_t l1 = strlen(s1); ++ if (n - l1 - 1 > 0) { ++ strncat(s1, s2, n - l1); ++ } ++} ++ ++static void format_insn(char *buf, size_t buflen, size_t tab, la_decode *dec) ++{ ++ char tmp[16]; ++ const char *fmt; ++ ++ fmt = opcode_la[dec->op].format; ++ while (*fmt) { ++ switch (*fmt) { ++ case 'n': /* name */ ++ append(buf, opcode_la[dec->op].name, buflen); ++ break; ++ case 's': ++ append(buf, "s", buflen); ++ break; ++ case 'd': ++ append(buf, "d", buflen); ++ break; ++ case 'e': /* illegal */ ++ snprintf(tmp, sizeof(tmp), "%x", dec->insn); ++ append(buf, tmp, buflen); ++ break; ++ case 't': ++ while (strlen(buf) < tab) { ++ append(buf, " ", buflen); ++ } ++ break; ++ case '(': ++ append(buf, "(", buflen); ++ break; ++ case ',': ++ append(buf, ",", buflen); ++ break; ++ case '.': ++ append(buf, ".", buflen); ++ break; ++ case ')': ++ append(buf, ")", buflen); ++ break; ++ case '0': /* rd */ ++ append(buf, loongarch_r_normal_name[dec->r1], buflen); ++ break; ++ case '1': /* rj */ ++ append(buf, loongarch_r_normal_name[dec->r2], buflen); ++ break; ++ case '2': /* rk */ ++ append(buf, loongarch_r_normal_name[dec->r3], buflen); ++ break; ++ case '3': /* fd */ ++ append(buf, loongarch_f_normal_name[dec->r1], buflen); ++ break; ++ case '4': /* fj */ ++ append(buf, loongarch_f_normal_name[dec->r2], buflen); ++ break; ++ case '5': /* fk */ ++ append(buf, loongarch_f_normal_name[dec->r3], buflen); ++ break; ++ case '6': /* fa */ ++ append(buf, loongarch_f_normal_name[dec->r4], buflen); ++ break; ++ case 'A': /* sd */ ++ append(buf, loongarch_cr_normal_name[dec->r1], buflen); ++ break; ++ case 'B': /* sj */ ++ append(buf, loongarch_cr_normal_name[dec->r2], buflen); ++ break; ++ case 'C': /* r3 */ ++ snprintf(tmp, sizeof(tmp), "%x", dec->r3); ++ append(buf, tmp, buflen); ++ break; ++ case 'D': /* r4 */ ++ snprintf(tmp, sizeof(tmp), "%x", dec->r4); ++ append(buf, tmp, buflen); ++ break; ++ case 'E': /* r1 */ ++ snprintf(tmp, sizeof(tmp), "%x", dec->r1); ++ append(buf, tmp, buflen); ++ break; ++ case 'F': /* fcsrd */ ++ append(buf, loongarch_r_normal_name[dec->r1], buflen); ++ break; ++ case 'G': /* fcsrs */ ++ append(buf, loongarch_r_normal_name[dec->r2], buflen); ++ break; ++ case 'H': /* cd */ ++ append(buf, loongarch_c_normal_name[dec->r1], buflen); ++ break; ++ case 'I': /* cj */ ++ append(buf, loongarch_c_normal_name[dec->r2], buflen); ++ break; ++ case 'J': /* code */ ++ snprintf(tmp, sizeof(tmp), "0x%x", dec->code); ++ append(buf, tmp, buflen); ++ break; ++ case 'K': /* cond */ ++ switch (dec->r4) { ++ case 0x0: ++ append(buf, "caf", buflen); ++ break; ++ case 0x1: ++ append(buf, "saf", buflen); ++ break; ++ case 0x2: ++ append(buf, "clt", buflen); ++ break; ++ case 0x3: ++ append(buf, "slt", buflen); ++ break; ++ case 0x4: ++ append(buf, "ceq", buflen); ++ break; ++ case 0x5: ++ append(buf, "seq", buflen); ++ break; ++ case 0x6: ++ append(buf, "cle", buflen); ++ break; ++ case 0x7: ++ append(buf, "sle", buflen); ++ break; ++ case 0x8: ++ append(buf, "cun", buflen); ++ break; ++ case 0x9: ++ append(buf, "sun", buflen); ++ break; ++ case 0xA: ++ append(buf, "cult", buflen); ++ break; ++ case 0xB: ++ append(buf, "sult", buflen); ++ break; ++ case 0xC: ++ append(buf, "cueq", buflen); ++ break; ++ case 0xD: ++ append(buf, "sueq", buflen); ++ break; ++ case 0xE: ++ append(buf, "cule", buflen); ++ break; ++ case 0xF: ++ append(buf, "sule", buflen); ++ break; ++ case 0x10: ++ append(buf, "cne", buflen); ++ break; ++ case 0x11: ++ append(buf, "sne", buflen); ++ break; ++ case 0x14: ++ append(buf, "cor", buflen); ++ break; ++ case 0x15: ++ append(buf, "sor", buflen); ++ break; ++ case 0x18: ++ append(buf, "cune", buflen); ++ break; ++ case 0x19: ++ append(buf, "sune", buflen); ++ break; ++ } ++ break; ++ case 'L': /* ca */ ++ append(buf, loongarch_c_normal_name[dec->r4], buflen); ++ break; ++ case 'M': /* cop */ ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm2) & 0x1f); ++ append(buf, tmp, buflen); ++ break; ++ case 'i': /* sixx d */ ++ snprintf(tmp, sizeof(tmp), "%d", dec->imm); ++ append(buf, tmp, buflen); ++ break; ++ case 'o': /* offset */ ++ snprintf(tmp, sizeof(tmp), "%d", (dec->imm) << 2); ++ append(buf, tmp, buflen); ++ break; ++ case 'x': /* sixx x */ ++ switch (dec->bit) { ++ case IM_5: ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm) & 0x1f); ++ append(buf, tmp, buflen); ++ break; ++ case IM_8: ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm) & 0xff); ++ append(buf, tmp, buflen); ++ break; ++ case IM_12: ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm) & 0xfff); ++ append(buf, tmp, buflen); ++ break; ++ case IM_14: ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm) & 0x3fff); ++ append(buf, tmp, buflen); ++ break; ++ case IM_15: ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm) & 0x7fff); ++ append(buf, tmp, buflen); ++ break; ++ case IM_16: ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm) & 0xffff); ++ append(buf, tmp, buflen); ++ break; ++ case IM_20: ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm) & 0xfffff); ++ append(buf, tmp, buflen); ++ break; ++ default: ++ snprintf(tmp, sizeof(tmp), "0x%x", dec->imm); ++ append(buf, tmp, buflen); ++ break; ++ } ++ break; ++ case 'X': /* offset x*/ ++ switch (dec->bit) { ++ case IM_16: ++ snprintf(tmp, sizeof(tmp), "0x%x", ((dec->imm) << 2) & 0xffff); ++ append(buf, tmp, buflen); ++ break; ++ case IM_21: ++ snprintf(tmp, sizeof(tmp), "0x%x", ++ ((dec->imm) << 2) & 0x1fffff); ++ append(buf, tmp, buflen); ++ break; ++ case IM_26: ++ snprintf(tmp, sizeof(tmp), "0x%x", ++ ((dec->imm) << 2) & 0x3ffffff); ++ append(buf, tmp, buflen); ++ break; ++ default: ++ snprintf(tmp, sizeof(tmp), "0x%x", (dec->imm) << 2); ++ append(buf, tmp, buflen); ++ break; ++ } ++ break; ++ case 'p': /* pc */ ++ snprintf(tmp, sizeof(tmp), " # 0x%" PRIx32 "", ++ dec->pc + ((dec->imm) << 2)); ++ append(buf, tmp, buflen); ++ break; ++ default: ++ break; ++ } ++ fmt++; ++ } ++} ++ ++/* disassemble instruction */ ++static void disasm_insn(char *buf, size_t buflen, bfd_vma pc, ++ unsigned long int insn) ++{ ++ la_decode dec = { 0 }; ++ dec.pc = pc; ++ dec.insn = insn; ++ decode_insn_opcode(&dec); ++ decode_insn_operands(&dec); ++ format_insn(buf, buflen, 16, &dec); ++} ++ ++int print_insn_loongarch(bfd_vma memaddr, struct disassemble_info *info) ++{ ++ char buf[128] = { 0 }; ++ bfd_byte buffer[INSNLEN]; ++ unsigned long insn; ++ int status; ++ ++ status = (*info->read_memory_func)(memaddr, buffer, INSNLEN, info); ++ if (status == 0) { ++ insn = (uint32_t)bfd_getl32(buffer); ++ (*info->fprintf_func)(info->stream, "%08" PRIx64 " ", insn); ++ } else { ++ (*info->memory_error_func)(status, memaddr, info); ++ return -1; ++ } ++ disasm_insn(buf, sizeof(buf), memaddr, insn); ++ (*info->fprintf_func)(info->stream, "\t%s", buf); ++ return INSNLEN; ++} +diff --git a/disas/meson.build b/disas/meson.build +index 5c5daa69a7..c337369cb1 100644 +--- a/disas/meson.build ++++ b/disas/meson.build +@@ -12,6 +12,7 @@ common_ss.add(when: 'CONFIG_I386_DIS', if_true: files('i386.c')) + common_ss.add(when: 'CONFIG_M68K_DIS', if_true: files('m68k.c')) + common_ss.add(when: 'CONFIG_MICROBLAZE_DIS', if_true: files('microblaze.c')) + common_ss.add(when: 'CONFIG_MIPS_DIS', if_true: files('mips.c')) ++common_ss.add(when: 'CONFIG_LOONGARCH_DIS', if_true: files('loongarch.c')) + common_ss.add(when: 'CONFIG_NANOMIPS_DIS', if_true: files('nanomips.cpp')) + common_ss.add(when: 'CONFIG_NIOS2_DIS', if_true: files('nios2.c')) + common_ss.add(when: 'CONFIG_PPC_DIS', if_true: files('ppc.c')) +diff --git a/gdb-xml/loongarch-base64.xml b/gdb-xml/loongarch-base64.xml +new file mode 100644 +index 0000000000..2e515e0e36 +--- /dev/null ++++ b/gdb-xml/loongarch-base64.xml +@@ -0,0 +1,45 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/gdb-xml/loongarch-fpu.xml b/gdb-xml/loongarch-fpu.xml +new file mode 100644 +index 0000000000..d398fe3650 +--- /dev/null ++++ b/gdb-xml/loongarch-fpu.xml +@@ -0,0 +1,50 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/hw/acpi/Kconfig b/hw/acpi/Kconfig +index 622b0b50b7..245c5554df 100644 +--- a/hw/acpi/Kconfig ++++ b/hw/acpi/Kconfig +@@ -15,6 +15,14 @@ config ACPI_X86_ICH + bool + select ACPI_X86 + ++config ACPI_LOONGARCH ++ bool ++ select ACPI ++ select ACPI_CPU_HOTPLUG ++ select ACPI_MEMORY_HOTPLUG ++ select ACPI_PIIX4 ++ select ACPI_PCIHP ++ + config ACPI_CPU_HOTPLUG + bool + +diff --git a/hw/acpi/larch_7a.c b/hw/acpi/larch_7a.c +new file mode 100644 +index 0000000000..59b43170ff +--- /dev/null ++++ b/hw/acpi/larch_7a.c +@@ -0,0 +1,616 @@ ++/* ++ * Loongarch acpi emulation ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ */ ++ ++#include "qemu/osdep.h" ++#include "sysemu/sysemu.h" ++#include "sysemu/runstate.h" ++#include "sysemu/reset.h" ++#include "hw/hw.h" ++#include "hw/irq.h" ++#include "hw/acpi/acpi.h" ++#include "hw/acpi/ls7a.h" ++#include "hw/nvram/fw_cfg.h" ++#include "qemu/config-file.h" ++#include "qapi/opts-visitor.h" ++#include "qapi/qapi-events-run-state.h" ++#include "qapi/error.h" ++#include "hw/loongarch/ls7a.h" ++#include "hw/mem/pc-dimm.h" ++#include "hw/mem/nvdimm.h" ++#include "migration/vmstate.h" ++ ++static void ls7a_pm_update_sci_fn(ACPIREGS *regs) ++{ ++ LS7APCIPMRegs *pm = container_of(regs, LS7APCIPMRegs, acpi_regs); ++ acpi_update_sci(&pm->acpi_regs, pm->irq); ++} ++ ++static uint64_t ls7a_gpe_readb(void *opaque, hwaddr addr, unsigned width) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ return acpi_gpe_ioport_readb(&pm->acpi_regs, addr); ++} ++ ++static void ls7a_gpe_writeb(void *opaque, hwaddr addr, uint64_t val, ++ unsigned width) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ acpi_gpe_ioport_writeb(&pm->acpi_regs, addr, val); ++ acpi_update_sci(&pm->acpi_regs, pm->irq); ++} ++ ++static const MemoryRegionOps ls7a_gpe_ops = { ++ .read = ls7a_gpe_readb, ++ .write = ls7a_gpe_writeb, ++ .valid.min_access_size = 1, ++ .valid.max_access_size = 8, ++ .impl.min_access_size = 1, ++ .impl.max_access_size = 1, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; ++ ++#define VMSTATE_GPE_ARRAY(_field, _state) \ ++{ \ ++ .name = (stringify(_field)), .version_id = 0, .num = ACPI_GPE0_LEN, \ ++ .info = &vmstate_info_uint8, .size = sizeof(uint8_t), \ ++ .flags = VMS_ARRAY | VMS_POINTER, \ ++ .offset = vmstate_offset_pointer(_state, _field, uint8_t), \ ++} ++ ++static uint64_t ls7a_reset_readw(void *opaque, hwaddr addr, unsigned width) ++{ ++ return 0; ++} ++ ++static void ls7a_reset_writew(void *opaque, hwaddr addr, uint64_t val, ++ unsigned width) ++{ ++ if (val & 1) { ++ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); ++ } ++} ++ ++static const MemoryRegionOps ls7a_reset_ops = { ++ .read = ls7a_reset_readw, ++ .write = ls7a_reset_writew, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; ++ ++static bool vmstate_test_use_memhp(void *opaque) ++{ ++ LS7APCIPMRegs *s = opaque; ++ return s->acpi_memory_hotplug.is_enabled; ++} ++ ++static const VMStateDescription vmstate_memhp_state = { ++ .name = "ls7a_pm/memhp", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .minimum_version_id_old = 1, ++ .needed = vmstate_test_use_memhp, ++ .fields = (VMStateField[]){ VMSTATE_MEMORY_HOTPLUG(acpi_memory_hotplug, ++ LS7APCIPMRegs), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static const VMStateDescription vmstate_cpuhp_state = { ++ .name = "ls7a_pm/cpuhp", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .minimum_version_id_old = 1, ++ .fields = ++ (VMStateField[]){ VMSTATE_CPU_HOTPLUG(cpuhp_state, LS7APCIPMRegs), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++const VMStateDescription vmstate_ls7a_pm = { ++ .name = "ls7a_pm", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = ++ (VMStateField[]){ ++ VMSTATE_UINT16(acpi_regs.pm1.evt.sts, LS7APCIPMRegs), ++ VMSTATE_UINT16(acpi_regs.pm1.evt.en, LS7APCIPMRegs), ++ VMSTATE_UINT16(acpi_regs.pm1.cnt.cnt, LS7APCIPMRegs), ++ VMSTATE_TIMER_PTR(acpi_regs.tmr.timer, LS7APCIPMRegs), ++ VMSTATE_INT64(acpi_regs.tmr.overflow_time, LS7APCIPMRegs), ++ VMSTATE_GPE_ARRAY(acpi_regs.gpe.sts, LS7APCIPMRegs), ++ VMSTATE_GPE_ARRAY(acpi_regs.gpe.en, LS7APCIPMRegs), ++ VMSTATE_END_OF_LIST() }, ++ .subsections = (const VMStateDescription *[]){ &vmstate_memhp_state, ++ &vmstate_cpuhp_state, NULL } ++}; ++ ++static inline int64_t acpi_pm_tmr_get_clock(void) ++{ ++ return muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL), PM_TIMER_FREQUENCY, ++ NANOSECONDS_PER_SECOND); ++} ++ ++static uint32_t acpi_pm_tmr_get(ACPIREGS *ar) ++{ ++ uint32_t d = acpi_pm_tmr_get_clock(); ++ return d & 0xffffff; ++} ++ ++static void acpi_pm_tmr_timer(void *opaque) ++{ ++ ACPIREGS *ar = opaque; ++ qemu_system_wakeup_request(QEMU_WAKEUP_REASON_PMTIMER, NULL); ++ ar->tmr.update_sci(ar); ++} ++ ++static uint64_t acpi_pm_tmr_read(void *opaque, hwaddr addr, unsigned width) ++{ ++ return acpi_pm_tmr_get(opaque); ++} ++ ++static void acpi_pm_tmr_write(void *opaque, hwaddr addr, uint64_t val, ++ unsigned width) ++{ ++ /* nothing */ ++} ++ ++static const MemoryRegionOps acpi_pm_tmr_ops = { ++ .read = acpi_pm_tmr_read, ++ .write = acpi_pm_tmr_write, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; ++ ++static void ls7a_pm_tmr_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, ++ MemoryRegion *parent, uint64_t offset) ++{ ++ ar->tmr.update_sci = update_sci; ++ ar->tmr.timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, acpi_pm_tmr_timer, ar); ++ memory_region_init_io(&ar->tmr.io, memory_region_owner(parent), ++ &acpi_pm_tmr_ops, ar, "acpi-tmr", 4); ++ memory_region_add_subregion(parent, offset, &ar->tmr.io); ++} ++ ++static void acpi_pm1_evt_write_sts(ACPIREGS *ar, uint16_t val) ++{ ++ uint16_t pm1_sts = acpi_pm1_evt_get_sts(ar); ++ if (pm1_sts & val & ACPI_BITMASK_TIMER_STATUS) { ++ /* if TMRSTS is reset, then compute the new overflow time */ ++ acpi_pm_tmr_calc_overflow_time(ar); ++ } ++ ar->pm1.evt.sts &= ~val; ++} ++ ++static uint64_t acpi_pm_evt_read(void *opaque, hwaddr addr, unsigned width) ++{ ++ ACPIREGS *ar = opaque; ++ switch (addr) { ++ case 0: ++ return acpi_pm1_evt_get_sts(ar); ++ case 4: ++ return ar->pm1.evt.en; ++ default: ++ return 0; ++ } ++} ++ ++static void acpi_pm1_evt_write_en(ACPIREGS *ar, uint16_t val) ++{ ++ ar->pm1.evt.en = val; ++ qemu_system_wakeup_enable(QEMU_WAKEUP_REASON_RTC, ++ val & ACPI_BITMASK_RT_CLOCK_ENABLE); ++ qemu_system_wakeup_enable(QEMU_WAKEUP_REASON_PMTIMER, ++ val & ACPI_BITMASK_TIMER_ENABLE); ++} ++ ++static void acpi_pm_evt_write(void *opaque, hwaddr addr, uint64_t val, ++ unsigned width) ++{ ++ ACPIREGS *ar = opaque; ++ switch (addr) { ++ case 0: ++ acpi_pm1_evt_write_sts(ar, val); ++ ar->pm1.evt.update_sci(ar); ++ break; ++ case 4: ++ acpi_pm1_evt_write_en(ar, val); ++ ar->pm1.evt.update_sci(ar); ++ break; ++ default: ++ break; ++ } ++} ++ ++static const MemoryRegionOps acpi_pm_evt_ops = { ++ .read = acpi_pm_evt_read, ++ .write = acpi_pm_evt_write, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; ++ ++static void ls7a_pm1_evt_init(ACPIREGS *ar, acpi_update_sci_fn update_sci, ++ MemoryRegion *parent, uint64_t offset) ++{ ++ ar->pm1.evt.update_sci = update_sci; ++ memory_region_init_io(&ar->pm1.evt.io, memory_region_owner(parent), ++ &acpi_pm_evt_ops, ar, "acpi-evt", 8); ++ memory_region_add_subregion(parent, offset, &ar->pm1.evt.io); ++} ++ ++static uint64_t acpi_pm_cnt_read(void *opaque, hwaddr addr, unsigned width) ++{ ++ ACPIREGS *ar = opaque; ++ return ar->pm1.cnt.cnt; ++} ++ ++/* ACPI PM1aCNT */ ++static void acpi_pm1_cnt_write(ACPIREGS *ar, uint16_t val) ++{ ++ ar->pm1.cnt.cnt = val & ~(ACPI_BITMASK_SLEEP_ENABLE); ++ if (val & ACPI_BITMASK_SLEEP_ENABLE) { ++ /* change suspend type */ ++ uint16_t sus_typ = (val >> 10) & 7; ++ switch (sus_typ) { ++ /* s3,s4 not support */ ++ case 5: ++ case 6: ++ warn_report("acpi s3,s4 state not support"); ++ break; ++ /* s5: soft off */ ++ case 7: ++ qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); ++ break; ++ default: ++ break; ++ } ++ } ++} ++ ++static void acpi_pm_cnt_write(void *opaque, hwaddr addr, uint64_t val, ++ unsigned width) ++{ ++ acpi_pm1_cnt_write(opaque, val); ++} ++ ++static const MemoryRegionOps acpi_pm_cnt_ops = { ++ .read = acpi_pm_cnt_read, ++ .write = acpi_pm_cnt_write, ++ .valid.min_access_size = 4, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_LITTLE_ENDIAN, ++}; ++ ++static void acpi_notify_wakeup(Notifier *notifier, void *data) ++{ ++ ACPIREGS *ar = container_of(notifier, ACPIREGS, wakeup); ++ WakeupReason *reason = data; ++ ++ switch (*reason) { ++ case QEMU_WAKEUP_REASON_RTC: ++ ar->pm1.evt.sts |= ++ (ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_RT_CLOCK_STATUS); ++ break; ++ case QEMU_WAKEUP_REASON_PMTIMER: ++ ar->pm1.evt.sts |= ++ (ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_TIMER_STATUS); ++ break; ++ case QEMU_WAKEUP_REASON_OTHER: ++ /* ++ * ACPI_BITMASK_WAKE_STATUS should be set on resume. ++ * Pretend that resume was caused by power button ++ */ ++ ar->pm1.evt.sts |= ++ (ACPI_BITMASK_WAKE_STATUS | ACPI_BITMASK_POWER_BUTTON_STATUS); ++ break; ++ default: ++ break; ++ } ++} ++ ++static void ls7a_pm1_cnt_init(ACPIREGS *ar, MemoryRegion *parent, ++ bool disable_s3, bool disable_s4, uint8_t s4_val, ++ uint64_t offset) ++{ ++ FWCfgState *fw_cfg; ++ ++ ar->pm1.cnt.s4_val = s4_val; ++ ar->wakeup.notify = acpi_notify_wakeup; ++ qemu_register_wakeup_notifier(&ar->wakeup); ++ memory_region_init_io(&ar->pm1.cnt.io, memory_region_owner(parent), ++ &acpi_pm_cnt_ops, ar, "acpi-cnt", 4); ++ memory_region_add_subregion(parent, offset, &ar->pm1.cnt.io); ++ ++ fw_cfg = fw_cfg_find(); ++ if (fw_cfg) { ++ uint8_t suspend[6] = { 128, 0, 0, 129, 128, 128 }; ++ suspend[3] = 1 | ((!disable_s3) << 7); ++ suspend[4] = s4_val | ((!disable_s4) << 7); ++ fw_cfg_add_file(fw_cfg, "etc/system-states", g_memdup(suspend, 6), 6); ++ } ++} ++ ++static void ls7a_pm_reset(void *opaque) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ ++ acpi_pm1_evt_reset(&pm->acpi_regs); ++ acpi_pm1_cnt_reset(&pm->acpi_regs); ++ acpi_pm_tmr_reset(&pm->acpi_regs); ++ acpi_gpe_reset(&pm->acpi_regs); ++ ++ acpi_update_sci(&pm->acpi_regs, pm->irq); ++} ++ ++static void pm_powerdown_req(Notifier *n, void *opaque) ++{ ++ LS7APCIPMRegs *pm = container_of(n, LS7APCIPMRegs, powerdown_notifier); ++ ++ acpi_pm1_evt_power_down(&pm->acpi_regs); ++} ++ ++void ls7a_pm_init(LS7APCIPMRegs *pm, qemu_irq *pic) ++{ ++ unsigned long base, gpe_len, acpi_aci_irq; ++ ++ /* ++ * ls7a board acpi hardware info, including ++ * acpi system io base address ++ * acpi gpe length ++ * acpi sci irq number ++ */ ++ base = ACPI_IO_BASE; ++ gpe_len = ACPI_GPE0_LEN; ++ acpi_aci_irq = ACPI_SCI_IRQ; ++ ++ pm->irq = pic[acpi_aci_irq - 64]; ++ memory_region_init(&pm->iomem, NULL, "ls7a_pm", ACPI_IO_SIZE); ++ memory_region_add_subregion(get_system_memory(), base, &pm->iomem); ++ ++ cpu_hotplug_hw_init(get_system_memory(), NULL, &pm->cpuhp_state, ++ CPU_HOTPLUG_BASE); ++ ++ ls7a_pm_tmr_init(&pm->acpi_regs, ls7a_pm_update_sci_fn, &pm->iomem, ++ LS7A_PM_TMR_BLK); ++ ls7a_pm1_evt_init(&pm->acpi_regs, ls7a_pm_update_sci_fn, &pm->iomem, ++ LS7A_PM_EVT_BLK); ++ ls7a_pm1_cnt_init(&pm->acpi_regs, &pm->iomem, false, false, 2, ++ LS7A_PM_CNT_BLK); ++ ++ acpi_gpe_init(&pm->acpi_regs, gpe_len); ++ memory_region_init_io(&pm->iomem_gpe, NULL, &ls7a_gpe_ops, pm, "acpi-gpe0", ++ gpe_len); ++ memory_region_add_subregion(&pm->iomem, LS7A_GPE0_STS_REG, &pm->iomem_gpe); ++ ++ memory_region_init_io(&pm->iomem_reset, NULL, &ls7a_reset_ops, pm, ++ "acpi-reset", 4); ++ memory_region_add_subregion(&pm->iomem, LS7A_GPE0_RESET_REG, ++ &pm->iomem_reset); ++ ++ qemu_register_reset(ls7a_pm_reset, pm); ++ ++ pm->powerdown_notifier.notify = pm_powerdown_req; ++ qemu_register_powerdown_notifier(&pm->powerdown_notifier); ++ ++ if (pm->acpi_memory_hotplug.is_enabled) { ++ acpi_memory_hotplug_init(get_system_memory(), NULL, ++ &pm->acpi_memory_hotplug, ++ MEMORY_HOTPLUG_BASE); ++ } ++} ++ ++static void ls7a_pm_get_gpe0_blk(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ uint64_t value = ACPI_IO_BASE + LS7A_GPE0_STS_REG; ++ ++ visit_type_uint64(v, name, &value, errp); ++} ++ ++static bool ls7a_pm_get_memory_hotplug_support(Object *obj, Error **errp) ++{ ++ LS7APCIState *ls7a = get_ls7a_type(obj); ++ ++ return ls7a->pm.acpi_memory_hotplug.is_enabled; ++} ++ ++static void ls7a_pm_set_memory_hotplug_support(Object *obj, bool value, ++ Error **errp) ++{ ++ LS7APCIState *ls7a = get_ls7a_type(obj); ++ ++ ls7a->pm.acpi_memory_hotplug.is_enabled = value; ++} ++ ++static void ls7a_pm_get_disable_s3(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ uint8_t value = pm->disable_s3; ++ ++ visit_type_uint8(v, name, &value, errp); ++} ++ ++static void ls7a_pm_set_disable_s3(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ Error *local_err = NULL; ++ uint8_t value; ++ ++ visit_type_uint8(v, name, &value, &local_err); ++ if (local_err) { ++ goto out; ++ } ++ pm->disable_s3 = value; ++out: ++ error_propagate(errp, local_err); ++} ++ ++static void ls7a_pm_get_disable_s4(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ uint8_t value = pm->disable_s4; ++ ++ visit_type_uint8(v, name, &value, errp); ++} ++ ++static void ls7a_pm_set_disable_s4(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ Error *local_err = NULL; ++ uint8_t value; ++ ++ visit_type_uint8(v, name, &value, &local_err); ++ if (local_err) { ++ goto out; ++ } ++ pm->disable_s4 = value; ++out: ++ error_propagate(errp, local_err); ++} ++ ++static void ls7a_pm_get_s4_val(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ uint8_t value = pm->s4_val; ++ ++ visit_type_uint8(v, name, &value, errp); ++} ++ ++static void ls7a_pm_set_s4_val(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ LS7APCIPMRegs *pm = opaque; ++ Error *local_err = NULL; ++ uint8_t value; ++ ++ visit_type_uint8(v, name, &value, &local_err); ++ if (local_err) { ++ goto out; ++ } ++ pm->s4_val = value; ++out: ++ error_propagate(errp, local_err); ++} ++ ++void ls7a_pm_add_properties(Object *obj, LS7APCIPMRegs *pm, Error **errp) ++{ ++ static const uint32_t gpe0_len = ACPI_GPE0_LEN; ++ pm->acpi_memory_hotplug.is_enabled = true; ++ pm->disable_s3 = 0; ++ pm->disable_s4 = 0; ++ pm->s4_val = 2; ++ ++ object_property_add_uint32_ptr(obj, ACPI_PM_PROP_PM_IO_BASE, ++ &pm->pm_io_base, OBJ_PROP_FLAG_READ); ++ object_property_add(obj, ACPI_PM_PROP_GPE0_BLK, "uint32", ++ ls7a_pm_get_gpe0_blk, NULL, NULL, pm); ++ object_property_add_uint32_ptr(obj, ACPI_PM_PROP_GPE0_BLK_LEN, &gpe0_len, ++ OBJ_PROP_FLAG_READ); ++ object_property_add_bool(obj, "memory-hotplug-support", ++ ls7a_pm_get_memory_hotplug_support, ++ ls7a_pm_set_memory_hotplug_support); ++ object_property_add(obj, ACPI_PM_PROP_S3_DISABLED, "uint8", ++ ls7a_pm_get_disable_s3, ls7a_pm_set_disable_s3, NULL, ++ pm); ++ object_property_add(obj, ACPI_PM_PROP_S4_DISABLED, "uint8", ++ ls7a_pm_get_disable_s4, ls7a_pm_set_disable_s4, NULL, ++ pm); ++ object_property_add(obj, ACPI_PM_PROP_S4_VAL, "uint8", ls7a_pm_get_s4_val, ++ ls7a_pm_set_s4_val, NULL, pm); ++} ++ ++void ls7a_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, ++ Error **errp) ++{ ++ LS7APCIState *ls7a = get_ls7a_type(OBJECT(hotplug_dev)); ++ ++ if (ls7a->pm.acpi_memory_hotplug.is_enabled && ++ object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { ++ if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) { ++ nvdimm_acpi_plug_cb(hotplug_dev, dev); ++ } else { ++ acpi_memory_plug_cb(hotplug_dev, &ls7a->pm.acpi_memory_hotplug, ++ dev, errp); ++ } ++ } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { ++ acpi_cpu_plug_cb(hotplug_dev, &ls7a->pm.cpuhp_state, dev, errp); ++ } else { ++ error_setg(errp, ++ "acpi: device plug request for not supported device" ++ " type: %s", ++ object_get_typename(OBJECT(dev))); ++ } ++} ++ ++void ls7a_pm_device_unplug_request_cb(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ LS7APCIState *ls7a = get_ls7a_type(OBJECT(hotplug_dev)); ++ ++ if (ls7a->pm.acpi_memory_hotplug.is_enabled && ++ object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { ++ acpi_memory_unplug_request_cb( ++ hotplug_dev, &ls7a->pm.acpi_memory_hotplug, dev, errp); ++ } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { ++ acpi_cpu_unplug_request_cb(hotplug_dev, &ls7a->pm.cpuhp_state, dev, ++ errp); ++ } else { ++ error_setg(errp, ++ "acpi: device unplug request for not supported device" ++ " type: %s", ++ object_get_typename(OBJECT(dev))); ++ } ++} ++ ++void ls7a_pm_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, ++ Error **errp) ++{ ++ LS7APCIState *ls7a = get_ls7a_type(OBJECT(hotplug_dev)); ++ ++ if (ls7a->pm.acpi_memory_hotplug.is_enabled && ++ object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { ++ acpi_memory_unplug_cb(&ls7a->pm.acpi_memory_hotplug, dev, errp); ++ } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { ++ acpi_cpu_unplug_cb(&ls7a->pm.cpuhp_state, dev, errp); ++ } else { ++ error_setg(errp, ++ "acpi: device unplug for not supported device" ++ " type: %s", ++ object_get_typename(OBJECT(dev))); ++ } ++} ++ ++void ls7a_pm_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list) ++{ ++ LS7APCIState *ls7a = get_ls7a_type(OBJECT(adev)); ++ ++ acpi_memory_ospm_status(&ls7a->pm.acpi_memory_hotplug, list); ++ acpi_cpu_ospm_status(&ls7a->pm.cpuhp_state, list); ++} ++ ++void ls7a_send_gpe(AcpiDeviceIf *adev, AcpiEventStatusBits ev) ++{ ++ LS7APCIState *ls7a = get_ls7a_type(OBJECT(adev)); ++ ++ acpi_send_gpe_event(&ls7a->pm.acpi_regs, ls7a->pm.irq, ev); ++} +diff --git a/hw/acpi/meson.build b/hw/acpi/meson.build +index 448ea6afb4..4718d143fc 100644 +--- a/hw/acpi/meson.build ++++ b/hw/acpi/meson.build +@@ -6,6 +6,7 @@ acpi_ss.add(files( + 'core.c', + 'utils.c', + )) ++acpi_ss.add(when: 'CONFIG_ACPI_LOONGARCH', if_true: files('larch_7a.c')) + acpi_ss.add(when: 'CONFIG_ACPI_CPU_HOTPLUG', if_true: files('cpu.c', 'cpu_hotplug.c')) + acpi_ss.add(when: 'CONFIG_ACPI_CPU_HOTPLUG', if_false: files('acpi-cpu-hotplug-stub.c')) + acpi_ss.add(when: 'CONFIG_ACPI_MEMORY_HOTPLUG', if_true: files('memory_hotplug.c')) +diff --git a/hw/loongarch/Kconfig b/hw/loongarch/Kconfig +new file mode 100644 +index 0000000000..3fe2677fda +--- /dev/null ++++ b/hw/loongarch/Kconfig +@@ -0,0 +1,17 @@ ++config LS7A_APIC ++ bool ++ ++config LS7A_RTC ++ bool ++ ++config LOONGSON3A ++ bool ++ ++config MEM_HOTPLUG ++ bool ++ ++config ACPI_LOONGARCH ++ bool ++ ++config E1000E_PCI ++ bool +diff --git a/hw/loongarch/acpi-build.c b/hw/loongarch/acpi-build.c +new file mode 100644 +index 0000000000..4dd128a05e +--- /dev/null ++++ b/hw/loongarch/acpi-build.c +@@ -0,0 +1,827 @@ ++/* ++ * Support for generating ACPI tables and passing them to Guests ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qapi/error.h" ++#include "qapi/qmp/qnum.h" ++#include "acpi-build.h" ++#include "qemu-common.h" ++#include "qemu/bitmap.h" ++#include "qemu/error-report.h" ++#include "hw/pci/pci.h" ++#include "hw/boards.h" ++#include "hw/core/cpu.h" ++#include "target/loongarch64/cpu.h" ++#include "hw/misc/pvpanic.h" ++#include "hw/timer/hpet.h" ++#include "hw/acpi/acpi-defs.h" ++#include "hw/acpi/acpi.h" ++#include "hw/acpi/cpu.h" ++#include "hw/nvram/fw_cfg.h" ++#include "hw/acpi/bios-linker-loader.h" ++#include "hw/loader.h" ++#include "hw/isa/isa.h" ++#include "hw/block/fdc.h" ++#include "hw/acpi/memory_hotplug.h" ++#include "sysemu/tpm.h" ++#include "hw/acpi/tpm.h" ++#include "hw/acpi/vmgenid.h" ++#include "sysemu/tpm_backend.h" ++#include "hw/rtc/mc146818rtc_regs.h" ++#include "sysemu/numa.h" ++#include "sysemu/runstate.h" ++#include "sysemu/reset.h" ++#include "migration/vmstate.h" ++#include "hw/mem/memory-device.h" ++#include "hw/acpi/utils.h" ++#include "hw/acpi/pci.h" ++/* Supported chipsets: */ ++#include "hw/acpi/aml-build.h" ++#include "hw/loongarch/larch.h" ++#include "hw/loongarch/ls7a.h" ++#include "hw/platform-bus.h" ++ ++#include "hw/acpi/ipmi.h" ++#include "hw/acpi/ls7a.h" ++ ++/* ++ * These are used to size the ACPI tables for -M pc-i440fx-1.7 and ++ * -M pc-i440fx-2.0. Even if the actual amount of AML generated grows ++ * a little bit, there should be plenty of free space since the DSDT ++ * shrunk by ~1.5k between QEMU 2.0 and QEMU 2.1. ++ */ ++#define ACPI_BUILD_ALIGN_SIZE 0x1000 ++#define ACPI_BUILD_TABLE_SIZE 0x20000 ++ ++/* #define DEBUG_ACPI_BUILD */ ++#ifdef DEBUG_ACPI_BUILD ++#define ACPI_BUILD_DPRINTF(fmt, ...) \ ++ do { \ ++ printf("ACPI_BUILD: " fmt, ##__VA_ARGS__); \ ++ } while (0) ++#else ++#define ACPI_BUILD_DPRINTF(fmt, ...) ++#endif ++ ++/* Default IOAPIC ID */ ++#define ACPI_BUILD_IOAPIC_ID 0x0 ++ ++/* PCI fw r3.0 MCFG table. */ ++/* Subtable */ ++ ++typedef struct AcpiMiscInfo { ++ bool is_piix4; ++ bool has_hpet; ++ TPMVersion tpm_version; ++ const unsigned char *dsdt_code; ++ unsigned dsdt_size; ++ uint16_t pvpanic_port; ++ uint16_t applesmc_io_base; ++} AcpiMiscInfo; ++ ++typedef struct AcpiBuildPciBusHotplugState { ++ GArray *device_table; ++ GArray *notify_table; ++ struct AcpiBuildPciBusHotplugState *parent; ++ bool pcihp_bridge_en; ++} AcpiBuildPciBusHotplugState; ++ ++static void init_common_fadt_data(AcpiFadtData *data) ++{ ++ AmlAddressSpace as = AML_AS_SYSTEM_MEMORY; ++ uint64_t base = LS7A_ACPI_REG_BASE; ++ AcpiFadtData fadt = { ++ .rev = 3, ++ .flags = (1 << ACPI_FADT_F_WBINVD) | (1 << ACPI_FADT_F_PROC_C1) | ++ (1 << ACPI_FADT_F_SLP_BUTTON) | ++ (1 << ACPI_FADT_F_TMR_VAL_EXT) | ++ (1 << ACPI_FADT_F_RESET_REG_SUP), ++ /* C2 state not supported */ ++ .plvl2_lat = 0xfff, ++ /* C3 state not supported */ ++ .plvl3_lat = 0xfff, ++ .smi_cmd = 0x00, ++ .sci_int = ACPI_SCI_IRQ, ++ .acpi_enable_cmd = 0x00, ++ .acpi_disable_cmd = 0x00, ++ .pm1a_evt = { .space_id = as, ++ .bit_width = 8 * 8, ++ .address = base + LS7A_PM_EVT_BLK }, ++ .pm1a_cnt = { .space_id = as, ++ .bit_width = 4 * 8, ++ .address = base + LS7A_PM_CNT_BLK }, ++ .pm_tmr = { .space_id = as, ++ .bit_width = 4 * 8, ++ .address = base + LS7A_PM_TMR_BLK }, ++ .gpe0_blk = { .space_id = as, ++ .bit_width = 8 * 8, ++ .address = base + LS7A_GPE0_STS_REG }, ++ .reset_reg = { .space_id = as, ++ .bit_width = 4 * 8, ++ .address = base + LS7A_GPE0_RESET_REG }, ++ .reset_val = 0x1, ++ }; ++ *data = fadt; ++} ++ ++static void acpi_align_size(GArray *blob, unsigned align) ++{ ++ /* ++ * Align size to multiple of given size. This reduces the chance ++ * we need to change size in the future (breaking cross version migration). ++ */ ++ g_array_set_size(blob, ROUND_UP(acpi_data_len(blob), align)); ++} ++ ++/* FACS */ ++static void build_facs(GArray *table_data) ++{ ++ const char *sig = "FACS"; ++ const uint8_t reserved[40] = {}; ++ ++ g_array_append_vals(table_data, sig, 4); /* Signature */ ++ build_append_int_noprefix(table_data, 64, 4); /* Length */ ++ build_append_int_noprefix(table_data, 0, 4); /* Hardware Signature */ ++ build_append_int_noprefix(table_data, 0, 4); /* Firmware Waking Vector */ ++ build_append_int_noprefix(table_data, 0, 4); /* Global Lock */ ++ build_append_int_noprefix(table_data, 0, 4); /* Flags */ ++ g_array_append_vals(table_data, reserved, 40); /* Reserved */ ++} ++ ++void ls7a_madt_cpu_entry(AcpiDeviceIf *adev, int uid, ++ const CPUArchIdList *apic_ids, GArray *entry, ++ bool force_enabled) ++{ ++ uint32_t apic_id = apic_ids->cpus[uid].arch_id; ++ /* Flags – Local APIC Flags */ ++ uint32_t flags = apic_ids->cpus[uid].cpu != NULL || force_enabled ? 1 : 0; ++ ++ /* Rev 1.0b, Table 5-13 Processor Local APIC Structure */ ++ build_append_int_noprefix(entry, 0, 1); /* Type */ ++ build_append_int_noprefix(entry, 8, 1); /* Length */ ++ build_append_int_noprefix(entry, uid, 1); /* ACPI Processor ID */ ++ build_append_int_noprefix(entry, apic_id, 1); /* APIC ID */ ++ build_append_int_noprefix(entry, flags, 4); /* Flags */ ++} ++ ++static void build_ioapic(GArray *entry, uint8_t id, uint32_t addr, ++ uint32_t irq) ++{ ++ /* Rev 1.0b, 5.2.8.2 IO APIC */ ++ build_append_int_noprefix(entry, 1, 1); /* Type */ ++ build_append_int_noprefix(entry, 12, 1); /* Length */ ++ build_append_int_noprefix(entry, id, 1); /* IO APIC ID */ ++ build_append_int_noprefix(entry, 0, 1); /* Reserved */ ++ build_append_int_noprefix(entry, addr, 4); /* IO APIC Address */ ++ build_append_int_noprefix(entry, irq, 4); /* System Vector Base */ ++} ++ ++static void build_madt(GArray *table_data, BIOSLinker *linker, ++ LoongarchMachineState *lsms) ++{ ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ MachineClass *mc = MACHINE_GET_CLASS(lsms); ++ const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(MACHINE(lsms)); ++ AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(lsms->acpi_dev); ++ AcpiDeviceIf *adev = ACPI_DEVICE_IF(lsms->acpi_dev); ++ int i; ++ AcpiTable table = { .sig = "APIC", ++ .rev = 1, ++ .oem_id = lsms->oem_id, ++ .oem_table_id = lsms->oem_table_id }; ++ ++ acpi_table_begin(&table, table_data); ++ ++ /* Local APIC Address */ ++ build_append_int_noprefix(table_data, 0, 4); ++ build_append_int_noprefix(table_data, 1 /* PCAT_COMPAT */, 4); /* Flags */ ++ ++ for (i = 0; i < apic_ids->len; i++) { ++ adevc->madt_cpu(adev, i, apic_ids, table_data, false); ++ } ++ ++ build_ioapic(table_data, ACPI_BUILD_IOAPIC_ID, lsmc->ls7a_ioapic_reg_base, ++ LOONGARCH_PCH_IRQ_BASE); ++ ++ /* Rev 1.0b, 5.2.8.3.3 Local APIC NMI */ ++ build_append_int_noprefix(table_data, 3, 1); /* Type */ ++ build_append_int_noprefix(table_data, 6, 1); /* Length */ ++ /* ACPI Processor ID */ ++ build_append_int_noprefix(table_data, 0xFF, 1); /* all processors */ ++ build_append_int_noprefix(table_data, 0, 2); /* Flags */ ++ /* Local APIC INTI# */ ++ build_append_int_noprefix(table_data, 1, 1); /* ACPI_LINT1 */ ++ ++ /* Rev 1.0b, 5.2.8.3.3 Local APIC NMI */ ++ build_append_int_noprefix(table_data, 4, 1); /* Type */ ++ build_append_int_noprefix(table_data, 6, 1); /* Length */ ++ /* ACPI Processor ID */ ++ build_append_int_noprefix(table_data, 0xFF, 1); /* all processors */ ++ build_append_int_noprefix(table_data, 0, 2); /* Flags */ ++ /* Local APIC INTI# */ ++ build_append_int_noprefix(table_data, 1, 1); /* ACPI_LINT1 */ ++ ++ acpi_table_end(linker, &table); ++} ++ ++static void build_srat(GArray *table_data, BIOSLinker *linker, ++ MachineState *machine) ++{ ++ uint64_t i, mem_len, mem_base; ++ MachineClass *mc = MACHINE_GET_CLASS(machine); ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ const CPUArchIdList *apic_ids = mc->possible_cpu_arch_ids(machine); ++ int nb_numa_nodes = machine->numa_state->num_nodes; ++ NodeInfo *numa_info = machine->numa_state->nodes; ++ AcpiTable table = { .sig = "SRAT", ++ .rev = 1, ++ .oem_id = lsms->oem_id, ++ .oem_table_id = lsms->oem_table_id }; ++ ++ acpi_table_begin(&table, table_data); ++ build_append_int_noprefix(table_data, 1, 4); /* Reserved */ ++ build_append_int_noprefix(table_data, 0, 8); /* Reserved */ ++ ++ for (i = 0; i < apic_ids->len; ++i) { ++ /* 5.2.15.1 Processor Local APIC/SAPIC Affinity Structure */ ++ build_append_int_noprefix(table_data, 0, 1); /* Type */ ++ build_append_int_noprefix(table_data, 16, 1); /* Length */ ++ /* Proximity Domain [7:0] */ ++ build_append_int_noprefix(table_data, apic_ids->cpus[i].props.node_id, ++ 1); ++ build_append_int_noprefix(table_data, apic_ids->cpus[i].arch_id, ++ 1); /* APIC ID */ ++ /* Flags, Table 5-36 */ ++ build_append_int_noprefix(table_data, 1, 4); ++ build_append_int_noprefix(table_data, 0, 1); /* Local SAPIC EID */ ++ /* Proximity Domain [31:8] */ ++ build_append_int_noprefix(table_data, 0, 3); ++ build_append_int_noprefix(table_data, 0, 4); /* Reserved */ ++ } ++ ++ /* node0 */ ++ mem_base = (uint64_t)0; ++ mem_len = 0x10000000; ++ build_srat_memory(table_data, mem_base, mem_len, 0, MEM_AFFINITY_ENABLED); ++ mem_base = 0x90000000; ++ if (!nb_numa_nodes) { ++ mem_len = machine->ram_size - 0x10000000; ++ } else { ++ mem_len = numa_info[0].node_mem - 0x10000000; ++ } ++ ++ build_srat_memory(table_data, mem_base, mem_len, 0, MEM_AFFINITY_ENABLED); ++ mem_base += mem_len; ++ ++ /* node1 ~ nodemax */ ++ for (i = 1; i < nb_numa_nodes; ++i) { ++ mem_len = numa_info[i].node_mem; ++ build_srat_memory(table_data, mem_base, mem_len, i, ++ MEM_AFFINITY_ENABLED); ++ mem_base += mem_len; ++ } ++ ++ if (lsms->hotplug_memory_size) { ++ build_srat_memory(table_data, machine->device_memory->base, ++ lsms->hotplug_memory_size, 0, ++ MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED); ++ } ++ ++ acpi_table_end(linker, &table); ++} ++ ++typedef struct AcpiBuildState { ++ /* Copy of table in RAM (for patching). */ ++ MemoryRegion *table_mr; ++ /* Is table patched? */ ++ uint8_t patched; ++ void *rsdp; ++ MemoryRegion *rsdp_mr; ++ MemoryRegion *linker_mr; ++} AcpiBuildState; ++ ++static void build_ls7a_pci0_int(Aml *table) ++{ ++ Aml *sb_scope = aml_scope("_SB"); ++ Aml *pci0_scope = aml_scope("PCI0"); ++ Aml *prt_pkg = aml_varpackage(128); ++ int slot, pin; ++ ++ for (slot = 0; slot < PCI_SLOT_MAX; slot++) { ++ for (pin = 0; pin < PCI_NUM_PINS; pin++) { ++ Aml *pkg = aml_package(4); ++ aml_append(pkg, aml_int((slot << 16) | 0xFFFF)); ++ aml_append(pkg, aml_int(pin)); ++ aml_append(pkg, aml_int(0)); ++ aml_append(pkg, aml_int(LOONGARCH_PCH_IRQ_BASE + 16 + ++ (slot * 4 + pin) % 16)); ++ aml_append(prt_pkg, pkg); ++ } ++ } ++ aml_append(pci0_scope, aml_name_decl("_PRT", prt_pkg)); ++ ++ aml_append(sb_scope, pci0_scope); ++ ++ aml_append(table, sb_scope); ++} ++ ++static void build_dbg_aml(Aml *table) ++{ ++ Aml *field; ++ Aml *method; ++ Aml *while_ctx; ++ Aml *scope = aml_scope("\\"); ++ Aml *buf = aml_local(0); ++ Aml *len = aml_local(1); ++ Aml *idx = aml_local(2); ++ ++ aml_append(scope, aml_operation_region("DBG", AML_SYSTEM_IO, ++ aml_int(0x0402), 0x01)); ++ field = aml_field("DBG", AML_BYTE_ACC, AML_NOLOCK, AML_PRESERVE); ++ aml_append(field, aml_named_field("DBGB", 8)); ++ aml_append(scope, field); ++ ++ method = aml_method("DBUG", 1, AML_NOTSERIALIZED); ++ ++ aml_append(method, aml_to_hexstring(aml_arg(0), buf)); ++ aml_append(method, aml_to_buffer(buf, buf)); ++ aml_append(method, aml_subtract(aml_sizeof(buf), aml_int(1), len)); ++ aml_append(method, aml_store(aml_int(0), idx)); ++ ++ while_ctx = aml_while(aml_lless(idx, len)); ++ aml_append(while_ctx, ++ aml_store(aml_derefof(aml_index(buf, idx)), aml_name("DBGB"))); ++ aml_append(while_ctx, aml_increment(idx)); ++ aml_append(method, while_ctx); ++ ++ aml_append(method, aml_store(aml_int(0x0A), aml_name("DBGB"))); ++ aml_append(scope, method); ++ ++ aml_append(table, scope); ++} ++ ++static Aml *build_ls7a_osc_method(void) ++{ ++ Aml *if_ctx; ++ Aml *if_ctx2; ++ Aml *else_ctx; ++ Aml *method; ++ Aml *a_cwd1 = aml_name("CDW1"); ++ Aml *a_ctrl = aml_local(0); ++ ++ method = aml_method("_OSC", 4, AML_NOTSERIALIZED); ++ aml_append(method, aml_create_dword_field(aml_arg(3), aml_int(0), "CDW1")); ++ ++ if_ctx = aml_if(aml_equal( ++ aml_arg(0), aml_touuid("33DB4D5B-1FF7-401C-9657-7441C03DD766"))); ++ aml_append(if_ctx, aml_create_dword_field(aml_arg(3), aml_int(4), "CDW2")); ++ aml_append(if_ctx, aml_create_dword_field(aml_arg(3), aml_int(8), "CDW3")); ++ ++ aml_append(if_ctx, aml_store(aml_name("CDW3"), a_ctrl)); ++ ++ /* ++ * Always allow native PME, AER (no dependencies) ++ * Allow SHPC (PCI bridges can have SHPC controller) ++ */ ++ aml_append(if_ctx, aml_and(a_ctrl, aml_int(0x1F), a_ctrl)); ++ ++ if_ctx2 = aml_if(aml_lnot(aml_equal(aml_arg(1), aml_int(1)))); ++ /* Unknown revision */ ++ aml_append(if_ctx2, aml_or(a_cwd1, aml_int(0x08), a_cwd1)); ++ aml_append(if_ctx, if_ctx2); ++ ++ if_ctx2 = aml_if(aml_lnot(aml_equal(aml_name("CDW3"), a_ctrl))); ++ /* Capabilities bits were masked */ ++ aml_append(if_ctx2, aml_or(a_cwd1, aml_int(0x10), a_cwd1)); ++ aml_append(if_ctx, if_ctx2); ++ ++ /* Update DWORD3 in the buffer */ ++ aml_append(if_ctx, aml_store(a_ctrl, aml_name("CDW3"))); ++ aml_append(method, if_ctx); ++ ++ else_ctx = aml_else(); ++ /* Unrecognized UUID */ ++ aml_append(else_ctx, aml_or(a_cwd1, aml_int(4), a_cwd1)); ++ aml_append(method, else_ctx); ++ ++ aml_append(method, aml_return(aml_arg(3))); ++ return method; ++} ++ ++static void build_ls7a_rtc_device_aml(Aml *table) ++{ ++ Aml *dev; ++ Aml *crs; ++ uint32_t rtc_irq = LS7A_RTC_IRQ; ++ ++ Aml *scope = aml_scope("_SB"); ++ dev = aml_device("RTC"); ++ aml_append(dev, aml_name_decl("_HID", aml_string("LOON0001"))); ++ crs = aml_resource_template(); ++ aml_append(crs, aml_qword_memory(AML_POS_DECODE, AML_MIN_FIXED, ++ AML_MAX_FIXED, AML_NON_CACHEABLE, ++ AML_READ_WRITE, 0, LS7A_RTC_REG_BASE, ++ LS7A_RTC_REG_BASE + LS7A_RTC_LEN - 1, 0, ++ LS7A_RTC_LEN)); ++ aml_append(crs, aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH, ++ AML_EXCLUSIVE, &rtc_irq, 1)); ++ ++ aml_append(dev, aml_name_decl("_CRS", crs)); ++ aml_append(scope, dev); ++ aml_append(table, scope); ++} ++ ++static void build_ls7a_uart_device_aml(Aml *table) ++{ ++ Aml *dev; ++ Aml *crs; ++ Aml *pkg0, *pkg1, *pkg2; ++ uint32_t uart_irq = LS7A_UART_IRQ; ++ ++ Aml *scope = aml_scope("_SB"); ++ dev = aml_device("COMA"); ++ aml_append(dev, aml_name_decl("_HID", aml_string("PNP0501"))); ++ aml_append(dev, aml_name_decl("_UID", aml_int(0))); ++ aml_append(dev, aml_name_decl("_CCA", aml_int(1))); ++ crs = aml_resource_template(); ++ aml_append(crs, aml_qword_memory( ++ AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, ++ AML_NON_CACHEABLE, AML_READ_WRITE, 0, LS7A_UART_BASE, ++ LS7A_UART_BASE + LS7A_UART_LEN - 1, 0, 0x8)); ++ aml_append(crs, aml_interrupt(AML_CONSUMER, AML_LEVEL, AML_ACTIVE_HIGH, ++ AML_EXCLUSIVE, &uart_irq, 1)); ++ aml_append(dev, aml_name_decl("_CRS", crs)); ++ pkg0 = aml_package(0x2); ++ aml_append(pkg0, aml_int(0x01F78A40)); ++ aml_append(pkg0, aml_string("clock-frenquency")); ++ pkg1 = aml_package(0x1); ++ aml_append(pkg1, pkg0); ++ pkg2 = aml_package(0x2); ++ aml_append(pkg2, aml_touuid("DAFFD814-6EBA-4D8C-8A91-BC9BBF4AA301")); ++ aml_append(pkg2, pkg1); ++ ++ aml_append(dev, aml_name_decl("_DSD", pkg2)); ++ ++ aml_append(scope, dev); ++ aml_append(table, scope); ++} ++ ++#ifdef CONFIG_TPM ++static void acpi_dsdt_add_tpm(Aml *scope, LoongarchMachineState *vms) ++{ ++ PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms->platform_bus_dev); ++ hwaddr pbus_base = VIRT_PLATFORM_BUS_BASEADDRESS; ++ SysBusDevice *sbdev = SYS_BUS_DEVICE(tpm_find()); ++ MemoryRegion *sbdev_mr; ++ hwaddr tpm_base; ++ ++ if (!sbdev) { ++ return; ++ } ++ ++ tpm_base = platform_bus_get_mmio_addr(pbus, sbdev, 0); ++ assert(tpm_base != -1); ++ ++ tpm_base += pbus_base; ++ ++ sbdev_mr = sysbus_mmio_get_region(sbdev, 0); ++ ++ Aml *dev = aml_device("TPM0"); ++ aml_append(dev, aml_name_decl("_HID", aml_string("MSFT0101"))); ++ aml_append(dev, aml_name_decl("_STR", aml_string("TPM 2.0 Device"))); ++ aml_append(dev, aml_name_decl("_UID", aml_int(0))); ++ ++ Aml *crs = aml_resource_template(); ++ aml_append(crs, aml_memory32_fixed(tpm_base, ++ (uint32_t)memory_region_size(sbdev_mr), ++ AML_READ_WRITE)); ++ aml_append(dev, aml_name_decl("_CRS", crs)); ++ aml_append(scope, dev); ++} ++#endif ++ ++static void build_dsdt(GArray *table_data, BIOSLinker *linker, ++ MachineState *machine) ++{ ++ Aml *dsdt, *sb_scope, *scope, *dev, *crs, *pkg; ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ uint32_t nr_mem = machine->ram_slots; ++ uint64_t base = LS7A_ACPI_REG_BASE; ++ int root_bus_limit = PCIE_MMCFG_BUS(LS_PCIECFG_SIZE - 1); ++ AcpiTable table = { .sig = "DSDT", ++ .rev = 1, ++ .oem_id = lsms->oem_id, ++ .oem_table_id = lsms->oem_table_id }; ++ ++ acpi_table_begin(&table, table_data); ++ dsdt = init_aml_allocator(); ++ ++ build_dbg_aml(dsdt); ++ ++ sb_scope = aml_scope("_SB"); ++ dev = aml_device("PCI0"); ++ aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A08"))); ++ aml_append(dev, aml_name_decl("_CID", aml_eisaid("PNP0A03"))); ++ aml_append(dev, aml_name_decl("_ADR", aml_int(0))); ++ aml_append(dev, aml_name_decl("_BBN", aml_int(0))); ++ aml_append(dev, aml_name_decl("_UID", aml_int(1))); ++ aml_append(dev, build_ls7a_osc_method()); ++ aml_append(sb_scope, dev); ++ ++#ifdef CONFIG_TPM ++ acpi_dsdt_add_tpm(sb_scope, lsms); ++#endif ++ aml_append(dsdt, sb_scope); ++ ++ build_ls7a_pci0_int(dsdt); ++ build_ls7a_rtc_device_aml(dsdt); ++ build_ls7a_uart_device_aml(dsdt); ++ ++ if (lsms->acpi_dev) { ++ CPUHotplugFeatures opts = { .acpi_1_compatible = true, ++ .has_legacy_cphp = false }; ++ build_cpus_aml(dsdt, machine, opts, CPU_HOTPLUG_BASE, "\\_SB.PCI0", ++ "\\_GPE._E02", AML_SYSTEM_MEMORY); ++ ++ build_memory_hotplug_aml(dsdt, nr_mem, "\\_SB.PCI0", "\\_GPE._E03", ++ AML_SYSTEM_MEMORY, MEMORY_HOTPLUG_BASE); ++ } ++ ++ scope = aml_scope("_GPE"); ++ { ++ aml_append(scope, aml_name_decl("_HID", aml_string("ACPI0006"))); ++ } ++ aml_append(dsdt, scope); ++ ++ scope = aml_scope("\\_SB.PCI0"); ++ /* build PCI0._CRS */ ++ crs = aml_resource_template(); ++ aml_append(crs, aml_word_bus_number( ++ AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE, 0x0000, ++ 0x0, root_bus_limit, 0x0000, root_bus_limit + 1)); ++ aml_append(crs, aml_word_io(AML_MIN_FIXED, AML_MAX_FIXED, AML_POS_DECODE, ++ AML_ENTIRE_RANGE, 0x0000, 0x4000, 0xFFFF, ++ 0x0000, 0xC000)); ++ aml_append(crs, ++ aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, ++ AML_CACHEABLE, AML_READ_WRITE, 0, 0x40000000, ++ 0x7FFFFFFF, 0, 0x40000000)); ++ aml_append(scope, aml_name_decl("_CRS", crs)); ++ ++ /* reserve GPE0 block resources */ ++ dev = aml_device("GPE0"); ++ aml_append(dev, aml_name_decl("_HID", aml_string("PNP0A06"))); ++ aml_append(dev, aml_name_decl("_UID", aml_string("GPE0 resources"))); ++ /* device present, functioning, decoding, not shown in UI */ ++ aml_append(dev, aml_name_decl("_STA", aml_int(0xB))); ++ crs = aml_resource_template(); ++ aml_append(crs, ++ aml_dword_memory(AML_POS_DECODE, AML_MIN_FIXED, AML_MAX_FIXED, ++ AML_CACHEABLE, AML_READ_WRITE, 0, ++ base + LS7A_GPE0_STS_REG, ++ base + LS7A_GPE0_STS_REG + 0x3, 0, 0x4)); ++ aml_append(dev, aml_name_decl("_CRS", crs)); ++ aml_append(scope, dev); ++ aml_append(dsdt, scope); ++ ++ scope = aml_scope("\\"); ++ pkg = aml_package(4); ++ aml_append(pkg, aml_int(7)); /* PM1a_CNT.SLP_TYP */ ++ aml_append(pkg, aml_int(7)); /* PM1b_CNT.SLP_TYP not impl. */ ++ aml_append(pkg, aml_int(0)); /* reserved */ ++ aml_append(pkg, aml_int(0)); /* reserved */ ++ aml_append(scope, aml_name_decl("_S5", pkg)); ++ aml_append(dsdt, scope); ++ ++ /* copy AML table into ACPI tables blob and patch header there */ ++ g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len); ++ acpi_table_end(linker, &table); ++ free_aml_allocator(); ++} ++ ++static void acpi_build(AcpiBuildTables *tables, MachineState *machine) ++{ ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ GArray *table_offsets; ++ AcpiFadtData fadt_data; ++ unsigned facs, rsdt, fadt, dsdt; ++ uint8_t *u; ++ size_t aml_len = 0; ++ GArray *tables_blob = tables->table_data; ++ ++ init_common_fadt_data(&fadt_data); ++ ++ table_offsets = g_array_new(false, true, sizeof(uint32_t)); /* clear */ ++ ACPI_BUILD_DPRINTF("init ACPI tables\n"); ++ ++ bios_linker_loader_alloc(tables->linker, ACPI_BUILD_TABLE_FILE, ++ tables_blob, 64, false /* high memory */); ++ ++ /* ++ * FACS is pointed to by FADT. ++ * We place it first since it's the only table that has alignment ++ * requirements. ++ */ ++ facs = tables_blob->len; ++ build_facs(tables_blob); ++ ++ /* DSDT is pointed to by FADT */ ++ dsdt = tables_blob->len; ++ build_dsdt(tables_blob, tables->linker, MACHINE(qdev_get_machine())); ++ ++ /* ++ * Count the size of the DSDT and SSDT, we will need it for legacy ++ * sizing of ACPI tables. ++ */ ++ aml_len += tables_blob->len - dsdt; ++ ++ /* ACPI tables pointed to by RSDT */ ++ fadt = tables_blob->len; ++ acpi_add_table(table_offsets, tables_blob); ++ fadt_data.facs_tbl_offset = &facs; ++ fadt_data.dsdt_tbl_offset = &dsdt; ++ fadt_data.xdsdt_tbl_offset = &dsdt; ++ build_fadt(tables_blob, tables->linker, &fadt_data, "LOONGS", "TP-R00"); ++ aml_len += tables_blob->len - fadt; ++ ++ acpi_add_table(table_offsets, tables_blob); ++ build_madt(tables_blob, tables->linker, lsms); ++ ++ acpi_add_table(table_offsets, tables_blob); ++ build_srat(tables_blob, tables->linker, machine); ++ if (machine->numa_state->have_numa_distance) { ++ acpi_add_table(table_offsets, tables_blob); ++ build_slit(tables_blob, tables->linker, machine, lsms->oem_id, ++ lsms->oem_table_id); ++ } ++ ++ if (tpm_get_version(tpm_find()) == TPM_VERSION_2_0) { ++ acpi_add_table(table_offsets, tables_blob); ++ build_tpm2(tables_blob, tables->linker, tables->tcpalog, lsms->oem_id, ++ lsms->oem_table_id); ++ } ++ ++ /* Build mcfg */ ++ acpi_add_table(table_offsets, tables_blob); ++ { ++ AcpiMcfgInfo mcfg = { ++ .base = LS_PCIECFG_BASE, ++ .size = LS_PCIECFG_SIZE, ++ }; ++ build_mcfg(tables_blob, tables->linker, &mcfg, lsms->oem_id, ++ lsms->oem_table_id); ++ } ++ ++ /* Add tables supplied by user (if any) */ ++ for (u = acpi_table_first(); u; u = acpi_table_next(u)) { ++ unsigned len = acpi_table_len(u); ++ ++ acpi_add_table(table_offsets, tables_blob); ++ g_array_append_vals(tables_blob, u, len); ++ } ++ ++ /* RSDT is pointed to by RSDP */ ++ rsdt = tables_blob->len; ++ build_rsdt(tables_blob, tables->linker, table_offsets, "LOONGS", "TP-R00"); ++ ++ /* RSDP is in FSEG memory, so allocate it separately */ ++ { ++ AcpiRsdpData rsdp_data = { ++ .revision = 0, ++ .oem_id = lsms->oem_id, ++ .xsdt_tbl_offset = NULL, ++ .rsdt_tbl_offset = &rsdt, ++ }; ++ build_rsdp(tables->rsdp, tables->linker, &rsdp_data); ++ } ++ acpi_align_size(tables->linker->cmd_blob, ACPI_BUILD_ALIGN_SIZE); ++ ++ /* Cleanup memory that's no longer used. */ ++ g_array_free(table_offsets, true); ++} ++ ++static void acpi_ram_update(MemoryRegion *mr, GArray *data) ++{ ++ uint32_t size = acpi_data_len(data); ++ ++ /* ++ * Make sure RAM size is correct - ++ * in case it got changed e.g. by migration ++ */ ++ memory_region_ram_resize(mr, size, &error_abort); ++ ++ memcpy(memory_region_get_ram_ptr(mr), data->data, size); ++ memory_region_set_dirty(mr, 0, size); ++} ++ ++static void acpi_build_update(void *build_opaque) ++{ ++ AcpiBuildState *build_state = build_opaque; ++ AcpiBuildTables tables; ++ ++ /* No state to update or already patched? Nothing to do. */ ++ if (!build_state || build_state->patched) { ++ return; ++ } ++ build_state->patched = 1; ++ ++ acpi_build_tables_init(&tables); ++ ++ acpi_build(&tables, MACHINE(qdev_get_machine())); ++ ++ acpi_ram_update(build_state->table_mr, tables.table_data); ++ ++ if (build_state->rsdp) { ++ memcpy(build_state->rsdp, tables.rsdp->data, ++ acpi_data_len(tables.rsdp)); ++ } else { ++ acpi_ram_update(build_state->rsdp_mr, tables.rsdp); ++ } ++ ++ acpi_ram_update(build_state->linker_mr, tables.linker->cmd_blob); ++ acpi_build_tables_cleanup(&tables, true); ++} ++ ++static void acpi_build_reset(void *build_opaque) ++{ ++ AcpiBuildState *build_state = build_opaque; ++ build_state->patched = 0; ++} ++ ++static const VMStateDescription vmstate_acpi_build = { ++ .name = "acpi_build", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = (VMStateField[]){ VMSTATE_UINT8(patched, AcpiBuildState), ++ VMSTATE_END_OF_LIST() }, ++}; ++ ++void loongarch_acpi_setup(void) ++{ ++ LoongarchMachineState *lsms = LoongarchMACHINE(qdev_get_machine()); ++ AcpiBuildTables tables; ++ AcpiBuildState *build_state; ++ ++ if (!lsms->fw_cfg) { ++ ACPI_BUILD_DPRINTF("No fw cfg. Bailing out.\n"); ++ return; ++ } ++ ++ if (!lsms->acpi_build_enabled) { ++ ACPI_BUILD_DPRINTF("ACPI build disabled. Bailing out.\n"); ++ return; ++ } ++ ++ if (!loongarch_is_acpi_enabled(lsms)) { ++ ACPI_BUILD_DPRINTF("ACPI disabled. Bailing out.\n"); ++ return; ++ } ++ ++ build_state = g_malloc0(sizeof *build_state); ++ ++ acpi_build_tables_init(&tables); ++ acpi_build(&tables, MACHINE(lsms)); ++ ++ /* Now expose it all to Guest */ ++ build_state->table_mr = ++ acpi_add_rom_blob(acpi_build_update, build_state, tables.table_data, ++ ACPI_BUILD_TABLE_FILE); ++ assert(build_state->table_mr != NULL); ++ ++ build_state->linker_mr = ++ acpi_add_rom_blob(acpi_build_update, build_state, ++ tables.linker->cmd_blob, "etc/table-loader"); ++ ++ fw_cfg_add_file(lsms->fw_cfg, ACPI_BUILD_TPMLOG_FILE, tables.tcpalog->data, ++ acpi_data_len(tables.tcpalog)); ++ ++ build_state->rsdp = NULL; ++ build_state->rsdp_mr = acpi_add_rom_blob( ++ acpi_build_update, build_state, tables.rsdp, ACPI_BUILD_RSDP_FILE); ++ ++ qemu_register_reset(acpi_build_reset, build_state); ++ acpi_build_reset(build_state); ++ vmstate_register(NULL, 0, &vmstate_acpi_build, build_state); ++ ++ /* ++ * Cleanup tables but don't free the memory: we track it ++ * in build_state. ++ */ ++ acpi_build_tables_cleanup(&tables, false); ++} +diff --git a/hw/loongarch/acpi-build.h b/hw/loongarch/acpi-build.h +new file mode 100644 +index 0000000000..97d53a9258 +--- /dev/null ++++ b/hw/loongarch/acpi-build.h +@@ -0,0 +1,32 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef HW_LARCH_ACPI_BUILD_H ++#define HW_LARCH_ACPI_BUILD_H ++ ++#define EFI_ACPI_OEM_ID "LARCH" ++#define EFI_ACPI_OEM_TABLE_ID "LARCH" /* OEM table id 8 bytes long */ ++#define EFI_ACPI_OEM_REVISION 0x00000002 ++#define EFI_ACPI_CREATOR_ID "LINUX" ++#define EFI_ACPI_CREATOR_REVISION 0x01000013 ++ ++#define ACPI_COMPATIBLE_1_0 0 ++#define ACPI_COMPATIBLE_2_0 1 ++ ++void loongarch_acpi_setup(void); ++ ++#endif +diff --git a/hw/loongarch/apic.c b/hw/loongarch/apic.c +new file mode 100644 +index 0000000000..9e762cf0fe +--- /dev/null ++++ b/hw/loongarch/apic.c +@@ -0,0 +1,689 @@ ++/* ++ * Loongarch 3A5000 interrupt controller emulation ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qapi/error.h" ++#include "hw/boards.h" ++#include "hw/irq.h" ++#include "hw/loongarch/cpudevs.h" ++#include "hw/sysbus.h" ++#include "qemu/host-utils.h" ++#include "qemu/error-report.h" ++#include "sysemu/kvm.h" ++#include "hw/hw.h" ++#include "hw/irq.h" ++#include "target/loongarch64/cpu.h" ++#include "exec/address-spaces.h" ++#include "hw/loongarch/larch.h" ++#include "migration/vmstate.h" ++ ++#define DEBUG_APIC 0 ++ ++#define DPRINTF(fmt, ...) \ ++ do { \ ++ if (DEBUG_APIC) { \ ++ fprintf(stderr, "APIC: " fmt, ##__VA_ARGS__); \ ++ } \ ++ } while (0) ++ ++#define APIC_OFFSET 0x400 ++#define APIC_BASE (0x1f010000ULL) ++#define EXTIOI_NODETYPE_START (0x4a0 - APIC_OFFSET) ++#define EXTIOI_NODETYPE_END (0x4c0 - APIC_OFFSET) ++#define EXTIOI_IPMAP_START (0x4c0 - APIC_OFFSET) ++#define EXTIOI_IPMAP_END (0x4c8 - APIC_OFFSET) ++#define EXTIOI_ENABLE_START (0x600 - APIC_OFFSET) ++#define EXTIOI_ENABLE_END (0x620 - APIC_OFFSET) ++#define EXTIOI_BOUNCE_START (0x680 - APIC_OFFSET) ++#define EXTIOI_BOUNCE_END (0x6a0 - APIC_OFFSET) ++#define EXTIOI_ISR_START (0x700 - APIC_OFFSET) ++#define EXTIOI_ISR_END (0x720 - APIC_OFFSET) ++#define EXTIOI_COREMAP_START (0xC00 - APIC_OFFSET) ++#define EXTIOI_COREMAP_END (0xD00 - APIC_OFFSET) ++#define EXTIOI_COREISR_START (0x10000) ++#define EXTIOI_COREISR_END (EXTIOI_COREISR_START + 0x10000) ++ ++static int ext_irq_pre_save(void *opaque) ++{ ++#ifdef CONFIG_KVM ++ apicState *apic = opaque; ++ struct loongarch_kvm_irqchip *chip; ++ struct kvm_loongarch_ls3a_extirq_state *kstate; ++ int ret, length, i, vcpuid; ++#endif ++ if ((!kvm_enabled()) || (!kvm_irqchip_in_kernel())) { ++ return 0; ++ } ++#ifdef CONFIG_KVM ++ length = sizeof(struct loongarch_kvm_irqchip) + ++ sizeof(struct kvm_loongarch_ls3a_extirq_state); ++ chip = g_malloc0(length); ++ memset(chip, 0, length); ++ chip->chip_id = KVM_IRQCHIP_LS3A_EXTIRQ; ++ chip->len = length; ++ ++ ret = kvm_vm_ioctl(kvm_state, KVM_GET_IRQCHIP, chip); ++ if (ret < 0) { ++ fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret)); ++ abort(); ++ } ++ ++ kstate = (struct kvm_loongarch_ls3a_extirq_state *)chip->data; ++ for (i = 0; i < EXTIOI_IRQS_BITMAP_SIZE; i++) { ++ apic->ext_en[i] = kstate->ext_en_r.reg_u8[i]; ++ apic->ext_bounce[i] = kstate->bounce_r.reg_u8[i]; ++ apic->ext_isr[i] = kstate->ext_isr_r.reg_u8[i]; ++ for (vcpuid = 0; vcpuid < MAX_CORES; vcpuid++) { ++ apic->ext_coreisr[vcpuid][i] = ++ kstate->ext_core_isr_r.reg_u8[vcpuid][i]; ++ } ++ } ++ for (i = 0; i < EXTIOI_IRQS_IPMAP_SIZE; i++) { ++ apic->ext_ipmap[i] = kstate->ip_map_r.reg_u8[i]; ++ } ++ for (i = 0; i < EXTIOI_IRQS; i++) { ++ apic->ext_coremap[i] = kstate->core_map_r.reg_u8[i]; ++ } ++ for (i = 0; i < 16; i++) { ++ apic->ext_nodetype[i] = kstate->node_type_r.reg_u16[i]; ++ } ++ g_free(chip); ++#endif ++ return 0; ++} ++ ++static int ext_irq_post_load(void *opaque, int version) ++{ ++#ifdef CONFIG_KVM ++ apicState *apic = opaque; ++ struct loongarch_kvm_irqchip *chip; ++ struct kvm_loongarch_ls3a_extirq_state *kstate; ++ int ret, length, i, vcpuid; ++#endif ++ if ((!kvm_enabled()) || (!kvm_irqchip_in_kernel())) { ++ return 0; ++ } ++#ifdef CONFIG_KVM ++ length = sizeof(struct loongarch_kvm_irqchip) + ++ sizeof(struct kvm_loongarch_ls3a_extirq_state); ++ chip = g_malloc0(length); ++ ++ chip->chip_id = KVM_IRQCHIP_LS3A_EXTIRQ; ++ chip->len = length; ++ ++ kstate = (struct kvm_loongarch_ls3a_extirq_state *)chip->data; ++ for (i = 0; i < EXTIOI_IRQS_BITMAP_SIZE; i++) { ++ kstate->ext_en_r.reg_u8[i] = apic->ext_en[i]; ++ kstate->bounce_r.reg_u8[i] = apic->ext_bounce[i]; ++ kstate->ext_isr_r.reg_u8[i] = apic->ext_isr[i]; ++ for (vcpuid = 0; vcpuid < MAX_CORES; vcpuid++) { ++ kstate->ext_core_isr_r.reg_u8[vcpuid][i] = ++ apic->ext_coreisr[vcpuid][i]; ++ } ++ } ++ for (i = 0; i < EXTIOI_IRQS_IPMAP_SIZE; i++) { ++ kstate->ip_map_r.reg_u8[i] = apic->ext_ipmap[i]; ++ } ++ for (i = 0; i < EXTIOI_IRQS; i++) { ++ kstate->core_map_r.reg_u8[i] = apic->ext_coremap[i]; ++ } ++ for (i = 0; i < 16; i++) { ++ kstate->node_type_r.reg_u16[i] = apic->ext_nodetype[i]; ++ } ++ ++ ret = kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, chip); ++ if (ret < 0) { ++ fprintf(stderr, "KVM_SET_IRQCHIP failed: %s\n", strerror(ret)); ++ abort(); ++ } ++ g_free(chip); ++#endif ++ return 0; ++} ++ ++typedef struct nodeApicState { ++ unsigned long addr; ++ int nodeid; ++ apicState *apic; ++} nodeApicState; ++ ++static void ioapic_update_irq(void *opaque, int irq, int level) ++{ ++ apicState *s = opaque; ++ uint8_t ipnum, cpu, cpu_ipnum; ++ unsigned long found1, found2; ++ uint8_t reg_count, reg_bit; ++ ++ reg_count = irq / 32; ++ reg_bit = irq % 32; ++ ++ ipnum = s->ext_sw_ipmap[irq]; ++ cpu = s->ext_sw_coremap[irq]; ++ cpu_ipnum = cpu * LS3A_INTC_IP + ipnum; ++ if (level == 1) { ++ if (test_bit(reg_bit, ((void *)s->ext_en + 0x4 * reg_count)) == ++ false) { ++ return; ++ } ++ ++ if (test_bit(reg_bit, ((void *)s->ext_isr + 0x4 * reg_count)) == ++ false) { ++ return; ++ } ++ bitmap_set(((void *)s->ext_coreisr[cpu] + 0x4 * reg_count), reg_bit, ++ 1); ++ found1 = ++ find_next_bit(((void *)s->ext_ipisr[cpu_ipnum] + 0x4 * reg_count), ++ EXTIOI_IRQS, 0); ++ bitmap_set(((void *)s->ext_ipisr[cpu_ipnum] + 0x4 * reg_count), ++ reg_bit, 1); ++ if (found1 >= EXTIOI_IRQS) { ++ qemu_set_irq(s->parent_irq[cpu][ipnum], level); ++ } ++ } else { ++ bitmap_clear(((void *)s->ext_isr + 0x4 * reg_count), reg_bit, 1); ++ bitmap_clear(((void *)s->ext_coreisr[cpu] + 0x4 * reg_count), reg_bit, ++ 1); ++ found1 = ++ find_next_bit(((void *)s->ext_ipisr[cpu_ipnum] + 0x4 * reg_count), ++ EXTIOI_IRQS, 0); ++ found1 += reg_count * 32; ++ bitmap_clear(((void *)s->ext_ipisr[cpu_ipnum] + 0x4 * reg_count), ++ reg_bit, 1); ++ found2 = ++ find_next_bit(((void *)s->ext_ipisr[cpu_ipnum] + 0x4 * reg_count), ++ EXTIOI_IRQS, 0); ++ if ((found1 < EXTIOI_IRQS) && (found2 >= EXTIOI_IRQS)) { ++ qemu_set_irq(s->parent_irq[cpu][ipnum], level); ++ } ++ } ++} ++ ++static void ioapic_setirq(void *opaque, int irq, int level) ++{ ++ apicState *s = opaque; ++ uint8_t reg_count, reg_bit; ++ ++ reg_count = irq / 32; ++ reg_bit = irq % 32; ++ ++ if (level) { ++ bitmap_set(((void *)s->ext_isr + 0x4 * reg_count), reg_bit, 1); ++ } else { ++ bitmap_clear(((void *)s->ext_isr + 0x4 * reg_count), reg_bit, 1); ++ } ++ ++ ioapic_update_irq(s, irq, level); ++} ++ ++static uint32_t apic_readb(void *opaque, hwaddr addr) ++{ ++ nodeApicState *node; ++ apicState *state; ++ unsigned long off; ++ uint8_t ret; ++ int cpu; ++ ++ node = (nodeApicState *)opaque; ++ state = node->apic; ++ off = addr & 0xfffff; ++ ret = 0; ++ if ((off >= EXTIOI_ENABLE_START) && (off < EXTIOI_ENABLE_END)) { ++ off -= EXTIOI_ENABLE_START; ++ ret = *(uint8_t *)((void *)state->ext_en + off); ++ } else if ((off >= EXTIOI_BOUNCE_START) && (off < EXTIOI_BOUNCE_END)) { ++ off -= EXTIOI_BOUNCE_START; ++ ret = *(uint8_t *)((void *)state->ext_bounce + off); ++ } else if ((off >= EXTIOI_ISR_START) && (off < EXTIOI_ISR_END)) { ++ off -= EXTIOI_ISR_START; ++ ret = *(uint8_t *)((void *)state->ext_isr + off); ++ } else if ((off >= EXTIOI_COREISR_START) && (off < EXTIOI_COREISR_END)) { ++ off -= EXTIOI_COREISR_START; ++ cpu = (off >> 8) & 0xff; ++ ret = *(uint8_t *)((void *)state->ext_coreisr[cpu] + (off & 0x1f)); ++ } else if ((off >= EXTIOI_IPMAP_START) && (off < EXTIOI_IPMAP_END)) { ++ off -= EXTIOI_IPMAP_START; ++ ret = *(uint8_t *)((void *)state->ext_ipmap + off); ++ } else if ((off >= EXTIOI_COREMAP_START) && (off < EXTIOI_COREMAP_END)) { ++ off -= EXTIOI_COREMAP_START; ++ ret = *(uint8_t *)((void *)state->ext_coremap + off); ++ } else if ((off >= EXTIOI_NODETYPE_START) && (off < EXTIOI_NODETYPE_END)) { ++ off -= EXTIOI_NODETYPE_START; ++ ret = *(uint8_t *)((void *)state->ext_nodetype + off); ++ } ++ ++ DPRINTF("readb reg 0x" TARGET_FMT_plx " = %x\n", node->addr + addr, ret); ++ return ret; ++} ++ ++static uint32_t apic_readw(void *opaque, hwaddr addr) ++{ ++ nodeApicState *node; ++ apicState *state; ++ unsigned long off; ++ uint16_t ret; ++ int cpu; ++ ++ node = (nodeApicState *)opaque; ++ state = node->apic; ++ off = addr & 0xfffff; ++ ret = 0; ++ if ((off >= EXTIOI_ENABLE_START) && (off < EXTIOI_ENABLE_END)) { ++ off -= EXTIOI_ENABLE_START; ++ ret = *(uint16_t *)((void *)state->ext_en + off); ++ } else if ((off >= EXTIOI_BOUNCE_START) && (off < EXTIOI_BOUNCE_END)) { ++ off -= EXTIOI_BOUNCE_START; ++ ret = *(uint16_t *)((void *)state->ext_bounce + off); ++ } else if ((off >= EXTIOI_ISR_START) && (off < EXTIOI_ISR_END)) { ++ off -= EXTIOI_ISR_START; ++ ret = *(uint16_t *)((void *)state->ext_isr + off); ++ } else if ((off >= EXTIOI_COREISR_START) && (off < EXTIOI_COREISR_END)) { ++ off -= EXTIOI_COREISR_START; ++ cpu = (off >> 8) & 0xff; ++ ret = *(uint16_t *)((void *)state->ext_coreisr[cpu] + (off & 0x1f)); ++ } else if ((off >= EXTIOI_IPMAP_START) && (off < EXTIOI_IPMAP_END)) { ++ off -= EXTIOI_IPMAP_START; ++ ret = *(uint16_t *)((void *)state->ext_ipmap + off); ++ } else if ((off >= EXTIOI_COREMAP_START) && (off < EXTIOI_COREMAP_END)) { ++ off -= EXTIOI_COREMAP_START; ++ ret = *(uint16_t *)((void *)state->ext_coremap + off); ++ } else if ((off >= EXTIOI_NODETYPE_START) && (off < EXTIOI_NODETYPE_END)) { ++ off -= EXTIOI_NODETYPE_START; ++ ret = *(uint16_t *)((void *)state->ext_nodetype + off); ++ } ++ ++ DPRINTF("readw reg 0x" TARGET_FMT_plx " = %x\n", node->addr + addr, ret); ++ return ret; ++} ++ ++static uint32_t apic_readl(void *opaque, hwaddr addr) ++{ ++ nodeApicState *node; ++ apicState *state; ++ unsigned long off; ++ uint32_t ret; ++ int cpu; ++ ++ node = (nodeApicState *)opaque; ++ state = node->apic; ++ off = addr & 0xfffff; ++ ret = 0; ++ if ((off >= EXTIOI_ENABLE_START) && (off < EXTIOI_ENABLE_END)) { ++ off -= EXTIOI_ENABLE_START; ++ ret = *(uint32_t *)((void *)state->ext_en + off); ++ } else if ((off >= EXTIOI_BOUNCE_START) && (off < EXTIOI_BOUNCE_END)) { ++ off -= EXTIOI_BOUNCE_START; ++ ret = *(uint32_t *)((void *)state->ext_bounce + off); ++ } else if ((off >= EXTIOI_ISR_START) && (off < EXTIOI_ISR_END)) { ++ off -= EXTIOI_ISR_START; ++ ret = *(uint32_t *)((void *)state->ext_isr + off); ++ } else if ((off >= EXTIOI_COREISR_START) && (off < EXTIOI_COREISR_END)) { ++ off -= EXTIOI_COREISR_START; ++ cpu = (off >> 8) & 0xff; ++ ret = *(uint32_t *)((void *)state->ext_coreisr[cpu] + (off & 0x1f)); ++ } else if ((off >= EXTIOI_IPMAP_START) && (off < EXTIOI_IPMAP_END)) { ++ off -= EXTIOI_IPMAP_START; ++ ret = *(uint32_t *)((void *)state->ext_ipmap + off); ++ } else if ((off >= EXTIOI_COREMAP_START) && (off < EXTIOI_COREMAP_END)) { ++ off -= EXTIOI_COREMAP_START; ++ ret = *(uint32_t *)((void *)state->ext_coremap + off); ++ } else if ((off >= EXTIOI_NODETYPE_START) && (off < EXTIOI_NODETYPE_END)) { ++ off -= EXTIOI_NODETYPE_START; ++ ret = *(uint32_t *)((void *)state->ext_nodetype + off); ++ } ++ ++ DPRINTF("readl reg 0x" TARGET_FMT_plx " = %x\n", node->addr + addr, ret); ++ return ret; ++} ++ ++static void apic_writeb(void *opaque, hwaddr addr, uint32_t val) ++{ ++ nodeApicState *node; ++ apicState *state; ++ unsigned long off; ++ uint8_t old; ++ int cpu, i, ipnum, level, mask; ++ ++ node = (nodeApicState *)opaque; ++ state = node->apic; ++ off = addr & 0xfffff; ++ if ((off >= EXTIOI_ENABLE_START) && (off < EXTIOI_ENABLE_END)) { ++ off -= EXTIOI_ENABLE_START; ++ old = *(uint8_t *)((void *)state->ext_en + off); ++ if (old != val) { ++ *(uint8_t *)((void *)state->ext_en + off) = val; ++ old = old ^ val; ++ mask = 0x1; ++ for (i = 0; i < 8; i++) { ++ if (old & mask) { ++ level = !!(val & (0x1 << i)); ++ ioapic_update_irq(state, i + off * 8, level); ++ } ++ mask = mask << 1; ++ } ++ } ++ } else if ((off >= EXTIOI_BOUNCE_START) && (off < EXTIOI_BOUNCE_END)) { ++ off -= EXTIOI_BOUNCE_START; ++ *(uint8_t *)((void *)state->ext_bounce + off) = val; ++ } else if ((off >= EXTIOI_ISR_START) && (off < EXTIOI_ISR_END)) { ++ off -= EXTIOI_ISR_START; ++ old = *(uint8_t *)((void *)state->ext_isr + off); ++ *(uint8_t *)((void *)state->ext_isr + off) = old & ~val; ++ mask = 0x1; ++ for (i = 0; i < 8; i++) { ++ if ((old & mask) && (val & mask)) { ++ ioapic_update_irq(state, i + off * 8, 0); ++ } ++ mask = mask << 1; ++ } ++ } else if ((off >= EXTIOI_COREISR_START) && (off < EXTIOI_COREISR_END)) { ++ off -= EXTIOI_COREISR_START; ++ cpu = (off >> 8) & 0xff; ++ off = off & 0x1f; ++ old = *(uint8_t *)((void *)state->ext_coreisr[cpu] + off); ++ *(uint8_t *)((void *)state->ext_coreisr[cpu] + off) = old & ~val; ++ mask = 0x1; ++ for (i = 0; i < 8; i++) { ++ if ((old & mask) && (val & mask)) { ++ ioapic_update_irq(state, i + off * 8, 0); ++ } ++ mask = mask << 1; ++ } ++ } else if ((off >= EXTIOI_IPMAP_START) && (off < EXTIOI_IPMAP_END)) { ++ off -= EXTIOI_IPMAP_START; ++ val = val & 0xf; ++ *(uint8_t *)((void *)state->ext_ipmap + off) = val; ++ ipnum = 0; ++ for (i = 0; i < 4; i++) { ++ if (val & (0x1 << i)) { ++ ipnum = i; ++ break; ++ } ++ } ++ if (val) { ++ for (i = 0; i < 32; i++) { ++ cpu = off * 32 + i; ++ state->ext_sw_ipmap[cpu] = ipnum; ++ } ++ } ++ } else if ((off >= EXTIOI_COREMAP_START) && (off < EXTIOI_COREMAP_END)) { ++ off -= EXTIOI_COREMAP_START; ++ val = val & 0xff; ++ *(uint8_t *)((void *)state->ext_coremap + off) = val; ++ state->ext_sw_coremap[off] = val; ++ } else if ((off >= EXTIOI_NODETYPE_START) && (off < EXTIOI_NODETYPE_END)) { ++ off -= EXTIOI_NODETYPE_START; ++ *(uint8_t *)((void *)state->ext_nodetype + off) = val; ++ } ++ ++ DPRINTF("writeb reg 0x" TARGET_FMT_plx " = %x\n", node->addr + addr, val); ++} ++ ++static void apic_writew(void *opaque, hwaddr addr, uint32_t val) ++{ ++ nodeApicState *node; ++ apicState *state; ++ unsigned long off; ++ uint16_t old; ++ int cpu, i, level, mask; ++ ++ node = (nodeApicState *)opaque; ++ state = node->apic; ++ off = addr & 0xfffff; ++ if ((off >= EXTIOI_ENABLE_START) && (off < EXTIOI_ENABLE_END)) { ++ off -= EXTIOI_ENABLE_START; ++ old = *(uint16_t *)((void *)state->ext_en + off); ++ if (old != val) { ++ *(uint16_t *)((void *)state->ext_en + off) = val; ++ old = old ^ val; ++ mask = 0x1; ++ for (i = 0; i < 16; i++) { ++ if (old & mask) { ++ level = !!(val & (0x1 << i)); ++ ioapic_update_irq(state, i + off * 8, level); ++ } ++ mask = mask << 1; ++ } ++ } ++ } else if ((off >= EXTIOI_BOUNCE_START) && (off < EXTIOI_BOUNCE_END)) { ++ off -= EXTIOI_BOUNCE_START; ++ *(uint16_t *)((void *)state->ext_bounce + off) = val; ++ } else if ((off >= EXTIOI_ISR_START) && (off < EXTIOI_ISR_END)) { ++ off -= EXTIOI_ISR_START; ++ old = *(uint16_t *)((void *)state->ext_isr + off); ++ *(uint16_t *)((void *)state->ext_isr + off) = old & ~val; ++ mask = 0x1; ++ for (i = 0; i < 16; i++) { ++ if ((old & mask) && (val & mask)) { ++ ioapic_update_irq(state, i + off * 8, 0); ++ } ++ mask = mask << 1; ++ } ++ } else if ((off >= EXTIOI_COREISR_START) && (off < EXTIOI_COREISR_END)) { ++ off -= EXTIOI_COREISR_START; ++ cpu = (off >> 8) & 0xff; ++ off = off & 0x1f; ++ old = *(uint16_t *)((void *)state->ext_coreisr[cpu] + off); ++ *(uint16_t *)((void *)state->ext_coreisr[cpu] + off) = old & ~val; ++ mask = 0x1; ++ for (i = 0; i < 16; i++) { ++ if ((old & mask) && (val & mask)) { ++ ioapic_update_irq(state, i + off * 8, 0); ++ } ++ mask = mask << 1; ++ } ++ } else if ((off >= EXTIOI_IPMAP_START) && (off < EXTIOI_IPMAP_END)) { ++ apic_writeb(opaque, addr, val & 0xff); ++ apic_writeb(opaque, addr + 1, (val >> 8) & 0xff); ++ ++ } else if ((off >= EXTIOI_COREMAP_START) && (off < EXTIOI_COREMAP_END)) { ++ apic_writeb(opaque, addr, val & 0xff); ++ apic_writeb(opaque, addr + 1, (val >> 8) & 0xff); ++ ++ } else if ((off >= EXTIOI_NODETYPE_START) && (off < EXTIOI_NODETYPE_END)) { ++ off -= EXTIOI_NODETYPE_START; ++ *(uint16_t *)((void *)state->ext_nodetype + off) = val; ++ } ++ ++ DPRINTF("writew reg 0x" TARGET_FMT_plx " = %x\n", node->addr + addr, val); ++} ++ ++static void apic_writel(void *opaque, hwaddr addr, uint32_t val) ++{ ++ nodeApicState *node; ++ apicState *state; ++ unsigned long off; ++ uint32_t old; ++ int cpu, i, level, mask; ++ ++ node = (nodeApicState *)opaque; ++ state = node->apic; ++ off = addr & 0xfffff; ++ if ((off >= EXTIOI_ENABLE_START) && (off < EXTIOI_ENABLE_END)) { ++ off -= EXTIOI_ENABLE_START; ++ old = *(uint32_t *)((void *)state->ext_en + off); ++ if (old != val) { ++ *(uint32_t *)((void *)state->ext_en + off) = val; ++ old = old ^ val; ++ mask = 0x1; ++ for (i = 0; i < 32; i++) { ++ if (old & mask) { ++ level = !!(val & (0x1 << i)); ++ ioapic_update_irq(state, i + off * 8, level); ++ } ++ mask = mask << 1; ++ } ++ } ++ } else if ((off >= EXTIOI_BOUNCE_START) && (off < EXTIOI_BOUNCE_END)) { ++ off -= EXTIOI_BOUNCE_START; ++ *(uint32_t *)((void *)state->ext_bounce + off) = val; ++ } else if ((off >= EXTIOI_ISR_START) && (off < EXTIOI_ISR_END)) { ++ off -= EXTIOI_ISR_START; ++ old = *(uint32_t *)((void *)state->ext_isr + off); ++ *(uint32_t *)((void *)state->ext_isr + off) = old & ~val; ++ mask = 0x1; ++ for (i = 0; i < 32; i++) { ++ if ((old & mask) && (val & mask)) { ++ ioapic_update_irq(state, i + off * 8, 0); ++ } ++ mask = mask << 1; ++ } ++ } else if ((off >= EXTIOI_COREISR_START) && (off < EXTIOI_COREISR_END)) { ++ off -= EXTIOI_COREISR_START; ++ cpu = (off >> 8) & 0xff; ++ off = off & 0x1f; ++ old = *(uint32_t *)((void *)state->ext_coreisr[cpu] + off); ++ *(uint32_t *)((void *)state->ext_coreisr[cpu] + off) = old & ~val; ++ mask = 0x1; ++ for (i = 0; i < 32; i++) { ++ if ((old & mask) && (val & mask)) { ++ ioapic_update_irq(state, i + off * 8, 0); ++ } ++ mask = mask << 1; ++ } ++ } else if ((off >= EXTIOI_IPMAP_START) && (off < EXTIOI_IPMAP_END)) { ++ apic_writeb(opaque, addr, val & 0xff); ++ apic_writeb(opaque, addr + 1, (val >> 8) & 0xff); ++ apic_writeb(opaque, addr + 2, (val >> 16) & 0xff); ++ apic_writeb(opaque, addr + 3, (val >> 24) & 0xff); ++ ++ } else if ((off >= EXTIOI_COREMAP_START) && (off < EXTIOI_COREMAP_END)) { ++ apic_writeb(opaque, addr, val & 0xff); ++ apic_writeb(opaque, addr + 1, (val >> 8) & 0xff); ++ apic_writeb(opaque, addr + 2, (val >> 16) & 0xff); ++ apic_writeb(opaque, addr + 3, (val >> 24) & 0xff); ++ ++ } else if ((off >= EXTIOI_NODETYPE_START) && (off < EXTIOI_NODETYPE_END)) { ++ off -= EXTIOI_NODETYPE_START; ++ *(uint32_t *)((void *)state->ext_nodetype + off) = val; ++ } ++ ++ DPRINTF("writel reg 0x" TARGET_FMT_plx " = %x\n", node->addr + addr, val); ++} ++ ++static uint64_t apic_readfn(void *opaque, hwaddr addr, unsigned size) ++{ ++ switch (size) { ++ case 1: ++ return apic_readb(opaque, addr); ++ case 2: ++ return apic_readw(opaque, addr); ++ case 4: ++ return apic_readl(opaque, addr); ++ default: ++ g_assert_not_reached(); ++ } ++} ++ ++static void apic_writefn(void *opaque, hwaddr addr, uint64_t value, ++ unsigned size) ++{ ++ switch (size) { ++ case 1: ++ apic_writeb(opaque, addr, value); ++ break; ++ case 2: ++ apic_writew(opaque, addr, value); ++ break; ++ case 4: ++ apic_writel(opaque, addr, value); ++ break; ++ default: ++ g_assert_not_reached(); ++ } ++} ++ ++static const VMStateDescription vmstate_apic = { ++ .name = "apic", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .pre_save = ext_irq_pre_save, ++ .post_load = ext_irq_post_load, ++ .fields = ++ (VMStateField[]){ ++ VMSTATE_UINT8_ARRAY(ext_en, apicState, EXTIOI_IRQS_BITMAP_SIZE), ++ VMSTATE_UINT8_ARRAY(ext_bounce, apicState, ++ EXTIOI_IRQS_BITMAP_SIZE), ++ VMSTATE_UINT8_ARRAY(ext_isr, apicState, EXTIOI_IRQS_BITMAP_SIZE), ++ VMSTATE_UINT8_2DARRAY(ext_coreisr, apicState, MAX_CORES, ++ EXTIOI_IRQS_BITMAP_SIZE), ++ VMSTATE_UINT8_ARRAY(ext_ipmap, apicState, EXTIOI_IRQS_IPMAP_SIZE), ++ VMSTATE_UINT8_ARRAY(ext_coremap, apicState, EXTIOI_IRQS), ++ VMSTATE_UINT16_ARRAY(ext_nodetype, apicState, 16), ++ VMSTATE_UINT64(ext_control, apicState), ++ VMSTATE_UINT8_ARRAY(ext_sw_ipmap, apicState, EXTIOI_IRQS), ++ VMSTATE_UINT8_ARRAY(ext_sw_coremap, apicState, EXTIOI_IRQS), ++ VMSTATE_UINT8_2DARRAY(ext_ipisr, apicState, ++ MAX_CORES *LS3A_INTC_IP, ++ EXTIOI_IRQS_BITMAP_SIZE), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static const MemoryRegionOps apic_ops = { ++ .read = apic_readfn, ++ .write = apic_writefn, ++ .impl.min_access_size = 1, ++ .impl.max_access_size = 4, ++ .valid.min_access_size = 1, ++ .valid.max_access_size = 4, ++ .endianness = DEVICE_NATIVE_ENDIAN, ++}; ++ ++int cpu_init_apic(LoongarchMachineState *ms, CPULOONGARCHState *env, int cpu) ++{ ++ apicState *apic; ++ nodeApicState *node; ++ MemoryRegion *iomem; ++ unsigned long base; ++ int pin; ++ char str[32]; ++ ++ if (ms->apic == NULL) { ++ apic = g_malloc0(sizeof(apicState)); ++ vmstate_register(NULL, 0, &vmstate_apic, apic); ++ apic->irq = qemu_allocate_irqs(ioapic_setirq, apic, EXTIOI_IRQS); ++ ++ for (pin = 0; pin < LS3A_INTC_IP; pin++) { ++ /* cpu_pin[9:2] <= intc_pin[7:0] */ ++ apic->parent_irq[cpu][pin] = env->irq[pin + 2]; ++ } ++ ms->apic = apic; ++ ++ if (cpu == 0) { ++ base = APIC_BASE; ++ node = g_malloc0(sizeof(nodeApicState)); ++ node->apic = ms->apic; ++ node->addr = base; ++ ++ iomem = g_new(MemoryRegion, 1); ++ sprintf(str, "apic%d", cpu); ++ /* extioi addr 0x1f010000~0x1f02ffff */ ++ memory_region_init_io(iomem, NULL, &apic_ops, node, str, 0x20000); ++ memory_region_add_subregion(get_system_memory(), base, iomem); ++ } ++ ++ } else { ++ if (cpu != 0) { ++ for (pin = 0; pin < LS3A_INTC_IP; pin++) { ++ ms->apic->parent_irq[cpu][pin] = env->irq[pin + 2]; ++ } ++ } ++ } ++ return 0; ++} +diff --git a/hw/loongarch/ioapic.c b/hw/loongarch/ioapic.c +new file mode 100644 +index 0000000000..102102781f +--- /dev/null ++++ b/hw/loongarch/ioapic.c +@@ -0,0 +1,419 @@ ++/* ++ * LS7A1000 Northbridge IOAPIC support ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "hw/sysbus.h" ++#include "hw/irq.h" ++#include "qemu/log.h" ++#include "sysemu/kvm.h" ++#include "linux/kvm.h" ++#include "migration/vmstate.h" ++ ++#define DEBUG_LS7A_APIC 0 ++ ++#define DPRINTF(fmt, ...) \ ++ do { \ ++ if (DEBUG_LS7A_APIC) { \ ++ fprintf(stderr, "IOAPIC: " fmt, ##__VA_ARGS__); \ ++ } \ ++ } while (0) ++ ++#define TYPE_LS7A_APIC "ioapic" ++#define LS7A_APIC(obj) OBJECT_CHECK(LS7AApicState, (obj), TYPE_LS7A_APIC) ++ ++#define LS7A_IOAPIC_ROUTE_ENTRY_OFFSET 0x100 ++#define LS7A_IOAPIC_INT_ID_OFFSET 0x00 ++#define LS7A_INT_ID_VAL 0x7000000UL ++#define LS7A_INT_ID_VER 0x1f0001UL ++#define LS7A_IOAPIC_INT_MASK_OFFSET 0x20 ++#define LS7A_IOAPIC_INT_EDGE_OFFSET 0x60 ++#define LS7A_IOAPIC_INT_CLEAR_OFFSET 0x80 ++#define LS7A_IOAPIC_INT_STATUS_OFFSET 0x3a0 ++#define LS7A_IOAPIC_INT_POL_OFFSET 0x3e0 ++#define LS7A_IOAPIC_HTMSI_EN_OFFSET 0x40 ++#define LS7A_IOAPIC_HTMSI_VEC_OFFSET 0x200 ++#define LS7A_AUTO_CTRL0_OFFSET 0xc0 ++#define LS7A_AUTO_CTRL1_OFFSET 0xe0 ++ ++typedef struct LS7AApicState { ++ SysBusDevice parent_obj; ++ qemu_irq parent_irq[257]; ++ uint64_t int_id; ++ uint64_t int_mask; /*0x020 interrupt mask register*/ ++ uint64_t htmsi_en; /*0x040 1=msi*/ ++ uint64_t intedge; /*0x060 edge=1 level =0*/ ++ uint64_t intclr; /*0x080 for clean edge int,set 1 clean,set 0 is noused*/ ++ uint64_t auto_crtl0; /*0x0c0*/ ++ uint64_t auto_crtl1; /*0x0e0*/ ++ uint8_t route_entry[64]; /*0x100 - 0x140*/ ++ uint8_t htmsi_vector[64]; /*0x200 - 0x240*/ ++ uint64_t intisr_chip0; /*0x300*/ ++ uint64_t intisr_chip1; /*0x320*/ ++ uint64_t last_intirr; /* edge detection */ ++ uint64_t intirr; /* 0x380 interrupt request register */ ++ uint64_t intisr; /* 0x3a0 interrupt service register */ ++ /* ++ * 0x3e0 interrupt level polarity ++ * selection register 0 for high level tirgger ++ */ ++ uint64_t int_polarity; ++ MemoryRegion iomem; ++} LS7AApicState; ++ ++static void update_irq(LS7AApicState *s) ++{ ++ int i; ++ if ((s->intirr & (~s->int_mask)) & (~s->htmsi_en)) { ++ DPRINTF("7a update irqline up\n"); ++ s->intisr = (s->intirr & (~s->int_mask) & (~s->htmsi_en)); ++ qemu_set_irq(s->parent_irq[256], 1); ++ } else { ++ DPRINTF("7a update irqline down\n"); ++ s->intisr &= (~s->htmsi_en); ++ qemu_set_irq(s->parent_irq[256], 0); ++ } ++ if (s->htmsi_en) { ++ for (i = 0; i < 64; i++) { ++ if ((((~s->intisr) & s->intirr) & s->htmsi_en) & (1ULL << i)) { ++ s->intisr |= 1ULL << i; ++ qemu_set_irq(s->parent_irq[s->htmsi_vector[i]], 1); ++ } else if (((~(s->intisr | s->intirr)) & s->htmsi_en) & ++ (1ULL << i)) { ++ qemu_set_irq(s->parent_irq[s->htmsi_vector[i]], 0); ++ } ++ } ++ } ++} ++ ++static void irq_handler(void *opaque, int irq, int level) ++{ ++ LS7AApicState *s = opaque; ++ ++ assert(irq < 64); ++ uint64_t mask = 1ULL << irq; ++ DPRINTF("------ %s irq %d %d\n", __func__, irq, level); ++ ++ if (s->intedge & mask) { ++ /* edge triggered */ ++ /*TODO*/ ++ } else { ++ /* level triggered */ ++ if (level) { ++ s->intirr |= mask; ++ } else { ++ s->intirr &= ~mask; ++ } ++ } ++ update_irq(s); ++} ++ ++static uint64_t ls7a_apic_reg_read(void *opaque, hwaddr addr, unsigned size) ++{ ++ LS7AApicState *a = opaque; ++ uint64_t val = 0; ++ uint64_t offset; ++ int64_t offset_tmp; ++ offset = addr & 0xfff; ++ if (8 == size) { ++ switch (offset) { ++ case LS7A_IOAPIC_INT_ID_OFFSET: ++ val = LS7A_INT_ID_VER; ++ val = (val << 32) + LS7A_INT_ID_VAL; ++ break; ++ case LS7A_IOAPIC_INT_MASK_OFFSET: ++ val = a->int_mask; ++ break; ++ case LS7A_IOAPIC_INT_STATUS_OFFSET: ++ val = a->intisr & (~a->int_mask); ++ break; ++ case LS7A_IOAPIC_INT_EDGE_OFFSET: ++ val = a->intedge; ++ break; ++ case LS7A_IOAPIC_INT_POL_OFFSET: ++ val = a->int_polarity; ++ break; ++ case LS7A_IOAPIC_HTMSI_EN_OFFSET: ++ val = a->htmsi_en; ++ break; ++ case LS7A_AUTO_CTRL0_OFFSET: ++ case LS7A_AUTO_CTRL1_OFFSET: ++ break; ++ default: ++ break; ++ } ++ } else if (1 == size) { ++ if (offset >= LS7A_IOAPIC_HTMSI_VEC_OFFSET) { ++ offset_tmp = offset - LS7A_IOAPIC_HTMSI_VEC_OFFSET; ++ if (offset_tmp >= 0 && offset_tmp < 64) { ++ val = a->htmsi_vector[offset_tmp]; ++ } ++ } else if (offset >= LS7A_IOAPIC_ROUTE_ENTRY_OFFSET) { ++ offset_tmp = offset - LS7A_IOAPIC_ROUTE_ENTRY_OFFSET; ++ if (offset_tmp >= 0 && offset_tmp < 64) { ++ val = a->route_entry[offset_tmp]; ++ DPRINTF("addr %lx val %lx\n", addr, val); ++ } ++ } ++ } ++ DPRINTF(TARGET_FMT_plx " val %lx\n", addr, val); ++ return val; ++} ++ ++static void ls7a_apic_reg_write(void *opaque, hwaddr addr, uint64_t data, ++ unsigned size) ++{ ++ LS7AApicState *a = opaque; ++ int64_t offset_tmp; ++ uint64_t offset; ++ offset = addr & 0xfff; ++ DPRINTF(TARGET_FMT_plx " size %d val %lx\n", addr, size, data); ++ if (8 == size) { ++ switch (offset) { ++ case LS7A_IOAPIC_INT_MASK_OFFSET: ++ a->int_mask = data; ++ update_irq(a); ++ break; ++ case LS7A_IOAPIC_INT_STATUS_OFFSET: ++ a->intisr = data; ++ break; ++ case LS7A_IOAPIC_INT_EDGE_OFFSET: ++ a->intedge = data; ++ break; ++ case LS7A_IOAPIC_INT_CLEAR_OFFSET: ++ a->intisr &= (~data); ++ update_irq(a); ++ break; ++ case LS7A_IOAPIC_INT_POL_OFFSET: ++ a->int_polarity = data; ++ break; ++ case LS7A_IOAPIC_HTMSI_EN_OFFSET: ++ a->htmsi_en = data; ++ break; ++ case LS7A_AUTO_CTRL0_OFFSET: ++ case LS7A_AUTO_CTRL1_OFFSET: ++ break; ++ default: ++ break; ++ } ++ } else if (1 == size) { ++ if (offset >= LS7A_IOAPIC_HTMSI_VEC_OFFSET) { ++ offset_tmp = offset - LS7A_IOAPIC_HTMSI_VEC_OFFSET; ++ if (offset_tmp >= 0 && offset_tmp < 64) { ++ a->htmsi_vector[offset_tmp] = (uint8_t)(data & 0xff); ++ } ++ } else if (offset >= LS7A_IOAPIC_ROUTE_ENTRY_OFFSET) { ++ offset_tmp = offset - LS7A_IOAPIC_ROUTE_ENTRY_OFFSET; ++ if (offset_tmp >= 0 && offset_tmp < 64) { ++ a->route_entry[offset_tmp] = (uint8_t)(data & 0xff); ++ } ++ } ++ } ++} ++ ++static const MemoryRegionOps ls7a_apic_ops = { ++ .read = ls7a_apic_reg_read, ++ .write = ls7a_apic_reg_write, ++ .valid = { ++ .min_access_size = 1, ++ .max_access_size = 8, ++ }, ++ .impl = { ++ .min_access_size = 1, ++ .max_access_size = 8, ++ }, ++ .endianness = DEVICE_NATIVE_ENDIAN, ++}; ++ ++static int kvm_ls7a_pre_save(void *opaque) ++{ ++#ifdef CONFIG_KVM ++ LS7AApicState *s = opaque; ++ struct loongarch_kvm_irqchip *chip; ++ struct ls7a_ioapic_state *state; ++ int ret, i, length; ++ ++ if ((!kvm_enabled()) || (!kvm_irqchip_in_kernel())) { ++ return 0; ++ } ++ ++ length = sizeof(struct loongarch_kvm_irqchip) + ++ sizeof(struct ls7a_ioapic_state); ++ chip = g_malloc0(length); ++ memset(chip, 0, length); ++ chip->chip_id = KVM_IRQCHIP_LS7A_IOAPIC; ++ chip->len = length; ++ ret = kvm_vm_ioctl(kvm_state, KVM_GET_IRQCHIP, chip); ++ if (ret < 0) { ++ fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret)); ++ abort(); ++ } ++ state = (struct ls7a_ioapic_state *)chip->data; ++ s->int_id = state->int_id; ++ s->int_mask = state->int_mask; ++ s->htmsi_en = state->htmsi_en; ++ s->intedge = state->intedge; ++ s->intclr = state->intclr; ++ s->auto_crtl0 = state->auto_crtl0; ++ s->auto_crtl1 = state->auto_crtl1; ++ for (i = 0; i < 64; i++) { ++ s->route_entry[i] = state->route_entry[i]; ++ s->htmsi_vector[i] = state->htmsi_vector[i]; ++ } ++ s->intisr_chip0 = state->intisr_chip0; ++ s->intisr_chip1 = state->intisr_chip1; ++ s->intirr = state->intirr; ++ s->intisr = state->intisr; ++ s->int_polarity = state->int_polarity; ++ g_free(chip); ++#endif ++ return 0; ++} ++ ++static int kvm_ls7a_post_load(void *opaque, int version) ++{ ++#ifdef CONFIG_KVM ++ LS7AApicState *s = opaque; ++ struct loongarch_kvm_irqchip *chip; ++ struct ls7a_ioapic_state *state; ++ int ret, i, length; ++ ++ if ((!kvm_enabled()) || (!kvm_irqchip_in_kernel())) { ++ return 0; ++ } ++ length = sizeof(struct loongarch_kvm_irqchip) + ++ sizeof(struct ls7a_ioapic_state); ++ chip = g_malloc0(length); ++ memset(chip, 0, length); ++ chip->chip_id = KVM_IRQCHIP_LS7A_IOAPIC; ++ chip->len = length; ++ ++ state = (struct ls7a_ioapic_state *)chip->data; ++ state->int_id = s->int_id; ++ state->int_mask = s->int_mask; ++ state->htmsi_en = s->htmsi_en; ++ state->intedge = s->intedge; ++ state->intclr = s->intclr; ++ state->auto_crtl0 = s->auto_crtl0; ++ state->auto_crtl1 = s->auto_crtl1; ++ for (i = 0; i < 64; i++) { ++ state->route_entry[i] = s->route_entry[i]; ++ state->htmsi_vector[i] = s->htmsi_vector[i]; ++ } ++ state->intisr_chip0 = s->intisr_chip0; ++ state->intisr_chip1 = s->intisr_chip1; ++ state->last_intirr = 0; ++ state->intirr = s->intirr; ++ state->intisr = s->intisr; ++ state->int_polarity = s->int_polarity; ++ ++ ret = kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, chip); ++ if (ret < 0) { ++ fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret)); ++ abort(); ++ } ++ g_free(chip); ++#endif ++ return 0; ++} ++ ++static void ls7a_apic_reset(DeviceState *d) ++{ ++ LS7AApicState *s = LS7A_APIC(d); ++ int i; ++ ++ s->int_id = 0x001f000107000000; ++ s->int_mask = 0xffffffffffffffff; ++ s->htmsi_en = 0x0; ++ s->intedge = 0x0; ++ s->intclr = 0x0; ++ s->auto_crtl0 = 0x0; ++ s->auto_crtl1 = 0x0; ++ for (i = 0; i < 64; i++) { ++ s->route_entry[i] = 0x1; ++ s->htmsi_vector[i] = 0x0; ++ } ++ s->intisr_chip0 = 0x0; ++ s->intisr_chip1 = 0x0; ++ s->intirr = 0x0; ++ s->intisr = 0x0; ++ s->int_polarity = 0x0; ++ kvm_ls7a_post_load(s, 0); ++} ++ ++static void ls7a_apic_init(Object *obj) ++{ ++ DeviceState *dev = DEVICE(obj); ++ LS7AApicState *s = LS7A_APIC(obj); ++ SysBusDevice *sbd = SYS_BUS_DEVICE(obj); ++ int tmp; ++ memory_region_init_io(&s->iomem, obj, &ls7a_apic_ops, s, TYPE_LS7A_APIC, ++ 0x1000); ++ sysbus_init_mmio(sbd, &s->iomem); ++ for (tmp = 0; tmp < 257; tmp++) { ++ sysbus_init_irq(sbd, &s->parent_irq[tmp]); ++ } ++ qdev_init_gpio_in(dev, irq_handler, 64); ++} ++ ++static const VMStateDescription vmstate_ls7a_apic = { ++ .name = TYPE_LS7A_APIC, ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .pre_save = kvm_ls7a_pre_save, ++ .post_load = kvm_ls7a_post_load, ++ .fields = ++ (VMStateField[]){ VMSTATE_UINT64(int_mask, LS7AApicState), ++ VMSTATE_UINT64(htmsi_en, LS7AApicState), ++ VMSTATE_UINT64(intedge, LS7AApicState), ++ VMSTATE_UINT64(intclr, LS7AApicState), ++ VMSTATE_UINT64(auto_crtl0, LS7AApicState), ++ VMSTATE_UINT64(auto_crtl1, LS7AApicState), ++ VMSTATE_UINT8_ARRAY(route_entry, LS7AApicState, 64), ++ VMSTATE_UINT8_ARRAY(htmsi_vector, LS7AApicState, 64), ++ VMSTATE_UINT64(intisr_chip0, LS7AApicState), ++ VMSTATE_UINT64(intisr_chip1, LS7AApicState), ++ VMSTATE_UINT64(last_intirr, LS7AApicState), ++ VMSTATE_UINT64(intirr, LS7AApicState), ++ VMSTATE_UINT64(intisr, LS7AApicState), ++ VMSTATE_UINT64(int_polarity, LS7AApicState), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static void ls7a_apic_class_init(ObjectClass *klass, void *data) ++{ ++ DeviceClass *dc = DEVICE_CLASS(klass); ++ ++ dc->reset = ls7a_apic_reset; ++ dc->vmsd = &vmstate_ls7a_apic; ++} ++ ++static const TypeInfo ls7a_apic_info = { ++ .name = TYPE_LS7A_APIC, ++ .parent = TYPE_SYS_BUS_DEVICE, ++ .instance_size = sizeof(LS7AApicState), ++ .instance_init = ls7a_apic_init, ++ .class_init = ls7a_apic_class_init, ++}; ++ ++static void ls7a_apic_register_types(void) ++{ ++ type_register_static(&ls7a_apic_info); ++} ++ ++type_init(ls7a_apic_register_types) +diff --git a/hw/loongarch/iocsr.c b/hw/loongarch/iocsr.c +new file mode 100644 +index 0000000000..a1eb54bdd2 +--- /dev/null ++++ b/hw/loongarch/iocsr.c +@@ -0,0 +1,227 @@ ++/* ++ * LOONGARCH IOCSR support ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "hw/sysbus.h" ++#include "qemu/log.h" ++#include "sysemu/kvm.h" ++#include "linux/kvm.h" ++#include "migration/vmstate.h" ++#include "hw/boards.h" ++#include "hw/loongarch/larch.h" ++ ++#define BIT_ULL(nr) (1ULL << (nr)) ++#define LOONGARCH_IOCSR_FEATURES 0x8 ++#define IOCSRF_TEMP BIT_ULL(0) ++#define IOCSRF_NODECNT BIT_ULL(1) ++#define IOCSRF_MSI BIT_ULL(2) ++#define IOCSRF_EXTIOI BIT_ULL(3) ++#define IOCSRF_CSRIPI BIT_ULL(4) ++#define IOCSRF_FREQCSR BIT_ULL(5) ++#define IOCSRF_FREQSCALE BIT_ULL(6) ++#define IOCSRF_DVFSV1 BIT_ULL(7) ++#define IOCSRF_GMOD BIT_ULL(9) ++#define IOCSRF_VM BIT_ULL(11) ++#define LOONGARCH_IOCSR_VENDOR 0x10 ++#define LOONGARCH_IOCSR_CPUNAME 0x20 ++#define LOONGARCH_IOCSR_NODECNT 0x408 ++#define LOONGARCH_IOCSR_MISC_FUNC 0x420 ++#define IOCSR_MISC_FUNC_TIMER_RESET BIT_ULL(21) ++#define IOCSR_MISC_FUNC_EXT_IOI_EN BIT_ULL(48) ++ ++enum { ++ IOCSR_FEATURES, ++ IOCSR_VENDOR, ++ IOCSR_CPUNAME, ++ IOCSR_NODECNT, ++ IOCSR_MISC_FUNC, ++ IOCSR_MAX ++}; ++ ++#ifdef CONFIG_KVM ++static uint32_t iocsr_array[IOCSR_MAX] = { ++ [IOCSR_FEATURES] = LOONGARCH_IOCSR_FEATURES, ++ [IOCSR_VENDOR] = LOONGARCH_IOCSR_VENDOR, ++ [IOCSR_CPUNAME] = LOONGARCH_IOCSR_CPUNAME, ++ [IOCSR_NODECNT] = LOONGARCH_IOCSR_NODECNT, ++ [IOCSR_MISC_FUNC] = LOONGARCH_IOCSR_MISC_FUNC, ++}; ++#endif ++ ++#define TYPE_IOCSR "iocsr" ++#define IOCSR(obj) OBJECT_CHECK(IOCSRState, (obj), TYPE_IOCSR) ++ ++typedef struct IOCSRState { ++ SysBusDevice parent_obj; ++ uint64_t iocsr_val[IOCSR_MAX]; ++} IOCSRState; ++ ++IOCSRState iocsr_init = { .iocsr_val = { ++ IOCSRF_NODECNT | IOCSRF_MSI | IOCSRF_EXTIOI | ++ IOCSRF_CSRIPI | IOCSRF_GMOD | IOCSRF_VM, ++ 0x6e6f73676e6f6f4c, /* Loongson */ ++ 0x303030354133, /*3A5000*/ ++ 0x4, ++ 0x0, ++ } }; ++ ++static int kvm_iocsr_pre_save(void *opaque) ++{ ++#ifdef CONFIG_KVM ++ IOCSRState *s = opaque; ++ struct kvm_iocsr_entry entry; ++ int i = 0; ++ ++ if ((!kvm_enabled())) { ++ return 0; ++ } ++ ++ for (i = 0; i < IOCSR_MAX; i++) { ++ entry.addr = iocsr_array[i]; ++ kvm_vm_ioctl(kvm_state, KVM_LOONGARCH_GET_IOCSR, &entry); ++ s->iocsr_val[i] = entry.data; ++ } ++#endif ++ return 0; ++} ++ ++static int kvm_iocsr_post_load(void *opaque, int version) ++{ ++#ifdef CONFIG_KVM ++ IOCSRState *s = opaque; ++ struct kvm_iocsr_entry entry; ++ int i = 0; ++ ++ if (!kvm_enabled()) { ++ return 0; ++ } ++ ++ for (i = 0; i < IOCSR_MAX; i++) { ++ entry.addr = iocsr_array[i]; ++ entry.data = s->iocsr_val[i]; ++ kvm_vm_ioctl(kvm_state, KVM_LOONGARCH_SET_IOCSR, &entry); ++ } ++#endif ++ return 0; ++} ++ ++static void iocsr_reset(DeviceState *d) ++{ ++ IOCSRState *s = IOCSR(d); ++ int i; ++ ++ for (i = 0; i < IOCSR_MAX; i++) { ++ s->iocsr_val[i] = iocsr_init.iocsr_val[i]; ++ } ++ kvm_iocsr_post_load(s, 0); ++} ++ ++static void init_vendor_cpuname(uint64_t *vendor, uint64_t *cpu_name, ++ char *cpuname) ++{ ++ int i = 0, len = 0; ++ char *index = NULL, *index_end = NULL; ++ char *vendor_c = (char *)vendor; ++ char *cpu_name_c = (char *)cpu_name; ++ ++ index = strstr(cpuname, "-"); ++ len = strlen(cpuname); ++ if ((index == NULL) || (len <= 0)) { ++ return; ++ } ++ ++ *vendor = 0; ++ *cpu_name = 0; ++ index_end = cpuname + len; ++ ++ while (((cpuname + i) < index) && (i < sizeof(uint64_t))) { ++ vendor_c[i] = cpuname[i]; ++ i++; ++ } ++ ++ index += 1; ++ i = 0; ++ ++ while (((index + i) < index_end) && (i < sizeof(uint64_t))) { ++ cpu_name_c[i] = index[i]; ++ i++; ++ } ++ ++ return; ++} ++ ++static void iocsr_instance_init(Object *obj) ++{ ++ IOCSRState *s = IOCSR(obj); ++ int i; ++ LoongarchMachineState *lsms; ++ LoongarchMachineClass *lsmc; ++ Object *machine = qdev_get_machine(); ++ ObjectClass *mc = object_get_class(machine); ++ ++ /* 'lams' should be initialized */ ++ if (!strcmp(MACHINE_CLASS(mc)->name, "none")) { ++ return; ++ } ++ ++ lsms = LoongarchMACHINE(machine); ++ lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ ++ init_vendor_cpuname((uint64_t *)&iocsr_init.iocsr_val[IOCSR_VENDOR], ++ (uint64_t *)&iocsr_init.iocsr_val[IOCSR_CPUNAME], ++ lsmc->cpu_name); ++ ++ for (i = 0; i < IOCSR_MAX; i++) { ++ s->iocsr_val[i] = iocsr_init.iocsr_val[i]; ++ } ++} ++ ++static const VMStateDescription vmstate_iocsr = { ++ .name = TYPE_IOCSR, ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .pre_save = kvm_iocsr_pre_save, ++ .post_load = kvm_iocsr_post_load, ++ .fields = (VMStateField[]){ VMSTATE_UINT64_ARRAY(iocsr_val, IOCSRState, ++ IOCSR_MAX), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static void iocsr_class_init(ObjectClass *klass, void *data) ++{ ++ DeviceClass *dc = DEVICE_CLASS(klass); ++ ++ dc->reset = iocsr_reset; ++ dc->vmsd = &vmstate_iocsr; ++} ++ ++static const TypeInfo iocsr_info = { ++ .name = TYPE_IOCSR, ++ .parent = TYPE_SYS_BUS_DEVICE, ++ .instance_size = sizeof(IOCSRState), ++ .instance_init = iocsr_instance_init, ++ .class_init = iocsr_class_init, ++}; ++ ++static void iocsr_register_types(void) ++{ ++ type_register_static(&iocsr_info); ++} ++ ++type_init(iocsr_register_types) +diff --git a/hw/loongarch/ipi.c b/hw/loongarch/ipi.c +new file mode 100644 +index 0000000000..affa97392e +--- /dev/null ++++ b/hw/loongarch/ipi.c +@@ -0,0 +1,284 @@ ++/* ++ * LOONGARCH IPI support ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu/units.h" ++#include "qapi/error.h" ++#include "hw/hw.h" ++#include "hw/irq.h" ++#include "hw/loongarch/cpudevs.h" ++#include "sysemu/sysemu.h" ++#include "sysemu/cpus.h" ++#include "sysemu/kvm.h" ++#include "hw/core/cpu.h" ++#include "qemu/log.h" ++#include "hw/loongarch/bios.h" ++#include "elf.h" ++#include "linux/kvm.h" ++#include "hw/loongarch/larch.h" ++#include "hw/loongarch/ls7a.h" ++#include "migration/vmstate.h" ++ ++static int gipi_pre_save(void *opaque) ++{ ++#ifdef CONFIG_KVM ++ gipiState *state = opaque; ++ struct loongarch_gipiState *kstate; ++ struct loongarch_kvm_irqchip *chip; ++ int ret, i, j, length; ++#endif ++ ++ if ((!kvm_enabled()) || (!kvm_irqchip_in_kernel())) { ++ return 0; ++ } ++ ++#ifdef CONFIG_KVM ++ length = sizeof(struct loongarch_kvm_irqchip) + ++ sizeof(struct loongarch_gipiState); ++ chip = g_malloc0(length); ++ memset(chip, 0, length); ++ chip->chip_id = KVM_IRQCHIP_LS3A_GIPI; ++ chip->len = length; ++ ret = kvm_vm_ioctl(kvm_state, KVM_GET_IRQCHIP, chip); ++ if (ret < 0) { ++ fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret)); ++ abort(); ++ } ++ ++ kstate = (struct loongarch_gipiState *)chip->data; ++ ++ for (i = 0; i < MAX_GIPI_CORE_NUM; i++) { ++ state->core[i].status = kstate->core[i].status; ++ state->core[i].en = kstate->core[i].en; ++ state->core[i].set = kstate->core[i].set; ++ state->core[i].clear = kstate->core[i].clear; ++ for (j = 0; j < MAX_GIPI_MBX_NUM; j++) { ++ state->core[i].buf[j] = kstate->core[i].buf[j]; ++ } ++ } ++ g_free(chip); ++#endif ++ ++ return 0; ++} ++ ++static int gipi_post_load(void *opaque, int version) ++{ ++#ifdef CONFIG_KVM ++ gipiState *state = opaque; ++ struct loongarch_gipiState *kstate; ++ struct loongarch_kvm_irqchip *chip; ++ int ret, i, j, length; ++#endif ++ ++ if ((!kvm_enabled()) || (!kvm_irqchip_in_kernel())) { ++ return 0; ++ } ++ ++#ifdef CONFIG_KVM ++ length = sizeof(struct loongarch_kvm_irqchip) + ++ sizeof(struct loongarch_gipiState); ++ chip = g_malloc0(length); ++ memset(chip, 0, length); ++ chip->chip_id = KVM_IRQCHIP_LS3A_GIPI; ++ chip->len = length; ++ kstate = (struct loongarch_gipiState *)chip->data; ++ ++ for (i = 0; i < MAX_GIPI_CORE_NUM; i++) { ++ kstate->core[i].status = state->core[i].status; ++ kstate->core[i].en = state->core[i].en; ++ kstate->core[i].set = state->core[i].set; ++ kstate->core[i].clear = state->core[i].clear; ++ for (j = 0; j < MAX_GIPI_MBX_NUM; j++) { ++ kstate->core[i].buf[j] = state->core[i].buf[j]; ++ } ++ } ++ ++ ret = kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, chip); ++ if (ret < 0) { ++ fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret)); ++ abort(); ++ } ++ g_free(chip); ++#endif ++ return 0; ++} ++ ++static const VMStateDescription vmstate_gipi_core = { ++ .name = "gipi-single", ++ .version_id = 0, ++ .minimum_version_id = 0, ++ .fields = ++ (VMStateField[]){ ++ VMSTATE_UINT32(status, gipi_core), VMSTATE_UINT32(en, gipi_core), ++ VMSTATE_UINT32(set, gipi_core), VMSTATE_UINT32(clear, gipi_core), ++ VMSTATE_UINT64_ARRAY(buf, gipi_core, MAX_GIPI_MBX_NUM), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static const VMStateDescription vmstate_gipi = { ++ .name = "gipi", ++ .pre_save = gipi_pre_save, ++ .post_load = gipi_post_load, ++ .version_id = 0, ++ .minimum_version_id = 0, ++ .fields = (VMStateField[]){ VMSTATE_STRUCT_ARRAY( ++ core, gipiState, MAX_GIPI_CORE_NUM, 0, ++ vmstate_gipi_core, gipi_core), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static void gipi_writel(void *opaque, hwaddr addr, uint64_t val, unsigned size) ++{ ++ gipi_core *s = opaque; ++ gipi_core *ss; ++ void *pbuf; ++ uint32_t cpu, action_data, mailaddr; ++ LoongarchMachineState *ms = LoongarchMACHINE(qdev_get_machine()); ++ ++ if ((size != 4) && (size != 8)) { ++ hw_error("size not 4 and not 8"); ++ } ++ addr &= 0xff; ++ switch (addr) { ++ case CORE0_STATUS_OFF: ++ hw_error("CORE0_STATUS_OFF Can't be write\n"); ++ break; ++ case CORE0_EN_OFF: ++ s->en = val; ++ break; ++ case CORE0_IPI_SEND: ++ cpu = (val >> 16) & 0x3ff; ++ action_data = 1UL << (val & 0x1f); ++ ss = &ms->gipi->core[cpu]; ++ ss->status |= action_data; ++ if (ss->status != 0) { ++ qemu_irq_raise(ss->irq); ++ } ++ break; ++ case CORE0_MAIL_SEND: ++ cpu = (val >> 16) & 0x3ff; ++ mailaddr = (val >> 2) & 0x7; ++ ss = &ms->gipi->core[cpu]; ++ pbuf = (void *)ss->buf + mailaddr * 4; ++ *(unsigned int *)pbuf = (val >> 32); ++ break; ++ case CORE0_SET_OFF: ++ hw_error("CORE0_SET_OFF Can't be write\n"); ++ break; ++ case CORE0_CLEAR_OFF: ++ s->status ^= val; ++ if (s->status == 0) { ++ qemu_irq_lower(s->irq); ++ } ++ break; ++ case 0x20 ... 0x3c: ++ pbuf = (void *)s->buf + (addr - 0x20); ++ if (size == 1) { ++ *(unsigned char *)pbuf = (unsigned char)val; ++ } else if (size == 2) { ++ *(unsigned short *)pbuf = (unsigned short)val; ++ } else if (size == 4) { ++ *(unsigned int *)pbuf = (unsigned int)val; ++ } else if (size == 8) { ++ *(unsigned long *)pbuf = (unsigned long)val; ++ } ++ break; ++ default: ++ break; ++ } ++} ++ ++static uint64_t gipi_readl(void *opaque, hwaddr addr, unsigned size) ++{ ++ gipi_core *s = opaque; ++ uint64_t ret = 0; ++ void *pbuf; ++ ++ addr &= 0xff; ++ if ((size != 4) && (size != 8)) { ++ hw_error("size not 4 and not 8 size:%d\n", size); ++ } ++ switch (addr) { ++ case CORE0_STATUS_OFF: ++ ret = s->status; ++ break; ++ case CORE0_EN_OFF: ++ ret = s->en; ++ break; ++ case CORE0_SET_OFF: ++ ret = 0; ++ break; ++ case CORE0_CLEAR_OFF: ++ ret = 0; ++ break; ++ case 0x20 ... 0x3c: ++ pbuf = (void *)s->buf + (addr - 0x20); ++ if (size == 1) { ++ ret = *(unsigned char *)pbuf; ++ } else if (size == 2) { ++ ret = *(unsigned short *)pbuf; ++ } else if (size == 4) { ++ ret = *(unsigned int *)pbuf; ++ } else if (size == 8) { ++ ret = *(unsigned long *)pbuf; ++ } ++ break; ++ default: ++ break; ++ } ++ ++ return ret; ++} ++ ++static const MemoryRegionOps gipi_ops = { ++ .read = gipi_readl, ++ .write = gipi_writel, ++ .valid = { ++ .min_access_size = 4, ++ .max_access_size = 8, ++ }, ++ .impl = { ++ .min_access_size = 4, ++ .max_access_size = 8, ++ }, ++ .endianness = DEVICE_NATIVE_ENDIAN, ++}; ++ ++int cpu_init_ipi(LoongarchMachineState *ms, qemu_irq parent, int cpu) ++{ ++ hwaddr addr; ++ MemoryRegion *region; ++ char str[32]; ++ ++ if (ms->gipi == NULL) { ++ ms->gipi = g_malloc0(sizeof(gipiState)); ++ vmstate_register(NULL, 0, &vmstate_gipi, ms->gipi); ++ } ++ ++ ms->gipi->core[cpu].irq = parent; ++ ++ addr = SMP_GIPI_MAILBOX | (cpu << 8); ++ region = g_new(MemoryRegion, 1); ++ sprintf(str, "gipi%d", cpu); ++ memory_region_init_io(region, NULL, &gipi_ops, &ms->gipi->core[cpu], str, ++ 0x100); ++ memory_region_add_subregion(get_system_memory(), addr, region); ++ return 0; ++} +diff --git a/hw/loongarch/larch_3a.c b/hw/loongarch/larch_3a.c +new file mode 100644 +index 0000000000..fe786008ac +--- /dev/null ++++ b/hw/loongarch/larch_3a.c +@@ -0,0 +1,2063 @@ ++/* ++ * QEMU loongarch 3a develop board emulation ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu/units.h" ++#include "qapi/error.h" ++#include "qemu/datadir.h" ++#include "hw/hw.h" ++#include "hw/loongarch/cpudevs.h" ++#include "hw/i386/pc.h" ++#include "hw/char/serial.h" ++#include "hw/isa/isa.h" ++#include "hw/qdev-core.h" ++#include "sysemu/sysemu.h" ++#include "sysemu/runstate.h" ++#include "sysemu/reset.h" ++#include "migration/vmstate.h" ++#include "sysemu/cpus.h" ++#include "hw/boards.h" ++#include "qemu/log.h" ++#include "hw/loongarch/bios.h" ++#include "hw/loader.h" ++#include "elf.h" ++#include "exec/address-spaces.h" ++#include "hw/ide.h" ++#include "hw/pci/pci_host.h" ++#include "hw/pci/msi.h" ++#include "linux/kvm.h" ++#include "sysemu/kvm.h" ++#include "sysemu/numa.h" ++#include "hw/rtc/mc146818rtc.h" ++#include "hw/irq.h" ++#include "net/net.h" ++#include "hw/platform-bus.h" ++#include "hw/timer/i8254.h" ++#include "hw/loongarch/larch.h" ++#include "hw/loongarch/ls7a.h" ++#include "hw/nvram/fw_cfg.h" ++#include "hw/firmware/smbios.h" ++#include "acpi-build.h" ++#include ++#include ++#include "sysemu/block-backend.h" ++#include "hw/block/flash.h" ++#include "sysemu/device_tree.h" ++#include "qapi/visitor.h" ++#include "qapi/qapi-visit-common.h" ++#include "sysemu/tpm.h" ++#include "hw/loongarch/sysbus-fdt.h" ++ ++#include ++ ++#define DMA64_SUPPORTED 0x2 ++#define MAX_IDE_BUS 2 ++ ++#define BOOTPARAM_PHYADDR 0x0ff00000ULL ++#define BOOTPARAM_ADDR (0x9000000000000000ULL + BOOTPARAM_PHYADDR) ++#define SMBIOS_PHYSICAL_ADDRESS 0x0fe00000 ++#define SMBIOS_SIZE_LIMIT 0x200000 ++#define RESERVED_SIZE_LIMIT 0x1100000 ++#define COMMAND_LINE_SIZE 4096 ++#define FW_CONF_ADDR 0x0fff0000 ++ ++#define PHYS_TO_VIRT(x) ((x) | 0x9000000000000000ULL) ++ ++#define TARGET_REALPAGE_MASK (TARGET_PAGE_MASK << 2) ++ ++#ifdef CONFIG_KVM ++#define LS_ISA_IO_SIZE 0x02000000 ++#else ++#define LS_ISA_IO_SIZE 0x00010000 ++#endif ++ ++#ifdef CONFIG_KVM ++#define align(x) (((x) + 63) & ~63) ++#else ++#define align(x) (((x) + 15) & ~15) ++#endif ++ ++#define DEBUG_LOONGARCH3A 0 ++#define FLASH_SECTOR_SIZE 4096 ++ ++#define DPRINTF(fmt, ...) \ ++ do { \ ++ if (DEBUG_LOONGARCH3A) { \ ++ fprintf(stderr, fmt, ##__VA_ARGS__); \ ++ } \ ++ } while (0) ++ ++#define DEFINE_LS3A5K_MACHINE(suffix, name, optionfn) \ ++ static void ls3a5k_init_##suffix(MachineState *machine) \ ++ { \ ++ ls3a5k_init(machine); \ ++ } \ ++ DEFINE_LOONGARCH_MACHINE(suffix, name, ls3a5k_init_##suffix, optionfn) ++ ++struct efi_memory_map_loongarch { ++ uint16_t vers; /* version of efi_memory_map */ ++ uint32_t nr_map; /* number of memory_maps */ ++ uint32_t mem_freq; /* memory frequence */ ++ struct mem_map { ++ uint32_t node_id; /* node_id which memory attached to */ ++ uint32_t mem_type; /* system memory, pci memory, pci io, etc. */ ++ uint64_t mem_start; /* memory map start address */ ++ uint32_t mem_size; /* each memory_map size, not the total size */ ++ } map[128]; ++} __attribute__((packed)); ++ ++enum loongarch_cpu_type { Loongson3 = 0x1, Loongson3_comp = 0x2 }; ++ ++struct GlobalProperty loongarch_compat[] = { ++ { ++ .driver = "rtl8139", ++ .property = "romfile", ++ .value = "", ++ }, ++ { ++ .driver = "e1000", ++ .property = "romfile", ++ .value = "", ++ }, ++ { ++ .driver = "virtio-net-pci", ++ .property = "romfile", ++ .value = "", ++ }, ++ { ++ .driver = "qxl-vga", ++ .property = "romfile", ++ .value = "", ++ }, ++ { ++ .driver = "VGA", ++ .property = "romfile", ++ .value = "", ++ }, ++ { ++ .driver = "cirrus-vga", ++ .property = "romfile", ++ .value = "", ++ }, ++ { ++ .driver = "virtio-vga", ++ .property = "romfile", ++ .value = "", ++ }, ++ { ++ .driver = "vmware-svga", ++ .property = "romfile", ++ .value = "", ++ }, ++}; ++const size_t loongarch_compat_len = G_N_ELEMENTS(loongarch_compat); ++ ++/* ++ * Capability and feature descriptor structure for LOONGARCH CPU ++ */ ++struct efi_cpuinfo_loongarch { ++ uint16_t vers; /* version of efi_cpuinfo_loongarch */ ++ uint32_t processor_id; /* PRID, e.g. 6305, 6306 */ ++ enum loongarch_cpu_type cputype; /* 3A, 3B, etc. */ ++ uint32_t total_node; /* num of total numa nodes */ ++ uint16_t cpu_startup_core_id; /* Core id */ ++ uint16_t reserved_cores_mask; ++ uint32_t cpu_clock_freq; /* cpu_clock */ ++ uint32_t nr_cpus; ++} __attribute__((packed)); ++ ++#define MAX_UARTS 64 ++struct uart_device { ++ uint32_t iotype; /* see include/linux/serial_core.h */ ++ uint32_t uartclk; ++ uint32_t int_offset; ++ uint64_t uart_base; ++} __attribute__((packed)); ++ ++#define MAX_SENSORS 64 ++#define SENSOR_TEMPER 0x00000001 ++#define SENSOR_VOLTAGE 0x00000002 ++#define SENSOR_FAN 0x00000004 ++struct sensor_device { ++ char name[32]; /* a formal name */ ++ char label[64]; /* a flexible description */ ++ uint32_t type; /* SENSOR_* */ ++ uint32_t id; /* instance id of a sensor-class */ ++ /* ++ * see arch/loongarch/include/ ++ * asm/mach-loongarch/loongarch_hwmon.h ++ */ ++ uint32_t fan_policy; ++ uint32_t fan_percent; /* only for constant speed policy */ ++ uint64_t base_addr; /* base address of device registers */ ++} __attribute__((packed)); ++ ++struct system_loongarch { ++ uint16_t vers; /* version of system_loongarch */ ++ uint32_t ccnuma_smp; /* 0: no numa; 1: has numa */ ++ uint32_t sing_double_channel; /* 1:single; 2:double */ ++ uint32_t nr_uarts; ++ struct uart_device uarts[MAX_UARTS]; ++ uint32_t nr_sensors; ++ struct sensor_device sensors[MAX_SENSORS]; ++ char has_ec; ++ char ec_name[32]; ++ uint64_t ec_base_addr; ++ char has_tcm; ++ char tcm_name[32]; ++ uint64_t tcm_base_addr; ++ uint64_t workarounds; /* see workarounds.h */ ++} __attribute__((packed)); ++ ++struct irq_source_routing_table { ++ uint16_t vers; ++ uint16_t size; ++ uint16_t rtr_bus; ++ uint16_t rtr_devfn; ++ uint32_t vendor; ++ uint32_t device; ++ uint32_t PIC_type; /* conform use HT or PCI to route to CPU-PIC */ ++ uint64_t ht_int_bit; /* 3A: 1<<24; 3B: 1<<16 */ ++ uint64_t ht_enable; /* irqs used in this PIC */ ++ uint32_t node_id; /* node id: 0x0-0; 0x1-1; 0x10-2; 0x11-3 */ ++ uint64_t pci_mem_start_addr; ++ uint64_t pci_mem_end_addr; ++ uint64_t pci_io_start_addr; ++ uint64_t pci_io_end_addr; ++ uint64_t pci_config_addr; ++ uint32_t dma_mask_bits; ++ uint16_t dma_noncoherent; ++} __attribute__((packed)); ++ ++struct interface_info { ++ uint16_t vers; /* version of the specificition */ ++ uint16_t size; ++ uint8_t flag; ++ char description[64]; ++} __attribute__((packed)); ++ ++#define MAX_RESOURCE_NUMBER 128 ++struct resource_loongarch { ++ uint64_t start; /* resource start address */ ++ uint64_t end; /* resource end address */ ++ char name[64]; ++ uint32_t flags; ++}; ++ ++struct archdev_data { ++}; /* arch specific additions */ ++ ++struct board_devices { ++ char name[64]; /* hold the device name */ ++ uint32_t num_resources; /* number of device_resource */ ++ /* for each device's resource */ ++ struct resource_loongarch resource[MAX_RESOURCE_NUMBER]; ++ /* arch specific additions */ ++ struct archdev_data archdata; ++}; ++ ++struct loongarch_special_attribute { ++ uint16_t vers; /* version of this special */ ++ char special_name[64]; /* special_atribute_name */ ++ uint32_t loongarch_special_type; /* type of special device */ ++ /* for each device's resource */ ++ struct resource_loongarch resource[MAX_RESOURCE_NUMBER]; ++}; ++ ++struct loongarch_params { ++ uint64_t memory_offset; /* efi_memory_map_loongarch struct offset */ ++ uint64_t cpu_offset; /* efi_cpuinfo_loongarch struct offset */ ++ uint64_t system_offset; /* system_loongarch struct offset */ ++ uint64_t irq_offset; /* irq_source_routing_table struct offset */ ++ uint64_t interface_offset; /* interface_info struct offset */ ++ uint64_t special_offset; /* loongarch_special_attribute struct offset */ ++ uint64_t boarddev_table_offset; /* board_devices offset */ ++}; ++ ++struct smbios_tables { ++ uint16_t vers; /* version of smbios */ ++ uint64_t vga_bios; /* vga_bios address */ ++ struct loongarch_params lp; ++}; ++ ++struct efi_reset_system_t { ++ uint64_t ResetCold; ++ uint64_t ResetWarm; ++ uint64_t ResetType; ++ uint64_t Shutdown; ++ uint64_t DoSuspend; /* NULL if not support */ ++}; ++ ++struct efi_loongarch { ++ uint64_t mps; /* MPS table */ ++ uint64_t acpi; /* ACPI table (IA64 ext 0.71) */ ++ uint64_t acpi20; /* ACPI table (ACPI 2.0) */ ++ struct smbios_tables smbios; /* SM BIOS table */ ++ uint64_t sal_systab; /* SAL system table */ ++ uint64_t boot_info; /* boot info table */ ++}; ++ ++struct boot_params { ++ struct efi_loongarch efi; ++ struct efi_reset_system_t reset_system; ++}; ++ ++static struct _loaderparams { ++ unsigned long ram_size; ++ const char *kernel_filename; ++ const char *kernel_cmdline; ++ const char *initrd_filename; ++ unsigned long a0, a1, a2; ++} loaderparams; ++ ++static struct _firmware_config { ++ unsigned long ram_size; ++ unsigned int mem_freq; ++ unsigned int cpu_nr; ++ unsigned int cpu_clock_freq; ++} fw_config; ++ ++struct la_memmap_entry { ++ uint64_t address; ++ uint64_t length; ++ uint32_t type; ++ uint32_t reserved; ++}; ++ ++static void *boot_params_buf; ++static void *boot_params_p; ++static struct la_memmap_entry *la_memmap_table; ++static unsigned la_memmap_entries; ++ ++CPULOONGARCHState *cpu_states[LOONGARCH_MAX_VCPUS]; ++ ++struct kvm_cpucfg ls3a5k_cpucfgs = { ++ .cpucfg[LOONGARCH_CPUCFG0] = CPUCFG0_3A5000_PRID, ++ .cpucfg[LOONGARCH_CPUCFG1] = ++ CPUCFG1_ISGR64 | CPUCFG1_PAGING | CPUCFG1_IOCSR | CPUCFG1_PABITS | ++ CPUCFG1_VABITS | CPUCFG1_UAL | CPUCFG1_RI | CPUCFG1_XI | CPUCFG1_RPLV | ++ CPUCFG1_HUGEPG | CPUCFG1_IOCSRBRD, ++ .cpucfg[LOONGARCH_CPUCFG2] = ++ CPUCFG2_FP | CPUCFG2_FPSP | CPUCFG2_FPDP | CPUCFG2_FPVERS | ++ CPUCFG2_LSX | CPUCFG2_LASX | CPUCFG2_COMPLEX | CPUCFG2_CRYPTO | ++ CPUCFG2_LLFTP | CPUCFG2_LLFTPREV | CPUCFG2_LSPW | CPUCFG2_LAM, ++ .cpucfg[LOONGARCH_CPUCFG3] = ++ CPUCFG3_CCDMA | CPUCFG3_SFB | CPUCFG3_UCACC | CPUCFG3_LLEXC | ++ CPUCFG3_SCDLY | CPUCFG3_LLDBAR | CPUCFG3_ITLBT | CPUCFG3_ICACHET | ++ CPUCFG3_SPW_LVL | CPUCFG3_SPW_HG_HF | CPUCFG3_RVA | CPUCFG3_RVAMAX, ++ .cpucfg[LOONGARCH_CPUCFG4] = CCFREQ_100M, ++ .cpucfg[LOONGARCH_CPUCFG5] = CPUCFG5_CCMUL | CPUCFG5_CCDIV, ++ .cpucfg[LOONGARCH_CPUCFG6] = CPUCFG6_PMP | CPUCFG6_PAMVER | CPUCFG6_PMNUM | ++ CPUCFG6_PMBITS | CPUCFG6_UPM, ++ .cpucfg[LOONGARCH_CPUCFG16] = CPUCFG16_L1_IUPRE | CPUCFG16_L1_DPRE | ++ CPUCFG16_L2_IUPRE | CPUCFG16_L2_IUUNIFY | ++ CPUCFG16_L2_IUPRIV | CPUCFG16_L3_IUPRE | ++ CPUCFG16_L3_IUUNIFY | CPUCFG16_L3_IUINCL, ++ .cpucfg[LOONGARCH_CPUCFG17] = ++ CPUCFG17_L1I_WAYS_M | CPUCFG17_L1I_SETS_M | CPUCFG17_L1I_SIZE_M, ++ .cpucfg[LOONGARCH_CPUCFG18] = ++ CPUCFG18_L1D_WAYS_M | CPUCFG18_L1D_SETS_M | CPUCFG18_L1D_SIZE_M, ++ .cpucfg[LOONGARCH_CPUCFG19] = ++ CPUCFG19_L2_WAYS_M | CPUCFG19_L2_SETS_M | CPUCFG19_L2_SIZE_M, ++ .cpucfg[LOONGARCH_CPUCFG20] = ++ CPUCFG20_L3_WAYS_M | CPUCFG20_L3_SETS_M | CPUCFG20_L3_SIZE_M, ++}; ++ ++bool loongarch_is_acpi_enabled(LoongarchMachineState *vms) ++{ ++ if (vms->acpi == ON_OFF_AUTO_OFF) { ++ return false; ++ } ++ return true; ++} ++ ++static void loongarch_get_acpi(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ LoongarchMachineState *lsms = LoongarchMACHINE(obj); ++ OnOffAuto acpi = lsms->acpi; ++ ++ visit_type_OnOffAuto(v, name, &acpi, errp); ++} ++ ++static void loongarch_set_acpi(Object *obj, Visitor *v, const char *name, ++ void *opaque, Error **errp) ++{ ++ LoongarchMachineState *lsms = LoongarchMACHINE(obj); ++ ++ visit_type_OnOffAuto(v, name, &lsms->acpi, errp); ++} ++ ++int la_memmap_add_entry(uint64_t address, uint64_t length, uint32_t type) ++{ ++ int i; ++ ++ for (i = 0; i < la_memmap_entries; i++) { ++ if (la_memmap_table[i].address == address) { ++ fprintf(stderr, "%s address:0x%lx length:0x%lx already exists\n", ++ __func__, address, length); ++ return 0; ++ } ++ } ++ ++ la_memmap_table = g_renew(struct la_memmap_entry, la_memmap_table, ++ la_memmap_entries + 1); ++ la_memmap_table[la_memmap_entries].address = cpu_to_le64(address); ++ la_memmap_table[la_memmap_entries].length = cpu_to_le64(length); ++ la_memmap_table[la_memmap_entries].type = cpu_to_le32(type); ++ la_memmap_entries++; ++ ++ return la_memmap_entries; ++} ++ ++static ram_addr_t get_hotplug_membase(ram_addr_t ram_size) ++{ ++ ram_addr_t sstart; ++ ++ if (ram_size <= 0x10000000) { ++ sstart = 0x90000000; ++ } else { ++ sstart = 0x90000000 + ROUND_UP((ram_size - 0x10000000), ++ LOONGARCH_HOTPLUG_MEM_ALIGN); ++ } ++ return sstart; ++} ++ ++static struct efi_memory_map_loongarch *init_memory_map(void *g_map) ++{ ++ struct efi_memory_map_loongarch *emap = g_map; ++ ++ emap->nr_map = 4; ++ emap->mem_freq = 266000000; ++ ++ emap->map[0].node_id = 0; ++ emap->map[0].mem_type = 1; ++ emap->map[0].mem_start = 0x0; ++#ifdef CONFIG_KVM ++ emap->map[0].mem_size = ++ (loaderparams.ram_size > 0x10000000 ? 256 ++ : (loaderparams.ram_size >> 20)) - ++ 18; ++#else ++ emap->map[0].mem_size = atoi(getenv("memsize")); ++#endif ++ ++ emap->map[1].node_id = 0; ++ emap->map[1].mem_type = 2; ++ emap->map[1].mem_start = 0x90000000; ++#ifdef CONFIG_KVM ++ emap->map[1].mem_size = (loaderparams.ram_size > 0x10000000 ++ ? (loaderparams.ram_size >> 20) - 256 ++ : 0); ++#else ++ emap->map[1].mem_size = atoi(getenv("highmemsize")); ++#endif ++ ++ /* support for smbios */ ++ emap->map[2].node_id = 0; ++ emap->map[2].mem_type = 10; ++ emap->map[2].mem_start = SMBIOS_PHYSICAL_ADDRESS; ++ emap->map[2].mem_size = SMBIOS_SIZE_LIMIT >> 20; ++ ++ emap->map[3].node_id = 0; ++ emap->map[3].mem_type = 3; ++ emap->map[3].mem_start = 0xee00000; ++ emap->map[3].mem_size = RESERVED_SIZE_LIMIT >> 20; ++ ++ return emap; ++} ++ ++static uint64_t get_host_cpu_freq(void) ++{ ++ int fd = 0; ++ char buf[1024]; ++ uint64_t freq = 0, size = 0; ++ char *buf_p; ++ ++ fd = open("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq", ++ O_RDONLY); ++ if (fd == -1) { ++ fprintf(stderr, "/sys/devices/system/cpu/cpu0/cpufreq/ \ ++ cpuinfo_max_freq not exist!\n"); ++ fprintf(stderr, "Trying /proc/cpuinfo...\n"); ++ } else { ++ size = read(fd, buf, 16); ++ if (size == -1) { ++ fprintf(stderr, "read err...\n"); ++ } ++ close(fd); ++ freq = (uint64_t)atoi(buf); ++ return freq * 1000; ++ } ++ ++ fd = open("/proc/cpuinfo", O_RDONLY); ++ if (fd == -1) { ++ fprintf(stderr, "Failed to open /proc/cpuinfo!\n"); ++ return 0; ++ } ++ ++ size = read(fd, buf, 1024); ++ if (size == -1) { ++ fprintf(stderr, "read err...\n"); ++ } ++ close(fd); ++ ++ buf_p = strstr(buf, "MHz"); ++ if (buf_p) { ++ while (*buf_p != ':') { ++ buf_p++; ++ } ++ buf_p += 2; ++ } else { ++ buf_p = strstr(buf, "name"); ++ while (*buf_p != '@') { ++ buf_p++; ++ } ++ buf_p += 2; ++ } ++ ++ memcpy(buf, buf_p, 12); ++ buf_p = buf; ++ while ((*buf_p >= '0') && (*buf_p <= '9')) { ++ buf_p++; ++ } ++ *buf_p = '\0'; ++ ++ freq = (uint64_t)atoi(buf); ++ return freq * 1000 * 1000; ++} ++ ++static char *get_host_cpu_model_name(void) ++{ ++ int fd = 0; ++ int size = 0; ++ static char buf[1024]; ++ char *buf_p; ++ ++ fd = open("/proc/cpuinfo", O_RDONLY); ++ if (fd == -1) { ++ fprintf(stderr, "Failed to open /proc/cpuinfo!\n"); ++ return 0; ++ } ++ ++ size = read(fd, buf, 1024); ++ if (size == -1) { ++ fprintf(stderr, "read err...\n"); ++ } ++ close(fd); ++ buf_p = strstr(buf, "Name"); ++ if (!buf_p) { ++ buf_p = strstr(buf, "name"); ++ } ++ if (!buf_p) { ++ fprintf(stderr, "Can't find cpu name\n"); ++ return 0; ++ } ++ ++ while (*buf_p != ':') { ++ buf_p++; ++ } ++ buf_p = buf_p + 2; ++ memcpy(buf, buf_p, 40); ++ buf_p = buf; ++ while (*buf_p != '\n') { ++ buf_p++; ++ } ++ ++ *(buf_p) = '\0'; ++ ++ return buf; ++} ++ ++static void fw_conf_init(unsigned long ramsize) ++{ ++ MachineState *ms = MACHINE(qdev_get_machine()); ++ int smp_cpus = ms->smp.cpus; ++ fw_config.ram_size = ramsize; ++ fw_config.mem_freq = 266000000; ++ fw_config.cpu_nr = smp_cpus; ++ fw_config.cpu_clock_freq = get_host_cpu_freq(); ++} ++ ++static struct efi_cpuinfo_loongarch *init_cpu_info(void *g_cpuinfo_loongarch) ++{ ++ struct efi_cpuinfo_loongarch *c = g_cpuinfo_loongarch; ++ MachineState *ms = MACHINE(qdev_get_machine()); ++ int smp_cpus = ms->smp.cpus; ++ LoongarchMachineState *lsms = LoongarchMACHINE(qdev_get_machine()); ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ ++ if (strstr(lsmc->cpu_name, "5000")) { ++ c->processor_id = 0x14c010; ++ } ++ c->cputype = Loongson3_comp; ++ c->cpu_clock_freq = get_host_cpu_freq(); ++ if (!c->cpu_clock_freq) { ++ c->cpu_clock_freq = 200000000; ++ } ++ c->total_node = 1; ++ c->nr_cpus = smp_cpus; ++ c->cpu_startup_core_id = 0; ++ c->reserved_cores_mask = 0xffff & (0xffff << smp_cpus); ++ ++ return c; ++} ++ ++static struct system_loongarch *init_system_loongarch(void *g_sysitem) ++{ ++ struct system_loongarch *s = g_sysitem; ++ ++ s->ccnuma_smp = 1; ++ s->ccnuma_smp = 0; ++ s->sing_double_channel = 1; ++ ++ return s; ++} ++ ++enum loongarch_irq_source_enum { HT, I8259, UNKNOWN }; ++ ++static struct irq_source_routing_table *init_irq_source(void *g_irq_source) ++{ ++ struct irq_source_routing_table *irq_info = g_irq_source; ++ LoongarchMachineState *lsms = LoongarchMACHINE(qdev_get_machine()); ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ ++ irq_info->PIC_type = HT; ++ irq_info->ht_int_bit = 1 << 24; ++ irq_info->ht_enable = 0x0000d17b; ++ irq_info->node_id = 0; ++ ++ irq_info->pci_mem_start_addr = PCIE_MEMORY_BASE; ++ irq_info->pci_mem_end_addr = ++ irq_info->pci_mem_start_addr + PCIE_MEMORY_SIZE - 1; ++ ++ if (strstr(lsmc->cpu_name, "5000")) { ++ irq_info->pci_io_start_addr = LS3A5K_ISA_IO_BASE; ++ } ++ irq_info->dma_noncoherent = 1; ++ return irq_info; ++} ++ ++static struct interface_info *init_interface_info(void *g_interface) ++{ ++ struct interface_info *inter = g_interface; ++ int flashsize = 0x80000; ++ ++ inter->vers = 0x0001; ++ inter->size = flashsize / 0x400; ++ inter->flag = 1; ++ ++ strcpy(inter->description, "PMON_Version_v2.1"); ++ ++ return inter; ++} ++ ++static struct board_devices *board_devices_info(void *g_board) ++{ ++ struct board_devices *bd = g_board; ++ LoongarchMachineState *lsms = LoongarchMACHINE(qdev_get_machine()); ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ ++ if (!strcmp(lsmc->bridge_name, "ls7a")) { ++ strcpy(bd->name, "Loongarch-3A-7A-1w-V1.03-demo"); ++ } ++ bd->num_resources = 10; ++ ++ return bd; ++} ++ ++static struct loongarch_special_attribute *init_special_info(void *g_special) ++{ ++ struct loongarch_special_attribute *special = g_special; ++ char update[11] = "2013-01-01"; ++ int VRAM_SIZE = 0x20000; ++ ++ strcpy(special->special_name, update); ++ special->resource[0].flags = 0; ++ special->resource[0].start = 0; ++ special->resource[0].end = VRAM_SIZE; ++ strcpy(special->resource[0].name, "SPMODULE"); ++ special->resource[0].flags |= DMA64_SUPPORTED; ++ ++ return special; ++} ++ ++static void init_loongarch_params(struct loongarch_params *lp) ++{ ++ void *p = boot_params_p; ++ ++ lp->memory_offset = ++ (unsigned long long)init_memory_map(p) - (unsigned long long)lp; ++ p += align(sizeof(struct efi_memory_map_loongarch)); ++ ++ lp->cpu_offset = ++ (unsigned long long)init_cpu_info(p) - (unsigned long long)lp; ++ p += align(sizeof(struct efi_cpuinfo_loongarch)); ++ ++ lp->system_offset = ++ (unsigned long long)init_system_loongarch(p) - (unsigned long long)lp; ++ p += align(sizeof(struct system_loongarch)); ++ ++ lp->irq_offset = ++ (unsigned long long)init_irq_source(p) - (unsigned long long)lp; ++ p += align(sizeof(struct irq_source_routing_table)); ++ ++ lp->interface_offset = ++ (unsigned long long)init_interface_info(p) - (unsigned long long)lp; ++ p += align(sizeof(struct interface_info)); ++ ++ lp->boarddev_table_offset = ++ (unsigned long long)board_devices_info(p) - (unsigned long long)lp; ++ p += align(sizeof(struct board_devices)); ++ ++ lp->special_offset = ++ (unsigned long long)init_special_info(p) - (unsigned long long)lp; ++ p += align(sizeof(struct loongarch_special_attribute)); ++ ++ boot_params_p = p; ++} ++ ++static void init_smbios(struct smbios_tables *smbios) ++{ ++ smbios->vers = 1; ++ smbios->vga_bios = 1; ++ init_loongarch_params(&(smbios->lp)); ++} ++ ++static void init_efi(struct efi_loongarch *efi) ++{ ++ init_smbios(&(efi->smbios)); ++} ++ ++static int init_boot_param(struct boot_params *bp) ++{ ++ init_efi(&(bp->efi)); ++ ++ return 0; ++} ++ ++static unsigned int ls3a5k_aui_boot_code[] = { ++ 0x0380200d, /* ori $r13,$r0,0x8 */ ++ 0x0400002d, /* csrwr $r13,0x0 */ ++ 0x0401000e, /* csrrd $r14,0x40 */ ++ 0x0343fdce, /* andi $r14,$r14,0xff */ ++ 0x143fc02c, /* lu12i.w $r12,261889(0x1fe01) */ ++ 0x1600000c, /* lu32i.d $r12,0 */ ++ 0x0320018c, /* lu52i.d $r12,$r12,-1792(0x800) */ ++ 0x03400dcf, /* andi $r15,$r14,0x3 */ ++ 0x004121ef, /* slli.d $r15,$r15,0x8 */ ++ 0x00153d8c, /* or $r12,$r12,$r15 */ ++ 0x034031d0, /* andi $r16,$r14,0xc */ ++ 0x0041aa10, /* slli.d $r16,$r16,0x2a */ ++ 0x0015418c, /* or $r12,$r12,$r16 */ ++ 0x28808184, /* ld.w $r4,$r12,32(0x20) */ ++ 0x43fffc9f, /* beqz $r4,0 -4 */ ++ 0x28c08184, /* ld.d $r4,$r12,32(0x20) */ ++ 0x28c0a183, /* ld.d $r3,$r12,40(0x28) */ ++ 0x28c0c182, /* ld.d $r2,$r12,48(0x30) */ ++ 0x28c0e185, /* ld.d $r5,$r12,56(0x38) */ ++ 0x4c000080, /* jirl $r0,$r4,0 */ ++}; ++ ++static int set_bootparam_uefi(ram_addr_t initrd_offset, long initrd_size) ++{ ++ long params_size; ++ char memenv[32]; ++ char highmemenv[32]; ++ void *params_buf; ++ unsigned long *parg_env; ++ int ret = 0; ++ ++ /* Allocate params_buf for command line. */ ++ params_size = 0x100000; ++ params_buf = g_malloc0(params_size); ++ ++ /* ++ * Layout of params_buf looks like this: ++ * argv[0], argv[1], 0, env[0], env[1], ...env[i], 0, ++ * argv[0]'s data, argv[1]'s data, env[0]'data, ..., env[i]'s data, 0 ++ */ ++ parg_env = (void *)params_buf; ++ ++ ret = (3 + 1) * sizeof(target_ulong); ++ *parg_env++ = (BOOTPARAM_ADDR + ret); ++ ret += (1 + snprintf(params_buf + ret, COMMAND_LINE_SIZE - ret, "g")); ++ ++ /* argv1 */ ++ *parg_env++ = BOOTPARAM_ADDR + ret; ++ if (initrd_size > 0) ++ ret += (1 + snprintf(params_buf + ret, COMMAND_LINE_SIZE - ret, ++ "rd_start=0x%llx rd_size=%li %s", ++ PHYS_TO_VIRT((uint32_t)initrd_offset), ++ initrd_size, loaderparams.kernel_cmdline)); ++ else ++ ret += (1 + snprintf(params_buf + ret, COMMAND_LINE_SIZE - ret, "%s", ++ loaderparams.kernel_cmdline)); ++ ++ /* argv2 */ ++ *parg_env++ = 0; ++ ++ /* env */ ++ sprintf(memenv, "%lu", ++ loaderparams.ram_size > 0x10000000 ++ ? 256 ++ : (loaderparams.ram_size >> 20)); ++ sprintf(highmemenv, "%lu", ++ loaderparams.ram_size > 0x10000000 ++ ? (loaderparams.ram_size >> 20) - 256 ++ : 0); ++ ++ setenv("memsize", memenv, 1); ++ setenv("highmemsize", highmemenv, 1); ++ ++ ret = ((ret + 32) & ~31); ++ ++ boot_params_buf = (void *)(params_buf + ret); ++ boot_params_p = boot_params_buf + align(sizeof(struct boot_params)); ++ init_boot_param(boot_params_buf); ++ rom_add_blob_fixed("params", params_buf, params_size, BOOTPARAM_PHYADDR); ++ loaderparams.a0 = 2; ++ loaderparams.a1 = BOOTPARAM_ADDR; ++ loaderparams.a2 = BOOTPARAM_ADDR + ret; ++ ++ return 0; ++} ++ ++static uint64_t cpu_loongarch_virt_to_phys(void *opaque, uint64_t addr) ++{ ++ return addr & 0x1fffffffll; ++} ++ ++static void fw_cfg_add_kernel_info(FWCfgState *fw_cfg, uint64_t highram_size, ++ uint64_t phyAddr_initrd) ++{ ++ int64_t entry, kernel_low, kernel_high; ++ long initrd_size = 0; ++ uint64_t initrd_offset = 0; ++ void *cmdline_buf; ++ int ret = 0; ++ ++ ret = load_elf(loaderparams.kernel_filename, NULL, ++ cpu_loongarch_virt_to_phys, NULL, (uint64_t *)&entry, ++ (uint64_t *)&kernel_low, (uint64_t *)&kernel_high, NULL, 0, ++ EM_LOONGARCH, 1, 0); ++ ++ if (0 > ret) { ++ error_report("kernel image load error"); ++ exit(1); ++ } ++ ++ fw_cfg_add_i64(fw_cfg, FW_CFG_KERNEL_ENTRY, entry); ++ ++ if (loaderparams.initrd_filename) { ++ initrd_size = get_image_size(loaderparams.initrd_filename); ++ if (0 < initrd_size) { ++ if (initrd_size > highram_size) { ++ error_report("initrd size is too big, should below %ld MB", ++ highram_size / MiB); ++ /*prevent write io memory address space*/ ++ exit(1); ++ } ++ initrd_offset = ++ (phyAddr_initrd - initrd_size) & TARGET_REALPAGE_MASK; ++ initrd_size = load_image_targphys( ++ loaderparams.initrd_filename, initrd_offset, ++ loaderparams.ram_size - initrd_offset); ++ fw_cfg_add_i64(fw_cfg, FW_CFG_INITRD_ADDR, initrd_offset); ++ fw_cfg_add_i64(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size); ++ } else { ++ error_report("initrd image size is error"); ++ } ++ } ++ ++ cmdline_buf = g_malloc0(COMMAND_LINE_SIZE); ++ if (initrd_size > 0) ++ ret = (1 + snprintf(cmdline_buf, COMMAND_LINE_SIZE, ++ "rd_start=0x%llx rd_size=%li %s", ++ PHYS_TO_VIRT(initrd_offset), initrd_size, ++ loaderparams.kernel_cmdline)); ++ else ++ ret = (1 + snprintf(cmdline_buf, COMMAND_LINE_SIZE, "%s", ++ loaderparams.kernel_cmdline)); ++ ++ fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE, ret); ++ fw_cfg_add_string(fw_cfg, FW_CFG_CMDLINE_DATA, (const char *)cmdline_buf); ++ ++ return; ++} ++ ++static int64_t load_kernel(void) ++{ ++ int64_t entry, kernel_low, kernel_high; ++ long initrd_size = 0; ++ ram_addr_t initrd_offset = 0; ++ ++ load_elf(loaderparams.kernel_filename, NULL, cpu_loongarch_virt_to_phys, ++ NULL, (uint64_t *)&entry, (uint64_t *)&kernel_low, ++ (uint64_t *)&kernel_high, NULL, 0, EM_LOONGARCH, 1, 0); ++ ++ if (loaderparams.initrd_filename) { ++ initrd_size = get_image_size(loaderparams.initrd_filename); ++ ++ if (initrd_size > 0) { ++ initrd_offset = (kernel_high * 4 + ~TARGET_REALPAGE_MASK) & ++ TARGET_REALPAGE_MASK; ++ initrd_size = load_image_targphys( ++ loaderparams.initrd_filename, initrd_offset, ++ loaderparams.ram_size - initrd_offset); ++ } ++ } ++ set_bootparam_uefi(initrd_offset, initrd_size); ++ ++ return entry; ++} ++ ++static void main_cpu_reset(void *opaque) ++{ ++ ResetData *s = (ResetData *)opaque; ++ CPULOONGARCHState *env = &s->cpu->env; ++ ++ cpu_reset(CPU(s->cpu)); ++ env->active_tc.PC = s->vector; ++ env->active_tc.gpr[4] = loaderparams.a0; ++ env->active_tc.gpr[5] = loaderparams.a1; ++ env->active_tc.gpr[6] = loaderparams.a2; ++} ++ ++void slave_cpu_reset(void *opaque) ++{ ++ ResetData *s = (ResetData *)opaque; ++ ++ cpu_reset(CPU(s->cpu)); ++} ++ ++/* KVM_IRQ_LINE irq field index values */ ++#define KVM_LOONGARCH_IRQ_TYPE_SHIFT 24 ++#define KVM_LOONGARCH_IRQ_TYPE_MASK 0xff ++#define KVM_LOONGARCH_IRQ_VCPU_SHIFT 16 ++#define KVM_LOONGARCH_IRQ_VCPU_MASK 0xff ++#define KVM_LOONGARCH_IRQ_NUM_SHIFT 0 ++#define KVM_LOONGARCH_IRQ_NUM_MASK 0xffff ++ ++/* irq_type field */ ++#define KVM_LOONGARCH_IRQ_TYPE_CPU_IP 0 ++#define KVM_LOONGARCH_IRQ_TYPE_CPU_IO 1 ++#define KVM_LOONGARCH_IRQ_TYPE_HT 2 ++#define KVM_LOONGARCH_IRQ_TYPE_MSI 3 ++#define KVM_LOONGARCH_IRQ_TYPE_IOAPIC 4 ++ ++static void legacy_set_irq(void *opaque, int irq, int level) ++{ ++ qemu_irq *pic = opaque; ++ ++ qemu_set_irq(pic[irq], level); ++} ++ ++typedef struct ls3a_intctlstate { ++ uint8_t nodecounter_reg[0x100]; ++ uint8_t pm_reg[0x100]; ++ uint8_t msi_reg[0x8]; ++ CPULOONGARCHState **env; ++ DeviceState *apicdev; ++ qemu_irq *ioapic_irq; ++#ifdef CONFIG_KVM ++ struct loongarch_kvm_irqchip chip; ++#endif ++} ls3a_intctlstate; ++ ++typedef struct ls3a_func_args { ++ ls3a_intctlstate *state; ++ uint64_t base; ++ uint32_t mask; ++ uint8_t *mem; ++} ls3a_func_args; ++ ++static uint64_t ls3a_msi_mem_read(void *opaque, hwaddr addr, unsigned size) ++{ ++ return 0; ++} ++ ++static void ls3a_msi_mem_write(void *opaque, hwaddr addr, uint64_t val, ++ unsigned size) ++{ ++ struct kvm_msi msi; ++ apicState *apic; ++ ++ apic = (apicState *)opaque; ++ msi.address_lo = 0; ++ msi.address_hi = 0; ++ msi.data = val & 0xff; ++ msi.flags = 0; ++ memset(msi.pad, 0, sizeof(msi.pad)); ++ ++ if (kvm_irqchip_in_kernel()) { ++ kvm_vm_ioctl(kvm_state, KVM_SIGNAL_MSI, &msi); ++ } else { ++ qemu_set_irq(apic->irq[msi.data], 1); ++ } ++} ++ ++static const MemoryRegionOps ls3a_msi_ops = { ++ .read = ls3a_msi_mem_read, ++ .write = ls3a_msi_mem_write, ++ .endianness = DEVICE_NATIVE_ENDIAN, ++}; ++ ++static const VMStateDescription vmstate_ls3a_msi = { ++ .name = "ls3a-msi", ++ .version_id = 0, ++ .minimum_version_id = 0, ++ .fields = ++ (VMStateField[]){ VMSTATE_UINT8_ARRAY(msi_reg, ls3a_intctlstate, 0x8), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static void ioapic_handler(void *opaque, int irq, int level) ++{ ++ apicState *apic; ++ int kvm_irq; ++ ++ apic = (apicState *)opaque; ++ ++ if (kvm_irqchip_in_kernel()) { ++ kvm_irq = ++ (KVM_LOONGARCH_IRQ_TYPE_IOAPIC << KVM_LOONGARCH_IRQ_TYPE_SHIFT) | ++ (0 << KVM_LOONGARCH_IRQ_VCPU_SHIFT) | irq; ++ kvm_set_irq(kvm_state, kvm_irq, !!level); ++ } else { ++ qemu_set_irq(apic->irq[irq], level); ++ } ++} ++ ++static void *ls3a_intctl_init(MachineState *machine, CPULOONGARCHState *env[]) ++{ ++ qemu_irq *irqhandler; ++ ls3a_intctlstate *s; ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ LoongarchMachineClass *mc = LoongarchMACHINE_GET_CLASS(lsms); ++ DeviceState *dev; ++ SysBusDevice *busdev; ++ MemoryRegion *address_space_mem = get_system_memory(); ++ MemoryRegion *iomem = NULL; ++#ifdef CONFIG_KVM ++ int i; ++#endif ++ ++ s = g_malloc0(sizeof(ls3a_intctlstate)); ++ ++ if (!s) { ++ return NULL; ++ } ++ ++ /*Add MSI mmio memory*/ ++ iomem = g_new(MemoryRegion, 1); ++ memory_region_init_io(iomem, NULL, &ls3a_msi_ops, lsms->apic, "ls3a_msi", ++ 0x8); ++ memory_region_add_subregion(address_space_mem, MSI_ADDR_LOW, iomem); ++ vmstate_register(NULL, 0, &vmstate_ls3a_msi, s); ++ ++ s->env = env; ++ ++ if (!strcmp(mc->bridge_name, "ls7a")) { ++ if (lsms->apic_xrupt_override) { ++ DPRINTF("irqchip in kernel %d\n", kvm_irqchip_in_kernel()); ++#ifdef CONFIG_KVM ++ if (kvm_has_gsi_routing()) { ++ for (i = 0; i < 32; ++i) { ++ kvm_irqchip_add_irq_route(kvm_state, i, 0, i); ++ } ++ kvm_gsi_routing_allowed = true; ++ } ++ kvm_msi_via_irqfd_allowed = kvm_irqfds_enabled(); ++#endif ++ } ++ ++ irqhandler = qemu_allocate_irqs(ioapic_handler, lsms->apic, 64); ++ dev = qdev_new("ioapic"); ++ busdev = SYS_BUS_DEVICE(dev); ++ sysbus_realize_and_unref(busdev, &error_fatal); ++ sysbus_mmio_map(busdev, 0, mc->ls7a_ioapic_reg_base); ++ s->ioapic_irq = irqhandler; ++ s->apicdev = dev; ++ return s->ioapic_irq; ++ } ++ return NULL; ++} ++ ++/* Network support */ ++static void network_init(PCIBus *pci_bus) ++{ ++ int i; ++ ++ for (i = 0; i < nb_nics; i++) { ++ NICInfo *nd = &nd_table[i]; ++ ++ if (!nd->model) { ++ nd->model = g_strdup("virtio-net-pci"); ++ } ++ ++ pci_nic_init_nofail(nd, pci_bus, nd->model, NULL); ++ } ++} ++ ++void loongarch_cpu_destroy(MachineState *machine, LOONGARCHCPU *cpu) ++{ ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ unsigned int id; ++ int smp_cpus = machine->smp.cpus; ++ id = cpu->id; ++ qemu_unregister_reset(slave_cpu_reset, lsms->reset_info[id]); ++ g_free(lsms->reset_info[id]); ++ lsms->reset_info[id] = NULL; ++ ++ smp_cpus -= 1; ++ if (lsms->fw_cfg) { ++ fw_cfg_modify_i16(lsms->fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus); ++ } ++ ++ qemu_del_vm_change_state_handler(cpu->cpuStateEntry); ++} ++ ++LOONGARCHCPU *loongarch_cpu_create(MachineState *machine, LOONGARCHCPU *cpu, ++ Error **errp) ++{ ++ CPULOONGARCHState *env; ++ unsigned int id; ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ int smp_cpus = machine->smp.cpus; ++ id = cpu->id; ++ env = &cpu->env; ++ cpu_states[id] = env; ++ env->CSR_TMID |= id; ++ ++ lsms = LoongarchMACHINE(machine); ++ lsms->reset_info[id] = g_malloc0(sizeof(ResetData)); ++ lsms->reset_info[id]->cpu = cpu; ++ lsms->reset_info[id]->vector = env->active_tc.PC; ++ qemu_register_reset(slave_cpu_reset, lsms->reset_info[id]); ++ ++ /* Init CPU internal devices */ ++ cpu_init_irq(cpu); ++ cpu_loongarch_clock_init(cpu); ++ ++ smp_cpus += 1; ++ if (lsms->fw_cfg) { ++ fw_cfg_modify_i16(lsms->fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus); ++ } ++ cpu_init_ipi(lsms, env->irq[12], id); ++ cpu_init_apic(lsms, env, id); ++ ++ return cpu; ++} ++ ++static void fw_cfg_boot_set(void *opaque, const char *boot_device, ++ Error **errp) ++{ ++ fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]); ++} ++ ++static FWCfgState *loongarch_fw_cfg_init(ram_addr_t ram_size, ++ LoongarchMachineState *lsms) ++{ ++ FWCfgState *fw_cfg; ++ uint64_t *numa_fw_cfg; ++ int i; ++ const CPUArchIdList *cpus; ++ MachineClass *mc = MACHINE_GET_CLASS(lsms); ++ MachineState *ms = MACHINE(OBJECT(lsms)); ++ int max_cpus = ms->smp.max_cpus; ++ int smp_cpus = ms->smp.cpus; ++ int nb_numa_nodes = ms->numa_state->num_nodes; ++ NodeInfo *numa_info = ms->numa_state->nodes; ++ ++ fw_cfg = fw_cfg_init_mem_wide(FW_CFG_ADDR + 8, FW_CFG_ADDR, 8, 0, NULL); ++ fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus); ++ fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); ++ fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus); ++ ++ /* ++ * allocate memory for the NUMA channel: one (64bit) word for the number ++ * of nodes, one word for each VCPU->node and one word for each node to ++ * hold the amount of memory. ++ */ ++ numa_fw_cfg = g_new0(uint64_t, 1 + max_cpus + nb_numa_nodes); ++ numa_fw_cfg[0] = cpu_to_le64(nb_numa_nodes); ++ cpus = mc->possible_cpu_arch_ids(MACHINE(lsms)); ++ for (i = 0; i < cpus->len; i++) { ++ unsigned int apic_id = cpus->cpus[i].arch_id; ++ assert(apic_id < max_cpus); ++ numa_fw_cfg[apic_id + 1] = cpu_to_le64(cpus->cpus[i].props.node_id); ++ } ++ for (i = 0; i < nb_numa_nodes; i++) { ++ numa_fw_cfg[max_cpus + 1 + i] = cpu_to_le64(numa_info[i].node_mem); ++ } ++ fw_cfg_add_bytes(fw_cfg, FW_CFG_NUMA, numa_fw_cfg, ++ (1 + max_cpus + nb_numa_nodes) * sizeof(*numa_fw_cfg)); ++ ++ qemu_register_boot_set(fw_cfg_boot_set, fw_cfg); ++ return fw_cfg; ++} ++ ++static void loongarch_build_smbios(LoongarchMachineState *lsms) ++{ ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ MachineState *ms = MACHINE(OBJECT(lsms)); ++ uint8_t *smbios_tables, *smbios_anchor; ++ size_t smbios_tables_len, smbios_anchor_len; ++ const char *product = "QEMU Virtual Machine"; ++ ms->smp.cores = 4; ++ ++ if (!lsms->fw_cfg) { ++ return; ++ } ++ ++ if (kvm_enabled()) { ++ if (strstr(lsmc->cpu_name, "5000")) { ++ product = "KVM"; ++ } ++ } else { ++ product = "Loongarch-3A5K-7A1000-TCG"; ++ } ++ ++ smbios_set_defaults("Loongson", product, lsmc->cpu_name, false, true, ++ SMBIOS_ENTRY_POINT_30); ++ ++ smbios_get_tables(ms, NULL, 0, &smbios_tables, &smbios_tables_len, ++ &smbios_anchor, &smbios_anchor_len, &error_fatal); ++ ++ if (smbios_anchor) { ++ fw_cfg_add_file(lsms->fw_cfg, "etc/smbios/smbios-tables", ++ smbios_tables, smbios_tables_len); ++ fw_cfg_add_file(lsms->fw_cfg, "etc/smbios/smbios-anchor", ++ smbios_anchor, smbios_anchor_len); ++ } ++} ++ ++static void loongarch_machine_done(Notifier *notifier, void *data) ++{ ++ LoongarchMachineState *lsms = ++ container_of(notifier, LoongarchMachineState, machine_done); ++ ++ platform_bus_add_all_fdt_nodes( ++ lsms->fdt, NULL, VIRT_PLATFORM_BUS_BASEADDRESS, VIRT_PLATFORM_BUS_SIZE, ++ VIRT_PLATFORM_BUS_IRQ); ++ ++ qemu_fdt_dumpdtb(lsms->fdt, lsms->fdt_size); ++ /* load fdt */ ++ MemoryRegion *fdt_rom = g_new(MemoryRegion, 1); ++ memory_region_init_rom(fdt_rom, NULL, "fdt", LS_FDT_SIZE, &error_fatal); ++ memory_region_add_subregion(get_system_memory(), LS_FDT_BASE, fdt_rom); ++ rom_add_blob_fixed("fdt", lsms->fdt, lsms->fdt_size, LS_FDT_BASE); ++ ++ loongarch_acpi_setup(); ++ loongarch_build_smbios(lsms); ++} ++ ++#ifdef CONFIG_TCG ++#define FEATURE_REG 0x1fe00008 ++#define VENDOR_REG 0x1fe00010 ++#define CPUNAME_REG 0x1fe00020 ++#define OTHER_FUNC_REG 0x1fe00420 ++#define _str(x) #x ++#define str(x) _str(x) ++#define SIMPLE_OPS(ADDR, SIZE) \ ++ ({ \ ++ MemoryRegion *iomem = g_new(MemoryRegion, 1); \ ++ memory_region_init_io(iomem, NULL, &loongarch_qemu_ops, (void *)ADDR, \ ++ str(ADDR), SIZE); \ ++ memory_region_add_subregion_overlap(address_space_mem, ADDR, iomem, \ ++ 1); \ ++ }) ++ ++static int reg180; ++ ++static void loongarch_qemu_write(void *opaque, hwaddr addr, uint64_t val, ++ unsigned size) ++{ ++ addr = ((hwaddr)(long)opaque) + addr; ++ addr = addr & 0xffffffff; ++ switch (addr) { ++ case 0x1fe00180: ++ reg180 = val; ++ break; ++ } ++} ++ ++static uint64_t loongarch_qemu_read(void *opaque, hwaddr addr, unsigned size) ++{ ++ uint64_t feature = 0UL; ++ addr = ((hwaddr)(long)opaque) + addr; ++ addr = addr & 0xffffffff; ++ switch (addr) { ++ case 0x1fe00180: ++ return reg180; ++ case 0x1001041c: ++ return 0xa800; ++ case FEATURE_REG: ++ feature |= 1UL << 2 | 1UL << 3 | 1UL << 4 | 1UL << 11; ++ return feature; ++ case VENDOR_REG: ++ return *(uint64_t *)"Loongson-3A5000"; ++ case CPUNAME_REG: ++ return *(uint64_t *)"3A5000"; ++ case 0x10013ffc: ++ return 0x80; ++ } ++ return 0; ++} ++ ++static const MemoryRegionOps loongarch_qemu_ops = { ++ .read = loongarch_qemu_read, ++ .write = loongarch_qemu_write, ++ .endianness = DEVICE_NATIVE_ENDIAN, ++ .valid = { ++ .min_access_size = 4, ++ .max_access_size = 8, ++ }, ++ .impl = { ++ .min_access_size = 4, ++ .max_access_size = 8, ++ }, ++}; ++#endif ++ ++static void loongarch_system_flash_cleanup_unused(LoongarchMachineState *lsms) ++{ ++ char *prop_name; ++ int i; ++ Object *dev_obj; ++ ++ for (i = 0; i < ARRAY_SIZE(lsms->flash); i++) { ++ dev_obj = OBJECT(lsms->flash[i]); ++ if (!object_property_get_bool(dev_obj, "realized", &error_abort)) { ++ prop_name = g_strdup_printf("pflash%d", i); ++ object_property_del(OBJECT(lsms), prop_name); ++ g_free(prop_name); ++ object_unparent(dev_obj); ++ lsms->flash[i] = NULL; ++ } ++ } ++} ++ ++static bool loongarch_system_flash_init(LoongarchMachineState *lsms) ++{ ++ int i = 0; ++ int64_t size = 0; ++ PFlashCFI01 *pflash = NULL; ++ BlockBackend *pflash_blk; ++ ++ for (i = 0; i < ARRAY_SIZE(lsms->flash); i++) { ++ pflash_blk = NULL; ++ pflash = NULL; ++ ++ pflash = lsms->flash[i]; ++ pflash_cfi01_legacy_drive(pflash, drive_get(IF_PFLASH, 0, i)); ++ ++ pflash_blk = pflash_cfi01_get_blk(pflash); ++ /*The pflash0 must be exist, or not support boot by pflash*/ ++ if (pflash_blk == NULL) { ++ if (i == 0) { ++ return false; ++ } else { ++ break; ++ } ++ } ++ ++ size = blk_getlength(pflash_blk); ++ if (size == 0 || size % FLASH_SECTOR_SIZE != 0) { ++ error_report("system firmware block device %s has invalid size " ++ "%" PRId64, ++ blk_name(pflash_blk), size); ++ error_report("its size must be a non-zero multiple of 0x%x", ++ FLASH_SECTOR_SIZE); ++ exit(1); ++ } ++ qdev_prop_set_uint32(DEVICE(pflash), "num-blocks", ++ size / FLASH_SECTOR_SIZE); ++ sysbus_realize_and_unref(SYS_BUS_DEVICE(pflash), &error_fatal); ++ if (i == 0) { ++ sysbus_mmio_map(SYS_BUS_DEVICE(pflash), 0, LS_BIOS_BASE); ++ } else { ++ sysbus_mmio_map_overlap(SYS_BUS_DEVICE(pflash), 0, ++ LS_BIOS_VAR_BASE, 1); ++ } ++ } ++ ++ return true; ++} ++ ++static void ls3a5k_bios_init(LoongarchMachineState *lsms, ram_addr_t ram_size, ++ uint64_t highram_size, uint64_t phyAddr_initrd, ++ const char *kernel_filename, ++ const char *kernel_cmdline, ++ const char *initrd_filename) ++{ ++ MemoryRegion *bios; ++ bool fw_cfg_used = false; ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ char *filename; ++ int bios_size; ++ const char *bios_name; ++ ++ bios_name = MACHINE(lsms)->firmware; ++ if (kernel_filename) { ++ loaderparams.ram_size = ram_size; ++ loaderparams.kernel_filename = kernel_filename; ++ loaderparams.kernel_cmdline = kernel_cmdline; ++ loaderparams.initrd_filename = initrd_filename; ++ } ++ ++ if (loongarch_system_flash_init(lsms)) { ++ fw_cfg_used = true; ++ } else { ++ bios = g_new(MemoryRegion, 1); ++ memory_region_init_ram(bios, NULL, "loongarch.bios", LS_BIOS_SIZE, ++ &error_fatal); ++ memory_region_set_readonly(bios, true); ++ memory_region_add_subregion(get_system_memory(), LS_BIOS_BASE, bios); ++ ++ /* BIOS load */ ++ if (bios_name) { ++ if (access(bios_name, R_OK) == 0) { ++ load_image_targphys(bios_name, LS_BIOS_BASE, LS_BIOS_SIZE); ++ } else { ++ filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); ++ load_image_targphys(filename, LS_BIOS_BASE, LS_BIOS_SIZE); ++ g_free(filename); ++ } ++ fw_cfg_used = true; ++ } else { ++ if (strstr(lsmc->cpu_name, "5000")) { ++ bios_size = sizeof(ls3a5k_aui_boot_code); ++ rom_add_blob_fixed("bios", ls3a5k_aui_boot_code, bios_size, ++ LS_BIOS_BASE); ++ } ++ ++ if (kernel_filename) { ++ lsms->reset_info[0]->vector = load_kernel(); ++ } ++ } ++ } ++ ++ loongarch_system_flash_cleanup_unused(lsms); ++ ++ if (fw_cfg_used) { ++ lsms->fw_cfg = loongarch_fw_cfg_init(ram_size, lsms); ++ rom_set_fw(lsms->fw_cfg); ++ fw_conf_init(ram_size); ++ rom_add_blob_fixed("fw_conf", (void *)&fw_config, sizeof(fw_config), ++ FW_CONF_ADDR); ++ ++ if (kernel_filename) { ++ fw_cfg_add_kernel_info(lsms->fw_cfg, highram_size, phyAddr_initrd); ++ } ++ } ++ ++ if (lsms->fw_cfg != NULL) { ++ fw_cfg_add_file(lsms->fw_cfg, "etc/memmap", la_memmap_table, ++ sizeof(struct la_memmap_entry) * (la_memmap_entries)); ++ } ++ ++ return; ++} ++ ++static void create_fdt(LoongarchMachineState *lsms) ++{ ++ lsms->fdt = create_device_tree(&lsms->fdt_size); ++ if (!lsms->fdt) { ++ error_report("create_device_tree() failed"); ++ exit(1); ++ } ++ ++ /* Header */ ++ qemu_fdt_setprop_string(lsms->fdt, "/", "compatible", ++ "linux,dummy-loongson3"); ++ qemu_fdt_setprop_cell(lsms->fdt, "/", "#address-cells", 0x2); ++ qemu_fdt_setprop_cell(lsms->fdt, "/", "#size-cells", 0x2); ++} ++ ++static void fdt_add_cpu_nodes(const LoongarchMachineState *lsms) ++{ ++ int num; ++ const MachineState *ms = MACHINE(lsms); ++ int smp_cpus = ms->smp.cpus; ++ ++ qemu_fdt_add_subnode(lsms->fdt, "/cpus"); ++ qemu_fdt_setprop_cell(lsms->fdt, "/cpus", "#address-cells", 0x1); ++ qemu_fdt_setprop_cell(lsms->fdt, "/cpus", "#size-cells", 0x0); ++ ++ /* cpu nodes */ ++ for (num = smp_cpus - 1; num >= 0; num--) { ++ char *nodename = g_strdup_printf("/cpus/cpu@%d", num); ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(qemu_get_cpu(num)); ++ ++ qemu_fdt_add_subnode(lsms->fdt, nodename); ++ qemu_fdt_setprop_string(lsms->fdt, nodename, "device_type", "cpu"); ++ qemu_fdt_setprop_string(lsms->fdt, nodename, "compatible", ++ cpu->dtb_compatible); ++ qemu_fdt_setprop_cell(lsms->fdt, nodename, "reg", num); ++ qemu_fdt_setprop_cell(lsms->fdt, nodename, "phandle", ++ qemu_fdt_alloc_phandle(lsms->fdt)); ++ g_free(nodename); ++ } ++ ++ /*cpu map */ ++ qemu_fdt_add_subnode(lsms->fdt, "/cpus/cpu-map"); ++ ++ for (num = smp_cpus - 1; num >= 0; num--) { ++ char *cpu_path = g_strdup_printf("/cpus/cpu@%d", num); ++ char *map_path; ++ ++ if (ms->smp.threads > 1) { ++ map_path = ++ g_strdup_printf("/cpus/cpu-map/socket%d/core%d/thread%d", ++ num / (ms->smp.cores * ms->smp.threads), ++ (num / ms->smp.threads) % ms->smp.cores, ++ num % ms->smp.threads); ++ } else { ++ map_path = ++ g_strdup_printf("/cpus/cpu-map/socket%d/core%d", ++ num / ms->smp.cores, num % ms->smp.cores); ++ } ++ qemu_fdt_add_path(lsms->fdt, map_path); ++ qemu_fdt_setprop_phandle(lsms->fdt, map_path, "cpu", cpu_path); ++ ++ g_free(map_path); ++ g_free(cpu_path); ++ } ++} ++ ++static void fdt_add_fw_cfg_node(const LoongarchMachineState *lsms) ++{ ++ char *nodename; ++ hwaddr base = FW_CFG_ADDR; ++ ++ nodename = g_strdup_printf("/fw_cfg@%" PRIx64, base); ++ qemu_fdt_add_subnode(lsms->fdt, nodename); ++ qemu_fdt_setprop_string(lsms->fdt, nodename, "compatible", ++ "qemu,fw-cfg-mmio"); ++ qemu_fdt_setprop_sized_cells(lsms->fdt, nodename, "reg", 2, base, 2, 0x8); ++ qemu_fdt_setprop(lsms->fdt, nodename, "dma-coherent", NULL, 0); ++ g_free(nodename); ++} ++ ++static void fdt_add_pcie_node(const LoongarchMachineState *lsms) ++{ ++ char *nodename; ++ hwaddr base_mmio = PCIE_MEMORY_BASE; ++ hwaddr size_mmio = PCIE_MEMORY_SIZE; ++ hwaddr base_pio = LS3A5K_ISA_IO_BASE; ++ hwaddr size_pio = LS_ISA_IO_SIZE; ++ hwaddr base_pcie = LS_PCIECFG_BASE; ++ hwaddr size_pcie = LS_PCIECFG_SIZE; ++ hwaddr base = base_pcie; ++ ++ nodename = g_strdup_printf("/pcie@%" PRIx64, base); ++ qemu_fdt_add_subnode(lsms->fdt, nodename); ++ qemu_fdt_setprop_string(lsms->fdt, nodename, "compatible", ++ "pci-host-ecam-generic"); ++ qemu_fdt_setprop_string(lsms->fdt, nodename, "device_type", "pci"); ++ qemu_fdt_setprop_cell(lsms->fdt, nodename, "#address-cells", 3); ++ qemu_fdt_setprop_cell(lsms->fdt, nodename, "#size-cells", 2); ++ qemu_fdt_setprop_cell(lsms->fdt, nodename, "linux,pci-domain", 0); ++ qemu_fdt_setprop_cells(lsms->fdt, nodename, "bus-range", 0, ++ PCIE_MMCFG_BUS(LS_PCIECFG_SIZE - 1)); ++ qemu_fdt_setprop(lsms->fdt, nodename, "dma-coherent", NULL, 0); ++ qemu_fdt_setprop_sized_cells(lsms->fdt, nodename, "reg", 2, base_pcie, 2, ++ size_pcie); ++ qemu_fdt_setprop_sized_cells(lsms->fdt, nodename, "ranges", 1, ++ FDT_PCI_RANGE_IOPORT, 2, 0, 2, base_pio, 2, ++ size_pio, 1, FDT_PCI_RANGE_MMIO, 2, base_mmio, ++ 2, base_mmio, 2, size_mmio); ++ g_free(nodename); ++} ++ ++static void create_platform_bus(LoongarchMachineState *s, qemu_irq *pic) ++{ ++ DeviceState *dev; ++ SysBusDevice *sysbus; ++ int i; ++ MemoryRegion *sysmem = get_system_memory(); ++ ++ dev = qdev_new(TYPE_PLATFORM_BUS_DEVICE); ++ dev->id = g_strdup(TYPE_PLATFORM_BUS_DEVICE); ++ qdev_prop_set_uint32(dev, "num_irqs", VIRT_PLATFORM_BUS_NUM_IRQS); ++ qdev_prop_set_uint32(dev, "mmio_size", VIRT_PLATFORM_BUS_SIZE); ++ sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); ++ s->platform_bus_dev = dev; ++ ++ sysbus = SYS_BUS_DEVICE(dev); ++ for (i = 0; i < VIRT_PLATFORM_BUS_NUM_IRQS; i++) { ++ int irq = VIRT_PLATFORM_BUS_IRQ + i; ++ sysbus_connect_irq(sysbus, i, pic[irq - LOONGARCH_PCH_IRQ_BASE]); ++ } ++ ++ memory_region_add_subregion(sysmem, VIRT_PLATFORM_BUS_BASEADDRESS, ++ sysbus_mmio_get_region(sysbus, 0)); ++} ++ ++static void ls3a5k_init(MachineState *args) ++{ ++ int i; ++ const char *cpu_model = args->cpu_type; ++ const char *kernel_filename = args->kernel_filename; ++ const char *kernel_cmdline = args->kernel_cmdline; ++ const char *initrd_filename = args->initrd_filename; ++ ++ ram_addr_t ram_size = args->ram_size; ++ MemoryRegion *address_space_mem = get_system_memory(); ++ ram_addr_t offset = 0; ++ MemoryRegion *isa_io = g_new(MemoryRegion, 1); ++ MemoryRegion *isa_mem = g_new(MemoryRegion, 1); ++ MachineState *machine = args; ++ MachineClass *mc = MACHINE_GET_CLASS(machine); ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ int smp_cpus = machine->smp.cpus; ++ int nb_numa_nodes = machine->numa_state->num_nodes; ++ NodeInfo *numa_info = machine->numa_state->nodes; ++ LOONGARCHCPU *cpu; ++ CPULOONGARCHState *env; ++ qemu_irq *ls7a_apic = NULL; ++ qemu_irq *pirq = NULL; ++ PCIBus *pci_bus = NULL; ++ char *ramName = NULL; ++ uint64_t lowram_size = 0, highram_size = 0, phyAddr = 0, memmap_size = 0, ++ highram_end_addr = 0; ++ ++ CPUArchIdList *possible_cpus; ++ if (strstr(lsmc->cpu_name, "5000")) { ++ if (strcmp(cpu_model, LOONGARCH_CPU_TYPE_NAME("Loongson-3A5000")) && ++ strcmp(cpu_model, LOONGARCH_CPU_TYPE_NAME("host"))) { ++ error_report("machine type %s does not match cpu type %s", ++ lsmc->cpu_name, cpu_model); ++ exit(1); ++ } ++ if (kvm_enabled()) { ++ kvm_vm_ioctl(kvm_state, KVM_LARCH_SET_CPUCFG, ls3a5k_cpucfgs); ++ } ++ } ++ ++ create_fdt(lsms); ++ ++ DPRINTF("isa 0x%lx\n", lsmc->isa_io_base); ++ DPRINTF("cpu_name %s bridge_name %s\n", lsmc->cpu_name, lsmc->bridge_name); ++ ++ /* init CPUs */ ++ mc->possible_cpu_arch_ids(machine); ++ possible_cpus = machine->possible_cpus; ++ ++ for (i = 0; i < smp_cpus; i++) { ++ Object *obj = NULL; ++ Error *local_err = NULL; ++ ++ obj = object_new(possible_cpus->cpus[i].type); ++ ++ object_property_set_uint(obj, "id", possible_cpus->cpus[i].arch_id, ++ &local_err); ++ object_property_set_bool(obj, "realized", true, &local_err); ++ ++ object_unref(obj); ++ error_propagate(&error_fatal, local_err); ++ ++ cpu = LOONGARCH_CPU(CPU(obj)); ++ if (cpu == NULL) { ++ fprintf(stderr, "Unable to find CPU definition\n"); ++ exit(1); ++ } ++ ++ env = &cpu->env; ++ cpu_states[i] = env; ++ env->CSR_TMID |= i; ++ ++ lsms->reset_info[i] = g_malloc0(sizeof(ResetData)); ++ lsms->reset_info[i]->cpu = cpu; ++ lsms->reset_info[i]->vector = env->active_tc.PC; ++ if (i == 0) { ++ qemu_register_reset(main_cpu_reset, lsms->reset_info[i]); ++ } else { ++ qemu_register_reset(slave_cpu_reset, lsms->reset_info[i]); ++ } ++ ++ /* Init CPU internal devices */ ++ cpu_init_irq(cpu); ++ cpu_loongarch_clock_init(cpu); ++ cpu_init_ipi(lsms, env->irq[12], i); ++ cpu_init_apic(lsms, env, i); ++ } ++ ++ lsms->hotpluged_cpu_num = 0; ++ fdt_add_cpu_nodes(lsms); ++ env = cpu_states[0]; ++ ++ /* node0 mem*/ ++ phyAddr = (uint64_t)0; ++ MemoryRegion *lowmem = g_new(MemoryRegion, 1); ++ ramName = g_strdup_printf("loongarch_ls3a.node%d.lowram", 0); ++ ++ lowram_size = MIN(ram_size, 256 * 0x100000); ++ memory_region_init_alias(lowmem, NULL, ramName, machine->ram, 0, ++ lowram_size); ++ memory_region_add_subregion(address_space_mem, phyAddr, lowmem); ++ ++ offset += lowram_size; ++ if (nb_numa_nodes > 0) { ++ highram_size = numa_info[0].node_mem - 256 * MiB; ++ if (numa_info[0].node_mem > GiB) { ++ memmap_size = numa_info[0].node_mem - GiB; ++ la_memmap_add_entry(0xc0000000ULL, memmap_size, SYSTEM_RAM); ++ } ++ } else { ++ highram_size = ram_size - 256 * MiB; ++ if (ram_size > GiB) { ++ memmap_size = ram_size - GiB; ++ la_memmap_add_entry(0xc0000000ULL, memmap_size, SYSTEM_RAM); ++ } ++ } ++ ++ phyAddr = (uint64_t)0x90000000; ++ MemoryRegion *highmem = g_new(MemoryRegion, 1); ++ ramName = g_strdup_printf("loongarch_ls3a.node%d.highram", 0); ++ memory_region_init_alias(highmem, NULL, ramName, machine->ram, offset, ++ highram_size); ++ memory_region_add_subregion(address_space_mem, phyAddr, highmem); ++ offset += highram_size; ++ phyAddr += highram_size; ++ ++ /* initrd address use high mem from high to low */ ++ highram_end_addr = phyAddr; ++ /* node1~ nodemax */ ++ for (i = 1; i < nb_numa_nodes; i++) { ++ MemoryRegion *nodemem = g_new(MemoryRegion, 1); ++ ramName = g_strdup_printf("loongarch_ls3a.node%d.ram", i); ++ memory_region_init_alias(nodemem, NULL, ramName, machine->ram, offset, ++ numa_info[i].node_mem); ++ memory_region_add_subregion(address_space_mem, phyAddr, nodemem); ++ la_memmap_add_entry(phyAddr, numa_info[i].node_mem, SYSTEM_RAM); ++ offset += numa_info[i].node_mem; ++ phyAddr += numa_info[i].node_mem; ++ } ++ ++ fdt_add_fw_cfg_node(lsms); ++ ls3a5k_bios_init(lsms, ram_size, highram_size, highram_end_addr, ++ kernel_filename, kernel_cmdline, initrd_filename); ++ ++ lsms->machine_done.notify = loongarch_machine_done; ++ qemu_add_machine_init_done_notifier(&lsms->machine_done); ++ /*vmstate_register_ram_global(bios);*/ ++ ++ /* initialize hotplug memory address space */ ++ lsms->hotplug_memory_size = 0; ++ ++ /* always allocate the device memory information */ ++ machine->device_memory = g_malloc0(sizeof(*machine->device_memory)); ++ if (machine->ram_size < machine->maxram_size) { ++ int max_memslots; ++ ++ lsms->hotplug_memory_size = machine->maxram_size - machine->ram_size; ++ /* ++ * Limit the number of hotpluggable memory slots to half the number ++ * slots that KVM supports, leaving the other half for PCI and other ++ * devices. However ensure that number of slots doesn't drop below 32. ++ */ ++ max_memslots = LOONGARCH_MAX_RAM_SLOTS; ++ if (kvm_enabled()) { ++ max_memslots = kvm_get_max_memslots() / 2; ++ } ++ ++ if (machine->ram_slots == 0) ++ machine->ram_slots = ++ lsms->hotplug_memory_size / LOONGARCH_HOTPLUG_MEM_ALIGN; ++ ++ if (machine->ram_slots > max_memslots) { ++ error_report("Specified number of memory slots %" PRIu64 ++ " exceeds max supported %d", ++ machine->ram_slots, max_memslots); ++ exit(1); ++ } ++ ++ lsms->ram_slots = machine->ram_slots; ++ ++ machine->device_memory->base = get_hotplug_membase(machine->ram_size); ++ memory_region_init(&machine->device_memory->mr, OBJECT(lsms), ++ "device-memory", lsms->hotplug_memory_size); ++ memory_region_add_subregion(get_system_memory(), ++ machine->device_memory->base, ++ &machine->device_memory->mr); ++ } ++ ++ memory_region_init_alias(isa_io, NULL, "isa-io", get_system_io(), 0, ++ LS_ISA_IO_SIZE); ++ memory_region_init(isa_mem, NULL, "isa-mem", PCIE_MEMORY_SIZE); ++ memory_region_add_subregion(get_system_memory(), lsmc->isa_io_base, ++ isa_io); ++ memory_region_add_subregion(get_system_memory(), PCIE_MEMORY_BASE, ++ isa_mem); ++ ++ if (!strcmp(lsmc->bridge_name, "ls7a")) { ++ /*Initialize the 7A IO interrupt subsystem*/ ++ DeviceState *ls7a_dev; ++ lsms->apic_xrupt_override = kvm_irqchip_in_kernel(); ++ ls7a_apic = ls3a_intctl_init(machine, cpu_states); ++ if (!ls7a_apic) { ++ perror("Init 7A APIC failed\n"); ++ exit(1); ++ } ++ pci_bus = ls7a_init(machine, ls7a_apic, &ls7a_dev); ++ ++ object_property_add_link( ++ OBJECT(machine), LOONGARCH_MACHINE_ACPI_DEVICE_PROP, ++ TYPE_HOTPLUG_HANDLER, (Object **)&lsms->acpi_dev, ++ object_property_allow_set_link, OBJ_PROP_LINK_STRONG); ++ object_property_set_link(OBJECT(machine), ++ LOONGARCH_MACHINE_ACPI_DEVICE_PROP, ++ OBJECT(ls7a_dev), &error_abort); ++ ++ create_platform_bus(lsms, ls7a_apic); ++ ++#ifdef CONFIG_KVM ++ if (kvm_enabled()) { ++ kvm_direct_msi_allowed = ++ (kvm_check_extension(kvm_state, KVM_CAP_SIGNAL_MSI) > 0); ++ } else { ++ kvm_direct_msi_allowed = 0; ++ } ++ msi_nonbroken = kvm_direct_msi_allowed; ++#else ++ msi_nonbroken = true; ++#endif ++ sysbus_create_simple("ls7a_rtc", LS7A_RTC_REG_BASE, ++ ls7a_apic[LS7A_RTC_IRQ - LOONGARCH_PCH_IRQ_BASE]); ++ } ++ ++ /*Initialize the CPU serial device*/ ++ ++ if (serial_hd(0)) { ++ pirq = qemu_allocate_irqs( ++ legacy_set_irq, ++ ls7a_apic + (LS7A_UART_IRQ - LOONGARCH_PCH_IRQ_BASE), 1); ++ serial_mm_init(address_space_mem, LS7A_UART_BASE, 0, pirq[0], 115200, ++ serial_hd(0), DEVICE_NATIVE_ENDIAN); ++ } ++ ++ /*network card*/ ++ network_init(pci_bus); ++ /* VGA setup. Don't bother loading the bios. */ ++ pci_vga_init(pci_bus); ++ ++ sysbus_realize_and_unref(SYS_BUS_DEVICE(qdev_new("iocsr")), &error_fatal); ++ ++#ifdef CONFIG_TCG ++ int nb_nodes = (smp_cpus - 1) / 4; ++ for (i = 0; i <= nb_nodes; i++) { ++ uint64_t off = (uint64_t)i << 44; ++ SIMPLE_OPS(((hwaddr)0x1fe00180 | off), 0x8); ++ SIMPLE_OPS(((hwaddr)0x1fe0019c | off), 0x8); ++ SIMPLE_OPS(((hwaddr)0x1fe001d0 | off), 0x8); ++ SIMPLE_OPS(((hwaddr)FEATURE_REG | off), 0x8); ++ SIMPLE_OPS(((hwaddr)VENDOR_REG | off), 0x8); ++ SIMPLE_OPS(((hwaddr)CPUNAME_REG | off), 0x8); ++ SIMPLE_OPS(((hwaddr)OTHER_FUNC_REG | off), 0x8); ++ } ++ ++ SIMPLE_OPS(0x1001041c, 0x4); ++ SIMPLE_OPS(0x10002000, 0x14); ++ SIMPLE_OPS(0x10013ffc, 0x4); ++#endif ++ ++ fdt_add_pcie_node(lsms); ++} ++ ++static const CPUArchIdList *loongarch_possible_cpu_arch_ids(MachineState *ms) ++{ ++ int i; ++ int max_cpus = ms->smp.max_cpus; ++ ++ if (ms->possible_cpus) { ++ /* ++ * make sure that max_cpus hasn't changed since the first use, i.e. ++ * -smp hasn't been parsed after it ++ */ ++ assert(ms->possible_cpus->len == max_cpus); ++ return ms->possible_cpus; ++ } ++ ++ ms->possible_cpus = ++ g_malloc0(sizeof(CPUArchIdList) + sizeof(CPUArchId) * max_cpus); ++ ms->possible_cpus->len = max_cpus; ++ for (i = 0; i < ms->possible_cpus->len; i++) { ++ ms->possible_cpus->cpus[i].type = ms->cpu_type; ++ ms->possible_cpus->cpus[i].vcpus_count = 1; ++ ms->possible_cpus->cpus[i].props.has_core_id = true; ++ ms->possible_cpus->cpus[i].props.core_id = i; ++ ms->possible_cpus->cpus[i].arch_id = i; ++ } ++ return ms->possible_cpus; ++} ++ ++static PFlashCFI01 *loongarch_pflash_create(LoongarchMachineState *lsms, ++ const char *name, ++ const char *alias_prop_name) ++{ ++ DeviceState *dev = qdev_new(TYPE_PFLASH_CFI01); ++ ++ qdev_prop_set_uint64(dev, "sector-length", FLASH_SECTOR_SIZE); ++ qdev_prop_set_uint8(dev, "width", 1); ++ qdev_prop_set_string(dev, "name", name); ++ object_property_add_child(OBJECT(lsms), name, OBJECT(dev)); ++ object_property_add_alias(OBJECT(lsms), alias_prop_name, OBJECT(dev), ++ "drive"); ++ return PFLASH_CFI01(dev); ++} ++ ++static void loongarch_system_flash_create(LoongarchMachineState *lsms) ++{ ++ lsms->flash[0] = loongarch_pflash_create(lsms, "system.flash0", "pflash0"); ++ lsms->flash[1] = loongarch_pflash_create(lsms, "system.flash1", "pflash1"); ++} ++ ++static void loongarch_machine_initfn(Object *obj) ++{ ++ LoongarchMachineState *lsms = LoongarchMACHINE(obj); ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ lsms->acpi_build_enabled = lsmc->has_acpi_build; ++ loongarch_system_flash_create(lsms); ++ lsms->oem_id = g_strndup(EFI_ACPI_OEM_ID, 6); ++ lsms->oem_table_id = g_strndup(EFI_ACPI_OEM_TABLE_ID, 6); ++} ++ ++static void ls3a5k_ls7a_machine_options(MachineClass *m) ++{ ++ char *cpu_name = get_host_cpu_model_name(); ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_CLASS(m); ++ m->desc = "Loongarch3a5k LS7A1000 machine"; ++ m->max_cpus = LOONGARCH_MAX_VCPUS; ++ m->alias = "loongson7a"; ++ m->is_default = 1; ++ lsmc->isa_io_base = LS3A5K_ISA_IO_BASE; ++ lsmc->pciecfg_base = LS_PCIECFG_BASE; ++ lsmc->ls7a_ioapic_reg_base = LS3A5K_LS7A_IOAPIC_REG_BASE; ++ lsmc->node_shift = 44; ++ strncpy(lsmc->cpu_name, cpu_name, sizeof(lsmc->cpu_name) - 1); ++ lsmc->cpu_name[sizeof(lsmc->cpu_name) - 1] = 0; ++ strncpy(lsmc->bridge_name, "ls7a", sizeof(lsmc->bridge_name) - 1); ++ lsmc->bridge_name[sizeof(lsmc->bridge_name) - 1] = 0; ++ compat_props_add(m->compat_props, loongarch_compat, loongarch_compat_len); ++} ++ ++static void ls3a_board_reset(MachineState *ms) ++{ ++ qemu_devices_reset(); ++#ifdef CONFIG_KVM ++ struct loongarch_kvm_irqchip *chip; ++ int length; ++ ++ if (!kvm_enabled()) { ++ return; ++ } ++ length = sizeof(struct loongarch_kvm_irqchip) + ++ sizeof(struct loongarch_gipiState); ++ chip = g_malloc0(length); ++ memset(chip, 0, length); ++ chip->chip_id = KVM_IRQCHIP_LS3A_GIPI; ++ chip->len = length; ++ kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, chip); ++ ++ length = sizeof(struct loongarch_kvm_irqchip) + ++ sizeof(struct ls7a_ioapic_state); ++ chip = g_realloc(chip, length); ++ memset(chip, 0, length); ++ chip->chip_id = KVM_IRQCHIP_LS7A_IOAPIC; ++ chip->len = length; ++ kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, chip); ++ ++ g_free(chip); ++#endif ++} ++ ++static CpuInstanceProperties ls3a_cpu_index_to_props(MachineState *ms, ++ unsigned cpu_index) ++{ ++ MachineClass *mc = MACHINE_GET_CLASS(ms); ++ const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(ms); ++ ++ assert(cpu_index < possible_cpus->len); ++ return possible_cpus->cpus[cpu_index].props; ++} ++ ++static int64_t ls3a_get_default_cpu_node_id(const MachineState *ms, int idx) ++{ ++ int nb_numa_nodes = ms->numa_state->num_nodes; ++ int smp_cores = ms->smp.cores; ++ return idx / smp_cores % nb_numa_nodes; ++} ++ ++static void loongarch_class_init(ObjectClass *oc, void *data) ++{ ++ MachineClass *mc = MACHINE_CLASS(oc); ++ HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc); ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_CLASS(oc); ++ ++ lsmc->get_hotplug_handler = mc->get_hotplug_handler; ++ lsmc->has_acpi_build = true; ++ mc->get_hotplug_handler = loongarch_get_hotpug_handler; ++ mc->has_hotpluggable_cpus = true; ++ mc->cpu_index_to_instance_props = ls3a_cpu_index_to_props; ++ mc->possible_cpu_arch_ids = loongarch_possible_cpu_arch_ids; ++ mc->get_default_cpu_node_id = ls3a_get_default_cpu_node_id; ++ mc->default_ram_size = 1 * GiB; ++ mc->default_cpu_type = LOONGARCH_CPU_TYPE_NAME("Loongson-3A5000"); ++ mc->default_ram_id = "loongarch_ls3a.ram"; ++ ++#ifdef CONFIG_TPM ++ machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS); ++#endif ++ ++ mc->reset = ls3a_board_reset; ++ mc->max_cpus = LOONGARCH_MAX_VCPUS; ++ hc->pre_plug = loongarch_machine_device_pre_plug; ++ hc->plug = loongarch_machine_device_plug; ++ hc->unplug = longson_machine_device_unplug; ++ hc->unplug_request = loongarch_machine_device_unplug_request; ++ ++ object_class_property_add(oc, "acpi", "OnOffAuto", loongarch_get_acpi, ++ loongarch_set_acpi, NULL, NULL); ++ object_class_property_set_description(oc, "acpi", "Enable ACPI"); ++} ++ ++static const TypeInfo loongarch_info = { ++ .name = TYPE_LOONGARCH_MACHINE, ++ .parent = TYPE_MACHINE, ++ .abstract = true, ++ .instance_size = sizeof(LoongarchMachineState), ++ .instance_init = loongarch_machine_initfn, ++ .class_size = sizeof(LoongarchMachineClass), ++ .class_init = loongarch_class_init, ++ .interfaces = (InterfaceInfo[]){ { TYPE_HOTPLUG_HANDLER }, {} }, ++}; ++ ++static void loongarch_machine_register_types(void) ++{ ++ type_register_static(&loongarch_info); ++} ++ ++type_init(loongarch_machine_register_types) ++ ++ DEFINE_LS3A5K_MACHINE(loongson7a_v1_0, "loongson7a_v1.0", ++ ls3a5k_ls7a_machine_options); +diff --git a/hw/loongarch/larch_hotplug.c b/hw/loongarch/larch_hotplug.c +new file mode 100644 +index 0000000000..52f13af7b3 +--- /dev/null ++++ b/hw/loongarch/larch_hotplug.c +@@ -0,0 +1,377 @@ ++/* ++ * Hotplug emulation on Loongarch system. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2 of the License, or (at your option) any later version. ++ * ++ * This library is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qapi/error.h" ++#include "qemu-common.h" ++#include "qemu/queue.h" ++#include "qemu/units.h" ++#include "qemu/cutils.h" ++#include "qemu/bcd.h" ++#include "hw/hotplug.h" ++#include "hw/loongarch/cpudevs.h" ++#include "hw/mem/memory-device.h" ++#include "sysemu/numa.h" ++#include "sysemu/cpus.h" ++#include "hw/loongarch/larch.h" ++#include "hw/cpu/core.h" ++#include "hw/nvram/fw_cfg.h" ++#include "hw/platform-bus.h" ++ ++/* find cpu slot in machine->possible_cpus by core_id */ ++static CPUArchId *loongarch_find_cpu_slot(MachineState *ms, uint32_t id, ++ int *idx) ++{ ++ int index = id; ++ ++ if (index >= ms->possible_cpus->len) { ++ return NULL; ++ } ++ if (idx) { ++ *idx = index; ++ } ++ return &ms->possible_cpus->cpus[index]; ++} ++ ++static void loongarch_memory_plug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ Error *local_err = NULL; ++ LoongarchMachineState *lsms = LoongarchMACHINE(hotplug_dev); ++ HotplugHandlerClass *hhc; ++ uint64_t size; ++ ++ size = memory_device_get_region_size(MEMORY_DEVICE(dev), &error_abort); ++ if (size % LOONGARCH_HOTPLUG_MEM_ALIGN) { ++ error_setg(&local_err, ++ "Hotplugged memory size must be a multiple of " ++ "%lld MB", ++ LOONGARCH_HOTPLUG_MEM_ALIGN / MiB); ++ goto out; ++ } ++ ++ pc_dimm_plug(PC_DIMM(dev), MACHINE(lsms)); ++ ++ hhc = HOTPLUG_HANDLER_GET_CLASS(lsms->acpi_dev); ++ hhc->plug(HOTPLUG_HANDLER(lsms->acpi_dev), dev, &error_abort); ++out: ++ error_propagate(errp, local_err); ++} ++ ++static void loongarch_memory_unplug_request(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ Error *local_err = NULL; ++ HotplugHandlerClass *hhc; ++ LoongarchMachineState *lsms = LoongarchMACHINE(hotplug_dev); ++ ++ if (!lsms->acpi_dev || !loongarch_is_acpi_enabled(lsms)) { ++ error_setg( ++ &local_err, ++ "memory hotplug is not enabled: missing acpi device or acpi disabled"); ++ goto out; ++ } ++ hhc = HOTPLUG_HANDLER_GET_CLASS(lsms->acpi_dev); ++ hhc->unplug_request(HOTPLUG_HANDLER(lsms->acpi_dev), dev, &local_err); ++ ++out: ++ error_propagate(errp, local_err); ++} ++ ++static void loongarch_cpu_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, ++ Error **errp) ++{ ++ CPUArchId *found_cpu; ++ HotplugHandlerClass *hhc; ++ Error *local_err = NULL; ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(dev); ++ MachineState *machine = MACHINE(OBJECT(hotplug_dev)); ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ ++ hhc = HOTPLUG_HANDLER_GET_CLASS(lsms->acpi_dev); ++ hhc->unplug(HOTPLUG_HANDLER(lsms->acpi_dev), dev, &local_err); ++ ++ if (local_err) { ++ goto out; ++ } ++ ++ loongarch_cpu_destroy(machine, cpu); ++ ++ found_cpu = loongarch_find_cpu_slot(MACHINE(lsms), cpu->id, NULL); ++ found_cpu->cpu = NULL; ++ object_unparent(OBJECT(dev)); ++ lsms->hotpluged_cpu_num -= 1; ++out: ++ error_propagate(errp, local_err); ++} ++ ++static void loongarch_memory_unplug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ Error *local_err = NULL; ++ HotplugHandlerClass *hhc; ++ LoongarchMachineState *lsms = LoongarchMACHINE(hotplug_dev); ++ ++ hhc = HOTPLUG_HANDLER_GET_CLASS(lsms->acpi_dev); ++ hhc->unplug(HOTPLUG_HANDLER(lsms->acpi_dev), dev, &local_err); ++ ++ if (local_err) { ++ goto out; ++ } ++ ++ pc_dimm_unplug(PC_DIMM(dev), MACHINE(hotplug_dev)); ++ object_unparent(OBJECT(dev)); ++ ++out: ++ error_propagate(errp, local_err); ++} ++ ++static void loongarch_cpu_pre_plug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ MachineState *ms = MACHINE(OBJECT(hotplug_dev)); ++ MachineClass *mc = MACHINE_GET_CLASS(hotplug_dev); ++ LoongarchMachineState *lsms = LoongarchMACHINE(ms); ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(dev); ++ CPUArchId *cpu_slot; ++ Error *local_err = NULL; ++ int index; ++ int free_index = lsms->hotpluged_cpu_num + ms->smp.cpus; ++ int max_cpus = ms->smp.max_cpus; ++ ++ if (dev->hotplugged && !mc->has_hotpluggable_cpus) { ++ error_setg(&local_err, "CPU hotplug not supported for this machine"); ++ goto out; ++ } ++ ++ if (!object_dynamic_cast(OBJECT(cpu), ms->cpu_type)) { ++ error_setg(errp, "Invalid CPU type, expected cpu type: '%s'", ++ ms->cpu_type); ++ return; ++ } ++ ++ /* if ID is not set, set it based on core properties */ ++ if (cpu->id == UNASSIGNED_CPU_ID) { ++ if ((cpu->core_id) > (max_cpus - 1)) { ++ error_setg(errp, "Invalid CPU core-id: %u must be in range 0:%u", ++ cpu->core_id, max_cpus - 1); ++ return; ++ } ++ ++ if (free_index > (max_cpus - 1)) { ++ error_setg(errp, "The maximum number of CPUs cannot exceed %u.", ++ max_cpus); ++ return; ++ } ++ ++ if (cpu->core_id != free_index) { ++ error_setg(errp, "Invalid CPU core-id: %u must be :%u", ++ cpu->core_id, free_index); ++ return; ++ } ++ ++ cpu->id = cpu->core_id; ++ } ++ ++ cpu_slot = loongarch_find_cpu_slot(MACHINE(hotplug_dev), cpu->id, &index); ++ if (!cpu_slot) { ++ error_setg(&local_err, "core id %d out of range", cpu->id); ++ goto out; ++ } ++ ++ if (cpu_slot->cpu) { ++ error_setg(&local_err, "core %d already populated", cpu->id); ++ goto out; ++ } ++ ++ numa_cpu_pre_plug(cpu_slot, dev, &local_err); ++ ++ return; ++out: ++ error_propagate(errp, local_err); ++} ++ ++static void loongarch_memory_pre_plug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ MachineState *machine = MACHINE(OBJECT(hotplug_dev)); ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ PCDIMMDevice *dimm = PC_DIMM(dev); ++ Error *local_err = NULL; ++ uint64_t size; ++ ++ if (!lsms->acpi_dev || !loongarch_is_acpi_enabled(lsms)) { ++ error_setg( ++ errp, ++ "memory hotplug is not enabled: missing acpi device or acpi disabled"); ++ return; ++ } ++ ++ size = memory_device_get_region_size(MEMORY_DEVICE(dimm), &local_err); ++ if (local_err) { ++ error_propagate(errp, local_err); ++ return; ++ } ++ ++ if (size % LOONGARCH_HOTPLUG_MEM_ALIGN) { ++ error_setg(errp, ++ "Hotplugged memory size must be a multiple of " ++ "%lld MB", ++ LOONGARCH_HOTPLUG_MEM_ALIGN / MiB); ++ return; ++ } ++ ++ pc_dimm_pre_plug(dimm, MACHINE(hotplug_dev), NULL, errp); ++} ++ ++static void loongarch_cpu_plug(HotplugHandler *hotplug_dev, DeviceState *dev, ++ Error **errp) ++{ ++ CPUArchId *found_cpu; ++ HotplugHandlerClass *hhc; ++ Error *local_err = NULL; ++ MachineState *machine = MACHINE(OBJECT(hotplug_dev)); ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(dev); ++ ++ if (lsms->acpi_dev) { ++ loongarch_cpu_create(machine, cpu, errp); ++ hhc = HOTPLUG_HANDLER_GET_CLASS(lsms->acpi_dev); ++ hhc->plug(HOTPLUG_HANDLER(lsms->acpi_dev), dev, &local_err); ++ if (local_err) { ++ goto out; ++ } ++ } ++ ++ found_cpu = loongarch_find_cpu_slot(MACHINE(lsms), cpu->id, NULL); ++ found_cpu->cpu = OBJECT(dev); ++ lsms->hotpluged_cpu_num += 1; ++out: ++ error_propagate(errp, local_err); ++} ++ ++static void loongarch_cpu_unplug_request(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ MachineState *machine = MACHINE(OBJECT(hotplug_dev)); ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(dev); ++ Error *local_err = NULL; ++ HotplugHandlerClass *hhc; ++ int idx = -1; ++ ++ if (!lsms->acpi_dev) { ++ error_setg(&local_err, "CPU hot unplug not supported without ACPI"); ++ goto out; ++ } ++ ++ loongarch_find_cpu_slot(MACHINE(lsms), cpu->id, &idx); ++ assert(idx != -1); ++ if (idx == 0) { ++ error_setg(&local_err, "Boot CPU is unpluggable"); ++ goto out; ++ } ++ ++ hhc = HOTPLUG_HANDLER_GET_CLASS(lsms->acpi_dev); ++ hhc->unplug_request(HOTPLUG_HANDLER(lsms->acpi_dev), dev, &local_err); ++ ++ if (local_err) { ++ goto out; ++ } ++ ++out: ++ error_propagate(errp, local_err); ++} ++ ++void longson_machine_device_unplug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); ++ ++ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { ++ loongarch_memory_unplug(hotplug_dev, dev, errp); ++ } else if (object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU)) { ++ if (!mc->has_hotpluggable_cpus) { ++ error_setg(errp, "CPU hot unplug not supported on this machine"); ++ return; ++ } ++ loongarch_cpu_unplug(hotplug_dev, dev, errp); ++ } else { ++ error_setg(errp, ++ "acpi: device unplug for not supported device" ++ " type: %s", ++ object_get_typename(OBJECT(dev))); ++ } ++ ++ return; ++} ++ ++void loongarch_machine_device_unplug_request(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { ++ loongarch_memory_unplug_request(hotplug_dev, dev, errp); ++ } else if (object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU)) { ++ loongarch_cpu_unplug_request(hotplug_dev, dev, errp); ++ } ++} ++ ++HotplugHandler *loongarch_get_hotpug_handler(MachineState *machine, ++ DeviceState *dev) ++{ ++ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) || ++ object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU) || ++ object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)) { ++ return HOTPLUG_HANDLER(machine); ++ } ++ return NULL; ++} ++ ++void loongarch_machine_device_pre_plug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { ++ loongarch_memory_pre_plug(hotplug_dev, dev, errp); ++ } else if (object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU)) { ++ loongarch_cpu_pre_plug(hotplug_dev, dev, errp); ++ } ++} ++ ++void loongarch_machine_device_plug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp) ++{ ++ LoongarchMachineState *lsms = LoongarchMACHINE(hotplug_dev); ++ ++ if (lsms->platform_bus_dev) { ++ MachineClass *mc = MACHINE_GET_CLASS(lsms); ++ ++ if (device_is_dynamic_sysbus(mc, dev)) { ++ platform_bus_link_device( ++ PLATFORM_BUS_DEVICE(lsms->platform_bus_dev), ++ SYS_BUS_DEVICE(dev)); ++ } ++ } ++ ++ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) { ++ loongarch_memory_plug(hotplug_dev, dev, errp); ++ } else if (object_dynamic_cast(OBJECT(dev), TYPE_LOONGARCH_CPU)) { ++ loongarch_cpu_plug(hotplug_dev, dev, errp); ++ } ++} +diff --git a/hw/loongarch/larch_int.c b/hw/loongarch/larch_int.c +new file mode 100644 +index 0000000000..ff3750e982 +--- /dev/null ++++ b/hw/loongarch/larch_int.c +@@ -0,0 +1,87 @@ ++/* ++ * QEMU LOONGARCH interrupt support ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu/main-loop.h" ++#include "hw/hw.h" ++#include "hw/irq.h" ++#include "hw/loongarch/cpudevs.h" ++#include "cpu.h" ++#include "sysemu/kvm.h" ++#include "kvm_larch.h" ++#ifdef CONFIG_KVM ++#include ++#endif ++ ++static void cpu_irq_request(void *opaque, int irq, int level) ++{ ++ LOONGARCHCPU *cpu = opaque; ++ CPULOONGARCHState *env = &cpu->env; ++ CPUState *cs = CPU(cpu); ++ bool locked = false; ++ ++ if (irq < 0 || irq > 13) { ++ return; ++ } ++ ++ /* Make sure locking works even if BQL is already held by the caller */ ++ if (!qemu_mutex_iothread_locked()) { ++ locked = true; ++ qemu_mutex_lock_iothread(); ++ } ++ ++ if (level) { ++ env->CSR_ESTAT |= 1 << irq; ++ } else { ++ env->CSR_ESTAT &= ~(1 << irq); ++ } ++ ++ if (kvm_enabled()) { ++ if (irq == 2) { ++ kvm_loongarch_set_interrupt(cpu, irq, level); ++ } else if (irq == 3) { ++ kvm_loongarch_set_interrupt(cpu, irq, level); ++ } else if (irq == 12) { ++ kvm_loongarch_set_ipi_interrupt(cpu, irq, level); ++ } ++ } ++ ++ if (env->CSR_ESTAT & CSR_ESTAT_IPMASK) { ++ cpu_interrupt(cs, CPU_INTERRUPT_HARD); ++ } else { ++ cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); ++ } ++ ++ if (locked) { ++ qemu_mutex_unlock_iothread(); ++ } ++} ++ ++void cpu_init_irq(LOONGARCHCPU *cpu) ++{ ++ CPULOONGARCHState *env = &cpu->env; ++ qemu_irq *qi; ++ int i; ++ ++ qi = qemu_allocate_irqs(cpu_irq_request, loongarch_env_get_cpu(env), ++ N_IRQS); ++ for (i = 0; i < N_IRQS; i++) { ++ env->irq[i] = qi[i]; ++ } ++} +diff --git a/hw/loongarch/ls7a_nb.c b/hw/loongarch/ls7a_nb.c +new file mode 100644 +index 0000000000..933b3f2869 +--- /dev/null ++++ b/hw/loongarch/ls7a_nb.c +@@ -0,0 +1,289 @@ ++/* ++ * Loongarch 7A1000 north bridge support ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++ ++#include "hw/hw.h" ++#include "hw/irq.h" ++#include "hw/sysbus.h" ++#include "hw/pci/pci.h" ++#include "hw/i386/pc.h" ++#include "hw/pci/pci_host.h" ++#include "hw/pci/pcie_host.h" ++#include "sysemu/sysemu.h" ++#include "exec/address-spaces.h" ++#include "qapi/error.h" ++#include "hw/loongarch/cpudevs.h" ++#include "hw/acpi/ls7a.h" ++#include "hw/i386/pc.h" ++#include "hw/isa/isa.h" ++#include "hw/boards.h" ++#include "qemu/log.h" ++#include "hw/loongarch/bios.h" ++#include "hw/loader.h" ++#include "elf.h" ++#include "exec/address-spaces.h" ++#include "exec/memory.h" ++#include "hw/pci/pci_bridge.h" ++#include "hw/pci/pci_bus.h" ++#include "linux/kvm.h" ++#include "sysemu/kvm.h" ++#include "sysemu/runstate.h" ++#include "sysemu/reset.h" ++#include "migration/vmstate.h" ++#include "hw/loongarch/larch.h" ++#include "hw/loongarch/ls7a.h" ++ ++#undef DEBUG_LS7A ++ ++#ifdef DEBUG_LS7A ++#define DPRINTF(fmt, ...) fprintf(stderr, "%s: " fmt, __func__, ##__VA_ARGS__) ++#else ++#define DPRINTF(fmt, ...) ++#endif ++ ++static void ls7a_reset(void *opaque) ++{ ++ uint64_t wmask; ++ wmask = ~(-1); ++ ++ PCIDevice *dev = opaque; ++ pci_set_word(dev->config + PCI_VENDOR_ID, 0x0014); ++ pci_set_word(dev->wmask + PCI_VENDOR_ID, wmask & 0xffff); ++ pci_set_word(dev->cmask + PCI_VENDOR_ID, 0xffff); ++ pci_set_word(dev->config + PCI_DEVICE_ID, 0x7a00); ++ pci_set_word(dev->wmask + PCI_DEVICE_ID, wmask & 0xffff); ++ pci_set_word(dev->cmask + PCI_DEVICE_ID, 0xffff); ++ pci_set_word(dev->config + 0x4, 0x0000); ++ pci_set_word(dev->config + PCI_STATUS, 0x0010); ++ pci_set_word(dev->wmask + PCI_STATUS, wmask & 0xffff); ++ pci_set_word(dev->cmask + PCI_STATUS, 0xffff); ++ pci_set_byte(dev->config + PCI_REVISION_ID, 0x0); ++ pci_set_byte(dev->wmask + PCI_REVISION_ID, wmask & 0xff); ++ pci_set_byte(dev->cmask + PCI_REVISION_ID, 0xff); ++ pci_set_byte(dev->config + 0x9, 0x00); ++ pci_set_byte(dev->wmask + 0x9, wmask & 0xff); ++ pci_set_byte(dev->cmask + 0x9, 0xff); ++ pci_set_byte(dev->config + 0xa, 0x00); ++ pci_set_byte(dev->wmask + 0xa, wmask & 0xff); ++ pci_set_byte(dev->cmask + 0xa, 0xff); ++ pci_set_byte(dev->config + 0xb, 0x06); ++ pci_set_byte(dev->wmask + 0xb, wmask & 0xff); ++ pci_set_byte(dev->cmask + 0xb, 0xff); ++ pci_set_byte(dev->config + 0xc, 0x00); ++ pci_set_byte(dev->wmask + 0xc, wmask & 0xff); ++ pci_set_byte(dev->cmask + 0xc, 0xff); ++ pci_set_byte(dev->config + 0xe, 0x80); ++ pci_set_byte(dev->wmask + 0xe, wmask & 0xff); ++ pci_set_byte(dev->cmask + 0xe, 0xff); ++} ++ ++static const VMStateDescription vmstate_ls7a_pcie = { ++ .name = "LS7A_PCIE", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = (VMStateField[]){ VMSTATE_PCI_DEVICE(dev, LS7APCIState), ++ VMSTATE_STRUCT(pm, LS7APCIState, 0, ++ vmstate_ls7a_pm, LS7APCIPMRegs), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static PCIINTxRoute ls7a_route_intx_pin_to_irq(void *opaque, int pin) ++{ ++ PCIINTxRoute route; ++ ++ route.irq = pin; ++ route.mode = PCI_INTX_ENABLED; ++ return route; ++} ++ ++static int pci_ls7a_map_irq(PCIDevice *d, int irq_num) ++{ ++ int irq; ++ ++ irq = 16 + ((PCI_SLOT(d->devfn) * 4 + irq_num) & 0xf); ++ return irq; ++} ++ ++static void pci_ls7a_set_irq(void *opaque, int irq_num, int level) ++{ ++ qemu_irq *pic = opaque; ++ DPRINTF("------ %s irq %d %d\n", __func__, irq_num, level); ++ qemu_set_irq(pic[irq_num], level); ++} ++ ++static void ls7a_pcie_realize(PCIDevice *dev, Error **errp) ++{ ++ LS7APCIState *s = PCIE_LS7A(dev); ++ /* Ls7a North Bridge, built on FPGA, VENDOR_ID/DEVICE_ID are "undefined" */ ++ pci_config_set_prog_interface(dev->config, 0x00); ++ ++ /* set the default value of north bridge pci config */ ++ qemu_register_reset(ls7a_reset, s); ++} ++ ++static AddressSpace *ls7a_pci_dma_iommu(PCIBus *bus, void *opaque, int devfn) ++{ ++ return &address_space_memory; ++} ++ ++static PCIBus *pci_ls7a_init(MachineState *machine, DeviceState *dev, ++ qemu_irq *pic) ++{ ++ LoongarchMachineState *lsms = LoongarchMACHINE(machine); ++ LoongarchMachineClass *lsmc = LoongarchMACHINE_GET_CLASS(lsms); ++ PCIExpressHost *e; ++ PCIHostState *phb; ++ ++ e = PCIE_HOST_BRIDGE(dev); ++ phb = PCI_HOST_BRIDGE(e); ++ phb->bus = pci_register_root_bus( ++ dev, "pcie.0", pci_ls7a_set_irq, pci_ls7a_map_irq, pic, ++ get_system_memory(), get_system_io(), (1 << 3), 128, TYPE_PCIE_BUS); ++ pcie_host_mmcfg_update(e, true, lsmc->pciecfg_base, LS_PCIECFG_SIZE); ++ DPRINTF("------ %d\n", __LINE__); ++ ++ pci_bus_set_route_irq_fn(phb->bus, ls7a_route_intx_pin_to_irq); ++ ++ return phb->bus; ++} ++ ++PCIBus *ls7a_init(MachineState *machine, qemu_irq *pic, DeviceState **ls7a_dev) ++{ ++ DeviceState *dev; ++ PCIHostState *phb; ++ LS7APCIState *pbs; ++ PCIDevice *pcid; ++ PCIBus *pci_bus; ++ PCIExpressHost *e; ++ ++ /*1. init the HT PCI CFG*/ ++ DPRINTF("------ %d\n", __LINE__); ++ dev = qdev_new(TYPE_LS7A_PCIE_HOST_BRIDGE); ++ e = PCIE_HOST_BRIDGE(dev); ++ phb = PCI_HOST_BRIDGE(e); ++ ++ DPRINTF("------ %d\n", __LINE__); ++ pci_bus = pci_ls7a_init(machine, dev, pic); ++ sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); ++ phb->bus = pci_bus; ++ /* set the pcihost pointer after rs780_pcihost_initfn is called */ ++ DPRINTF("------ %d\n", __LINE__); ++ pcid = pci_new(PCI_DEVFN(0, 0), TYPE_PCIE_LS7A); ++ pbs = PCIE_LS7A(pcid); ++ pbs->pciehost = LS7A_PCIE_HOST_BRIDGE(dev); ++ pbs->pciehost->pci_dev = pbs; ++ ++ if (ls7a_dev) { ++ *ls7a_dev = DEVICE(pcid); ++ } ++ ++ pci_realize_and_unref(pcid, phb->bus, &error_fatal); ++ ++ /* IOMMU */ ++ pci_setup_iommu(phb->bus, ls7a_pci_dma_iommu, NULL); ++ ++ ls7a_pm_init(&pbs->pm, pic); ++ DPRINTF("------ %d\n", __LINE__); ++ /*3. init the north bridge VGA,not do now*/ ++ return pci_bus; ++} ++ ++LS7APCIState *get_ls7a_type(Object *obj) ++{ ++ LS7APCIState *pbs; ++ ++ pbs = PCIE_LS7A(obj); ++ return pbs; ++} ++ ++static void ls7a_pcie_class_init(ObjectClass *klass, void *data) ++{ ++ DeviceClass *dc = DEVICE_CLASS(klass); ++ PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); ++ HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass); ++ AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_CLASS(klass); ++ ++ k->realize = ls7a_pcie_realize; ++ k->vendor_id = 0x0014; ++ k->device_id = 0x7a00; ++ k->revision = 0x00; ++ k->class_id = PCI_CLASS_BRIDGE_HOST; ++ dc->desc = "LS7A1000 PCIE Host bridge"; ++ dc->vmsd = &vmstate_ls7a_pcie; ++ /* ++ * PCI-facing part of the host bridge, not usable without the ++ * host-facing part, which can't be device_add'ed, yet. ++ */ ++ dc->user_creatable = false; ++ hc->plug = ls7a_pm_device_plug_cb; ++ hc->unplug_request = ls7a_pm_device_unplug_request_cb; ++ hc->unplug = ls7a_pm_device_unplug_cb; ++ adevc->ospm_status = ls7a_pm_ospm_status; ++ adevc->send_event = ls7a_send_gpe; ++ adevc->madt_cpu = ls7a_madt_cpu_entry; ++} ++ ++static void ls7a_pci_add_properties(LS7APCIState *ls7a) ++{ ++ ls7a_pm_add_properties(OBJECT(ls7a), &ls7a->pm, NULL); ++} ++ ++static void ls7a_pci_initfn(Object *obj) ++{ ++ LS7APCIState *ls7a = get_ls7a_type(obj); ++ ++ ls7a_pci_add_properties(ls7a); ++} ++ ++static const TypeInfo ls7a_pcie_device_info = { ++ .name = TYPE_PCIE_LS7A, ++ .parent = TYPE_PCI_DEVICE, ++ .instance_size = sizeof(LS7APCIState), ++ .class_init = ls7a_pcie_class_init, ++ .instance_init = ls7a_pci_initfn, ++ .interfaces = ++ (InterfaceInfo[]){ ++ { TYPE_HOTPLUG_HANDLER }, ++ { TYPE_ACPI_DEVICE_IF }, ++ { INTERFACE_CONVENTIONAL_PCI_DEVICE }, ++ {}, ++ }, ++}; ++ ++static void ls7a_pciehost_class_init(ObjectClass *klass, void *data) ++{ ++ SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); ++ k->parent_class.fw_name = "pci"; ++} ++ ++static const TypeInfo ls7a_pciehost_info = { ++ .name = TYPE_LS7A_PCIE_HOST_BRIDGE, ++ .parent = TYPE_PCIE_HOST_BRIDGE, ++ .instance_size = sizeof(LS7APCIEHost), ++ .class_init = ls7a_pciehost_class_init, ++}; ++ ++static void ls7a_register_types(void) ++{ ++ type_register_static(&ls7a_pciehost_info); ++ type_register_static(&ls7a_pcie_device_info); ++} ++ ++type_init(ls7a_register_types) +diff --git a/hw/loongarch/meson.build b/hw/loongarch/meson.build +new file mode 100644 +index 0000000000..ca4d5567b5 +--- /dev/null ++++ b/hw/loongarch/meson.build +@@ -0,0 +1,15 @@ ++loongarch_ss = ss.source_set() ++loongarch_ss.add(files('larch_3a.c'), fdt) ++loongarch_ss.add(files( ++ 'larch_int.c', ++ 'larch_hotplug.c', ++ 'ls7a_nb.c', ++ 'ioapic.c', ++ 'acpi-build.c', ++ 'ipi.c', ++ 'apic.c', ++ 'iocsr.c', ++ 'sysbus-fdt.c', ++)) ++ ++hw_arch += {'loongarch64': loongarch_ss} +diff --git a/hw/loongarch/sysbus-fdt.c b/hw/loongarch/sysbus-fdt.c +new file mode 100644 +index 0000000000..05b4dda33a +--- /dev/null ++++ b/hw/loongarch/sysbus-fdt.c +@@ -0,0 +1,178 @@ ++/* ++ * Loongarch Platform Bus device tree generation helpers ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qapi/error.h" ++#include ++#include "qemu/error-report.h" ++#include "sysemu/device_tree.h" ++#include "hw/platform-bus.h" ++#include "hw/display/ramfb.h" ++#include "hw/loongarch/sysbus-fdt.h" ++#include "sysemu/tpm.h" ++ ++/* ++ * internal struct that contains the information to create dynamic ++ * sysbus device node ++ */ ++typedef struct PlatformBusFDTData { ++ void *fdt; /* device tree handle */ ++ int irq_start; /* index of the first IRQ usable by platform bus devices */ ++ const char *pbus_node_name; /* name of the platform bus node */ ++ PlatformBusDevice *pbus; ++} PlatformBusFDTData; ++ ++/* struct that allows to match a device and create its FDT node */ ++typedef struct BindingEntry { ++ const char *typename; ++ const char *compat; ++ int (*add_fn)(SysBusDevice *sbdev, void *opaque); ++ bool (*match_fn)(SysBusDevice *sbdev, const struct BindingEntry *combo); ++} BindingEntry; ++ ++static int no_fdt_node(SysBusDevice *sbdev, void *opaque) ++{ ++ return 0; ++} ++ ++/* Device type based matching */ ++static bool type_match(SysBusDevice *sbdev, const BindingEntry *entry) ++{ ++ return !strcmp(object_get_typename(OBJECT(sbdev)), entry->typename); ++} ++ ++#define TYPE_BINDING(type, add_fn) \ ++ { \ ++ (type), NULL, (add_fn), NULL \ ++ } ++ ++#ifdef CONFIG_TPM ++/* ++ * add_tpm_tis_fdt_node: Create a DT node for TPM TIS ++ * ++ * See kernel documentation: ++ * Documentation/devicetree/bindings/security/tpm/tpm_tis_mmio.txt ++ * Optional interrupt for command completion is not exposed ++ */ ++static int add_tpm_tis_fdt_node(SysBusDevice *sbdev, void *opaque) ++{ ++ PlatformBusFDTData *data = opaque; ++ PlatformBusDevice *pbus = data->pbus; ++ void *fdt = data->fdt; ++ const char *parent_node = data->pbus_node_name; ++ char *nodename; ++ uint32_t reg_attr[2]; ++ uint64_t mmio_base; ++ ++ mmio_base = platform_bus_get_mmio_addr(pbus, sbdev, 0); ++ nodename = g_strdup_printf("%s/tpm_tis@%" PRIx64, parent_node, mmio_base); ++ qemu_fdt_add_subnode(fdt, nodename); ++ ++ qemu_fdt_setprop_string(fdt, nodename, "compatible", "tcg,tpm-tis-mmio"); ++ ++ reg_attr[0] = cpu_to_be32(mmio_base); ++ reg_attr[1] = cpu_to_be32(0x5000); ++ qemu_fdt_setprop(fdt, nodename, "reg", reg_attr, 2 * sizeof(uint32_t)); ++ ++ g_free(nodename); ++ ++ return 0; ++} ++#endif ++ ++/* list of supported dynamic sysbus bindings */ ++static const BindingEntry bindings[] = { ++#ifdef CONFIG_TPM ++ TYPE_BINDING(TYPE_TPM_TIS_SYSBUS, add_tpm_tis_fdt_node), ++#endif ++ TYPE_BINDING(TYPE_RAMFB_DEVICE, no_fdt_node), ++ TYPE_BINDING("", NULL), /* last element */ ++}; ++ ++/** ++ * add_fdt_node - add the device tree node of a dynamic sysbus device ++ * ++ * @sbdev: handle to the sysbus device ++ * @opaque: handle to the PlatformBusFDTData ++ * ++ * Checks the sysbus type belongs to the list of device types that ++ * are dynamically instantiable and if so call the node creation ++ * function. ++ */ ++static void add_fdt_node(SysBusDevice *sbdev, void *opaque) ++{ ++ int i, ret; ++ ++ for (i = 0; i < ARRAY_SIZE(bindings); i++) { ++ const BindingEntry *iter = &bindings[i]; ++ ++ if (type_match(sbdev, iter)) { ++ if (!iter->match_fn || iter->match_fn(sbdev, iter)) { ++ ret = iter->add_fn(sbdev, opaque); ++ assert(!ret); ++ return; ++ } ++ } ++ } ++ error_report("Device %s can not be dynamically instantiated", ++ qdev_fw_name(DEVICE(sbdev))); ++ exit(1); ++} ++ ++void platform_bus_add_all_fdt_nodes(void *fdt, const char *intc, hwaddr addr, ++ hwaddr bus_size, int irq_start) ++{ ++ const char platcomp[] = "qemu,platform\0simple-bus"; ++ PlatformBusDevice *pbus; ++ DeviceState *dev; ++ gchar *node; ++ ++ assert(fdt); ++ ++ node = g_strdup_printf("/platform@%" PRIx64, addr); ++ ++ /* Create a /platform node that we can put all devices into */ ++ qemu_fdt_add_subnode(fdt, node); ++ qemu_fdt_setprop(fdt, node, "compatible", platcomp, sizeof(platcomp)); ++ ++ /* ++ * Our platform bus region is less than 32bits, so 1 cell is enough for ++ * address and size ++ */ ++ qemu_fdt_setprop_cells(fdt, node, "#size-cells", 1); ++ qemu_fdt_setprop_cells(fdt, node, "#address-cells", 1); ++ qemu_fdt_setprop_cells(fdt, node, "ranges", 0, addr >> 32, addr, bus_size); ++ if (intc != NULL) { ++ qemu_fdt_setprop_phandle(fdt, node, "interrupt-parent", intc); ++ } ++ dev = qdev_find_recursive(sysbus_get_default(), TYPE_PLATFORM_BUS_DEVICE); ++ pbus = PLATFORM_BUS_DEVICE(dev); ++ ++ PlatformBusFDTData data = { ++ .fdt = fdt, ++ .irq_start = irq_start, ++ .pbus_node_name = node, ++ .pbus = pbus, ++ }; ++ ++ /* Loop through all dynamic sysbus devices and create their node */ ++ foreach_dynamic_sysbus_device(add_fdt_node, &data); ++ ++ g_free(node); ++} +diff --git a/hw/meson.build b/hw/meson.build +index f39c1f7e70..a9a078ec33 100644 +--- a/hw/meson.build ++++ b/hw/meson.build +@@ -17,6 +17,7 @@ subdir('intc') + subdir('ipack') + subdir('ipmi') + subdir('isa') ++subdir('loongarch') + subdir('mem') + subdir('misc') + subdir('net') +diff --git a/hw/timer/Kconfig b/hw/timer/Kconfig +index 010be7ed1f..b395c72d7d 100644 +--- a/hw/timer/Kconfig ++++ b/hw/timer/Kconfig +@@ -60,3 +60,5 @@ config STELLARIS_GPTM + + config AVR_TIMER16 + bool ++config LS7A_RTC ++ bool +diff --git a/hw/timer/ls7a_rtc.c b/hw/timer/ls7a_rtc.c +new file mode 100644 +index 0000000000..56c2695654 +--- /dev/null ++++ b/hw/timer/ls7a_rtc.c +@@ -0,0 +1,343 @@ ++/* ++ * Loongarch rtc emulation ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "hw/sysbus.h" ++#include "hw/irq.h" ++#include "include/hw/register.h" ++#include "qemu/timer.h" ++#include "sysemu/sysemu.h" ++#include "qemu/cutils.h" ++#include "qemu/log.h" ++#include "qemu-common.h" ++#include "migration/vmstate.h" ++ ++#ifdef DEBUG_LS7A_RTC ++#define DPRINTF \ ++ (fmt, ...) do \ ++ { \ ++ printf("ls7a_rtc: " fmt, ##__VA_ARGS__); \ ++ } \ ++ while (0) ++#else ++#define DPRINTF \ ++ (fmt, ...) do \ ++ { \ ++ } \ ++ while (0) ++#endif ++ ++#define SYS_TOYTRIM 0x20 ++#define SYS_TOYWRITE0 0x24 ++#define SYS_TOYWRITE1 0x28 ++#define SYS_TOYREAD0 0x2C ++#define SYS_TOYREAD1 0x30 ++#define SYS_TOYMATCH0 0x34 ++#define SYS_TOYMATCH1 0x38 ++#define SYS_TOYMATCH2 0x3C ++#define SYS_RTCCTRL 0x40 ++#define SYS_RTCTRIM 0x60 ++#define SYS_RTCWRTIE0 0x64 ++#define SYS_RTCREAD0 0x68 ++#define SYS_RTCMATCH0 0x6C ++#define SYS_RTCMATCH1 0x70 ++#define SYS_RTCMATCH2 0x74 ++ ++/** ++ ** shift bits and filed mask ++ **/ ++#define TOY_MON_MASK 0x3f ++#define TOY_DAY_MASK 0x1f ++#define TOY_HOUR_MASK 0x1f ++#define TOY_MIN_MASK 0x3f ++#define TOY_SEC_MASK 0x3f ++#define TOY_MSEC_MASK 0xf ++ ++#define TOY_MON_SHIFT 26 ++#define TOY_DAY_SHIFT 21 ++#define TOY_HOUR_SHIFT 16 ++#define TOY_MIN_SHIFT 10 ++#define TOY_SEC_SHIFT 4 ++#define TOY_MSEC_SHIFT 0 ++ ++#define TOY_MATCH_YEAR_MASK 0x3f ++#define TOY_MATCH_MON_MASK 0xf ++#define TOY_MATCH_DAY_MASK 0x1f ++#define TOY_MATCH_HOUR_MASK 0x1f ++#define TOY_MATCH_MIN_MASK 0x3f ++#define TOY_MATCH_SEC_MASK 0x3f ++ ++#define TOY_MATCH_YEAR_SHIFT 26 ++#define TOY_MATCH_MON_SHIFT 22 ++#define TOY_MATCH_DAY_SHIFT 17 ++#define TOY_MATCH_HOUR_SHIFT 12 ++#define TOY_MATCH_MIN_SHIFT 6 ++#define TOY_MATCH_SEC_SHIFT 0 ++ ++#define TOY_ENABLE_BIT (1U << 11) ++ ++#define TYPE_LS7A_RTC "ls7a_rtc" ++#define LS7A_RTC(obj) OBJECT_CHECK(LS7A_RTCState, (obj), TYPE_LS7A_RTC) ++ ++typedef struct LS7A_RTCState { ++ SysBusDevice parent_obj; ++ ++ MemoryRegion iomem; ++ QEMUTimer *timer; ++ /* ++ * Needed to preserve the tick_count across migration, even if the ++ * absolute value of the rtc_clock is different on the source and ++ * destination. ++ */ ++ int64_t offset; ++ int64_t data; ++ int64_t save_alarm_offset; ++ int tidx; ++ uint32_t toymatch[3]; ++ uint32_t toytrim; ++ uint32_t cntrctl; ++ uint32_t rtctrim; ++ uint32_t rtccount; ++ uint32_t rtcmatch[3]; ++ qemu_irq toy_irq; ++} LS7A_RTCState; ++ ++enum { ++ TOYEN = 1UL << 11, ++ RTCEN = 1UL << 13, ++}; ++ ++static uint64_t ls7a_rtc_read(void *opaque, hwaddr addr, unsigned size) ++{ ++ LS7A_RTCState *s = (LS7A_RTCState *)opaque; ++ struct tm tm; ++ unsigned int val = 0; ++ ++ switch (addr) { ++ case SYS_TOYREAD0: ++ qemu_get_timedate(&tm, s->offset); ++ val = (((tm.tm_mon + 1) & TOY_MON_MASK) << TOY_MON_SHIFT) | ++ (((tm.tm_mday) & TOY_DAY_MASK) << TOY_DAY_SHIFT) | ++ (((tm.tm_hour) & TOY_HOUR_MASK) << TOY_HOUR_SHIFT) | ++ (((tm.tm_min) & TOY_MIN_MASK) << TOY_MIN_SHIFT) | ++ (((tm.tm_sec) & TOY_SEC_MASK) << TOY_SEC_SHIFT) | 0x0; ++ break; ++ case SYS_TOYREAD1: ++ qemu_get_timedate(&tm, s->offset); ++ val = tm.tm_year; ++ break; ++ case SYS_TOYMATCH0: ++ val = s->toymatch[0]; ++ break; ++ case SYS_TOYMATCH1: ++ val = s->toymatch[1]; ++ break; ++ case SYS_TOYMATCH2: ++ val = s->toymatch[2]; ++ break; ++ case SYS_RTCCTRL: ++ val = s->cntrctl; ++ break; ++ case SYS_RTCREAD0: ++ val = s->rtccount; ++ break; ++ case SYS_RTCMATCH0: ++ val = s->rtcmatch[0]; ++ break; ++ case SYS_RTCMATCH1: ++ val = s->rtcmatch[1]; ++ break; ++ case SYS_RTCMATCH2: ++ val = s->rtcmatch[2]; ++ break; ++ default: ++ break; ++ } ++ return val; ++} ++ ++static void ls7a_rtc_write(void *opaque, hwaddr addr, uint64_t val, ++ unsigned size) ++{ ++ LS7A_RTCState *s = (LS7A_RTCState *)opaque; ++ struct tm tm; ++ int64_t alarm_offset, year_diff, expire_time; ++ ++ switch (addr) { ++ case SYS_TOYWRITE0: ++ qemu_get_timedate(&tm, s->offset); ++ tm.tm_sec = (val >> TOY_SEC_SHIFT) & TOY_SEC_MASK; ++ tm.tm_min = (val >> TOY_MIN_SHIFT) & TOY_MIN_MASK; ++ tm.tm_hour = (val >> TOY_HOUR_SHIFT) & TOY_HOUR_MASK; ++ tm.tm_mday = ((val >> TOY_DAY_SHIFT) & TOY_DAY_MASK); ++ tm.tm_mon = ((val >> TOY_MON_SHIFT) & TOY_MON_MASK) - 1; ++ s->offset = qemu_timedate_diff(&tm); ++ break; ++ case SYS_TOYWRITE1: ++ qemu_get_timedate(&tm, s->offset); ++ tm.tm_year = val; ++ s->offset = qemu_timedate_diff(&tm); ++ break; ++ case SYS_TOYMATCH0: ++ s->toymatch[0] = val; ++ qemu_get_timedate(&tm, s->offset); ++ tm.tm_sec = (val >> TOY_MATCH_SEC_SHIFT) & TOY_MATCH_SEC_MASK; ++ tm.tm_min = (val >> TOY_MATCH_MIN_SHIFT) & TOY_MATCH_MIN_MASK; ++ tm.tm_hour = ((val >> TOY_MATCH_HOUR_SHIFT) & TOY_MATCH_HOUR_MASK); ++ tm.tm_mday = ((val >> TOY_MATCH_DAY_SHIFT) & TOY_MATCH_DAY_MASK); ++ tm.tm_mon = ((val >> TOY_MATCH_MON_SHIFT) & TOY_MATCH_MON_MASK) - 1; ++ year_diff = ((val >> TOY_MATCH_YEAR_SHIFT) & TOY_MATCH_YEAR_MASK); ++ year_diff = year_diff - (tm.tm_year & TOY_MATCH_YEAR_MASK); ++ tm.tm_year = tm.tm_year + year_diff; ++ alarm_offset = qemu_timedate_diff(&tm) - s->offset; ++ if ((alarm_offset < 0) && (alarm_offset > -5)) { ++ alarm_offset = 0; ++ } ++ expire_time = qemu_clock_get_ms(rtc_clock); ++ expire_time += ((alarm_offset * 1000) + 100); ++ timer_mod(s->timer, expire_time); ++ break; ++ case SYS_TOYMATCH1: ++ s->toymatch[1] = val; ++ break; ++ case SYS_TOYMATCH2: ++ s->toymatch[2] = val; ++ break; ++ case SYS_RTCCTRL: ++ s->cntrctl = val; ++ break; ++ case SYS_RTCWRTIE0: ++ s->rtccount = val; ++ break; ++ case SYS_RTCMATCH0: ++ s->rtcmatch[0] = val; ++ break; ++ case SYS_RTCMATCH1: ++ val = s->rtcmatch[1]; ++ break; ++ case SYS_RTCMATCH2: ++ val = s->rtcmatch[2]; ++ break; ++ default: ++ break; ++ } ++} ++ ++static const MemoryRegionOps ls7a_rtc_ops = { ++ .read = ls7a_rtc_read, ++ .write = ls7a_rtc_write, ++ .endianness = DEVICE_NATIVE_ENDIAN, ++ .valid = { ++ .min_access_size = 4, ++ .max_access_size = 4, ++ }, ++ ++}; ++ ++static void toy_timer(void *opaque) ++{ ++ LS7A_RTCState *s = (LS7A_RTCState *)opaque; ++ ++ if (s->cntrctl & TOY_ENABLE_BIT) { ++ qemu_irq_pulse(s->toy_irq); ++ } ++} ++ ++static void ls7a_rtc_realize(DeviceState *dev, Error **errp) ++{ ++ SysBusDevice *sbd = SYS_BUS_DEVICE(dev); ++ LS7A_RTCState *d = LS7A_RTC(sbd); ++ memory_region_init_io(&d->iomem, NULL, &ls7a_rtc_ops, (void *)d, ++ "ls7a_rtc", 0x100); ++ ++ sysbus_init_irq(sbd, &d->toy_irq); ++ ++ sysbus_init_mmio(sbd, &d->iomem); ++ d->timer = timer_new_ms(rtc_clock, toy_timer, d); ++ timer_mod(d->timer, qemu_clock_get_ms(rtc_clock) + 100); ++ d->offset = 0; ++} ++ ++static int ls7a_rtc_pre_save(void *opaque) ++{ ++ LS7A_RTCState *s = (LS7A_RTCState *)opaque; ++ struct tm tm; ++ int64_t year_diff, value; ++ ++ value = s->toymatch[0]; ++ qemu_get_timedate(&tm, s->offset); ++ tm.tm_sec = (value >> TOY_MATCH_SEC_SHIFT) & TOY_MATCH_SEC_MASK; ++ tm.tm_min = (value >> TOY_MATCH_MIN_SHIFT) & TOY_MATCH_MIN_MASK; ++ tm.tm_hour = ((value >> TOY_MATCH_HOUR_SHIFT) & TOY_MATCH_HOUR_MASK); ++ tm.tm_mday = ((value >> TOY_MATCH_DAY_SHIFT) & TOY_MATCH_DAY_MASK); ++ tm.tm_mon = ((value >> TOY_MATCH_MON_SHIFT) & TOY_MATCH_MON_MASK) - 1; ++ year_diff = ((value >> TOY_MATCH_YEAR_SHIFT) & TOY_MATCH_YEAR_MASK); ++ year_diff = year_diff - (tm.tm_year & TOY_MATCH_YEAR_MASK); ++ tm.tm_year = tm.tm_year + year_diff; ++ s->save_alarm_offset = qemu_timedate_diff(&tm) - s->offset; ++ ++ return 0; ++} ++ ++static int ls7a_rtc_post_load(void *opaque, int version_id) ++{ ++ LS7A_RTCState *s = (LS7A_RTCState *)opaque; ++ int64_t expire_time; ++ ++ expire_time = qemu_clock_get_ms(rtc_clock) + (s->save_alarm_offset * 1000); ++ timer_mod(s->timer, expire_time); ++ ++ return 0; ++} ++ ++static const VMStateDescription vmstate_ls7a_rtc = { ++ .name = "ls7a_rtc", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .pre_save = ls7a_rtc_pre_save, ++ .post_load = ls7a_rtc_post_load, ++ .fields = ++ (VMStateField[]){ VMSTATE_INT64(offset, LS7A_RTCState), ++ VMSTATE_INT64(save_alarm_offset, LS7A_RTCState), ++ VMSTATE_UINT32(toymatch[0], LS7A_RTCState), ++ VMSTATE_UINT32(cntrctl, LS7A_RTCState), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++static void ls7a_rtc_class_init(ObjectClass *klass, void *data) ++{ ++ DeviceClass *dc = DEVICE_CLASS(klass); ++ dc->vmsd = &vmstate_ls7a_rtc; ++ dc->realize = ls7a_rtc_realize; ++ dc->desc = "ls7a rtc"; ++} ++ ++static const TypeInfo ls7a_rtc_info = { ++ .name = TYPE_LS7A_RTC, ++ .parent = TYPE_SYS_BUS_DEVICE, ++ .instance_size = sizeof(LS7A_RTCState), ++ .class_init = ls7a_rtc_class_init, ++}; ++ ++static void ls7a_rtc_register_types(void) ++{ ++ type_register_static(&ls7a_rtc_info); ++} ++ ++type_init(ls7a_rtc_register_types) +diff --git a/hw/timer/meson.build b/hw/timer/meson.build +index 03092e2ceb..e841a2f6ee 100644 +--- a/hw/timer/meson.build ++++ b/hw/timer/meson.build +@@ -16,6 +16,7 @@ softmmu_ss.add(when: 'CONFIG_EXYNOS4', if_true: files('exynos4210_mct.c')) + softmmu_ss.add(when: 'CONFIG_EXYNOS4', if_true: files('exynos4210_pwm.c')) + softmmu_ss.add(when: 'CONFIG_GRLIB', if_true: files('grlib_gptimer.c')) + softmmu_ss.add(when: 'CONFIG_HPET', if_true: files('hpet.c')) ++softmmu_ss.add(when: 'CONFIG_LS7A_RTC', if_true: files('ls7a_rtc.c')) + softmmu_ss.add(when: 'CONFIG_I8254', if_true: files('i8254_common.c', 'i8254.c')) + softmmu_ss.add(when: 'CONFIG_IMX', if_true: files('imx_epit.c')) + softmmu_ss.add(when: 'CONFIG_IMX', if_true: files('imx_gpt.c')) +diff --git a/include/disas/dis-asm.h b/include/disas/dis-asm.h +index 4590bcc968..b165453fa1 100644 +--- a/include/disas/dis-asm.h ++++ b/include/disas/dis-asm.h +@@ -336,7 +336,7 @@ typedef struct disassemble_info { + Returns an errno value or 0 for success. */ + int (*read_memory_func) + (bfd_vma memaddr, bfd_byte *myaddr, int length, +- struct disassemble_info *info); ++ struct disassemble_info *info); + + /* Function which should be called if we get an error that we can't + recover from. STATUS is the errno value from read_memory_func and +@@ -465,6 +465,7 @@ int print_insn_riscv32 (bfd_vma, disassemble_info*); + int print_insn_riscv64 (bfd_vma, disassemble_info*); + int print_insn_rx(bfd_vma, disassemble_info *); + int print_insn_hexagon(bfd_vma, disassemble_info *); ++int print_insn_loongarch(bfd_vma, disassemble_info*); + + #ifdef CONFIG_CAPSTONE + bool cap_disas_target(disassemble_info *info, uint64_t pc, size_t size); +diff --git a/include/elf.h b/include/elf.h +index 79c188b62f..cd7808f37a 100644 +--- a/include/elf.h ++++ b/include/elf.h +@@ -182,6 +182,8 @@ typedef struct mips_elf_abiflags_v0 { + + #define EM_NANOMIPS 249 /* Wave Computing nanoMIPS */ + ++#define EM_LOONGARCH 258 /* Loongarch */ ++ + /* + * This is an interim value that we will use until the committee comes + * up with a final number. +diff --git a/include/hw/acpi/ls7a.h b/include/hw/acpi/ls7a.h +new file mode 100644 +index 0000000000..295baa4b5a +--- /dev/null ++++ b/include/hw/acpi/ls7a.h +@@ -0,0 +1,79 @@ ++/* ++ * QEMU GMCH/LS7A PCI PM Emulation ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef HW_ACPI_LS7A_H ++#define HW_ACPI_LS7A_H ++ ++#include "hw/acpi/acpi.h" ++#include "hw/acpi/cpu_hotplug.h" ++#include "hw/acpi/cpu.h" ++#include "hw/acpi/memory_hotplug.h" ++#include "hw/acpi/acpi_dev_interface.h" ++#include "hw/acpi/tco.h" ++ ++#define CPU_HOTPLUG_BASE 0x1e000000 ++#define MEMORY_HOTPLUG_BASE 0x1e00000c ++ ++typedef struct LS7APCIPMRegs { ++ /* ++ * In ls7a spec says that pm1_cnt register is 32bit width and ++ * that the upper 16bits are reserved and unused. ++ * PM1a_CNT_BLK = 2 in FADT so it is defined as uint16_t. ++ */ ++ ACPIREGS acpi_regs; ++ ++ MemoryRegion iomem; ++ MemoryRegion iomem_gpe; ++ MemoryRegion iomem_smi; ++ MemoryRegion iomem_reset; ++ ++ qemu_irq irq; /* SCI */ ++ ++ uint32_t pm_io_base; ++ Notifier powerdown_notifier; ++ ++ bool cpu_hotplug_legacy; ++ AcpiCpuHotplug gpe_cpu; ++ CPUHotplugState cpuhp_state; ++ ++ MemHotplugState acpi_memory_hotplug; ++ ++ uint8_t disable_s3; ++ uint8_t disable_s4; ++ uint8_t s4_val; ++} LS7APCIPMRegs; ++ ++void ls7a_pm_init(LS7APCIPMRegs *ls7a, qemu_irq *sci_irq); ++ ++void ls7a_pm_iospace_update(LS7APCIPMRegs *pm, uint32_t pm_io_base); ++extern const VMStateDescription vmstate_ls7a_pm; ++ ++void ls7a_pm_add_properties(Object *obj, LS7APCIPMRegs *pm, Error **errp); ++ ++void ls7a_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, ++ Error **errp); ++void ls7a_pm_device_unplug_request_cb(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp); ++void ls7a_pm_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, ++ Error **errp); ++ ++void ls7a_pm_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list); ++ ++void ls7a_send_gpe(AcpiDeviceIf *adev, AcpiEventStatusBits ev); ++#endif /* HW_ACPI_LS7A_H */ +diff --git a/include/hw/loongarch/bios.h b/include/hw/loongarch/bios.h +new file mode 100644 +index 0000000000..8e0f6c7d64 +--- /dev/null ++++ b/include/hw/loongarch/bios.h +@@ -0,0 +1,24 @@ ++/* ++ * bios on Loongarch system. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/units.h" ++#include "cpu.h" ++ ++#define BIOS_SIZE (4 * MiB) ++#define BIOS_FILENAME "loongarch_bios.bin" +diff --git a/include/hw/loongarch/cpudevs.h b/include/hw/loongarch/cpudevs.h +new file mode 100644 +index 0000000000..ea4007f8fa +--- /dev/null ++++ b/include/hw/loongarch/cpudevs.h +@@ -0,0 +1,71 @@ ++/* ++ * cpu device emulation on Loongarch system. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef HW_LOONGARCH_CPUDEVS_H ++#define HW_LOONGARCH_CPUDEVS_H ++ ++#include "target/loongarch64/cpu-qom.h" ++ ++/* Definitions for LOONGARCH CPU internal devices. */ ++#define MAX_GIPI_CORE_NUM 256 ++#define MAX_GIPI_MBX_NUM 4 ++ ++#define LS3A_INTC_IP 8 ++#define MAX_CORES 256 ++#define EXTIOI_IRQS (256) ++#define EXTIOI_IRQS_BITMAP_SIZE (256 / 8) ++/* map to ipnum per 32 irqs */ ++#define EXTIOI_IRQS_IPMAP_SIZE (256 / 32) ++ ++typedef struct gipi_core { ++ uint32_t status; ++ uint32_t en; ++ uint32_t set; ++ uint32_t clear; ++ uint64_t buf[MAX_GIPI_MBX_NUM]; ++ qemu_irq irq; ++} gipi_core; ++ ++typedef struct gipiState { ++ gipi_core core[MAX_GIPI_CORE_NUM]; ++} gipiState; ++ ++typedef struct apicState { ++ /* hardware state */ ++ uint8_t ext_en[EXTIOI_IRQS_BITMAP_SIZE]; ++ uint8_t ext_bounce[EXTIOI_IRQS_BITMAP_SIZE]; ++ uint8_t ext_isr[EXTIOI_IRQS_BITMAP_SIZE]; ++ uint8_t ext_coreisr[MAX_CORES][EXTIOI_IRQS_BITMAP_SIZE]; ++ uint8_t ext_ipmap[EXTIOI_IRQS_IPMAP_SIZE]; ++ uint8_t ext_coremap[EXTIOI_IRQS]; ++ uint16_t ext_nodetype[16]; ++ uint64_t ext_control; ++ ++ /* software state */ ++ uint8_t ext_sw_ipmap[EXTIOI_IRQS]; ++ uint8_t ext_sw_coremap[EXTIOI_IRQS]; ++ uint8_t ext_ipisr[MAX_CORES * LS3A_INTC_IP][EXTIOI_IRQS_BITMAP_SIZE]; ++ ++ qemu_irq parent_irq[MAX_CORES][LS3A_INTC_IP]; ++ qemu_irq *irq; ++} apicState; ++ ++void cpu_init_irq(LOONGARCHCPU *cpu); ++void cpu_loongarch_clock_init(LOONGARCHCPU *cpu); ++#endif +diff --git a/include/hw/loongarch/larch.h b/include/hw/loongarch/larch.h +new file mode 100644 +index 0000000000..a9f8dea9f5 +--- /dev/null ++++ b/include/hw/loongarch/larch.h +@@ -0,0 +1,164 @@ ++/* ++ * Hotplug emulation on Loongarch system. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef HW_LOONGARCH_H ++#define HW_LOONGARCH_H ++ ++#include "target/loongarch64/cpu.h" ++#include "qemu-common.h" ++#include "exec/memory.h" ++#include "hw/mem/pc-dimm.h" ++#include "hw/hotplug.h" ++#include "hw/boards.h" ++#include "hw/acpi/acpi.h" ++#include "qemu/notify.h" ++#include "qemu/error-report.h" ++#include "qemu/queue.h" ++#include "hw/acpi/memory_hotplug.h" ++#include "hw/loongarch/cpudevs.h" ++#include "hw/block/flash.h" ++ ++#define LOONGARCH_MAX_VCPUS 256 ++#define LOONGARCH_MAX_PFLASH 2 ++/* 256MB alignment for hotplug memory region */ ++#define LOONGARCH_HOTPLUG_MEM_ALIGN (1ULL << 28) ++#define LOONGARCH_MAX_RAM_SLOTS 10 ++ ++/* Memory types: */ ++#define SYSTEM_RAM 1 ++#define SYSTEM_RAM_RESERVED 2 ++#define ACPI_TABLE 3 ++#define ACPI_NVS 4 ++#define SYSTEM_PMEM 5 ++ ++#define MAX_MEM_MAP 128 ++ ++typedef struct LoongarchMachineClass { ++ /*< private >*/ ++ MachineClass parent_class; ++ ++ /* Methods: */ ++ HotplugHandler *(*get_hotplug_handler)(MachineState *machine, ++ DeviceState *dev); ++ ++ bool has_acpi_build; ++ ++ /* save different cpu address*/ ++ uint64_t isa_io_base; ++ uint64_t ht_control_regs_base; ++ uint64_t hpet_mmio_addr; ++ uint64_t smbus_cfg_base; ++ uint64_t pciecfg_base; ++ uint64_t ls7a_ioapic_reg_base; ++ uint32_t node_shift; ++ char cpu_name[40]; ++ char bridge_name[16]; ++ ++} LoongarchMachineClass; ++ ++typedef struct ResetData { ++ LOONGARCHCPU *cpu; ++ uint64_t vector; ++} ResetData; ++ ++typedef struct LoongarchMachineState { ++ /*< private >*/ ++ MachineState parent_obj; ++ ++ /* */ ++ ram_addr_t hotplug_memory_size; ++ ++ /* State for other subsystems/APIs: */ ++ Notifier machine_done; ++ /* Pointers to devices and objects: */ ++ HotplugHandler *acpi_dev; ++ int ram_slots; ++ ResetData *reset_info[LOONGARCH_MAX_VCPUS]; ++ DeviceState *rtc; ++ gipiState *gipi; ++ apicState *apic; ++ ++ FWCfgState *fw_cfg; ++ bool acpi_build_enabled; ++ bool apic_xrupt_override; ++ CPUArchIdList *possible_cpus; ++ PFlashCFI01 *flash[LOONGARCH_MAX_PFLASH]; ++ void *fdt; ++ int fdt_size; ++ unsigned int hotpluged_cpu_num; ++ DeviceState *platform_bus_dev; ++ OnOffAuto acpi; ++ char *oem_id; ++ char *oem_table_id; ++} LoongarchMachineState; ++ ++#define LOONGARCH_MACHINE_ACPI_DEVICE_PROP "loongarch-acpi-device" ++#define TYPE_LOONGARCH_MACHINE "loongarch-machine" ++ ++#define LoongarchMACHINE(obj) \ ++ OBJECT_CHECK(LoongarchMachineState, (obj), TYPE_LOONGARCH_MACHINE) ++#define LoongarchMACHINE_GET_CLASS(obj) \ ++ OBJECT_GET_CLASS(LoongarchMachineClass, (obj), TYPE_LOONGARCH_MACHINE) ++#define LoongarchMACHINE_CLASS(klass) \ ++ OBJECT_CLASS_CHECK(LoongarchMachineClass, (klass), TYPE_LOONGARCH_MACHINE) ++ ++#define DEFINE_LOONGARCH_MACHINE(suffix, namestr, initfn, optsfn) \ ++ static void loongarch_machine_##suffix##_class_init(ObjectClass *oc, \ ++ void *data) \ ++ { \ ++ MachineClass *mc = MACHINE_CLASS(oc); \ ++ optsfn(mc); \ ++ mc->init = initfn; \ ++ } \ ++ static const TypeInfo loongarch_machine_type_##suffix = { \ ++ .name = namestr TYPE_MACHINE_SUFFIX, \ ++ .parent = TYPE_LOONGARCH_MACHINE, \ ++ .class_init = loongarch_machine_##suffix##_class_init, \ ++ }; \ ++ static void loongarch_machine_init_##suffix(void) \ ++ { \ ++ type_register(&loongarch_machine_type_##suffix); \ ++ } \ ++ type_init(loongarch_machine_init_##suffix) ++ ++void loongarch_machine_device_unplug_request(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp); ++void longson_machine_device_unplug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp); ++HotplugHandler *loongarch_get_hotpug_handler(MachineState *machine, ++ DeviceState *dev); ++void loongarch_machine_device_pre_plug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp); ++void loongarch_machine_device_plug(HotplugHandler *hotplug_dev, ++ DeviceState *dev, Error **errp); ++ ++LOONGARCHCPU *loongarch_cpu_create(MachineState *machine, LOONGARCHCPU *cpu, ++ Error **errp); ++void loongarch_cpu_destroy(MachineState *machine, LOONGARCHCPU *cpu); ++int cpu_init_ipi(LoongarchMachineState *ms, qemu_irq parent, int cpu); ++int cpu_init_apic(LoongarchMachineState *ms, CPULOONGARCHState *env, int cpu); ++int la_memmap_add_entry(uint64_t address, uint64_t length, uint32_t type); ++bool loongarch_is_acpi_enabled(LoongarchMachineState *vms); ++ ++/* acpi-build.c */ ++void ls7a_madt_cpu_entry(AcpiDeviceIf *adev, int uid, ++ const CPUArchIdList *apic_ids, GArray *entry, ++ bool force_enabled); ++void slave_cpu_reset(void *opaque); ++#endif +diff --git a/include/hw/loongarch/ls7a.h b/include/hw/loongarch/ls7a.h +new file mode 100644 +index 0000000000..e1f3c8d032 +--- /dev/null ++++ b/include/hw/loongarch/ls7a.h +@@ -0,0 +1,167 @@ ++/* ++ * Acpi emulation on Loongarch system. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef HW_LS7A_H ++#define HW_LS7A_H ++ ++#include "hw/hw.h" ++#include "hw/isa/isa.h" ++#include "hw/sysbus.h" ++#include "hw/isa/apm.h" ++#include "hw/pci/pci.h" ++#include "hw/pci/pcie_host.h" ++#include "hw/pci/pci_bridge.h" ++#include "hw/acpi/acpi.h" ++#include "hw/acpi/ls7a.h" ++#include "hw/pci/pci_bus.h" ++ ++/* LS7A PCH Registers (Misc, Confreg) */ ++#define LS7A_PCH_REG_BASE 0x10000000UL ++#define LS3A5K_LS7A_IOAPIC_REG_BASE (LS7A_PCH_REG_BASE) ++#define LS7A_MISC_REG_BASE (LS7A_PCH_REG_BASE + 0x00080000) ++#define LS7A_ACPI_REG_BASE (LS7A_MISC_REG_BASE + 0x00050000) ++ ++#define LOONGARCH_PCH_IRQ_BASE 64 ++#define LS7A_UART_IRQ (LOONGARCH_PCH_IRQ_BASE + 2) ++#define LS7A_RTC_IRQ (LOONGARCH_PCH_IRQ_BASE + 3) ++#define LS7A_SCI_IRQ (LOONGARCH_PCH_IRQ_BASE + 4) ++#define LS7A_ACPI_IO_BASE 0x800 ++#define LS7A_ACPI_IO_SIZE 0x100 ++#define LS7A_PM_EVT_BLK (0x0C) /* 4 bytes */ ++#define LS7A_PM_CNT_BLK (0x14) /* 2 bytes */ ++#define LS7A_GPE0_STS_REG (0x28) /* 4 bytes */ ++#define LS7A_GPE0_ENA_REG (0x2C) /* 4 bytes */ ++#define LS7A_GPE0_RESET_REG (0x30) /* 4 bytes */ ++#define LS7A_PM_TMR_BLK (0x18) /* 4 bytes */ ++#define LS7A_GPE0_LEN (8) ++#define LS7A_RTC_REG_BASE (LS7A_MISC_REG_BASE + 0x00050100) ++#define LS7A_RTC_LEN (0x100) ++ ++#define ACPI_IO_BASE (LS7A_ACPI_REG_BASE) ++#define ACPI_GPE0_LEN (LS7A_GPE0_LEN) ++#define ACPI_IO_SIZE (LS7A_ACPI_IO_SIZE) ++#define ACPI_SCI_IRQ (LS7A_SCI_IRQ) ++ ++#define VIRT_PLATFORM_BUS_BASEADDRESS 0x16000000 ++#define VIRT_PLATFORM_BUS_SIZE 0x02000000 ++#define VIRT_PLATFORM_BUS_NUM_IRQS 2 ++#define VIRT_PLATFORM_BUS_IRQ (LOONGARCH_PCH_IRQ_BASE + 5) ++ ++#define LS3A5K_ISA_IO_BASE 0x18000000UL ++#define LS_BIOS_BASE 0x1c000000 ++#define LS_BIOS_VAR_BASE 0x1c3a0000 ++#define LS_BIOS_SIZE (4 * 1024 * 1024) ++#define LS_FDT_BASE 0x1c400000 ++#define LS_FDT_SIZE 0x00100000 ++ ++#define FW_CFG_ADDR 0x1e020000 ++#define LS7A_REG_BASE 0x1FE00000 ++#define LS7A_UART_BASE 0x1fe001e0 ++#define LS7A_UART_LEN 0x8 ++#define SMP_GIPI_MAILBOX 0x1f000000ULL ++#define CORE0_STATUS_OFF 0x000 ++#define CORE0_EN_OFF 0x004 ++#define CORE0_SET_OFF 0x008 ++#define CORE0_CLEAR_OFF 0x00c ++#define CORE0_BUF_20 0x020 ++#define CORE0_BUF_28 0x028 ++#define CORE0_BUF_30 0x030 ++#define CORE0_BUF_38 0x038 ++#define CORE0_IPI_SEND 0x040 ++#define CORE0_MAIL_SEND 0x048 ++#define INT_ROUTER_REGS_BASE 0x1fe01400UL ++#define INT_ROUTER_REGS_SIZE 0x100 ++#define INT_ROUTER_REGS_SYS_INT0 0x00 ++#define INT_ROUTER_REGS_SYS_INT1 0x01 ++#define INT_ROUTER_REGS_SYS_INT2 0x02 ++#define INT_ROUTER_REGS_SYS_INT3 0x03 ++#define INT_ROUTER_REGS_PCI_INT0 0x04 ++#define INT_ROUTER_REGS_PCI_INT1 0x05 ++#define INT_ROUTER_REGS_PCI_INT2 0x06 ++#define INT_ROUTER_REGS_PCI_INT3 0x07 ++#define INT_ROUTER_REGS_MATRIX_INT0 0x08 ++#define INT_ROUTER_REGS_MATRIX_INT1 0x09 ++#define INT_ROUTER_REGS_LPC_INT 0x0a ++#define INT_ROUTER_REGS_MC0 0x0b ++#define INT_ROUTER_REGS_MC1 0x0c ++#define INT_ROUTER_REGS_BARRIER 0x0d ++#define INT_ROUTER_REGS_THSENS_INT 0x0e ++#define INT_ROUTER_REGS_PCI_PERR 0x0f ++#define INT_ROUTER_REGS_HT0_INT0 0x10 ++#define INT_ROUTER_REGS_HT0_INT1 0x11 ++#define INT_ROUTER_REGS_HT0_INT2 0x12 ++#define INT_ROUTER_REGS_HT0_INT3 0x13 ++#define INT_ROUTER_REGS_HT0_INT4 0x14 ++#define INT_ROUTER_REGS_HT0_INT5 0x15 ++#define INT_ROUTER_REGS_HT0_INT6 0x16 ++#define INT_ROUTER_REGS_HT0_INT7 0x17 ++#define INT_ROUTER_REGS_HT1_INT0 0x18 ++#define INT_ROUTER_REGS_HT1_INT1 0x19 ++#define INT_ROUTER_REGS_HT1_INT2 0x1a ++#define INT_ROUTER_REGS_HT1_INT3 0x1b ++#define INT_ROUTER_REGS_HT1_INT4 0x1c ++#define INT_ROUTER_REGS_HT1_INT5 0x1d ++#define INT_ROUTER_REGS_HT1_INT6 0x1e ++#define INT_ROUTER_REGS_HT1_INT7 0x1f ++#define INT_ROUTER_REGS_ISR 0x20 ++#define INT_ROUTER_REGS_EN 0x24 ++#define INT_ROUTER_REGS_EN_SET 0x28 ++#define INT_ROUTER_REGS_EN_CLR 0x2c ++#define INT_ROUTER_REGS_EDGE 0x38 ++#define INT_ROUTER_REGS_CORE0_INTISR 0x40 ++#define INT_ROUTER_REGS_CORE1_INTISR 0x48 ++#define INT_ROUTER_REGS_CORE2_INTISR 0x50 ++#define INT_ROUTER_REGS_CORE3_INTISR 0x58 ++ ++#define LS_PCIECFG_BASE 0x20000000 ++#define LS_PCIECFG_SIZE 0x08000000 ++#define MSI_ADDR_LOW 0x2FF00000 ++#define MSI_ADDR_HI 0x0 ++ ++#define PCIE_MEMORY_BASE 0x40000000 ++#define PCIE_MEMORY_SIZE 0x40000000 ++ ++typedef struct LS7APCIState LS7APCIState; ++typedef struct LS7APCIEHost { ++ PCIExpressHost parent_obj; ++ LS7APCIState *pci_dev; ++} LS7APCIEHost; ++ ++struct LS7APCIState { ++ PCIDevice dev; ++ ++ LS7APCIEHost *pciehost; ++ ++ /* LS7A registers */ ++ MemoryRegion iomem; ++ LS7APCIPMRegs pm; ++}; ++ ++#define TYPE_LS7A_PCIE_HOST_BRIDGE "ls7a1000-pciehost" ++#define LS7A_PCIE_HOST_BRIDGE(obj) \ ++ OBJECT_CHECK(LS7APCIEHost, (obj), TYPE_LS7A_PCIE_HOST_BRIDGE) ++ ++#define TYPE_PCIE_LS7A "ls7a1000_pcie" ++#define PCIE_LS7A(obj) OBJECT_CHECK(LS7APCIState, (obj), TYPE_PCIE_LS7A) ++ ++PCIBus *ls7a_init(MachineState *machine, qemu_irq *irq, ++ DeviceState **ls7a_dev); ++LS7APCIState *get_ls7a_type(Object *obj); ++ ++#endif /* HW_LS7A_H */ +diff --git a/include/hw/loongarch/sysbus-fdt.h b/include/hw/loongarch/sysbus-fdt.h +new file mode 100644 +index 0000000000..6bf53097e1 +--- /dev/null ++++ b/include/hw/loongarch/sysbus-fdt.h +@@ -0,0 +1,33 @@ ++/* ++ * Dynamic sysbus device tree node generation API ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef HW_ARM_SYSBUS_FDT_H ++#define HW_ARM_SYSBUS_FDT_H ++ ++#include "exec/hwaddr.h" ++ ++/** ++ * platform_bus_add_all_fdt_nodes - create all the platform bus nodes ++ * ++ * builds the parent platform bus node and all the nodes of dynamic ++ * sysbus devices attached to it. ++ */ ++void platform_bus_add_all_fdt_nodes(void *fdt, const char *intc, hwaddr addr, ++ hwaddr bus_size, int irq_start); ++#endif +diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h +index 60718fc342..fd9e53f623 100644 +--- a/include/qemu/osdep.h ++++ b/include/qemu/osdep.h +@@ -533,6 +533,10 @@ static inline void qemu_cleanup_generic_vfree(void *p) + Valgrind does not support alignments larger than 1 MiB, + therefore we need special code which handles running on Valgrind. */ + # define QEMU_VMALLOC_ALIGN (512 * 4096) ++#elif defined(__linux__) && defined(__loongarch__) ++ /* Use 32 MiB alignment so transparent hugepages can be used by KVM. */ ++#define QEMU_VMALLOC_ALIGN (qemu_real_host_page_size * \ ++ qemu_real_host_page_size / 8) + #elif defined(__linux__) && defined(__s390x__) + /* Use 1 MiB (segment size) alignment so gmap can be used by KVM. */ + # define QEMU_VMALLOC_ALIGN (256 * 4096) +diff --git a/include/sysemu/arch_init.h b/include/sysemu/arch_init.h +index 1cf27baa7c..0907b92cd1 100644 +--- a/include/sysemu/arch_init.h ++++ b/include/sysemu/arch_init.h +@@ -25,6 +25,7 @@ enum { + QEMU_ARCH_AVR = (1 << 21), + QEMU_ARCH_HEXAGON = (1 << 22), + QEMU_ARCH_SW64 = (1 << 23), ++ QEMU_ARCH_LOONGARCH64 = (1 << 24), + }; + + extern const uint32_t arch_type; +diff --git a/linux-headers/asm-loongarch64/bitsperlong.h b/linux-headers/asm-loongarch64/bitsperlong.h +new file mode 100644 +index 0000000000..a7981540d2 +--- /dev/null ++++ b/linux-headers/asm-loongarch64/bitsperlong.h +@@ -0,0 +1,25 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef __ASM_LOONGARCH_BITSPERLONG_H ++#define __ASM_LOONGARCH_BITSPERLONG_H ++ ++#define __BITS_PER_LONG _LOONGARCH_SZLONG ++ ++#include ++ ++#endif /* __ASM_LOONGARCH_BITSPERLONG_H */ +diff --git a/linux-headers/asm-loongarch64/kvm.h b/linux-headers/asm-loongarch64/kvm.h +new file mode 100644 +index 0000000000..a473916d50 +--- /dev/null ++++ b/linux-headers/asm-loongarch64/kvm.h +@@ -0,0 +1,351 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef __LINUX_KVM_LOONGARCH_H ++#define __LINUX_KVM_LOONGARCH_H ++ ++#include ++ ++#define __KVM_HAVE_GUEST_DEBUG ++#define KVM_GUESTDBG_USE_SW_BP 0x00010000 ++#define KVM_GUESTDBG_USE_HW_BP 0x00020000 ++#define KVM_DATA_HW_BREAKPOINT_NUM 8 ++#define KVM_INST_HW_BREAKPOINT_NUM 8 ++ ++/* ++ * KVM Loongarch specific structures and definitions. ++ * ++ * Some parts derived from the x86 version of this file. ++ */ ++ ++#define __KVM_HAVE_READONLY_MEM ++ ++#define KVM_COALESCED_MMIO_PAGE_OFFSET 1 ++#define KVM_LARCH_VCPU_PVTIME_CTRL 2 ++#define KVM_LARCH_VCPU_PVTIME_IPA 0 ++ ++/* ++ * for KVM_GET_REGS and KVM_SET_REGS ++ */ ++struct kvm_regs { ++ /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ ++ __u64 gpr[32]; ++ __u64 pc; ++}; ++ ++/* ++ * for KVM_GET_CPUCFG ++ */ ++struct kvm_cpucfg { ++ /* out (KVM_GET_CPUCFG) */ ++ __u32 cpucfg[64]; ++}; ++ ++/* ++ * for KVM_GET_FPU and KVM_SET_FPU ++ */ ++struct kvm_fpu { ++ __u32 fcsr; ++ __u32 vcsr; ++ __u64 fcc; /* 8x8 */ ++ struct kvm_fpureg { ++ __u64 val64[4]; // support max 256 bits ++ } fpr[32]; ++}; ++ ++/* ++ * For LOONGARCH, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access various ++ * registers. The id field is broken down as follows: ++ * ++ * bits[63..52] - As per linux/kvm.h ++ * bits[51..32] - Must be zero. ++ * bits[31..16] - Register set. ++ * ++ * Register set = 0: GP registers from kvm_regs (see definitions below). ++ * ++ * Register set = 1: CSR registers. ++ * ++ * Register set = 2: KVM specific registers (see definitions below). ++ * ++ * Register set = 3: FPU / MSA registers (see definitions below). ++ * ++ * Other sets registers may be added in the future. Each set would ++ * have its own identifier in bits[31..16]. ++ */ ++ ++#define KVM_REG_LOONGARCH_GP (KVM_REG_LOONGARCH | 0x0000000000000000ULL) ++#define KVM_REG_LOONGARCH_CSR (KVM_REG_LOONGARCH | 0x0000000000010000ULL) ++#define KVM_REG_LOONGARCH_KVM (KVM_REG_LOONGARCH | 0x0000000000020000ULL) ++#define KVM_REG_LOONGARCH_FPU (KVM_REG_LOONGARCH | 0x0000000000030000ULL) ++ ++/* ++ * KVM_REG_LOONGARCH_GP - General purpose registers from kvm_regs. ++ */ ++ ++#define KVM_REG_LOONGARCH_R0 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 0) ++#define KVM_REG_LOONGARCH_R1 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 1) ++#define KVM_REG_LOONGARCH_R2 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 2) ++#define KVM_REG_LOONGARCH_R3 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 3) ++#define KVM_REG_LOONGARCH_R4 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 4) ++#define KVM_REG_LOONGARCH_R5 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 5) ++#define KVM_REG_LOONGARCH_R6 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 6) ++#define KVM_REG_LOONGARCH_R7 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 7) ++#define KVM_REG_LOONGARCH_R8 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 8) ++#define KVM_REG_LOONGARCH_R9 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 9) ++#define KVM_REG_LOONGARCH_R10 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 10) ++#define KVM_REG_LOONGARCH_R11 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 11) ++#define KVM_REG_LOONGARCH_R12 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 12) ++#define KVM_REG_LOONGARCH_R13 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 13) ++#define KVM_REG_LOONGARCH_R14 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 14) ++#define KVM_REG_LOONGARCH_R15 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 15) ++#define KVM_REG_LOONGARCH_R16 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 16) ++#define KVM_REG_LOONGARCH_R17 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 17) ++#define KVM_REG_LOONGARCH_R18 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 18) ++#define KVM_REG_LOONGARCH_R19 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 19) ++#define KVM_REG_LOONGARCH_R20 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 20) ++#define KVM_REG_LOONGARCH_R21 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 21) ++#define KVM_REG_LOONGARCH_R22 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 22) ++#define KVM_REG_LOONGARCH_R23 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 23) ++#define KVM_REG_LOONGARCH_R24 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 24) ++#define KVM_REG_LOONGARCH_R25 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 25) ++#define KVM_REG_LOONGARCH_R26 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 26) ++#define KVM_REG_LOONGARCH_R27 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 27) ++#define KVM_REG_LOONGARCH_R28 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 28) ++#define KVM_REG_LOONGARCH_R29 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 29) ++#define KVM_REG_LOONGARCH_R30 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 30) ++#define KVM_REG_LOONGARCH_R31 (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 31) ++ ++#define KVM_REG_LOONGARCH_HI (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 32) ++#define KVM_REG_LOONGARCH_LO (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 33) ++#define KVM_REG_LOONGARCH_PC (KVM_REG_LOONGARCH_GP | KVM_REG_SIZE_U64 | 34) ++ ++/* ++ * KVM_REG_LOONGARCH_KVM - KVM specific control registers. ++ */ ++ ++/* ++ * CP0_Count control ++ * DC: Set 0: Master disable CP0_Count and set COUNT_RESUME to now ++ * Set 1: Master re-enable CP0_Count with unchanged bias, handling timer ++ * interrupts since COUNT_RESUME ++ * This can be used to freeze the timer to get a consistent snapshot of ++ * the CP0_Count and timer interrupt pending state, while also resuming ++ * safely without losing time or guest timer interrupts. ++ * Other: Reserved, do not change. ++ */ ++#define KVM_REG_LOONGARCH_COUNT_CTL \ ++ (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 0) ++#define KVM_REG_LOONGARCH_COUNT_CTL_DC 0x00000001 ++ ++/* ++ * CP0_Count resume monotonic nanoseconds ++ * The monotonic nanosecond time of the last set of COUNT_CTL.DC (master ++ * disable). Any reads and writes of Count related registers while ++ * COUNT_CTL.DC=1 will appear to occur at this time. When COUNT_CTL.DC is ++ * cleared again (master enable) any timer interrupts since this time will be ++ * emulated. ++ * Modifications to times in the future are rejected. ++ */ ++#define KVM_REG_LOONGARCH_COUNT_RESUME \ ++ (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 1) ++/* ++ * CP0_Count rate in Hz ++ * Specifies the rate of the CP0_Count timer in Hz. Modifications occur without ++ * discontinuities in CP0_Count. ++ */ ++#define KVM_REG_LOONGARCH_COUNT_HZ \ ++ (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 2) ++#define KVM_REG_LOONGARCH_COUNTER \ ++ (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 3) ++#define KVM_REG_LOONGARCH_VCPU_RESET \ ++ (KVM_REG_LOONGARCH_KVM | KVM_REG_SIZE_U64 | 4) ++ ++struct kvm_iocsr_entry { ++ __u32 addr; ++ __u32 pad; ++ __u64 data; ++}; ++ ++struct kvm_csr_entry { ++ __u32 index; ++ __u32 reserved; ++ __u64 data; ++}; ++ ++/* for KVM_GET_MSRS and KVM_SET_MSRS */ ++struct kvm_msrs { ++ __u32 ncsrs; /* number of msrs in entries */ ++ __u32 pad; ++ struct kvm_csr_entry entries[0]; ++}; ++ ++#define __KVM_HAVE_IRQ_LINE ++ ++struct kvm_debug_exit_arch { ++ __u64 epc; ++ __u32 fwps; ++ __u32 mwps; ++ __u32 exception; ++}; ++ ++/* for KVM_SET_GUEST_DEBUG */ ++struct hw_breakpoint { ++ __u64 addr; ++ __u64 mask; ++ __u32 asid; ++ __u32 ctrl; ++}; ++ ++struct kvm_guest_debug_arch { ++ struct hw_breakpoint data_breakpoint[KVM_DATA_HW_BREAKPOINT_NUM]; ++ struct hw_breakpoint inst_breakpoint[KVM_INST_HW_BREAKPOINT_NUM]; ++ int inst_bp_nums, data_bp_nums; ++}; ++ ++/* definition of registers in kvm_run */ ++struct kvm_sync_regs { ++}; ++ ++/* dummy definition */ ++struct kvm_sregs { ++}; ++ ++struct kvm_loongarch_interrupt { ++ /* in */ ++ __u32 cpu; ++ __u32 irq; ++}; ++ ++#define KVM_IRQCHIP_LS7A_IOAPIC 0x0 ++#define KVM_IRQCHIP_LS3A_GIPI 0x1 ++#define KVM_IRQCHIP_LS3A_HT_IRQ 0x2 ++#define KVM_IRQCHIP_LS3A_ROUTE 0x3 ++#define KVM_IRQCHIP_LS3A_EXTIRQ 0x4 ++#define KVM_IRQCHIP_LS3A_IPMASK 0x5 ++#define KVM_NR_IRQCHIPS 1 ++#define KVM_IRQCHIP_NUM_PINS 64 ++ ++#define KVM_MAX_CORES 256 ++#define KVM_EXTIOI_IRQS (256) ++#define KVM_EXTIOI_IRQS_BITMAP_SIZE (KVM_EXTIOI_IRQS / 8) ++/* map to ipnum per 32 irqs */ ++#define KVM_EXTIOI_IRQS_IPMAP_SIZE (KVM_EXTIOI_IRQS / 32) ++#define KVM_EXTIOI_IRQS_PER_GROUP 32 ++#define KVM_EXTIOI_IRQS_COREMAP_SIZE (KVM_EXTIOI_IRQS) ++#define KVM_EXTIOI_IRQS_NODETYPE_SIZE 16 ++ ++struct ls7a_ioapic_state { ++ __u64 int_id; ++ /* 0x020 interrupt mask register */ ++ __u64 int_mask; ++ /* 0x040 1=msi */ ++ __u64 htmsi_en; ++ /* 0x060 edge=1 level =0 */ ++ __u64 intedge; ++ /* 0x080 for clean edge int,set 1 clean,set 0 is noused */ ++ __u64 intclr; ++ /* 0x0c0 */ ++ __u64 auto_crtl0; ++ /* 0x0e0 */ ++ __u64 auto_crtl1; ++ /* 0x100 - 0x140 */ ++ __u8 route_entry[64]; ++ /* 0x200 - 0x240 */ ++ __u8 htmsi_vector[64]; ++ /* 0x300 */ ++ __u64 intisr_chip0; ++ /* 0x320 */ ++ __u64 intisr_chip1; ++ /* edge detection */ ++ __u64 last_intirr; ++ /* 0x380 interrupt request register */ ++ __u64 intirr; ++ /* 0x3a0 interrupt service register */ ++ __u64 intisr; ++ /* 0x3e0 interrupt level polarity selection register, ++ * 0 for high level tirgger ++ */ ++ __u64 int_polarity; ++}; ++ ++struct loongarch_gipi_single { ++ __u32 status; ++ __u32 en; ++ __u32 set; ++ __u32 clear; ++ __u64 buf[4]; ++}; ++ ++struct loongarch_gipiState { ++ struct loongarch_gipi_single core[KVM_MAX_CORES]; ++}; ++ ++struct kvm_loongarch_ls3a_extirq_state { ++ union ext_en_r ++ { ++ uint64_t reg_u64[KVM_EXTIOI_IRQS_BITMAP_SIZE / 8]; ++ uint32_t reg_u32[KVM_EXTIOI_IRQS_BITMAP_SIZE / 4]; ++ uint8_t reg_u8[KVM_EXTIOI_IRQS_BITMAP_SIZE]; ++ } ext_en_r; ++ union bounce_r ++ { ++ uint64_t reg_u64[KVM_EXTIOI_IRQS_BITMAP_SIZE / 8]; ++ uint32_t reg_u32[KVM_EXTIOI_IRQS_BITMAP_SIZE / 4]; ++ uint8_t reg_u8[KVM_EXTIOI_IRQS_BITMAP_SIZE]; ++ } bounce_r; ++ union ext_isr_r ++ { ++ uint64_t reg_u64[KVM_EXTIOI_IRQS_BITMAP_SIZE / 8]; ++ uint32_t reg_u32[KVM_EXTIOI_IRQS_BITMAP_SIZE / 4]; ++ uint8_t reg_u8[KVM_EXTIOI_IRQS_BITMAP_SIZE]; ++ } ext_isr_r; ++ union ext_core_isr_r ++ { ++ uint64_t reg_u64[KVM_MAX_CORES][KVM_EXTIOI_IRQS_BITMAP_SIZE / 8]; ++ uint32_t reg_u32[KVM_MAX_CORES][KVM_EXTIOI_IRQS_BITMAP_SIZE / 4]; ++ uint8_t reg_u8[KVM_MAX_CORES][KVM_EXTIOI_IRQS_BITMAP_SIZE]; ++ } ext_core_isr_r; ++ union ip_map_r ++ { ++ uint64_t reg_u64; ++ uint32_t reg_u32[KVM_EXTIOI_IRQS_IPMAP_SIZE / 4]; ++ uint8_t reg_u8[KVM_EXTIOI_IRQS_IPMAP_SIZE]; ++ } ip_map_r; ++ union core_map_r ++ { ++ uint64_t reg_u64[KVM_EXTIOI_IRQS_COREMAP_SIZE / 8]; ++ uint32_t reg_u32[KVM_EXTIOI_IRQS_COREMAP_SIZE / 4]; ++ uint8_t reg_u8[KVM_EXTIOI_IRQS_COREMAP_SIZE]; ++ } core_map_r; ++ union node_type_r ++ { ++ uint64_t reg_u64[KVM_EXTIOI_IRQS_NODETYPE_SIZE / 4]; ++ uint32_t reg_u32[KVM_EXTIOI_IRQS_NODETYPE_SIZE / 2]; ++ uint16_t reg_u16[KVM_EXTIOI_IRQS_NODETYPE_SIZE]; ++ uint8_t reg_u8[KVM_EXTIOI_IRQS_NODETYPE_SIZE * 2]; ++ } node_type_r; ++}; ++ ++struct loongarch_kvm_irqchip { ++ __u16 chip_id; ++ __u16 len; ++ __u16 vcpu_id; ++ __u16 reserved; ++ char data[0]; ++}; ++ ++#endif /* __LINUX_KVM_LOONGARCH_H */ +diff --git a/linux-headers/asm-loongarch64/sgidefs.h b/linux-headers/asm-loongarch64/sgidefs.h +new file mode 100644 +index 0000000000..89e8be582e +--- /dev/null ++++ b/linux-headers/asm-loongarch64/sgidefs.h +@@ -0,0 +1,31 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef __ASM_SGIDEFS_H ++#define __ASM_SGIDEFS_H ++ ++#define _LOONGARCH_ISA_LOONGARCH32 6 ++#define _LOONGARCH_ISA_LOONGARCH64 7 ++ ++/* ++ * Subprogram calling convention ++ */ ++#define _LOONGARCH_SIM_ABILP32 1 ++#define _LOONGARCH_SIM_ABILPX32 2 ++#define _LOONGARCH_SIM_ABILP64 3 ++ ++#endif /* __ASM_SGIDEFS_H */ +diff --git a/linux-headers/asm-loongarch64/unistd.h b/linux-headers/asm-loongarch64/unistd.h +new file mode 100644 +index 0000000000..ef710673a3 +--- /dev/null ++++ b/linux-headers/asm-loongarch64/unistd.h +@@ -0,0 +1,22 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifdef __LP64__ ++#define __ARCH_WANT_NEW_STAT ++#endif /* __LP64__ */ ++ ++#include +diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h +index 7870cd0280..c9986c1966 100644 +--- a/linux-headers/linux/kvm.h ++++ b/linux-headers/linux/kvm.h +@@ -2008,6 +2008,31 @@ struct kvm_stats_desc { + char name[]; + }; + ++#ifdef __loongarch__ ++struct kvm_loongarch_vcpu_state { ++ __u8 online_vcpus; ++ __u8 is_migrate; ++ __u32 cpu_freq; ++ __u32 count_ctl; ++ __u64 pending_exceptions; ++ __u64 pending_exceptions_clr; ++ __u64 core_ext_ioisr[4]; ++}; ++ ++#define KVM_CAP_LOONGARCH_FPU 800 ++#define KVM_CAP_LOONGARCH_LSX 801 ++#define KVM_CAP_LOONGARCH_VZ 802 ++#define KVM_REG_LOONGARCH 0x9000000000000000ULL ++#define KVM_LARCH_GET_VCPU_STATE \ ++ _IOR(KVMIO, 0xc0, struct kvm_loongarch_vcpu_state) ++#define KVM_LARCH_SET_VCPU_STATE \ ++ _IOW(KVMIO, 0xc1, struct kvm_loongarch_vcpu_state) ++#define KVM_LARCH_GET_CPUCFG _IOR(KVMIO, 0xc2, struct kvm_cpucfg) ++#define KVM_LOONGARCH_GET_IOCSR _IOR(KVMIO, 0xc3, struct kvm_iocsr_entry) ++#define KVM_LOONGARCH_SET_IOCSR _IOW(KVMIO, 0xc4, struct kvm_iocsr_entry) ++#define KVM_LARCH_SET_CPUCFG _IOR(KVMIO, 0xc5, struct kvm_cpucfg) ++#endif ++ + #define KVM_GET_STATS_FD _IO(KVMIO, 0xce) + + /* Available with KVM_CAP_XSAVE2 */ +diff --git a/linux-user/elfload.c b/linux-user/elfload.c +index 767f54c76d..2625af99dd 100644 +--- a/linux-user/elfload.c ++++ b/linux-user/elfload.c +@@ -1041,6 +1041,70 @@ static uint32_t get_elf_hwcap(void) + + #endif /* TARGET_MIPS */ + ++#ifdef TARGET_LOONGARCH64 ++ ++#define ELF_START_MMAP 0x80000000 ++ ++#define ELF_CLASS ELFCLASS64 ++#define ELF_ARCH EM_LOONGARCH ++ ++#define elf_check_arch(x) ((x) == EM_LOONGARCH) ++ ++static inline void init_thread(struct target_pt_regs *regs, ++ struct image_info *infop) ++{ ++ regs->csr_crmd = 2 << 3; ++ regs->csr_era = infop->entry; ++ regs->regs[3] = infop->start_stack; ++} ++ ++/* See linux kernel: arch/mips/include/asm/elf.h. */ ++#define ELF_NREG 45 ++typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG]; ++ ++/* See linux kernel: arch/loongarch/include/uapi/asm/reg.h */ ++enum { ++ TARGET_EF_R0 = 0, ++ TARGET_EF_R26 = TARGET_EF_R0 + 26, ++ TARGET_EF_R27 = TARGET_EF_R0 + 27, ++ TARGET_EF_CSR_ERA = TARGET_EF_R0 + 32, ++ TARGET_EF_CSR_BADV = TARGET_EF_R0 + 33, ++ TARGET_EF_CSR_CRMD = TARGET_EF_R0 + 34, ++ TARGET_EF_CSR_ESTAT = TARGET_EF_R0 + 38 ++}; ++ ++/* See linux kernel: arch/loongarch/kernel/process.c:elf_dump_regs. */ ++static void elf_core_copy_regs(target_elf_gregset_t *regs, ++ const CPULOONGARCHState *env) ++{ ++ int i; ++ ++ (*regs)[TARGET_EF_R0] = 0; ++ ++ for (i = 1; i < ARRAY_SIZE(env->active_tc.gpr); i++) { ++ (*regs)[TARGET_EF_R0 + i] = tswapreg(env->active_tc.gpr[i]); ++ } ++ ++ (*regs)[TARGET_EF_R26] = 0; ++ (*regs)[TARGET_EF_R27] = 0; ++ (*regs)[TARGET_EF_CSR_ERA] = tswapreg(env->active_tc.PC); ++ (*regs)[TARGET_EF_CSR_BADV] = tswapreg(env->CSR_BADV); ++ (*regs)[TARGET_EF_CSR_CRMD] = tswapreg(env->CSR_CRMD); ++ (*regs)[TARGET_EF_CSR_ESTAT] = tswapreg(env->CSR_ESTAT); ++} ++ ++#define USE_ELF_CORE_DUMP ++#define ELF_EXEC_PAGESIZE 4096 ++ ++#define ELF_HWCAP get_elf_hwcap() ++ ++static uint32_t get_elf_hwcap(void) ++{ ++ return 0; ++} ++ ++#endif /* TARGET_LOONGARCH64 */ ++ + #ifdef TARGET_MICROBLAZE + + #define ELF_START_MMAP 0x80000000 +diff --git a/linux-user/loongarch64/cpu_loop.c b/linux-user/loongarch64/cpu_loop.c +new file mode 100644 +index 0000000000..eb455465ab +--- /dev/null ++++ b/linux-user/loongarch64/cpu_loop.c +@@ -0,0 +1,179 @@ ++/* ++ * qemu user cpu loop ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu.h" ++#include "cpu_loop-common.h" ++#include "elf.h" ++ ++/* Break codes */ ++enum { BRK_OVERFLOW = 6, BRK_DIVZERO = 7 }; ++ ++void force_sig_fault(CPULOONGARCHState *env, target_siginfo_t *info, ++ unsigned int code) ++{ ++ ++ switch (code) { ++ case BRK_OVERFLOW: ++ case BRK_DIVZERO: ++ info->si_signo = TARGET_SIGFPE; ++ info->si_errno = 0; ++ info->si_code = (code == BRK_OVERFLOW) ? FPE_INTOVF : FPE_INTDIV; ++ queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info); ++ ret = 0; ++ break; ++ default: ++ info->si_signo = TARGET_SIGTRAP; ++ info->si_errno = 0; ++ queue_signal(env, info->si_signo, QEMU_SI_FAULT, &*info); ++ ret = 0; ++ break; ++ } ++} ++ ++void cpu_loop(CPULOONGARCHState *env) ++{ ++ CPUState *cs = CPU(loongarch_env_get_cpu(env)); ++ target_siginfo_t info; ++ int trapnr; ++ abi_long ret; ++ ++ for (;;) { ++ cpu_exec_start(cs); ++ trapnr = cpu_exec(cs); ++ cpu_exec_end(cs); ++ process_queued_cpu_work(cs); ++ ++ switch (trapnr) { ++ case EXCP_SYSCALL: ++ env->active_tc.PC += 4; ++ ret = ++ do_syscall(env, env->active_tc.gpr[11], env->active_tc.gpr[4], ++ env->active_tc.gpr[5], env->active_tc.gpr[6], ++ env->active_tc.gpr[7], env->active_tc.gpr[8], ++ env->active_tc.gpr[9], -1, -1); ++ if (ret == -TARGET_ERESTARTSYS) { ++ env->active_tc.PC -= 4; ++ break; ++ } ++ if (ret == -TARGET_QEMU_ESIGRETURN) { ++ /* ++ * Returning from a successful sigreturn syscall. ++ * Avoid clobbering register state. ++ */ ++ break; ++ } ++ env->active_tc.gpr[4] = ret; ++ break; ++ case EXCP_TLBL: ++ case EXCP_TLBS: ++ case EXCP_AdEL: ++ case EXCP_AdES: ++ info.si_signo = TARGET_SIGSEGV; ++ info.si_errno = 0; ++ /* XXX: check env->error_code */ ++ info.si_code = TARGET_SEGV_MAPERR; ++ info._sifields._sigfault._addr = env->CSR_BADV; ++ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); ++ break; ++ case EXCP_FPDIS: ++ case EXCP_LSXDIS: ++ case EXCP_LASXDIS: ++ case EXCP_RI: ++ info.si_signo = TARGET_SIGILL; ++ info.si_errno = 0; ++ info.si_code = 0; ++ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); ++ break; ++ case EXCP_INTERRUPT: ++ /* just indicate that signals should be handled asap */ ++ break; ++ case EXCP_DEBUG: ++ info.si_signo = TARGET_SIGTRAP; ++ info.si_errno = 0; ++ info.si_code = TARGET_TRAP_BRKPT; ++ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); ++ break; ++ case EXCP_FPE: ++ info.si_signo = TARGET_SIGFPE; ++ info.si_errno = 0; ++ info.si_code = TARGET_FPE_FLTUNK; ++ if (GET_FP_CAUSE(env->active_fpu.fcsr0) & FP_INVALID) { ++ info.si_code = TARGET_FPE_FLTINV; ++ } else if (GET_FP_CAUSE(env->active_fpu.fcsr0) & FP_DIV0) { ++ info.si_code = TARGET_FPE_FLTDIV; ++ } else if (GET_FP_CAUSE(env->active_fpu.fcsr0) & FP_OVERFLOW) { ++ info.si_code = TARGET_FPE_FLTOVF; ++ } else if (GET_FP_CAUSE(env->active_fpu.fcsr0) & FP_UNDERFLOW) { ++ info.si_code = TARGET_FPE_FLTUND; ++ } else if (GET_FP_CAUSE(env->active_fpu.fcsr0) & FP_INEXACT) { ++ info.si_code = TARGET_FPE_FLTRES; ++ } ++ queue_signal(env, info.si_signo, QEMU_SI_FAULT, &info); ++ break; ++ case EXCP_BREAK: { ++ abi_ulong trap_instr; ++ unsigned int code; ++ ++ ret = get_user_u32(trap_instr, env->active_tc.PC); ++ if (ret != 0) { ++ goto error; ++ } ++ ++ code = trap_instr & 0x7fff; ++ force_sig_fault(env, &info, code); ++ } break; ++ case EXCP_TRAP: { ++ abi_ulong trap_instr; ++ unsigned int code = 0; ++ ++ ret = get_user_u32(trap_instr, env->active_tc.PC); ++ ++ if (ret != 0) { ++ goto error; ++ } ++ ++ /* The immediate versions don't provide a code. */ ++ if (!(trap_instr & 0xFC000000)) { ++ code = ((trap_instr >> 6) & ((1 << 10) - 1)); ++ } ++ force_sig_fault(env, &info, code); ++ } break; ++ case EXCP_ATOMIC: ++ cpu_exec_step_atomic(cs); ++ break; ++ default: ++ error: ++ EXCP_DUMP(env, "qemu: unhandled CPU exception 0x%x - aborting\n", ++ trapnr); ++ abort(); ++ } ++ process_pending_signals(env); ++ } ++} ++ ++void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs) ++{ ++ int i; ++ ++ for (i = 0; i < 32; i++) { ++ env->active_tc.gpr[i] = regs->regs[i]; ++ } ++ env->active_tc.PC = regs->csr_era & ~(target_ulong)1; ++} +diff --git a/linux-user/loongarch64/meson.build b/linux-user/loongarch64/meson.build +new file mode 100644 +index 0000000000..c4c0b4d701 +--- /dev/null ++++ b/linux-user/loongarch64/meson.build +@@ -0,0 +1,6 @@ ++syscall_nr_generators += { ++ 'loongarch64': generator(sh, ++ arguments: [ meson.current_source_dir() / 'syscallhdr.sh', '@INPUT@', '@OUTPUT@', '@EXTRA_ARGS@', ++ '', 'TARGET_SYSCALL_OFFSET' ], ++ output: '@BASENAME@_nr.h') ++} +diff --git a/linux-user/loongarch64/signal.c b/linux-user/loongarch64/signal.c +new file mode 100644 +index 0000000000..2f336035c9 +--- /dev/null ++++ b/linux-user/loongarch64/signal.c +@@ -0,0 +1,218 @@ ++/* ++ * Emulation of Linux signals ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu.h" ++#include "signal-common.h" ++#include "linux-user/trace.h" ++ ++#define FPU_REG_WIDTH 256 ++union fpureg ++{ ++ uint32_t val32[FPU_REG_WIDTH / 32]; ++ uint64_t val64[FPU_REG_WIDTH / 64]; ++}; ++ ++struct target_sigcontext { ++ uint64_t sc_pc; ++ uint64_t sc_regs[32]; ++ uint32_t sc_flags; ++ ++ uint32_t sc_fcsr; ++ uint32_t sc_vcsr; ++ uint64_t sc_fcc; ++ union fpureg sc_fpregs[32] __attribute__((aligned(32))); ++ ++ uint32_t sc_reserved; ++}; ++ ++struct sigframe { ++ uint32_t sf_ass[4]; /* argument save space for o32 */ ++ uint32_t sf_code[2]; /* signal trampoline */ ++ struct target_sigcontext sf_sc; ++ target_sigset_t sf_mask; ++}; ++ ++struct target_ucontext { ++ target_ulong tuc_flags; ++ target_ulong tuc_link; ++ target_stack_t tuc_stack; ++ target_ulong pad0; ++ struct target_sigcontext tuc_mcontext; ++ target_sigset_t tuc_sigmask; ++}; ++ ++struct target_rt_sigframe { ++ uint32_t rs_ass[4]; /* argument save space for o32 */ ++ uint32_t rs_code[2]; /* signal trampoline */ ++ struct target_siginfo rs_info; ++ struct target_ucontext rs_uc; ++}; ++ ++static inline void setup_sigcontext(CPULOONGARCHState *regs, ++ struct target_sigcontext *sc) ++{ ++ int i; ++ ++ __put_user(exception_resume_pc(regs), &sc->sc_pc); ++ regs->hflags &= ~LARCH_HFLAG_BMASK; ++ ++ __put_user(0, &sc->sc_regs[0]); ++ for (i = 1; i < 32; ++i) { ++ __put_user(regs->active_tc.gpr[i], &sc->sc_regs[i]); ++ } ++ ++ for (i = 0; i < 32; ++i) { ++ __put_user(regs->active_fpu.fpr[i].d, &sc->sc_fpregs[i].val64[0]); ++ } ++} ++ ++static inline void restore_sigcontext(CPULOONGARCHState *regs, ++ struct target_sigcontext *sc) ++{ ++ int i; ++ ++ __get_user(regs->CSR_ERA, &sc->sc_pc); ++ ++ for (i = 1; i < 32; ++i) { ++ __get_user(regs->active_tc.gpr[i], &sc->sc_regs[i]); ++ } ++ ++ for (i = 0; i < 32; ++i) { ++ __get_user(regs->active_fpu.fpr[i].d, &sc->sc_fpregs[i].val64[0]); ++ } ++} ++ ++/* ++ * Determine which stack to use.. ++ */ ++static inline abi_ulong get_sigframe(struct target_sigaction *ka, ++ CPULOONGARCHState *regs, ++ size_t frame_size) ++{ ++ unsigned long sp; ++ ++ /* ++ * FPU emulator may have its own trampoline active just ++ * above the user stack, 16-bytes before the next lowest ++ * 16 byte boundary. Try to avoid trashing it. ++ */ ++ sp = target_sigsp(get_sp_from_cpustate(regs) - 32, ka); ++ ++ return (sp - frame_size) & ~7; ++} ++ ++void setup_rt_frame(int sig, struct target_sigaction *ka, ++ target_siginfo_t *info, target_sigset_t *set, ++ CPULOONGARCHState *env) ++{ ++ struct target_rt_sigframe *frame; ++ abi_ulong frame_addr; ++ int i; ++ ++ frame_addr = get_sigframe(ka, env, sizeof(*frame)); ++ trace_user_setup_rt_frame(env, frame_addr); ++ if (!lock_user_struct(VERIFY_WRITE, frame, frame_addr, 0)) { ++ goto give_sigsegv; ++ } ++ ++ /* ori a7, $r0, TARGET_NR_rt_sigreturn */ ++ /* syscall 0 */ ++ __put_user(0x0380000b + (TARGET_NR_rt_sigreturn << 10), ++ &frame->rs_code[0]); ++ __put_user(0x002b0000, &frame->rs_code[1]); ++ ++ tswap_siginfo(&frame->rs_info, info); ++ ++ __put_user(0, &frame->rs_uc.tuc_flags); ++ __put_user(0, &frame->rs_uc.tuc_link); ++ target_save_altstack(&frame->rs_uc.tuc_stack, env); ++ ++ setup_sigcontext(env, &frame->rs_uc.tuc_mcontext); ++ ++ for (i = 0; i < TARGET_NSIG_WORDS; i++) { ++ __put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]); ++ } ++ ++ /* ++ * Arguments to signal handler: ++ * ++ * a0 = signal number ++ * a1 = pointer to siginfo_t ++ * a2 = pointer to ucontext_t ++ * ++ * $25 and PC point to the signal handler, $29 points to the ++ * struct sigframe. ++ */ ++ env->active_tc.gpr[4] = sig; ++ env->active_tc.gpr[5] = ++ frame_addr + offsetof(struct target_rt_sigframe, rs_info); ++ env->active_tc.gpr[6] = ++ frame_addr + offsetof(struct target_rt_sigframe, rs_uc); ++ env->active_tc.gpr[3] = frame_addr; ++ env->active_tc.gpr[1] = ++ frame_addr + offsetof(struct target_rt_sigframe, rs_code); ++ /* ++ * The original kernel code sets CP0_ERA to the handler ++ * since it returns to userland using ertn ++ * we cannot do this here, and we must set PC directly ++ */ ++ env->active_tc.PC = env->active_tc.gpr[20] = ka->_sa_handler; ++ unlock_user_struct(frame, frame_addr, 1); ++ return; ++ ++give_sigsegv: ++ unlock_user_struct(frame, frame_addr, 1); ++ force_sigsegv(sig); ++} ++ ++long do_rt_sigreturn(CPULOONGARCHState *env) ++{ ++ struct target_rt_sigframe *frame; ++ abi_ulong frame_addr; ++ sigset_t blocked; ++ ++ frame_addr = env->active_tc.gpr[3]; ++ trace_user_do_rt_sigreturn(env, frame_addr); ++ if (!lock_user_struct(VERIFY_READ, frame, frame_addr, 1)) { ++ goto badframe; ++ } ++ ++ target_to_host_sigset(&blocked, &frame->rs_uc.tuc_sigmask); ++ set_sigmask(&blocked); ++ ++ restore_sigcontext(env, &frame->rs_uc.tuc_mcontext); ++ ++ if (do_sigaltstack( ++ frame_addr + offsetof(struct target_rt_sigframe, rs_uc.tuc_stack), ++ 0, get_sp_from_cpustate(env)) == -EFAULT) ++ goto badframe; ++ ++ env->active_tc.PC = env->CSR_ERA; ++ /* ++ * I am not sure this is right, but it seems to work ++ * maybe a problem with nested signals ? ++ */ ++ env->CSR_ERA = 0; ++ return -TARGET_QEMU_ESIGRETURN; ++ ++badframe: ++ force_sig(TARGET_SIGSEGV); ++ return -TARGET_QEMU_ESIGRETURN; ++} +diff --git a/linux-user/loongarch64/sockbits.h b/linux-user/loongarch64/sockbits.h +new file mode 100644 +index 0000000000..8bcbfcb060 +--- /dev/null ++++ b/linux-user/loongarch64/sockbits.h +@@ -0,0 +1,18 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "../generic/sockbits.h" +diff --git a/linux-user/loongarch64/syscall_nr.h b/linux-user/loongarch64/syscall_nr.h +new file mode 100644 +index 0000000000..0217ad77f9 +--- /dev/null ++++ b/linux-user/loongarch64/syscall_nr.h +@@ -0,0 +1,304 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LINUX_USER_LOONGARCH_SYSCALL_NR_H ++#define LINUX_USER_LOONGARCH_SYSCALL_NR_H ++ ++#define TARGET_NR_io_setup 0 ++#define TARGET_NR_io_destroy 1 ++#define TARGET_NR_io_submit 2 ++#define TARGET_NR_io_cancel 3 ++#define TARGET_NR_io_getevents 4 ++#define TARGET_NR_setxattr 5 ++#define TARGET_NR_lsetxattr 6 ++#define TARGET_NR_fsetxattr 7 ++#define TARGET_NR_getxattr 8 ++#define TARGET_NR_lgetxattr 9 ++#define TARGET_NR_fgetxattr 10 ++#define TARGET_NR_listxattr 11 ++#define TARGET_NR_llistxattr 12 ++#define TARGET_NR_flistxattr 13 ++#define TARGET_NR_removexattr 14 ++#define TARGET_NR_lremovexattr 15 ++#define TARGET_NR_fremovexattr 16 ++#define TARGET_NR_getcwd 17 ++#define TARGET_NR_lookup_dcookie 18 ++#define TARGET_NR_eventfd2 19 ++#define TARGET_NR_epoll_create1 20 ++#define TARGET_NR_epoll_ctl 21 ++#define TARGET_NR_epoll_pwait 22 ++#define TARGET_NR_dup 23 ++#define TARGET_NR_dup3 24 ++#define TARGET_NR_fcntl 25 ++#define TARGET_NR_inotify_init1 26 ++#define TARGET_NR_inotify_add_watch 27 ++#define TARGET_NR_inotify_rm_watch 28 ++#define TARGET_NR_ioctl 29 ++#define TARGET_NR_ioprio_set 30 ++#define TARGET_NR_ioprio_get 31 ++#define TARGET_NR_flock 32 ++#define TARGET_NR_mknodat 33 ++#define TARGET_NR_mkdirat 34 ++#define TARGET_NR_unlinkat 35 ++#define TARGET_NR_symlinkat 36 ++#define TARGET_NR_linkat 37 ++#define TARGET_NR_renameat 38 ++#define TARGET_NR_umount2 39 ++#define TARGET_NR_mount 40 ++#define TARGET_NR_pivot_root 41 ++#define TARGET_NR_nfsservctl 42 ++#define TARGET_NR_statfs 43 ++#define TARGET_NR_fstatfs 44 ++#define TARGET_NR_truncate 45 ++#define TARGET_NR_ftruncate 46 ++#define TARGET_NR_fallocate 47 ++#define TARGET_NR_faccessat 48 ++#define TARGET_NR_chdir 49 ++#define TARGET_NR_fchdir 50 ++#define TARGET_NR_chroot 51 ++#define TARGET_NR_fchmod 52 ++#define TARGET_NR_fchmodat 53 ++#define TARGET_NR_fchownat 54 ++#define TARGET_NR_fchown 55 ++#define TARGET_NR_openat 56 ++#define TARGET_NR_close 57 ++#define TARGET_NR_vhangup 58 ++#define TARGET_NR_pipe2 59 ++#define TARGET_NR_quotactl 60 ++#define TARGET_NR_getdents64 61 ++#define TARGET_NR_lseek 62 ++#define TARGET_NR_read 63 ++#define TARGET_NR_write 64 ++#define TARGET_NR_readv 65 ++#define TARGET_NR_writev 66 ++#define TARGET_NR_pread64 67 ++#define TARGET_NR_pwrite64 68 ++#define TARGET_NR_preadv 69 ++#define TARGET_NR_pwritev 70 ++#define TARGET_NR_sendfile 71 ++#define TARGET_NR_pselect6 72 ++#define TARGET_NR_ppoll 73 ++#define TARGET_NR_signalfd4 74 ++#define TARGET_NR_vmsplice 75 ++#define TARGET_NR_splice 76 ++#define TARGET_NR_tee 77 ++#define TARGET_NR_readlinkat 78 ++#define TARGET_NR_newfstatat 79 ++#define TARGET_NR_fstat 80 ++#define TARGET_NR_sync 81 ++#define TARGET_NR_fsync 82 ++#define TARGET_NR_fdatasync 83 ++#define TARGET_NR_sync_file_range 84 ++#define TARGET_NR_timerfd_create 85 ++#define TARGET_NR_timerfd_settime 86 ++#define TARGET_NR_timerfd_gettime 87 ++#define TARGET_NR_utimensat 88 ++#define TARGET_NR_acct 89 ++#define TARGET_NR_capget 90 ++#define TARGET_NR_capset 91 ++#define TARGET_NR_personality 92 ++#define TARGET_NR_exit 93 ++#define TARGET_NR_exit_group 94 ++#define TARGET_NR_waitid 95 ++#define TARGET_NR_set_tid_address 96 ++#define TARGET_NR_unshare 97 ++#define TARGET_NR_futex 98 ++#define TARGET_NR_set_robust_list 99 ++#define TARGET_NR_get_robust_list 100 ++#define TARGET_NR_nanosleep 101 ++#define TARGET_NR_getitimer 102 ++#define TARGET_NR_setitimer 103 ++#define TARGET_NR_kexec_load 104 ++#define TARGET_NR_init_module 105 ++#define TARGET_NR_delete_module 106 ++#define TARGET_NR_timer_create 107 ++#define TARGET_NR_timer_gettime 108 ++#define TARGET_NR_timer_getoverrun 109 ++#define TARGET_NR_timer_settime 110 ++#define TARGET_NR_timer_delete 111 ++#define TARGET_NR_clock_settime 112 ++#define TARGET_NR_clock_gettime 113 ++#define TARGET_NR_clock_getres 114 ++#define TARGET_NR_clock_nanosleep 115 ++#define TARGET_NR_syslog 116 ++#define TARGET_NR_ptrace 117 ++#define TARGET_NR_sched_setparam 118 ++#define TARGET_NR_sched_setscheduler 119 ++#define TARGET_NR_sched_getscheduler 120 ++#define TARGET_NR_sched_getparam 121 ++#define TARGET_NR_sched_setaffinity 122 ++#define TARGET_NR_sched_getaffinity 123 ++#define TARGET_NR_sched_yield 124 ++#define TARGET_NR_sched_get_priority_max 125 ++#define TARGET_NR_sched_get_priority_min 126 ++#define TARGET_NR_sched_rr_get_interval 127 ++#define TARGET_NR_restart_syscall 128 ++#define TARGET_NR_kill 129 ++#define TARGET_NR_tkill 130 ++#define TARGET_NR_tgkill 131 ++#define TARGET_NR_sigaltstack 132 ++#define TARGET_NR_rt_sigsuspend 133 ++#define TARGET_NR_rt_sigaction 134 ++#define TARGET_NR_rt_sigprocmask 135 ++#define TARGET_NR_rt_sigpending 136 ++#define TARGET_NR_rt_sigtimedwait 137 ++#define TARGET_NR_rt_sigqueueinfo 138 ++#define TARGET_NR_rt_sigreturn 139 ++#define TARGET_NR_setpriority 140 ++#define TARGET_NR_getpriority 141 ++#define TARGET_NR_reboot 142 ++#define TARGET_NR_setregid 143 ++#define TARGET_NR_setgid 144 ++#define TARGET_NR_setreuid 145 ++#define TARGET_NR_setuid 146 ++#define TARGET_NR_setresuid 147 ++#define TARGET_NR_getresuid 148 ++#define TARGET_NR_setresgid 149 ++#define TARGET_NR_getresgid 150 ++#define TARGET_NR_setfsuid 151 ++#define TARGET_NR_setfsgid 152 ++#define TARGET_NR_times 153 ++#define TARGET_NR_setpgid 154 ++#define TARGET_NR_getpgid 155 ++#define TARGET_NR_getsid 156 ++#define TARGET_NR_setsid 157 ++#define TARGET_NR_getgroups 158 ++#define TARGET_NR_setgroups 159 ++#define TARGET_NR_uname 160 ++#define TARGET_NR_sethostname 161 ++#define TARGET_NR_setdomainname 162 ++#define TARGET_NR_getrlimit 163 ++#define TARGET_NR_setrlimit 164 ++#define TARGET_NR_getrusage 165 ++#define TARGET_NR_umask 166 ++#define TARGET_NR_prctl 167 ++#define TARGET_NR_getcpu 168 ++#define TARGET_NR_gettimeofday 169 ++#define TARGET_NR_settimeofday 170 ++#define TARGET_NR_adjtimex 171 ++#define TARGET_NR_getpid 172 ++#define TARGET_NR_getppid 173 ++#define TARGET_NR_getuid 174 ++#define TARGET_NR_geteuid 175 ++#define TARGET_NR_getgid 176 ++#define TARGET_NR_getegid 177 ++#define TARGET_NR_gettid 178 ++#define TARGET_NR_sysinfo 179 ++#define TARGET_NR_mq_open 180 ++#define TARGET_NR_mq_unlink 181 ++#define TARGET_NR_mq_timedsend 182 ++#define TARGET_NR_mq_timedreceive 183 ++#define TARGET_NR_mq_notify 184 ++#define TARGET_NR_mq_getsetattr 185 ++#define TARGET_NR_msgget 186 ++#define TARGET_NR_msgctl 187 ++#define TARGET_NR_msgrcv 188 ++#define TARGET_NR_msgsnd 189 ++#define TARGET_NR_semget 190 ++#define TARGET_NR_semctl 191 ++#define TARGET_NR_semtimedop 192 ++#define TARGET_NR_semop 193 ++#define TARGET_NR_shmget 194 ++#define TARGET_NR_shmctl 195 ++#define TARGET_NR_shmat 196 ++#define TARGET_NR_shmdt 197 ++#define TARGET_NR_socket 198 ++#define TARGET_NR_socketpair 199 ++#define TARGET_NR_bind 200 ++#define TARGET_NR_listen 201 ++#define TARGET_NR_accept 202 ++#define TARGET_NR_connect 203 ++#define TARGET_NR_getsockname 204 ++#define TARGET_NR_getpeername 205 ++#define TARGET_NR_sendto 206 ++#define TARGET_NR_recvfrom 207 ++#define TARGET_NR_setsockopt 208 ++#define TARGET_NR_getsockopt 209 ++#define TARGET_NR_shutdown 210 ++#define TARGET_NR_sendmsg 211 ++#define TARGET_NR_recvmsg 212 ++#define TARGET_NR_readahead 213 ++#define TARGET_NR_brk 214 ++#define TARGET_NR_munmap 215 ++#define TARGET_NR_mremap 216 ++#define TARGET_NR_add_key 217 ++#define TARGET_NR_request_key 218 ++#define TARGET_NR_keyctl 219 ++#define TARGET_NR_clone 220 ++#define TARGET_NR_execve 221 ++#define TARGET_NR_mmap 222 ++#define TARGET_NR_fadvise64 223 ++#define TARGET_NR_swapon 224 ++#define TARGET_NR_swapoff 225 ++#define TARGET_NR_mprotect 226 ++#define TARGET_NR_msync 227 ++#define TARGET_NR_mlock 228 ++#define TARGET_NR_munlock 229 ++#define TARGET_NR_mlockall 230 ++#define TARGET_NR_munlockall 231 ++#define TARGET_NR_mincore 232 ++#define TARGET_NR_madvise 233 ++#define TARGET_NR_remap_file_pages 234 ++#define TARGET_NR_mbind 235 ++#define TARGET_NR_get_mempolicy 236 ++#define TARGET_NR_set_mempolicy 237 ++#define TARGET_NR_migrate_pages 238 ++#define TARGET_NR_move_pages 239 ++#define TARGET_NR_rt_tgsigqueueinfo 240 ++#define TARGET_NR_perf_event_open 241 ++#define TARGET_NR_accept4 242 ++#define TARGET_NR_recvmmsg 243 ++#define TARGET_NR_arch_specific_syscall 244 ++#define TARGET_NR_wait4 260 ++#define TARGET_NR_prlimit64 261 ++#define TARGET_NR_fanotify_init 262 ++#define TARGET_NR_fanotify_mark 263 ++#define TARGET_NR_name_to_handle_at 264 ++#define TARGET_NR_open_by_handle_at 265 ++#define TARGET_NR_clock_adjtime 266 ++#define TARGET_NR_syncfs 267 ++#define TARGET_NR_setns 268 ++#define TARGET_NR_sendmmsg 269 ++#define TARGET_NR_process_vm_readv 270 ++#define TARGET_NR_process_vm_writev 271 ++#define TARGET_NR_kcmp 272 ++#define TARGET_NR_finit_module 273 ++#define TARGET_NR_sched_setattr 274 ++#define TARGET_NR_sched_getattr 275 ++#define TARGET_NR_renameat2 276 ++#define TARGET_NR_seccomp 277 ++#define TARGET_NR_getrandom 278 ++#define TARGET_NR_memfd_create 279 ++#define TARGET_NR_bpf 280 ++#define TARGET_NR_execveat 281 ++#define TARGET_NR_userfaultfd 282 ++#define TARGET_NR_membarrier 283 ++#define TARGET_NR_mlock2 284 ++#define TARGET_NR_copy_file_range 285 ++#define TARGET_NR_preadv2 286 ++#define TARGET_NR_pwritev2 287 ++#define TARGET_NR_pkey_mprotect 288 ++#define TARGET_NR_pkey_alloc 289 ++#define TARGET_NR_pkey_free 290 ++#define TARGET_NR_statx 291 ++#define TARGET_NR_io_pgetevents 292 ++#define TARGET_NR_rseq 293 ++#define TARGET_NR_kexec_file_load 294 ++ ++#define TARGET_NR_syscalls (TARGET_NR_kexec_file_load + 1) ++ ++#endif +diff --git a/linux-user/loongarch64/target_cpu.h b/linux-user/loongarch64/target_cpu.h +new file mode 100644 +index 0000000000..c4bdb4648b +--- /dev/null ++++ b/linux-user/loongarch64/target_cpu.h +@@ -0,0 +1,47 @@ ++/* ++ * loongarch specific CPU ABI and functions for linux-user ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_TARGET_CPU_H ++#define LOONGARCH_TARGET_CPU_H ++ ++static inline void cpu_clone_regs_child(CPULOONGARCHState *env, ++ target_ulong newsp, unsigned flags) ++{ ++ if (newsp) { ++ env->active_tc.gpr[3] = newsp; ++ } ++ env->active_tc.gpr[7] = 0; ++ env->active_tc.gpr[4] = 0; ++} ++ ++static inline void cpu_clone_regs_parent(CPULOONGARCHState *env, ++ unsigned flags) ++{ ++} ++ ++static inline void cpu_set_tls(CPULOONGARCHState *env, target_ulong newtls) ++{ ++ env->active_tc.gpr[2] = newtls; ++} ++ ++static inline abi_ulong get_sp_from_cpustate(CPULOONGARCHState *state) ++{ ++ return state->active_tc.gpr[3]; ++} ++#endif +diff --git a/linux-user/loongarch64/target_elf.h b/linux-user/loongarch64/target_elf.h +new file mode 100644 +index 0000000000..2290a9a6d1 +--- /dev/null ++++ b/linux-user/loongarch64/target_elf.h +@@ -0,0 +1,24 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_TARGET_ELF_H ++#define LOONGARCH_TARGET_ELF_H ++static inline const char *cpu_get_model(uint32_t eflags) ++{ ++ return "Loongson-3A5000"; ++} ++#endif +diff --git a/linux-user/loongarch64/target_fcntl.h b/linux-user/loongarch64/target_fcntl.h +new file mode 100644 +index 0000000000..9a2bc1cef5 +--- /dev/null ++++ b/linux-user/loongarch64/target_fcntl.h +@@ -0,0 +1,23 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_TARGET_FCNTL_H ++#define LOONGARCH_TARGET_FCNTL_H ++ ++#include "../generic/fcntl.h" ++ ++#endif /* LOONGARCH_TARGET_FCNTL_H */ +diff --git a/linux-user/loongarch64/target_signal.h b/linux-user/loongarch64/target_signal.h +new file mode 100644 +index 0000000000..be98151723 +--- /dev/null ++++ b/linux-user/loongarch64/target_signal.h +@@ -0,0 +1,40 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_TARGET_SIGNAL_H ++#define LOONGARCH_TARGET_SIGNAL_H ++ ++/* this struct defines a stack used during syscall handling */ ++ ++typedef struct target_sigaltstack { ++ abi_long ss_sp; ++ abi_int ss_flags; ++ abi_ulong ss_size; ++} target_stack_t; ++ ++/* ++ * sigaltstack controls ++ */ ++#define TARGET_SS_ONSTACK 1 ++#define TARGET_SS_DISABLE 2 ++ ++#define TARGET_MINSIGSTKSZ 2048 ++#define TARGET_SIGSTKSZ 8192 ++ ++#include "../generic/signal.h" ++ ++#endif /* LOONGARCH_TARGET_SIGNAL_H */ +diff --git a/linux-user/loongarch64/target_structs.h b/linux-user/loongarch64/target_structs.h +new file mode 100644 +index 0000000000..53e7b3e0e2 +--- /dev/null ++++ b/linux-user/loongarch64/target_structs.h +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_TARGET_STRUCTS_H ++#define LOONGARCH_TARGET_STRUCTS_H ++ ++struct target_ipc_perm { ++ abi_int __key; /* Key. */ ++ abi_uint uid; /* Owner's user ID. */ ++ abi_uint gid; /* Owner's group ID. */ ++ abi_uint cuid; /* Creator's user ID. */ ++ abi_uint cgid; /* Creator's group ID. */ ++ abi_uint mode; /* Read/write permission. */ ++ abi_ushort __seq; /* Sequence number. */ ++ abi_ushort __pad1; ++ abi_ulong __unused1; ++ abi_ulong __unused2; ++}; ++ ++struct target_shmid_ds { ++ struct target_ipc_perm shm_perm; /* operation permission struct */ ++ abi_long shm_segsz; /* size of segment in bytes */ ++ abi_ulong shm_atime; /* time of last shmat() */ ++ abi_ulong shm_dtime; /* time of last shmdt() */ ++ abi_ulong shm_ctime; /* time of last change by shmctl() */ ++ abi_int shm_cpid; /* pid of creator */ ++ abi_int shm_lpid; /* pid of last shmop */ ++ abi_ulong shm_nattch; /* number of current attaches */ ++ abi_ulong __unused1; ++ abi_ulong __unused2; ++}; ++ ++#define TARGET_SEMID64_DS ++ ++/* ++ * The semid64_ds structure for the MIPS architecture. ++ * Note extra padding because this structure is passed back and forth ++ * between kernel and user space. ++ */ ++struct target_semid64_ds { ++ struct target_ipc_perm sem_perm; ++ abi_ulong sem_otime; ++ abi_ulong sem_ctime; ++ abi_ulong sem_nsems; ++ abi_ulong __unused1; ++ abi_ulong __unused2; ++}; ++ ++#endif +diff --git a/linux-user/loongarch64/target_syscall.h b/linux-user/loongarch64/target_syscall.h +new file mode 100644 +index 0000000000..6acc015b85 +--- /dev/null ++++ b/linux-user/loongarch64/target_syscall.h +@@ -0,0 +1,63 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_TARGET_SYSCALL_H ++#define LOONGARCH_TARGET_SYSCALL_H ++ ++/* ++ * this struct defines the way the registers are stored on the ++ * stack during a system call. ++ */ ++ ++struct target_pt_regs { ++ /* Saved main processor registers. */ ++ target_ulong regs[32]; ++ ++ /* Saved special registers. */ ++ /* Saved special registers. */ ++ target_ulong csr_crmd; ++ target_ulong csr_prmd; ++ target_ulong csr_euen; ++ target_ulong csr_ecfg; ++ target_ulong csr_estat; ++ target_ulong csr_era; ++ target_ulong csr_badvaddr; ++ target_ulong orig_a0; ++ target_ulong __last[0]; ++}; ++ ++#define UNAME_MACHINE "loongarch" ++#define UNAME_MINIMUM_RELEASE "2.6.32" ++ ++#define TARGET_CLONE_BACKWARDS ++#define TARGET_MINSIGSTKSZ 2048 ++#define TARGET_MLOCKALL_MCL_CURRENT 1 ++#define TARGET_MLOCKALL_MCL_FUTURE 2 ++ ++#define TARGET_FORCE_SHMLBA ++ ++static inline abi_ulong target_shmlba(CPULOONGARCHState *env) ++{ ++ return 0x40000; ++} ++ ++#define TARGET_PR_SET_FP_MODE 45 ++#define TARGET_PR_GET_FP_MODE 46 ++#define TARGET_PR_FP_MODE_FR (1 << 0) ++#define TARGET_PR_FP_MODE_FRE (1 << 1) ++ ++#endif /* LOONGARCH_TARGET_SYSCALL_H */ +diff --git a/linux-user/loongarch64/termbits.h b/linux-user/loongarch64/termbits.h +new file mode 100644 +index 0000000000..dd251e14b3 +--- /dev/null ++++ b/linux-user/loongarch64/termbits.h +@@ -0,0 +1,241 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LINUX_USER_LOONGARCH_TERMBITS_H ++#define LINUX_USER_LOONGARCH_TERMBITS_H ++ ++#define TARGET_NCCS 19 ++ ++struct target_termios { ++ unsigned int c_iflag; /* input mode flags */ ++ unsigned int c_oflag; /* output mode flags */ ++ unsigned int c_cflag; /* control mode flags */ ++ unsigned int c_lflag; /* local mode flags */ ++ unsigned char c_line; /* line discipline */ ++ unsigned char c_cc[TARGET_NCCS]; /* control characters */ ++}; ++ ++/* c_iflag bits */ ++#define TARGET_IGNBRK 0000001 ++#define TARGET_BRKINT 0000002 ++#define TARGET_IGNPAR 0000004 ++#define TARGET_PARMRK 0000010 ++#define TARGET_INPCK 0000020 ++#define TARGET_ISTRIP 0000040 ++#define TARGET_INLCR 0000100 ++#define TARGET_IGNCR 0000200 ++#define TARGET_ICRNL 0000400 ++#define TARGET_IUCLC 0001000 ++#define TARGET_IXON 0002000 ++#define TARGET_IXANY 0004000 ++#define TARGET_IXOFF 0010000 ++#define TARGET_IMAXBEL 0020000 ++#define TARGET_IUTF8 0040000 ++ ++/* c_oflag bits */ ++#define TARGET_OPOST 0000001 ++#define TARGET_OLCUC 0000002 ++#define TARGET_ONLCR 0000004 ++#define TARGET_OCRNL 0000010 ++#define TARGET_ONOCR 0000020 ++#define TARGET_ONLRET 0000040 ++#define TARGET_OFILL 0000100 ++#define TARGET_OFDEL 0000200 ++#define TARGET_NLDLY 0000400 ++#define TARGET_NL0 0000000 ++#define TARGET_NL1 0000400 ++#define TARGET_CRDLY 0003000 ++#define TARGET_CR0 0000000 ++#define TARGET_CR1 0001000 ++#define TARGET_CR2 0002000 ++#define TARGET_CR3 0003000 ++#define TARGET_TABDLY 0014000 ++#define TARGET_TAB0 0000000 ++#define TARGET_TAB1 0004000 ++#define TARGET_TAB2 0010000 ++#define TARGET_TAB3 0014000 ++#define TARGET_XTABS 0014000 ++#define TARGET_BSDLY 0020000 ++#define TARGET_BS0 0000000 ++#define TARGET_BS1 0020000 ++#define TARGET_VTDLY 0040000 ++#define TARGET_VT0 0000000 ++#define TARGET_VT1 0040000 ++#define TARGET_FFDLY 0100000 ++#define TARGET_FF0 0000000 ++#define TARGET_FF1 0100000 ++ ++/* c_cflag bit meaning */ ++#define TARGET_CBAUD 0010017 ++#define TARGET_B0 0000000 /* hang up */ ++#define TARGET_B50 0000001 ++#define TARGET_B75 0000002 ++#define TARGET_B110 0000003 ++#define TARGET_B134 0000004 ++#define TARGET_B150 0000005 ++#define TARGET_B200 0000006 ++#define TARGET_B300 0000007 ++#define TARGET_B600 0000010 ++#define TARGET_B1200 0000011 ++#define TARGET_B1800 0000012 ++#define TARGET_B2400 0000013 ++#define TARGET_B4800 0000014 ++#define TARGET_B9600 0000015 ++#define TARGET_B19200 0000016 ++#define TARGET_B38400 0000017 ++#define TARGET_EXTA B19200 ++#define TARGET_EXTB B38400 ++#define TARGET_CSIZE 0000060 ++#define TARGET_CS5 0000000 ++#define TARGET_CS6 0000020 ++#define TARGET_CS7 0000040 ++#define TARGET_CS8 0000060 ++#define TARGET_CSTOPB 0000100 ++#define TARGET_CREAD 0000200 ++#define TARGET_PARENB 0000400 ++#define TARGET_PARODD 0001000 ++#define TARGET_HUPCL 0002000 ++#define TARGET_CLOCAL 0004000 ++#define TARGET_CBAUDEX 0010000 ++#define TARGET_B57600 0010001 ++#define TARGET_B115200 0010002 ++#define TARGET_B230400 0010003 ++#define TARGET_B460800 0010004 ++#define TARGET_CIBAUD 002003600000 /* input baud rate (not used) */ ++#define TARGET_CMSPAR 010000000000 /* mark or space (stick) parity */ ++#define TARGET_CRTSCTS 020000000000 /* flow control */ ++ ++/* c_lflag bits */ ++#define TARGET_ISIG 0000001 ++#define TARGET_ICANON 0000002 ++#define TARGET_XCASE 0000004 ++#define TARGET_ECHO 0000010 ++#define TARGET_ECHOE 0000020 ++#define TARGET_ECHOK 0000040 ++#define TARGET_ECHONL 0000100 ++#define TARGET_NOFLSH 0000200 ++#define TARGET_TOSTOP 0000400 ++#define TARGET_ECHOCTL 0001000 ++#define TARGET_ECHOPRT 0002000 ++#define TARGET_ECHOKE 0004000 ++#define TARGET_FLUSHO 0010000 ++#define TARGET_PENDIN 0040000 ++#define TARGET_IEXTEN 0100000 ++ ++/* c_cc character offsets */ ++#define TARGET_VINTR 0 ++#define TARGET_VQUIT 1 ++#define TARGET_VERASE 2 ++#define TARGET_VKILL 3 ++#define TARGET_VEOF 4 ++#define TARGET_VTIME 5 ++#define TARGET_VMIN 6 ++#define TARGET_VSWTC 7 ++#define TARGET_VSTART 8 ++#define TARGET_VSTOP 9 ++#define TARGET_VSUSP 10 ++#define TARGET_VEOL 11 ++#define TARGET_VREPRINT 12 ++#define TARGET_VDISCARD 13 ++#define TARGET_VWERASE 14 ++#define TARGET_VLNEXT 15 ++#define TARGET_VEOL2 16 ++ ++/* ioctls */ ++ ++#define TARGET_TCGETS 0x5401 ++#define TARGET_TCSETS 0x5402 ++#define TARGET_TCSETSW 0x5403 ++#define TARGET_TCSETSF 0x5404 ++#define TARGET_TCGETA 0x5405 ++#define TARGET_TCSETA 0x5406 ++#define TARGET_TCSETAW 0x5407 ++#define TARGET_TCSETAF 0x5408 ++#define TARGET_TCSBRK 0x5409 ++#define TARGET_TCXONC 0x540A ++#define TARGET_TCFLSH 0x540B ++ ++#define TARGET_TIOCEXCL 0x540C ++#define TARGET_TIOCNXCL 0x540D ++#define TARGET_TIOCSCTTY 0x540E ++#define TARGET_TIOCGPGRP 0x540F ++#define TARGET_TIOCSPGRP 0x5410 ++#define TARGET_TIOCOUTQ 0x5411 ++#define TARGET_TIOCSTI 0x5412 ++#define TARGET_TIOCGWINSZ 0x5413 ++#define TARGET_TIOCSWINSZ 0x5414 ++#define TARGET_TIOCMGET 0x5415 ++#define TARGET_TIOCMBIS 0x5416 ++#define TARGET_TIOCMBIC 0x5417 ++#define TARGET_TIOCMSET 0x5418 ++#define TARGET_TIOCGSOFTCAR 0x5419 ++#define TARGET_TIOCSSOFTCAR 0x541A ++#define TARGET_FIONREAD 0x541B ++#define TARGET_TIOCINQ TARGET_FIONREAD ++#define TARGET_TIOCLINUX 0x541C ++#define TARGET_TIOCCONS 0x541D ++#define TARGET_TIOCGSERIAL 0x541E ++#define TARGET_TIOCSSERIAL 0x541F ++#define TARGET_TIOCPKT 0x5420 ++#define TARGET_FIONBIO 0x5421 ++#define TARGET_TIOCNOTTY 0x5422 ++#define TARGET_TIOCSETD 0x5423 ++#define TARGET_TIOCGETD 0x5424 ++#define TARGET_TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ ++#define TARGET_TIOCTTYGSTRUCT 0x5426 /* For debugging only */ ++#define TARGET_TIOCSBRK 0x5427 /* BSD compatibility */ ++#define TARGET_TIOCCBRK 0x5428 /* BSD compatibility */ ++#define TARGET_TIOCGSID 0x5429 /* Return the session ID of FD */ ++/* Get Pty Number (of pty-mux device) */ ++#define TARGET_TIOCGPTN TARGET_IOR('T', 0x30, unsigned int) ++/* Lock/unlock Pty */ ++#define TARGET_TIOCSPTLCK TARGET_IOW('T', 0x31, int) ++/* Safely open the slave */ ++#define TARGET_TIOCGPTPEER TARGET_IO('T', 0x41) ++ ++#define TARGET_FIONCLEX 0x5450 /* these numbers need to be adjusted. */ ++#define TARGET_FIOCLEX 0x5451 ++#define TARGET_FIOASYNC 0x5452 ++#define TARGET_TIOCSERCONFIG 0x5453 ++#define TARGET_TIOCSERGWILD 0x5454 ++#define TARGET_TIOCSERSWILD 0x5455 ++#define TARGET_TIOCGLCKTRMIOS 0x5456 ++#define TARGET_TIOCSLCKTRMIOS 0x5457 ++#define TARGET_TIOCSERGSTRUCT 0x5458 /* For debugging only */ ++#define TARGET_TIOCSERGETLSR 0x5459 /* Get line status register */ ++#define TARGET_TIOCSERGETMULTI 0x545A /* Get multiport config */ ++#define TARGET_TIOCSERSETMULTI 0x545B /* Set multiport config */ ++ ++/* wait for a change on serial input line(s) */ ++#define TARGET_TIOCMIWAIT 0x545C ++/* read serial port inline interrupt counts */ ++#define TARGET_TIOCGICOUNT 0x545D ++#define TARGET_TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ ++#define TARGET_TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ ++ ++/* Used for packet mode */ ++#define TARGET_TIOCPKT_DATA 0 ++#define TARGET_TIOCPKT_FLUSHREAD 1 ++#define TARGET_TIOCPKT_FLUSHWRITE 2 ++#define TARGET_TIOCPKT_STOP 4 ++#define TARGET_TIOCPKT_START 8 ++#define TARGET_TIOCPKT_NOSTOP 16 ++#define TARGET_TIOCPKT_DOSTOP 32 ++ ++#define TARGET_TIOCSER_TEMT 0x01 /* Transmitter physically empty */ ++ ++#endif +diff --git a/linux-user/meson.build b/linux-user/meson.build +index 4f4196ed13..8b8edefa6e 100644 +--- a/linux-user/meson.build ++++ b/linux-user/meson.build +@@ -40,3 +40,4 @@ subdir('sparc') + subdir('sw64') + subdir('x86_64') + subdir('xtensa') ++subdir('loongarch64') +diff --git a/linux-user/qemu.h b/linux-user/qemu.h +index 5c713fa8ab..66ddb25d1c 100644 +--- a/linux-user/qemu.h ++++ b/linux-user/qemu.h +@@ -61,7 +61,7 @@ struct image_info { + /* For target-specific processing of NT_GNU_PROPERTY_TYPE_0. */ + uint32_t note_flags; + +-#ifdef TARGET_MIPS ++#if defined(TARGET_MIPS) || defined(TARGET_LOONGARCH64) + int fp_abi; + int interp_fp_abi; + #endif +diff --git a/linux-user/syscall.c b/linux-user/syscall.c +index fce2c03259..a544d04524 100644 +--- a/linux-user/syscall.c ++++ b/linux-user/syscall.c +@@ -1614,6 +1614,9 @@ static abi_long do_pipe(void *cpu_env, abi_ulong pipedes, + #elif defined(TARGET_MIPS) + ((CPUMIPSState*)cpu_env)->active_tc.gpr[3] = host_pipe[1]; + return host_pipe[0]; ++#elif defined(TARGET_LOONGARCH64) ++ ((CPULOONGARCHState *)cpu_env)->active_tc.gpr[5] = host_pipe[1]; ++ return host_pipe[0]; + #elif defined(TARGET_SH4) + ((CPUSH4State*)cpu_env)->gregs[1] = host_pipe[1]; + return host_pipe[0]; +diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h +index 0b13975937..04ca5fe7a0 100644 +--- a/linux-user/syscall_defs.h ++++ b/linux-user/syscall_defs.h +@@ -74,7 +74,7 @@ + || defined(TARGET_M68K) || defined(TARGET_CRIS) \ + || defined(TARGET_S390X) || defined(TARGET_OPENRISC) \ + || defined(TARGET_NIOS2) || defined(TARGET_RISCV) \ +- || defined(TARGET_XTENSA) ++ || defined(TARGET_XTENSA) || defined(TARGET_LOONGARCH64) + + #define TARGET_IOC_SIZEBITS 14 + #define TARGET_IOC_DIRBITS 2 +@@ -450,7 +450,7 @@ struct target_dirent64 { + #define TARGET_SIG_IGN ((abi_long)1) /* ignore signal */ + #define TARGET_SIG_ERR ((abi_long)-1) /* error return from signal */ + +-#ifdef TARGET_MIPS ++#if defined(TARGET_MIPS) || defined(TARGET_LOONGARCH64) + #define TARGET_NSIG 128 + #else + #define TARGET_NSIG 64 +@@ -2133,7 +2133,8 @@ struct target_stat64 { + abi_ulong __unused5; + }; + +-#elif defined(TARGET_OPENRISC) || defined(TARGET_NIOS2) || defined(TARGET_RISCV) ++#elif defined(TARGET_OPENRISC) || defined(TARGET_NIOS2) || \ ++ defined(TARGET_RISCV) || defined(TARGET_LOONGARCH64) + + /* These are the asm-generic versions of the stat and stat64 structures */ + +@@ -2161,7 +2162,7 @@ struct target_stat { + unsigned int __unused5; + }; + +-#if !defined(TARGET_RISCV64) ++#if !(defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64)) + #define TARGET_HAS_STRUCT_STAT64 + struct target_stat64 { + uint64_t st_dev; +@@ -2331,6 +2332,7 @@ struct target_statfs64 { + }; + #elif (defined(TARGET_PPC64) || defined(TARGET_X86_64) || \ + defined(TARGET_SPARC64) || defined(TARGET_AARCH64) || \ ++ defined(TARGET_LOONGARCH64) || \ + defined(TARGET_RISCV)) && !defined(TARGET_ABI32) + struct target_statfs { + abi_long f_type; +diff --git a/meson.build b/meson.build +index d0bbceffe1..d80426b3e8 100644 +--- a/meson.build ++++ b/meson.build +@@ -56,7 +56,7 @@ python = import('python').find_installation() + + supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] + supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64', +- 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64', 'sw64'] ++ 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64', 'sw64', 'loongarch64'] + + cpu = host_machine.cpu_family() + +@@ -83,6 +83,8 @@ elif cpu in ['mips', 'mips64'] + kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu'] + elif cpu == 'sw64' + kvm_targets = ['sw64-softmmu'] ++elif cpu == 'loongarch64' ++ kvm_targets = ['loongarch64-softmmu'] + else + kvm_targets = [] + endif +@@ -367,6 +369,8 @@ if not get_option('tcg').disabled() + tcg_arch = 'ppc' + elif config_host['ARCH'] in ['sw64'] + tcg_arch = 'sw64' ++ elif config_host['ARCH'] == 'loongarch64' ++ tcg_arch = 'loongarch64' + endif + add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch, + language: ['c', 'cpp', 'objc']) +@@ -1822,6 +1826,7 @@ disassemblers = { + 'sh4' : ['CONFIG_SH4_DIS'], + 'sparc' : ['CONFIG_SPARC_DIS'], + 'xtensa' : ['CONFIG_XTENSA_DIS'], ++ 'loongarch64' : ['CONFIG_LOONGARCH_DIS'], + 'sw64' : ['CONFIG_SW64_DIS'], + } + if link_language == 'cpp' +diff --git a/pc-bios/meson.build b/pc-bios/meson.build +index 05e9065ad6..f2a1d111a1 100644 +--- a/pc-bios/meson.build ++++ b/pc-bios/meson.build +@@ -86,6 +86,8 @@ blobs = files( + 'opensbi-riscv32-generic-fw_dynamic.elf', + 'opensbi-riscv64-generic-fw_dynamic.elf', + 'npcm7xx_bootrom.bin', ++ 'loongarch_bios.bin', ++ 'loongarch_vars.bin', + ) + + if get_option('install_blobs') +diff --git a/qapi/machine-target.json b/qapi/machine-target.json +index f5ec4bc172..682dc86b42 100644 +--- a/qapi/machine-target.json ++++ b/qapi/machine-target.json +@@ -324,7 +324,8 @@ + 'TARGET_ARM', + 'TARGET_I386', + 'TARGET_S390X', +- 'TARGET_MIPS' ] } } ++ 'TARGET_MIPS', ++ 'TARGET_LOONGARCH64' ] } } + + ## + # @query-cpu-definitions: +@@ -340,4 +341,5 @@ + 'TARGET_ARM', + 'TARGET_I386', + 'TARGET_S390X', +- 'TARGET_MIPS' ] } } ++ 'TARGET_MIPS', ++ 'TARGET_LOONGARCH64' ] } } +diff --git a/qapi/machine.json b/qapi/machine.json +index 03cfb268a4..31b0350b99 100644 +--- a/qapi/machine.json ++++ b/qapi/machine.json +@@ -34,7 +34,7 @@ + 'mips64el', 'mipsel', 'nios2', 'or1k', 'ppc', + 'ppc64', 'riscv32', 'riscv64', 'rx', 's390x', 'sh4', + 'sh4eb', 'sparc', 'sparc64', 'tricore', +- 'x86_64', 'xtensa', 'xtensaeb' ] } ++ 'x86_64', 'xtensa', 'xtensaeb', 'loongarch64' ] } + + ## + # @CpuS390State: +diff --git a/qapi/misc-target.json b/qapi/misc-target.json +index 4bc45d2474..63cebef573 100644 +--- a/qapi/misc-target.json ++++ b/qapi/misc-target.json +@@ -33,6 +33,7 @@ + 'TARGET_PPC64', + 'TARGET_S390X', + 'TARGET_SH4', ++ 'TARGET_LOONGARCH64', + 'TARGET_SPARC' ] } } + + ## +diff --git a/qemu-options.hx b/qemu-options.hx +index 047d28a357..e62bb6bebd 100644 +--- a/qemu-options.hx ++++ b/qemu-options.hx +@@ -2533,7 +2533,7 @@ DEF("smbios", HAS_ARG, QEMU_OPTION_smbios, + " specify SMBIOS type 17 fields\n" + "-smbios type=41[,designation=str][,kind=str][,instance=%d][,pcidev=str]\n" + " specify SMBIOS type 41 fields\n", +- QEMU_ARCH_I386 | QEMU_ARCH_ARM) ++ QEMU_ARCH_I386 | QEMU_ARCH_ARM | QEMU_ARCH_LOONGARCH64) + SRST + ``-smbios file=binary`` + Load SMBIOS entry from binary file. +diff --git a/softmmu/qdev-monitor.c b/softmmu/qdev-monitor.c +index 142352b24e..4ca4e92ce2 100644 +--- a/softmmu/qdev-monitor.c ++++ b/softmmu/qdev-monitor.c +@@ -62,7 +62,7 @@ typedef struct QDevAlias + QEMU_ARCH_MIPS | QEMU_ARCH_PPC | \ + QEMU_ARCH_RISCV | QEMU_ARCH_SH4 | \ + QEMU_ARCH_SPARC | QEMU_ARCH_XTENSA | \ +- QEMU_ARCH_SW64) ++ QEMU_ARCH_SW64 | QEMU_ARCH_LOONGARCH64) + #define QEMU_ARCH_VIRTIO_CCW (QEMU_ARCH_S390X) + #define QEMU_ARCH_VIRTIO_MMIO (QEMU_ARCH_M68K) + +diff --git a/target/Kconfig b/target/Kconfig +index a8d6cb1e97..b2abc7b60b 100644 +--- a/target/Kconfig ++++ b/target/Kconfig +@@ -4,6 +4,7 @@ source avr/Kconfig + source cris/Kconfig + source hppa/Kconfig + source i386/Kconfig ++source loongarch64/Kconfig + source m68k/Kconfig + source microblaze/Kconfig + source mips/Kconfig +diff --git a/target/loongarch64/Kconfig b/target/loongarch64/Kconfig +new file mode 100644 +index 0000000000..46b26b1a85 +--- /dev/null ++++ b/target/loongarch64/Kconfig +@@ -0,0 +1,2 @@ ++config LOONGARCH64 ++ bool +diff --git a/target/loongarch64/arch_dump.c b/target/loongarch64/arch_dump.c +new file mode 100644 +index 0000000000..adce817d54 +--- /dev/null ++++ b/target/loongarch64/arch_dump.c +@@ -0,0 +1,179 @@ ++/* ++ * Support for writing ELF notes for RM architectures ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "cpu.h" ++#include "elf.h" ++#include "sysemu/dump.h" ++#include "internal.h" ++ ++/* struct user_pt_regs from arch/loongarch/include/uapi/asm/ptrace.h */ ++struct loongarch_user_regs { ++ uint64_t gpr[32]; ++ uint64_t lo; ++ uint64_t hi; ++ uint64_t csr_era; ++ uint64_t csr_badvaddr; ++ uint64_t csr_crmd; ++ uint64_t csr_ecfg; ++ uint64_t pad[7]; ++} QEMU_PACKED; ++ ++QEMU_BUILD_BUG_ON(sizeof(struct loongarch_user_regs) != 360); ++ ++/* struct elf_prstatus from include/uapi/linux/elfcore.h */ ++struct loongarch_elf_prstatus { ++ char pad1[32]; /* 32 == offsetof(struct elf_prstatus, pr_pid) */ ++ uint32_t pr_pid; ++ /* ++ * 76 == offsetof(struct elf_prstatus, pr_reg) - ++ * offsetof(struct elf_prstatus, pr_ppid) ++ */ ++ char pad2[76]; ++ struct loongarch_user_regs pr_reg; ++ uint32_t pr_fpvalid; ++ char pad3[4]; ++} QEMU_PACKED; ++ ++QEMU_BUILD_BUG_ON(sizeof(struct loongarch_elf_prstatus) != 480); ++ ++/* ++ * struct user_fpsimd_state from arch/arm64/include/uapi/asm/ptrace.h ++ * ++ * While the vregs member of user_fpsimd_state is of type __uint128_t, ++ * QEMU uses an array of uint64_t, where the high half of the 128-bit ++ * value is always in the 2n+1'th index. Thus we also break the 128- ++ * bit values into two halves in this reproduction of user_fpsimd_state. ++ */ ++ ++struct loongarch_fpu_struct { ++ uint64_t fpr[32]; ++ unsigned int fir; ++ unsigned int fcsr; ++} QEMU_PACKED; ++ ++QEMU_BUILD_BUG_ON(sizeof(struct loongarch_fpu_struct) != 264); ++ ++struct loongarch_note { ++ Elf64_Nhdr hdr; ++ char name[8]; /* align_up(sizeof("CORE"), 4) */ ++ union ++ { ++ struct loongarch_elf_prstatus prstatus; ++ struct loongarch_fpu_struct fpu; ++ }; ++} QEMU_PACKED; ++ ++#define LOONGARCH_NOTE_HEADER_SIZE offsetof(struct loongarch_note, prstatus) ++#define LOONGARCH_PRSTATUS_NOTE_SIZE \ ++ (LOONGARCH_NOTE_HEADER_SIZE + sizeof(struct loongarch_elf_prstatus)) ++#define LOONGARCH_PRFPREG_NOTE_SIZE \ ++ (LOONGARCH_NOTE_HEADER_SIZE + sizeof(struct loongarch_fpu_struct)) ++ ++static void loongarch_note_init(struct loongarch_note *note, DumpState *s, ++ const char *name, Elf64_Word namesz, ++ Elf64_Word type, Elf64_Word descsz) ++{ ++ memset(note, 0, sizeof(*note)); ++ ++ note->hdr.n_namesz = cpu_to_dump32(s, namesz); ++ note->hdr.n_descsz = cpu_to_dump32(s, descsz); ++ note->hdr.n_type = cpu_to_dump32(s, type); ++ ++ memcpy(note->name, name, namesz); ++} ++ ++static int loongarch_write_elf64_fprpreg(WriteCoreDumpFunction f, ++ CPULOONGARCHState *env, int cpuid, ++ DumpState *s) ++{ ++ struct loongarch_note note; ++ int ret, i; ++ ++ loongarch_note_init(¬e, s, "CORE", 5, NT_PRFPREG, sizeof(note.fpu)); ++ ++ note.fpu.fcsr = cpu_to_dump64(s, env->active_fpu.fcsr0); ++ ++ for (i = 0; i < 32; ++i) { ++ note.fpu.fpr[i] = cpu_to_dump64(s, env->active_fpu.fpr[i].fd); ++ } ++ ++ ret = f(¬e, LOONGARCH_PRFPREG_NOTE_SIZE, s); ++ if (ret < 0) { ++ return -1; ++ } ++ ++ return 0; ++} ++ ++int loongarch_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs, ++ int cpuid, void *opaque) ++{ ++ struct loongarch_note note; ++ CPULOONGARCHState *env = &LOONGARCH_CPU(cs)->env; ++ DumpState *s = opaque; ++ int ret, i; ++ ++ loongarch_note_init(¬e, s, "CORE", 5, NT_PRSTATUS, ++ sizeof(note.prstatus)); ++ ++ note.prstatus.pr_pid = cpu_to_dump32(s, cpuid); ++ note.prstatus.pr_fpvalid = cpu_to_dump32(s, 1); ++ ++ for (i = 0; i < 32; ++i) { ++ note.prstatus.pr_reg.gpr[i] = cpu_to_dump64(s, env->active_tc.gpr[i]); ++ } ++ note.prstatus.pr_reg.csr_era = cpu_to_dump64(s, env->CSR_ERA); ++ note.prstatus.pr_reg.csr_badvaddr = cpu_to_dump64(s, env->CSR_BADV); ++ note.prstatus.pr_reg.csr_crmd = cpu_to_dump64(s, env->CSR_CRMD); ++ note.prstatus.pr_reg.csr_ecfg = cpu_to_dump64(s, env->CSR_ECFG); ++ ++ ret = f(¬e, LOONGARCH_PRSTATUS_NOTE_SIZE, s); ++ if (ret < 0) { ++ return -1; ++ } ++ ++ ret = loongarch_write_elf64_fprpreg(f, env, cpuid, s); ++ if (ret < 0) { ++ return -1; ++ } ++ ++ return ret; ++} ++ ++int cpu_get_dump_info(ArchDumpInfo *info, ++ const GuestPhysBlockList *guest_phys_blocks) ++{ ++ info->d_machine = EM_LOONGARCH; ++ info->d_endian = ELFDATA2LSB; ++ info->d_class = ELFCLASS64; ++ ++ return 0; ++} ++ ++ssize_t cpu_get_note_size(int class, int machine, int nr_cpus) ++{ ++ size_t note_size = 0; ++ ++ if (class == ELFCLASS64) { ++ note_size = LOONGARCH_PRSTATUS_NOTE_SIZE + LOONGARCH_PRFPREG_NOTE_SIZE; ++ } ++ ++ return note_size * nr_cpus; ++} +diff --git a/target/loongarch64/cpu-csr.h b/target/loongarch64/cpu-csr.h +new file mode 100644 +index 0000000000..278a66c395 +--- /dev/null ++++ b/target/loongarch64/cpu-csr.h +@@ -0,0 +1,880 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef _CPU_CSR_H_ ++#define _CPU_CSR_H_ ++ ++/* basic CSR register */ ++#define LOONGARCH_CSR_CRMD 0x0 /* 32 current mode info */ ++#define CSR_CRMD_DACM_SHIFT 7 ++#define CSR_CRMD_DACM_WIDTH 2 ++#define CSR_CRMD_DACM (0x3UL << CSR_CRMD_DACM_SHIFT) ++#define CSR_CRMD_DACF_SHIFT 5 ++#define CSR_CRMD_DACF_WIDTH 2 ++#define CSR_CRMD_DACF (0x3UL << CSR_CRMD_DACF_SHIFT) ++#define CSR_CRMD_PG_SHIFT 4 ++#define CSR_CRMD_PG (0x1UL << CSR_CRMD_PG_SHIFT) ++#define CSR_CRMD_DA_SHIFT 3 ++#define CSR_CRMD_DA (0x1UL << CSR_CRMD_DA_SHIFT) ++#define CSR_CRMD_IE_SHIFT 2 ++#define CSR_CRMD_IE (0x1UL << CSR_CRMD_IE_SHIFT) ++#define CSR_CRMD_PLV_SHIFT 0 ++#define CSR_CRMD_PLV_WIDTH 2 ++#define CSR_CRMD_PLV (0x3UL << CSR_CRMD_PLV_SHIFT) ++ ++#define PLV_USER 3 ++#define PLV_KERN 0 ++#define PLV_MASK 0x3 ++ ++#define LOONGARCH_CSR_PRMD 0x1 /* 32 prev-exception mode info */ ++#define CSR_PRMD_PIE_SHIFT 2 ++#define CSR_PRMD_PIE (0x1UL << CSR_PRMD_PIE_SHIFT) ++#define CSR_PRMD_PPLV_SHIFT 0 ++#define CSR_PRMD_PPLV_WIDTH 2 ++#define CSR_PRMD_PPLV (0x3UL << CSR_PRMD_PPLV_SHIFT) ++ ++#define LOONGARCH_CSR_EUEN 0x2 /* 32 coprocessor enable */ ++#define CSR_EUEN_LBTEN_SHIFT 3 ++#define CSR_EUEN_LBTEN (0x1UL << CSR_EUEN_LBTEN_SHIFT) ++#define CSR_EUEN_LASXEN_SHIFT 2 ++#define CSR_EUEN_LASXEN (0x1UL << CSR_EUEN_LASXEN_SHIFT) ++#define CSR_EUEN_LSXEN_SHIFT 1 ++#define CSR_EUEN_LSXEN (0x1UL << CSR_EUEN_LSXEN_SHIFT) ++#define CSR_EUEN_FPEN_SHIFT 0 ++#define CSR_EUEN_FPEN (0x1UL << CSR_EUEN_FPEN_SHIFT) ++ ++#define LOONGARCH_CSR_MISC 0x3 /* 32 misc config */ ++ ++#define LOONGARCH_CSR_ECFG 0x4 /* 32 exception config */ ++#define CSR_ECFG_VS_SHIFT 16 ++#define CSR_ECFG_VS_WIDTH 3 ++#define CSR_ECFG_VS (0x7UL << CSR_ECFG_VS_SHIFT) ++#define CSR_ECFG_IM_SHIFT 0 ++#define CSR_ECFG_IM_WIDTH 13 ++#define CSR_ECFG_IM (0x1fffUL << CSR_ECFG_IM_SHIFT) ++ ++#define CSR_ECFG_IPMASK 0x00001fff ++ ++#define LOONGARCH_CSR_ESTAT 0x5 /* Exception status */ ++#define CSR_ESTAT_ESUBCODE_SHIFT 22 ++#define CSR_ESTAT_ESUBCODE_WIDTH 9 ++#define CSR_ESTAT_ESUBCODE (0x1ffULL << CSR_ESTAT_ESUBCODE_SHIFT) ++#define CSR_ESTAT_EXC_SH 16 ++#define CSR_ESTAT_EXC_WIDTH 5 ++#define CSR_ESTAT_EXC (0x1fULL << CSR_ESTAT_EXC_SH) ++#define CSR_ESTAT_IS_SHIFT 0 ++#define CSR_ESTAT_IS_WIDTH 15 ++#define CSR_ESTAT_IS (0x7fffULL << CSR_ESTAT_IS_SHIFT) ++ ++#define CSR_ESTAT_IPMASK 0x00001fff ++ ++#define EXCODE_IP 64 ++#define EXCCODE_RSV 0 ++#define EXCCODE_TLBL 1 ++#define EXCCODE_TLBS 2 ++#define EXCCODE_TLBI 3 ++#define EXCCODE_MOD 4 ++#define EXCCODE_TLBRI 5 ++#define EXCCODE_TLBXI 6 ++#define EXCCODE_TLBPE 7 ++#define EXCCODE_ADE 8 ++#define EXCCODE_UNALIGN 9 ++#define EXCCODE_OOB 10 ++#define EXCCODE_SYS 11 ++#define EXCCODE_BP 12 ++#define EXCCODE_RI 13 ++#define EXCCODE_IPE 14 ++#define EXCCODE_FPDIS 15 ++#define EXCCODE_LSXDIS 16 ++#define EXCCODE_LASXDIS 17 ++#define EXCCODE_FPE 18 ++#define EXCCODE_WATCH 19 ++#define EXCCODE_BTDIS 20 ++#define EXCCODE_BTE 21 ++#define EXCCODE_PSI 22 ++#define EXCCODE_HYP 23 ++#define EXCCODE_FC 24 ++#define EXCCODE_SE 25 ++ ++#define LOONGARCH_CSR_ERA 0x6 /* 64 error PC */ ++#define LOONGARCH_CSR_BADV 0x7 /* 64 bad virtual address */ ++#define LOONGARCH_CSR_BADI 0x8 /* 32 bad instruction */ ++#define LOONGARCH_CSR_EEPN 0xc /* 64 exception enter base address */ ++#define LOONGARCH_EEPN_CPUID (0x3ffULL << 0) ++ ++#define CU_FPE 1 ++#define CU_LSXE (1 << 1) ++#define CU_LASXE (1 << 2) ++#define CU_LBTE (1 << 3) ++ ++/* TLB related CSR register : start with TLB if no pagewalk */ ++/* 32 TLB Index, EHINV, PageSize, is_gtlb */ ++#define LOONGARCH_CSR_TLBIDX 0x10 ++#define CSR_TLBIDX_EHINV_SHIFT 31 ++#define CSR_TLBIDX_EHINV (0x1ULL << CSR_TLBIDX_EHINV_SHIFT) ++#define CSR_TLBIDX_PS_SHIFT 24 ++#define CSR_TLBIDX_PS_WIDTH 6 ++#define CSR_TLBIDX_PS (0x3fULL << CSR_TLBIDX_PS_SHIFT) ++#define CSR_TLBIDX_IDX_SHIFT 0 ++#define CSR_TLBIDX_IDX_WIDTH 12 ++#define CSR_TLBIDX_IDX (0xfffULL << CSR_TLBIDX_IDX_SHIFT) ++#define CSR_TLBIDX_SIZEM 0x3f000000 ++#define CSR_TLBIDX_SIZE CSR_TLBIDX_PS_SHIFT ++#define CSR_TLBIDX_IDXM 0xfff ++ ++#define LOONGARCH_CSR_TLBEHI 0x11 /* 64 TLB EntryHi without ASID */ ++#define LOONGARCH_CSR_TLBELO0 0x12 /* 64 TLB EntryLo0 */ ++#define CSR_TLBLO0_RPLV_SHIFT 63 ++#define CSR_TLBLO0_RPLV (0x1ULL << CSR_TLBLO0_RPLV_SHIFT) ++#define CSR_TLBLO0_XI_SHIFT 62 ++#define CSR_TLBLO0_XI (0x1ULL << CSR_TLBLO0_XI_SHIFT) ++#define CSR_TLBLO0_RI_SHIFT 61 ++#define CSR_TLBLO0_RI (0x1ULL << CSR_TLBLO0_RI_SHIFT) ++#define CSR_TLBLO0_PPN_SHIFT 12 ++#define CSR_TLBLO0_PPN_WIDTH 36 /* ignore lower 12bits */ ++#define CSR_TLBLO0_PPN (0xfffffffffULL << CSR_TLBLO0_PPN_SHIFT) ++#define CSR_TLBLO0_GLOBAL_SHIFT 6 ++#define CSR_TLBLO0_GLOBAL (0x1ULL << CSR_TLBLO0_GLOBAL_SHIFT) ++#define CSR_TLBLO0_CCA_SHIFT 4 ++#define CSR_TLBLO0_CCA_WIDTH 2 ++#define CSR_TLBLO0_CCA (0x3ULL << CSR_TLBLO0_CCA_SHIFT) ++#define CSR_TLBLO0_PLV_SHIFT 2 ++#define CSR_TLBLO0_PLV_WIDTH 2 ++#define CSR_TLBLO0_PLV (0x3ULL << CSR_TLBLO0_PLV_SHIFT) ++#define CSR_TLBLO0_WE_SHIFT 1 ++#define CSR_TLBLO0_WE (0x1ULL << CSR_TLBLO0_WE_SHIFT) ++#define CSR_TLBLO0_V_SHIFT 0 ++#define CSR_TLBLO0_V (0x1ULL << CSR_TLBLO0_V_SHIFT) ++ ++#define LOONGARCH_CSR_TLBELO1 0x13 /* 64 TLB EntryLo1 */ ++#define CSR_TLBLO1_RPLV_SHIFT 63 ++#define CSR_TLBLO1_RPLV (0x1ULL << CSR_TLBLO1_RPLV_SHIFT) ++#define CSR_TLBLO1_XI_SHIFT 62 ++#define CSR_TLBLO1_XI (0x1ULL << CSR_TLBLO1_XI_SHIFT) ++#define CSR_TLBLO1_RI_SHIFT 61 ++#define CSR_TLBLO1_RI (0x1ULL << CSR_TLBLO1_RI_SHIFT) ++#define CSR_TLBLO1_PPN_SHIFT 12 ++#define CSR_TLBLO1_PPN_WIDTH 36 /* ignore lower 12bits */ ++#define CSR_TLBLO1_PPN (0xfffffffffULL << CSR_TLBLO1_PPN_SHIFT) ++#define CSR_TLBLO1_GLOBAL_SHIFT 6 ++#define CSR_TLBLO1_GLOBAL (0x1ULL << CSR_TLBLO1_GLOBAL_SHIFT) ++#define CSR_TLBLO1_CCA_SHIFT 4 ++#define CSR_TLBLO1_CCA_WIDTH 2 ++#define CSR_TLBLO1_CCA (0x3ULL << CSR_TLBLO1_CCA_SHIFT) ++#define CSR_TLBLO1_PLV_SHIFT 2 ++#define CSR_TLBLO1_PLV_WIDTH 2 ++#define CSR_TLBLO1_PLV (0x3ULL << CSR_TLBLO1_PLV_SHIFT) ++#define CSR_TLBLO1_WE_SHIFT 1 ++#define CSR_TLBLO1_WE (0x1ULL << CSR_TLBLO1_WE_SHIFT) ++#define CSR_TLBLO1_V_SHIFT 0 ++#define CSR_TLBLO1_V (0x1ULL << CSR_TLBLO1_V_SHIFT) ++ ++#define LOONGARCH_ENTRYLO_RI (1ULL << 61) ++#define LOONGARCH_ENTRYLO_XI (1ULL << 62) ++ ++#define LOONGARCH_CSR_TLBWIRED 0x14 /* 32 TLB wired */ ++#define LOONGARCH_CSR_GTLBC 0x15 /* guest-related TLB */ ++#define CSR_GTLBC_RID_SHIFT 16 ++#define CSR_GTLBC_RID_WIDTH 8 ++#define CSR_GTLBC_RID (0xffULL << CSR_GTLBC_RID_SHIFT) ++#define CSR_GTLBC_TOTI_SHIFT 13 ++#define CSR_GTLBC_TOTI (0x1ULL << CSR_GTLBC_TOTI_SHIFT) ++#define CSR_GTLBC_USERID_SHIFT 12 ++#define CSR_GTLBC_USERID (0x1ULL << CSR_GTLBC_USERID_SHIFT) ++#define CSR_GTLBC_GMTLBSZ_SHIFT 0 ++#define CSR_GTLBC_GMTLBSZ_WIDTH 6 ++#define CSR_GTLBC_GMTLBSZ (0x3fULL << CSR_GTLBC_GVTLBSZ_SHIFT) ++ ++#define LOONGARCH_CSR_TRGP 0x16 /* guest-related TLB */ ++#define CSR_TRGP_RID_SHIFT 16 ++#define CSR_TRGP_RID_WIDTH 8 ++#define CSR_TRGP_RID (0xffULL << CSR_TRGP_RID_SHIFT) ++#define CSR_TRGP_GTLB_SHIFT 0 ++#define CSR_TRGP_GTLB (1 << CSR_TRGP_GTLB_SHIFT) ++ ++#define LOONGARCH_CSR_ASID 0x18 /* 64 ASID */ ++#define CSR_ASID_BIT_SHIFT 16 /* ASIDBits */ ++#define CSR_ASID_BIT_WIDTH 8 ++#define CSR_ASID_BIT (0xffULL << CSR_ASID_BIT_SHIFT) ++#define CSR_ASID_ASID_SHIFT 0 ++#define CSR_ASID_ASID_WIDTH 10 ++#define CSR_ASID_ASID (0x3ffULL << CSR_ASID_ASID_SHIFT) ++ ++/* 64 page table base address when badv[47] = 0 */ ++#define LOONGARCH_CSR_PGDL 0x19 ++/* 64 page table base address when badv[47] = 1 */ ++#define LOONGARCH_CSR_PGDH 0x1a ++#define LOONGARCH_CSR_PGD 0x1b /* 64 page table base */ ++#define LOONGARCH_CSR_PWCTL0 0x1c /* 64 PWCtl0 */ ++#define CSR_PWCTL0_PTEW_SHIFT 30 ++#define CSR_PWCTL0_PTEW_WIDTH 2 ++#define CSR_PWCTL0_PTEW (0x3ULL << CSR_PWCTL0_PTEW_SHIFT) ++#define CSR_PWCTL0_DIR1WIDTH_SHIFT 25 ++#define CSR_PWCTL0_DIR1WIDTH_WIDTH 5 ++#define CSR_PWCTL0_DIR1WIDTH (0x1fULL << CSR_PWCTL0_DIR1WIDTH_SHIFT) ++#define CSR_PWCTL0_DIR1BASE_SHIFT 20 ++#define CSR_PWCTL0_DIR1BASE_WIDTH 5 ++#define CSR_PWCTL0_DIR1BASE (0x1fULL << CSR_PWCTL0_DIR1BASE_SHIFT) ++#define CSR_PWCTL0_DIR0WIDTH_SHIFT 15 ++#define CSR_PWCTL0_DIR0WIDTH_WIDTH 5 ++#define CSR_PWCTL0_DIR0WIDTH (0x1fULL << CSR_PWCTL0_DIR0WIDTH_SHIFT) ++#define CSR_PWCTL0_DIR0BASE_SHIFT 10 ++#define CSR_PWCTL0_DIR0BASE_WIDTH 5 ++#define CSR_PWCTL0_DIR0BASE (0x1fULL << CSR_PWCTL0_DIR0BASE_SHIFT) ++#define CSR_PWCTL0_PTWIDTH_SHIFT 5 ++#define CSR_PWCTL0_PTWIDTH_WIDTH 5 ++#define CSR_PWCTL0_PTWIDTH (0x1fULL << CSR_PWCTL0_PTWIDTH_SHIFT) ++#define CSR_PWCTL0_PTBASE_SHIFT 0 ++#define CSR_PWCTL0_PTBASE_WIDTH 5 ++#define CSR_PWCTL0_PTBASE (0x1fULL << CSR_PWCTL0_PTBASE_SHIFT) ++ ++#define LOONGARCH_CSR_PWCTL1 0x1d /* 64 PWCtl1 */ ++#define CSR_PWCTL1_DIR3WIDTH_SHIFT 18 ++#define CSR_PWCTL1_DIR3WIDTH_WIDTH 5 ++#define CSR_PWCTL1_DIR3WIDTH (0x1fULL << CSR_PWCTL1_DIR3WIDTH_SHIFT) ++#define CSR_PWCTL1_DIR3BASE_SHIFT 12 ++#define CSR_PWCTL1_DIR3BASE_WIDTH 5 ++#define CSR_PWCTL1_DIR3BASE (0x1fULL << CSR_PWCTL0_DIR3BASE_SHIFT) ++#define CSR_PWCTL1_DIR2WIDTH_SHIFT 6 ++#define CSR_PWCTL1_DIR2WIDTH_WIDTH 5 ++#define CSR_PWCTL1_DIR2WIDTH (0x1fULL << CSR_PWCTL1_DIR2WIDTH_SHIFT) ++#define CSR_PWCTL1_DIR2BASE_SHIFT 0 ++#define CSR_PWCTL1_DIR2BASE_WIDTH 5 ++#define CSR_PWCTL1_DIR2BASE (0x1fULL << CSR_PWCTL0_DIR2BASE_SHIFT) ++ ++#define LOONGARCH_CSR_STLBPGSIZE 0x1e /* 64 */ ++#define CSR_STLBPGSIZE_PS_WIDTH 6 ++#define CSR_STLBPGSIZE_PS (0x3f) ++ ++#define LOONGARCH_CSR_RVACFG 0x1f ++#define CSR_RVACFG_RDVA_WIDTH 4 ++#define CSR_RVACFG_RDVA (0xf) ++ ++/* read only CSR register : start with CPU */ ++#define LOONGARCH_CSR_CPUID 0x20 /* 32 CPU core number */ ++#define CSR_CPUID_CID_WIDTH 9 ++#define CSR_CPUID_CID (0x1ff) ++ ++#define LOONGARCH_CSR_PRCFG1 0x21 /* 32 CPU info */ ++#define CSR_CONF1_VSMAX_SHIFT 12 ++#define CSR_CONF1_VSMAX_WIDTH 3 ++#define CSR_CONF1_VSMAX (7ULL << CSR_CONF1_VSMAX_SHIFT) ++/* stable timer bits - 1, 0x2f = 47*/ ++#define CSR_CONF1_TMRBITS_SHIFT 4 ++#define CSR_CONF1_TMRBITS_WIDTH 8 ++#define CSR_CONF1_TMRBITS (0xffULL << CSR_CONF1_TMRBITS_SHIFT) ++#define CSR_CONF1_KSNUM_SHIFT 0 ++#define CSR_CONF1_KSNUM_WIDTH 4 ++#define CSR_CONF1_KSNUM (0x8) ++ ++#define LOONGARCH_CSR_PRCFG2 0x22 ++#define CSR_CONF2_PGMASK_SUPP 0x3ffff000 ++ ++#define LOONGARCH_CSR_PRCFG3 0x23 ++#define CSR_CONF3_STLBIDX_SHIFT 20 ++#define CSR_CONF3_STLBIDX_WIDTH 6 ++#define CSR_CONF3_STLBIDX (0x3fULL << CSR_CONF3_STLBIDX_SHIFT) ++#define CSR_STLB_SETS 256 ++#define CSR_CONF3_STLBWAYS_SHIFT 12 ++#define CSR_CONF3_STLBWAYS_WIDTH 8 ++#define CSR_CONF3_STLBWAYS (0xffULL << CSR_CONF3_STLBWAYS_SHIFT) ++#define CSR_STLBWAYS_SIZE 8 ++#define CSR_CONF3_MTLBSIZE_SHIFT 4 ++#define CSR_CONF3_MTLBSIZE_WIDTH 8 ++#define CSR_CONF3_MTLBSIZE (0xffULL << CSR_CONF3_MTLBSIZE_SHIFT) ++/* mean VTLB 64 index */ ++#define CSR_MTLB_SIZE 64 ++#define CSR_CONF3_TLBORG_SHIFT 0 ++#define CSR_CONF3_TLBORG_WIDTH 4 ++#define CSR_CONF3_TLBORG (0xfULL << CSR_CONF3_TLBORG_SHIFT) ++/* mean use MTLB+STLB */ ++#define TLB_ORG 2 ++ ++/* Kscratch : start with KS */ ++#define LOONGARCH_CSR_KS0 0x30 /* 64 */ ++#define LOONGARCH_CSR_KS1 0x31 /* 64 */ ++#define LOONGARCH_CSR_KS2 0x32 /* 64 */ ++#define LOONGARCH_CSR_KS3 0x33 /* 64 */ ++#define LOONGARCH_CSR_KS4 0x34 /* 64 */ ++#define LOONGARCH_CSR_KS5 0x35 /* 64 */ ++#define LOONGARCH_CSR_KS6 0x36 /* 64 */ ++#define LOONGARCH_CSR_KS7 0x37 /* 64 */ ++#define LOONGARCH_CSR_KS8 0x38 /* 64 */ ++ ++/* timer : start with TM */ ++#define LOONGARCH_CSR_TMID 0x40 /* 32 timer ID */ ++ ++#define LOONGARCH_CSR_TCFG 0x41 /* 64 timer config */ ++#define CSR_TCFG_VAL_SHIFT 2 ++#define CSR_TCFG_VAL_WIDTH 48 ++#define CSR_TCFG_VAL (0x3fffffffffffULL << CSR_TCFG_VAL_SHIFT) ++#define CSR_TCFG_PERIOD_SHIFT 1 ++#define CSR_TCFG_PERIOD (0x1ULL << CSR_TCFG_PERIOD_SHIFT) ++#define CSR_TCFG_EN (0x1) ++ ++#define LOONGARCH_CSR_TVAL 0x42 /* 64 timer ticks remain */ ++ ++#define LOONGARCH_CSR_CNTC 0x43 /* 64 timer offset */ ++ ++#define LOONGARCH_CSR_TINTCLR 0x44 /* 64 timer interrupt clear */ ++#define CSR_TINTCLR_TI_SHIFT 0 ++#define CSR_TINTCLR_TI (1 << CSR_TINTCLR_TI_SHIFT) ++ ++/* guest : start with GST */ ++#define LOONGARCH_CSR_GSTAT 0x50 /* 32 basic guest info */ ++#define CSR_GSTAT_GID_SHIFT 16 ++#define CSR_GSTAT_GID_WIDTH 8 ++#define CSR_GSTAT_GID (0xffULL << CSR_GSTAT_GID_SHIFT) ++#define CSR_GSTAT_GIDBIT_SHIFT 4 ++#define CSR_GSTAT_GIDBIT_WIDTH 6 ++#define CSR_GSTAT_GIDBIT (0x3fULL << CSR_GSTAT_GIDBIT_SHIFT) ++#define CSR_GSTAT_PVM_SHIFT 1 ++#define CSR_GSTAT_PVM (0x1ULL << CSR_GSTAT_PVM_SHIFT) ++#define CSR_GSTAT_VM_SHIFT 0 ++#define CSR_GSTAT_VM (0x1ULL << CSR_GSTAT_VM_SHIFT) ++ ++#define LOONGARCH_CSR_GCFG 0x51 /* 32 guest config */ ++#define CSR_GCFG_GPERF_SHIFT 24 ++#define CSR_GCFG_GPERF_WIDTH 3 ++#define CSR_GCFG_GPERF (0x7ULL << CSR_GCFG_GPERF_SHIFT) ++#define CSR_GCFG_GCI_SHIFT 20 ++#define CSR_GCFG_GCI_WIDTH 2 ++#define CSR_GCFG_GCI (0x3ULL << CSR_GCFG_GCI_SHIFT) ++#define CSR_GCFG_GCI_ALL (0x0ULL << CSR_GCFG_GCI_SHIFT) ++#define CSR_GCFG_GCI_HIT (0x1ULL << CSR_GCFG_GCI_SHIFT) ++#define CSR_GCFG_GCI_SECURE (0x2ULL << CSR_GCFG_GCI_SHIFT) ++#define CSR_GCFG_GCIP_SHIFT 16 ++#define CSR_GCFG_GCIP (0xfULL << CSR_GCFG_GCIP_SHIFT) ++#define CSR_GCFG_GCIP_ALL (0x1ULL << CSR_GCFG_GCIP_SHIFT) ++#define CSR_GCFG_GCIP_HIT (0x1ULL << (CSR_GCFG_GCIP_SHIFT + 1)) ++#define CSR_GCFG_GCIP_SECURE (0x1ULL << (CSR_GCFG_GCIP_SHIFT + 2)) ++#define CSR_GCFG_TORU_SHIFT 15 ++#define CSR_GCFG_TORU (0x1ULL << CSR_GCFG_TORU_SHIFT) ++#define CSR_GCFG_TORUP_SHIFT 14 ++#define CSR_GCFG_TORUP (0x1ULL << CSR_GCFG_TORUP_SHIFT) ++#define CSR_GCFG_TOP_SHIFT 13 ++#define CSR_GCFG_TOP (0x1ULL << CSR_GCFG_TOP_SHIFT) ++#define CSR_GCFG_TOPP_SHIFT 12 ++#define CSR_GCFG_TOPP (0x1ULL << CSR_GCFG_TOPP_SHIFT) ++#define CSR_GCFG_TOE_SHIFT 11 ++#define CSR_GCFG_TOE (0x1ULL << CSR_GCFG_TOE_SHIFT) ++#define CSR_GCFG_TOEP_SHIFT 10 ++#define CSR_GCFG_TOEP (0x1ULL << CSR_GCFG_TOEP_SHIFT) ++#define CSR_GCFG_TIT_SHIFT 9 ++#define CSR_GCFG_TIT (0x1ULL << CSR_GCFG_TIT_SHIFT) ++#define CSR_GCFG_TITP_SHIFT 8 ++#define CSR_GCFG_TITP (0x1ULL << CSR_GCFG_TITP_SHIFT) ++#define CSR_GCFG_SIT_SHIFT 7 ++#define CSR_GCFG_SIT (0x1ULL << CSR_GCFG_SIT_SHIFT) ++#define CSR_GCFG_SITP_SHIFT 6 ++#define CSR_GCFG_SITP (0x1ULL << CSR_GCFG_SITP_SHIFT) ++#define CSR_GCFG_CACTRL_SHIFT 4 ++#define CSR_GCFG_CACTRL_WIDTH 2 ++#define CSR_GCFG_CACTRL (0x3ULL << CSR_GCFG_CACTRL_SHIFT) ++#define CSR_GCFG_CACTRL_GUEST (0x0ULL << CSR_GCFG_CACTRL_SHIFT) ++#define CSR_GCFG_CACTRL_ROOT (0x1ULL << CSR_GCFG_CACTRL_SHIFT) ++#define CSR_GCFG_CACTRL_NEST (0x2ULL << CSR_GCFG_CACTRL_SHIFT) ++#define CSR_GCFG_CCCP_WIDTH 4 ++#define CSR_GCFG_CCCP (0xf) ++#define CSR_GCFG_CCCP_GUEST (0x1ULL << 0) ++#define CSR_GCFG_CCCP_ROOT (0x1ULL << 1) ++#define CSR_GCFG_CCCP_NEST (0x1ULL << 2) ++ ++#define LOONGARCH_CSR_GINTC 0x52 /* 64 guest exception control */ ++#define CSR_GINTC_HC_SHIFT 16 ++#define CSR_GINTC_HC_WIDTH 8 ++#define CSR_GINTC_HC (0xffULL << CSR_GINTC_HC_SHIFT) ++#define CSR_GINTC_PIP_SHIFT 8 ++#define CSR_GINTC_PIP_WIDTH 8 ++#define CSR_GINTC_PIP (0xffULL << CSR_GINTC_PIP_SHIFT) ++#define CSR_GINTC_VIP_SHIFT 0 ++#define CSR_GINTC_VIP_WIDTH 8 ++#define CSR_GINTC_VIP (0xff) ++ ++#define LOONGARCH_CSR_GCNTC 0x53 /* 64 guest timer offset */ ++ ++/* LLBCTL */ ++#define LOONGARCH_CSR_LLBCTL 0x60 /* 32 csr number to be changed */ ++#define CSR_LLBCTL_ROLLB_SHIFT 0 ++#define CSR_LLBCTL_ROLLB (1ULL << CSR_LLBCTL_ROLLB_SHIFT) ++#define CSR_LLBCTL_WCLLB_SHIFT 1 ++#define CSR_LLBCTL_WCLLB (1ULL << CSR_LLBCTL_WCLLB_SHIFT) ++#define CSR_LLBCTL_KLO_SHIFT 2 ++#define CSR_LLBCTL_KLO (1ULL << CSR_LLBCTL_KLO_SHIFT) ++ ++/* implement dependent */ ++#define LOONGARCH_CSR_IMPCTL1 0x80 /* 32 loongarch config */ ++#define CSR_MISPEC_SHIFT 20 ++#define CSR_MISPEC_WIDTH 8 ++#define CSR_MISPEC (0xffULL << CSR_MISPEC_SHIFT) ++#define CSR_SSEN_SHIFT 18 ++#define CSR_SSEN (1ULL << CSR_SSEN_SHIFT) ++#define CSR_SCRAND_SHIFT 17 ++#define CSR_SCRAND (1ULL << CSR_SCRAND_SHIFT) ++#define CSR_LLEXCL_SHIFT 16 ++#define CSR_LLEXCL (1ULL << CSR_LLEXCL_SHIFT) ++#define CSR_DISVC_SHIFT 15 ++#define CSR_DISVC (1ULL << CSR_DISVC_SHIFT) ++#define CSR_VCLRU_SHIFT 14 ++#define CSR_VCLRU (1ULL << CSR_VCLRU_SHIFT) ++#define CSR_DCLRU_SHIFT 13 ++#define CSR_DCLRU (1ULL << CSR_DCLRU_SHIFT) ++#define CSR_FASTLDQ_SHIFT 12 ++#define CSR_FASTLDQ (1ULL << CSR_FASTLDQ_SHIFT) ++#define CSR_USERCAC_SHIFT 11 ++#define CSR_USERCAC (1ULL << CSR_USERCAC_SHIFT) ++#define CSR_ANTI_MISPEC_SHIFT 10 ++#define CSR_ANTI_MISPEC (1ULL << CSR_ANTI_MISPEC_SHIFT) ++#define CSR_ANTI_FLUSHSFB_SHIFT 9 ++#define CSR_ANTI_FLUSHSFB (1ULL << CSR_ANTI_FLUSHSFB_SHIFT) ++#define CSR_STFILL_SHIFT 8 ++#define CSR_STFILL (1ULL << CSR_STFILL_SHIFT) ++#define CSR_LIFEP_SHIFT 7 ++#define CSR_LIFEP (1ULL << CSR_LIFEP_SHIFT) ++#define CSR_LLSYNC_SHIFT 6 ++#define CSR_LLSYNC (1ULL << CSR_LLSYNC_SHIFT) ++#define CSR_BRBTDIS_SHIFT 5 ++#define CSR_BRBTDIS (1ULL << CSR_BRBTDIS_SHIFT) ++#define CSR_RASDIS_SHIFT 4 ++#define CSR_RASDIS (1ULL << CSR_RASDIS_SHIFT) ++#define CSR_STPRE_SHIFT 2 ++#define CSR_STPRE_WIDTH 2 ++#define CSR_STPRE (3ULL << CSR_STPRE_SHIFT) ++#define CSR_INSTPRE_SHIFT 1 ++#define CSR_INSTPRE (1ULL << CSR_INSTPRE_SHIFT) ++#define CSR_DATAPRE_SHIFT 0 ++#define CSR_DATAPRE (1ULL << CSR_DATAPRE_SHIFT) ++ ++#define LOONGARCH_CSR_IMPCTL2 0x81 /* 32 Flush */ ++#define CSR_IMPCTL2_MTLB_SHIFT 0 ++#define CSR_IMPCTL2_MTLB (1ULL << CSR_IMPCTL2_MTLB_SHIFT) ++#define CSR_IMPCTL2_STLB_SHIFT 1 ++#define CSR_IMPCTL2_STLB (1ULL << CSR_IMPCTL2_STLB_SHIFT) ++#define CSR_IMPCTL2_DTLB_SHIFT 2 ++#define CSR_IMPCTL2_DTLB (1ULL << CSR_IMPCTL2_DTLB_SHIFT) ++#define CSR_IMPCTL2_ITLB_SHIFT 3 ++#define CSR_IMPCTL2_ITLB (1ULL << CSR_IMPCTL2_ITLB_SHIFT) ++#define CSR_IMPCTL2_BTAC_SHIFT 4 ++#define CSR_IMPCTL2_BTAC (1ULL << CSR_IMPCTL2_BTAC_SHIFT) ++ ++#define LOONGARCH_FLUSH_VTLB 1 ++#define LOONGARCH_FLUSH_FTLB (1 << 1) ++#define LOONGARCH_FLUSH_DTLB (1 << 2) ++#define LOONGARCH_FLUSH_ITLB (1 << 3) ++#define LOONGARCH_FLUSH_BTAC (1 << 4) ++ ++#define LOONGARCH_CSR_GNMI 0x82 ++ ++/* TLB Refill Only */ ++#define LOONGARCH_CSR_TLBRENT 0x88 /* 64 TLB refill exception address */ ++#define LOONGARCH_CSR_TLBRBADV 0x89 /* 64 TLB refill badvaddr */ ++#define LOONGARCH_CSR_TLBRERA 0x8a /* 64 TLB refill ERA */ ++#define LOONGARCH_CSR_TLBRSAVE 0x8b /* 64 KScratch for TLB refill */ ++#define LOONGARCH_CSR_TLBRELO0 0x8c /* 64 TLB refill entrylo0 */ ++#define LOONGARCH_CSR_TLBRELO1 0x8d /* 64 TLB refill entrylo1 */ ++#define LOONGARCH_CSR_TLBREHI 0x8e /* 64 TLB refill entryhi */ ++#define LOONGARCH_CSR_TLBRPRMD 0x8f /* 64 TLB refill mode info */ ++ ++/* error related */ ++#define LOONGARCH_CSR_ERRCTL 0x90 /* 32 ERRCTL */ ++#define LOONGARCH_CSR_ERRINFO 0x91 ++#define LOONGARCH_CSR_ERRINFO1 0x92 ++#define LOONGARCH_CSR_ERRENT 0x93 /* 64 error exception base */ ++#define LOONGARCH_CSR_ERRERA 0x94 /* 64 error exception PC */ ++#define LOONGARCH_CSR_ERRSAVE 0x95 /* 64 KScratch for error exception */ ++ ++#define LOONGARCH_CSR_CTAG 0x98 /* 64 TagLo + TagHi */ ++ ++/* direct map windows */ ++#define LOONGARCH_CSR_DMWIN0 0x180 /* 64 direct map win0: MEM & IF */ ++#define LOONGARCH_CSR_DMWIN1 0x181 /* 64 direct map win1: MEM & IF */ ++#define LOONGARCH_CSR_DMWIN2 0x182 /* 64 direct map win2: MEM */ ++#define LOONGARCH_CSR_DMWIN3 0x183 /* 64 direct map win3: MEM */ ++#define CSR_DMW_PLV0 0x1 ++#define CSR_DMW_PLV1 0x2 ++#define CSR_DMW_PLV2 0x4 ++#define CSR_DMW_PLV3 0x8 ++#define CSR_DMW_BASE_SH 48 ++#define dmwin_va2pa(va) (va & (((unsigned long)1 << CSR_DMW_BASE_SH) - 1)) ++ ++/* performance counter */ ++#define LOONGARCH_CSR_PERFCTRL0 0x200 /* 32 perf event 0 config */ ++#define LOONGARCH_CSR_PERFCNTR0 0x201 /* 64 perf event 0 count value */ ++#define LOONGARCH_CSR_PERFCTRL1 0x202 /* 32 perf event 1 config */ ++#define LOONGARCH_CSR_PERFCNTR1 0x203 /* 64 perf event 1 count value */ ++#define LOONGARCH_CSR_PERFCTRL2 0x204 /* 32 perf event 2 config */ ++#define LOONGARCH_CSR_PERFCNTR2 0x205 /* 64 perf event 2 count value */ ++#define LOONGARCH_CSR_PERFCTRL3 0x206 /* 32 perf event 3 config */ ++#define LOONGARCH_CSR_PERFCNTR3 0x207 /* 64 perf event 3 count value */ ++#define CSR_PERFCTRL_PLV0 (1ULL << 16) ++#define CSR_PERFCTRL_PLV1 (1ULL << 17) ++#define CSR_PERFCTRL_PLV2 (1ULL << 18) ++#define CSR_PERFCTRL_PLV3 (1ULL << 19) ++#define CSR_PERFCTRL_IE (1ULL << 20) ++#define CSR_PERFCTRL_EVENT 0x3ff ++ ++/* debug */ ++#define LOONGARCH_CSR_MWPC 0x300 /* data breakpoint config */ ++#define LOONGARCH_CSR_MWPS 0x301 /* data breakpoint status */ ++ ++#define LOONGARCH_CSR_DB0ADDR 0x310 /* data breakpoint 0 address */ ++#define LOONGARCH_CSR_DB0MASK 0x311 /* data breakpoint 0 mask */ ++#define LOONGARCH_CSR_DB0CTL 0x312 /* data breakpoint 0 control */ ++#define LOONGARCH_CSR_DB0ASID 0x313 /* data breakpoint 0 asid */ ++ ++#define LOONGARCH_CSR_DB1ADDR 0x318 /* data breakpoint 1 address */ ++#define LOONGARCH_CSR_DB1MASK 0x319 /* data breakpoint 1 mask */ ++#define LOONGARCH_CSR_DB1CTL 0x31a /* data breakpoint 1 control */ ++#define LOONGARCH_CSR_DB1ASID 0x31b /* data breakpoint 1 asid */ ++ ++#define LOONGARCH_CSR_DB2ADDR 0x320 /* data breakpoint 2 address */ ++#define LOONGARCH_CSR_DB2MASK 0x321 /* data breakpoint 2 mask */ ++#define LOONGARCH_CSR_DB2CTL 0x322 /* data breakpoint 2 control */ ++#define LOONGARCH_CSR_DB2ASID 0x323 /* data breakpoint 2 asid */ ++ ++#define LOONGARCH_CSR_DB3ADDR 0x328 /* data breakpoint 3 address */ ++#define LOONGARCH_CSR_DB3MASK 0x329 /* data breakpoint 3 mask */ ++#define LOONGARCH_CSR_DB3CTL 0x32a /* data breakpoint 3 control */ ++#define LOONGARCH_CSR_DB3ASID 0x32b /* data breakpoint 3 asid */ ++ ++#define LOONGARCH_CSR_FWPC 0x380 /* instruction breakpoint config */ ++#define LOONGARCH_CSR_FWPS 0x381 /* instruction breakpoint status */ ++ ++#define LOONGARCH_CSR_IB0ADDR 0x390 /* inst breakpoint 0 address */ ++#define LOONGARCH_CSR_IB0MASK 0x391 /* inst breakpoint 0 mask */ ++#define LOONGARCH_CSR_IB0CTL 0x392 /* inst breakpoint 0 control */ ++#define LOONGARCH_CSR_IB0ASID 0x393 /* inst breakpoint 0 asid */ ++#define LOONGARCH_CSR_IB1ADDR 0x398 /* inst breakpoint 1 address */ ++#define LOONGARCH_CSR_IB1MASK 0x399 /* inst breakpoint 1 mask */ ++#define LOONGARCH_CSR_IB1CTL 0x39a /* inst breakpoint 1 control */ ++#define LOONGARCH_CSR_IB1ASID 0x39b /* inst breakpoint 1 asid */ ++ ++#define LOONGARCH_CSR_IB2ADDR 0x3a0 /* inst breakpoint 2 address */ ++#define LOONGARCH_CSR_IB2MASK 0x3a1 /* inst breakpoint 2 mask */ ++#define LOONGARCH_CSR_IB2CTL 0x3a2 /* inst breakpoint 2 control */ ++#define LOONGARCH_CSR_IB2ASID 0x3a3 /* inst breakpoint 2 asid */ ++ ++#define LOONGARCH_CSR_IB3ADDR 0x3a8 /* inst breakpoint 3 address */ ++#define LOONGARCH_CSR_IB3MASK 0x3a9 /* inst breakpoint 3 mask */ ++#define LOONGARCH_CSR_IB3CTL 0x3aa /* inst breakpoint 3 control */ ++#define LOONGARCH_CSR_IB3ASID 0x3ab /* inst breakpoint 3 asid */ ++ ++#define LOONGARCH_CSR_IB4ADDR 0x3b0 /* inst breakpoint 4 address */ ++#define LOONGARCH_CSR_IB4MASK 0x3b1 /* inst breakpoint 4 mask */ ++#define LOONGARCH_CSR_IB4CTL 0x3b2 /* inst breakpoint 4 control */ ++#define LOONGARCH_CSR_IB4ASID 0x3b3 /* inst breakpoint 4 asid */ ++ ++#define LOONGARCH_CSR_IB5ADDR 0x3b8 /* inst breakpoint 5 address */ ++#define LOONGARCH_CSR_IB5MASK 0x3b9 /* inst breakpoint 5 mask */ ++#define LOONGARCH_CSR_IB5CTL 0x3ba /* inst breakpoint 5 control */ ++#define LOONGARCH_CSR_IB5ASID 0x3bb /* inst breakpoint 5 asid */ ++ ++#define LOONGARCH_CSR_IB6ADDR 0x3c0 /* inst breakpoint 6 address */ ++#define LOONGARCH_CSR_IB6MASK 0x3c1 /* inst breakpoint 6 mask */ ++#define LOONGARCH_CSR_IB6CTL 0x3c2 /* inst breakpoint 6 control */ ++#define LOONGARCH_CSR_IB6ASID 0x3c3 /* inst breakpoint 6 asid */ ++ ++#define LOONGARCH_CSR_IB7ADDR 0x3c8 /* inst breakpoint 7 address */ ++#define LOONGARCH_CSR_IB7MASK 0x3c9 /* inst breakpoint 7 mask */ ++#define LOONGARCH_CSR_IB7CTL 0x3ca /* inst breakpoint 7 control */ ++#define LOONGARCH_CSR_IB7ASID 0x3cb /* inst breakpoint 7 asid */ ++ ++#define LOONGARCH_CSR_DEBUG 0x500 /* debug config */ ++#define CSR_DEBUG_DM 0 ++#define CSR_DEBUG_DMVER 1 ++#define CSR_DEBUG_DINT 8 ++#define CSR_DEBUG_DBP 9 ++#define CSR_DEBUG_DIB 10 ++#define CSR_DEBUG_DDB 11 ++ ++#define LOONGARCH_CSR_DERA 0x501 /* debug era */ ++#define LOONGARCH_CSR_DESAVE 0x502 /* debug save */ ++ ++#define LOONGARCH_CSR_PRID 0xc0 /* 32 LOONGARCH CP0 PRID */ ++ ++#define LOONGARCH_CPUCFG0 0x0 ++#define CPUCFG0_3A5000_PRID 0x0014c010 ++ ++#define LOONGARCH_CPUCFG1 0x1 ++#define CPUCFG1_ISGR32 BIT(0) ++#define CPUCFG1_ISGR64 BIT(1) ++#define CPUCFG1_PAGING BIT(2) ++#define CPUCFG1_IOCSR BIT(3) ++#define CPUCFG1_PABITS (47 << 4) ++#define CPUCFG1_VABITS (47 << 12) ++#define CPUCFG1_UAL BIT(20) ++#define CPUCFG1_RI BIT(21) ++#define CPUCFG1_XI BIT(22) ++#define CPUCFG1_RPLV BIT(23) ++#define CPUCFG1_HUGEPG BIT(24) ++#define CPUCFG1_IOCSRBRD BIT(25) ++#define CPUCFG1_MSGINT BIT(26) ++ ++#define LOONGARCH_CPUCFG2 0x2 ++#define CPUCFG2_FP BIT(0) ++#define CPUCFG2_FPSP BIT(1) ++#define CPUCFG2_FPDP BIT(2) ++#define CPUCFG2_FPVERS (0 << 3) ++#define CPUCFG2_LSX BIT(6) ++#define CPUCFG2_LASX BIT(7) ++#define CPUCFG2_COMPLEX BIT(8) ++#define CPUCFG2_CRYPTO BIT(9) ++#define CPUCFG2_LVZP BIT(10) ++#define CPUCFG2_LVZVER (0 << 11) ++#define CPUCFG2_LLFTP BIT(14) ++#define CPUCFG2_LLFTPREV (1 << 15) ++#define CPUCFG2_X86BT BIT(18) ++#define CPUCFG2_ARMBT BIT(19) ++#define CPUCFG2_MIPSBT BIT(20) ++#define CPUCFG2_LSPW BIT(21) ++#define CPUCFG2_LAM BIT(22) ++ ++#define LOONGARCH_CPUCFG3 0x3 ++#define CPUCFG3_CCDMA BIT(0) ++#define CPUCFG3_SFB BIT(1) ++#define CPUCFG3_UCACC BIT(2) ++#define CPUCFG3_LLEXC BIT(3) ++#define CPUCFG3_SCDLY BIT(4) ++#define CPUCFG3_LLDBAR BIT(5) ++#define CPUCFG3_ITLBT BIT(6) ++#define CPUCFG3_ICACHET BIT(7) ++#define CPUCFG3_SPW_LVL (4 << 8) ++#define CPUCFG3_SPW_HG_HF BIT(11) ++#define CPUCFG3_RVA BIT(12) ++#define CPUCFG3_RVAMAX (7 << 13) ++ ++#define LOONGARCH_CPUCFG4 0x4 ++#define CCFREQ_100M 100000000 /* 100M */ ++ ++#define LOONGARCH_CPUCFG5 0x5 ++#define CPUCFG5_CCMUL 1 ++#define CPUCFG5_CCDIV (1 << 16) ++ ++#define LOONGARCH_CPUCFG6 0x6 ++#define CPUCFG6_PMP BIT(0) ++#define CPUCFG6_PAMVER (1 << 1) ++#define CPUCFG6_PMNUM (3 << 4) ++#define CPUCFG6_PMBITS (63 << 8) ++#define CPUCFG6_UPM BIT(14) ++ ++#define LOONGARCH_CPUCFG16 0x10 ++#define CPUCFG16_L1_IUPRE BIT(0) ++#define CPUCFG16_L1_UNIFY BIT(1) ++#define CPUCFG16_L1_DPRE BIT(2) ++#define CPUCFG16_L2_IUPRE BIT(3) ++#define CPUCFG16_L2_IUUNIFY BIT(4) ++#define CPUCFG16_L2_IUPRIV BIT(5) ++#define CPUCFG16_L2_IUINCL BIT(6) ++#define CPUCFG16_L2_DPRE BIT(7) ++#define CPUCFG16_L2_DPRIV BIT(8) ++#define CPUCFG16_L2_DINCL BIT(9) ++#define CPUCFG16_L3_IUPRE BIT(10) ++#define CPUCFG16_L3_IUUNIFY BIT(11) ++#define CPUCFG16_L3_IUPRIV BIT(12) ++#define CPUCFG16_L3_IUINCL BIT(13) ++#define CPUCFG16_L3_DPRE BIT(14) ++#define CPUCFG16_L3_DPRIV BIT(15) ++#define CPUCFG16_L3_DINCL BIT(16) ++ ++#define LOONGARCH_CPUCFG17 0x11 ++#define CPUCFG17_L1I_WAYS_M (3 << 0) ++#define CPUCFG17_L1I_SETS_M (8 << 16) ++#define CPUCFG17_L1I_SIZE_M (6 << 24) ++ ++#define LOONGARCH_CPUCFG18 0x12 ++#define CPUCFG18_L1D_WAYS_M (3 << 0) ++#define CPUCFG18_L1D_SETS_M (8 << 16) ++#define CPUCFG18_L1D_SIZE_M (6 << 24) ++ ++#define LOONGARCH_CPUCFG19 0x13 ++#define CPUCFG19_L2_WAYS_M (0xf << 0) ++#define CPUCFG19_L2_SETS_M (8 << 16) ++#define CPUCFG19_L2_SIZE_M (6 << 24) ++ ++#define LOONGARCH_CPUCFG20 0x14 ++#define CPUCFG20_L3_WAYS_M (0xf << 0) ++#define CPUCFG20_L3_SETS_M (0xe << 16) ++#define CPUCFG20_L3_SIZE_M (0x6 << 24) ++ ++#define LOONGARCH_PAGE_HUGE 0x40 ++#define LOONGARCH_HUGE_GLOBAL 0x1000 ++#define LOONGARCH_HUGE_GLOBAL_SH 12 ++ ++/* ++ * All CSR register ++ * ++ * default value in target/loongarch/cpu.c ++ * reset function in target/loongarch/translate.c:cpu_state_reset() ++ * ++ * This macro will be used only twice. ++ * > In target/loongarch/cpu.h:CPULOONGARCHState ++ * > In target/loongarch/internal.h:loongarch_def_t ++ * ++ * helper_function to rd/wr: ++ * > declare in target/loongarch/helper.h ++ * > realize in target/loongarch/op_helper.c ++ * ++ * during translate: ++ * > gen_csr_rdl() ++ * > gen_csr_wrl() ++ * > gen_csr_rdq() ++ * > gen_csr_wrq() ++ */ ++#define CPU_LOONGARCH_CSR \ ++ uint64_t CSR_CRMD; \ ++ uint64_t CSR_PRMD; \ ++ uint64_t CSR_EUEN; \ ++ uint64_t CSR_MISC; \ ++ uint64_t CSR_ECFG; \ ++ uint64_t CSR_ESTAT; \ ++ uint64_t CSR_ERA; \ ++ uint64_t CSR_BADV; \ ++ uint64_t CSR_BADI; \ ++ uint64_t CSR_EEPN; \ ++ uint64_t CSR_TLBIDX; \ ++ uint64_t CSR_TLBEHI; \ ++ uint64_t CSR_TLBELO0; \ ++ uint64_t CSR_TLBELO1; \ ++ uint64_t CSR_TLBWIRED; \ ++ uint64_t CSR_GTLBC; \ ++ uint64_t CSR_TRGP; \ ++ uint64_t CSR_ASID; \ ++ uint64_t CSR_PGDL; \ ++ uint64_t CSR_PGDH; \ ++ uint64_t CSR_PGD; \ ++ uint64_t CSR_PWCTL0; \ ++ uint64_t CSR_PWCTL1; \ ++ uint64_t CSR_STLBPGSIZE; \ ++ uint64_t CSR_RVACFG; \ ++ uint64_t CSR_CPUID; \ ++ uint64_t CSR_PRCFG1; \ ++ uint64_t CSR_PRCFG2; \ ++ uint64_t CSR_PRCFG3; \ ++ uint64_t CSR_KS0; \ ++ uint64_t CSR_KS1; \ ++ uint64_t CSR_KS2; \ ++ uint64_t CSR_KS3; \ ++ uint64_t CSR_KS4; \ ++ uint64_t CSR_KS5; \ ++ uint64_t CSR_KS6; \ ++ uint64_t CSR_KS7; \ ++ uint64_t CSR_KS8; \ ++ uint64_t CSR_TMID; \ ++ uint64_t CSR_TCFG; \ ++ uint64_t CSR_TVAL; \ ++ uint64_t CSR_CNTC; \ ++ uint64_t CSR_TINTCLR; \ ++ uint64_t CSR_GSTAT; \ ++ uint64_t CSR_GCFG; \ ++ uint64_t CSR_GINTC; \ ++ uint64_t CSR_GCNTC; \ ++ uint64_t CSR_LLBCTL; \ ++ uint64_t CSR_IMPCTL1; \ ++ uint64_t CSR_IMPCTL2; \ ++ uint64_t CSR_GNMI; \ ++ uint64_t CSR_TLBRENT; \ ++ uint64_t CSR_TLBRBADV; \ ++ uint64_t CSR_TLBRERA; \ ++ uint64_t CSR_TLBRSAVE; \ ++ uint64_t CSR_TLBRELO0; \ ++ uint64_t CSR_TLBRELO1; \ ++ uint64_t CSR_TLBREHI; \ ++ uint64_t CSR_TLBRPRMD; \ ++ uint64_t CSR_ERRCTL; \ ++ uint64_t CSR_ERRINFO; \ ++ uint64_t CSR_ERRINFO1; \ ++ uint64_t CSR_ERRENT; \ ++ uint64_t CSR_ERRERA; \ ++ uint64_t CSR_ERRSAVE; \ ++ uint64_t CSR_CTAG; \ ++ uint64_t CSR_DMWIN0; \ ++ uint64_t CSR_DMWIN1; \ ++ uint64_t CSR_DMWIN2; \ ++ uint64_t CSR_DMWIN3; \ ++ uint64_t CSR_PERFCTRL0; \ ++ uint64_t CSR_PERFCNTR0; \ ++ uint64_t CSR_PERFCTRL1; \ ++ uint64_t CSR_PERFCNTR1; \ ++ uint64_t CSR_PERFCTRL2; \ ++ uint64_t CSR_PERFCNTR2; \ ++ uint64_t CSR_PERFCTRL3; \ ++ uint64_t CSR_PERFCNTR3; \ ++ uint64_t CSR_MWPC; \ ++ uint64_t CSR_MWPS; \ ++ uint64_t CSR_DB0ADDR; \ ++ uint64_t CSR_DB0MASK; \ ++ uint64_t CSR_DB0CTL; \ ++ uint64_t CSR_DB0ASID; \ ++ uint64_t CSR_DB1ADDR; \ ++ uint64_t CSR_DB1MASK; \ ++ uint64_t CSR_DB1CTL; \ ++ uint64_t CSR_DB1ASID; \ ++ uint64_t CSR_DB2ADDR; \ ++ uint64_t CSR_DB2MASK; \ ++ uint64_t CSR_DB2CTL; \ ++ uint64_t CSR_DB2ASID; \ ++ uint64_t CSR_DB3ADDR; \ ++ uint64_t CSR_DB3MASK; \ ++ uint64_t CSR_DB3CTL; \ ++ uint64_t CSR_DB3ASID; \ ++ uint64_t CSR_FWPC; \ ++ uint64_t CSR_FWPS; \ ++ uint64_t CSR_IB0ADDR; \ ++ uint64_t CSR_IB0MASK; \ ++ uint64_t CSR_IB0CTL; \ ++ uint64_t CSR_IB0ASID; \ ++ uint64_t CSR_IB1ADDR; \ ++ uint64_t CSR_IB1MASK; \ ++ uint64_t CSR_IB1CTL; \ ++ uint64_t CSR_IB1ASID; \ ++ uint64_t CSR_IB2ADDR; \ ++ uint64_t CSR_IB2MASK; \ ++ uint64_t CSR_IB2CTL; \ ++ uint64_t CSR_IB2ASID; \ ++ uint64_t CSR_IB3ADDR; \ ++ uint64_t CSR_IB3MASK; \ ++ uint64_t CSR_IB3CTL; \ ++ uint64_t CSR_IB3ASID; \ ++ uint64_t CSR_IB4ADDR; \ ++ uint64_t CSR_IB4MASK; \ ++ uint64_t CSR_IB4CTL; \ ++ uint64_t CSR_IB4ASID; \ ++ uint64_t CSR_IB5ADDR; \ ++ uint64_t CSR_IB5MASK; \ ++ uint64_t CSR_IB5CTL; \ ++ uint64_t CSR_IB5ASID; \ ++ uint64_t CSR_IB6ADDR; \ ++ uint64_t CSR_IB6MASK; \ ++ uint64_t CSR_IB6CTL; \ ++ uint64_t CSR_IB6ASID; \ ++ uint64_t CSR_IB7ADDR; \ ++ uint64_t CSR_IB7MASK; \ ++ uint64_t CSR_IB7CTL; \ ++ uint64_t CSR_IB7ASID; \ ++ uint64_t CSR_DEBUG; \ ++ uint64_t CSR_DERA; \ ++ uint64_t CSR_DESAVE; ++ ++#define LOONGARCH_CSR_32(_R, _S) \ ++ (KVM_REG_LOONGARCH_CSR | KVM_REG_SIZE_U32 | (8 * (_R) + (_S))) ++ ++#define LOONGARCH_CSR_64(_R, _S) \ ++ (KVM_REG_LOONGARCH_CSR | KVM_REG_SIZE_U64 | (8 * (_R) + (_S))) ++ ++#define KVM_IOC_CSRID(id) LOONGARCH_CSR_64(id, 0) ++ ++#endif +diff --git a/target/loongarch64/cpu-param.h b/target/loongarch64/cpu-param.h +new file mode 100644 +index 0000000000..b5acb6b91e +--- /dev/null ++++ b/target/loongarch64/cpu-param.h +@@ -0,0 +1,46 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef CPU_PARAM_H ++#define CPU_PARAM_H ++ ++/* If we want to use host float regs... */ ++/* #define USE_HOST_FLOAT_REGS */ ++ ++/* Real pages are variable size... */ ++#define TARGET_PAGE_BITS 14 ++ ++#define LOONGARCH_TLB_MAX 2112 ++ ++#define TARGET_LONG_BITS 64 ++#define TARGET_PHYS_ADDR_SPACE_BITS 48 ++#define TARGET_VIRT_ADDR_SPACE_BITS 48 ++ ++/* ++ * bit definitions for insn_flags (ISAs/ASEs flags) ++ * ------------------------------------------------ ++ */ ++#define ISA_LARCH32 0x00000001ULL ++#define ISA_LARCH64 0x00000002ULL ++#define INSN_LOONGARCH 0x00010000ULL ++ ++#define CPU_LARCH32 (ISA_LARCH32) ++#define CPU_LARCH64 (ISA_LARCH32 | ISA_LARCH64) ++ ++#define NB_MMU_MODES 4 ++ ++#endif /* QEMU_LOONGARCH_DEFS_H */ +diff --git a/target/loongarch64/cpu-qom.h b/target/loongarch64/cpu-qom.h +new file mode 100644 +index 0000000000..43541c34e5 +--- /dev/null ++++ b/target/loongarch64/cpu-qom.h +@@ -0,0 +1,54 @@ ++/* ++ * QEMU LOONGARCH CPU ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef QEMU_LOONGARCH_CPU_QOM_H ++#define QEMU_LOONGARCH_CPU_QOM_H ++ ++#include "hw/core/cpu.h" ++ ++#define TYPE_LOONGARCH_CPU "loongarch-cpu" ++ ++#define LOONGARCH_CPU_CLASS(klass) \ ++ OBJECT_CLASS_CHECK(LOONGARCHCPUClass, (klass), TYPE_LOONGARCH_CPU) ++#define LOONGARCH_CPU(obj) \ ++ OBJECT_CHECK(LOONGARCHCPU, (obj), TYPE_LOONGARCH_CPU) ++#define LOONGARCH_CPU_GET_CLASS(obj) \ ++ OBJECT_GET_CLASS(LOONGARCHCPUClass, (obj), TYPE_LOONGARCH_CPU) ++ ++/** ++ * LOONGARCHCPUClass: ++ * @parent_realize: The parent class' realize handler. ++ * @parent_reset: The parent class' reset handler. ++ * ++ * A LOONGARCH CPU model. ++ */ ++typedef struct LOONGARCHCPUClass { ++ /*< private >*/ ++ CPUClass parent_class; ++ /*< public >*/ ++ ++ DeviceRealize parent_realize; ++ DeviceUnrealize parent_unrealize; ++ DeviceReset parent_reset; ++ const struct loongarch_def_t *cpu_def; ++} LOONGARCHCPUClass; ++ ++typedef struct LOONGARCHCPU LOONGARCHCPU; ++ ++#endif +diff --git a/target/loongarch64/cpu.c b/target/loongarch64/cpu.c +new file mode 100644 +index 0000000000..ce04d8064f +--- /dev/null ++++ b/target/loongarch64/cpu.c +@@ -0,0 +1,575 @@ ++/* ++ * QEMU LOONGARCH CPU ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qapi/error.h" ++#include "qapi/visitor.h" ++#include "cpu.h" ++#include "internal.h" ++#include "kvm_larch.h" ++#include "qemu-common.h" ++#include "hw/qdev-properties.h" ++#include "sysemu/kvm.h" ++#include "exec/exec-all.h" ++#include "sysemu/arch_init.h" ++#include "cpu-csr.h" ++#include "qemu/qemu-print.h" ++#include "qapi/qapi-commands-machine-target.h" ++#ifdef CONFIG_TCG ++#include "hw/core/tcg-cpu-ops.h" ++#endif /* CONFIG_TCG */ ++ ++#define LOONGARCH_CONFIG1 \ ++ ((0x8 << CSR_CONF1_KSNUM_SHIFT) | (0x2f << CSR_CONF1_TMRBITS_SHIFT) | \ ++ (0x7 << CSR_CONF1_VSMAX_SHIFT)) ++ ++#define LOONGARCH_CONFIG3 \ ++ ((0x2 << CSR_CONF3_TLBORG_SHIFT) | (0x3f << CSR_CONF3_MTLBSIZE_SHIFT) | \ ++ (0x7 << CSR_CONF3_STLBWAYS_SHIFT) | (0x8 << CSR_CONF3_STLBIDX_SHIFT)) ++ ++/* LOONGARCH CPU definitions */ ++const loongarch_def_t loongarch_defs[] = { ++ { ++ .name = "Loongson-3A5000", ++ ++ /* for LoongISA CSR */ ++ .CSR_PRCFG1 = LOONGARCH_CONFIG1, ++ .CSR_PRCFG2 = 0x3ffff000, ++ .CSR_PRCFG3 = LOONGARCH_CONFIG3, ++ .CSR_CRMD = (0 << CSR_CRMD_PLV_SHIFT) | (0 << CSR_CRMD_IE_SHIFT) | ++ (1 << CSR_CRMD_DA_SHIFT) | (0 << CSR_CRMD_PG_SHIFT) | ++ (1 << CSR_CRMD_DACF_SHIFT) | (1 << CSR_CRMD_DACM_SHIFT), ++ .CSR_ECFG = 0x7 << 16, ++ .CSR_STLBPGSIZE = 0xe, ++ .CSR_RVACFG = 0x0, ++ .CSR_ASID = 0xa0000, ++ .FCSR0 = 0x0, ++ .FCSR0_rw_bitmask = 0x1f1f03df, ++ .PABITS = 48, ++ .insn_flags = CPU_LARCH64 | INSN_LOONGARCH, ++ .mmu_type = MMU_TYPE_LS3A5K, ++ }, ++ { ++ .name = "host", ++ ++ /* for LoongISA CSR */ ++ .CSR_PRCFG1 = LOONGARCH_CONFIG1, ++ .CSR_PRCFG2 = 0x3ffff000, ++ .CSR_PRCFG3 = LOONGARCH_CONFIG3, ++ .CSR_CRMD = (0 << CSR_CRMD_PLV_SHIFT) | (0 << CSR_CRMD_IE_SHIFT) | ++ (1 << CSR_CRMD_DA_SHIFT) | (0 << CSR_CRMD_PG_SHIFT) | ++ (1 << CSR_CRMD_DACF_SHIFT) | (1 << CSR_CRMD_DACM_SHIFT), ++ .CSR_ECFG = 0x7 << 16, ++ .CSR_STLBPGSIZE = 0xe, ++ .CSR_RVACFG = 0x0, ++ .FCSR0 = 0x0, ++ .FCSR0_rw_bitmask = 0x1f1f03df, ++ .PABITS = 48, ++ .insn_flags = CPU_LARCH64 | INSN_LOONGARCH, ++ .mmu_type = MMU_TYPE_LS3A5K, ++ }, ++}; ++const int loongarch_defs_number = ARRAY_SIZE(loongarch_defs); ++ ++void loongarch_cpu_list(void) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(loongarch_defs); i++) { ++ qemu_printf("LOONGARCH '%s'\n", loongarch_defs[i].name); ++ } ++} ++ ++CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp) ++{ ++ CpuDefinitionInfoList *cpu_list = NULL; ++ const loongarch_def_t *def; ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(loongarch_defs); i++) { ++ CpuDefinitionInfoList *entry; ++ CpuDefinitionInfo *info; ++ ++ def = &loongarch_defs[i]; ++ info = g_malloc0(sizeof(*info)); ++ info->name = g_strdup(def->name); ++ ++ entry = g_malloc0(sizeof(*entry)); ++ entry->value = info; ++ entry->next = cpu_list; ++ cpu_list = entry; ++ } ++ ++ return cpu_list; ++} ++ ++static void loongarch_cpu_set_pc(CPUState *cs, vaddr value) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ ++ env->active_tc.PC = value & ~(target_ulong)1; ++} ++ ++static bool loongarch_cpu_has_work(CPUState *cs) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ bool has_work = false; ++ ++ /* ++ * It is implementation dependent if non-enabled ++ * interrupts wake-up the CPU, however most of the implementations only ++ * check for interrupts that can be taken. ++ */ ++ if ((cs->interrupt_request & CPU_INTERRUPT_HARD) && ++ cpu_loongarch_hw_interrupts_pending(env)) { ++ has_work = true; ++ } ++ ++ return has_work; ++} ++ ++const char *const regnames[] = { ++ "r0", "ra", "tp", "sp", "a0", "a1", "a2", "a3", "a4", "a5", "a6", ++ "a7", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "x0", ++ "fp", "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", ++}; ++ ++const char *const fregnames[] = { ++ "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", ++ "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", ++ "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", ++ "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", ++}; ++ ++static void fpu_dump_state(CPULOONGARCHState *env, FILE *f, ++ fprintf_function fpu_fprintf, int flags) ++{ ++ int i; ++ int is_fpu64 = 1; ++ ++#define printfpr(fp) \ ++ do { \ ++ if (is_fpu64) \ ++ fpu_fprintf( \ ++ f, "w:%08x d:%016" PRIx64 " fd:%13g fs:%13g psu: %13g\n", \ ++ (fp)->w[FP_ENDIAN_IDX], (fp)->d, (double)(fp)->fd, \ ++ (double)(fp)->fs[FP_ENDIAN_IDX], \ ++ (double)(fp)->fs[!FP_ENDIAN_IDX]); \ ++ else { \ ++ fpr_t tmp; \ ++ tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX]; \ ++ tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX]; \ ++ fpu_fprintf(f, \ ++ "w:%08x d:%016" PRIx64 " fd:%13g fs:%13g psu:%13g\n", \ ++ tmp.w[FP_ENDIAN_IDX], tmp.d, (double)tmp.fd, \ ++ (double)tmp.fs[FP_ENDIAN_IDX], \ ++ (double)tmp.fs[!FP_ENDIAN_IDX]); \ ++ } \ ++ } while (0) ++ ++ fpu_fprintf(f, "FCSR0 0x%08x SR.FR %d fp_status 0x%02x\n", ++ env->active_fpu.fcsr0, is_fpu64, ++ get_float_exception_flags(&env->active_fpu.fp_status)); ++ for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) { ++ fpu_fprintf(f, "%3s: ", fregnames[i]); ++ printfpr(&env->active_fpu.fpr[i]); ++ } ++ ++#undef printfpr ++} ++ ++void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ int i; ++ ++ qemu_fprintf(f, "pc:\t %lx\n", env->active_tc.PC); ++ for (i = 0; i < 32; i++) { ++ if ((i & 3) == 0) { ++ qemu_fprintf(f, "GPR%02d:", i); ++ } ++ qemu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], ++ env->active_tc.gpr[i]); ++ if ((i & 3) == 3) { ++ qemu_fprintf(f, "\n"); ++ } ++ } ++ qemu_fprintf(f, "EUEN 0x%lx\n", env->CSR_EUEN); ++ qemu_fprintf(f, "ESTAT 0x%lx\n", env->CSR_ESTAT); ++ qemu_fprintf(f, "ERA 0x%lx\n", env->CSR_ERA); ++ qemu_fprintf(f, "CRMD 0x%lx\n", env->CSR_CRMD); ++ qemu_fprintf(f, "PRMD 0x%lx\n", env->CSR_PRMD); ++ qemu_fprintf(f, "BadVAddr 0x%lx\n", env->CSR_BADV); ++ qemu_fprintf(f, "TLB refill ERA 0x%lx\n", env->CSR_TLBRERA); ++ qemu_fprintf(f, "TLB refill BadV 0x%lx\n", env->CSR_TLBRBADV); ++ qemu_fprintf(f, "EEPN 0x%lx\n", env->CSR_EEPN); ++ qemu_fprintf(f, "BadInstr 0x%lx\n", env->CSR_BADI); ++ qemu_fprintf(f, "PRCFG1 0x%lx\nPRCFG2 0x%lx\nPRCFG3 0x%lx\n", ++ env->CSR_PRCFG1, env->CSR_PRCFG3, env->CSR_PRCFG3); ++ if ((flags & CPU_DUMP_FPU) && (env->hflags & LARCH_HFLAG_FPU)) { ++ fpu_dump_state(env, f, qemu_fprintf, flags); ++ } ++} ++ ++void cpu_state_reset(CPULOONGARCHState *env) ++{ ++ LOONGARCHCPU *cpu = loongarch_env_get_cpu(env); ++ CPUState *cs = CPU(cpu); ++ ++ /* Reset registers to their default values */ ++ env->CSR_PRCFG1 = env->cpu_model->CSR_PRCFG1; ++ env->CSR_PRCFG2 = env->cpu_model->CSR_PRCFG2; ++ env->CSR_PRCFG3 = env->cpu_model->CSR_PRCFG3; ++ env->CSR_CRMD = env->cpu_model->CSR_CRMD; ++ env->CSR_ECFG = env->cpu_model->CSR_ECFG; ++ env->CSR_STLBPGSIZE = env->cpu_model->CSR_STLBPGSIZE; ++ env->CSR_RVACFG = env->cpu_model->CSR_RVACFG; ++ env->CSR_ASID = env->cpu_model->CSR_ASID; ++ ++ env->current_tc = 0; ++ env->active_fpu.fcsr0_rw_bitmask = env->cpu_model->FCSR0_rw_bitmask; ++ env->active_fpu.fcsr0 = env->cpu_model->FCSR0; ++ env->insn_flags = env->cpu_model->insn_flags; ++ ++#if !defined(CONFIG_USER_ONLY) ++ env->CSR_ERA = env->active_tc.PC; ++ env->active_tc.PC = env->exception_base; ++#ifdef CONFIG_TCG ++ env->tlb->tlb_in_use = env->tlb->nb_tlb; ++#endif ++ env->CSR_TLBWIRED = 0; ++ env->CSR_TMID = cs->cpu_index; ++ env->CSR_CPUID = (cs->cpu_index & 0x1ff); ++ env->CSR_EEPN |= (uint64_t)0x80000000; ++ env->CSR_TLBRENT |= (uint64_t)0x80000000; ++#endif ++ ++ /* Count register increments in debug mode, EJTAG version 1 */ ++ env->CSR_DEBUG = (1 << CSR_DEBUG_DINT) | (0x1 << CSR_DEBUG_DMVER); ++ ++ compute_hflags(env); ++ restore_fp_status(env); ++ cs->exception_index = EXCP_NONE; ++} ++ ++/* CPUClass::reset() */ ++static void loongarch_cpu_reset(DeviceState *dev) ++{ ++ CPUState *s = CPU(dev); ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(s); ++ LOONGARCHCPUClass *mcc = LOONGARCH_CPU_GET_CLASS(cpu); ++ CPULOONGARCHState *env = &cpu->env; ++ ++ mcc->parent_reset(dev); ++ ++ memset(env, 0, offsetof(CPULOONGARCHState, end_reset_fields)); ++ ++ cpu_state_reset(env); ++ ++#ifndef CONFIG_USER_ONLY ++ if (kvm_enabled()) { ++ kvm_loongarch_reset_vcpu(cpu); ++ } ++#endif ++} ++ ++static void loongarch_cpu_disas_set_info(CPUState *s, disassemble_info *info) ++{ ++ info->print_insn = print_insn_loongarch; ++} ++ ++static void fpu_init(CPULOONGARCHState *env, const loongarch_def_t *def) ++{ ++ memcpy(&env->active_fpu, &env->fpus[0], sizeof(env->active_fpu)); ++} ++ ++void cpu_loongarch_realize_env(CPULOONGARCHState *env) ++{ ++ env->exception_base = 0x1C000000; ++ ++#if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) ++ mmu_init(env, env->cpu_model); ++#endif ++ fpu_init(env, env->cpu_model); ++} ++ ++static void loongarch_cpu_realizefn(DeviceState *dev, Error **errp) ++{ ++ CPUState *cs = CPU(dev); ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(dev); ++ LOONGARCHCPUClass *mcc = LOONGARCH_CPU_GET_CLASS(dev); ++ Error *local_err = NULL; ++ ++ cpu_exec_realizefn(cs, &local_err); ++ if (local_err != NULL) { ++ error_propagate(errp, local_err); ++ return; ++ } ++ ++ cpu_loongarch_realize_env(&cpu->env); ++ ++ loongarch_cpu_register_gdb_regs_for_features(cs); ++ ++ cpu_reset(cs); ++ qemu_init_vcpu(cs); ++ ++ mcc->parent_realize(dev, errp); ++ cpu->hotplugged = 1; ++} ++ ++static void loongarch_cpu_unrealizefn(DeviceState *dev) ++{ ++ LOONGARCHCPUClass *mcc = LOONGARCH_CPU_GET_CLASS(dev); ++ ++#ifndef CONFIG_USER_ONLY ++ cpu_remove_sync(CPU(dev)); ++#endif ++ ++ mcc->parent_unrealize(dev); ++} ++ ++static void loongarch_cpu_initfn(Object *obj) ++{ ++ CPUState *cs = CPU(obj); ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(obj); ++ CPULOONGARCHState *env = &cpu->env; ++ LOONGARCHCPUClass *mcc = LOONGARCH_CPU_GET_CLASS(obj); ++ cpu_set_cpustate_pointers(cpu); ++ cs->env_ptr = env; ++ env->cpu_model = mcc->cpu_def; ++ cs->halted = 1; ++ cpu->dtb_compatible = "loongarch,Loongson-3A5000"; ++} ++ ++static char *loongarch_cpu_type_name(const char *cpu_model) ++{ ++ return g_strdup_printf(LOONGARCH_CPU_TYPE_NAME("%s"), cpu_model); ++} ++ ++static ObjectClass *loongarch_cpu_class_by_name(const char *cpu_model) ++{ ++ ObjectClass *oc; ++ char *typename; ++ ++ typename = loongarch_cpu_type_name(cpu_model); ++ oc = object_class_by_name(typename); ++ g_free(typename); ++ return oc; ++} ++ ++static int64_t loongarch_cpu_get_arch_id(CPUState *cs) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ ++ return cpu->id; ++} ++ ++static Property loongarch_cpu_properties[] = { ++ DEFINE_PROP_INT32("core-id", LOONGARCHCPU, core_id, -1), ++ DEFINE_PROP_INT32("id", LOONGARCHCPU, id, UNASSIGNED_CPU_ID), ++ DEFINE_PROP_INT32("node-id", LOONGARCHCPU, node_id, ++ CPU_UNSET_NUMA_NODE_ID), ++ ++ DEFINE_PROP_END_OF_LIST() ++}; ++ ++#ifdef CONFIG_TCG ++static void loongarch_cpu_synchronize_from_tb(CPUState *cs, ++ const TranslationBlock *tb) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ ++ env->active_tc.PC = tb->pc; ++ env->hflags &= ~LARCH_HFLAG_BMASK; ++ env->hflags |= tb->flags & LARCH_HFLAG_BMASK; ++} ++ ++static const struct TCGCPUOps loongarch_tcg_ops = { ++ .initialize = loongarch_tcg_init, ++ .synchronize_from_tb = loongarch_cpu_synchronize_from_tb, ++ ++ .tlb_fill = loongarch_cpu_tlb_fill, ++ .cpu_exec_interrupt = loongarch_cpu_exec_interrupt, ++ .do_interrupt = loongarch_cpu_do_interrupt, ++ ++#ifndef CONFIG_USER_ONLY ++ .do_unaligned_access = loongarch_cpu_do_unaligned_access, ++#endif /* !CONFIG_USER_ONLY */ ++}; ++#endif /* CONFIG_TCG */ ++ ++#if !defined(CONFIG_USER_ONLY) ++static int get_physical_address(CPULOONGARCHState *env, hwaddr *physical, ++ int *prot, target_ulong real_address, int rw, ++ int access_type, int mmu_idx) ++{ ++ int user_mode = mmu_idx == LARCH_HFLAG_UM; ++ int kernel_mode = !user_mode; ++ unsigned plv, base_c, base_v, tmp; ++ ++ /* effective address (modified for KVM T&E kernel segments) */ ++ target_ulong address = real_address; ++ ++ /* Check PG */ ++ if (!(env->CSR_CRMD & CSR_CRMD_PG)) { ++ /* DA mode */ ++ *physical = address & 0xffffffffffffUL; ++ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; ++ return TLBRET_MATCH; ++ } ++ ++ plv = kernel_mode | (user_mode << 3); ++ base_v = address >> CSR_DMW_BASE_SH; ++ /* Check direct map window 0 */ ++ base_c = env->CSR_DMWIN0 >> CSR_DMW_BASE_SH; ++ if ((plv & env->CSR_DMWIN0) && (base_c == base_v)) { ++ *physical = dmwin_va2pa(address); ++ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; ++ return TLBRET_MATCH; ++ } ++ /* Check direct map window 1 */ ++ base_c = env->CSR_DMWIN1 >> CSR_DMW_BASE_SH; ++ if ((plv & env->CSR_DMWIN1) && (base_c == base_v)) { ++ *physical = dmwin_va2pa(address); ++ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; ++ return TLBRET_MATCH; ++ } ++ /* Check valid extension */ ++ tmp = address >> 47; ++ if (!(tmp == 0 || tmp == 0x1ffff)) { ++ return TLBRET_BADADDR; ++ } ++ /* mapped address */ ++ return env->tlb->map_address(env, physical, prot, real_address, rw, ++ access_type); ++} ++ ++hwaddr loongarch_cpu_get_phys_page_debug(CPUState *cs, vaddr addr) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ hwaddr phys_addr; ++ int prot; ++ ++ if (get_physical_address(env, &phys_addr, &prot, addr, 0, ACCESS_INT, ++ cpu_mmu_index(env, false)) != 0) { ++ return -1; ++ } ++ return phys_addr; ++} ++#endif ++ ++#ifndef CONFIG_USER_ONLY ++#include "hw/core/sysemu-cpu-ops.h" ++ ++static const struct SysemuCPUOps loongarch_sysemu_ops = { ++ .write_elf64_note = loongarch_cpu_write_elf64_note, ++ .get_phys_page_debug = loongarch_cpu_get_phys_page_debug, ++ .legacy_vmsd = &vmstate_loongarch_cpu, ++}; ++#endif ++ ++static gchar *loongarch_gdb_arch_name(CPUState *cs) ++{ ++ return g_strdup("loongarch64"); ++} ++ ++static void loongarch_cpu_class_init(ObjectClass *c, void *data) ++{ ++ LOONGARCHCPUClass *mcc = LOONGARCH_CPU_CLASS(c); ++ CPUClass *cc = CPU_CLASS(c); ++ DeviceClass *dc = DEVICE_CLASS(c); ++ ++ device_class_set_props(dc, loongarch_cpu_properties); ++ device_class_set_parent_realize(dc, loongarch_cpu_realizefn, ++ &mcc->parent_realize); ++ ++ device_class_set_parent_unrealize(dc, loongarch_cpu_unrealizefn, ++ &mcc->parent_unrealize); ++ ++ device_class_set_parent_reset(dc, loongarch_cpu_reset, &mcc->parent_reset); ++ cc->get_arch_id = loongarch_cpu_get_arch_id; ++ ++ cc->class_by_name = loongarch_cpu_class_by_name; ++ cc->has_work = loongarch_cpu_has_work; ++ cc->dump_state = loongarch_cpu_dump_state; ++ cc->set_pc = loongarch_cpu_set_pc; ++ cc->gdb_read_register = loongarch_cpu_gdb_read_register; ++ cc->gdb_write_register = loongarch_cpu_gdb_write_register; ++ cc->disas_set_info = loongarch_cpu_disas_set_info; ++ cc->gdb_arch_name = loongarch_gdb_arch_name; ++#ifndef CONFIG_USER_ONLY ++ cc->sysemu_ops = &loongarch_sysemu_ops; ++#endif /* !CONFIG_USER_ONLY */ ++ ++ cc->gdb_num_core_regs = 35; ++ cc->gdb_core_xml_file = "loongarch-base64.xml"; ++ cc->gdb_stop_before_watchpoint = true; ++ ++ dc->user_creatable = true; ++#ifdef CONFIG_TCG ++ cc->tcg_ops = &loongarch_tcg_ops; ++#endif /* CONFIG_TCG */ ++} ++ ++static const TypeInfo loongarch_cpu_type_info = { ++ .name = TYPE_LOONGARCH_CPU, ++ .parent = TYPE_CPU, ++ .instance_size = sizeof(LOONGARCHCPU), ++ .instance_init = loongarch_cpu_initfn, ++ .abstract = true, ++ .class_size = sizeof(LOONGARCHCPUClass), ++ .class_init = loongarch_cpu_class_init, ++}; ++ ++static void loongarch_cpu_cpudef_class_init(ObjectClass *oc, void *data) ++{ ++ LOONGARCHCPUClass *mcc = LOONGARCH_CPU_CLASS(oc); ++ mcc->cpu_def = data; ++} ++ ++static void loongarch_register_cpudef_type(const struct loongarch_def_t *def) ++{ ++ char *typename = loongarch_cpu_type_name(def->name); ++ TypeInfo ti = { ++ .name = typename, ++ .parent = TYPE_LOONGARCH_CPU, ++ .class_init = loongarch_cpu_cpudef_class_init, ++ .class_data = (void *)def, ++ }; ++ ++ type_register(&ti); ++ g_free(typename); ++} ++ ++static void loongarch_cpu_register_types(void) ++{ ++ int i; ++ ++ type_register_static(&loongarch_cpu_type_info); ++ for (i = 0; i < loongarch_defs_number; i++) { ++ loongarch_register_cpudef_type(&loongarch_defs[i]); ++ } ++} ++ ++type_init(loongarch_cpu_register_types) +diff --git a/target/loongarch64/cpu.h b/target/loongarch64/cpu.h +new file mode 100644 +index 0000000000..bf5b36d404 +--- /dev/null ++++ b/target/loongarch64/cpu.h +@@ -0,0 +1,359 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_CPU_H ++#define LOONGARCH_CPU_H ++ ++#define CPUArchState struct CPULOONGARCHState ++ ++#include "qemu-common.h" ++#include "cpu-qom.h" ++#include "larch-defs.h" ++#include "exec/cpu-defs.h" ++#include "fpu/softfloat.h" ++#include "sysemu/sysemu.h" ++#include "cpu-csr.h" ++ ++#define TCG_GUEST_DEFAULT_MO (0) ++ ++struct CPULOONGARCHState; ++typedef LOONGARCHCPU ArchCPU; ++typedef struct CPULOONGARCHTLBContext CPULOONGARCHTLBContext; ++ ++#define LASX_REG_WIDTH (256) ++typedef union lasx_reg_t lasx_reg_t; ++union lasx_reg_t ++{ ++ int64_t val64[LASX_REG_WIDTH / 64]; ++}; ++ ++typedef union fpr_t fpr_t; ++union fpr_t ++{ ++ float64 fd; /* ieee double precision */ ++ float32 fs[2]; /* ieee single precision */ ++ uint64_t d; /* binary double fixed-point */ ++ uint32_t w[2]; /* binary single fixed-point */ ++ /* FPU/LASX register mapping is not tested on big-endian hosts. */ ++ lasx_reg_t lasx; /* vector data */ ++}; ++/* ++ * define FP_ENDIAN_IDX to access the same location ++ * in the fpr_t union regardless of the host endianness ++ */ ++#if defined(HOST_WORDS_BIGENDIAN) ++#define FP_ENDIAN_IDX 1 ++#else ++#define FP_ENDIAN_IDX 0 ++#endif ++ ++typedef struct CPULOONGARCHFPUContext { ++ /* Floating point registers */ ++ fpr_t fpr[32]; ++ float_status fp_status; ++ ++ bool cf[8]; ++ /* ++ * fcsr0 ++ * 31:29 |28:24 |23:21 |20:16 |15:10 |9:8 |7 |6 |5 |4:0 ++ * Cause Flags RM DAE TM Enables ++ */ ++ uint32_t fcsr0; ++ uint32_t fcsr0_rw_bitmask; ++ uint32_t vcsr16; ++} CPULOONGARCHFPUContext; ++ ++/* fp control and status register definition */ ++#define FCSR0_M1 0xdf /* DAE, TM and Enables */ ++#define FCSR0_M2 0x1f1f0000 /* Cause and Flags */ ++#define FCSR0_M3 0x300 /* Round Mode */ ++#define FCSR0_RM 8 /* Round Mode bit num on fcsr0 */ ++#define GET_FP_CAUSE(reg) (((reg) >> 24) & 0x1f) ++#define GET_FP_ENABLE(reg) (((reg) >> 0) & 0x1f) ++#define GET_FP_FLAGS(reg) (((reg) >> 16) & 0x1f) ++#define SET_FP_CAUSE(reg, v) \ ++ do { \ ++ (reg) = ((reg) & ~(0x1f << 24)) | ((v & 0x1f) << 24); \ ++ } while (0) ++#define SET_FP_ENABLE(reg, v) \ ++ do { \ ++ (reg) = ((reg) & ~(0x1f << 0)) | ((v & 0x1f) << 0); \ ++ } while (0) ++#define SET_FP_FLAGS(reg, v) \ ++ do { \ ++ (reg) = ((reg) & ~(0x1f << 16)) | ((v & 0x1f) << 16); \ ++ } while (0) ++#define UPDATE_FP_FLAGS(reg, v) \ ++ do { \ ++ (reg) |= ((v & 0x1f) << 16); \ ++ } while (0) ++#define FP_INEXACT 1 ++#define FP_UNDERFLOW 2 ++#define FP_OVERFLOW 4 ++#define FP_DIV0 8 ++#define FP_INVALID 16 ++ ++#define TARGET_INSN_START_EXTRA_WORDS 2 ++ ++typedef struct loongarch_def_t loongarch_def_t; ++ ++#define LOONGARCH_FPU_MAX 1 ++#define LOONGARCH_KSCRATCH_NUM 8 ++ ++typedef struct TCState TCState; ++struct TCState { ++ target_ulong gpr[32]; ++ target_ulong PC; ++}; ++ ++#define N_IRQS 14 ++#define IRQ_TIMER 11 ++#define IRQ_IPI 12 ++#define IRQ_UART 2 ++ ++typedef struct CPULOONGARCHState CPULOONGARCHState; ++struct CPULOONGARCHState { ++ TCState active_tc; ++ CPULOONGARCHFPUContext active_fpu; ++ ++ uint32_t current_tc; ++ uint64_t scr[4]; ++ uint32_t PABITS; ++ ++ /* LoongISA CSR register */ ++ CPU_LOONGARCH_CSR ++ uint64_t lladdr; ++ target_ulong llval; ++ uint64_t llval_wp; ++ uint32_t llnewval_wp; ++ ++ CPULOONGARCHFPUContext fpus[LOONGARCH_FPU_MAX]; ++ /* QEMU */ ++ int error_code; ++#define EXCP_TLB_NOMATCH 0x1 ++#define EXCP_INST_NOTAVAIL 0x2 /* No valid instruction word for BadInstr */ ++ uint32_t hflags; /* CPU State */ ++ /* TMASK defines different execution modes */ ++#define LARCH_HFLAG_TMASK 0x5F5807FF ++ /* ++ * The KSU flags must be the lowest bits in hflags. The flag order ++ * must be the same as defined for CP0 Status. This allows to use ++ * the bits as the value of mmu_idx. ++ */ ++#define LARCH_HFLAG_KSU 0x00003 /* kernel/user mode mask */ ++#define LARCH_HFLAG_UM 0x00003 /* user mode flag */ ++#define LARCH_HFLAG_KM 0x00000 /* kernel mode flag */ ++#define LARCH_HFLAG_64 0x00008 /* 64-bit instructions enabled */ ++#define LARCH_HFLAG_FPU 0x00020 /* FPU enabled */ ++#define LARCH_HFLAG_AWRAP 0x00200 /* 32-bit compatibility address wrapping */ ++ /* ++ * If translation is interrupted between the branch instruction and ++ * the delay slot, record what type of branch it is so that we can ++ * resume translation properly. It might be possible to reduce ++ * this from three bits to two. ++ */ ++#define LARCH_HFLAG_BMASK 0x03800 ++#define LARCH_HFLAG_B 0x00800 /* Unconditional branch */ ++#define LARCH_HFLAG_BC 0x01000 /* Conditional branch */ ++#define LARCH_HFLAG_BR 0x02000 /* branch to register (can't link TB) */ ++#define LARCH_HFLAG_LSX 0x1000000 ++#define LARCH_HFLAG_LASX 0x2000000 ++#define LARCH_HFLAG_LBT 0x40000000 ++ target_ulong btarget; /* Jump / branch target */ ++ target_ulong bcond; /* Branch condition (if needed) */ ++ ++ uint64_t insn_flags; /* Supported instruction set */ ++ int cpu_cfg[64]; ++ ++ /* Fields up to this point are cleared by a CPU reset */ ++ struct { ++ } end_reset_fields; ++ ++ /* Fields from here on are preserved across CPU reset. */ ++#if !defined(CONFIG_USER_ONLY) ++ CPULOONGARCHTLBContext *tlb; ++#endif ++ ++ const loongarch_def_t *cpu_model; ++ void *irq[N_IRQS]; ++ QEMUTimer *timer; /* Internal timer */ ++ MemoryRegion *itc_tag; /* ITC Configuration Tags */ ++ target_ulong exception_base; /* ExceptionBase input to the core */ ++ struct { ++ uint64_t guest_addr; ++ } st; ++}; ++ ++/* ++ * CPU can't have 0xFFFFFFFF APIC ID, use that value to distinguish ++ * that ID hasn't been set yet ++ */ ++#define UNASSIGNED_CPU_ID 0xFFFFFFFF ++ ++/** ++ * LOONGARCHCPU: ++ * @env: #CPULOONGARCHState ++ * ++ * A LOONGARCH CPU. ++ */ ++struct LOONGARCHCPU { ++ /*< private >*/ ++ CPUState parent_obj; ++ /*< public >*/ ++ CPUNegativeOffsetState neg; ++ CPULOONGARCHState env; ++ int32_t id; ++ int hotplugged; ++ uint8_t online_vcpus; ++ uint8_t is_migrate; ++ uint64_t counter_value; ++ uint32_t cpu_freq; ++ uint32_t count_ctl; ++ uint64_t pending_exceptions; ++ uint64_t pending_exceptions_clr; ++ uint64_t core_ext_ioisr[4]; ++ VMChangeStateEntry *cpuStateEntry; ++ int32_t node_id; /* NUMA node this CPU belongs to */ ++ int32_t core_id; ++ struct kvm_msrs *kvm_csr_buf; ++ /* 'compatible' string for this CPU for Linux device trees */ ++ const char *dtb_compatible; ++}; ++ ++static inline LOONGARCHCPU *loongarch_env_get_cpu(CPULOONGARCHState *env) ++{ ++ return container_of(env, LOONGARCHCPU, env); ++} ++ ++#define ENV_GET_CPU(e) CPU(loongarch_env_get_cpu(e)) ++ ++#define ENV_OFFSET offsetof(LOONGARCHCPU, env) ++ ++void loongarch_cpu_list(void); ++ ++#define cpu_signal_handler cpu_loongarch_signal_handler ++#define cpu_list loongarch_cpu_list ++ ++/* ++ * MMU modes definitions. We carefully match the indices with our ++ * hflags layout. ++ */ ++#define MMU_MODE0_SUFFIX _kernel ++#define MMU_MODE1_SUFFIX _super ++#define MMU_MODE2_SUFFIX _user ++#define MMU_MODE3_SUFFIX _error ++#define MMU_USER_IDX 3 ++ ++static inline int hflags_mmu_index(uint32_t hflags) ++{ ++ return hflags & LARCH_HFLAG_KSU; ++} ++ ++static inline int cpu_mmu_index(CPULOONGARCHState *env, bool ifetch) ++{ ++ return hflags_mmu_index(env->hflags); ++} ++ ++#include "exec/cpu-all.h" ++ ++/* ++ * Memory access type : ++ * may be needed for precise access rights control and precise exceptions. ++ */ ++enum { ++ /* 1 bit to define user level / supervisor access */ ++ ACCESS_USER = 0x00, ++ ACCESS_SUPER = 0x01, ++ /* 1 bit to indicate direction */ ++ ACCESS_STORE = 0x02, ++ /* Type of instruction that generated the access */ ++ ACCESS_CODE = 0x10, /* Code fetch access */ ++ ACCESS_INT = 0x20, /* Integer load/store access */ ++ ACCESS_FLOAT = 0x30, /* floating point load/store access */ ++}; ++ ++/* Exceptions */ ++enum { ++ EXCP_NONE = -1, ++ EXCP_RESET = 0, ++ EXCP_SRESET, ++ EXCP_DINT, ++ EXCP_NMI, ++ EXCP_EXT_INTERRUPT, ++ EXCP_AdEL, ++ EXCP_AdES, ++ EXCP_TLBF, ++ EXCP_IBE, ++ EXCP_SYSCALL, ++ EXCP_BREAK, ++ EXCP_FPDIS, ++ EXCP_LSXDIS, ++ EXCP_LASXDIS, ++ EXCP_RI, ++ EXCP_OVERFLOW, ++ EXCP_TRAP, ++ EXCP_FPE, ++ EXCP_LTLBL, ++ EXCP_TLBL, ++ EXCP_TLBS, ++ EXCP_DBE, ++ EXCP_TLBXI, ++ EXCP_TLBRI, ++ EXCP_TLBPE, ++ EXCP_BTDIS, ++ ++ EXCP_LAST = EXCP_BTDIS, ++}; ++ ++/* ++ * This is an internally generated WAKE request line. ++ * It is driven by the CPU itself. Raised when the MT ++ * block wants to wake a VPE from an inactive state and ++ * cleared when VPE goes from active to inactive. ++ */ ++#define CPU_INTERRUPT_WAKE CPU_INTERRUPT_TGT_INT_0 ++ ++int cpu_loongarch_signal_handler(int host_signum, void *pinfo, void *puc); ++ ++#define LOONGARCH_CPU_TYPE_SUFFIX "-" TYPE_LOONGARCH_CPU ++#define LOONGARCH_CPU_TYPE_NAME(model) model LOONGARCH_CPU_TYPE_SUFFIX ++#define CPU_RESOLVING_TYPE TYPE_LOONGARCH_CPU ++ ++/* helper.c */ ++target_ulong exception_resume_pc(CPULOONGARCHState *env); ++ ++/* gdbstub.c */ ++void loongarch_cpu_register_gdb_regs_for_features(CPUState *cs); ++void mmu_init(CPULOONGARCHState *env, const loongarch_def_t *def); ++ ++static inline void cpu_get_tb_cpu_state(CPULOONGARCHState *env, ++ target_ulong *pc, ++ target_ulong *cs_base, uint32_t *flags) ++{ ++ *pc = env->active_tc.PC; ++ *cs_base = 0; ++ *flags = env->hflags & (LARCH_HFLAG_TMASK | LARCH_HFLAG_BMASK); ++} ++ ++static inline bool cpu_refill_state(CPULOONGARCHState *env) ++{ ++ return env->CSR_TLBRERA & 0x1; ++} ++ ++extern const char *const regnames[]; ++extern const char *const fregnames[]; ++#endif /* LOONGARCH_CPU_H */ +diff --git a/target/loongarch64/csr_helper.c b/target/loongarch64/csr_helper.c +new file mode 100644 +index 0000000000..093e7e54d8 +--- /dev/null ++++ b/target/loongarch64/csr_helper.c +@@ -0,0 +1,697 @@ ++/* ++ * loongarch tlb emulation helpers for qemu. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu/main-loop.h" ++#include "cpu.h" ++#include "internal.h" ++#include "qemu/host-utils.h" ++#include "exec/helper-proto.h" ++#include "exec/exec-all.h" ++#include "exec/cpu_ldst.h" ++#include "sysemu/kvm.h" ++#include "hw/irq.h" ++#include "cpu-csr.h" ++#include "instmap.h" ++ ++#ifndef CONFIG_USER_ONLY ++target_ulong helper_csr_rdq(CPULOONGARCHState *env, uint64_t csr) ++{ ++ int64_t v; ++ ++#define CASE_CSR_RDQ(csr) \ ++ case LOONGARCH_CSR_##csr: { \ ++ v = env->CSR_##csr; \ ++ break; \ ++ }; ++ ++ switch (csr) { ++ CASE_CSR_RDQ(CRMD) ++ CASE_CSR_RDQ(PRMD) ++ CASE_CSR_RDQ(EUEN) ++ CASE_CSR_RDQ(MISC) ++ CASE_CSR_RDQ(ECFG) ++ CASE_CSR_RDQ(ESTAT) ++ CASE_CSR_RDQ(ERA) ++ CASE_CSR_RDQ(BADV) ++ CASE_CSR_RDQ(BADI) ++ CASE_CSR_RDQ(EEPN) ++ CASE_CSR_RDQ(TLBIDX) ++ CASE_CSR_RDQ(TLBEHI) ++ CASE_CSR_RDQ(TLBELO0) ++ CASE_CSR_RDQ(TLBELO1) ++ CASE_CSR_RDQ(TLBWIRED) ++ CASE_CSR_RDQ(GTLBC) ++ CASE_CSR_RDQ(TRGP) ++ CASE_CSR_RDQ(ASID) ++ CASE_CSR_RDQ(PGDL) ++ CASE_CSR_RDQ(PGDH) ++ CASE_CSR_RDQ(PGD) ++ CASE_CSR_RDQ(PWCTL0) ++ CASE_CSR_RDQ(PWCTL1) ++ CASE_CSR_RDQ(STLBPGSIZE) ++ CASE_CSR_RDQ(RVACFG) ++ CASE_CSR_RDQ(CPUID) ++ CASE_CSR_RDQ(PRCFG1) ++ CASE_CSR_RDQ(PRCFG2) ++ CASE_CSR_RDQ(PRCFG3) ++ CASE_CSR_RDQ(KS0) ++ CASE_CSR_RDQ(KS1) ++ CASE_CSR_RDQ(KS2) ++ CASE_CSR_RDQ(KS3) ++ CASE_CSR_RDQ(KS4) ++ CASE_CSR_RDQ(KS5) ++ CASE_CSR_RDQ(KS6) ++ CASE_CSR_RDQ(KS7) ++ CASE_CSR_RDQ(KS8) ++ CASE_CSR_RDQ(TMID) ++ CASE_CSR_RDQ(TCFG) ++ case LOONGARCH_CSR_TVAL: ++ v = cpu_loongarch_get_stable_timer_ticks(env); ++ break; ++ CASE_CSR_RDQ(CNTC) ++ CASE_CSR_RDQ(TINTCLR) ++ CASE_CSR_RDQ(GSTAT) ++ CASE_CSR_RDQ(GCFG) ++ CASE_CSR_RDQ(GINTC) ++ CASE_CSR_RDQ(GCNTC) ++ CASE_CSR_RDQ(LLBCTL) ++ CASE_CSR_RDQ(IMPCTL1) ++ CASE_CSR_RDQ(IMPCTL2) ++ CASE_CSR_RDQ(GNMI) ++ CASE_CSR_RDQ(TLBRENT) ++ CASE_CSR_RDQ(TLBRBADV) ++ CASE_CSR_RDQ(TLBRERA) ++ CASE_CSR_RDQ(TLBRSAVE) ++ CASE_CSR_RDQ(TLBRELO0) ++ CASE_CSR_RDQ(TLBRELO1) ++ CASE_CSR_RDQ(TLBREHI) ++ CASE_CSR_RDQ(TLBRPRMD) ++ CASE_CSR_RDQ(ERRCTL) ++ CASE_CSR_RDQ(ERRINFO) ++ CASE_CSR_RDQ(ERRINFO1) ++ CASE_CSR_RDQ(ERRENT) ++ CASE_CSR_RDQ(ERRERA) ++ CASE_CSR_RDQ(ERRSAVE) ++ CASE_CSR_RDQ(CTAG) ++ CASE_CSR_RDQ(DMWIN0) ++ CASE_CSR_RDQ(DMWIN1) ++ CASE_CSR_RDQ(DMWIN2) ++ CASE_CSR_RDQ(DMWIN3) ++ CASE_CSR_RDQ(PERFCTRL0) ++ CASE_CSR_RDQ(PERFCNTR0) ++ CASE_CSR_RDQ(PERFCTRL1) ++ CASE_CSR_RDQ(PERFCNTR1) ++ CASE_CSR_RDQ(PERFCTRL2) ++ CASE_CSR_RDQ(PERFCNTR2) ++ CASE_CSR_RDQ(PERFCTRL3) ++ CASE_CSR_RDQ(PERFCNTR3) ++ /* debug */ ++ CASE_CSR_RDQ(MWPC) ++ CASE_CSR_RDQ(MWPS) ++ CASE_CSR_RDQ(DB0ADDR) ++ CASE_CSR_RDQ(DB0MASK) ++ CASE_CSR_RDQ(DB0CTL) ++ CASE_CSR_RDQ(DB0ASID) ++ CASE_CSR_RDQ(DB1ADDR) ++ CASE_CSR_RDQ(DB1MASK) ++ CASE_CSR_RDQ(DB1CTL) ++ CASE_CSR_RDQ(DB1ASID) ++ CASE_CSR_RDQ(DB2ADDR) ++ CASE_CSR_RDQ(DB2MASK) ++ CASE_CSR_RDQ(DB2CTL) ++ CASE_CSR_RDQ(DB2ASID) ++ CASE_CSR_RDQ(DB3ADDR) ++ CASE_CSR_RDQ(DB3MASK) ++ CASE_CSR_RDQ(DB3CTL) ++ CASE_CSR_RDQ(DB3ASID) ++ CASE_CSR_RDQ(FWPC) ++ CASE_CSR_RDQ(FWPS) ++ CASE_CSR_RDQ(IB0ADDR) ++ CASE_CSR_RDQ(IB0MASK) ++ CASE_CSR_RDQ(IB0CTL) ++ CASE_CSR_RDQ(IB0ASID) ++ CASE_CSR_RDQ(IB1ADDR) ++ CASE_CSR_RDQ(IB1MASK) ++ CASE_CSR_RDQ(IB1CTL) ++ CASE_CSR_RDQ(IB1ASID) ++ CASE_CSR_RDQ(IB2ADDR) ++ CASE_CSR_RDQ(IB2MASK) ++ CASE_CSR_RDQ(IB2CTL) ++ CASE_CSR_RDQ(IB2ASID) ++ CASE_CSR_RDQ(IB3ADDR) ++ CASE_CSR_RDQ(IB3MASK) ++ CASE_CSR_RDQ(IB3CTL) ++ CASE_CSR_RDQ(IB3ASID) ++ CASE_CSR_RDQ(IB4ADDR) ++ CASE_CSR_RDQ(IB4MASK) ++ CASE_CSR_RDQ(IB4CTL) ++ CASE_CSR_RDQ(IB4ASID) ++ CASE_CSR_RDQ(IB5ADDR) ++ CASE_CSR_RDQ(IB5MASK) ++ CASE_CSR_RDQ(IB5CTL) ++ CASE_CSR_RDQ(IB5ASID) ++ CASE_CSR_RDQ(IB6ADDR) ++ CASE_CSR_RDQ(IB6MASK) ++ CASE_CSR_RDQ(IB6CTL) ++ CASE_CSR_RDQ(IB6ASID) ++ CASE_CSR_RDQ(IB7ADDR) ++ CASE_CSR_RDQ(IB7MASK) ++ CASE_CSR_RDQ(IB7CTL) ++ CASE_CSR_RDQ(IB7ASID) ++ CASE_CSR_RDQ(DEBUG) ++ CASE_CSR_RDQ(DERA) ++ CASE_CSR_RDQ(DESAVE) ++ default : ++ assert(0); ++ } ++ ++#undef CASE_CSR_RDQ ++ compute_hflags(env); ++ return v; ++} ++ ++target_ulong helper_csr_wrq(CPULOONGARCHState *env, target_ulong val, ++ uint64_t csr) ++{ ++ int64_t old_v, v; ++ old_v = -1; ++ v = val; ++ ++#define CASE_CSR_WRQ(csr) \ ++ case LOONGARCH_CSR_##csr: { \ ++ old_v = env->CSR_##csr; \ ++ env->CSR_##csr = v; \ ++ break; \ ++ }; ++ ++ switch (csr) { ++ CASE_CSR_WRQ(CRMD) ++ CASE_CSR_WRQ(PRMD) ++ CASE_CSR_WRQ(EUEN) ++ CASE_CSR_WRQ(MISC) ++ CASE_CSR_WRQ(ECFG) ++ CASE_CSR_WRQ(ESTAT) ++ CASE_CSR_WRQ(ERA) ++ CASE_CSR_WRQ(BADV) ++ CASE_CSR_WRQ(BADI) ++ CASE_CSR_WRQ(EEPN) ++ CASE_CSR_WRQ(TLBIDX) ++ CASE_CSR_WRQ(TLBEHI) ++ CASE_CSR_WRQ(TLBELO0) ++ CASE_CSR_WRQ(TLBELO1) ++ CASE_CSR_WRQ(TLBWIRED) ++ CASE_CSR_WRQ(GTLBC) ++ CASE_CSR_WRQ(TRGP) ++ CASE_CSR_WRQ(ASID) ++ CASE_CSR_WRQ(PGDL) ++ CASE_CSR_WRQ(PGDH) ++ CASE_CSR_WRQ(PGD) ++ CASE_CSR_WRQ(PWCTL0) ++ CASE_CSR_WRQ(PWCTL1) ++ CASE_CSR_WRQ(STLBPGSIZE) ++ CASE_CSR_WRQ(RVACFG) ++ CASE_CSR_WRQ(CPUID) ++ CASE_CSR_WRQ(PRCFG1) ++ CASE_CSR_WRQ(PRCFG2) ++ CASE_CSR_WRQ(PRCFG3) ++ CASE_CSR_WRQ(KS0) ++ CASE_CSR_WRQ(KS1) ++ CASE_CSR_WRQ(KS2) ++ CASE_CSR_WRQ(KS3) ++ CASE_CSR_WRQ(KS4) ++ CASE_CSR_WRQ(KS5) ++ CASE_CSR_WRQ(KS6) ++ CASE_CSR_WRQ(KS7) ++ CASE_CSR_WRQ(KS8) ++ CASE_CSR_WRQ(TMID) ++ case LOONGARCH_CSR_TCFG: ++ old_v = env->CSR_TCFG; ++ cpu_loongarch_store_stable_timer_config(env, v); ++ break; ++ CASE_CSR_WRQ(TVAL) ++ CASE_CSR_WRQ(CNTC) ++ case LOONGARCH_CSR_TINTCLR: ++ old_v = 0; ++ qemu_irq_lower(env->irq[IRQ_TIMER]); ++ break; ++ CASE_CSR_WRQ(GSTAT) ++ CASE_CSR_WRQ(GCFG) ++ CASE_CSR_WRQ(GINTC) ++ CASE_CSR_WRQ(GCNTC) ++ CASE_CSR_WRQ(LLBCTL) ++ CASE_CSR_WRQ(IMPCTL1) ++ case LOONGARCH_CSR_IMPCTL2: ++ if (v & CSR_IMPCTL2_MTLB) { ++ ls3a5k_flush_vtlb(env); ++ } ++ if (v & CSR_IMPCTL2_STLB) { ++ ls3a5k_flush_ftlb(env); ++ } ++ break; ++ CASE_CSR_WRQ(GNMI) ++ CASE_CSR_WRQ(TLBRENT) ++ CASE_CSR_WRQ(TLBRBADV) ++ CASE_CSR_WRQ(TLBRERA) ++ CASE_CSR_WRQ(TLBRSAVE) ++ CASE_CSR_WRQ(TLBRELO0) ++ CASE_CSR_WRQ(TLBRELO1) ++ CASE_CSR_WRQ(TLBREHI) ++ CASE_CSR_WRQ(TLBRPRMD) ++ CASE_CSR_WRQ(ERRCTL) ++ CASE_CSR_WRQ(ERRINFO) ++ CASE_CSR_WRQ(ERRINFO1) ++ CASE_CSR_WRQ(ERRENT) ++ CASE_CSR_WRQ(ERRERA) ++ CASE_CSR_WRQ(ERRSAVE) ++ CASE_CSR_WRQ(CTAG) ++ CASE_CSR_WRQ(DMWIN0) ++ CASE_CSR_WRQ(DMWIN1) ++ CASE_CSR_WRQ(DMWIN2) ++ CASE_CSR_WRQ(DMWIN3) ++ CASE_CSR_WRQ(PERFCTRL0) ++ CASE_CSR_WRQ(PERFCNTR0) ++ CASE_CSR_WRQ(PERFCTRL1) ++ CASE_CSR_WRQ(PERFCNTR1) ++ CASE_CSR_WRQ(PERFCTRL2) ++ CASE_CSR_WRQ(PERFCNTR2) ++ CASE_CSR_WRQ(PERFCTRL3) ++ CASE_CSR_WRQ(PERFCNTR3) ++ /* debug */ ++ CASE_CSR_WRQ(MWPC) ++ CASE_CSR_WRQ(MWPS) ++ CASE_CSR_WRQ(DB0ADDR) ++ CASE_CSR_WRQ(DB0MASK) ++ CASE_CSR_WRQ(DB0CTL) ++ CASE_CSR_WRQ(DB0ASID) ++ CASE_CSR_WRQ(DB1ADDR) ++ CASE_CSR_WRQ(DB1MASK) ++ CASE_CSR_WRQ(DB1CTL) ++ CASE_CSR_WRQ(DB1ASID) ++ CASE_CSR_WRQ(DB2ADDR) ++ CASE_CSR_WRQ(DB2MASK) ++ CASE_CSR_WRQ(DB2CTL) ++ CASE_CSR_WRQ(DB2ASID) ++ CASE_CSR_WRQ(DB3ADDR) ++ CASE_CSR_WRQ(DB3MASK) ++ CASE_CSR_WRQ(DB3CTL) ++ CASE_CSR_WRQ(DB3ASID) ++ CASE_CSR_WRQ(FWPC) ++ CASE_CSR_WRQ(FWPS) ++ CASE_CSR_WRQ(IB0ADDR) ++ CASE_CSR_WRQ(IB0MASK) ++ CASE_CSR_WRQ(IB0CTL) ++ CASE_CSR_WRQ(IB0ASID) ++ CASE_CSR_WRQ(IB1ADDR) ++ CASE_CSR_WRQ(IB1MASK) ++ CASE_CSR_WRQ(IB1CTL) ++ CASE_CSR_WRQ(IB1ASID) ++ CASE_CSR_WRQ(IB2ADDR) ++ CASE_CSR_WRQ(IB2MASK) ++ CASE_CSR_WRQ(IB2CTL) ++ CASE_CSR_WRQ(IB2ASID) ++ CASE_CSR_WRQ(IB3ADDR) ++ CASE_CSR_WRQ(IB3MASK) ++ CASE_CSR_WRQ(IB3CTL) ++ CASE_CSR_WRQ(IB3ASID) ++ CASE_CSR_WRQ(IB4ADDR) ++ CASE_CSR_WRQ(IB4MASK) ++ CASE_CSR_WRQ(IB4CTL) ++ CASE_CSR_WRQ(IB4ASID) ++ CASE_CSR_WRQ(IB5ADDR) ++ CASE_CSR_WRQ(IB5MASK) ++ CASE_CSR_WRQ(IB5CTL) ++ CASE_CSR_WRQ(IB5ASID) ++ CASE_CSR_WRQ(IB6ADDR) ++ CASE_CSR_WRQ(IB6MASK) ++ CASE_CSR_WRQ(IB6CTL) ++ CASE_CSR_WRQ(IB6ASID) ++ CASE_CSR_WRQ(IB7ADDR) ++ CASE_CSR_WRQ(IB7MASK) ++ CASE_CSR_WRQ(IB7CTL) ++ CASE_CSR_WRQ(IB7ASID) ++ CASE_CSR_WRQ(DEBUG) ++ CASE_CSR_WRQ(DERA) ++ CASE_CSR_WRQ(DESAVE) ++ default : ++ assert(0); ++ } ++ ++ if (csr == LOONGARCH_CSR_ASID) { ++ if (old_v != v) { ++ tlb_flush(CPU(loongarch_env_get_cpu(env))); ++ } ++ } ++ ++#undef CASE_CSR_WRQ ++ compute_hflags(env); ++ return old_v; ++} ++ ++target_ulong helper_csr_xchgq(CPULOONGARCHState *env, target_ulong val, ++ target_ulong mask, uint64_t csr) ++{ ++ target_ulong v, tmp; ++ v = val & mask; ++ ++#define CASE_CSR_XCHGQ(csr) \ ++ case LOONGARCH_CSR_##csr: { \ ++ val = env->CSR_##csr; \ ++ env->CSR_##csr = (env->CSR_##csr) & (~mask); \ ++ env->CSR_##csr = (env->CSR_##csr) | v; \ ++ break; \ ++ }; ++ ++ switch (csr) { ++ CASE_CSR_XCHGQ(CRMD) ++ CASE_CSR_XCHGQ(PRMD) ++ CASE_CSR_XCHGQ(EUEN) ++ CASE_CSR_XCHGQ(MISC) ++ CASE_CSR_XCHGQ(ECFG) ++ case LOONGARCH_CSR_ESTAT: ++ val = env->CSR_ESTAT; ++ qatomic_and(&env->CSR_ESTAT, ~mask); ++ qatomic_or(&env->CSR_ESTAT, v); ++ break; ++ CASE_CSR_XCHGQ(ERA) ++ CASE_CSR_XCHGQ(BADV) ++ CASE_CSR_XCHGQ(BADI) ++ CASE_CSR_XCHGQ(EEPN) ++ CASE_CSR_XCHGQ(TLBIDX) ++ CASE_CSR_XCHGQ(TLBEHI) ++ CASE_CSR_XCHGQ(TLBELO0) ++ CASE_CSR_XCHGQ(TLBELO1) ++ CASE_CSR_XCHGQ(TLBWIRED) ++ CASE_CSR_XCHGQ(GTLBC) ++ CASE_CSR_XCHGQ(TRGP) ++ CASE_CSR_XCHGQ(ASID) ++ CASE_CSR_XCHGQ(PGDL) ++ CASE_CSR_XCHGQ(PGDH) ++ CASE_CSR_XCHGQ(PGD) ++ CASE_CSR_XCHGQ(PWCTL0) ++ CASE_CSR_XCHGQ(PWCTL1) ++ CASE_CSR_XCHGQ(STLBPGSIZE) ++ CASE_CSR_XCHGQ(RVACFG) ++ CASE_CSR_XCHGQ(CPUID) ++ CASE_CSR_XCHGQ(PRCFG1) ++ CASE_CSR_XCHGQ(PRCFG2) ++ CASE_CSR_XCHGQ(PRCFG3) ++ CASE_CSR_XCHGQ(KS0) ++ CASE_CSR_XCHGQ(KS1) ++ CASE_CSR_XCHGQ(KS2) ++ CASE_CSR_XCHGQ(KS3) ++ CASE_CSR_XCHGQ(KS4) ++ CASE_CSR_XCHGQ(KS5) ++ CASE_CSR_XCHGQ(KS6) ++ CASE_CSR_XCHGQ(KS7) ++ CASE_CSR_XCHGQ(KS8) ++ CASE_CSR_XCHGQ(TMID) ++ case LOONGARCH_CSR_TCFG: ++ val = env->CSR_TCFG; ++ tmp = val & ~mask; ++ tmp |= v; ++ cpu_loongarch_store_stable_timer_config(env, tmp); ++ break; ++ CASE_CSR_XCHGQ(TVAL) ++ CASE_CSR_XCHGQ(CNTC) ++ CASE_CSR_XCHGQ(TINTCLR) ++ CASE_CSR_XCHGQ(GSTAT) ++ CASE_CSR_XCHGQ(GCFG) ++ CASE_CSR_XCHGQ(GINTC) ++ CASE_CSR_XCHGQ(GCNTC) ++ CASE_CSR_XCHGQ(LLBCTL) ++ CASE_CSR_XCHGQ(IMPCTL1) ++ CASE_CSR_XCHGQ(IMPCTL2) ++ CASE_CSR_XCHGQ(GNMI) ++ CASE_CSR_XCHGQ(TLBRENT) ++ CASE_CSR_XCHGQ(TLBRBADV) ++ CASE_CSR_XCHGQ(TLBRERA) ++ CASE_CSR_XCHGQ(TLBRSAVE) ++ CASE_CSR_XCHGQ(TLBRELO0) ++ CASE_CSR_XCHGQ(TLBRELO1) ++ CASE_CSR_XCHGQ(TLBREHI) ++ CASE_CSR_XCHGQ(TLBRPRMD) ++ CASE_CSR_XCHGQ(ERRCTL) ++ CASE_CSR_XCHGQ(ERRINFO) ++ CASE_CSR_XCHGQ(ERRINFO1) ++ CASE_CSR_XCHGQ(ERRENT) ++ CASE_CSR_XCHGQ(ERRERA) ++ CASE_CSR_XCHGQ(ERRSAVE) ++ CASE_CSR_XCHGQ(CTAG) ++ CASE_CSR_XCHGQ(DMWIN0) ++ CASE_CSR_XCHGQ(DMWIN1) ++ CASE_CSR_XCHGQ(DMWIN2) ++ CASE_CSR_XCHGQ(DMWIN3) ++ CASE_CSR_XCHGQ(PERFCTRL0) ++ CASE_CSR_XCHGQ(PERFCNTR0) ++ CASE_CSR_XCHGQ(PERFCTRL1) ++ CASE_CSR_XCHGQ(PERFCNTR1) ++ CASE_CSR_XCHGQ(PERFCTRL2) ++ CASE_CSR_XCHGQ(PERFCNTR2) ++ CASE_CSR_XCHGQ(PERFCTRL3) ++ CASE_CSR_XCHGQ(PERFCNTR3) ++ /* debug */ ++ CASE_CSR_XCHGQ(MWPC) ++ CASE_CSR_XCHGQ(MWPS) ++ CASE_CSR_XCHGQ(DB0ADDR) ++ CASE_CSR_XCHGQ(DB0MASK) ++ CASE_CSR_XCHGQ(DB0CTL) ++ CASE_CSR_XCHGQ(DB0ASID) ++ CASE_CSR_XCHGQ(DB1ADDR) ++ CASE_CSR_XCHGQ(DB1MASK) ++ CASE_CSR_XCHGQ(DB1CTL) ++ CASE_CSR_XCHGQ(DB1ASID) ++ CASE_CSR_XCHGQ(DB2ADDR) ++ CASE_CSR_XCHGQ(DB2MASK) ++ CASE_CSR_XCHGQ(DB2CTL) ++ CASE_CSR_XCHGQ(DB2ASID) ++ CASE_CSR_XCHGQ(DB3ADDR) ++ CASE_CSR_XCHGQ(DB3MASK) ++ CASE_CSR_XCHGQ(DB3CTL) ++ CASE_CSR_XCHGQ(DB3ASID) ++ CASE_CSR_XCHGQ(FWPC) ++ CASE_CSR_XCHGQ(FWPS) ++ CASE_CSR_XCHGQ(IB0ADDR) ++ CASE_CSR_XCHGQ(IB0MASK) ++ CASE_CSR_XCHGQ(IB0CTL) ++ CASE_CSR_XCHGQ(IB0ASID) ++ CASE_CSR_XCHGQ(IB1ADDR) ++ CASE_CSR_XCHGQ(IB1MASK) ++ CASE_CSR_XCHGQ(IB1CTL) ++ CASE_CSR_XCHGQ(IB1ASID) ++ CASE_CSR_XCHGQ(IB2ADDR) ++ CASE_CSR_XCHGQ(IB2MASK) ++ CASE_CSR_XCHGQ(IB2CTL) ++ CASE_CSR_XCHGQ(IB2ASID) ++ CASE_CSR_XCHGQ(IB3ADDR) ++ CASE_CSR_XCHGQ(IB3MASK) ++ CASE_CSR_XCHGQ(IB3CTL) ++ CASE_CSR_XCHGQ(IB3ASID) ++ CASE_CSR_XCHGQ(IB4ADDR) ++ CASE_CSR_XCHGQ(IB4MASK) ++ CASE_CSR_XCHGQ(IB4CTL) ++ CASE_CSR_XCHGQ(IB4ASID) ++ CASE_CSR_XCHGQ(IB5ADDR) ++ CASE_CSR_XCHGQ(IB5MASK) ++ CASE_CSR_XCHGQ(IB5CTL) ++ CASE_CSR_XCHGQ(IB5ASID) ++ CASE_CSR_XCHGQ(IB6ADDR) ++ CASE_CSR_XCHGQ(IB6MASK) ++ CASE_CSR_XCHGQ(IB6CTL) ++ CASE_CSR_XCHGQ(IB6ASID) ++ CASE_CSR_XCHGQ(IB7ADDR) ++ CASE_CSR_XCHGQ(IB7MASK) ++ CASE_CSR_XCHGQ(IB7CTL) ++ CASE_CSR_XCHGQ(IB7ASID) ++ CASE_CSR_XCHGQ(DEBUG) ++ CASE_CSR_XCHGQ(DERA) ++ CASE_CSR_XCHGQ(DESAVE) ++ default : ++ assert(0); ++ } ++ ++#undef CASE_CSR_XCHGQ ++ compute_hflags(env); ++ return val; ++} ++ ++static target_ulong confbus_addr(CPULOONGARCHState *env, int cpuid, ++ target_ulong csr_addr) ++{ ++ target_ulong addr; ++ target_ulong node_addr; ++ int cores_per_node = ((0x60018 >> 3) & 0xff) + 1; ++ ++ switch (cores_per_node) { ++ case 4: ++ assert(cpuid < 64); ++ node_addr = ((target_ulong)(cpuid & 0x3c) << 42); ++ break; ++ case 8: ++ assert(cpuid < 128); ++ node_addr = ((target_ulong)(cpuid & 0x78) << 41) + ++ ((target_ulong)(cpuid & 0x4) << 14); ++ break; ++ case 16: ++ assert(cpuid < 256); ++ node_addr = ((target_ulong)(cpuid & 0xf0) << 40) + ++ ((target_ulong)(cpuid & 0xc) << 14); ++ break; ++ default: ++ assert(0); ++ break; ++ } ++ ++ /* ++ * per core address ++ *0x10xx => ipi ++ * 0x18xx => extioi isr ++ */ ++ if (((csr_addr & 0xff00) == 0x1000)) { ++ addr = (csr_addr & 0xff) + (target_ulong)(cpuid << 8); ++ addr = 0x800000001f000000UL + addr; ++ return addr; ++ } else if ((csr_addr & 0xff00) == 0x1800) { ++ addr = (csr_addr & 0xff) + ((target_ulong)(cpuid << 8)); ++ addr = 0x800000001f020000UL + addr; ++ return addr; ++ } else if ((csr_addr & 0xff00) >= 0x1400 && (csr_addr & 0xff00) < 0x1d00) { ++ addr = 0x800000001f010000UL + ((csr_addr & 0xfff) - 0x400); ++ return addr; ++ } else if (csr_addr == 0x408) { ++ addr = csr_addr; ++ } else { ++ addr = csr_addr + node_addr; ++ } ++ ++ addr = 0x800000001fe00000UL + addr; ++ return addr; ++} ++ ++void helper_iocsr(CPULOONGARCHState *env, target_ulong r_addr, ++ target_ulong r_val, uint32_t op) ++{ ++ target_ulong addr; ++ target_ulong val = env->active_tc.gpr[r_val]; ++ int mask; ++ ++ addr = confbus_addr(env, CPU(loongarch_env_get_cpu(env))->cpu_index, ++ env->active_tc.gpr[r_addr]); ++ ++ switch (env->active_tc.gpr[r_addr]) { ++ /* IPI send */ ++ case 0x1040: ++ if (op != OPC_LARCH_ST_W) { ++ return; ++ } ++ op = OPC_LARCH_ST_W; ++ break; ++ ++ /* Mail send */ ++ case 0x1048: ++ if (op != OPC_LARCH_ST_D) { ++ return; ++ } ++ op = OPC_LARCH_ST_D; ++ break; ++ ++ /* ANY send */ ++ case 0x1158: ++ if (op != OPC_LARCH_ST_D) { ++ return; ++ } ++ addr = confbus_addr(env, (val >> 16) & 0x3ff, val & 0xffff); ++ mask = (val >> 27) & 0xf; ++ val = (val >> 32); ++ switch (mask) { ++ case 0: ++ op = OPC_LARCH_ST_W; ++ break; ++ case 0x7: ++ op = OPC_LARCH_ST_B; ++ addr += 3; ++ val >>= 24; ++ break; ++ case 0xb: ++ op = OPC_LARCH_ST_B; ++ addr += 2; ++ val >>= 16; ++ break; ++ case 0xd: ++ op = OPC_LARCH_ST_B; ++ addr += 1; ++ val >>= 8; ++ break; ++ case 0xe: ++ op = OPC_LARCH_ST_B; ++ break; ++ case 0xc: ++ op = OPC_LARCH_ST_H; ++ break; ++ case 0x3: ++ op = OPC_LARCH_ST_H; ++ addr += 2; ++ val >>= 16; ++ break; ++ default: ++ qemu_log("Unsupported any_send mask0x%x\n", mask); ++ break; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ ++ switch (op) { ++ case OPC_LARCH_LD_D: ++ env->active_tc.gpr[r_val] = cpu_ldq_data_ra(env, addr, GETPC()); ++ break; ++ case OPC_LARCH_LD_W: ++ env->active_tc.gpr[r_val] = cpu_ldl_data_ra(env, addr, GETPC()); ++ break; ++ case OPC_LARCH_LD_H: ++ assert(0); ++ break; ++ case OPC_LARCH_LD_B: ++ assert(0); ++ break; ++ case OPC_LARCH_ST_D: ++ cpu_stq_data_ra(env, addr, val, GETPC()); ++ break; ++ case OPC_LARCH_ST_W: ++ cpu_stl_data_ra(env, addr, val, GETPC()); ++ break; ++ case OPC_LARCH_ST_H: ++ cpu_stb_data_ra(env, addr, val, GETPC()); ++ break; ++ case OPC_LARCH_ST_B: ++ cpu_stb_data_ra(env, addr, val, GETPC()); ++ break; ++ default: ++ qemu_log("Unknown op 0x%x", op); ++ assert(0); ++ } ++} ++#endif ++ ++target_ulong helper_cpucfg(CPULOONGARCHState *env, target_ulong rj) ++{ ++ return 0; ++} +diff --git a/target/loongarch64/fpu.c b/target/loongarch64/fpu.c +new file mode 100644 +index 0000000000..f063c8bae0 +--- /dev/null ++++ b/target/loongarch64/fpu.c +@@ -0,0 +1,25 @@ ++/* ++ * loongarch float point emulation helpers for qemu. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "fpu/softfloat.h" ++ ++/* convert loongarch rounding mode in fcsr0 to IEEE library */ ++unsigned int ieee_rm[] = { float_round_nearest_even, float_round_to_zero, ++ float_round_up, float_round_down }; +diff --git a/target/loongarch64/fpu_helper.c b/target/loongarch64/fpu_helper.c +new file mode 100644 +index 0000000000..033bf0de84 +--- /dev/null ++++ b/target/loongarch64/fpu_helper.c +@@ -0,0 +1,891 @@ ++/* ++ * loongarch float point emulation helpers for qemu. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "cpu.h" ++#include "internal.h" ++#include "qemu/host-utils.h" ++#include "exec/helper-proto.h" ++#include "exec/exec-all.h" ++#include "fpu/softfloat.h" ++ ++#define FP_TO_INT32_OVERFLOW 0x7fffffff ++#define FP_TO_INT64_OVERFLOW 0x7fffffffffffffffULL ++ ++#define FLOAT_CLASS_SIGNALING_NAN 0x001 ++#define FLOAT_CLASS_QUIET_NAN 0x002 ++#define FLOAT_CLASS_NEGATIVE_INFINITY 0x004 ++#define FLOAT_CLASS_NEGATIVE_NORMAL 0x008 ++#define FLOAT_CLASS_NEGATIVE_SUBNORMAL 0x010 ++#define FLOAT_CLASS_NEGATIVE_ZERO 0x020 ++#define FLOAT_CLASS_POSITIVE_INFINITY 0x040 ++#define FLOAT_CLASS_POSITIVE_NORMAL 0x080 ++#define FLOAT_CLASS_POSITIVE_SUBNORMAL 0x100 ++#define FLOAT_CLASS_POSITIVE_ZERO 0x200 ++ ++target_ulong helper_movfcsr2gr(CPULOONGARCHState *env, uint32_t reg) ++{ ++ target_ulong r = 0; ++ ++ switch (reg) { ++ case 0: ++ r = (uint32_t)env->active_fpu.fcsr0; ++ break; ++ case 1: ++ r = (env->active_fpu.fcsr0 & FCSR0_M1); ++ break; ++ case 2: ++ r = (env->active_fpu.fcsr0 & FCSR0_M2); ++ break; ++ case 3: ++ r = (env->active_fpu.fcsr0 & FCSR0_M3); ++ break; ++ case 16: ++ r = (uint32_t)env->active_fpu.vcsr16; ++ break; ++ default: ++ printf("%s: warning, fcsr '%d' not supported\n", __func__, reg); ++ assert(0); ++ break; ++ } ++ ++ return r; ++} ++ ++void helper_movgr2fcsr(CPULOONGARCHState *env, target_ulong arg1, ++ uint32_t fcsr, uint32_t rj) ++{ ++ switch (fcsr) { ++ case 0: ++ env->active_fpu.fcsr0 = arg1; ++ break; ++ case 1: ++ env->active_fpu.fcsr0 = ++ (arg1 & FCSR0_M1) | (env->active_fpu.fcsr0 & ~FCSR0_M1); ++ break; ++ case 2: ++ env->active_fpu.fcsr0 = ++ (arg1 & FCSR0_M2) | (env->active_fpu.fcsr0 & ~FCSR0_M2); ++ break; ++ case 3: ++ env->active_fpu.fcsr0 = ++ (arg1 & FCSR0_M3) | (env->active_fpu.fcsr0 & ~FCSR0_M3); ++ break; ++ case 16: ++ env->active_fpu.vcsr16 = arg1; ++ break; ++ default: ++ printf("%s: warning, fcsr '%d' not supported\n", __func__, fcsr); ++ assert(0); ++ break; ++ } ++ restore_fp_status(env); ++ set_float_exception_flags(0, &env->active_fpu.fp_status); ++} ++ ++void helper_movreg2cf(CPULOONGARCHState *env, uint32_t cd, target_ulong src) ++{ ++ env->active_fpu.cf[cd & 0x7] = src & 0x1; ++} ++ ++void helper_movreg2cf_i32(CPULOONGARCHState *env, uint32_t cd, uint32_t src) ++{ ++ env->active_fpu.cf[cd & 0x7] = src & 0x1; ++} ++ ++void helper_movreg2cf_i64(CPULOONGARCHState *env, uint32_t cd, uint64_t src) ++{ ++ env->active_fpu.cf[cd & 0x7] = src & 0x1; ++} ++ ++target_ulong helper_movcf2reg(CPULOONGARCHState *env, uint32_t cj) ++{ ++ return (target_ulong)env->active_fpu.cf[cj & 0x7]; ++} ++ ++int ieee_ex_to_loongarch(int xcpt) ++{ ++ int ret = 0; ++ if (xcpt) { ++ if (xcpt & float_flag_invalid) { ++ ret |= FP_INVALID; ++ } ++ if (xcpt & float_flag_overflow) { ++ ret |= FP_OVERFLOW; ++ } ++ if (xcpt & float_flag_underflow) { ++ ret |= FP_UNDERFLOW; ++ } ++ if (xcpt & float_flag_divbyzero) { ++ ret |= FP_DIV0; ++ } ++ if (xcpt & float_flag_inexact) { ++ ret |= FP_INEXACT; ++ } ++ } ++ return ret; ++} ++ ++static inline void update_fcsr0(CPULOONGARCHState *env, uintptr_t pc) ++{ ++ int tmp = ieee_ex_to_loongarch( ++ get_float_exception_flags(&env->active_fpu.fp_status)); ++ ++ SET_FP_CAUSE(env->active_fpu.fcsr0, tmp); ++ if (tmp) { ++ set_float_exception_flags(0, &env->active_fpu.fp_status); ++ ++ if (GET_FP_ENABLE(env->active_fpu.fcsr0) & tmp) { ++ do_raise_exception(env, EXCP_FPE, pc); ++ } else { ++ UPDATE_FP_FLAGS(env->active_fpu.fcsr0, tmp); ++ } ++ } ++} ++ ++/* unary operations, modifying fp status */ ++uint64_t helper_float_sqrt_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ fdt0 = float64_sqrt(fdt0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fdt0; ++} ++ ++uint32_t helper_float_sqrt_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ fst0 = float32_sqrt(fst0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fst0; ++} ++ ++uint64_t helper_float_cvtd_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint64_t fdt2; ++ ++ fdt2 = float32_to_float64(fst0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fdt2; ++} ++ ++uint64_t helper_float_cvtd_w(CPULOONGARCHState *env, uint32_t wt0) ++{ ++ uint64_t fdt2; ++ ++ fdt2 = int32_to_float64(wt0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fdt2; ++} ++ ++uint64_t helper_float_cvtd_l(CPULOONGARCHState *env, uint64_t dt0) ++{ ++ uint64_t fdt2; ++ ++ fdt2 = int64_to_float64(dt0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fdt2; ++} ++ ++uint64_t helper_float_cvt_l_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint64_t dt2; ++ ++ dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint64_t helper_float_cvt_l_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint64_t dt2; ++ ++ dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint32_t helper_float_cvts_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint32_t fst2; ++ ++ fst2 = float64_to_float32(fdt0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fst2; ++} ++ ++uint32_t helper_float_cvts_w(CPULOONGARCHState *env, uint32_t wt0) ++{ ++ uint32_t fst2; ++ ++ fst2 = int32_to_float32(wt0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fst2; ++} ++ ++uint32_t helper_float_cvts_l(CPULOONGARCHState *env, uint64_t dt0) ++{ ++ uint32_t fst2; ++ ++ fst2 = int64_to_float32(dt0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fst2; ++} ++ ++uint32_t helper_float_cvt_w_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint32_t wt2; ++ ++ wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint32_t helper_float_cvt_w_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint32_t wt2; ++ ++ wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint64_t helper_float_round_l_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint64_t dt2; ++ ++ set_float_rounding_mode(float_round_nearest_even, ++ &env->active_fpu.fp_status); ++ dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint64_t helper_float_round_l_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint64_t dt2; ++ ++ set_float_rounding_mode(float_round_nearest_even, ++ &env->active_fpu.fp_status); ++ dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint32_t helper_float_round_w_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint32_t wt2; ++ ++ set_float_rounding_mode(float_round_nearest_even, ++ &env->active_fpu.fp_status); ++ wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint32_t helper_float_round_w_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint32_t wt2; ++ ++ set_float_rounding_mode(float_round_nearest_even, ++ &env->active_fpu.fp_status); ++ wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint64_t helper_float_trunc_l_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint64_t dt2; ++ ++ dt2 = float64_to_int64_round_to_zero(fdt0, &env->active_fpu.fp_status); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint64_t helper_float_trunc_l_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint64_t dt2; ++ ++ dt2 = float32_to_int64_round_to_zero(fst0, &env->active_fpu.fp_status); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint32_t helper_float_trunc_w_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint32_t wt2; ++ ++ wt2 = float64_to_int32_round_to_zero(fdt0, &env->active_fpu.fp_status); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint32_t helper_float_trunc_w_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint32_t wt2; ++ ++ wt2 = float32_to_int32_round_to_zero(fst0, &env->active_fpu.fp_status); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint64_t helper_float_ceil_l_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint64_t dt2; ++ ++ set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); ++ dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint64_t helper_float_ceil_l_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint64_t dt2; ++ ++ set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); ++ dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint32_t helper_float_ceil_w_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint32_t wt2; ++ ++ set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); ++ wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint32_t helper_float_ceil_w_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint32_t wt2; ++ ++ set_float_rounding_mode(float_round_up, &env->active_fpu.fp_status); ++ wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint64_t helper_float_floor_l_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint64_t dt2; ++ ++ set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); ++ dt2 = float64_to_int64(fdt0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint64_t helper_float_floor_l_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint64_t dt2; ++ ++ set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); ++ dt2 = float32_to_int64(fst0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ dt2 = FP_TO_INT64_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint32_t helper_float_floor_w_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint32_t wt2; ++ ++ set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); ++ wt2 = float64_to_int32(fdt0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint32_t helper_float_floor_w_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint32_t wt2; ++ ++ set_float_rounding_mode(float_round_down, &env->active_fpu.fp_status); ++ wt2 = float32_to_int32(fst0, &env->active_fpu.fp_status); ++ restore_rounding_mode(env); ++ if (get_float_exception_flags(&env->active_fpu.fp_status) & ++ (float_flag_invalid | float_flag_overflow)) { ++ wt2 = FP_TO_INT32_OVERFLOW; ++ } ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++/* unary operations, not modifying fp status */ ++#define FLOAT_UNOP(name) \ ++ uint64_t helper_float_##name##_d(uint64_t fdt0) \ ++ { \ ++ return float64_##name(fdt0); \ ++ } \ ++ uint32_t helper_float_##name##_s(uint32_t fst0) \ ++ { \ ++ return float32_##name(fst0); \ ++ } ++ ++FLOAT_UNOP(abs) ++FLOAT_UNOP(chs) ++#undef FLOAT_UNOP ++ ++uint64_t helper_float_recip_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint64_t fdt2; ++ ++ fdt2 = float64_div(float64_one, fdt0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fdt2; ++} ++ ++uint32_t helper_float_recip_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint32_t fst2; ++ ++ fst2 = float32_div(float32_one, fst0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fst2; ++} ++ ++uint64_t helper_float_rsqrt_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint64_t fdt2; ++ ++ fdt2 = float64_sqrt(fdt0, &env->active_fpu.fp_status); ++ fdt2 = float64_div(float64_one, fdt2, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fdt2; ++} ++ ++uint32_t helper_float_rsqrt_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint32_t fst2; ++ ++ fst2 = float32_sqrt(fst0, &env->active_fpu.fp_status); ++ fst2 = float32_div(float32_one, fst2, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fst2; ++} ++ ++uint32_t helper_float_rint_s(CPULOONGARCHState *env, uint32_t fs) ++{ ++ uint32_t fdret; ++ ++ fdret = float32_round_to_int(fs, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fdret; ++} ++ ++uint64_t helper_float_rint_d(CPULOONGARCHState *env, uint64_t fs) ++{ ++ uint64_t fdret; ++ ++ fdret = float64_round_to_int(fs, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return fdret; ++} ++ ++#define FLOAT_CLASS(name, bits) \ ++ uint##bits##_t float_##name(uint##bits##_t arg, float_status *status) \ ++ { \ ++ if (float##bits##_is_signaling_nan(arg, status)) { \ ++ return FLOAT_CLASS_SIGNALING_NAN; \ ++ } else if (float##bits##_is_quiet_nan(arg, status)) { \ ++ return FLOAT_CLASS_QUIET_NAN; \ ++ } else if (float##bits##_is_neg(arg)) { \ ++ if (float##bits##_is_infinity(arg)) { \ ++ return FLOAT_CLASS_NEGATIVE_INFINITY; \ ++ } else if (float##bits##_is_zero(arg)) { \ ++ return FLOAT_CLASS_NEGATIVE_ZERO; \ ++ } else if (float##bits##_is_zero_or_denormal(arg)) { \ ++ return FLOAT_CLASS_NEGATIVE_SUBNORMAL; \ ++ } else { \ ++ return FLOAT_CLASS_NEGATIVE_NORMAL; \ ++ } \ ++ } else { \ ++ if (float##bits##_is_infinity(arg)) { \ ++ return FLOAT_CLASS_POSITIVE_INFINITY; \ ++ } else if (float##bits##_is_zero(arg)) { \ ++ return FLOAT_CLASS_POSITIVE_ZERO; \ ++ } else if (float##bits##_is_zero_or_denormal(arg)) { \ ++ return FLOAT_CLASS_POSITIVE_SUBNORMAL; \ ++ } else { \ ++ return FLOAT_CLASS_POSITIVE_NORMAL; \ ++ } \ ++ } \ ++ } \ ++ \ ++ uint##bits##_t helper_float_##name(CPULOONGARCHState *env, \ ++ uint##bits##_t arg) \ ++ { \ ++ return float_##name(arg, &env->active_fpu.fp_status); \ ++ } ++ ++FLOAT_CLASS(class_s, 32) ++FLOAT_CLASS(class_d, 64) ++#undef FLOAT_CLASS ++ ++/* binary operations */ ++#define FLOAT_BINOP(name) \ ++ uint64_t helper_float_##name##_d(CPULOONGARCHState *env, uint64_t fdt0, \ ++ uint64_t fdt1) \ ++ { \ ++ uint64_t dt2; \ ++ \ ++ dt2 = float64_##name(fdt0, fdt1, &env->active_fpu.fp_status); \ ++ update_fcsr0(env, GETPC()); \ ++ return dt2; \ ++ } \ ++ \ ++ uint32_t helper_float_##name##_s(CPULOONGARCHState *env, uint32_t fst0, \ ++ uint32_t fst1) \ ++ { \ ++ uint32_t wt2; \ ++ \ ++ wt2 = float32_##name(fst0, fst1, &env->active_fpu.fp_status); \ ++ update_fcsr0(env, GETPC()); \ ++ return wt2; \ ++ } ++ ++FLOAT_BINOP(add) ++FLOAT_BINOP(sub) ++FLOAT_BINOP(mul) ++FLOAT_BINOP(div) ++#undef FLOAT_BINOP ++ ++uint64_t helper_float_exp2_d(CPULOONGARCHState *env, uint64_t fdt0, ++ uint64_t fdt1) ++{ ++ uint64_t dt2; ++ int64_t n = (int64_t)fdt1; ++ ++ dt2 = float64_scalbn(fdt0, n > 0x1000 ? 0x1000 : n < -0x1000 ? -0x1000 : n, ++ &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++uint32_t helper_float_exp2_s(CPULOONGARCHState *env, uint32_t fst0, ++ uint32_t fst1) ++{ ++ uint32_t wt2; ++ int32_t n = (int32_t)fst1; ++ ++ wt2 = float32_scalbn(fst0, n > 0x200 ? 0x200 : n < -0x200 ? -0x200 : n, ++ &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++#define FLOAT_MINMAX(name, bits, minmaxfunc) \ ++ uint##bits##_t helper_float_##name(CPULOONGARCHState *env, \ ++ uint##bits##_t fs, uint##bits##_t ft) \ ++ { \ ++ uint##bits##_t fdret; \ ++ \ ++ fdret = \ ++ float##bits##_##minmaxfunc(fs, ft, &env->active_fpu.fp_status); \ ++ update_fcsr0(env, GETPC()); \ ++ return fdret; \ ++ } ++ ++FLOAT_MINMAX(max_s, 32, maxnum) ++FLOAT_MINMAX(max_d, 64, maxnum) ++FLOAT_MINMAX(maxa_s, 32, maxnummag) ++FLOAT_MINMAX(maxa_d, 64, maxnummag) ++ ++FLOAT_MINMAX(min_s, 32, minnum) ++FLOAT_MINMAX(min_d, 64, minnum) ++FLOAT_MINMAX(mina_s, 32, minnummag) ++FLOAT_MINMAX(mina_d, 64, minnummag) ++#undef FLOAT_MINMAX ++ ++#define FLOAT_FMADDSUB(name, bits, muladd_arg) \ ++ uint##bits##_t helper_float_##name(CPULOONGARCHState *env, \ ++ uint##bits##_t fs, uint##bits##_t ft, \ ++ uint##bits##_t fd) \ ++ { \ ++ uint##bits##_t fdret; \ ++ \ ++ fdret = float##bits##_muladd(fs, ft, fd, muladd_arg, \ ++ &env->active_fpu.fp_status); \ ++ update_fcsr0(env, GETPC()); \ ++ return fdret; \ ++ } ++ ++FLOAT_FMADDSUB(maddf_s, 32, 0) ++FLOAT_FMADDSUB(maddf_d, 64, 0) ++FLOAT_FMADDSUB(msubf_s, 32, float_muladd_negate_c) ++FLOAT_FMADDSUB(msubf_d, 64, float_muladd_negate_c) ++FLOAT_FMADDSUB(nmaddf_s, 32, float_muladd_negate_result) ++FLOAT_FMADDSUB(nmaddf_d, 64, float_muladd_negate_result) ++FLOAT_FMADDSUB(nmsubf_s, 32, ++ float_muladd_negate_result | float_muladd_negate_c) ++FLOAT_FMADDSUB(nmsubf_d, 64, ++ float_muladd_negate_result | float_muladd_negate_c) ++#undef FLOAT_FMADDSUB ++ ++/* compare operations */ ++#define FOP_CONDN_D(op, cond) \ ++ uint64_t helper_cmp_d_##op(CPULOONGARCHState *env, uint64_t fdt0, \ ++ uint64_t fdt1) \ ++ { \ ++ uint64_t c; \ ++ c = cond; \ ++ update_fcsr0(env, GETPC()); \ ++ if (c) { \ ++ return -1; \ ++ } else { \ ++ return 0; \ ++ } \ ++ } ++ ++/* ++ * NOTE: the comma operator will make "cond" to eval to false, ++ * but float64_unordered_quiet() is still called. ++ */ ++FOP_CONDN_D(af, ++ (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status), ++ 0)) ++FOP_CONDN_D(un, ++ (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status))) ++FOP_CONDN_D(eq, (float64_eq_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(ueq, ++ (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_eq_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(lt, (float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(ult, ++ (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(le, (float64_le_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(ule, ++ (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_le_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++/* ++ * NOTE: the comma operator will make "cond" to eval to false, ++ * but float64_unordered() is still called. ++ */ ++FOP_CONDN_D(saf, ++ (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status), 0)) ++FOP_CONDN_D(sun, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status))) ++FOP_CONDN_D(seq, (float64_eq(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(sueq, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_eq(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(slt, (float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(sult, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(sle, (float64_le(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(sule, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_le(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(or, (float64_le_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_le_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(une, ++ (float64_unordered_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_lt_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(ne, (float64_lt_quiet(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_lt_quiet(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(sor, (float64_le(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_le(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(sune, (float64_unordered(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_lt(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))) ++FOP_CONDN_D(sne, (float64_lt(fdt1, fdt0, &env->active_fpu.fp_status) || ++ float64_lt(fdt0, fdt1, &env->active_fpu.fp_status))) ++ ++#define FOP_CONDN_S(op, cond) \ ++ uint32_t helper_cmp_s_##op(CPULOONGARCHState *env, uint32_t fst0, \ ++ uint32_t fst1) \ ++ { \ ++ uint64_t c; \ ++ c = cond; \ ++ update_fcsr0(env, GETPC()); \ ++ if (c) { \ ++ return -1; \ ++ } else { \ ++ return 0; \ ++ } \ ++ } ++ ++/* ++ * NOTE: the comma operator will make "cond" to eval to false, ++ * but float32_unordered_quiet() is still called. ++ */ ++FOP_CONDN_S(af, ++ (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status), ++ 0)) ++FOP_CONDN_S(un, ++ (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status))) ++FOP_CONDN_S(eq, (float32_eq_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(ueq, ++ (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_eq_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(lt, (float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(ult, ++ (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(le, (float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(ule, ++ (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++/* ++ * NOTE: the comma operator will make "cond" to eval to false, ++ * but float32_unordered() is still called. ++ */ ++FOP_CONDN_S(saf, ++ (float32_unordered(fst1, fst0, &env->active_fpu.fp_status), 0)) ++FOP_CONDN_S(sun, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status))) ++FOP_CONDN_S(seq, (float32_eq(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(sueq, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_eq(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(slt, (float32_lt(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(sult, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_lt(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(sle, (float32_le(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(sule, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_le(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(or, (float32_le_quiet(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_le_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(une, ++ (float32_unordered_quiet(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_lt_quiet(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(ne, (float32_lt_quiet(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_lt_quiet(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(sor, (float32_le(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_le(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(sune, (float32_unordered(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_lt(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_lt(fst0, fst1, &env->active_fpu.fp_status))) ++FOP_CONDN_S(sne, (float32_lt(fst1, fst0, &env->active_fpu.fp_status) || ++ float32_lt(fst0, fst1, &env->active_fpu.fp_status))) ++ ++uint32_t helper_float_logb_s(CPULOONGARCHState *env, uint32_t fst0) ++{ ++ uint32_t wt2; ++ ++ wt2 = float32_log2(fst0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return wt2; ++} ++ ++uint64_t helper_float_logb_d(CPULOONGARCHState *env, uint64_t fdt0) ++{ ++ uint64_t dt2; ++ ++ dt2 = float64_log2(fdt0, &env->active_fpu.fp_status); ++ update_fcsr0(env, GETPC()); ++ return dt2; ++} ++ ++target_ulong helper_fsel(CPULOONGARCHState *env, target_ulong fj, ++ target_ulong fk, uint32_t ca) ++{ ++ if (env->active_fpu.cf[ca & 0x7]) { ++ return fk; ++ } else { ++ return fj; ++ } ++} +diff --git a/target/loongarch64/fpu_helper.h b/target/loongarch64/fpu_helper.h +new file mode 100644 +index 0000000000..9efa7e30ca +--- /dev/null ++++ b/target/loongarch64/fpu_helper.h +@@ -0,0 +1,127 @@ ++/* ++ * loongarch internal definitions and helpers ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_FPU_H ++#define LOONGARCH_FPU_H ++ ++#include "cpu-csr.h" ++ ++extern const struct loongarch_def_t loongarch_defs[]; ++extern const int loongarch_defs_number; ++ ++enum CPULSXDataFormat { DF_BYTE = 0, DF_HALF, DF_WORD, DF_DOUBLE, DF_QUAD }; ++ ++void loongarch_cpu_do_interrupt(CPUState *cpu); ++bool loongarch_cpu_exec_interrupt(CPUState *cpu, int int_req); ++void loongarch_cpu_do_unaligned_access(CPUState *cpu, vaddr addr, ++ MMUAccessType access_type, int mmu_idx, ++ uintptr_t retaddr) QEMU_NORETURN; ++ ++#if !defined(CONFIG_USER_ONLY) ++ ++typedef struct r4k_tlb_t r4k_tlb_t; ++struct r4k_tlb_t { ++ target_ulong VPN; ++ uint32_t PageMask; ++ uint16_t ASID; ++ unsigned int G:1; ++ unsigned int C0:3; ++ unsigned int C1:3; ++ unsigned int V0:1; ++ unsigned int V1:1; ++ unsigned int D0:1; ++ unsigned int D1:1; ++ unsigned int XI0:1; ++ unsigned int XI1:1; ++ unsigned int RI0:1; ++ unsigned int RI1:1; ++ unsigned int EHINV:1; ++ uint64_t PPN[2]; ++}; ++ ++int no_mmu_map_address(CPULOONGARCHState *env, hwaddr *physical, int *prot, ++ target_ulong address, int rw, int access_type); ++int fixed_mmu_map_address(CPULOONGARCHState *env, hwaddr *physical, int *prot, ++ target_ulong address, int rw, int access_type); ++int r4k_map_address(CPULOONGARCHState *env, hwaddr *physical, int *prot, ++ target_ulong address, int rw, int access_type); ++ ++/* loongarch 3a5000 tlb helper function : lisa csr */ ++int ls3a5k_map_address(CPULOONGARCHState *env, hwaddr *physical, int *prot, ++ target_ulong address, int rw, int access_type); ++void ls3a5k_helper_tlbwr(CPULOONGARCHState *env); ++void ls3a5k_helper_tlbfill(CPULOONGARCHState *env); ++void ls3a5k_helper_tlbsrch(CPULOONGARCHState *env); ++void ls3a5k_helper_tlbrd(CPULOONGARCHState *env); ++void ls3a5k_helper_tlbclr(CPULOONGARCHState *env); ++void ls3a5k_helper_tlbflush(CPULOONGARCHState *env); ++void ls3a5k_invalidate_tlb(CPULOONGARCHState *env, int idx); ++void ls3a5k_helper_invtlb(CPULOONGARCHState *env, target_ulong addr, ++ target_ulong info, int op); ++void ls3a5k_flush_vtlb(CPULOONGARCHState *env); ++void ls3a5k_flush_ftlb(CPULOONGARCHState *env); ++hwaddr cpu_loongarch_translate_address(CPULOONGARCHState *env, ++ target_ulong address, int rw); ++#endif ++ ++#define cpu_signal_handler cpu_loongarch_signal_handler ++ ++static inline bool cpu_loongarch_hw_interrupts_enabled(CPULOONGARCHState *env) ++{ ++ bool ret = 0; ++ ++ ret = env->CSR_CRMD & (1 << CSR_CRMD_IE_SHIFT); ++ ++ return ret; ++} ++ ++void loongarch_tcg_init(void); ++ ++/* helper.c */ ++bool loongarch_cpu_tlb_fill(CPUState *cs, vaddr address, int size, ++ MMUAccessType access_type, int mmu_idx, bool probe, ++ uintptr_t retaddr); ++ ++/* op_helper.c */ ++uint32_t float_class_s(uint32_t arg, float_status *fst); ++uint64_t float_class_d(uint64_t arg, float_status *fst); ++ ++int ieee_ex_to_loongarch(int xcpt); ++void update_pagemask(CPULOONGARCHState *env, target_ulong arg1, ++ int32_t *pagemask); ++ ++void cpu_loongarch_tlb_flush(CPULOONGARCHState *env); ++void sync_c0_status(CPULOONGARCHState *env, CPULOONGARCHState *cpu, int tc); ++ ++void QEMU_NORETURN do_raise_exception_err(CPULOONGARCHState *env, ++ uint32_t exception, int error_code, ++ uintptr_t pc); ++int loongarch_read_qxfer(CPUState *cs, const char *annex, uint8_t *read_buf, ++ unsigned long offset, unsigned long len); ++int loongarch_write_qxfer(CPUState *cs, const char *annex, ++ const uint8_t *write_buf, unsigned long offset, ++ unsigned long len); ++ ++static inline void QEMU_NORETURN do_raise_exception(CPULOONGARCHState *env, ++ uint32_t exception, ++ uintptr_t pc) ++{ ++ do_raise_exception_err(env, exception, 0, pc); ++} ++#endif +diff --git a/target/loongarch64/gdbstub.c b/target/loongarch64/gdbstub.c +new file mode 100644 +index 0000000000..5ee91dc930 +--- /dev/null ++++ b/target/loongarch64/gdbstub.c +@@ -0,0 +1,164 @@ ++/* ++ * LOONGARCH gdb server stub ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu-common.h" ++#include "cpu.h" ++#include "internal.h" ++#include "exec/gdbstub.h" ++#ifdef CONFIG_TCG ++#include "exec/helper-proto.h" ++#endif ++ ++uint64_t read_fcc(CPULOONGARCHState *env) ++{ ++ uint64_t ret = 0; ++ ++ for (int i = 0; i < 8; ++i) { ++ ret |= (uint64_t)env->active_fpu.cf[i] << (i * 8); ++ } ++ ++ return ret; ++} ++ ++void write_fcc(CPULOONGARCHState *env, uint64_t val) ++{ ++ for (int i = 0; i < 8; ++i) { ++ env->active_fpu.cf[i] = (val >> (i * 8)) & 1; ++ } ++} ++ ++int loongarch_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ int size = 0; ++ ++ if (0 <= n && n < 32) { ++ return gdb_get_regl(mem_buf, env->active_tc.gpr[n]); ++ } ++ ++ switch (n) { ++ case 32: ++ size = gdb_get_regl(mem_buf, 0); ++ break; ++ case 33: ++ size = gdb_get_regl(mem_buf, env->active_tc.PC); ++ break; ++ case 34: ++ size = gdb_get_regl(mem_buf, env->CSR_BADV); ++ break; ++ default: ++ break; ++ } ++ ++ return size; ++} ++ ++int loongarch_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ target_ulong tmp = ldtul_p(mem_buf); ++ int size = 0; ++ ++ if (0 <= n && n < 32) { ++ return env->active_tc.gpr[n] = tmp, sizeof(target_ulong); ++ } ++ ++ size = sizeof(target_ulong); ++ ++ switch (n) { ++ case 33: ++ env->active_tc.PC = tmp; ++ break; ++ case 32: ++ case 34: ++ default: ++ size = 0; ++ break; ++ } ++ ++ return size; ++} ++ ++static int loongarch_gdb_get_fpu(CPULOONGARCHState *env, GByteArray *mem_buf, ++ int n) ++{ ++ if (0 <= n && n < 32) { ++ return gdb_get_reg64(mem_buf, env->active_fpu.fpr[n].d); ++ } else if (n == 32) { ++ uint64_t val = read_fcc(env); ++ return gdb_get_reg64(mem_buf, val); ++ } else if (n == 33) { ++ return gdb_get_reg32(mem_buf, env->active_fpu.fcsr0); ++ } ++ return 0; ++} ++ ++static int loongarch_gdb_set_fpu(CPULOONGARCHState *env, uint8_t *mem_buf, ++ int n) ++{ ++ int length = 0; ++ ++ if (0 <= n && n < 32) { ++ env->active_fpu.fpr[n].d = ldq_p(mem_buf); ++ length = 8; ++ } else if (n == 32) { ++ uint64_t val = ldq_p(mem_buf); ++ write_fcc(env, val); ++ length = 8; ++ } else if (n == 33) { ++ env->active_fpu.fcsr0 = ldl_p(mem_buf); ++ length = 4; ++ } ++ return length; ++} ++ ++void loongarch_cpu_register_gdb_regs_for_features(CPUState *cs) ++{ ++ gdb_register_coprocessor(cs, loongarch_gdb_get_fpu, loongarch_gdb_set_fpu, ++ 34, "loongarch-fpu.xml", 0); ++} ++ ++#ifdef CONFIG_TCG ++int loongarch_read_qxfer(CPUState *cs, const char *annex, uint8_t *read_buf, ++ unsigned long offset, unsigned long len) ++{ ++ if (strncmp(annex, "cpucfg", sizeof("cpucfg") - 1) == 0) { ++ if (offset % 4 != 0 || len % 4 != 0) { ++ return 0; ++ } ++ ++ size_t i; ++ for (i = offset; i < offset + len; i += 4) ++ ((uint32_t *)read_buf)[(i - offset) / 4] = ++ helper_cpucfg(&(LOONGARCH_CPU(cs)->env), i / 4); ++ return 32 * 4; ++ } ++ return 0; ++} ++ ++int loongarch_write_qxfer(CPUState *cs, const char *annex, ++ const uint8_t *write_buf, unsigned long offset, ++ unsigned long len) ++{ ++ return 0; ++} ++#endif +diff --git a/target/loongarch64/helper.c b/target/loongarch64/helper.c +new file mode 100644 +index 0000000000..ec25803c1c +--- /dev/null ++++ b/target/loongarch64/helper.c +@@ -0,0 +1,726 @@ ++/* ++ * LOONGARCH emulation helpers for qemu. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "cpu.h" ++#include "internal.h" ++#include "exec/exec-all.h" ++#include "exec/cpu_ldst.h" ++#include "exec/log.h" ++#include "hw/loongarch/cpudevs.h" ++ ++#if !defined(CONFIG_USER_ONLY) ++ ++static int ls3a5k_map_address_tlb_entry(CPULOONGARCHState *env, ++ hwaddr *physical, int *prot, ++ target_ulong address, int rw, ++ int access_type, ls3a5k_tlb_t *tlb) ++{ ++ uint64_t mask = tlb->PageMask; ++ int n = !!(address & mask & ~(mask >> 1)); ++ uint32_t plv = env->CSR_CRMD & CSR_CRMD_PLV; ++ ++ /* Check access rights */ ++ if (!(n ? tlb->V1 : tlb->V0)) { ++ return TLBRET_INVALID; ++ } ++ ++ if (rw == MMU_INST_FETCH && (n ? tlb->XI1 : tlb->XI0)) { ++ return TLBRET_XI; ++ } ++ ++ if (rw == MMU_DATA_LOAD && (n ? tlb->RI1 : tlb->RI0)) { ++ return TLBRET_RI; ++ } ++ ++ if (plv > (n ? tlb->PLV1 : tlb->PLV0)) { ++ return TLBRET_PE; ++ } ++ ++ if (rw != MMU_DATA_STORE || (n ? tlb->WE1 : tlb->WE0)) { ++ /* ++ * PPN address ++ * 4 KB: [47:13] [12;0] ++ * 16 KB: [47:15] [14:0] ++ */ ++ if (n) { ++ *physical = tlb->PPN1 | (address & (mask >> 1)); ++ } else { ++ *physical = tlb->PPN0 | (address & (mask >> 1)); ++ } ++ *prot = PAGE_READ; ++ if (n ? tlb->WE1 : tlb->WE0) { ++ *prot |= PAGE_WRITE; ++ } ++ if (!(n ? tlb->XI1 : tlb->XI0)) { ++ *prot |= PAGE_EXEC; ++ } ++ return TLBRET_MATCH; ++ } ++ ++ return TLBRET_DIRTY; ++} ++ ++/* Loongarch 3A5K -style MMU emulation */ ++int ls3a5k_map_address(CPULOONGARCHState *env, hwaddr *physical, int *prot, ++ target_ulong address, int rw, int access_type) ++{ ++ uint16_t asid = env->CSR_ASID & 0x3ff; ++ int i; ++ ls3a5k_tlb_t *tlb; ++ ++ int ftlb_size = env->tlb->mmu.ls3a5k.ftlb_size; ++ int vtlb_size = env->tlb->mmu.ls3a5k.vtlb_size; ++ ++ int ftlb_idx; ++ ++ uint64_t mask; ++ uint64_t vpn; /* address to map */ ++ uint64_t tag; /* address in TLB entry */ ++ ++ /* search VTLB */ ++ for (i = ftlb_size; i < ftlb_size + vtlb_size; ++i) { ++ tlb = &env->tlb->mmu.ls3a5k.tlb[i]; ++ mask = tlb->PageMask; ++ ++ vpn = address & 0xffffffffe000 & ~mask; ++ tag = tlb->VPN & ~mask; ++ ++ if ((tlb->G == 1 || tlb->ASID == asid) && vpn == tag && ++ tlb->EHINV != 1) { ++ return ls3a5k_map_address_tlb_entry(env, physical, prot, address, ++ rw, access_type, tlb); ++ } ++ } ++ ++ if (ftlb_size == 0) { ++ return TLBRET_NOMATCH; ++ } ++ ++ /* search FTLB */ ++ mask = env->tlb->mmu.ls3a5k.ftlb_mask; ++ vpn = address & 0xffffffffe000 & ~mask; ++ ++ ftlb_idx = (address & 0xffffffffc000) >> 15; /* 16 KB */ ++ ftlb_idx = ftlb_idx & 0xff; /* [0,255] */ ++ ++ for (i = 0; i < 8; ++i) { ++ /* ++ * ---------- set 0 1 2 ... 7 ++ * ftlb_idx ----------------------------------- ++ * 0 | 0 1 2 ... 7 ++ * 1 | 8 9 10 ... 15 ++ * 2 | 16 17 18 ... 23 ++ * ... | ++ * 255 | 2040 2041 2042 ... 2047 ++ */ ++ tlb = &env->tlb->mmu.ls3a5k.tlb[ftlb_idx * 8 + i]; ++ tag = tlb->VPN & ~mask; ++ ++ if ((tlb->G == 1 || tlb->ASID == asid) && vpn == tag && ++ tlb->EHINV != 1) { ++ return ls3a5k_map_address_tlb_entry(env, physical, prot, address, ++ rw, access_type, tlb); ++ } ++ } ++ ++ return TLBRET_NOMATCH; ++} ++ ++static int get_physical_address(CPULOONGARCHState *env, hwaddr *physical, ++ int *prot, target_ulong real_address, int rw, ++ int access_type, int mmu_idx) ++{ ++ int user_mode = mmu_idx == LARCH_HFLAG_UM; ++ int kernel_mode = !user_mode; ++ unsigned plv, base_c, base_v, tmp; ++ ++ /* effective address (modified for KVM T&E kernel segments) */ ++ target_ulong address = real_address; ++ ++ /* Check PG */ ++ if (!(env->CSR_CRMD & CSR_CRMD_PG)) { ++ /* DA mode */ ++ *physical = address & 0xffffffffffffUL; ++ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; ++ return TLBRET_MATCH; ++ } ++ ++ plv = kernel_mode | (user_mode << 3); ++ base_v = address >> CSR_DMW_BASE_SH; ++ /* Check direct map window 0 */ ++ base_c = env->CSR_DMWIN0 >> CSR_DMW_BASE_SH; ++ if ((plv & env->CSR_DMWIN0) && (base_c == base_v)) { ++ *physical = dmwin_va2pa(address); ++ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; ++ return TLBRET_MATCH; ++ } ++ /* Check direct map window 1 */ ++ base_c = env->CSR_DMWIN1 >> CSR_DMW_BASE_SH; ++ if ((plv & env->CSR_DMWIN1) && (base_c == base_v)) { ++ *physical = dmwin_va2pa(address); ++ *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; ++ return TLBRET_MATCH; ++ } ++ /* Check valid extension */ ++ tmp = address >> 47; ++ if (!(tmp == 0 || tmp == 0x1ffff)) { ++ return TLBRET_BADADDR; ++ } ++ /* mapped address */ ++ return env->tlb->map_address(env, physical, prot, real_address, rw, ++ access_type); ++} ++ ++void cpu_loongarch_tlb_flush(CPULOONGARCHState *env) ++{ ++ LOONGARCHCPU *cpu = loongarch_env_get_cpu(env); ++ ++ /* Flush qemu's TLB and discard all shadowed entries. */ ++ tlb_flush(CPU(cpu)); ++ env->tlb->tlb_in_use = env->tlb->nb_tlb; ++} ++#endif ++ ++static void raise_mmu_exception(CPULOONGARCHState *env, target_ulong address, ++ int rw, int tlb_error) ++{ ++ CPUState *cs = CPU(loongarch_env_get_cpu(env)); ++ int exception = 0, error_code = 0; ++ ++ if (rw == MMU_INST_FETCH) { ++ error_code |= EXCP_INST_NOTAVAIL; ++ } ++ ++ switch (tlb_error) { ++ default: ++ case TLBRET_BADADDR: ++ /* Reference to kernel address from user mode or supervisor mode */ ++ /* Reference to supervisor address from user mode */ ++ if (rw == MMU_DATA_STORE) { ++ exception = EXCP_AdES; ++ } else { ++ exception = EXCP_AdEL; ++ } ++ break; ++ case TLBRET_NOMATCH: ++ /* No TLB match for a mapped address */ ++ if (rw == MMU_DATA_STORE) { ++ exception = EXCP_TLBS; ++ } else { ++ exception = EXCP_TLBL; ++ } ++ error_code |= EXCP_TLB_NOMATCH; ++ break; ++ case TLBRET_INVALID: ++ /* TLB match with no valid bit */ ++ if (rw == MMU_DATA_STORE) { ++ exception = EXCP_TLBS; ++ } else { ++ exception = EXCP_TLBL; ++ } ++ break; ++ case TLBRET_DIRTY: ++ /* TLB match but 'D' bit is cleared */ ++ exception = EXCP_LTLBL; ++ break; ++ case TLBRET_XI: ++ /* Execute-Inhibit Exception */ ++ exception = EXCP_TLBXI; ++ break; ++ case TLBRET_RI: ++ /* Read-Inhibit Exception */ ++ exception = EXCP_TLBRI; ++ break; ++ case TLBRET_PE: ++ /* Privileged Exception */ ++ exception = EXCP_TLBPE; ++ break; ++ } ++ ++ if (env->insn_flags & INSN_LOONGARCH) { ++ if (tlb_error == TLBRET_NOMATCH) { ++ env->CSR_TLBRBADV = address; ++ env->CSR_TLBREHI = address & (TARGET_PAGE_MASK << 1); ++ cs->exception_index = exception; ++ env->error_code = error_code; ++ return; ++ } ++ } ++ ++ /* Raise exception */ ++ env->CSR_BADV = address; ++ cs->exception_index = exception; ++ env->error_code = error_code; ++ ++ if (env->insn_flags & INSN_LOONGARCH) { ++ env->CSR_TLBEHI = address & (TARGET_PAGE_MASK << 1); ++ } ++} ++ ++bool loongarch_cpu_tlb_fill(CPUState *cs, vaddr address, int size, ++ MMUAccessType access_type, int mmu_idx, bool probe, ++ uintptr_t retaddr) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++#if !defined(CONFIG_USER_ONLY) ++ hwaddr physical; ++ int prot; ++ int loongarch_access_type; ++#endif ++ int ret = TLBRET_BADADDR; ++ ++ qemu_log_mask(CPU_LOG_MMU, ++ "%s pc " TARGET_FMT_lx " ad %" VADDR_PRIx " mmu_idx %d\n", ++ __func__, env->active_tc.PC, address, mmu_idx); ++ ++ /* data access */ ++#if !defined(CONFIG_USER_ONLY) ++ /* XXX: put correct access by using cpu_restore_state() correctly */ ++ loongarch_access_type = ACCESS_INT; ++ ret = get_physical_address(env, &physical, &prot, address, access_type, ++ loongarch_access_type, mmu_idx); ++ switch (ret) { ++ case TLBRET_MATCH: ++ qemu_log_mask(CPU_LOG_MMU, ++ "%s address=%" VADDR_PRIx " physical " TARGET_FMT_plx ++ " prot %d asid %ld pc 0x%lx\n", ++ __func__, address, physical, prot, env->CSR_ASID, ++ env->active_tc.PC); ++ break; ++ default: ++ qemu_log_mask(CPU_LOG_MMU, ++ "%s address=%" VADDR_PRIx " ret %d asid %ld pc 0x%lx\n", ++ __func__, address, ret, env->CSR_ASID, ++ env->active_tc.PC); ++ break; ++ } ++ if (ret == TLBRET_MATCH) { ++ tlb_set_page(cs, address & TARGET_PAGE_MASK, ++ physical & TARGET_PAGE_MASK, prot | PAGE_EXEC, mmu_idx, ++ TARGET_PAGE_SIZE); ++ ret = true; ++ } ++ if (probe) { ++ return false; ++ } ++#endif ++ ++ raise_mmu_exception(env, address, access_type, ret); ++ do_raise_exception_err(env, cs->exception_index, env->error_code, retaddr); ++} ++ ++#if !defined(CONFIG_USER_ONLY) ++hwaddr cpu_loongarch_translate_address(CPULOONGARCHState *env, ++ target_ulong address, int rw) ++{ ++ hwaddr physical; ++ int prot; ++ int access_type; ++ int ret = 0; ++ ++ /* data access */ ++ access_type = ACCESS_INT; ++ ret = get_physical_address(env, &physical, &prot, address, rw, access_type, ++ cpu_mmu_index(env, false)); ++ if (ret != TLBRET_MATCH) { ++ raise_mmu_exception(env, address, rw, ret); ++ return -1LL; ++ } else { ++ return physical; ++ } ++} ++ ++static const char *const excp_names[EXCP_LAST + 1] = { ++ [EXCP_RESET] = "reset", ++ [EXCP_SRESET] = "soft reset", ++ [EXCP_NMI] = "non-maskable interrupt", ++ [EXCP_EXT_INTERRUPT] = "interrupt", ++ [EXCP_AdEL] = "address error load", ++ [EXCP_AdES] = "address error store", ++ [EXCP_TLBF] = "TLB refill", ++ [EXCP_IBE] = "instruction bus error", ++ [EXCP_SYSCALL] = "syscall", ++ [EXCP_BREAK] = "break", ++ [EXCP_FPDIS] = "float unit unusable", ++ [EXCP_LSXDIS] = "vector128 unusable", ++ [EXCP_LASXDIS] = "vector256 unusable", ++ [EXCP_RI] = "reserved instruction", ++ [EXCP_OVERFLOW] = "arithmetic overflow", ++ [EXCP_TRAP] = "trap", ++ [EXCP_FPE] = "floating point", ++ [EXCP_LTLBL] = "TLB modify", ++ [EXCP_TLBL] = "TLB load", ++ [EXCP_TLBS] = "TLB store", ++ [EXCP_DBE] = "data bus error", ++ [EXCP_TLBXI] = "TLB execute-inhibit", ++ [EXCP_TLBRI] = "TLB read-inhibit", ++ [EXCP_TLBPE] = "TLB priviledged error", ++}; ++#endif ++ ++target_ulong exception_resume_pc(CPULOONGARCHState *env) ++{ ++ target_ulong bad_pc; ++ ++ bad_pc = env->active_tc.PC; ++ if (env->hflags & LARCH_HFLAG_BMASK) { ++ /* ++ * If the exception was raised from a delay slot, come back to ++ * the jump. ++ */ ++ bad_pc -= 4; ++ } ++ ++ return bad_pc; ++} ++ ++#if !defined(CONFIG_USER_ONLY) ++static void set_hflags_for_handler(CPULOONGARCHState *env) ++{ ++ /* Exception handlers are entered in 32-bit mode. */ ++} ++ ++static inline void set_badinstr_registers(CPULOONGARCHState *env) ++{ ++ if ((env->insn_flags & INSN_LOONGARCH)) { ++ env->CSR_BADI = cpu_ldl_code(env, env->active_tc.PC); ++ return; ++ } ++} ++#endif ++ ++static inline unsigned int get_vint_size(CPULOONGARCHState *env) ++{ ++ unsigned int size = 0; ++ ++ switch ((env->CSR_ECFG >> 16) & 0x7) { ++ case 0: ++ break; ++ case 1: ++ size = 2 * 4; /* #Insts * inst_size */ ++ break; ++ case 2: ++ size = 4 * 4; ++ break; ++ case 3: ++ size = 8 * 4; ++ break; ++ case 4: ++ size = 16 * 4; ++ break; ++ case 5: ++ size = 32 * 4; ++ break; ++ case 6: ++ size = 64 * 4; ++ break; ++ case 7: ++ size = 128 * 4; ++ break; ++ default: ++ printf("%s: unexpected value", __func__); ++ assert(0); ++ } ++ ++ return size; ++} ++ ++#define is_refill(cs, env) \ ++ (((cs->exception_index == EXCP_TLBL) || \ ++ (cs->exception_index == EXCP_TLBS)) && \ ++ (env->error_code & EXCP_TLB_NOMATCH)) ++ ++void loongarch_cpu_do_interrupt(CPUState *cs) ++{ ++#if !defined(CONFIG_USER_ONLY) ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ bool update_badinstr = 0; ++ int cause = -1; ++ const char *name; ++ ++ if (qemu_loglevel_mask(CPU_LOG_INT) && ++ cs->exception_index != EXCP_EXT_INTERRUPT) { ++ if (cs->exception_index < 0 || cs->exception_index > EXCP_LAST) { ++ name = "unknown"; ++ } else { ++ name = excp_names[cs->exception_index]; ++ } ++ ++ qemu_log("%s enter: PC " TARGET_FMT_lx " ERA " TARGET_FMT_lx ++ " TLBRERA 0x%016lx" ++ " %s exception\n", ++ __func__, env->active_tc.PC, env->CSR_ERA, env->CSR_TLBRERA, ++ name); ++ } ++ ++ switch (cs->exception_index) { ++ case EXCP_RESET: ++ cpu_reset(CPU(cpu)); ++ break; ++ case EXCP_NMI: ++ env->CSR_ERRERA = exception_resume_pc(env); ++ env->hflags &= ~LARCH_HFLAG_BMASK; ++ env->hflags |= LARCH_HFLAG_64; ++ env->hflags &= ~LARCH_HFLAG_AWRAP; ++ env->hflags &= ~(LARCH_HFLAG_KSU); ++ env->active_tc.PC = env->exception_base; ++ set_hflags_for_handler(env); ++ break; ++ case EXCP_EXT_INTERRUPT: ++ cause = 0; ++ goto set_ERA; ++ case EXCP_LTLBL: ++ cause = 1; ++ update_badinstr = !(env->error_code & EXCP_INST_NOTAVAIL); ++ goto set_ERA; ++ case EXCP_TLBL: ++ cause = 2; ++ update_badinstr = !(env->error_code & EXCP_INST_NOTAVAIL); ++ goto set_ERA; ++ case EXCP_TLBS: ++ cause = 3; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_AdEL: ++ cause = 4; ++ update_badinstr = !(env->error_code & EXCP_INST_NOTAVAIL); ++ goto set_ERA; ++ case EXCP_AdES: ++ cause = 5; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_IBE: ++ cause = 6; ++ goto set_ERA; ++ case EXCP_DBE: ++ cause = 7; ++ goto set_ERA; ++ case EXCP_SYSCALL: ++ cause = 8; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_BREAK: ++ cause = 9; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_RI: ++ cause = 10; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_FPDIS: ++ case EXCP_LSXDIS: ++ case EXCP_LASXDIS: ++ cause = 11; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_OVERFLOW: ++ cause = 12; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_TRAP: ++ cause = 13; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_FPE: ++ cause = 15; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_TLBRI: ++ cause = 19; ++ update_badinstr = 1; ++ goto set_ERA; ++ case EXCP_TLBXI: ++ case EXCP_TLBPE: ++ cause = 20; ++ goto set_ERA; ++ set_ERA: ++ if (is_refill(cs, env)) { ++ env->CSR_TLBRERA = exception_resume_pc(env); ++ env->CSR_TLBRERA |= 1; ++ } else { ++ env->CSR_ERA = exception_resume_pc(env); ++ } ++ ++ if (update_badinstr) { ++ set_badinstr_registers(env); ++ } ++ env->hflags &= ~(LARCH_HFLAG_KSU); ++ ++ env->hflags &= ~LARCH_HFLAG_BMASK; ++ if (env->insn_flags & INSN_LOONGARCH) { ++ /* save PLV and IE */ ++ if (is_refill(cs, env)) { ++ env->CSR_TLBRPRMD &= (~0x7); ++ env->CSR_TLBRPRMD |= (env->CSR_CRMD & 0x7); ++ } else { ++ env->CSR_PRMD &= (~0x7); ++ env->CSR_PRMD |= (env->CSR_CRMD & 0x7); ++ } ++ ++ env->CSR_CRMD &= ~(0x7); ++ ++ switch (cs->exception_index) { ++ case EXCP_EXT_INTERRUPT: ++ break; ++ case EXCP_TLBL: ++ if (env->error_code & EXCP_INST_NOTAVAIL) { ++ cause = EXCCODE_TLBI; ++ } else { ++ cause = EXCCODE_TLBL; ++ } ++ break; ++ case EXCP_TLBS: ++ cause = EXCCODE_TLBS; ++ break; ++ case EXCP_LTLBL: ++ cause = EXCCODE_MOD; ++ break; ++ case EXCP_TLBRI: ++ cause = EXCCODE_TLBRI; ++ break; ++ case EXCP_TLBXI: ++ cause = EXCCODE_TLBXI; ++ break; ++ case EXCP_TLBPE: ++ cause = EXCCODE_TLBPE; ++ break; ++ case EXCP_AdEL: ++ case EXCP_AdES: ++ case EXCP_IBE: ++ case EXCP_DBE: ++ cause = EXCCODE_ADE; ++ break; ++ case EXCP_SYSCALL: ++ cause = EXCCODE_SYS; ++ break; ++ case EXCP_BREAK: ++ cause = EXCCODE_BP; ++ break; ++ case EXCP_RI: ++ cause = EXCCODE_RI; ++ break; ++ case EXCP_FPDIS: ++ cause = EXCCODE_FPDIS; ++ break; ++ case EXCP_LSXDIS: ++ cause = EXCCODE_LSXDIS; ++ break; ++ case EXCP_LASXDIS: ++ cause = EXCCODE_LASXDIS; ++ break; ++ case EXCP_FPE: ++ cause = EXCCODE_FPE; ++ break; ++ default: ++ printf("Error: exception(%d) '%s' has not been supported\n", ++ cs->exception_index, excp_names[cs->exception_index]); ++ abort(); ++ } ++ ++ uint32_t vec_size = get_vint_size(env); ++ env->active_tc.PC = env->CSR_EEPN; ++ env->active_tc.PC += cause * vec_size; ++ if (is_refill(cs, env)) { ++ /* TLB Refill */ ++ env->active_tc.PC = env->CSR_TLBRENT; ++ break; /* Do not modify excode */ ++ } ++ if (cs->exception_index == EXCP_EXT_INTERRUPT) { ++ /* Interrupt */ ++ uint32_t vector = 0; ++ uint32_t pending = env->CSR_ESTAT & CSR_ESTAT_IPMASK; ++ pending &= env->CSR_ECFG & CSR_ECFG_IPMASK; ++ ++ /* Find the highest-priority interrupt. */ ++ while (pending >>= 1) { ++ vector++; ++ } ++ env->active_tc.PC = ++ env->CSR_EEPN + (EXCODE_IP + vector) * vec_size; ++ if (qemu_loglevel_mask(CPU_LOG_INT)) { ++ qemu_log("%s: PC " TARGET_FMT_lx " ERA " TARGET_FMT_lx ++ " cause %d\n" ++ " A " TARGET_FMT_lx " D " TARGET_FMT_lx ++ " vector = %d ExC %08lx ExS %08lx\n", ++ __func__, env->active_tc.PC, env->CSR_ERA, cause, ++ env->CSR_BADV, env->CSR_DERA, vector, ++ env->CSR_ECFG, env->CSR_ESTAT); ++ } ++ } ++ /* Excode */ ++ env->CSR_ESTAT = (env->CSR_ESTAT & ~(0x1f << CSR_ESTAT_EXC_SH)) | ++ (cause << CSR_ESTAT_EXC_SH); ++ } ++ set_hflags_for_handler(env); ++ break; ++ default: ++ abort(); ++ } ++ if (qemu_loglevel_mask(CPU_LOG_INT) && ++ cs->exception_index != EXCP_EXT_INTERRUPT) { ++ qemu_log("%s: PC " TARGET_FMT_lx " ERA 0x%08lx" ++ " cause %d%s\n" ++ " ESTAT %08lx EXCFG 0x%08lx BADVA 0x%08lx BADI 0x%08lx \ ++ SYS_NUM %lu cpu %d asid 0x%lx" ++ "\n", ++ __func__, env->active_tc.PC, ++ is_refill(cs, env) ? env->CSR_TLBRERA : env->CSR_ERA, cause, ++ is_refill(cs, env) ? "(refill)" : "", env->CSR_ESTAT, ++ env->CSR_ECFG, ++ is_refill(cs, env) ? env->CSR_TLBRBADV : env->CSR_BADV, ++ env->CSR_BADI, env->active_tc.gpr[11], cs->cpu_index, ++ env->CSR_ASID); ++ } ++#endif ++ cs->exception_index = EXCP_NONE; ++} ++ ++bool loongarch_cpu_exec_interrupt(CPUState *cs, int interrupt_request) ++{ ++ if (interrupt_request & CPU_INTERRUPT_HARD) { ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ ++ if (cpu_loongarch_hw_interrupts_enabled(env) && ++ cpu_loongarch_hw_interrupts_pending(env)) { ++ /* Raise it */ ++ cs->exception_index = EXCP_EXT_INTERRUPT; ++ env->error_code = 0; ++ loongarch_cpu_do_interrupt(cs); ++ return true; ++ } ++ } ++ return false; ++} ++ ++void QEMU_NORETURN do_raise_exception_err(CPULOONGARCHState *env, ++ uint32_t exception, int error_code, ++ uintptr_t pc) ++{ ++ CPUState *cs = CPU(loongarch_env_get_cpu(env)); ++ ++ qemu_log_mask(CPU_LOG_INT, "%s: %d %d\n", __func__, exception, error_code); ++ cs->exception_index = exception; ++ env->error_code = error_code; ++ ++ cpu_loop_exit_restore(cs, pc); ++} +diff --git a/target/loongarch64/helper.h b/target/loongarch64/helper.h +new file mode 100644 +index 0000000000..868b16da1e +--- /dev/null ++++ b/target/loongarch64/helper.h +@@ -0,0 +1,178 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++DEF_HELPER_3(raise_exception_err, noreturn, env, i32, int) ++DEF_HELPER_2(raise_exception, noreturn, env, i32) ++DEF_HELPER_1(raise_exception_debug, noreturn, env) ++ ++DEF_HELPER_FLAGS_1(bitswap, TCG_CALL_NO_RWG_SE, tl, tl) ++DEF_HELPER_FLAGS_1(dbitswap, TCG_CALL_NO_RWG_SE, tl, tl) ++ ++DEF_HELPER_3(crc32, tl, tl, tl, i32) ++DEF_HELPER_3(crc32c, tl, tl, tl, i32) ++ ++#ifndef CONFIG_USER_ONLY ++/* LoongISA CSR register */ ++DEF_HELPER_2(csr_rdq, tl, env, i64) ++DEF_HELPER_3(csr_wrq, tl, env, tl, i64) ++DEF_HELPER_4(csr_xchgq, tl, env, tl, tl, i64) ++ ++#endif /* !CONFIG_USER_ONLY */ ++ ++/* CP1 functions */ ++DEF_HELPER_2(movfcsr2gr, tl, env, i32) ++DEF_HELPER_4(movgr2fcsr, void, env, tl, i32, i32) ++ ++DEF_HELPER_2(float_cvtd_s, i64, env, i32) ++DEF_HELPER_2(float_cvtd_w, i64, env, i32) ++DEF_HELPER_2(float_cvtd_l, i64, env, i64) ++DEF_HELPER_2(float_cvts_d, i32, env, i64) ++DEF_HELPER_2(float_cvts_w, i32, env, i32) ++DEF_HELPER_2(float_cvts_l, i32, env, i64) ++ ++DEF_HELPER_FLAGS_2(float_class_s, TCG_CALL_NO_RWG_SE, i32, env, i32) ++DEF_HELPER_FLAGS_2(float_class_d, TCG_CALL_NO_RWG_SE, i64, env, i64) ++ ++#define FOP_PROTO(op) \ ++ DEF_HELPER_4(float_##op##_s, i32, env, i32, i32, i32) \ ++ DEF_HELPER_4(float_##op##_d, i64, env, i64, i64, i64) ++FOP_PROTO(maddf) ++FOP_PROTO(msubf) ++FOP_PROTO(nmaddf) ++FOP_PROTO(nmsubf) ++#undef FOP_PROTO ++ ++#define FOP_PROTO(op) \ ++ DEF_HELPER_3(float_##op##_s, i32, env, i32, i32) \ ++ DEF_HELPER_3(float_##op##_d, i64, env, i64, i64) ++FOP_PROTO(max) ++FOP_PROTO(maxa) ++FOP_PROTO(min) ++FOP_PROTO(mina) ++#undef FOP_PROTO ++ ++#define FOP_PROTO(op) \ ++ DEF_HELPER_2(float_##op##_l_s, i64, env, i32) \ ++ DEF_HELPER_2(float_##op##_l_d, i64, env, i64) \ ++ DEF_HELPER_2(float_##op##_w_s, i32, env, i32) \ ++ DEF_HELPER_2(float_##op##_w_d, i32, env, i64) ++FOP_PROTO(cvt) ++FOP_PROTO(round) ++FOP_PROTO(trunc) ++FOP_PROTO(ceil) ++FOP_PROTO(floor) ++#undef FOP_PROTO ++ ++#define FOP_PROTO(op) \ ++ DEF_HELPER_2(float_##op##_s, i32, env, i32) \ ++ DEF_HELPER_2(float_##op##_d, i64, env, i64) ++FOP_PROTO(sqrt) ++FOP_PROTO(rsqrt) ++FOP_PROTO(recip) ++FOP_PROTO(rint) ++#undef FOP_PROTO ++ ++#define FOP_PROTO(op) \ ++ DEF_HELPER_1(float_##op##_s, i32, i32) \ ++ DEF_HELPER_1(float_##op##_d, i64, i64) ++FOP_PROTO(abs) ++FOP_PROTO(chs) ++#undef FOP_PROTO ++ ++#define FOP_PROTO(op) \ ++ DEF_HELPER_3(float_##op##_s, i32, env, i32, i32) \ ++ DEF_HELPER_3(float_##op##_d, i64, env, i64, i64) ++FOP_PROTO(add) ++FOP_PROTO(sub) ++FOP_PROTO(mul) ++FOP_PROTO(div) ++#undef FOP_PROTO ++ ++#define FOP_PROTO(op) \ ++ DEF_HELPER_3(cmp_d_##op, i64, env, i64, i64) \ ++ DEF_HELPER_3(cmp_s_##op, i32, env, i32, i32) ++FOP_PROTO(af) ++FOP_PROTO(un) ++FOP_PROTO(eq) ++FOP_PROTO(ueq) ++FOP_PROTO(lt) ++FOP_PROTO(ult) ++FOP_PROTO(le) ++FOP_PROTO(ule) ++FOP_PROTO(saf) ++FOP_PROTO(sun) ++FOP_PROTO(seq) ++FOP_PROTO(sueq) ++FOP_PROTO(slt) ++FOP_PROTO(sult) ++FOP_PROTO(sle) ++FOP_PROTO(sule) ++FOP_PROTO(or) ++FOP_PROTO(une) ++FOP_PROTO(ne) ++FOP_PROTO(sor) ++FOP_PROTO(sune) ++FOP_PROTO(sne) ++#undef FOP_PROTO ++ ++/* Special functions */ ++#ifndef CONFIG_USER_ONLY ++DEF_HELPER_1(tlbwr, void, env) ++DEF_HELPER_1(tlbfill, void, env) ++DEF_HELPER_1(tlbsrch, void, env) ++DEF_HELPER_1(tlbrd, void, env) ++DEF_HELPER_1(tlbclr, void, env) ++DEF_HELPER_1(tlbflush, void, env) ++DEF_HELPER_4(invtlb, void, env, tl, tl, tl) ++DEF_HELPER_1(ertn, void, env) ++DEF_HELPER_5(lddir, void, env, tl, tl, tl, i32) ++DEF_HELPER_4(ldpte, void, env, tl, tl, i32) ++DEF_HELPER_3(drdtime, void, env, tl, tl) ++DEF_HELPER_1(read_pgd, tl, env) ++#endif /* !CONFIG_USER_ONLY */ ++DEF_HELPER_2(cpucfg, tl, env, tl) ++DEF_HELPER_1(idle, void, env) ++ ++DEF_HELPER_3(float_exp2_s, i32, env, i32, i32) ++DEF_HELPER_3(float_exp2_d, i64, env, i64, i64) ++DEF_HELPER_2(float_logb_s, i32, env, i32) ++DEF_HELPER_2(float_logb_d, i64, env, i64) ++DEF_HELPER_3(movreg2cf, void, env, i32, tl) ++DEF_HELPER_2(movcf2reg, tl, env, i32) ++DEF_HELPER_3(movreg2cf_i32, void, env, i32, i32) ++DEF_HELPER_3(movreg2cf_i64, void, env, i32, i64) ++ ++DEF_HELPER_2(cto_w, tl, env, tl) ++DEF_HELPER_2(ctz_w, tl, env, tl) ++DEF_HELPER_2(cto_d, tl, env, tl) ++DEF_HELPER_2(ctz_d, tl, env, tl) ++DEF_HELPER_2(bitrev_w, tl, env, tl) ++DEF_HELPER_2(bitrev_d, tl, env, tl) ++ ++DEF_HELPER_2(load_scr, i64, env, i32) ++DEF_HELPER_3(store_scr, void, env, i32, i64) ++ ++DEF_HELPER_3(asrtle_d, void, env, tl, tl) ++DEF_HELPER_3(asrtgt_d, void, env, tl, tl) ++ ++DEF_HELPER_4(fsel, i64, env, i64, i64, i32) ++ ++#ifndef CONFIG_USER_ONLY ++DEF_HELPER_4(iocsr, void, env, tl, tl, i32) ++#endif ++DEF_HELPER_3(memtrace_addr, void, env, tl, i32) ++DEF_HELPER_2(memtrace_val, void, env, tl) +diff --git a/target/loongarch64/insn.decode b/target/loongarch64/insn.decode +new file mode 100644 +index 0000000000..2f82441ea7 +--- /dev/null ++++ b/target/loongarch64/insn.decode +@@ -0,0 +1,532 @@ ++# ++# loongarch ISA decode for 64-bit prefixed insns ++# ++# Copyright (c) 2023 Loongarch Technology ++# ++# This program is free software; you can redistribute it and/or modify it ++# under the terms and conditions of the GNU General Public License, ++# version 2 or later, as published by the Free Software Foundation. ++# ++# This program is distributed in the hope it will be useful, but WITHOUT ++# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++# more details. ++# ++# You should have received a copy of the GNU General Public License along with ++# this program. If not, see . ++# ++ ++# Fields ++%sd 0:2 ++%rj 5:5 ++%rd 0:5 ++%sj 5:2 ++%ptr 5:3 ++%rk 10:5 ++%sa2 15:2 ++%sa3 15:3 ++%si5 10:s5 ++%code 0:15 ++%cond 10:4 ++%cond2 0:4 ++%ui5 10:5 ++%ui6 10:6 ++%ui3 10:3 ++%ui4 10:4 ++%op 5:5 ++%ui8 10:8 ++%msbw 16:5 ++%lsbw 10:5 ++%msbd 16:6 ++%lsbd 10:6 ++%fd 0:5 ++%fj 5:5 ++%fk 10:5 ++%fcsrd 0:5 ++%fcsrs 5:5 ++%cd 0:3 ++%cj 5:3 ++%si12 10:s12 ++%ui12 10:12 ++%csr 10:14 ++%cop 0:5 ++%level 10:8 ++%seq 10:8 ++%whint 0:15 ++%addr 10:5 ++%info 5:5 ++%invop 0:5 ++%fa 15:5 ++%vd 0:5 ++%vj 5:5 ++%vk 10:5 ++%va 15:5 ++%xd 0:5 ++%xj 5:5 ++%xk 10:5 ++%xa 15:5 ++%fcond 15:5 ++%ca 15:3 ++%vui5 15:5 ++%si16 10:s16 ++%si20 5:s20 ++%si14 10:s14 ++%hint 0:5 ++%si9 10:s9 ++%si10 10:s10 ++%si11 10:s11 ++%si8 10:s8 ++%idx1 18:1 ++%idx2 18:2 ++%idx3 18:3 ++%idx4 18:4 ++%idx 18:5 ++%offs21 0:s5 10:16 ++%offs16 10:s16 ++%offs 0:s10 10:16 ++%mode 5:5 ++%ui2 10:2 ++%ui1 10:1 ++%ui7 10:7 ++%i13 5:13 ++ ++# Argument sets ++&fmt_sdrj sd rj ++&fmt_rdsj rd sj ++&fmt_rdrj rd rj ++&fmt_empty ++&fmt_rjrk rj rk ++&fmt_rdrjrksa2 rd rj rk sa2 ++&fmt_rdrjrksa3 rd rj rk sa3 ++&fmt_rdrjrk rd rj rk ++&fmt_code code ++&fmt_rdrjui5 rd rj ui5 ++&fmt_rdrjui6 rd rj ui6 ++&fmt_rdrjmsbwlsbw rd rj msbw lsbw ++&fmt_rdrjmsbdlsbd rd rj msbd lsbd ++&fmt_fdfjfk fd fj fk ++&fmt_fdfj fd fj ++&fmt_fdrj fd rj ++&fmt_rdfj rd fj ++&fmt_fcsrdrj fcsrd rj ++&fmt_rdfcsrs rd fcsrs ++&fmt_cdfj cd fj ++&fmt_fdcj fd cj ++&fmt_cdrj cd rj ++&fmt_rdcj rd cj ++&fmt_rdrjsi12 rd rj si12 ++&fmt_rdrjui12 rd rj ui12 ++&fmt_rdrjcsr rd rj csr ++&fmt_coprjsi12 cop rj si12 ++&fmt_rdrjlevel rd rj level ++&fmt_rjseq rj seq ++&fmt_whint whint ++&fmt_invtlb addr info invop ++&fmt_fdfjfkfa fd fj fk fa ++&fmt_cdfjfkfcond cd fj fk fcond ++&fmt_fdfjfkca fd fj fk ca ++&fmt_rdrjsi16 rd rj si16 ++&fmt_rdsi20 rd si20 ++&fmt_rdrjsi14 rd rj si14 ++&fmt_hintrjsi12 hint rj si12 ++&fmt_fdrjsi12 fd rj si12 ++&fmt_fdrjrk fd rj rk ++&fmt_rjoffs21 rj offs21 ++&fmt_cjoffs21 cj offs21 ++&fmt_rdrjoffs16 rd rj offs16 ++&fmt_offs offs ++&fmt_rjrdoffs16 rj rd offs16 ++ ++# Formats ++@fmt_sdrj .... ........ ..... ..... ..... ... .. &fmt_sdrj %sd %rj ++@fmt_rdsj .... ........ ..... ..... ... .. ..... &fmt_rdsj %rd %sj ++@fmt_rdrj .... ........ ..... ..... ..... ..... &fmt_rdrj %rd %rj ++@fmt_empty .... ........ ..... ..... ..... ..... &fmt_empty ++@fmt_rjrk .... ........ ..... ..... ..... ..... &fmt_rjrk %rj %rk ++@fmt_rdrjrksa2 .... ........ ... .. ..... ..... ..... &fmt_rdrjrksa2 %rd %rj %rk %sa2 ++@fmt_rdrjrksa3 .... ........ .. ... ..... ..... ..... &fmt_rdrjrksa3 %rd %rj %rk %sa3 ++@fmt_rdrjrk .... ........ ..... ..... ..... ..... &fmt_rdrjrk %rd %rj %rk ++@fmt_code .... ........ ..... ............... &fmt_code %code ++@fmt_rdrjui5 .... ........ ..... ..... ..... ..... &fmt_rdrjui5 %rd %rj %ui5 ++@fmt_rdrjui6 .... ........ .... ...... ..... ..... &fmt_rdrjui6 %rd %rj %ui6 ++@fmt_rdrjmsbwlsbw .... ....... ..... . ..... ..... ..... &fmt_rdrjmsbwlsbw %rd %rj %msbw %lsbw ++@fmt_rdrjmsbdlsbd .... ...... ...... ...... ..... ..... &fmt_rdrjmsbdlsbd %rd %rj %msbd %lsbd ++@fmt_fdfjfk .... ........ ..... ..... ..... ..... &fmt_fdfjfk %fd %fj %fk ++@fmt_fdfj .... ........ ..... ..... ..... ..... &fmt_fdfj %fd %fj ++@fmt_fdrj .... ........ ..... ..... ..... ..... &fmt_fdrj %fd %rj ++@fmt_rdfj .... ........ ..... ..... ..... ..... &fmt_rdfj %rd %fj ++@fmt_fcsrdrj .... ........ ..... ..... ..... ..... &fmt_fcsrdrj %fcsrd %rj ++@fmt_rdfcsrs .... ........ ..... ..... ..... ..... &fmt_rdfcsrs %rd %fcsrs ++@fmt_cdfj .... ........ ..... ..... ..... .. ... &fmt_cdfj %cd %fj ++@fmt_fdcj .... ........ ..... ..... .. ... ..... &fmt_fdcj %fd %cj ++@fmt_cdrj .... ........ ..... ..... ..... .. ... &fmt_cdrj %cd %rj ++@fmt_rdcj .... ........ ..... ..... .. ... ..... &fmt_rdcj %rd %cj ++@fmt_rdrjsi12 .... ...... ............ ..... ..... &fmt_rdrjsi12 %rd %rj %si12 ++@fmt_rdrjui12 .... ...... ............ ..... ..... &fmt_rdrjui12 %rd %rj %ui12 ++@fmt_rdrjcsr .... .... .............. ..... ..... &fmt_rdrjcsr %rd %rj %csr ++@fmt_coprjsi12 .... ...... ............ ..... ..... &fmt_coprjsi12 %cop %rj %si12 ++@fmt_rdrjlevel .... ........ .. ........ ..... ..... &fmt_rdrjlevel %rd %rj %level ++@fmt_rjseq .... ........ .. ........ ..... ..... &fmt_rjseq %rj %seq ++@fmt_whint .... ........ ..... ............... &fmt_whint %whint ++@fmt_invtlb ...... ...... ..... ..... ..... ..... &fmt_invtlb %addr %info %invop ++@fmt_fdfjfkfa .... ........ ..... ..... ..... ..... &fmt_fdfjfkfa %fd %fj %fk %fa ++@fmt_cdfjfkfcond .... ........ ..... ..... ..... .. ... &fmt_cdfjfkfcond %cd %fj %fk %fcond ++@fmt_fdfjfkca .... ........ .. ... ..... ..... ..... &fmt_fdfjfkca %fd %fj %fk %ca ++@fmt_rdrjsi16 .... .. ................ ..... ..... &fmt_rdrjsi16 %rd %rj %si16 ++@fmt_rdsi20 .... ... .................... ..... &fmt_rdsi20 %rd %si20 ++@fmt_rdrjsi14 .... .... .............. ..... ..... &fmt_rdrjsi14 %rd %rj %si14 ++@fmt_hintrjsi12 .... ...... ............ ..... ..... &fmt_hintrjsi12 %hint %rj %si12 ++@fmt_fdrjsi12 .... ...... ............ ..... ..... &fmt_fdrjsi12 %fd %rj %si12 ++@fmt_fdrjrk .... ........ ..... ..... ..... ..... &fmt_fdrjrk %fd %rj %rk ++@fmt_rjoffs21 .... .. ................ ..... ..... &fmt_rjoffs21 %rj %offs21 ++@fmt_cjoffs21 .... .. ................ .. ... ..... &fmt_cjoffs21 %cj %offs21 ++@fmt_rdrjoffs16 .... .. ................ ..... ..... &fmt_rdrjoffs16 %rd %rj %offs16 ++@fmt_offs .... .. .......................... &fmt_offs %offs ++@fmt_rjrdoffs16 .... .. ................ ..... ..... &fmt_rjrdoffs16 %rj %rd %offs16 ++ ++# Instructions ++ ++# Fiexd point arithmetic Instructions ++gr2scr 0000 00000000 00000 00010 ..... 000 .. @fmt_sdrj ++scr2gr 0000 00000000 00000 00011 000 .. ..... @fmt_rdsj ++clo_w 0000 00000000 00000 00100 ..... ..... @fmt_rdrj ++clz_w 0000 00000000 00000 00101 ..... ..... @fmt_rdrj ++cto_w 0000 00000000 00000 00110 ..... ..... @fmt_rdrj ++ctz_w 0000 00000000 00000 00111 ..... ..... @fmt_rdrj ++clo_d 0000 00000000 00000 01000 ..... ..... @fmt_rdrj ++clz_d 0000 00000000 00000 01001 ..... ..... @fmt_rdrj ++cto_d 0000 00000000 00000 01010 ..... ..... @fmt_rdrj ++ctz_d 0000 00000000 00000 01011 ..... ..... @fmt_rdrj ++revb_2h 0000 00000000 00000 01100 ..... ..... @fmt_rdrj ++revb_4h 0000 00000000 00000 01101 ..... ..... @fmt_rdrj ++revb_2w 0000 00000000 00000 01110 ..... ..... @fmt_rdrj ++revb_d 0000 00000000 00000 01111 ..... ..... @fmt_rdrj ++revh_2w 0000 00000000 00000 10000 ..... ..... @fmt_rdrj ++revh_d 0000 00000000 00000 10001 ..... ..... @fmt_rdrj ++bitrev_4b 0000 00000000 00000 10010 ..... ..... @fmt_rdrj ++bitrev_8b 0000 00000000 00000 10011 ..... ..... @fmt_rdrj ++bitrev_w 0000 00000000 00000 10100 ..... ..... @fmt_rdrj ++bitrev_d 0000 00000000 00000 10101 ..... ..... @fmt_rdrj ++ext_w_h 0000 00000000 00000 10110 ..... ..... @fmt_rdrj ++ext_w_b 0000 00000000 00000 10111 ..... ..... @fmt_rdrj ++rdtime_d 0000 00000000 00000 11010 ..... ..... @fmt_rdrj ++cpucfg 0000 00000000 00000 11011 ..... ..... @fmt_rdrj ++asrtle_d 0000 00000000 00010 ..... ..... 00000 @fmt_rjrk ++asrtgt_d 0000 00000000 00011 ..... ..... 00000 @fmt_rjrk ++alsl_w 0000 00000000 010 .. ..... ..... ..... @fmt_rdrjrksa2 ++alsl_wu 0000 00000000 011 .. ..... ..... ..... @fmt_rdrjrksa2 ++bytepick_w 0000 00000000 100 .. ..... ..... ..... @fmt_rdrjrksa2 ++bytepick_d 0000 00000000 11 ... ..... ..... ..... @fmt_rdrjrksa3 ++add_w 0000 00000001 00000 ..... ..... ..... @fmt_rdrjrk ++add_d 0000 00000001 00001 ..... ..... ..... @fmt_rdrjrk ++sub_w 0000 00000001 00010 ..... ..... ..... @fmt_rdrjrk ++sub_d 0000 00000001 00011 ..... ..... ..... @fmt_rdrjrk ++slt 0000 00000001 00100 ..... ..... ..... @fmt_rdrjrk ++sltu 0000 00000001 00101 ..... ..... ..... @fmt_rdrjrk ++maskeqz 0000 00000001 00110 ..... ..... ..... @fmt_rdrjrk ++masknez 0000 00000001 00111 ..... ..... ..... @fmt_rdrjrk ++nor 0000 00000001 01000 ..... ..... ..... @fmt_rdrjrk ++and 0000 00000001 01001 ..... ..... ..... @fmt_rdrjrk ++or 0000 00000001 01010 ..... ..... ..... @fmt_rdrjrk ++xor 0000 00000001 01011 ..... ..... ..... @fmt_rdrjrk ++orn 0000 00000001 01100 ..... ..... ..... @fmt_rdrjrk ++andn 0000 00000001 01101 ..... ..... ..... @fmt_rdrjrk ++sll_w 0000 00000001 01110 ..... ..... ..... @fmt_rdrjrk ++srl_w 0000 00000001 01111 ..... ..... ..... @fmt_rdrjrk ++sra_w 0000 00000001 10000 ..... ..... ..... @fmt_rdrjrk ++sll_d 0000 00000001 10001 ..... ..... ..... @fmt_rdrjrk ++srl_d 0000 00000001 10010 ..... ..... ..... @fmt_rdrjrk ++sra_d 0000 00000001 10011 ..... ..... ..... @fmt_rdrjrk ++rotr_w 0000 00000001 10110 ..... ..... ..... @fmt_rdrjrk ++rotr_d 0000 00000001 10111 ..... ..... ..... @fmt_rdrjrk ++mul_w 0000 00000001 11000 ..... ..... ..... @fmt_rdrjrk ++mulh_w 0000 00000001 11001 ..... ..... ..... @fmt_rdrjrk ++mulh_wu 0000 00000001 11010 ..... ..... ..... @fmt_rdrjrk ++mul_d 0000 00000001 11011 ..... ..... ..... @fmt_rdrjrk ++mulh_d 0000 00000001 11100 ..... ..... ..... @fmt_rdrjrk ++mulh_du 0000 00000001 11101 ..... ..... ..... @fmt_rdrjrk ++mulw_d_w 0000 00000001 11110 ..... ..... ..... @fmt_rdrjrk ++mulw_d_wu 0000 00000001 11111 ..... ..... ..... @fmt_rdrjrk ++div_w 0000 00000010 00000 ..... ..... ..... @fmt_rdrjrk ++mod_w 0000 00000010 00001 ..... ..... ..... @fmt_rdrjrk ++div_wu 0000 00000010 00010 ..... ..... ..... @fmt_rdrjrk ++mod_wu 0000 00000010 00011 ..... ..... ..... @fmt_rdrjrk ++div_d 0000 00000010 00100 ..... ..... ..... @fmt_rdrjrk ++mod_d 0000 00000010 00101 ..... ..... ..... @fmt_rdrjrk ++div_du 0000 00000010 00110 ..... ..... ..... @fmt_rdrjrk ++mod_du 0000 00000010 00111 ..... ..... ..... @fmt_rdrjrk ++crc_w_b_w 0000 00000010 01000 ..... ..... ..... @fmt_rdrjrk ++crc_w_h_w 0000 00000010 01001 ..... ..... ..... @fmt_rdrjrk ++crc_w_w_w 0000 00000010 01010 ..... ..... ..... @fmt_rdrjrk ++crc_w_d_w 0000 00000010 01011 ..... ..... ..... @fmt_rdrjrk ++crcc_w_b_w 0000 00000010 01100 ..... ..... ..... @fmt_rdrjrk ++crcc_w_h_w 0000 00000010 01101 ..... ..... ..... @fmt_rdrjrk ++crcc_w_w_w 0000 00000010 01110 ..... ..... ..... @fmt_rdrjrk ++crcc_w_d_w 0000 00000010 01111 ..... ..... ..... @fmt_rdrjrk ++break 0000 00000010 10100 ............... @fmt_code ++dbcl 0000 00000010 10101 ............... @fmt_code ++syscall 0000 00000010 10110 ............... @fmt_code ++alsl_d 0000 00000010 110 .. ..... ..... ..... @fmt_rdrjrksa2 ++slli_w 0000 00000100 00001 ..... ..... ..... @fmt_rdrjui5 ++slli_d 0000 00000100 0001 ...... ..... ..... @fmt_rdrjui6 ++srli_w 0000 00000100 01001 ..... ..... ..... @fmt_rdrjui5 ++srli_d 0000 00000100 0101 ...... ..... ..... @fmt_rdrjui6 ++srai_w 0000 00000100 10001 ..... ..... ..... @fmt_rdrjui5 ++srai_d 0000 00000100 1001 ...... ..... ..... @fmt_rdrjui6 ++rotri_w 0000 00000100 11001 ..... ..... ..... @fmt_rdrjui5 ++rotri_d 0000 00000100 1101 ...... ..... ..... @fmt_rdrjui6 ++bstrins_w 0000 0000011 ..... 0 ..... ..... ..... @fmt_rdrjmsbwlsbw ++bstrpick_w 0000 0000011 ..... 1 ..... ..... ..... @fmt_rdrjmsbwlsbw ++bstrins_d 0000 000010 ...... ...... ..... ..... @fmt_rdrjmsbdlsbd ++bstrpick_d 0000 000011 ...... ...... ..... ..... @fmt_rdrjmsbdlsbd ++ ++# float Instructions ++fadd_s 0000 00010000 00001 ..... ..... ..... @fmt_fdfjfk ++fadd_d 0000 00010000 00010 ..... ..... ..... @fmt_fdfjfk ++fsub_s 0000 00010000 00101 ..... ..... ..... @fmt_fdfjfk ++fsub_d 0000 00010000 00110 ..... ..... ..... @fmt_fdfjfk ++fmul_s 0000 00010000 01001 ..... ..... ..... @fmt_fdfjfk ++fmul_d 0000 00010000 01010 ..... ..... ..... @fmt_fdfjfk ++fdiv_s 0000 00010000 01101 ..... ..... ..... @fmt_fdfjfk ++fdiv_d 0000 00010000 01110 ..... ..... ..... @fmt_fdfjfk ++fmax_s 0000 00010000 10001 ..... ..... ..... @fmt_fdfjfk ++fmax_d 0000 00010000 10010 ..... ..... ..... @fmt_fdfjfk ++fmin_s 0000 00010000 10101 ..... ..... ..... @fmt_fdfjfk ++fmin_d 0000 00010000 10110 ..... ..... ..... @fmt_fdfjfk ++fmaxa_s 0000 00010000 11001 ..... ..... ..... @fmt_fdfjfk ++fmaxa_d 0000 00010000 11010 ..... ..... ..... @fmt_fdfjfk ++fmina_s 0000 00010000 11101 ..... ..... ..... @fmt_fdfjfk ++fmina_d 0000 00010000 11110 ..... ..... ..... @fmt_fdfjfk ++fscaleb_s 0000 00010001 00001 ..... ..... ..... @fmt_fdfjfk ++fscaleb_d 0000 00010001 00010 ..... ..... ..... @fmt_fdfjfk ++fcopysign_s 0000 00010001 00101 ..... ..... ..... @fmt_fdfjfk ++fcopysign_d 0000 00010001 00110 ..... ..... ..... @fmt_fdfjfk ++fabs_s 0000 00010001 01000 00001 ..... ..... @fmt_fdfj ++fabs_d 0000 00010001 01000 00010 ..... ..... @fmt_fdfj ++fneg_s 0000 00010001 01000 00101 ..... ..... @fmt_fdfj ++fneg_d 0000 00010001 01000 00110 ..... ..... @fmt_fdfj ++flogb_s 0000 00010001 01000 01001 ..... ..... @fmt_fdfj ++flogb_d 0000 00010001 01000 01010 ..... ..... @fmt_fdfj ++fclass_s 0000 00010001 01000 01101 ..... ..... @fmt_fdfj ++fclass_d 0000 00010001 01000 01110 ..... ..... @fmt_fdfj ++fsqrt_s 0000 00010001 01000 10001 ..... ..... @fmt_fdfj ++fsqrt_d 0000 00010001 01000 10010 ..... ..... @fmt_fdfj ++frecip_s 0000 00010001 01000 10101 ..... ..... @fmt_fdfj ++frecip_d 0000 00010001 01000 10110 ..... ..... @fmt_fdfj ++frsqrt_s 0000 00010001 01000 11001 ..... ..... @fmt_fdfj ++frsqrt_d 0000 00010001 01000 11010 ..... ..... @fmt_fdfj ++fmov_s 0000 00010001 01001 00101 ..... ..... @fmt_fdfj ++fmov_d 0000 00010001 01001 00110 ..... ..... @fmt_fdfj ++movgr2fr_w 0000 00010001 01001 01001 ..... ..... @fmt_fdrj ++movgr2fr_d 0000 00010001 01001 01010 ..... ..... @fmt_fdrj ++movgr2frh_w 0000 00010001 01001 01011 ..... ..... @fmt_fdrj ++movfr2gr_s 0000 00010001 01001 01101 ..... ..... @fmt_rdfj ++movfr2gr_d 0000 00010001 01001 01110 ..... ..... @fmt_rdfj ++movfrh2gr_s 0000 00010001 01001 01111 ..... ..... @fmt_rdfj ++movgr2fcsr 0000 00010001 01001 10000 ..... ..... @fmt_fcsrdrj ++movfcsr2gr 0000 00010001 01001 10010 ..... ..... @fmt_rdfcsrs ++movfr2cf 0000 00010001 01001 10100 ..... 00 ... @fmt_cdfj ++movcf2fr 0000 00010001 01001 10101 00 ... ..... @fmt_fdcj ++movgr2cf 0000 00010001 01001 10110 ..... 00 ... @fmt_cdrj ++movcf2gr 0000 00010001 01001 10111 00 ... ..... @fmt_rdcj ++fcvt_s_d 0000 00010001 10010 00110 ..... ..... @fmt_fdfj ++fcvt_d_s 0000 00010001 10010 01001 ..... ..... @fmt_fdfj ++ftintrm_w_s 0000 00010001 10100 00001 ..... ..... @fmt_fdfj ++ftintrm_w_d 0000 00010001 10100 00010 ..... ..... @fmt_fdfj ++ftintrm_l_s 0000 00010001 10100 01001 ..... ..... @fmt_fdfj ++ftintrm_l_d 0000 00010001 10100 01010 ..... ..... @fmt_fdfj ++ftintrp_w_s 0000 00010001 10100 10001 ..... ..... @fmt_fdfj ++ftintrp_w_d 0000 00010001 10100 10010 ..... ..... @fmt_fdfj ++ftintrp_l_s 0000 00010001 10100 11001 ..... ..... @fmt_fdfj ++ftintrp_l_d 0000 00010001 10100 11010 ..... ..... @fmt_fdfj ++ftintrz_w_s 0000 00010001 10101 00001 ..... ..... @fmt_fdfj ++ftintrz_w_d 0000 00010001 10101 00010 ..... ..... @fmt_fdfj ++ftintrz_l_s 0000 00010001 10101 01001 ..... ..... @fmt_fdfj ++ftintrz_l_d 0000 00010001 10101 01010 ..... ..... @fmt_fdfj ++ftintrne_w_s 0000 00010001 10101 10001 ..... ..... @fmt_fdfj ++ftintrne_w_d 0000 00010001 10101 10010 ..... ..... @fmt_fdfj ++ftintrne_l_s 0000 00010001 10101 11001 ..... ..... @fmt_fdfj ++ftintrne_l_d 0000 00010001 10101 11010 ..... ..... @fmt_fdfj ++ftint_w_s 0000 00010001 10110 00001 ..... ..... @fmt_fdfj ++ftint_w_d 0000 00010001 10110 00010 ..... ..... @fmt_fdfj ++ftint_l_s 0000 00010001 10110 01001 ..... ..... @fmt_fdfj ++ftint_l_d 0000 00010001 10110 01010 ..... ..... @fmt_fdfj ++ffint_s_w 0000 00010001 11010 00100 ..... ..... @fmt_fdfj ++ffint_s_l 0000 00010001 11010 00110 ..... ..... @fmt_fdfj ++ffint_d_w 0000 00010001 11010 01000 ..... ..... @fmt_fdfj ++ffint_d_l 0000 00010001 11010 01010 ..... ..... @fmt_fdfj ++frint_s 0000 00010001 11100 10001 ..... ..... @fmt_fdfj ++frint_d 0000 00010001 11100 10010 ..... ..... @fmt_fdfj ++ ++# 12 bit immediate Instructions ++slti 0000 001000 ............ ..... ..... @fmt_rdrjsi12 ++sltui 0000 001001 ............ ..... ..... @fmt_rdrjsi12 ++addi_w 0000 001010 ............ ..... ..... @fmt_rdrjsi12 ++addi_d 0000 001011 ............ ..... ..... @fmt_rdrjsi12 ++lu52i_d 0000 001100 ............ ..... ..... @fmt_rdrjsi12 ++andi 0000 001101 ............ ..... ..... @fmt_rdrjui12 ++ori 0000 001110 ............ ..... ..... @fmt_rdrjui12 ++xori 0000 001111 ............ ..... ..... @fmt_rdrjui12 ++ ++# core Instructions ++csrxchg 0000 0100 .............. ..... ..... @fmt_rdrjcsr ++cacop 0000 011000 ............ ..... ..... @fmt_coprjsi12 ++lddir 0000 01100100 00 ........ ..... ..... @fmt_rdrjlevel ++ldpte 0000 01100100 01 ........ ..... 00000 @fmt_rjseq ++iocsrrd_b 0000 01100100 10000 00000 ..... ..... @fmt_rdrj ++iocsrrd_h 0000 01100100 10000 00001 ..... ..... @fmt_rdrj ++iocsrrd_w 0000 01100100 10000 00010 ..... ..... @fmt_rdrj ++iocsrrd_d 0000 01100100 10000 00011 ..... ..... @fmt_rdrj ++iocsrwr_b 0000 01100100 10000 00100 ..... ..... @fmt_rdrj ++iocsrwr_h 0000 01100100 10000 00101 ..... ..... @fmt_rdrj ++iocsrwr_w 0000 01100100 10000 00110 ..... ..... @fmt_rdrj ++iocsrwr_d 0000 01100100 10000 00111 ..... ..... @fmt_rdrj ++tlbclr 0000 01100100 10000 01000 00000 00000 @fmt_empty ++tlbflush 0000 01100100 10000 01001 00000 00000 @fmt_empty ++tlbsrch 0000 01100100 10000 01010 00000 00000 @fmt_empty ++tlbrd 0000 01100100 10000 01011 00000 00000 @fmt_empty ++tlbwr 0000 01100100 10000 01100 00000 00000 @fmt_empty ++tlbfill 0000 01100100 10000 01101 00000 00000 @fmt_empty ++ertn 0000 01100100 10000 01110 00000 00000 @fmt_empty ++idle 0000 01100100 10001 ............... @fmt_whint ++invtlb 0000 01100100 10011 ..... ..... ..... @fmt_invtlb ++ ++# foure Op Instructions ++fmadd_s 0000 10000001 ..... ..... ..... ..... @fmt_fdfjfkfa ++fmadd_d 0000 10000010 ..... ..... ..... ..... @fmt_fdfjfkfa ++fmsub_s 0000 10000101 ..... ..... ..... ..... @fmt_fdfjfkfa ++fmsub_d 0000 10000110 ..... ..... ..... ..... @fmt_fdfjfkfa ++fnmadd_s 0000 10001001 ..... ..... ..... ..... @fmt_fdfjfkfa ++fnmadd_d 0000 10001010 ..... ..... ..... ..... @fmt_fdfjfkfa ++fnmsub_s 0000 10001101 ..... ..... ..... ..... @fmt_fdfjfkfa ++fnmsub_d 0000 10001110 ..... ..... ..... ..... @fmt_fdfjfkfa ++fcmp_cond_s 0000 11000001 ..... ..... ..... 00 ... @fmt_cdfjfkfcond ++fcmp_cond_d 0000 11000010 ..... ..... ..... 00 ... @fmt_cdfjfkfcond ++fsel 0000 11010000 00 ... ..... ..... ..... @fmt_fdfjfkca ++ ++# loog immediate Instructions ++addu16i_d 0001 00 ................ ..... ..... @fmt_rdrjsi16 ++lu12i_w 0001 010 .................... ..... @fmt_rdsi20 ++lu32i_d 0001 011 .................... ..... @fmt_rdsi20 ++pcaddi 0001 100 .................... ..... @fmt_rdsi20 ++pcalau12i 0001 101 .................... ..... @fmt_rdsi20 ++pcaddu12i 0001 110 .................... ..... @fmt_rdsi20 ++pcaddu18i 0001 111 .................... ..... @fmt_rdsi20 ++ ++# load/store Instructions ++ll_w 0010 0000 .............. ..... ..... @fmt_rdrjsi14 ++sc_w 0010 0001 .............. ..... ..... @fmt_rdrjsi14 ++ll_d 0010 0010 .............. ..... ..... @fmt_rdrjsi14 ++sc_d 0010 0011 .............. ..... ..... @fmt_rdrjsi14 ++ldptr_w 0010 0100 .............. ..... ..... @fmt_rdrjsi14 ++stptr_w 0010 0101 .............. ..... ..... @fmt_rdrjsi14 ++ldptr_d 0010 0110 .............. ..... ..... @fmt_rdrjsi14 ++stptr_d 0010 0111 .............. ..... ..... @fmt_rdrjsi14 ++ld_b 0010 100000 ............ ..... ..... @fmt_rdrjsi12 ++ld_h 0010 100001 ............ ..... ..... @fmt_rdrjsi12 ++ld_w 0010 100010 ............ ..... ..... @fmt_rdrjsi12 ++ld_d 0010 100011 ............ ..... ..... @fmt_rdrjsi12 ++st_b 0010 100100 ............ ..... ..... @fmt_rdrjsi12 ++st_h 0010 100101 ............ ..... ..... @fmt_rdrjsi12 ++st_w 0010 100110 ............ ..... ..... @fmt_rdrjsi12 ++st_d 0010 100111 ............ ..... ..... @fmt_rdrjsi12 ++ld_bu 0010 101000 ............ ..... ..... @fmt_rdrjsi12 ++ld_hu 0010 101001 ............ ..... ..... @fmt_rdrjsi12 ++ld_wu 0010 101010 ............ ..... ..... @fmt_rdrjsi12 ++preld 0010 101011 ............ ..... ..... @fmt_hintrjsi12 ++fld_s 0010 101100 ............ ..... ..... @fmt_fdrjsi12 ++fst_s 0010 101101 ............ ..... ..... @fmt_fdrjsi12 ++fld_d 0010 101110 ............ ..... ..... @fmt_fdrjsi12 ++fst_d 0010 101111 ............ ..... ..... @fmt_fdrjsi12 ++ldx_b 0011 10000000 00000 ..... ..... ..... @fmt_rdrjrk ++ldx_h 0011 10000000 01000 ..... ..... ..... @fmt_rdrjrk ++ldx_w 0011 10000000 10000 ..... ..... ..... @fmt_rdrjrk ++ldx_d 0011 10000000 11000 ..... ..... ..... @fmt_rdrjrk ++stx_b 0011 10000001 00000 ..... ..... ..... @fmt_rdrjrk ++stx_h 0011 10000001 01000 ..... ..... ..... @fmt_rdrjrk ++stx_w 0011 10000001 10000 ..... ..... ..... @fmt_rdrjrk ++stx_d 0011 10000001 11000 ..... ..... ..... @fmt_rdrjrk ++ldx_bu 0011 10000010 00000 ..... ..... ..... @fmt_rdrjrk ++ldx_hu 0011 10000010 01000 ..... ..... ..... @fmt_rdrjrk ++ldx_wu 0011 10000010 10000 ..... ..... ..... @fmt_rdrjrk ++fldx_s 0011 10000011 00000 ..... ..... ..... @fmt_fdrjrk ++fldx_d 0011 10000011 01000 ..... ..... ..... @fmt_fdrjrk ++fstx_s 0011 10000011 10000 ..... ..... ..... @fmt_fdrjrk ++fstx_d 0011 10000011 11000 ..... ..... ..... @fmt_fdrjrk ++amswap_w 0011 10000110 00000 ..... ..... ..... @fmt_rdrjrk ++amswap_d 0011 10000110 00001 ..... ..... ..... @fmt_rdrjrk ++amadd_w 0011 10000110 00010 ..... ..... ..... @fmt_rdrjrk ++amadd_d 0011 10000110 00011 ..... ..... ..... @fmt_rdrjrk ++amand_w 0011 10000110 00100 ..... ..... ..... @fmt_rdrjrk ++amand_d 0011 10000110 00101 ..... ..... ..... @fmt_rdrjrk ++amor_w 0011 10000110 00110 ..... ..... ..... @fmt_rdrjrk ++amor_d 0011 10000110 00111 ..... ..... ..... @fmt_rdrjrk ++amxor_w 0011 10000110 01000 ..... ..... ..... @fmt_rdrjrk ++amxor_d 0011 10000110 01001 ..... ..... ..... @fmt_rdrjrk ++ammax_w 0011 10000110 01010 ..... ..... ..... @fmt_rdrjrk ++ammax_d 0011 10000110 01011 ..... ..... ..... @fmt_rdrjrk ++ammin_w 0011 10000110 01100 ..... ..... ..... @fmt_rdrjrk ++ammin_d 0011 10000110 01101 ..... ..... ..... @fmt_rdrjrk ++ammax_wu 0011 10000110 01110 ..... ..... ..... @fmt_rdrjrk ++ammax_du 0011 10000110 01111 ..... ..... ..... @fmt_rdrjrk ++ammin_wu 0011 10000110 10000 ..... ..... ..... @fmt_rdrjrk ++ammin_du 0011 10000110 10001 ..... ..... ..... @fmt_rdrjrk ++amswap_db_w 0011 10000110 10010 ..... ..... ..... @fmt_rdrjrk ++amswap_db_d 0011 10000110 10011 ..... ..... ..... @fmt_rdrjrk ++amadd_db_w 0011 10000110 10100 ..... ..... ..... @fmt_rdrjrk ++amadd_db_d 0011 10000110 10101 ..... ..... ..... @fmt_rdrjrk ++amand_db_w 0011 10000110 10110 ..... ..... ..... @fmt_rdrjrk ++amand_db_d 0011 10000110 10111 ..... ..... ..... @fmt_rdrjrk ++amor_db_w 0011 10000110 11000 ..... ..... ..... @fmt_rdrjrk ++amor_db_d 0011 10000110 11001 ..... ..... ..... @fmt_rdrjrk ++amxor_db_w 0011 10000110 11010 ..... ..... ..... @fmt_rdrjrk ++amxor_db_d 0011 10000110 11011 ..... ..... ..... @fmt_rdrjrk ++ammax_db_w 0011 10000110 11100 ..... ..... ..... @fmt_rdrjrk ++ammax_db_d 0011 10000110 11101 ..... ..... ..... @fmt_rdrjrk ++ammin_db_w 0011 10000110 11110 ..... ..... ..... @fmt_rdrjrk ++ammin_db_d 0011 10000110 11111 ..... ..... ..... @fmt_rdrjrk ++ammax_db_wu 0011 10000111 00000 ..... ..... ..... @fmt_rdrjrk ++ammax_db_du 0011 10000111 00001 ..... ..... ..... @fmt_rdrjrk ++ammin_db_wu 0011 10000111 00010 ..... ..... ..... @fmt_rdrjrk ++ammin_db_du 0011 10000111 00011 ..... ..... ..... @fmt_rdrjrk ++dbar 0011 10000111 00100 ............... @fmt_whint ++ibar 0011 10000111 00101 ............... @fmt_whint ++fldgt_s 0011 10000111 01000 ..... ..... ..... @fmt_fdrjrk ++fldgt_d 0011 10000111 01001 ..... ..... ..... @fmt_fdrjrk ++fldle_s 0011 10000111 01010 ..... ..... ..... @fmt_fdrjrk ++fldle_d 0011 10000111 01011 ..... ..... ..... @fmt_fdrjrk ++fstgt_s 0011 10000111 01100 ..... ..... ..... @fmt_fdrjrk ++fstgt_d 0011 10000111 01101 ..... ..... ..... @fmt_fdrjrk ++fstle_s 0011 10000111 01110 ..... ..... ..... @fmt_fdrjrk ++fstle_d 0011 10000111 01111 ..... ..... ..... @fmt_fdrjrk ++ldgt_b 0011 10000111 10000 ..... ..... ..... @fmt_rdrjrk ++ldgt_h 0011 10000111 10001 ..... ..... ..... @fmt_rdrjrk ++ldgt_w 0011 10000111 10010 ..... ..... ..... @fmt_rdrjrk ++ldgt_d 0011 10000111 10011 ..... ..... ..... @fmt_rdrjrk ++ldle_b 0011 10000111 10100 ..... ..... ..... @fmt_rdrjrk ++ldle_h 0011 10000111 10101 ..... ..... ..... @fmt_rdrjrk ++ldle_w 0011 10000111 10110 ..... ..... ..... @fmt_rdrjrk ++ldle_d 0011 10000111 10111 ..... ..... ..... @fmt_rdrjrk ++stgt_b 0011 10000111 11000 ..... ..... ..... @fmt_rdrjrk ++stgt_h 0011 10000111 11001 ..... ..... ..... @fmt_rdrjrk ++stgt_w 0011 10000111 11010 ..... ..... ..... @fmt_rdrjrk ++stgt_d 0011 10000111 11011 ..... ..... ..... @fmt_rdrjrk ++stle_b 0011 10000111 11100 ..... ..... ..... @fmt_rdrjrk ++stle_h 0011 10000111 11101 ..... ..... ..... @fmt_rdrjrk ++stle_w 0011 10000111 11110 ..... ..... ..... @fmt_rdrjrk ++stle_d 0011 10000111 11111 ..... ..... ..... @fmt_rdrjrk ++ ++# jump Instructions ++beqz 0100 00 ................ ..... ..... @fmt_rjoffs21 ++bnez 0100 01 ................ ..... ..... @fmt_rjoffs21 ++bceqz 0100 10 ................ 00 ... ..... @fmt_cjoffs21 ++bcnez 0100 10 ................ 01 ... ..... @fmt_cjoffs21 ++jirl 0100 11 ................ ..... ..... @fmt_rdrjoffs16 ++b 0101 00 .......................... @fmt_offs ++bl 0101 01 .......................... @fmt_offs ++beq 0101 10 ................ ..... ..... @fmt_rjrdoffs16 ++bne 0101 11 ................ ..... ..... @fmt_rjrdoffs16 ++blt 0110 00 ................ ..... ..... @fmt_rjrdoffs16 ++bge 0110 01 ................ ..... ..... @fmt_rjrdoffs16 ++bltu 0110 10 ................ ..... ..... @fmt_rjrdoffs16 ++bgeu 0110 11 ................ ..... ..... @fmt_rjrdoffs16 +diff --git a/target/loongarch64/instmap.h b/target/loongarch64/instmap.h +new file mode 100644 +index 0000000000..5fbb8b5d29 +--- /dev/null ++++ b/target/loongarch64/instmap.h +@@ -0,0 +1,217 @@ ++/* ++ * Loongarch emulation for qemu: instruction opcode ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef TARGET_LARCH_INSTMAP_H ++#define TARGET_LARCH_INSTMAP_H ++ ++enum { ++ /* fix opcodes */ ++ OPC_LARCH_CLO_W = (0x000004 << 10), ++ OPC_LARCH_CLZ_W = (0x000005 << 10), ++ OPC_LARCH_CLO_D = (0x000008 << 10), ++ OPC_LARCH_CLZ_D = (0x000009 << 10), ++ OPC_LARCH_REVB_2H = (0x00000C << 10), ++ OPC_LARCH_REVB_4H = (0x00000D << 10), ++ OPC_LARCH_REVH_D = (0x000011 << 10), ++ OPC_LARCH_BREV_4B = (0x000012 << 10), ++ OPC_LARCH_BREV_8B = (0x000013 << 10), ++ OPC_LARCH_EXT_WH = (0x000016 << 10), ++ OPC_LARCH_EXT_WB = (0x000017 << 10), ++ ++ OPC_LARCH_ADD_W = (0x00020 << 15), ++ OPC_LARCH_ADD_D = (0x00021 << 15), ++ OPC_LARCH_SUB_W = (0x00022 << 15), ++ OPC_LARCH_SUB_D = (0x00023 << 15), ++ OPC_LARCH_SLT = (0x00024 << 15), ++ OPC_LARCH_SLTU = (0x00025 << 15), ++ OPC_LARCH_MASKEQZ = (0x00026 << 15), ++ OPC_LARCH_MASKNEZ = (0x00027 << 15), ++ OPC_LARCH_NOR = (0x00028 << 15), ++ OPC_LARCH_AND = (0x00029 << 15), ++ OPC_LARCH_OR = (0x0002A << 15), ++ OPC_LARCH_XOR = (0x0002B << 15), ++ OPC_LARCH_SLL_W = (0x0002E << 15), ++ OPC_LARCH_SRL_W = (0x0002F << 15), ++ OPC_LARCH_SRA_W = (0x00030 << 15), ++ OPC_LARCH_SLL_D = (0x00031 << 15), ++ OPC_LARCH_SRL_D = (0x00032 << 15), ++ OPC_LARCH_SRA_D = (0x00033 << 15), ++ OPC_LARCH_ROTR_W = (0x00036 << 15), ++ OPC_LARCH_ROTR_D = (0x00037 << 15), ++ OPC_LARCH_MUL_W = (0x00038 << 15), ++ OPC_LARCH_MULH_W = (0x00039 << 15), ++ OPC_LARCH_MULH_WU = (0x0003A << 15), ++ OPC_LARCH_MUL_D = (0x0003B << 15), ++ OPC_LARCH_MULH_D = (0x0003C << 15), ++ OPC_LARCH_MULH_DU = (0x0003D << 15), ++ OPC_LARCH_DIV_W = (0x00040 << 15), ++ OPC_LARCH_MOD_W = (0x00041 << 15), ++ OPC_LARCH_DIV_WU = (0x00042 << 15), ++ OPC_LARCH_MOD_WU = (0x00043 << 15), ++ OPC_LARCH_DIV_D = (0x00044 << 15), ++ OPC_LARCH_MOD_D = (0x00045 << 15), ++ OPC_LARCH_DIV_DU = (0x00046 << 15), ++ OPC_LARCH_MOD_DU = (0x00047 << 15), ++ OPC_LARCH_SRLI_W = (0x00089 << 15), ++ OPC_LARCH_SRAI_W = (0x00091 << 15), ++ OPC_LARCH_ROTRI_W = (0x00099 << 15), ++ ++ OPC_LARCH_ALSL_W = (0x0002 << 17), ++ OPC_LARCH_ALSL_D = (0x0016 << 17), ++ ++ OPC_LARCH_TRINS_W = (0x003 << 21) | (0x0 << 15), ++ OPC_LARCH_TRPICK_W = (0x003 << 21) | (0x1 << 15), ++}; ++ ++enum { ++ /* float opcodes */ ++ OPC_LARCH_FABS_S = (0x004501 << 10), ++ OPC_LARCH_FABS_D = (0x004502 << 10), ++ OPC_LARCH_FNEG_S = (0x004505 << 10), ++ OPC_LARCH_FNEG_D = (0x004506 << 10), ++ OPC_LARCH_FCLASS_S = (0x00450D << 10), ++ OPC_LARCH_FCLASS_D = (0x00450E << 10), ++ OPC_LARCH_FSQRT_S = (0x004511 << 10), ++ OPC_LARCH_FSQRT_D = (0x004512 << 10), ++ OPC_LARCH_FRECIP_S = (0x004515 << 10), ++ OPC_LARCH_FRECIP_D = (0x004516 << 10), ++ OPC_LARCH_FRSQRT_S = (0x004519 << 10), ++ OPC_LARCH_FRSQRT_D = (0x00451A << 10), ++ OPC_LARCH_FMOV_S = (0x004525 << 10), ++ OPC_LARCH_FMOV_D = (0x004526 << 10), ++ OPC_LARCH_GR2FR_W = (0x004529 << 10), ++ OPC_LARCH_GR2FR_D = (0x00452A << 10), ++ OPC_LARCH_GR2FRH_W = (0x00452B << 10), ++ OPC_LARCH_FR2GR_S = (0x00452D << 10), ++ OPC_LARCH_FR2GR_D = (0x00452E << 10), ++ OPC_LARCH_FRH2GR_S = (0x00452F << 10), ++ ++ OPC_LARCH_FCVT_S_D = (0x004646 << 10), ++ OPC_LARCH_FCVT_D_S = (0x004649 << 10), ++ OPC_LARCH_FTINTRM_W_S = (0x004681 << 10), ++ OPC_LARCH_FTINTRM_W_D = (0x004682 << 10), ++ OPC_LARCH_FTINTRM_L_S = (0x004689 << 10), ++ OPC_LARCH_FTINTRM_L_D = (0x00468A << 10), ++ OPC_LARCH_FTINTRP_W_S = (0x004691 << 10), ++ OPC_LARCH_FTINTRP_W_D = (0x004692 << 10), ++ OPC_LARCH_FTINTRP_L_S = (0x004699 << 10), ++ OPC_LARCH_FTINTRP_L_D = (0x00469A << 10), ++ OPC_LARCH_FTINTRZ_W_S = (0x0046A1 << 10), ++ OPC_LARCH_FTINTRZ_W_D = (0x0046A2 << 10), ++ OPC_LARCH_FTINTRZ_L_S = (0x0046A9 << 10), ++ OPC_LARCH_FTINTRZ_L_D = (0x0046AA << 10), ++ OPC_LARCH_FTINTRNE_W_S = (0x0046B1 << 10), ++ OPC_LARCH_FTINTRNE_W_D = (0x0046B2 << 10), ++ OPC_LARCH_FTINTRNE_L_S = (0x0046B9 << 10), ++ OPC_LARCH_FTINTRNE_L_D = (0x0046BA << 10), ++ OPC_LARCH_FTINT_W_S = (0x0046C1 << 10), ++ OPC_LARCH_FTINT_W_D = (0x0046C2 << 10), ++ OPC_LARCH_FTINT_L_S = (0x0046C9 << 10), ++ OPC_LARCH_FTINT_L_D = (0x0046CA << 10), ++ OPC_LARCH_FFINT_S_W = (0x004744 << 10), ++ OPC_LARCH_FFINT_S_L = (0x004746 << 10), ++ OPC_LARCH_FFINT_D_W = (0x004748 << 10), ++ OPC_LARCH_FFINT_D_L = (0x00474A << 10), ++ OPC_LARCH_FRINT_S = (0x004791 << 10), ++ OPC_LARCH_FRINT_D = (0x004792 << 10), ++ ++ OPC_LARCH_FADD_S = (0x00201 << 15), ++ OPC_LARCH_FADD_D = (0x00202 << 15), ++ OPC_LARCH_FSUB_S = (0x00205 << 15), ++ OPC_LARCH_FSUB_D = (0x00206 << 15), ++ OPC_LARCH_FMUL_S = (0x00209 << 15), ++ OPC_LARCH_FMUL_D = (0x0020A << 15), ++ OPC_LARCH_FDIV_S = (0x0020D << 15), ++ OPC_LARCH_FDIV_D = (0x0020E << 15), ++ OPC_LARCH_FMAX_S = (0x00211 << 15), ++ OPC_LARCH_FMAX_D = (0x00212 << 15), ++ OPC_LARCH_FMIN_S = (0x00215 << 15), ++ OPC_LARCH_FMIN_D = (0x00216 << 15), ++ OPC_LARCH_FMAXA_S = (0x00219 << 15), ++ OPC_LARCH_FMAXA_D = (0x0021A << 15), ++ OPC_LARCH_FMINA_S = (0x0021D << 15), ++ OPC_LARCH_FMINA_D = (0x0021E << 15), ++}; ++ ++enum { ++ /* 12 bit immediate opcodes */ ++ OPC_LARCH_SLTI = (0x008 << 22), ++ OPC_LARCH_SLTIU = (0x009 << 22), ++ OPC_LARCH_ADDI_W = (0x00A << 22), ++ OPC_LARCH_ADDI_D = (0x00B << 22), ++ OPC_LARCH_ANDI = (0x00D << 22), ++ OPC_LARCH_ORI = (0x00E << 22), ++ OPC_LARCH_XORI = (0x00F << 22), ++}; ++ ++enum { ++ /* load/store opcodes */ ++ OPC_LARCH_FLDX_S = (0x07060 << 15), ++ OPC_LARCH_FLDX_D = (0x07068 << 15), ++ OPC_LARCH_FSTX_S = (0x07070 << 15), ++ OPC_LARCH_FSTX_D = (0x07078 << 15), ++ OPC_LARCH_FLDGT_S = (0x070E8 << 15), ++ OPC_LARCH_FLDGT_D = (0x070E9 << 15), ++ OPC_LARCH_FLDLE_S = (0x070EA << 15), ++ OPC_LARCH_FLDLE_D = (0x070EB << 15), ++ OPC_LARCH_FSTGT_S = (0x070EC << 15), ++ OPC_LARCH_FSTGT_D = (0x070ED << 15), ++ OPC_LARCH_FSTLE_S = (0x070EE << 15), ++ OPC_LARCH_FSTLE_D = (0x070EF << 15), ++ ++ OPC_LARCH_LD_B = (0x0A0 << 22), ++ OPC_LARCH_LD_H = (0x0A1 << 22), ++ OPC_LARCH_LD_W = (0x0A2 << 22), ++ OPC_LARCH_LD_D = (0x0A3 << 22), ++ OPC_LARCH_ST_B = (0x0A4 << 22), ++ OPC_LARCH_ST_H = (0x0A5 << 22), ++ OPC_LARCH_ST_W = (0x0A6 << 22), ++ OPC_LARCH_ST_D = (0x0A7 << 22), ++ OPC_LARCH_LD_BU = (0x0A8 << 22), ++ OPC_LARCH_LD_HU = (0x0A9 << 22), ++ OPC_LARCH_LD_WU = (0x0AA << 22), ++ OPC_LARCH_FLD_S = (0x0AC << 22), ++ OPC_LARCH_FST_S = (0x0AD << 22), ++ OPC_LARCH_FLD_D = (0x0AE << 22), ++ OPC_LARCH_FST_D = (0x0AF << 22), ++ ++ OPC_LARCH_LL_W = (0x20 << 24), ++ OPC_LARCH_SC_W = (0x21 << 24), ++ OPC_LARCH_LL_D = (0x22 << 24), ++ OPC_LARCH_SC_D = (0x23 << 24), ++ OPC_LARCH_LDPTR_W = (0x24 << 24), ++ OPC_LARCH_STPTR_W = (0x25 << 24), ++ OPC_LARCH_LDPTR_D = (0x26 << 24), ++ OPC_LARCH_STPTR_D = (0x27 << 24), ++}; ++ ++enum { ++ /* jump opcodes */ ++ OPC_LARCH_BEQZ = (0x10 << 26), ++ OPC_LARCH_BNEZ = (0x11 << 26), ++ OPC_LARCH_B = (0x14 << 26), ++ OPC_LARCH_BEQ = (0x16 << 26), ++ OPC_LARCH_BNE = (0x17 << 26), ++ OPC_LARCH_BLT = (0x18 << 26), ++ OPC_LARCH_BGE = (0x19 << 26), ++ OPC_LARCH_BLTU = (0x1A << 26), ++ OPC_LARCH_BGEU = (0x1B << 26), ++}; ++ ++#endif +diff --git a/target/loongarch64/internal.h b/target/loongarch64/internal.h +new file mode 100644 +index 0000000000..a51b7e6f56 +--- /dev/null ++++ b/target/loongarch64/internal.h +@@ -0,0 +1,207 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_INTERNAL_H ++#define LOONGARCH_INTERNAL_H ++ ++#include "cpu-csr.h" ++ ++/* ++ * MMU types, the first four entries have the same layout as the ++ * CP0C0_MT field. ++ */ ++enum loongarch_mmu_types { ++ MMU_TYPE_NONE, ++ MMU_TYPE_LS3A5K, /* LISA CSR */ ++}; ++ ++struct loongarch_def_t { ++ const char *name; ++ int32_t CSR_PRid; ++ int32_t FCSR0; ++ int32_t FCSR0_rw_bitmask; ++ int32_t PABITS; ++ CPU_LOONGARCH_CSR ++ uint64_t insn_flags; ++ enum loongarch_mmu_types mmu_type; ++ int cpu_cfg[64]; ++}; ++ ++/* loongarch 3a5000 TLB entry */ ++struct ls3a5k_tlb_t { ++ target_ulong VPN; ++ uint64_t PageMask; /* CSR_TLBIDX[29:24] */ ++ uint32_t PageSize; ++ uint16_t ASID; ++ unsigned int G:1; /* CSR_TLBLO[6] */ ++ ++ unsigned int C0:3; /* CSR_TLBLO[5:4] */ ++ unsigned int C1:3; ++ ++ unsigned int V0:1; /* CSR_TLBLO[0] */ ++ unsigned int V1:1; ++ ++ unsigned int WE0:1; /* CSR_TLBLO[1] */ ++ unsigned int WE1:1; ++ ++ unsigned int XI0:1; /* CSR_TLBLO[62] */ ++ unsigned int XI1:1; ++ ++ unsigned int RI0:1; /* CSR_TLBLO[61] */ ++ unsigned int RI1:1; ++ ++ unsigned int EHINV:1;/* CSR_TLBIDX[31] */ ++ ++ unsigned int PLV0:2; /* CSR_TLBLO[3:2] */ ++ unsigned int PLV1:2; ++ ++ unsigned int RPLV0:1; ++ unsigned int RPLV1:1; /* CSR_TLBLO[63] */ ++ ++ uint64_t PPN0; /* CSR_TLBLO[47:12] */ ++ uint64_t PPN1; /* CSR_TLBLO[47:12] */ ++}; ++typedef struct ls3a5k_tlb_t ls3a5k_tlb_t; ++ ++struct CPULOONGARCHTLBContext { ++ uint32_t nb_tlb; ++ uint32_t tlb_in_use; ++ int (*map_address)(struct CPULOONGARCHState *env, hwaddr *physical, ++ int *prot, target_ulong address, int rw, ++ int access_type); ++ void (*helper_tlbwr)(struct CPULOONGARCHState *env); ++ void (*helper_tlbfill)(struct CPULOONGARCHState *env); ++ void (*helper_tlbsrch)(struct CPULOONGARCHState *env); ++ void (*helper_tlbrd)(struct CPULOONGARCHState *env); ++ void (*helper_tlbclr)(struct CPULOONGARCHState *env); ++ void (*helper_tlbflush)(struct CPULOONGARCHState *env); ++ void (*helper_invtlb)(struct CPULOONGARCHState *env, target_ulong addr, ++ target_ulong info, int op); ++ union ++ { ++ struct { ++ uint64_t ftlb_mask; ++ uint32_t ftlb_size; /* at most : 8 * 256 = 2048 */ ++ uint32_t vtlb_size; /* at most : 64 */ ++ ls3a5k_tlb_t tlb[2048 + 64]; /* at most : 2048 FTLB + 64 VTLB */ ++ } ls3a5k; ++ } mmu; ++}; ++ ++enum { ++ TLBRET_PE = -7, ++ TLBRET_XI = -6, ++ TLBRET_RI = -5, ++ TLBRET_DIRTY = -4, ++ TLBRET_INVALID = -3, ++ TLBRET_NOMATCH = -2, ++ TLBRET_BADADDR = -1, ++ TLBRET_MATCH = 0 ++}; ++ ++extern unsigned int ieee_rm[]; ++ ++static inline void restore_rounding_mode(CPULOONGARCHState *env) ++{ ++ set_float_rounding_mode(ieee_rm[(env->active_fpu.fcsr0 >> FCSR0_RM) & 0x3], ++ &env->active_fpu.fp_status); ++} ++ ++static inline void restore_flush_mode(CPULOONGARCHState *env) ++{ ++ set_flush_to_zero(0, &env->active_fpu.fp_status); ++} ++ ++static inline void restore_fp_status(CPULOONGARCHState *env) ++{ ++ restore_rounding_mode(env); ++ restore_flush_mode(env); ++} ++ ++static inline void compute_hflags(CPULOONGARCHState *env) ++{ ++ env->hflags &= ~(LARCH_HFLAG_64 | LARCH_HFLAG_FPU | LARCH_HFLAG_KSU | ++ LARCH_HFLAG_AWRAP | LARCH_HFLAG_LSX | LARCH_HFLAG_LASX); ++ ++ env->hflags |= (env->CSR_CRMD & CSR_CRMD_PLV); ++ env->hflags |= LARCH_HFLAG_64; ++ ++ if (env->CSR_EUEN & CSR_EUEN_FPEN) { ++ env->hflags |= LARCH_HFLAG_FPU; ++ } ++ if (env->CSR_EUEN & CSR_EUEN_LSXEN) { ++ env->hflags |= LARCH_HFLAG_LSX; ++ } ++ if (env->CSR_EUEN & CSR_EUEN_LASXEN) { ++ env->hflags |= LARCH_HFLAG_LASX; ++ } ++ if (env->CSR_EUEN & CSR_EUEN_LBTEN) { ++ env->hflags |= LARCH_HFLAG_LBT; ++ } ++} ++ ++/* Check if there is pending and not masked out interrupt */ ++static inline bool cpu_loongarch_hw_interrupts_pending(CPULOONGARCHState *env) ++{ ++ int32_t pending; ++ int32_t status; ++ bool r; ++ ++ pending = env->CSR_ESTAT & CSR_ESTAT_IPMASK; ++ status = env->CSR_ECFG & CSR_ECFG_IPMASK; ++ ++ /* ++ * Configured with compatibility or VInt (Vectored Interrupts) ++ * treats the pending lines as individual interrupt lines, the status ++ * lines are individual masks. ++ */ ++ r = (pending & status) != 0; ++ ++ return r; ++} ++ ++/* stabletimer.c */ ++uint32_t cpu_loongarch_get_random_ls3a5k_tlb(uint32_t low, uint32_t high); ++uint64_t cpu_loongarch_get_stable_counter(CPULOONGARCHState *env); ++uint64_t cpu_loongarch_get_stable_timer_ticks(CPULOONGARCHState *env); ++void cpu_loongarch_store_stable_timer_config(CPULOONGARCHState *env, ++ uint64_t value); ++int loongarch_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cpu, ++ int cpuid, void *opaque); ++ ++void loongarch_cpu_dump_state(CPUState *cpu, FILE *f, int flags); ++ ++/* TODO QOM'ify CPU reset and remove */ ++void cpu_state_reset(CPULOONGARCHState *s); ++void cpu_loongarch_realize_env(CPULOONGARCHState *env); ++ ++uint64_t read_fcc(CPULOONGARCHState *env); ++void write_fcc(CPULOONGARCHState *env, uint64_t val); ++ ++int loongarch_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n); ++int loongarch_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg); ++ ++#ifdef CONFIG_TCG ++#include "fpu_helper.h" ++#endif ++ ++#ifndef CONFIG_USER_ONLY ++extern const struct VMStateDescription vmstate_loongarch_cpu; ++hwaddr loongarch_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); ++#endif ++ ++#endif +diff --git a/target/loongarch64/kvm.c b/target/loongarch64/kvm.c +new file mode 100644 +index 0000000000..2b0159bb32 +--- /dev/null ++++ b/target/loongarch64/kvm.c +@@ -0,0 +1,1366 @@ ++/* ++ * KVM/LOONGARCH: LOONGARCH specific KVM APIs ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include ++ ++#include ++ ++#include "qemu-common.h" ++#include "cpu.h" ++#include "internal.h" ++#include "qemu/error-report.h" ++#include "qemu/timer.h" ++#include "qemu/main-loop.h" ++#include "sysemu/sysemu.h" ++#include "sysemu/kvm.h" ++#include "sysemu/runstate.h" ++#include "sysemu/cpus.h" ++#include "kvm_larch.h" ++#include "exec/memattrs.h" ++#include "exec/gdbstub.h" ++ ++#define DEBUG_KVM 0 ++/* ++ * A 16384-byte buffer can hold the 8-byte kvm_msrs header, plus ++ * 2047 kvm_msr_entry structs ++ */ ++#define CSR_BUF_SIZE 16384 ++ ++#define DPRINTF(fmt, ...) \ ++ do { \ ++ if (DEBUG_KVM) { \ ++ fprintf(stderr, fmt, ##__VA_ARGS__); \ ++ } \ ++ } while (0) ++ ++/* ++ * Define loongarch kvm version. ++ * Add version number when ++ * qemu/kvm interface changed ++ */ ++#define KVM_LOONGARCH_VERSION 1 ++ ++static struct { ++ target_ulong addr; ++ int len; ++ int type; ++} inst_breakpoint[8], data_breakpoint[8]; ++ ++int nb_data_breakpoint = 0, nb_inst_breakpoint = 0; ++static int kvm_loongarch_version_cap; ++ ++/* ++ * Hardware breakpoint control register ++ * 4:1 plv0-plv3 enable ++ * 6:5 config virtualization mode ++ * 9:8 load store ++ */ ++static const int type_code[] = { [GDB_BREAKPOINT_HW] = 0x5e, ++ [GDB_WATCHPOINT_READ] = (0x5e | 1 << 8), ++ [GDB_WATCHPOINT_WRITE] = (0x5e | 1 << 9), ++ [GDB_WATCHPOINT_ACCESS] = ++ (0x5e | 1 << 8 | 1 << 9) }; ++ ++const KVMCapabilityInfo kvm_arch_required_capabilities[] = { ++ KVM_CAP_LAST_INFO ++}; ++ ++static void kvm_loongarch_update_state(void *opaque, bool running, ++ RunState state); ++static inline int kvm_larch_putq(CPUState *cs, uint64_t reg_id, ++ uint64_t *addr); ++ ++unsigned long kvm_arch_vcpu_id(CPUState *cs) ++{ ++ return cs->cpu_index; ++} ++ ++int kvm_arch_init(MachineState *ms, KVMState *s) ++{ ++ /* LOONGARCH has 128 signals */ ++ kvm_set_sigmask_len(s, 16); ++ ++ kvm_loongarch_version_cap = kvm_check_extension(s, KVM_CAP_LOONGARCH_VZ); ++ ++ if (kvm_loongarch_version_cap != KVM_LOONGARCH_VERSION) { ++ warn_report("QEMU/KVM version not match, qemu_la_version: lvz-%d,\ ++ kvm_la_version: lvz-%d \n", ++ KVM_LOONGARCH_VERSION, kvm_loongarch_version_cap); ++ } ++ return 0; ++} ++ ++int kvm_arch_irqchip_create(KVMState *s) ++{ ++ return 0; ++} ++ ++static void kvm_csr_set_addr(uint64_t **addr, uint32_t index, uint64_t *p) ++{ ++ addr[index] = p; ++} ++ ++int kvm_arch_init_vcpu(CPUState *cs) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ uint64_t **addr; ++ CPULOONGARCHState *env = &cpu->env; ++ int ret = 0; ++ ++ kvm_vcpu_enable_cap(cs, KVM_CAP_LOONGARCH_FPU, 0, 0); ++ kvm_vcpu_enable_cap(cs, KVM_CAP_LOONGARCH_LSX, 0, 0); ++ ++ cpu->cpuStateEntry = ++ qemu_add_vm_change_state_handler(kvm_loongarch_update_state, cs); ++ cpu->kvm_csr_buf = g_malloc0(CSR_BUF_SIZE + CSR_BUF_SIZE); ++ ++ addr = (void *)cpu->kvm_csr_buf + CSR_BUF_SIZE; ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_CRMD, &env->CSR_CRMD); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PRMD, &env->CSR_PRMD); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_EUEN, &env->CSR_EUEN); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_MISC, &env->CSR_MISC); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ECFG, &env->CSR_ECFG); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ESTAT, &env->CSR_ESTAT); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ERA, &env->CSR_ERA); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_BADV, &env->CSR_BADV); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_BADI, &env->CSR_BADI); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_EEPN, &env->CSR_EEPN); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBIDX, &env->CSR_TLBIDX); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBEHI, &env->CSR_TLBEHI); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBELO0, &env->CSR_TLBELO0); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBELO1, &env->CSR_TLBELO1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_GTLBC, &env->CSR_GTLBC); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TRGP, &env->CSR_TRGP); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ASID, &env->CSR_ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PGDL, &env->CSR_PGDL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PGDH, &env->CSR_PGDH); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PGD, &env->CSR_PGD); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PWCTL0, &env->CSR_PWCTL0); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PWCTL1, &env->CSR_PWCTL1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_STLBPGSIZE, &env->CSR_STLBPGSIZE); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_RVACFG, &env->CSR_RVACFG); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_CPUID, &env->CSR_CPUID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PRCFG1, &env->CSR_PRCFG1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PRCFG2, &env->CSR_PRCFG2); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PRCFG3, &env->CSR_PRCFG3); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_KS0, &env->CSR_KS0); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_KS1, &env->CSR_KS1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_KS2, &env->CSR_KS2); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_KS3, &env->CSR_KS3); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_KS4, &env->CSR_KS4); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_KS5, &env->CSR_KS5); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_KS6, &env->CSR_KS6); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_KS7, &env->CSR_KS7); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TMID, &env->CSR_TMID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_CNTC, &env->CSR_CNTC); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TINTCLR, &env->CSR_TINTCLR); ++ ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_GSTAT, &env->CSR_GSTAT); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_GCFG, &env->CSR_GCFG); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_GINTC, &env->CSR_GINTC); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_GCNTC, &env->CSR_GCNTC); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_LLBCTL, &env->CSR_LLBCTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IMPCTL1, &env->CSR_IMPCTL1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IMPCTL2, &env->CSR_IMPCTL2); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_GNMI, &env->CSR_GNMI); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBRENT, &env->CSR_TLBRENT); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBRBADV, &env->CSR_TLBRBADV); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBRERA, &env->CSR_TLBRERA); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBRSAVE, &env->CSR_TLBRSAVE); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBRELO0, &env->CSR_TLBRELO0); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBRELO1, &env->CSR_TLBRELO1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBREHI, &env->CSR_TLBREHI); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_TLBRPRMD, &env->CSR_TLBRPRMD); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ERRCTL, &env->CSR_ERRCTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ERRINFO, &env->CSR_ERRINFO); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ERRINFO1, &env->CSR_ERRINFO1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ERRENT, &env->CSR_ERRENT); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ERRERA, &env->CSR_ERRERA); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_ERRSAVE, &env->CSR_ERRSAVE); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_CTAG, &env->CSR_CTAG); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DMWIN0, &env->CSR_DMWIN0); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DMWIN1, &env->CSR_DMWIN1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DMWIN2, &env->CSR_DMWIN2); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DMWIN3, &env->CSR_DMWIN3); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PERFCTRL0, &env->CSR_PERFCTRL0); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PERFCNTR0, &env->CSR_PERFCNTR0); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PERFCTRL1, &env->CSR_PERFCTRL1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PERFCNTR1, &env->CSR_PERFCNTR1); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PERFCTRL2, &env->CSR_PERFCTRL2); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PERFCNTR2, &env->CSR_PERFCNTR2); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PERFCTRL3, &env->CSR_PERFCTRL3); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_PERFCNTR3, &env->CSR_PERFCNTR3); ++ ++ /* debug */ ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_MWPC, &env->CSR_MWPC); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_MWPS, &env->CSR_MWPS); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB0ADDR, &env->CSR_DB0ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB0MASK, &env->CSR_DB0MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB0CTL, &env->CSR_DB0CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB0ASID, &env->CSR_DB0ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB1ADDR, &env->CSR_DB1ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB1MASK, &env->CSR_DB1MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB1CTL, &env->CSR_DB1CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB1ASID, &env->CSR_DB1ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB2ADDR, &env->CSR_DB2ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB2MASK, &env->CSR_DB2MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB2CTL, &env->CSR_DB2CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB2ASID, &env->CSR_DB2ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB3ADDR, &env->CSR_DB3ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB3MASK, &env->CSR_DB3MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB3CTL, &env->CSR_DB3CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DB3ASID, &env->CSR_DB3ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_FWPC, &env->CSR_FWPC); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_FWPS, &env->CSR_FWPS); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB0ADDR, &env->CSR_IB0ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB0MASK, &env->CSR_IB0MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB0CTL, &env->CSR_IB0CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB0ASID, &env->CSR_IB0ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB1ADDR, &env->CSR_IB1ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB1MASK, &env->CSR_IB1MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB1CTL, &env->CSR_IB1CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB1ASID, &env->CSR_IB1ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB2ADDR, &env->CSR_IB2ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB2MASK, &env->CSR_IB2MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB2CTL, &env->CSR_IB2CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB2ASID, &env->CSR_IB2ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB3ADDR, &env->CSR_IB3ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB3MASK, &env->CSR_IB3MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB3CTL, &env->CSR_IB3CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB3ASID, &env->CSR_IB3ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB4ADDR, &env->CSR_IB4ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB4MASK, &env->CSR_IB4MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB4CTL, &env->CSR_IB4CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB4ASID, &env->CSR_IB4ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB5ADDR, &env->CSR_IB5ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB5MASK, &env->CSR_IB5MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB5CTL, &env->CSR_IB5CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB5ASID, &env->CSR_IB5ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB6ADDR, &env->CSR_IB6ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB6MASK, &env->CSR_IB6MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB6CTL, &env->CSR_IB6CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB6ASID, &env->CSR_IB6ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB7ADDR, &env->CSR_IB7ADDR); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB7MASK, &env->CSR_IB7MASK); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB7CTL, &env->CSR_IB7CTL); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_IB7ASID, &env->CSR_IB7ASID); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DEBUG, &env->CSR_DEBUG); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DERA, &env->CSR_DERA); ++ kvm_csr_set_addr(addr, LOONGARCH_CSR_DESAVE, &env->CSR_DESAVE); ++ ++ DPRINTF("%s\n", __func__); ++ return ret; ++} ++ ++int kvm_arch_destroy_vcpu(CPUState *cs) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ ++ g_free(cpu->kvm_csr_buf); ++ cpu->kvm_csr_buf = NULL; ++ return 0; ++} ++ ++static void kvm_csr_buf_reset(LOONGARCHCPU *cpu) ++{ ++ memset(cpu->kvm_csr_buf, 0, CSR_BUF_SIZE); ++} ++ ++static void kvm_csr_entry_add(LOONGARCHCPU *cpu, uint32_t index, ++ uint64_t value) ++{ ++ struct kvm_msrs *msrs = cpu->kvm_csr_buf; ++ void *limit = ((void *)msrs) + CSR_BUF_SIZE; ++ struct kvm_csr_entry *entry = &msrs->entries[msrs->ncsrs]; ++ ++ assert((void *)(entry + 1) <= limit); ++ ++ entry->index = index; ++ entry->reserved = 0; ++ entry->data = value; ++ msrs->ncsrs++; ++} ++ ++void kvm_loongarch_reset_vcpu(LOONGARCHCPU *cpu) ++{ ++ int ret = 0; ++ uint64_t reset = 1; ++ ++ if (CPU(cpu)->kvm_fd > 0) { ++ ret = kvm_larch_putq(CPU(cpu), KVM_REG_LOONGARCH_VCPU_RESET, &reset); ++ if (ret < 0) { ++ error_report("%s reset vcpu failed:%d", __func__, ret); ++ } ++ } ++ ++ DPRINTF("%s\n", __func__); ++} ++ ++void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg) ++{ ++ int n; ++ if (kvm_sw_breakpoints_active(cpu)) { ++ dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP; ++ } ++ if (nb_data_breakpoint > 0) { ++ dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP; ++ for (n = 0; n < nb_data_breakpoint; n++) { ++ dbg->arch.data_breakpoint[n].addr = data_breakpoint[n].addr; ++ dbg->arch.data_breakpoint[n].mask = 0; ++ dbg->arch.data_breakpoint[n].asid = 0; ++ dbg->arch.data_breakpoint[n].ctrl = ++ type_code[data_breakpoint[n].type]; ++ } ++ dbg->arch.data_bp_nums = nb_data_breakpoint; ++ } else { ++ dbg->arch.data_bp_nums = 0; ++ } ++ if (nb_inst_breakpoint > 0) { ++ dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP; ++ for (n = 0; n < nb_inst_breakpoint; n++) { ++ dbg->arch.inst_breakpoint[n].addr = inst_breakpoint[n].addr; ++ dbg->arch.inst_breakpoint[n].mask = 0; ++ dbg->arch.inst_breakpoint[n].asid = 0; ++ dbg->arch.inst_breakpoint[n].ctrl = ++ type_code[inst_breakpoint[n].type]; ++ } ++ dbg->arch.inst_bp_nums = nb_inst_breakpoint; ++ } else { ++ dbg->arch.inst_bp_nums = 0; ++ } ++} ++ ++static const unsigned int brk_insn = 0x002b8005; ++ ++int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) ++{ ++ DPRINTF("%s\n", __func__); ++ if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 0) || ++ cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&brk_insn, 4, 1)) { ++ error_report("%s failed", __func__); ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) ++{ ++ static uint32_t brk; ++ ++ DPRINTF("%s\n", __func__); ++ if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&brk, 4, 0) || ++ brk != brk_insn || ++ cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 4, 1)) { ++ error_report("%s failed", __func__); ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++static int find_hw_breakpoint(uint64_t addr, int len, int type) ++{ ++ int n; ++ switch (type) { ++ case GDB_BREAKPOINT_HW: ++ if (nb_inst_breakpoint == 0) { ++ return -1; ++ } ++ for (n = 0; n < nb_inst_breakpoint; n++) { ++ if (inst_breakpoint[n].addr == addr && ++ inst_breakpoint[n].type == type) { ++ return n; ++ } ++ } ++ break; ++ case GDB_WATCHPOINT_WRITE: ++ case GDB_WATCHPOINT_READ: ++ case GDB_WATCHPOINT_ACCESS: ++ if (nb_data_breakpoint == 0) { ++ return -1; ++ } ++ for (n = 0; n < nb_data_breakpoint; n++) { ++ if (data_breakpoint[n].addr == addr && ++ data_breakpoint[n].type == type && ++ data_breakpoint[n].len == len) { ++ return n; ++ } ++ } ++ break; ++ default: ++ return -1; ++ } ++ return -1; ++} ++ ++int kvm_arch_insert_hw_breakpoint(target_ulong addr, target_ulong len, ++ int type) ++{ ++ switch (type) { ++ case GDB_BREAKPOINT_HW: ++ len = 1; ++ if (nb_inst_breakpoint == 8) { ++ return -ENOBUFS; ++ } ++ if (find_hw_breakpoint(addr, len, type) >= 0) { ++ return -EEXIST; ++ } ++ inst_breakpoint[nb_inst_breakpoint].addr = addr; ++ inst_breakpoint[nb_inst_breakpoint].len = len; ++ inst_breakpoint[nb_inst_breakpoint].type = type; ++ nb_inst_breakpoint++; ++ break; ++ case GDB_WATCHPOINT_WRITE: ++ case GDB_WATCHPOINT_READ: ++ case GDB_WATCHPOINT_ACCESS: ++ switch (len) { ++ case 1: ++ case 2: ++ case 4: ++ case 8: ++ if (addr & (len - 1)) { ++ return -EINVAL; ++ } ++ if (nb_data_breakpoint == 8) { ++ return -ENOBUFS; ++ } ++ if (find_hw_breakpoint(addr, len, type) >= 0) { ++ return -EEXIST; ++ } ++ data_breakpoint[nb_data_breakpoint].addr = addr; ++ data_breakpoint[nb_data_breakpoint].len = len; ++ data_breakpoint[nb_data_breakpoint].type = type; ++ nb_data_breakpoint++; ++ break; ++ default: ++ return -EINVAL; ++ } ++ break; ++ default: ++ return -ENOSYS; ++ } ++ return 0; ++} ++ ++int kvm_arch_remove_hw_breakpoint(target_ulong addr, target_ulong len, ++ int type) ++{ ++ int n; ++ n = find_hw_breakpoint(addr, (type == GDB_BREAKPOINT_HW) ? 1 : len, type); ++ if (n < 0) { ++ printf("err not find remove target\n"); ++ return -ENOENT; ++ } ++ switch (type) { ++ case GDB_BREAKPOINT_HW: ++ nb_inst_breakpoint--; ++ inst_breakpoint[n] = inst_breakpoint[nb_inst_breakpoint]; ++ break; ++ case GDB_WATCHPOINT_WRITE: ++ case GDB_WATCHPOINT_READ: ++ case GDB_WATCHPOINT_ACCESS: ++ nb_data_breakpoint--; ++ data_breakpoint[n] = data_breakpoint[nb_data_breakpoint]; ++ break; ++ default: ++ return -1; ++ } ++ return 0; ++} ++ ++void kvm_arch_remove_all_hw_breakpoints(void) ++{ ++ DPRINTF("%s\n", __func__); ++ nb_data_breakpoint = 0; ++ nb_inst_breakpoint = 0; ++} ++ ++static inline int cpu_loongarch_io_interrupts_pending(LOONGARCHCPU *cpu) ++{ ++ CPULOONGARCHState *env = &cpu->env; ++ ++ return env->CSR_ESTAT & (0x1 << 2); ++} ++ ++void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ int r; ++ struct kvm_loongarch_interrupt intr; ++ ++ qemu_mutex_lock_iothread(); ++ ++ if ((cs->interrupt_request & CPU_INTERRUPT_HARD) && ++ cpu_loongarch_io_interrupts_pending(cpu)) { ++ intr.cpu = -1; ++ intr.irq = 2; ++ r = kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr); ++ if (r < 0) { ++ error_report("%s: cpu %d: failed to inject IRQ %x", __func__, ++ cs->cpu_index, intr.irq); ++ } ++ } ++ ++ qemu_mutex_unlock_iothread(); ++} ++ ++MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run) ++{ ++ return MEMTXATTRS_UNSPECIFIED; ++} ++ ++int kvm_arch_process_async_events(CPUState *cs) ++{ ++ return cs->halted; ++} ++ ++static CPUWatchpoint hw_watchpoint; ++ ++static bool kvm_loongarch_handle_debug(CPUState *cs, struct kvm_run *run) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ int i; ++ bool ret = false; ++ kvm_cpu_synchronize_state(cs); ++ if (cs->singlestep_enabled) { ++ return true; ++ } ++ if (kvm_find_sw_breakpoint(cs, env->active_tc.PC)) { ++ return true; ++ } ++ /* hw breakpoint */ ++ if (run->debug.arch.exception == EXCCODE_WATCH) { ++ for (i = 0; i < 8; i++) { ++ if (run->debug.arch.fwps & (1 << i)) { ++ ret = true; ++ break; ++ } ++ } ++ for (i = 0; i < 8; i++) { ++ if (run->debug.arch.mwps & (1 << i)) { ++ cs->watchpoint_hit = &hw_watchpoint; ++ hw_watchpoint.vaddr = data_breakpoint[i].addr; ++ switch (data_breakpoint[i].type) { ++ case GDB_WATCHPOINT_READ: ++ ret = true; ++ hw_watchpoint.flags = BP_MEM_READ; ++ break; ++ case GDB_WATCHPOINT_WRITE: ++ ret = true; ++ hw_watchpoint.flags = BP_MEM_WRITE; ++ break; ++ case GDB_WATCHPOINT_ACCESS: ++ ret = true; ++ hw_watchpoint.flags = BP_MEM_ACCESS; ++ break; ++ } ++ } ++ } ++ run->debug.arch.exception = 0; ++ run->debug.arch.fwps = 0; ++ run->debug.arch.mwps = 0; ++ } ++ return ret; ++} ++ ++int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run) ++{ ++ int ret; ++ ++ DPRINTF("%s\n", __func__); ++ switch (run->exit_reason) { ++ case KVM_EXIT_HYPERCALL: ++ DPRINTF("handle LOONGARCH hypercall\n"); ++ ret = 0; ++ run->hypercall.ret = ret; ++ break; ++ ++ case KVM_EXIT_DEBUG: ++ ret = 0; ++ if (kvm_loongarch_handle_debug(cs, run)) { ++ ret = EXCP_DEBUG; ++ } ++ break; ++ default: ++ error_report("%s: unknown exit reason %d", __func__, run->exit_reason); ++ ret = -1; ++ break; ++ } ++ ++ return ret; ++} ++ ++bool kvm_arch_stop_on_emulation_error(CPUState *cs) ++{ ++ DPRINTF("%s\n", __func__); ++ return true; ++} ++ ++void kvm_arch_init_irq_routing(KVMState *s) ++{ ++} ++ ++int kvm_loongarch_set_interrupt(LOONGARCHCPU *cpu, int irq, int level) ++{ ++ CPUState *cs = CPU(cpu); ++ struct kvm_loongarch_interrupt intr; ++ ++ if (!kvm_enabled()) { ++ return 0; ++ } ++ ++ intr.cpu = -1; ++ ++ if (level) { ++ intr.irq = irq; ++ } else { ++ intr.irq = -irq; ++ } ++ ++ kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr); ++ ++ return 0; ++} ++ ++int kvm_loongarch_set_ipi_interrupt(LOONGARCHCPU *cpu, int irq, int level) ++{ ++ CPUState *cs = current_cpu; ++ CPUState *dest_cs = CPU(cpu); ++ struct kvm_loongarch_interrupt intr; ++ ++ if (!kvm_enabled()) { ++ return 0; ++ } ++ ++ intr.cpu = dest_cs->cpu_index; ++ ++ if (level) { ++ intr.irq = irq; ++ } else { ++ intr.irq = -irq; ++ } ++ ++ DPRINTF("%s: IRQ: %d\n", __func__, intr.irq); ++ if (!current_cpu) { ++ cs = dest_cs; ++ } ++ kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr); ++ ++ return 0; ++} ++ ++static inline int kvm_loongarch_put_one_reg(CPUState *cs, uint64_t reg_id, ++ int32_t *addr) ++{ ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)addr }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_loongarch_put_one_ureg(CPUState *cs, uint64_t reg_id, ++ uint32_t *addr) ++{ ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)addr }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_loongarch_put_one_ulreg(CPUState *cs, uint64_t reg_id, ++ target_ulong *addr) ++{ ++ uint64_t val64 = *addr; ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)&val64 }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_loongarch_put_one_reg64(CPUState *cs, int64_t reg_id, ++ int64_t *addr) ++{ ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)addr }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_larch_putq(CPUState *cs, uint64_t reg_id, uint64_t *addr) ++{ ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)addr }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_loongarch_get_one_reg(CPUState *cs, uint64_t reg_id, ++ int32_t *addr) ++{ ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)addr }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_loongarch_get_one_ureg(CPUState *cs, uint64_t reg_id, ++ uint32_t *addr) ++{ ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)addr }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_loongarch_get_one_ulreg(CPUState *cs, uint64_t reg_id, ++ target_ulong *addr) ++{ ++ int ret; ++ uint64_t val64 = 0; ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)&val64 }; ++ ++ ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &csrreg); ++ if (ret >= 0) { ++ *addr = val64; ++ } ++ return ret; ++} ++ ++static inline int kvm_loongarch_get_one_reg64(CPUState *cs, int64_t reg_id, ++ int64_t *addr) ++{ ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)addr }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_larch_getq(CPUState *cs, uint64_t reg_id, uint64_t *addr) ++{ ++ struct kvm_one_reg csrreg = { .id = reg_id, .addr = (uintptr_t)addr }; ++ ++ return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &csrreg); ++} ++ ++static inline int kvm_loongarch_change_one_reg(CPUState *cs, uint64_t reg_id, ++ int32_t *addr, int32_t mask) ++{ ++ int err; ++ int32_t tmp, change; ++ ++ err = kvm_loongarch_get_one_reg(cs, reg_id, &tmp); ++ if (err < 0) { ++ return err; ++ } ++ ++ /* only change bits in mask */ ++ change = (*addr ^ tmp) & mask; ++ if (!change) { ++ return 0; ++ } ++ ++ tmp = tmp ^ change; ++ return kvm_loongarch_put_one_reg(cs, reg_id, &tmp); ++} ++ ++static inline int kvm_loongarch_change_one_reg64(CPUState *cs, uint64_t reg_id, ++ int64_t *addr, int64_t mask) ++{ ++ int err; ++ int64_t tmp, change; ++ ++ err = kvm_loongarch_get_one_reg64(cs, reg_id, &tmp); ++ if (err < 0) { ++ DPRINTF("%s: Failed to get CSR_CONFIG7 (%d)\n", __func__, err); ++ return err; ++ } ++ ++ /* only change bits in mask */ ++ change = (*addr ^ tmp) & mask; ++ if (!change) { ++ return 0; ++ } ++ ++ tmp = tmp ^ change; ++ return kvm_loongarch_put_one_reg64(cs, reg_id, &tmp); ++} ++/* ++ * Handle the VM clock being started or stopped ++ */ ++static void kvm_loongarch_update_state(void *opaque, bool running, ++ RunState state) ++{ ++ CPUState *cs = opaque; ++ int ret; ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ ++ /* ++ * If state is already dirty (synced to QEMU) then the KVM timer state is ++ * already saved and can be restored when it is synced back to KVM. ++ */ ++ if (!running) { ++ ret = ++ kvm_larch_getq(cs, KVM_REG_LOONGARCH_COUNTER, &cpu->counter_value); ++ if (ret < 0) { ++ printf("%s: Failed to get counter_value (%d)\n", __func__, ret); ++ } ++ ++ } else { ++ ret = kvm_larch_putq(cs, KVM_REG_LOONGARCH_COUNTER, ++ &(LOONGARCH_CPU(cs))->counter_value); ++ if (ret < 0) { ++ printf("%s: Failed to put counter_value (%d)\n", __func__, ret); ++ } ++ } ++} ++ ++static int kvm_loongarch_put_fpu_registers(CPUState *cs, int level) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ int err, ret = 0; ++ unsigned int i; ++ struct kvm_fpu fpu; ++ ++ fpu.fcsr = env->active_fpu.fcsr0; ++ for (i = 0; i < 32; i++) { ++ memcpy(&fpu.fpr[i], &env->active_fpu.fpr[i], ++ sizeof(struct kvm_fpureg)); ++ } ++ for (i = 0; i < 8; i++) { ++ ((char *)&fpu.fcc)[i] = env->active_fpu.cf[i]; ++ } ++ fpu.vcsr = env->active_fpu.vcsr16; ++ ++ err = kvm_vcpu_ioctl(cs, KVM_SET_FPU, &fpu); ++ if (err < 0) { ++ DPRINTF("%s: Failed to get FPU (%d)\n", __func__, err); ++ ret = err; ++ } ++ ++ return ret; ++} ++ ++static int kvm_loongarch_get_fpu_registers(CPUState *cs) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ int err, ret = 0; ++ unsigned int i; ++ struct kvm_fpu fpu; ++ ++ err = kvm_vcpu_ioctl(cs, KVM_GET_FPU, &fpu); ++ if (err < 0) { ++ DPRINTF("%s: Failed to get FPU (%d)\n", __func__, err); ++ ret = err; ++ } else { ++ env->active_fpu.fcsr0 = fpu.fcsr; ++ for (i = 0; i < 32; i++) { ++ memcpy(&env->active_fpu.fpr[i], &fpu.fpr[i], ++ sizeof(struct kvm_fpureg)); ++ } ++ for (i = 0; i < 8; i++) { ++ env->active_fpu.cf[i] = ((char *)&fpu.fcc)[i]; ++ } ++ env->active_fpu.vcsr16 = fpu.vcsr; ++ } ++ ++ return ret; ++} ++ ++#define KVM_PUT_ONE_UREG64(cs, regidx, addr) \ ++ ({ \ ++ int err; \ ++ uint64_t csrid = 0; \ ++ csrid = (KVM_IOC_CSRID(regidx)); \ ++ err = kvm_larch_putq(cs, csrid, addr); \ ++ if (err < 0) { \ ++ DPRINTF("%s: Failed to put regidx 0x%x err:%d\n", __func__, \ ++ regidx, err); \ ++ } \ ++ err; \ ++ }) ++ ++static int kvm_loongarch_put_csr_registers(CPUState *cs, int level) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ int ret = 0; ++ ++ (void)level; ++ ++ kvm_csr_buf_reset(cpu); ++ ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_CRMD, env->CSR_CRMD); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PRMD, env->CSR_PRMD); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_EUEN, env->CSR_EUEN); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_MISC, env->CSR_MISC); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ECFG, env->CSR_ECFG); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ESTAT, env->CSR_ESTAT); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERA, env->CSR_ERA); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_BADV, env->CSR_BADV); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_BADI, env->CSR_BADI); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_EEPN, env->CSR_EEPN); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBIDX, env->CSR_TLBIDX); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBEHI, env->CSR_TLBEHI); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBELO0, env->CSR_TLBELO0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBELO1, env->CSR_TLBELO1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GTLBC, env->CSR_GTLBC); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TRGP, env->CSR_TRGP); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ASID, env->CSR_ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PGDL, env->CSR_PGDL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PGDH, env->CSR_PGDH); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PGD, env->CSR_PGD); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PWCTL0, env->CSR_PWCTL0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PWCTL1, env->CSR_PWCTL1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_STLBPGSIZE, env->CSR_STLBPGSIZE); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_RVACFG, env->CSR_RVACFG); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_CPUID, env->CSR_CPUID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PRCFG1, env->CSR_PRCFG1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PRCFG2, env->CSR_PRCFG2); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PRCFG3, env->CSR_PRCFG3); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS0, env->CSR_KS0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS1, env->CSR_KS1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS2, env->CSR_KS2); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS3, env->CSR_KS3); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS4, env->CSR_KS4); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS5, env->CSR_KS5); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS6, env->CSR_KS6); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS7, env->CSR_KS7); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TMID, env->CSR_TMID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_CNTC, env->CSR_CNTC); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TINTCLR, env->CSR_TINTCLR); ++ ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GSTAT, env->CSR_GSTAT); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GCFG, env->CSR_GCFG); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GINTC, env->CSR_GINTC); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GCNTC, env->CSR_GCNTC); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_LLBCTL, env->CSR_LLBCTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IMPCTL1, env->CSR_IMPCTL1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IMPCTL2, env->CSR_IMPCTL2); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GNMI, env->CSR_GNMI); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRENT, env->CSR_TLBRENT); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRBADV, env->CSR_TLBRBADV); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRERA, env->CSR_TLBRERA); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRSAVE, env->CSR_TLBRSAVE); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRELO0, env->CSR_TLBRELO0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRELO1, env->CSR_TLBRELO1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBREHI, env->CSR_TLBREHI); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRPRMD, env->CSR_TLBRPRMD); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRCTL, env->CSR_ERRCTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRINFO, env->CSR_ERRINFO); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRINFO1, env->CSR_ERRINFO1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRENT, env->CSR_ERRENT); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRERA, env->CSR_ERRERA); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRSAVE, env->CSR_ERRSAVE); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_CTAG, env->CSR_CTAG); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DMWIN0, env->CSR_DMWIN0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DMWIN1, env->CSR_DMWIN1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DMWIN2, env->CSR_DMWIN2); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DMWIN3, env->CSR_DMWIN3); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCTRL0, env->CSR_PERFCTRL0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCNTR0, env->CSR_PERFCNTR0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCTRL1, env->CSR_PERFCTRL1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCNTR1, env->CSR_PERFCNTR1); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCTRL2, env->CSR_PERFCTRL2); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCNTR2, env->CSR_PERFCNTR2); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCTRL3, env->CSR_PERFCTRL3); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCNTR3, env->CSR_PERFCNTR3); ++ ++ /* debug */ ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_MWPC, env->CSR_MWPC); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_MWPS, env->CSR_MWPS); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB0ADDR, env->CSR_DB0ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB0MASK, env->CSR_DB0MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB0CTL, env->CSR_DB0CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB0ASID, env->CSR_DB0ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB1ADDR, env->CSR_DB1ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB1MASK, env->CSR_DB1MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB1CTL, env->CSR_DB1CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB1ASID, env->CSR_DB1ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB2ADDR, env->CSR_DB2ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB2MASK, env->CSR_DB2MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB2CTL, env->CSR_DB2CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB2ASID, env->CSR_DB2ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB3ADDR, env->CSR_DB3ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB3MASK, env->CSR_DB3MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB3CTL, env->CSR_DB3CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB3ASID, env->CSR_DB3ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_FWPC, env->CSR_FWPC); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_FWPS, env->CSR_FWPS); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB0ADDR, env->CSR_IB0ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB0MASK, env->CSR_IB0MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB0CTL, env->CSR_IB0CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB0ASID, env->CSR_IB0ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB1ADDR, env->CSR_IB1ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB1MASK, env->CSR_IB1MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB1CTL, env->CSR_IB1CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB1ASID, env->CSR_IB1ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB2ADDR, env->CSR_IB2ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB2MASK, env->CSR_IB2MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB2CTL, env->CSR_IB2CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB2ASID, env->CSR_IB2ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB3ADDR, env->CSR_IB3ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB3MASK, env->CSR_IB3MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB3CTL, env->CSR_IB3CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB3ASID, env->CSR_IB3ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB4ADDR, env->CSR_IB4ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB4MASK, env->CSR_IB4MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB4CTL, env->CSR_IB4CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB4ASID, env->CSR_IB4ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB5ADDR, env->CSR_IB5ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB5MASK, env->CSR_IB5MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB5CTL, env->CSR_IB5CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB5ASID, env->CSR_IB5ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB6ADDR, env->CSR_IB6ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB6MASK, env->CSR_IB6MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB6CTL, env->CSR_IB6CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB6ASID, env->CSR_IB6ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB7ADDR, env->CSR_IB7ADDR); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB7MASK, env->CSR_IB7MASK); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB7CTL, env->CSR_IB7CTL); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB7ASID, env->CSR_IB7ASID); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DEBUG, env->CSR_DEBUG); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DERA, env->CSR_DERA); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DESAVE, env->CSR_DESAVE); ++ ++ ret = kvm_vcpu_ioctl(cs, KVM_SET_MSRS, cpu->kvm_csr_buf); ++ if (ret < cpu->kvm_csr_buf->ncsrs) { ++ struct kvm_csr_entry *e = &cpu->kvm_csr_buf->entries[ret]; ++ printf("error: failed to set CSR 0x%" PRIx32 " to 0x%" PRIx64 "\n", ++ (uint32_t)e->index, (uint64_t)e->data); ++ } ++ ++ /* ++ * timer cfg must be put at last since it is used to enable ++ * guest timer ++ */ ++ ret |= KVM_PUT_ONE_UREG64(cs, LOONGARCH_CSR_TVAL, &env->CSR_TVAL); ++ ret |= KVM_PUT_ONE_UREG64(cs, LOONGARCH_CSR_TCFG, &env->CSR_TCFG); ++ return ret; ++} ++ ++#define KVM_GET_ONE_UREG64(cs, regidx, addr) \ ++ ({ \ ++ int err; \ ++ uint64_t csrid = 0; \ ++ csrid = (KVM_IOC_CSRID(regidx)); \ ++ err = kvm_larch_getq(cs, csrid, addr); \ ++ if (err < 0) { \ ++ DPRINTF("%s: Failed to put regidx 0x%x err:%d\n", __func__, \ ++ regidx, err); \ ++ } \ ++ err; \ ++ }) ++ ++static int kvm_loongarch_get_csr_registers(CPUState *cs) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ int ret = 0, i; ++ struct kvm_csr_entry *csrs = cpu->kvm_csr_buf->entries; ++ uint64_t **addr; ++ ++ kvm_csr_buf_reset(cpu); ++ addr = (void *)cpu->kvm_csr_buf + CSR_BUF_SIZE; ++ ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_CRMD, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PRMD, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_EUEN, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_MISC, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ECFG, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ESTAT, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERA, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_BADV, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_BADI, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_EEPN, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBIDX, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBEHI, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBELO0, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBELO1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GTLBC, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TRGP, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PGDL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PGDH, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PGD, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PWCTL0, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PWCTL1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_STLBPGSIZE, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_RVACFG, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_CPUID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PRCFG1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PRCFG2, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PRCFG3, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS0, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS2, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS3, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS4, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS5, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS6, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_KS7, 0); ++ ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TMID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_CNTC, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TINTCLR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GSTAT, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GCFG, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GINTC, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GCNTC, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_LLBCTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IMPCTL1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IMPCTL2, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_GNMI, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRENT, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRBADV, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRERA, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRSAVE, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRELO0, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRELO1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBREHI, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_TLBRPRMD, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRCTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRINFO, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRINFO1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRENT, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRERA, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_ERRSAVE, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_CTAG, 0); ++ ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DMWIN0, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DMWIN1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DMWIN2, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DMWIN3, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCTRL0, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCNTR0, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCTRL1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCNTR1, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCTRL2, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCNTR2, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCTRL3, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_PERFCNTR3, 0); ++ ++ /* debug */ ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_MWPC, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_MWPS, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB0ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB0MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB0CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB0ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB1ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB1MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB1CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB1ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB2ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB2MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB2CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB2ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB3ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB3MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB3CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DB3ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_FWPC, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_FWPS, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB0ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB0MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB0CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB0ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB1ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB1MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB1CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB1ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB2ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB2MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB2CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB2ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB3ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB3MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB3CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB3ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB4ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB4MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB4CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB4ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB5ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB5MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB5CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB5ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB6ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB6MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB6CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB6ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB7ADDR, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB7MASK, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB7CTL, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_IB7ASID, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DEBUG, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DERA, 0); ++ kvm_csr_entry_add(cpu, LOONGARCH_CSR_DESAVE, 0); ++ ++ ret = kvm_vcpu_ioctl(cs, KVM_GET_MSRS, cpu->kvm_csr_buf); ++ if (ret < cpu->kvm_csr_buf->ncsrs) { ++ struct kvm_csr_entry *e = &cpu->kvm_csr_buf->entries[ret]; ++ printf("error: failed to get CSR 0x%" PRIx32 "\n", (uint32_t)e->index); ++ } ++ ++ for (i = 0; i < ret; i++) { ++ uint32_t index = csrs[i].index; ++ if (addr[index]) { ++ *addr[index] = csrs[i].data; ++ } else { ++ printf("Failed to get addr CSR 0x%" PRIx32 "\n", i); ++ } ++ } ++ ++ ret |= KVM_GET_ONE_UREG64(cs, LOONGARCH_CSR_TVAL, &env->CSR_TVAL); ++ ret |= KVM_GET_ONE_UREG64(cs, LOONGARCH_CSR_TCFG, &env->CSR_TCFG); ++ return ret; ++} ++ ++int kvm_loongarch_put_pvtime(LOONGARCHCPU *cpu) ++{ ++ CPULOONGARCHState *env = &cpu->env; ++ int err; ++ struct kvm_device_attr attr = { ++ .group = KVM_LARCH_VCPU_PVTIME_CTRL, ++ .attr = KVM_LARCH_VCPU_PVTIME_IPA, ++ .addr = (uint64_t)&env->st.guest_addr, ++ }; ++ ++ err = kvm_vcpu_ioctl(CPU(cpu), KVM_HAS_DEVICE_ATTR, attr); ++ if (err != 0) { ++ /* It's ok even though kvm has not such attr */ ++ return 0; ++ } ++ ++ err = kvm_vcpu_ioctl(CPU(cpu), KVM_SET_DEVICE_ATTR, attr); ++ if (err != 0) { ++ error_report("PVTIME IPA: KVM_SET_DEVICE_ATTR: %s", strerror(-err)); ++ return err; ++ } ++ ++ return 0; ++} ++ ++int kvm_loongarch_get_pvtime(LOONGARCHCPU *cpu) ++{ ++ CPULOONGARCHState *env = &cpu->env; ++ int err; ++ struct kvm_device_attr attr = { ++ .group = KVM_LARCH_VCPU_PVTIME_CTRL, ++ .attr = KVM_LARCH_VCPU_PVTIME_IPA, ++ .addr = (uint64_t)&env->st.guest_addr, ++ }; ++ ++ err = kvm_vcpu_ioctl(CPU(cpu), KVM_HAS_DEVICE_ATTR, attr); ++ if (err != 0) { ++ /* It's ok even though kvm has not such attr */ ++ return 0; ++ } ++ ++ err = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_DEVICE_ATTR, attr); ++ if (err != 0) { ++ error_report("PVTIME IPA: KVM_GET_DEVICE_ATTR: %s", strerror(-err)); ++ return err; ++ } ++ ++ return 0; ++} ++ ++int kvm_arch_put_registers(CPUState *cs, int level) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ struct kvm_regs regs; ++ int ret; ++ int i; ++ ++ /* Set the registers based on QEMU's view of things */ ++ for (i = 0; i < 32; i++) { ++ regs.gpr[i] = (int64_t)(target_long)env->active_tc.gpr[i]; ++ } ++ ++ regs.pc = (int64_t)(target_long)env->active_tc.PC; ++ ++ ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, ®s); ++ ++ if (ret < 0) { ++ return ret; ++ } ++ ++ ret = kvm_loongarch_put_csr_registers(cs, level); ++ if (ret < 0) { ++ return ret; ++ } ++ ++ ret = kvm_loongarch_put_fpu_registers(cs, level); ++ if (ret < 0) { ++ return ret; ++ } ++ ++ return ret; ++} ++ ++int kvm_arch_get_registers(CPUState *cs) ++{ ++ LOONGARCHCPU *cpu = LOONGARCH_CPU(cs); ++ CPULOONGARCHState *env = &cpu->env; ++ int ret = 0; ++ struct kvm_regs regs; ++ int i; ++ ++ /* Get the current register set as KVM seems it */ ++ ret = kvm_vcpu_ioctl(cs, KVM_GET_REGS, ®s); ++ ++ if (ret < 0) { ++ return ret; ++ } ++ ++ for (i = 0; i < 32; i++) { ++ env->active_tc.gpr[i] = regs.gpr[i]; ++ } ++ ++ env->active_tc.PC = regs.pc; ++ ++ kvm_loongarch_get_csr_registers(cs); ++ kvm_loongarch_get_fpu_registers(cs); ++ ++ return ret; ++} ++ ++int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route, ++ uint64_t address, uint32_t data, PCIDevice *dev) ++{ ++ return 0; ++} ++ ++int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route, ++ int vector, PCIDevice *dev) ++{ ++ return 0; ++} ++ ++bool kvm_arch_cpu_check_are_resettable(void) ++{ ++ return true; ++} ++ ++int kvm_arch_release_virq_post(int virq) ++{ ++ return 0; ++} ++ ++int kvm_arch_msi_data_to_gsi(uint32_t data) ++{ ++ abort(); ++} +diff --git a/target/loongarch64/kvm_larch.h b/target/loongarch64/kvm_larch.h +new file mode 100644 +index 0000000000..637dec8106 +--- /dev/null ++++ b/target/loongarch64/kvm_larch.h +@@ -0,0 +1,49 @@ ++/* ++ * KVM/LOONGARCH: LOONGARCH specific KVM APIs ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef KVM_LOONGARCH_H ++#define KVM_LOONGARCH_H ++ ++/** ++ * kvm_loongarch_reset_vcpu: ++ * @cpu: LOONGARCHCPU ++ * ++ * Called at reset time to set kernel registers to their initial values. ++ */ ++void kvm_loongarch_reset_vcpu(LOONGARCHCPU *cpu); ++ ++int kvm_loongarch_set_interrupt(LOONGARCHCPU *cpu, int irq, int level); ++int kvm_loongarch_set_ipi_interrupt(LOONGARCHCPU *cpu, int irq, int level); ++ ++int kvm_loongarch_put_pvtime(LOONGARCHCPU *cpu); ++int kvm_loongarch_get_pvtime(LOONGARCHCPU *cpu); ++ ++#ifndef KVM_INTERRUPT_SET ++#define KVM_INTERRUPT_SET -1 ++#endif ++ ++#ifndef KVM_INTERRUPT_UNSET ++#define KVM_INTERRUPT_UNSET -2 ++#endif ++ ++#ifndef KVM_INTERRUPT_SET_LEVEL ++#define KVM_INTERRUPT_SET_LEVEL -3 ++#endif ++ ++#endif /* KVM_LOONGARCH_H */ +diff --git a/target/loongarch64/larch-defs.h b/target/loongarch64/larch-defs.h +new file mode 100644 +index 0000000000..e22a0dc652 +--- /dev/null ++++ b/target/loongarch64/larch-defs.h +@@ -0,0 +1,42 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef QEMU_LOONGARCH_DEFS_H ++#define QEMU_LOONGARCH_DEFS_H ++ ++/* If we want to use host float regs... */ ++/* #define USE_HOST_FLOAT_REGS */ ++ ++/* Real pages are variable size... */ ++#define TARGET_PAGE_BITS 14 ++#define LOONGARCH_TLB_MAX 2112 ++#define TARGET_LONG_BITS 64 ++#define TARGET_PHYS_ADDR_SPACE_BITS 48 ++#define TARGET_VIRT_ADDR_SPACE_BITS 48 ++ ++/* ++ * bit definitions for insn_flags (ISAs/ASEs flags) ++ * ------------------------------------------------ ++ */ ++#define ISA_LARCH32 0x00000001ULL ++#define ISA_LARCH64 0x00000002ULL ++#define INSN_LOONGARCH 0x00010000ULL ++ ++#define CPU_LARCH32 (ISA_LARCH32) ++#define CPU_LARCH64 (ISA_LARCH32 | ISA_LARCH64) ++ ++#endif /* QEMU_LOONGARCH_DEFS_H */ +diff --git a/target/loongarch64/machine.c b/target/loongarch64/machine.c +new file mode 100644 +index 0000000000..d91c858383 +--- /dev/null ++++ b/target/loongarch64/machine.c +@@ -0,0 +1,423 @@ ++/* ++ * Loongarch 3A5000 machine emulation ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu-common.h" ++#include "cpu.h" ++#include "internal.h" ++#include "hw/hw.h" ++#include "kvm_larch.h" ++#include "migration/cpu.h" ++#include "linux/kvm.h" ++#include "sysemu/kvm.h" ++#include "qemu/error-report.h" ++ ++static int cpu_post_load(void *opaque, int version_id) ++{ ++ LOONGARCHCPU *cpu = opaque; ++ CPULOONGARCHState *env = &cpu->env; ++ int r = 0; ++ ++ if (!kvm_enabled()) { ++ return 0; ++ } ++ ++#ifdef CONFIG_KVM ++ struct kvm_loongarch_vcpu_state vcpu_state; ++ int i; ++ ++ vcpu_state.online_vcpus = cpu->online_vcpus; ++ vcpu_state.is_migrate = cpu->is_migrate; ++ vcpu_state.cpu_freq = cpu->cpu_freq; ++ vcpu_state.count_ctl = cpu->count_ctl; ++ vcpu_state.pending_exceptions = cpu->pending_exceptions; ++ vcpu_state.pending_exceptions_clr = cpu->pending_exceptions_clr; ++ for (i = 0; i < 4; i++) { ++ vcpu_state.core_ext_ioisr[i] = cpu->core_ext_ioisr[i]; ++ } ++ r = kvm_vcpu_ioctl(CPU(cpu), KVM_LARCH_SET_VCPU_STATE, &vcpu_state); ++ if (r) { ++ error_report("set vcpu state failed %d", r); ++ } ++ ++ kvm_loongarch_put_pvtime(cpu); ++#endif ++ ++ restore_fp_status(env); ++ compute_hflags(env); ++ ++ return r; ++} ++ ++static int cpu_pre_save(void *opaque) ++{ ++#ifdef CONFIG_KVM ++ LOONGARCHCPU *cpu = opaque; ++ struct kvm_loongarch_vcpu_state vcpu_state; ++ int i, r = 0; ++ if (!kvm_enabled()) { ++ return 0; ++ } ++ ++ r = kvm_vcpu_ioctl(CPU(cpu), KVM_LARCH_GET_VCPU_STATE, &vcpu_state); ++ if (r < 0) { ++ error_report("get vcpu state failed %d", r); ++ return r; ++ } ++ ++ cpu->online_vcpus = vcpu_state.online_vcpus; ++ cpu->is_migrate = vcpu_state.is_migrate; ++ cpu->cpu_freq = vcpu_state.cpu_freq; ++ cpu->count_ctl = vcpu_state.count_ctl; ++ cpu->pending_exceptions = vcpu_state.pending_exceptions; ++ cpu->pending_exceptions_clr = vcpu_state.pending_exceptions_clr; ++ for (i = 0; i < 4; i++) { ++ cpu->core_ext_ioisr[i] = vcpu_state.core_ext_ioisr[i]; ++ } ++ ++ kvm_loongarch_get_pvtime(cpu); ++#endif ++ return 0; ++} ++ ++/* FPU state */ ++ ++static int get_fpr(QEMUFile *f, void *pv, size_t size, ++ const VMStateField *field) ++{ ++ fpr_t *v = pv; ++ qemu_get_be64s(f, &v->d); ++ return 0; ++} ++ ++static int put_fpr(QEMUFile *f, void *pv, size_t size, ++ const VMStateField *field, JSONWriter *vmdesc) ++{ ++ fpr_t *v = pv; ++ qemu_put_be64s(f, &v->d); ++ return 0; ++} ++ ++const VMStateInfo vmstate_info_fpr = { ++ .name = "fpr", ++ .get = get_fpr, ++ .put = put_fpr, ++}; ++ ++#define VMSTATE_FPR_ARRAY_V(_f, _s, _n, _v) \ ++ VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_fpr, fpr_t) ++ ++#define VMSTATE_FPR_ARRAY(_f, _s, _n) VMSTATE_FPR_ARRAY_V(_f, _s, _n, 0) ++ ++static VMStateField vmstate_fpu_fields[] = { ++ VMSTATE_FPR_ARRAY(fpr, CPULOONGARCHFPUContext, 32), ++ VMSTATE_UINT32(fcsr0, CPULOONGARCHFPUContext), VMSTATE_END_OF_LIST() ++}; ++ ++const VMStateDescription vmstate_fpu = { .name = "cpu/fpu", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = vmstate_fpu_fields }; ++ ++const VMStateDescription vmstate_inactive_fpu = { .name = "cpu/inactive_fpu", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = ++ vmstate_fpu_fields }; ++ ++/* TC state */ ++ ++static VMStateField vmstate_tc_fields[] = { ++ VMSTATE_UINTTL_ARRAY(gpr, TCState, 32), VMSTATE_UINTTL(PC, TCState), ++ VMSTATE_END_OF_LIST() ++}; ++ ++const VMStateDescription vmstate_tc = { .name = "cpu/tc", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = vmstate_tc_fields }; ++ ++const VMStateDescription vmstate_inactive_tc = { .name = "cpu/inactive_tc", ++ .version_id = 1, ++ .minimum_version_id = 1, ++ .fields = vmstate_tc_fields }; ++ ++/* TLB state */ ++ ++static int get_tlb(QEMUFile *f, void *pv, size_t size, ++ const VMStateField *field) ++{ ++ ls3a5k_tlb_t *v = pv; ++ uint32_t flags; ++ ++ qemu_get_betls(f, &v->VPN); ++ qemu_get_be64s(f, &v->PageMask); ++ qemu_get_be32s(f, &v->PageSize); ++ qemu_get_be16s(f, &v->ASID); ++ qemu_get_be32s(f, &flags); ++ v->RPLV1 = (flags >> 21) & 1; ++ v->RPLV0 = (flags >> 20) & 1; ++ v->PLV1 = (flags >> 18) & 3; ++ v->PLV0 = (flags >> 16) & 3; ++ v->EHINV = (flags >> 15) & 1; ++ v->RI1 = (flags >> 14) & 1; ++ v->RI0 = (flags >> 13) & 1; ++ v->XI1 = (flags >> 12) & 1; ++ v->XI0 = (flags >> 11) & 1; ++ v->WE1 = (flags >> 10) & 1; ++ v->WE0 = (flags >> 9) & 1; ++ v->V1 = (flags >> 8) & 1; ++ v->V0 = (flags >> 7) & 1; ++ v->C1 = (flags >> 4) & 7; ++ v->C0 = (flags >> 1) & 7; ++ v->G = (flags >> 0) & 1; ++ qemu_get_be64s(f, &v->PPN0); ++ qemu_get_be64s(f, &v->PPN1); ++ ++ return 0; ++} ++ ++static int put_tlb(QEMUFile *f, void *pv, size_t size, ++ const VMStateField *field, JSONWriter *vmdesc) ++{ ++ ls3a5k_tlb_t *v = pv; ++ ++ uint16_t asid = v->ASID; ++ uint32_t flags = ++ ((v->RPLV1 << 21) | (v->RPLV0 << 20) | (v->PLV1 << 18) | ++ (v->PLV0 << 16) | (v->EHINV << 15) | (v->RI1 << 14) | (v->RI0 << 13) | ++ (v->XI1 << 12) | (v->XI0 << 11) | (v->WE1 << 10) | (v->WE0 << 9) | ++ (v->V1 << 8) | (v->V0 << 7) | (v->C1 << 4) | (v->C0 << 1) | ++ (v->G << 0)); ++ ++ qemu_put_betls(f, &v->VPN); ++ qemu_put_be64s(f, &v->PageMask); ++ qemu_put_be32s(f, &v->PageSize); ++ qemu_put_be16s(f, &asid); ++ qemu_put_be32s(f, &flags); ++ qemu_put_be64s(f, &v->PPN0); ++ qemu_put_be64s(f, &v->PPN1); ++ ++ return 0; ++} ++ ++const VMStateInfo vmstate_info_tlb = { ++ .name = "tlb_entry", ++ .get = get_tlb, ++ .put = put_tlb, ++}; ++ ++#define VMSTATE_TLB_ARRAY_V(_f, _s, _n, _v) \ ++ VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_tlb, ls3a5k_tlb_t) ++ ++#define VMSTATE_TLB_ARRAY(_f, _s, _n) VMSTATE_TLB_ARRAY_V(_f, _s, _n, 0) ++ ++const VMStateDescription vmstate_tlb = { ++ .name = "cpu/tlb", ++ .version_id = 2, ++ .minimum_version_id = 2, ++ .fields = ++ (VMStateField[]){ VMSTATE_UINT32(nb_tlb, CPULOONGARCHTLBContext), ++ VMSTATE_UINT32(tlb_in_use, CPULOONGARCHTLBContext), ++ VMSTATE_TLB_ARRAY(mmu.ls3a5k.tlb, ++ CPULOONGARCHTLBContext, ++ LOONGARCH_TLB_MAX), ++ VMSTATE_END_OF_LIST() } ++}; ++ ++/* LOONGARCH CPU state */ ++ ++const VMStateDescription vmstate_loongarch_cpu = { ++ .name = "cpu", ++ .version_id = 15, ++ .minimum_version_id = 15, ++ .post_load = cpu_post_load, ++ .pre_save = cpu_pre_save, ++ .fields = ++ (VMStateField[]){ ++ /* Active TC */ ++ VMSTATE_STRUCT(env.active_tc, LOONGARCHCPU, 1, vmstate_tc, ++ TCState), ++ ++ /* Active FPU */ ++ VMSTATE_STRUCT(env.active_fpu, LOONGARCHCPU, 1, vmstate_fpu, ++ CPULOONGARCHFPUContext), ++ ++ /* TLB */ ++ VMSTATE_STRUCT_POINTER(env.tlb, LOONGARCHCPU, vmstate_tlb, ++ CPULOONGARCHTLBContext), ++ /* CPU metastate */ ++ VMSTATE_UINT32(env.current_tc, LOONGARCHCPU), ++ VMSTATE_INT32(env.error_code, LOONGARCHCPU), ++ VMSTATE_UINTTL(env.btarget, LOONGARCHCPU), ++ VMSTATE_UINTTL(env.bcond, LOONGARCHCPU), ++ ++ VMSTATE_UINT64(env.lladdr, LOONGARCHCPU), ++ ++ /* PV time */ ++ VMSTATE_UINT64(env.st.guest_addr, LOONGARCHCPU), ++ ++ /* Remaining CSR registers */ ++ VMSTATE_UINT64(env.CSR_CRMD, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PRMD, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_EUEN, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_MISC, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ECFG, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ESTAT, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ERA, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_BADV, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_BADI, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_EEPN, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBIDX, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBEHI, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBELO0, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBELO1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBWIRED, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_GTLBC, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TRGP, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PGDL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PGDH, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PGD, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PWCTL0, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PWCTL1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_STLBPGSIZE, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_RVACFG, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_CPUID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PRCFG1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PRCFG2, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PRCFG3, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_KS0, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_KS1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_KS2, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_KS3, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_KS4, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_KS5, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_KS6, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_KS7, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TMID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TCFG, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TVAL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_CNTC, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TINTCLR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_GSTAT, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_GCFG, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_GINTC, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_GCNTC, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_LLBCTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IMPCTL1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IMPCTL2, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_GNMI, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBRENT, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBRBADV, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBRERA, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBRSAVE, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBRELO0, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBRELO1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBREHI, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_TLBRPRMD, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ERRCTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ERRINFO, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ERRINFO1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ERRENT, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ERRERA, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_ERRSAVE, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_CTAG, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DMWIN0, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DMWIN1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DMWIN2, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DMWIN3, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PERFCTRL0, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PERFCNTR0, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PERFCTRL1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PERFCNTR1, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PERFCTRL2, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PERFCNTR2, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PERFCTRL3, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_PERFCNTR3, LOONGARCHCPU), ++ /* debug */ ++ VMSTATE_UINT64(env.CSR_MWPC, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_MWPS, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB0ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB0MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB0CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB0ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB1ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB1MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB1CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB1ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB2ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB2MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB2CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB2ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB3ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB3MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB3CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DB3ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_FWPC, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_FWPS, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB0ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB0MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB0CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB0ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB1ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB1MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB1CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB1ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB2ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB2MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB2CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB2ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB3ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB3MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB3CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB3ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB4ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB4MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB4CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB4ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB5ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB5MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB5CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB5ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB6ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB6MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB6CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB6ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB7ADDR, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB7MASK, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB7CTL, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_IB7ASID, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DEBUG, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DERA, LOONGARCHCPU), ++ VMSTATE_UINT64(env.CSR_DESAVE, LOONGARCHCPU), ++ ++ VMSTATE_STRUCT_ARRAY(env.fpus, LOONGARCHCPU, LOONGARCH_FPU_MAX, 1, ++ vmstate_inactive_fpu, CPULOONGARCHFPUContext), ++ VMSTATE_UINT8(online_vcpus, LOONGARCHCPU), ++ VMSTATE_UINT8(is_migrate, LOONGARCHCPU), ++ VMSTATE_UINT64(counter_value, LOONGARCHCPU), ++ VMSTATE_UINT32(cpu_freq, LOONGARCHCPU), ++ VMSTATE_UINT32(count_ctl, LOONGARCHCPU), ++ VMSTATE_UINT64(pending_exceptions, LOONGARCHCPU), ++ VMSTATE_UINT64(pending_exceptions_clr, LOONGARCHCPU), ++ VMSTATE_UINT64_ARRAY(core_ext_ioisr, LOONGARCHCPU, 4), ++ ++ VMSTATE_END_OF_LIST() }, ++}; +diff --git a/target/loongarch64/meson.build b/target/loongarch64/meson.build +new file mode 100644 +index 0000000000..6badf4484e +--- /dev/null ++++ b/target/loongarch64/meson.build +@@ -0,0 +1,35 @@ ++loongarch_user_ss = ss.source_set() ++loongarch_softmmu_ss = ss.source_set() ++loongarch_ss = ss.source_set() ++loongarch_ss.add(files( ++ 'cpu.c', ++ 'fpu.c', ++ 'gdbstub.c', ++)) ++ ++gen = [ ++ decodetree.process('insn.decode', extra_args: [ '--decode', 'decode_insn', ++ '--insnwidth', '32' ]) ++] ++ ++loongarch_ss.add(gen) ++loongarch_ss.add(when: 'CONFIG_TCG', if_true: files( ++ 'helper.c', ++ 'translate.c', ++ 'op_helper.c', ++ 'fpu_helper.c', ++ 'tlb_helper.c', ++ 'csr_helper.c', ++)) ++ ++loongarch_softmmu_ss.add(when: 'CONFIG_SOFTMMU', if_true: files( ++ 'machine.c', ++ 'stabletimer.c', ++ 'arch_dump.c', ++)) ++ ++loongarch_softmmu_ss.add(when: 'CONFIG_KVM', if_true: files('kvm.c')) ++ ++target_arch += {'loongarch64': loongarch_ss} ++target_softmmu_arch += {'loongarch64': loongarch_softmmu_ss} ++target_user_arch += {'loongarch64': loongarch_user_ss} +diff --git a/target/loongarch64/op_helper.c b/target/loongarch64/op_helper.c +new file mode 100644 +index 0000000000..7257e59479 +--- /dev/null ++++ b/target/loongarch64/op_helper.c +@@ -0,0 +1,485 @@ ++/* ++ * LOONGARCH emulation helpers for qemu. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu/main-loop.h" ++#include "cpu.h" ++#include "internal.h" ++#include "qemu/host-utils.h" ++#include "exec/helper-proto.h" ++#include "exec/exec-all.h" ++#include "exec/cpu_ldst.h" ++#include "sysemu/kvm.h" ++#include "qemu/crc32c.h" ++#include ++#include "hw/irq.h" ++#include "hw/core/cpu.h" ++#include "instmap.h" ++ ++/* Exceptions processing helpers */ ++ ++void helper_raise_exception_err(CPULOONGARCHState *env, uint32_t exception, ++ int error_code) ++{ ++ do_raise_exception_err(env, exception, error_code, 0); ++} ++ ++void helper_raise_exception(CPULOONGARCHState *env, uint32_t exception) ++{ ++ do_raise_exception(env, exception, GETPC()); ++} ++ ++void helper_raise_exception_debug(CPULOONGARCHState *env) ++{ ++ do_raise_exception(env, EXCP_DEBUG, 0); ++} ++ ++static void raise_exception(CPULOONGARCHState *env, uint32_t exception) ++{ ++ do_raise_exception(env, exception, 0); ++} ++ ++#if defined(CONFIG_USER_ONLY) ++#define HELPER_LD(name, insn, type) \ ++ static inline type do_##name(CPULOONGARCHState *env, target_ulong addr, \ ++ int mem_idx, uintptr_t retaddr) \ ++ { \ ++ return (type)cpu_##insn##_data_ra(env, addr, retaddr); \ ++ } ++#else ++ ++#define HF_SMAP_SHIFT 23 /* CR4.SMAP */ ++#define HF_SMAP_MASK (1 << HF_SMAP_SHIFT) ++#define MMU_KNOSMAP_IDX 2 ++#define HF_CPL_SHIFT 0 ++#define HF_CPL_MASK (3 << HF_CPL_SHIFT) ++#define AC_MASK 0x00040000 ++#define MMU_KSMAP_IDX 0 ++static inline int cpu_mmu_index_kernel(CPULOONGARCHState *env) ++{ ++ return !(env->hflags & HF_SMAP_MASK) ++ ? MMU_KNOSMAP_IDX ++ : ((env->hflags & HF_CPL_MASK) < 3 && (env->hflags & AC_MASK)) ++ ? MMU_KNOSMAP_IDX ++ : MMU_KSMAP_IDX; ++} ++ ++#define cpu_ldl_kernel_ra(e, p, r) \ ++ cpu_ldl_mmuidx_ra(e, p, cpu_mmu_index_kernel(e), r) ++ ++#define HELPER_LD(name, insn, type) \ ++ static inline type do_##name(CPULOONGARCHState *env, target_ulong addr, \ ++ int mem_idx, uintptr_t retaddr) \ ++ { \ ++ } ++#endif ++ ++#if defined(CONFIG_USER_ONLY) ++#define HELPER_ST(name, insn, type) \ ++ static inline void do_##name(CPULOONGARCHState *env, target_ulong addr, \ ++ type val, int mem_idx, uintptr_t retaddr) \ ++ { \ ++ } ++#else ++#define HELPER_ST(name, insn, type) \ ++ static inline void do_##name(CPULOONGARCHState *env, target_ulong addr, \ ++ type val, int mem_idx, uintptr_t retaddr) \ ++ { \ ++ } ++#endif ++ ++static inline target_ulong bitswap(target_ulong v) ++{ ++ v = ((v >> 1) & (target_ulong)0x5555555555555555ULL) | ++ ((v & (target_ulong)0x5555555555555555ULL) << 1); ++ v = ((v >> 2) & (target_ulong)0x3333333333333333ULL) | ++ ((v & (target_ulong)0x3333333333333333ULL) << 2); ++ v = ((v >> 4) & (target_ulong)0x0F0F0F0F0F0F0F0FULL) | ++ ((v & (target_ulong)0x0F0F0F0F0F0F0F0FULL) << 4); ++ return v; ++} ++ ++target_ulong helper_dbitswap(target_ulong rt) ++{ ++ return bitswap(rt); ++} ++ ++target_ulong helper_bitswap(target_ulong rt) ++{ ++ return (int32_t)bitswap(rt); ++} ++ ++/* these crc32 functions are based on target/arm/helper-a64.c */ ++target_ulong helper_crc32(target_ulong val, target_ulong m, uint32_t sz) ++{ ++ uint8_t buf[8]; ++ target_ulong mask = ((sz * 8) == 64) ? -1ULL : ((1ULL << (sz * 8)) - 1); ++ ++ m &= mask; ++ stq_le_p(buf, m); ++ return (int32_t)(crc32(val ^ 0xffffffff, buf, sz) ^ 0xffffffff); ++} ++ ++target_ulong helper_crc32c(target_ulong val, target_ulong m, uint32_t sz) ++{ ++ uint8_t buf[8]; ++ target_ulong mask = ((sz * 8) == 64) ? -1ULL : ((1ULL << (sz * 8)) - 1); ++ m &= mask; ++ stq_le_p(buf, m); ++ return (int32_t)(crc32c(val, buf, sz) ^ 0xffffffff); ++} ++ ++#ifndef CONFIG_USER_ONLY ++ ++#define HELPER_LD_ATOMIC(name, insn, almask) \ ++ target_ulong helper_##name(CPULOONGARCHState *env, target_ulong arg, \ ++ int mem_idx) \ ++ { \ ++ } ++#endif ++ ++#ifndef CONFIG_USER_ONLY ++void helper_drdtime(CPULOONGARCHState *env, target_ulong rd, target_ulong rs) ++{ ++ env->active_tc.gpr[rd] = cpu_loongarch_get_stable_counter(env); ++ env->active_tc.gpr[rs] = env->CSR_TMID; ++} ++#endif ++ ++#ifndef CONFIG_USER_ONLY ++static void debug_pre_ertn(CPULOONGARCHState *env) ++{ ++ if (qemu_loglevel_mask(CPU_LOG_EXEC)) { ++ qemu_log("ERTN: PC " TARGET_FMT_lx " ERA " TARGET_FMT_lx, ++ env->active_tc.PC, env->CSR_ERA); ++ qemu_log("\n"); ++ } ++} ++ ++static void debug_post_ertn(CPULOONGARCHState *env) ++{ ++ if (qemu_loglevel_mask(CPU_LOG_EXEC)) { ++ qemu_log("ERTN: PC " TARGET_FMT_lx " ERA " TARGET_FMT_lx, ++ env->active_tc.PC, env->CSR_ERA); ++ } ++} ++ ++static void set_pc(CPULOONGARCHState *env, target_ulong error_pc) ++{ ++ env->active_tc.PC = error_pc & ~(target_ulong)1; ++} ++ ++static inline void exception_return(CPULOONGARCHState *env) ++{ ++ debug_pre_ertn(env); ++ ++ if (cpu_refill_state(env)) { ++ env->CSR_CRMD &= (~0x7); ++ env->CSR_CRMD |= (env->CSR_TLBRPRMD & 0x7); ++ /* Clear Refill flag and set pc */ ++ env->CSR_TLBRERA &= (~0x1); ++ set_pc(env, env->CSR_TLBRERA); ++ if (qemu_loglevel_mask(CPU_LOG_INT)) { ++ qemu_log("%s: TLBRERA 0x%lx\n", __func__, env->CSR_TLBRERA); ++ } ++ } else { ++ env->CSR_CRMD &= (~0x7); ++ env->CSR_CRMD |= (env->CSR_PRMD & 0x7); ++ /* Clear Refill flag and set pc*/ ++ set_pc(env, env->CSR_ERA); ++ if (qemu_loglevel_mask(CPU_LOG_INT)) { ++ qemu_log("%s: ERA 0x%lx\n", __func__, env->CSR_ERA); ++ } ++ } ++ ++ compute_hflags(env); ++ debug_post_ertn(env); ++} ++ ++void helper_ertn(CPULOONGARCHState *env) ++{ ++ exception_return(env); ++ env->lladdr = 1; ++} ++ ++#endif /* !CONFIG_USER_ONLY */ ++ ++void helper_idle(CPULOONGARCHState *env) ++{ ++ CPUState *cs = CPU(loongarch_env_get_cpu(env)); ++ ++ cs->halted = 1; ++ cpu_reset_interrupt(cs, CPU_INTERRUPT_WAKE); ++ /* ++ * Last instruction in the block, PC was updated before ++ * - no need to recover PC and icount ++ */ ++ raise_exception(env, EXCP_HLT); ++} ++ ++#if !defined(CONFIG_USER_ONLY) ++ ++void loongarch_cpu_do_unaligned_access(CPUState *cs, vaddr addr, ++ MMUAccessType access_type, int mmu_idx, ++ uintptr_t retaddr) ++{ ++ while (1) { ++ } ++} ++ ++#endif /* !CONFIG_USER_ONLY */ ++ ++void helper_store_scr(CPULOONGARCHState *env, uint32_t n, target_ulong val) ++{ ++ env->scr[n & 0x3] = val; ++} ++ ++target_ulong helper_load_scr(CPULOONGARCHState *env, uint32_t n) ++{ ++ return env->scr[n & 0x3]; ++} ++ ++/* loongarch assert op */ ++void helper_asrtle_d(CPULOONGARCHState *env, target_ulong rs, target_ulong rt) ++{ ++ if (rs > rt) { ++ do_raise_exception(env, EXCP_AdEL, GETPC()); ++ } ++} ++ ++void helper_asrtgt_d(CPULOONGARCHState *env, target_ulong rs, target_ulong rt) ++{ ++ if (rs <= rt) { ++ do_raise_exception(env, EXCP_AdEL, GETPC()); ++ } ++} ++ ++target_ulong helper_cto_w(CPULOONGARCHState *env, target_ulong a0) ++{ ++ uint32_t v = (uint32_t)a0; ++ int temp = 0; ++ ++ while ((v & 0x1) == 1) { ++ temp++; ++ v = v >> 1; ++ } ++ ++ return (target_ulong)temp; ++} ++ ++target_ulong helper_ctz_w(CPULOONGARCHState *env, target_ulong a0) ++{ ++ uint32_t v = (uint32_t)a0; ++ ++ if (v == 0) { ++ return 32; ++ } ++ ++ int temp = 0; ++ while ((v & 0x1) == 0) { ++ temp++; ++ v = v >> 1; ++ } ++ ++ return (target_ulong)temp; ++} ++ ++target_ulong helper_cto_d(CPULOONGARCHState *env, target_ulong a0) ++{ ++ uint64_t v = a0; ++ int temp = 0; ++ ++ while ((v & 0x1) == 1) { ++ temp++; ++ v = v >> 1; ++ } ++ ++ return (target_ulong)temp; ++} ++ ++target_ulong helper_ctz_d(CPULOONGARCHState *env, target_ulong a0) ++{ ++ uint64_t v = a0; ++ ++ if (v == 0) { ++ return 64; ++ } ++ ++ int temp = 0; ++ while ((v & 0x1) == 0) { ++ temp++; ++ v = v >> 1; ++ } ++ ++ return (target_ulong)temp; ++} ++ ++target_ulong helper_bitrev_w(CPULOONGARCHState *env, target_ulong a0) ++{ ++ int32_t v = (int32_t)a0; ++ const int SIZE = 32; ++ uint8_t bytes[SIZE]; ++ ++ int i; ++ for (i = 0; i < SIZE; i++) { ++ bytes[i] = v & 0x1; ++ v = v >> 1; ++ } ++ /* v == 0 */ ++ for (i = 0; i < SIZE; i++) { ++ v = v | ((uint32_t)bytes[i] << (SIZE - 1 - i)); ++ } ++ ++ return (target_ulong)(int32_t)v; ++} ++ ++target_ulong helper_bitrev_d(CPULOONGARCHState *env, target_ulong a0) ++{ ++ uint64_t v = a0; ++ const int SIZE = 64; ++ uint8_t bytes[SIZE]; ++ ++ int i; ++ for (i = 0; i < SIZE; i++) { ++ bytes[i] = v & 0x1; ++ v = v >> 1; ++ } ++ /* v == 0 */ ++ for (i = 0; i < SIZE; i++) { ++ v = v | ((uint64_t)bytes[i] << (SIZE - 1 - i)); ++ } ++ ++ return (target_ulong)v; ++} ++ ++void helper_memtrace_addr(CPULOONGARCHState *env, target_ulong address, ++ uint32_t op) ++{ ++ qemu_log("[cpu %d asid 0x%lx pc 0x%lx] addr 0x%lx op", ++ CPU(loongarch_env_get_cpu(env))->cpu_index, env->CSR_ASID, ++ env->active_tc.PC, address); ++ switch (op) { ++ case OPC_LARCH_LDPTR_D: ++ qemu_log("OPC_LARCH_LDPTR_D"); ++ break; ++ case OPC_LARCH_LD_D: ++ qemu_log("OPC_LARCH_LD_D"); ++ break; ++ case OPC_LARCH_LDPTR_W: ++ qemu_log("OPC_LARCH_LDPTR_W"); ++ break; ++ case OPC_LARCH_LD_W: ++ qemu_log("OPC_LARCH_LD_W"); ++ break; ++ case OPC_LARCH_LD_H: ++ qemu_log("OPC_LARCH_LD_H"); ++ break; ++ case OPC_LARCH_LD_B: ++ qemu_log("OPC_LARCH_LD_B"); ++ break; ++ case OPC_LARCH_LD_WU: ++ qemu_log("OPC_LARCH_LD_WU"); ++ break; ++ case OPC_LARCH_LD_HU: ++ qemu_log("OPC_LARCH_LD_HU"); ++ break; ++ case OPC_LARCH_LD_BU: ++ qemu_log("OPC_LARCH_LD_BU"); ++ break; ++ case OPC_LARCH_STPTR_D: ++ qemu_log("OPC_LARCH_STPTR_D"); ++ break; ++ case OPC_LARCH_ST_D: ++ qemu_log("OPC_LARCH_ST_D"); ++ break; ++ case OPC_LARCH_STPTR_W: ++ qemu_log("OPC_LARCH_STPTR_W"); ++ break; ++ case OPC_LARCH_ST_W: ++ qemu_log("OPC_LARCH_ST_W"); ++ break; ++ case OPC_LARCH_ST_H: ++ qemu_log("OPC_LARCH_ST_H"); ++ break; ++ case OPC_LARCH_ST_B: ++ qemu_log("OPC_LARCH_ST_B"); ++ break; ++ case OPC_LARCH_FLD_S: ++ qemu_log("OPC_LARCH_FLD_S"); ++ break; ++ case OPC_LARCH_FLD_D: ++ qemu_log("OPC_LARCH_FLD_D"); ++ break; ++ case OPC_LARCH_FST_S: ++ qemu_log("OPC_LARCH_FST_S"); ++ break; ++ case OPC_LARCH_FST_D: ++ qemu_log("OPC_LARCH_FST_D"); ++ break; ++ case OPC_LARCH_FLDX_S: ++ qemu_log("OPC_LARCH_FLDX_S"); ++ break; ++ case OPC_LARCH_FLDGT_S: ++ qemu_log("OPC_LARCH_FLDGT_S"); ++ break; ++ case OPC_LARCH_FLDLE_S: ++ qemu_log("OPC_LARCH_FLDLE_S"); ++ break; ++ case OPC_LARCH_FSTX_S: ++ qemu_log("OPC_LARCH_FSTX_S"); ++ break; ++ case OPC_LARCH_FSTGT_S: ++ qemu_log("OPC_LARCH_FSTGT_S"); ++ break; ++ case OPC_LARCH_FSTLE_S: ++ qemu_log("OPC_LARCH_FSTLE_S"); ++ break; ++ case OPC_LARCH_FLDX_D: ++ qemu_log("OPC_LARCH_FLDX_D"); ++ break; ++ case OPC_LARCH_FLDGT_D: ++ qemu_log("OPC_LARCH_FLDGT_D"); ++ break; ++ case OPC_LARCH_FLDLE_D: ++ qemu_log("OPC_LARCH_FLDLE_D"); ++ break; ++ case OPC_LARCH_FSTX_D: ++ qemu_log("OPC_LARCH_FSTX_D"); ++ break; ++ case OPC_LARCH_FSTGT_D: ++ qemu_log("OPC_LARCH_FSTGT_D"); ++ break; ++ case OPC_LARCH_FSTLE_D: ++ qemu_log("OPC_LARCH_FSTLE_D"); ++ break; ++ case OPC_LARCH_LL_W: ++ qemu_log("OPC_LARCH_LL_W"); ++ break; ++ case OPC_LARCH_LL_D: ++ qemu_log("OPC_LARCH_LL_D"); ++ break; ++ default: ++ qemu_log("0x%x", op); ++ } ++} ++ ++void helper_memtrace_val(CPULOONGARCHState *env, target_ulong val) ++{ ++ qemu_log("val 0x%lx\n", val); ++} +diff --git a/target/loongarch64/stabletimer.c b/target/loongarch64/stabletimer.c +new file mode 100644 +index 0000000000..4f4ccc5d89 +--- /dev/null ++++ b/target/loongarch64/stabletimer.c +@@ -0,0 +1,117 @@ ++/* ++ * QEMU LOONGARCH timer support ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "hw/loongarch/cpudevs.h" ++#include "qemu/timer.h" ++#include "sysemu/kvm.h" ++#include "internal.h" ++#include "hw/irq.h" ++ ++#ifdef DEBUG_TIMER ++#define debug_timer(fmt, args...) \ ++ printf("%s(%d)-%s -> " #fmt "\n", __FILE__, __LINE__, __func__, ##args); ++#else ++#define debug_timer(fmt, args...) ++#endif ++ ++#define TIMER_PERIOD 10 /* 10 ns period for 100 Mhz frequency */ ++#define STABLETIMER_TICK_MASK 0xfffffffffffcUL ++#define STABLETIMER_ENABLE 0x1UL ++#define STABLETIMER_PERIOD 0x2UL ++ ++/* return random value in [low, high] */ ++uint32_t cpu_loongarch_get_random_ls3a5k_tlb(uint32_t low, uint32_t high) ++{ ++ static uint32_t seed = 5; ++ static uint32_t prev_idx; ++ uint32_t idx; ++ uint32_t nb_rand_tlb = high - low + 1; ++ ++ do { ++ seed = 1103515245 * seed + 12345; ++ idx = (seed >> 16) % nb_rand_tlb + low; ++ } while (idx == prev_idx); ++ prev_idx = idx; ++ ++ return idx; ++} ++ ++/* LOONGARCH timer */ ++uint64_t cpu_loongarch_get_stable_counter(CPULOONGARCHState *env) ++{ ++ return qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) / TIMER_PERIOD; ++} ++ ++uint64_t cpu_loongarch_get_stable_timer_ticks(CPULOONGARCHState *env) ++{ ++ uint64_t now, expire; ++ ++ now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); ++ expire = timer_expire_time_ns(env->timer); ++ ++ return (expire - now) / TIMER_PERIOD; ++} ++ ++void cpu_loongarch_store_stable_timer_config(CPULOONGARCHState *env, ++ uint64_t value) ++{ ++ uint64_t now, next; ++ ++ env->CSR_TCFG = value; ++ if (value & STABLETIMER_ENABLE) { ++ now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); ++ next = now + (value & STABLETIMER_TICK_MASK) * TIMER_PERIOD; ++ timer_mod(env->timer, next); ++ } ++ debug_timer("0x%lx 0x%lx now 0x%lx, next 0x%lx", value, env->CSR_TCFG, now, ++ next); ++} ++ ++static void loongarch_stable_timer_cb(void *opaque) ++{ ++ CPULOONGARCHState *env; ++ uint64_t now, next; ++ ++ env = opaque; ++ debug_timer(); ++ if (env->CSR_TCFG & STABLETIMER_PERIOD) { ++ now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); ++ next = now + (env->CSR_TCFG & STABLETIMER_TICK_MASK) * TIMER_PERIOD; ++ timer_mod(env->timer, next); ++ } else { ++ env->CSR_TCFG &= ~STABLETIMER_ENABLE; ++ } ++ ++ qemu_irq_raise(env->irq[IRQ_TIMER]); ++} ++ ++void cpu_loongarch_clock_init(LOONGARCHCPU *cpu) ++{ ++ CPULOONGARCHState *env = &cpu->env; ++ ++ /* ++ * If we're in KVM mode, don't create the periodic timer, that is handled ++ * in kernel. ++ */ ++ if (!kvm_enabled()) { ++ env->timer = ++ timer_new_ns(QEMU_CLOCK_VIRTUAL, &loongarch_stable_timer_cb, env); ++ } ++} +diff --git a/target/loongarch64/tlb_helper.c b/target/loongarch64/tlb_helper.c +new file mode 100644 +index 0000000000..b6e924fbec +--- /dev/null ++++ b/target/loongarch64/tlb_helper.c +@@ -0,0 +1,641 @@ ++/* ++ * loongarch tlb emulation helpers for qemu. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "qemu/main-loop.h" ++#include "cpu.h" ++#include "internal.h" ++#include "qemu/host-utils.h" ++#include "exec/helper-proto.h" ++#include "exec/exec-all.h" ++#include "exec/cpu_ldst.h" ++ ++#ifndef CONFIG_USER_ONLY ++ ++#define HELPER_LD(name, insn, type) \ ++ static inline type do_##name(CPULOONGARCHState *env, target_ulong addr, \ ++ int mem_idx, uintptr_t retaddr) \ ++ { \ ++ } ++ ++void helper_lddir(CPULOONGARCHState *env, target_ulong base, target_ulong rt, ++ target_ulong level, uint32_t mem_idx) ++{ ++} ++ ++void helper_ldpte(CPULOONGARCHState *env, target_ulong base, target_ulong odd, ++ uint32_t mem_idx) ++{ ++} ++ ++target_ulong helper_read_pgd(CPULOONGARCHState *env) ++{ ++ uint64_t badv; ++ ++ assert(env->CSR_TLBRERA & 0x1); ++ ++ if (env->CSR_TLBRERA & 0x1) { ++ badv = env->CSR_TLBRBADV; ++ } else { ++ badv = env->CSR_BADV; ++ } ++ ++ if ((badv >> 63) & 0x1) { ++ return env->CSR_PGDH; ++ } else { ++ return env->CSR_PGDL; ++ } ++} ++ ++/* TLB management */ ++static uint64_t ls3a5k_pagesize_to_mask(int pagesize) ++{ ++ /* 4KB - 1GB */ ++ if (pagesize < 12 && pagesize > 30) { ++ printf("[ERROR] unsupported page size %d\n", pagesize); ++ exit(-1); ++ } ++ ++ return (1 << (pagesize + 1)) - 1; ++} ++ ++static void ls3a5k_fill_tlb_entry(CPULOONGARCHState *env, ls3a5k_tlb_t *tlb, ++ int is_ftlb) ++{ ++ uint64_t page_mask; /* 0000...00001111...1111 */ ++ uint32_t page_size; ++ uint64_t entryhi; ++ uint64_t lo0, lo1; ++ ++ if (env->CSR_TLBRERA & 0x1) { ++ page_size = env->CSR_TLBREHI & 0x3f; ++ entryhi = env->CSR_TLBREHI; ++ lo0 = env->CSR_TLBRELO0; ++ lo1 = env->CSR_TLBRELO1; ++ } else { ++ page_size = (env->CSR_TLBIDX >> CSR_TLBIDX_PS_SHIFT) & 0x3f; ++ entryhi = env->CSR_TLBEHI; ++ lo0 = env->CSR_TLBELO0; ++ lo1 = env->CSR_TLBELO1; ++ } ++ ++ if (page_size == 0) { ++ printf("Warning: page_size is 0\n"); ++ } ++ ++ /* ++ * 15-12 11-8 7-4 3-0 ++ * 4KB: 0001 1111 1111 1111 // double 4KB mask [12:0] ++ * 16KB: 0111 1111 1111 1111 // double 16KB mask [14:0] ++ */ ++ if (is_ftlb) { ++ page_mask = env->tlb->mmu.ls3a5k.ftlb_mask; ++ } else { ++ page_mask = ls3a5k_pagesize_to_mask(page_size); ++ } ++ ++ tlb->VPN = entryhi & 0xffffffffe000 & ~page_mask; ++ ++ tlb->ASID = env->CSR_ASID & 0x3ff; /* CSR_ASID[9:0] */ ++ tlb->EHINV = 0; ++ tlb->G = (lo0 >> CSR_TLBLO0_GLOBAL_SHIFT) & /* CSR_TLBLO[6] */ ++ (lo1 >> CSR_TLBLO1_GLOBAL_SHIFT) & 1; ++ ++ tlb->PageMask = page_mask; ++ tlb->PageSize = page_size; ++ ++ tlb->V0 = (lo0 >> CSR_TLBLO0_V_SHIFT) & 0x1; /* [0] */ ++ tlb->WE0 = (lo0 >> CSR_TLBLO0_WE_SHIFT) & 0x1; /* [1] */ ++ tlb->PLV0 = (lo0 >> CSR_TLBLO0_PLV_SHIFT) & 0x3; /* [3:2] */ ++ tlb->C0 = (lo0 >> CSR_TLBLO0_CCA_SHIFT) & 0x3; /* [5:4] */ ++ tlb->PPN0 = (lo0 & 0xfffffffff000 & ~(page_mask >> 1)); ++ tlb->RI0 = (lo0 >> CSR_TLBLO0_RI_SHIFT) & 0x1; /* [61] */ ++ tlb->XI0 = (lo0 >> CSR_TLBLO0_XI_SHIFT) & 0x1; /* [62] */ ++ tlb->RPLV0 = (lo0 >> CSR_TLBLO0_RPLV_SHIFT) & 0x1; /* [63] */ ++ ++ tlb->V1 = (lo1 >> CSR_TLBLO1_V_SHIFT) & 0x1; /* [0] */ ++ tlb->WE1 = (lo1 >> CSR_TLBLO1_WE_SHIFT) & 0x1; /* [1] */ ++ tlb->PLV1 = (lo1 >> CSR_TLBLO1_PLV_SHIFT) & 0x3; /* [3:2] */ ++ tlb->C1 = (lo1 >> CSR_TLBLO1_CCA_SHIFT) & 0x3; /* [5:4] */ ++ tlb->PPN1 = (lo1 & 0xfffffffff000 & ~(page_mask >> 1)); ++ tlb->RI1 = (lo1 >> CSR_TLBLO1_RI_SHIFT) & 0x1; /* [61] */ ++ tlb->XI1 = (lo1 >> CSR_TLBLO1_XI_SHIFT) & 0x1; /* [62] */ ++ tlb->RPLV1 = (lo1 >> CSR_TLBLO1_RPLV_SHIFT) & 0x1; /* [63] */ ++} ++ ++static void ls3a5k_fill_tlb(CPULOONGARCHState *env, int idx, bool tlbwr) ++{ ++ ls3a5k_tlb_t *tlb; ++ ++ tlb = &env->tlb->mmu.ls3a5k.tlb[idx]; ++ if (tlbwr) { ++ if ((env->CSR_TLBIDX >> CSR_TLBIDX_EHINV_SHIFT) & 0x1) { ++ tlb->EHINV = 1; ++ return; ++ } ++ } ++ ++ if (idx < 2048) { ++ ls3a5k_fill_tlb_entry(env, tlb, 1); ++ } else { ++ ls3a5k_fill_tlb_entry(env, tlb, 0); ++ } ++} ++ ++void ls3a5k_flush_vtlb(CPULOONGARCHState *env) ++{ ++ uint32_t ftlb_size = env->tlb->mmu.ls3a5k.ftlb_size; ++ uint32_t vtlb_size = env->tlb->mmu.ls3a5k.vtlb_size; ++ int i; ++ ++ ls3a5k_tlb_t *tlb; ++ ++ for (i = ftlb_size; i < ftlb_size + vtlb_size; ++i) { ++ tlb = &env->tlb->mmu.ls3a5k.tlb[i]; ++ tlb->EHINV = 1; ++ } ++ ++ cpu_loongarch_tlb_flush(env); ++} ++ ++void ls3a5k_flush_ftlb(CPULOONGARCHState *env) ++{ ++ uint32_t ftlb_size = env->tlb->mmu.ls3a5k.ftlb_size; ++ int i; ++ ++ ls3a5k_tlb_t *tlb; ++ ++ for (i = 0; i < ftlb_size; ++i) { ++ tlb = &env->tlb->mmu.ls3a5k.tlb[i]; ++ tlb->EHINV = 1; ++ } ++ ++ cpu_loongarch_tlb_flush(env); ++} ++ ++void ls3a5k_helper_tlbclr(CPULOONGARCHState *env) ++{ ++ int i; ++ uint16_t asid; ++ int vsize, fsize, index; ++ int start = 0, end = -1; ++ ++ asid = env->CSR_ASID & 0x3ff; ++ vsize = env->tlb->mmu.ls3a5k.vtlb_size; ++ fsize = env->tlb->mmu.ls3a5k.ftlb_size; ++ index = env->CSR_TLBIDX & CSR_TLBIDX_IDX; ++ ++ if (index < fsize) { ++ /* FTLB. One line per operation */ ++ int set = index % 256; ++ start = set * 8; ++ end = start + 7; ++ } else if (index < (fsize + vsize)) { ++ /* VTLB. All entries */ ++ start = fsize; ++ end = fsize + vsize - 1; ++ } else { ++ /* Ignore */ ++ } ++ ++ for (i = start; i <= end; i++) { ++ ls3a5k_tlb_t *tlb; ++ tlb = &env->tlb->mmu.ls3a5k.tlb[i]; ++ if (!tlb->G && tlb->ASID == asid) { ++ tlb->EHINV = 1; ++ } ++ } ++ ++ cpu_loongarch_tlb_flush(env); ++} ++ ++void ls3a5k_helper_tlbflush(CPULOONGARCHState *env) ++{ ++ int i; ++ int vsize, fsize, index; ++ int start = 0, end = -1; ++ ++ vsize = env->tlb->mmu.ls3a5k.vtlb_size; ++ fsize = env->tlb->mmu.ls3a5k.ftlb_size; ++ index = env->CSR_TLBIDX & CSR_TLBIDX_IDX; ++ ++ if (index < fsize) { ++ /* FTLB. One line per operation */ ++ int set = index % 256; ++ start = set * 8; ++ end = start + 7; ++ } else if (index < (fsize + vsize)) { ++ /* VTLB. All entries */ ++ start = fsize; ++ end = fsize + vsize - 1; ++ } else { ++ /* Ignore */ ++ } ++ ++ for (i = start; i <= end; i++) { ++ env->tlb->mmu.ls3a5k.tlb[i].EHINV = 1; ++ } ++ ++ cpu_loongarch_tlb_flush(env); ++} ++ ++void ls3a5k_helper_invtlb(CPULOONGARCHState *env, target_ulong addr, ++ target_ulong info, int op) ++{ ++ uint32_t asid = info & 0x3ff; ++ int i; ++ ++ switch (op) { ++ case 0: ++ case 1: ++ for (i = 0; i < env->tlb->nb_tlb; i++) { ++ env->tlb->mmu.ls3a5k.tlb[i].EHINV = 1; ++ } ++ break; ++ case 4: { ++ int i; ++ for (i = 0; i < env->tlb->nb_tlb; i++) { ++ struct ls3a5k_tlb_t *tlb = &env->tlb->mmu.ls3a5k.tlb[i]; ++ ++ if (!tlb->G && tlb->ASID == asid) { ++ tlb->EHINV = 1; ++ } ++ } ++ break; ++ } ++ ++ case 5: { ++ int i; ++ for (i = 0; i < env->tlb->nb_tlb; i++) { ++ struct ls3a5k_tlb_t *tlb = &env->tlb->mmu.ls3a5k.tlb[i]; ++ uint64_t vpn = addr & 0xffffffffe000 & ~tlb->PageMask; ++ ++ if (!tlb->G && tlb->ASID == asid && vpn == tlb->VPN) { ++ tlb->EHINV = 1; ++ } ++ } ++ break; ++ } ++ case 6: { ++ int i; ++ for (i = 0; i < env->tlb->nb_tlb; i++) { ++ struct ls3a5k_tlb_t *tlb = &env->tlb->mmu.ls3a5k.tlb[i]; ++ uint64_t vpn = addr & 0xffffffffe000 & ~tlb->PageMask; ++ ++ if ((tlb->G || tlb->ASID == asid) && vpn == tlb->VPN) { ++ tlb->EHINV = 1; ++ } ++ } ++ break; ++ } ++ default: ++ helper_raise_exception(env, EXCP_RI); ++ } ++ ++ cpu_loongarch_tlb_flush(env); ++} ++ ++static void ls3a5k_invalidate_tlb_entry(CPULOONGARCHState *env, ++ ls3a5k_tlb_t *tlb) ++{ ++ LOONGARCHCPU *cpu = loongarch_env_get_cpu(env); ++ CPUState *cs = CPU(cpu); ++ target_ulong addr; ++ target_ulong end; ++ target_ulong mask; ++ ++ mask = tlb->PageMask; /* 000...000111...111 */ ++ ++ if (tlb->V0) { ++ addr = tlb->VPN & ~mask; /* xxx...xxx[0]000..0000 */ ++ end = addr | (mask >> 1); /* xxx...xxx[0]111..1111 */ ++ while (addr < end) { ++ tlb_flush_page(cs, addr); ++ addr += TARGET_PAGE_SIZE; ++ } ++ } ++ ++ if (tlb->V1) { ++ /* xxx...xxx[1]000..0000 */ ++ addr = (tlb->VPN & ~mask) | ((mask >> 1) + 1); ++ end = addr | mask; /* xxx...xxx[1]111..1111 */ ++ while (addr - 1 < end) { ++ tlb_flush_page(cs, addr); ++ addr += TARGET_PAGE_SIZE; ++ } ++ } ++} ++ ++void ls3a5k_invalidate_tlb(CPULOONGARCHState *env, int idx) ++{ ++ ls3a5k_tlb_t *tlb; ++ int asid = env->CSR_ASID & 0x3ff; ++ tlb = &env->tlb->mmu.ls3a5k.tlb[idx]; ++ if (tlb->G == 0 && tlb->ASID != asid) { ++ return; ++ } ++ ls3a5k_invalidate_tlb_entry(env, tlb); ++} ++ ++void ls3a5k_helper_tlbwr(CPULOONGARCHState *env) ++{ ++ int idx = env->CSR_TLBIDX & CSR_TLBIDX_IDX; /* [11:0] */ ++ ++ /* Convert idx if in FTLB */ ++ if (idx < env->tlb->mmu.ls3a5k.ftlb_size) { ++ /* ++ * 0 3 6 0 1 2 ++ * 1 4 7 => 3 4 5 ++ * 2 5 8 6 7 8 ++ */ ++ int set = idx % 256; ++ int way = idx / 256; ++ idx = set * 8 + way; ++ } ++ ls3a5k_invalidate_tlb(env, idx); ++ ls3a5k_fill_tlb(env, idx, true); ++} ++ ++void ls3a5k_helper_tlbfill(CPULOONGARCHState *env) ++{ ++ uint64_t mask; ++ uint64_t address; ++ int idx; ++ int set, ftlb_idx; ++ ++ uint64_t entryhi; ++ uint32_t pagesize; ++ ++ if (env->CSR_TLBRERA & 0x1) { ++ entryhi = env->CSR_TLBREHI & ~0x3f; ++ pagesize = env->CSR_TLBREHI & 0x3f; ++ } else { ++ entryhi = env->CSR_TLBEHI; ++ pagesize = (env->CSR_TLBIDX >> CSR_TLBIDX_PS_SHIFT) & 0x3f; ++ } ++ ++ uint32_t ftlb_size = env->tlb->mmu.ls3a5k.ftlb_size; ++ uint32_t vtlb_size = env->tlb->mmu.ls3a5k.vtlb_size; ++ ++ mask = ls3a5k_pagesize_to_mask(pagesize); ++ ++ if (mask == env->tlb->mmu.ls3a5k.ftlb_mask && ++ env->tlb->mmu.ls3a5k.ftlb_size > 0) { ++ /* only write into FTLB */ ++ address = entryhi & 0xffffffffe000; /* [47:13] */ ++ ++ /* choose one set ramdomly */ ++ set = cpu_loongarch_get_random_ls3a5k_tlb(0, 7); ++ ++ /* index in one set */ ++ ftlb_idx = (address >> 15) & 0xff; /* [0,255] */ ++ ++ /* final idx */ ++ idx = ftlb_idx * 8 + set; /* max is 7 + 8 * 255 = 2047 */ ++ } else { ++ /* only write into VTLB */ ++ int wired_nr = env->CSR_TLBWIRED & 0x3f; ++ idx = cpu_loongarch_get_random_ls3a5k_tlb(ftlb_size + wired_nr, ++ ftlb_size + vtlb_size - 1); ++ } ++ ++ ls3a5k_invalidate_tlb(env, idx); ++ ls3a5k_fill_tlb(env, idx, false); ++} ++ ++void ls3a5k_helper_tlbsrch(CPULOONGARCHState *env) ++{ ++ uint64_t mask; ++ uint64_t vpn; ++ uint64_t tag; ++ uint16_t asid; ++ ++ int ftlb_size = env->tlb->mmu.ls3a5k.ftlb_size; ++ int vtlb_size = env->tlb->mmu.ls3a5k.vtlb_size; ++ int i; ++ int ftlb_idx; /* [0,255] 2^8 0xff */ ++ ++ ls3a5k_tlb_t *tlb; ++ ++ asid = env->CSR_ASID & 0x3ff; ++ ++ /* search VTLB */ ++ for (i = ftlb_size; i < ftlb_size + vtlb_size; ++i) { ++ tlb = &env->tlb->mmu.ls3a5k.tlb[i]; ++ mask = tlb->PageMask; ++ ++ vpn = env->CSR_TLBEHI & 0xffffffffe000 & ~mask; ++ tag = tlb->VPN & ~mask; ++ ++ if ((tlb->G == 1 || tlb->ASID == asid) && vpn == tag && ++ tlb->EHINV != 1) { ++ env->CSR_TLBIDX = ++ (i & 0xfff) | ((tlb->PageSize & 0x3f) << CSR_TLBIDX_PS_SHIFT); ++ goto _MATCH_OUT_; ++ } ++ } ++ ++ if (ftlb_size == 0) { ++ goto _NO_MATCH_OUT_; ++ } ++ ++ /* search FTLB */ ++ mask = env->tlb->mmu.ls3a5k.ftlb_mask; ++ vpn = env->CSR_TLBEHI & 0xffffffffe000 & ~mask; ++ ++ ftlb_idx = (env->CSR_TLBEHI & 0xffffffffe000) >> 15; /* 16 KB */ ++ ftlb_idx = ftlb_idx & 0xff; /* [0,255] */ ++ ++ for (i = 0; i < 8; ++i) { ++ tlb = &env->tlb->mmu.ls3a5k.tlb[ftlb_idx * 8 + i]; ++ tag = tlb->VPN & ~mask; ++ ++ if ((tlb->G == 1 || tlb->ASID == asid) && vpn == tag && ++ tlb->EHINV != 1) { ++ env->CSR_TLBIDX = ((i * 256 + ftlb_idx) & 0xfff) | ++ ((tlb->PageSize & 0x3f) << CSR_TLBIDX_PS_SHIFT); ++ goto _MATCH_OUT_; ++ } ++ } ++ ++_NO_MATCH_OUT_: ++ env->CSR_TLBIDX = 1 << CSR_TLBIDX_EHINV_SHIFT; ++_MATCH_OUT_: ++ return; ++} ++ ++void ls3a5k_helper_tlbrd(CPULOONGARCHState *env) ++{ ++ ls3a5k_tlb_t *tlb; ++ int idx; ++ uint16_t asid; ++ ++ idx = env->CSR_TLBIDX & CSR_TLBIDX_IDX; ++ if (idx < env->tlb->mmu.ls3a5k.ftlb_size) { ++ int set = idx % 256; ++ int way = idx / 256; ++ idx = set * 8 + way; ++ } ++ ++ tlb = &env->tlb->mmu.ls3a5k.tlb[idx]; ++ ++ asid = env->CSR_ASID & 0x3ff; ++ ++ if (asid != tlb->ASID) { ++ cpu_loongarch_tlb_flush(env); ++ } ++ ++ if (tlb->EHINV) { ++ /* invalid TLB entry */ ++ env->CSR_TLBIDX = 1 << CSR_TLBIDX_EHINV_SHIFT; ++ env->CSR_TLBEHI = 0; ++ env->CSR_TLBELO0 = 0; ++ env->CSR_TLBELO1 = 0; ++ } else { ++ /* valid TLB entry */ ++ env->CSR_TLBIDX = (env->CSR_TLBIDX & 0xfff) | ++ ((tlb->PageSize & 0x3f) << CSR_TLBIDX_PS_SHIFT); ++ env->CSR_TLBEHI = tlb->VPN; ++ env->CSR_TLBELO0 = (tlb->V0 << CSR_TLBLO0_V_SHIFT) | ++ (tlb->WE0 << CSR_TLBLO0_WE_SHIFT) | ++ (tlb->PLV0 << CSR_TLBLO0_PLV_SHIFT) | ++ (tlb->C0 << CSR_TLBLO0_CCA_SHIFT) | ++ (tlb->G << CSR_TLBLO0_GLOBAL_SHIFT) | ++ (tlb->PPN0 & 0xfffffffff000) | ++ ((uint64_t)tlb->RI0 << CSR_TLBLO0_RI_SHIFT) | ++ ((uint64_t)tlb->XI0 << CSR_TLBLO0_XI_SHIFT) | ++ ((uint64_t)tlb->RPLV0 << CSR_TLBLO0_RPLV_SHIFT); ++ env->CSR_TLBELO1 = (tlb->V1 << CSR_TLBLO1_V_SHIFT) | ++ (tlb->WE1 << CSR_TLBLO1_WE_SHIFT) | ++ (tlb->PLV1 << CSR_TLBLO1_PLV_SHIFT) | ++ (tlb->C1 << CSR_TLBLO1_CCA_SHIFT) | ++ (tlb->G << CSR_TLBLO0_GLOBAL_SHIFT) | ++ (tlb->PPN1 & 0xfffffffff000) | ++ ((uint64_t)tlb->RI1 << CSR_TLBLO1_RI_SHIFT) | ++ ((uint64_t)tlb->XI1 << CSR_TLBLO1_XI_SHIFT) | ++ ((uint64_t)tlb->RPLV1 << CSR_TLBLO1_RPLV_SHIFT); ++ env->CSR_ASID = ++ (tlb->ASID << CSR_ASID_ASID_SHIFT) | (env->CSR_ASID & 0xff0000); ++ } ++} ++ ++void helper_tlbwr(CPULOONGARCHState *env) ++{ ++ env->tlb->helper_tlbwr(env); ++} ++ ++void helper_tlbfill(CPULOONGARCHState *env) ++{ ++ env->tlb->helper_tlbfill(env); ++} ++ ++void helper_tlbsrch(CPULOONGARCHState *env) ++{ ++ env->tlb->helper_tlbsrch(env); ++} ++ ++void helper_tlbrd(CPULOONGARCHState *env) ++{ ++ env->tlb->helper_tlbrd(env); ++} ++ ++void helper_tlbclr(CPULOONGARCHState *env) ++{ ++ env->tlb->helper_tlbclr(env); ++} ++ ++void helper_tlbflush(CPULOONGARCHState *env) ++{ ++ env->tlb->helper_tlbflush(env); ++} ++ ++void helper_invtlb(CPULOONGARCHState *env, target_ulong addr, ++ target_ulong info, target_ulong op) ++{ ++ env->tlb->helper_invtlb(env, addr, info, op); ++} ++ ++static void ls3a5k_mmu_init(CPULOONGARCHState *env, const loongarch_def_t *def) ++{ ++ /* number of VTLB */ ++ env->tlb->nb_tlb = 64; ++ env->tlb->mmu.ls3a5k.vtlb_size = 64; ++ ++ /* number of FTLB */ ++ env->tlb->nb_tlb += 2048; ++ env->tlb->mmu.ls3a5k.ftlb_size = 2048; ++ env->tlb->mmu.ls3a5k.ftlb_mask = (1 << 15) - 1; /* 16 KB */ ++ /* ++ * page_size | ftlb_mask | party field ++ * ---------------------------------------------------------------- ++ * 4 KB = 12 | ( 1 << 13 ) - 1 = [12:0] | [12] ++ * 16 KB = 14 | ( 1 << 15 ) - 1 = [14:0] | [14] ++ * 64 KB = 16 | ( 1 << 17 ) - 1 = [16:0] | [16] ++ * 256 KB = 18 | ( 1 << 19 ) - 1 = [18:0] | [18] ++ * 1 MB = 20 | ( 1 << 21 ) - 1 = [20:0] | [20] ++ * 4 MB = 22 | ( 1 << 23 ) - 1 = [22:0] | [22] ++ * 16 MB = 24 | ( 1 << 25 ) - 1 = [24:0] | [24] ++ * 64 MB = 26 | ( 1 << 27 ) - 1 = [26:0] | [26] ++ * 256 MB = 28 | ( 1 << 29 ) - 1 = [28:0] | [28] ++ * 1 GB = 30 | ( 1 << 31 ) - 1 = [30:0] | [30] ++ * ---------------------------------------------------------------- ++ * take party field index as @n. eg. For 16 KB, n = 14 ++ * ---------------------------------------------------------------- ++ * tlb->VPN = TLBEHI & 0xffffffffe000[47:13] & ~mask = [47:n+1] ++ * tlb->PPN = TLBLO0 & 0xffffffffe000[47:13] & ~mask = [47:n+1] ++ * tlb->PPN = TLBLO1 & 0xffffffffe000[47:13] & ~mask = [47:n+1] ++ * ---------------------------------------------------------------- ++ * On mapping : ++ * > vpn = address & 0xffffffffe000[47:13] & ~mask = [47:n+1] ++ * > tag = tlb->VPN & ~mask = [47:n+1] ++ * ---------------------------------------------------------------- ++ * physical address = [47:n+1] | [n:0] ++ * physical address = tlb->PPN0 | (address & mask) ++ * physical address = tlb->PPN1 | (address & mask) ++ */ ++ ++ int i; ++ for (i = 0; i < env->tlb->nb_tlb; i++) { ++ env->tlb->mmu.ls3a5k.tlb[i].EHINV = 1; ++ } ++ ++ /* TLB's helper functions */ ++ env->tlb->map_address = &ls3a5k_map_address; ++ env->tlb->helper_tlbwr = ls3a5k_helper_tlbwr; ++ env->tlb->helper_tlbfill = ls3a5k_helper_tlbfill; ++ env->tlb->helper_tlbsrch = ls3a5k_helper_tlbsrch; ++ env->tlb->helper_tlbrd = ls3a5k_helper_tlbrd; ++ env->tlb->helper_tlbclr = ls3a5k_helper_tlbclr; ++ env->tlb->helper_tlbflush = ls3a5k_helper_tlbflush; ++ env->tlb->helper_invtlb = ls3a5k_helper_invtlb; ++} ++ ++void mmu_init(CPULOONGARCHState *env, const loongarch_def_t *def) ++{ ++ env->tlb = g_malloc0(sizeof(CPULOONGARCHTLBContext)); ++ ++ switch (def->mmu_type) { ++ case MMU_TYPE_LS3A5K: ++ ls3a5k_mmu_init(env, def); ++ break; ++ default: ++ cpu_abort(CPU(loongarch_env_get_cpu(env)), "MMU type not supported\n"); ++ } ++} ++#endif /* !CONFIG_USER_ONLY */ +diff --git a/target/loongarch64/trans.inc.c b/target/loongarch64/trans.inc.c +new file mode 100644 +index 0000000000..07bb0bb6e0 +--- /dev/null ++++ b/target/loongarch64/trans.inc.c +@@ -0,0 +1,3482 @@ ++/* ++ * LOONGARCH emulation for QEMU - main translation routines Extension ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++static bool trans_syscall(DisasContext *ctx, arg_syscall *a) ++{ ++ generate_exception_end(ctx, EXCP_SYSCALL); ++ return true; ++} ++ ++static bool trans_break(DisasContext *ctx, arg_break *a) ++{ ++ generate_exception_end(ctx, EXCP_BREAK); ++ return true; ++} ++ ++static bool trans_dbcl(DisasContext *ctx, arg_dbcl *a) ++{ ++ /* ++ * dbcl instruction is not support in tcg ++ */ ++ generate_exception_end(ctx, EXCP_RI); ++ return true; ++} ++ ++static bool trans_addi_w(DisasContext *ctx, arg_addi_w *a) ++{ ++ gen_arith_imm(ctx, OPC_LARCH_ADDI_W, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_addi_d(DisasContext *ctx, arg_addi_d *a) ++{ ++ gen_arith_imm(ctx, OPC_LARCH_ADDI_D, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_slli_d(DisasContext *ctx, arg_slli_d *a) ++{ ++ if (a->rd == 0) { ++ /* Nop */ ++ return true; ++ } ++ ++ TCGv t0 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, a->rj); ++ tcg_gen_shli_tl(cpu_gpr[a->rd], t0, a->ui6); ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_andi(DisasContext *ctx, arg_andi *a) ++{ ++ gen_logic_imm(ctx, OPC_LARCH_ANDI, a->rd, a->rj, a->ui12); ++ return true; ++} ++ ++static bool trans_srli_d(DisasContext *ctx, arg_srli_d *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, a->rj); ++ tcg_gen_shri_tl(cpu_gpr[a->rd], t0, a->ui6); ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_slli_w(DisasContext *ctx, arg_slli_w *a) ++{ ++ if (a->rd == 0) { ++ /* Nop */ ++ return true; ++ } ++ ++ TCGv t0 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, a->rj); ++ tcg_gen_shli_tl(t0, t0, a->ui5); ++ tcg_gen_ext32s_tl(cpu_gpr[a->rd], t0); ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_addu16i_d(DisasContext *ctx, arg_addu16i_d *a) ++{ ++ if (a->rj != 0) { ++ tcg_gen_addi_tl(cpu_gpr[a->rd], cpu_gpr[a->rj], a->si16 << 16); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[a->rd], a->si16 << 16); ++ } ++ return true; ++} ++ ++static bool trans_lu12i_w(DisasContext *ctx, arg_lu12i_w *a) ++{ ++ tcg_gen_movi_tl(cpu_gpr[a->rd], a->si20 << 12); ++ return true; ++} ++ ++static bool trans_lu32i_d(DisasContext *ctx, arg_lu32i_d *a) ++{ ++ TCGv_i64 t0, t1; ++ t0 = tcg_temp_new_i64(); ++ t1 = tcg_temp_new_i64(); ++ ++ tcg_gen_movi_tl(t0, a->si20); ++ tcg_gen_concat_tl_i64(t1, cpu_gpr[a->rd], t0); ++ gen_store_gpr(t1, a->rd); ++ ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_pcaddi(DisasContext *ctx, arg_pcaddi *a) ++{ ++ target_ulong pc = ctx->base.pc_next; ++ target_ulong addr = pc + (a->si20 << 2); ++ tcg_gen_movi_tl(cpu_gpr[a->rd], addr); ++ return true; ++} ++ ++static bool trans_pcalau12i(DisasContext *ctx, arg_pcalau12i *a) ++{ ++ target_ulong pc = ctx->base.pc_next; ++ target_ulong addr = (pc + (a->si20 << 12)) & ~0xfff; ++ tcg_gen_movi_tl(cpu_gpr[a->rd], addr); ++ return true; ++} ++ ++static bool trans_pcaddu12i(DisasContext *ctx, arg_pcaddu12i *a) ++{ ++ target_ulong pc = ctx->base.pc_next; ++ target_ulong addr = pc + (a->si20 << 12); ++ tcg_gen_movi_tl(cpu_gpr[a->rd], addr); ++ return true; ++} ++ ++static bool trans_pcaddu18i(DisasContext *ctx, arg_pcaddu18i *a) ++{ ++ target_ulong pc = ctx->base.pc_next; ++ target_ulong addr = pc + ((target_ulong)(a->si20) << 18); ++ tcg_gen_movi_tl(cpu_gpr[a->rd], addr); ++ return true; ++} ++ ++static bool trans_slti(DisasContext *ctx, arg_slti *a) ++{ ++ gen_slt_imm(ctx, OPC_LARCH_SLTI, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_sltui(DisasContext *ctx, arg_sltui *a) ++{ ++ gen_slt_imm(ctx, OPC_LARCH_SLTIU, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_lu52i_d(DisasContext *ctx, arg_lu52i_d *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ ++ gen_load_gpr(t1, a->rj); ++ ++ tcg_gen_movi_tl(t0, a->si12); ++ tcg_gen_shli_tl(t0, t0, 52); ++ tcg_gen_andi_tl(t1, t1, 0xfffffffffffffU); ++ tcg_gen_or_tl(cpu_gpr[a->rd], t0, t1); ++ ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_ori(DisasContext *ctx, arg_ori *a) ++{ ++ gen_logic_imm(ctx, OPC_LARCH_ORI, a->rd, a->rj, a->ui12); ++ return true; ++} ++ ++static bool trans_xori(DisasContext *ctx, arg_xori *a) ++{ ++ gen_logic_imm(ctx, OPC_LARCH_XORI, a->rd, a->rj, a->ui12); ++ return true; ++} ++ ++static bool trans_bstrins_d(DisasContext *ctx, arg_bstrins_d *a) ++{ ++ int lsb = a->lsbd; ++ int msb = a->msbd; ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ ++ if (lsb > msb) { ++ return false; ++ } ++ ++ gen_load_gpr(t1, a->rj); ++ gen_load_gpr(t0, a->rd); ++ tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1); ++ gen_store_gpr(t0, a->rd); ++ ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_bstrpick_d(DisasContext *ctx, arg_bstrpick_d *a) ++{ ++ int lsb = a->lsbd; ++ int msb = a->msbd; ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ ++ if (lsb > msb) { ++ return false; ++ } ++ ++ gen_load_gpr(t1, a->rj); ++ gen_load_gpr(t0, a->rd); ++ tcg_gen_extract_tl(t0, t1, lsb, msb - lsb + 1); ++ gen_store_gpr(t0, a->rd); ++ ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_bstrins_w(DisasContext *ctx, arg_bstrins_w *a) ++{ ++ gen_bitops(ctx, OPC_LARCH_TRINS_W, a->rd, a->rj, a->lsbw, a->msbw); ++ return true; ++} ++ ++static bool trans_bstrpick_w(DisasContext *ctx, arg_bstrpick_w *a) ++{ ++ if (a->lsbw > a->msbw) { ++ return false; ++ } ++ gen_bitops(ctx, OPC_LARCH_TRPICK_W, a->rd, a->rj, a->lsbw, ++ a->msbw - a->lsbw); ++ return true; ++} ++ ++static bool trans_ldptr_w(DisasContext *ctx, arg_ldptr_w *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LDPTR_W, a->rd, a->rj, a->si14 << 2); ++ return true; ++} ++ ++static bool trans_stptr_w(DisasContext *ctx, arg_stptr_w *a) ++{ ++ gen_st(ctx, OPC_LARCH_STPTR_W, a->rd, a->rj, a->si14 << 2); ++ return true; ++} ++ ++static bool trans_ldptr_d(DisasContext *ctx, arg_ldptr_d *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LDPTR_D, a->rd, a->rj, a->si14 << 2); ++ return true; ++} ++ ++static bool trans_stptr_d(DisasContext *ctx, arg_stptr_d *a) ++{ ++ gen_st(ctx, OPC_LARCH_STPTR_D, a->rd, a->rj, a->si14 << 2); ++ return true; ++} ++ ++static bool trans_ld_b(DisasContext *ctx, arg_ld_b *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LD_B, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_ld_h(DisasContext *ctx, arg_ld_h *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LD_H, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_ld_w(DisasContext *ctx, arg_ld_w *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LD_W, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_ld_d(DisasContext *ctx, arg_ld_d *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LD_D, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_st_b(DisasContext *ctx, arg_st_b *a) ++{ ++ gen_st(ctx, OPC_LARCH_ST_B, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_st_h(DisasContext *ctx, arg_st_h *a) ++{ ++ gen_st(ctx, OPC_LARCH_ST_H, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_st_w(DisasContext *ctx, arg_st_w *a) ++{ ++ gen_st(ctx, OPC_LARCH_ST_W, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_st_d(DisasContext *ctx, arg_st_d *a) ++{ ++ gen_st(ctx, OPC_LARCH_ST_D, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_ld_bu(DisasContext *ctx, arg_ld_bu *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LD_BU, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_ld_hu(DisasContext *ctx, arg_ld_hu *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LD_HU, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_ld_wu(DisasContext *ctx, arg_ld_wu *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LD_WU, a->rd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_preld(DisasContext *ctx, arg_preld *a) ++{ ++ /* Treat as NOP. */ ++ return true; ++} ++ ++static bool trans_ll_w(DisasContext *ctx, arg_ll_w *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LL_W, a->rd, a->rj, a->si14 << 2); ++ return true; ++} ++ ++static bool trans_sc_w(DisasContext *ctx, arg_sc_w *a) ++{ ++ gen_st_cond(ctx, a->rd, a->rj, a->si14 << 2, MO_TESL, false); ++ return true; ++} ++ ++static bool trans_ll_d(DisasContext *ctx, arg_ll_d *a) ++{ ++ gen_ld(ctx, OPC_LARCH_LL_D, a->rd, a->rj, a->si14 << 2); ++ return true; ++} ++ ++static bool trans_sc_d(DisasContext *ctx, arg_sc_d *a) ++{ ++ gen_st_cond(ctx, a->rd, a->rj, a->si14 << 2, MO_TEQ, false); ++ return true; ++} ++ ++static bool trans_fld_s(DisasContext *ctx, arg_fld_s *a) ++{ ++ gen_fp_ldst(ctx, OPC_LARCH_FLD_S, a->fd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_fst_s(DisasContext *ctx, arg_fst_s *a) ++{ ++ gen_fp_ldst(ctx, OPC_LARCH_FST_S, a->fd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_fld_d(DisasContext *ctx, arg_fld_d *a) ++{ ++ gen_fp_ldst(ctx, OPC_LARCH_FLD_D, a->fd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_fst_d(DisasContext *ctx, arg_fst_d *a) ++{ ++ gen_fp_ldst(ctx, OPC_LARCH_FST_D, a->fd, a->rj, a->si12); ++ return true; ++} ++ ++static bool trans_ldx_b(DisasContext *ctx, arg_ldx_b *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_SB); ++ gen_store_gpr(t1, a->rd); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_ldx_h(DisasContext *ctx, arg_ldx_h *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_TESW | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t1, a->rd); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_ldx_w(DisasContext *ctx, arg_ldx_w *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_TESL | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t1, a->rd); ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_ldx_d(DisasContext *ctx, arg_ldx_d *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_TEQ | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t1, a->rd); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_stx_b(DisasContext *ctx, arg_stx_b *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ gen_load_gpr(t1, a->rd); ++ tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_8); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_stx_h(DisasContext *ctx, arg_stx_h *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ gen_load_gpr(t1, a->rd); ++ tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUW | ctx->default_tcg_memop_mask); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_stx_w(DisasContext *ctx, arg_stx_w *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ gen_load_gpr(t1, a->rd); ++ tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUL | ctx->default_tcg_memop_mask); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_stx_d(DisasContext *ctx, arg_stx_d *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ gen_load_gpr(t1, a->rd); ++ tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEQ | ctx->default_tcg_memop_mask); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_ldx_bu(DisasContext *ctx, arg_ldx_bu *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB); ++ gen_store_gpr(t1, a->rd); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_ldx_hu(DisasContext *ctx, arg_ldx_hu *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_TEUW | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t1, a->rd); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_ldx_wu(DisasContext *ctx, arg_ldx_wu *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_op_addr_add(ctx, t0, cpu_gpr[a->rj], cpu_gpr[a->rk]); ++ tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_TEUL | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t1, a->rd); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_fldx_s(DisasContext *ctx, arg_fldx_s *a) ++{ ++ gen_flt3_ldst(ctx, OPC_LARCH_FLDX_S, a->fd, 0, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fldx_d(DisasContext *ctx, arg_fldx_d *a) ++{ ++ gen_flt3_ldst(ctx, OPC_LARCH_FLDX_D, a->fd, 0, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fstx_s(DisasContext *ctx, arg_fstx_s *a) ++{ ++ gen_flt3_ldst(ctx, OPC_LARCH_FSTX_S, 0, a->fd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fstx_d(DisasContext *ctx, arg_fstx_d *a) ++{ ++ gen_flt3_ldst(ctx, OPC_LARCH_FSTX_D, 0, a->fd, a->rj, a->rk); ++ return true; ++} ++ ++#define TRANS_AM_W(name, op) \ ++ static bool trans_##name(DisasContext *ctx, arg_##name *a) \ ++ { \ ++ if ((a->rd != 0) && ((a->rj == a->rd) || (a->rk == a->rd))) { \ ++ printf("%s: warning, register equal\n", __func__); \ ++ return false; \ ++ } \ ++ int mem_idx = ctx->mem_idx; \ ++ TCGv addr = tcg_temp_new(); \ ++ TCGv val = tcg_temp_new(); \ ++ TCGv ret = tcg_temp_new(); \ ++ \ ++ gen_load_gpr(addr, a->rj); \ ++ gen_load_gpr(val, a->rk); \ ++ tcg_gen_atomic_##op##_tl(ret, addr, val, mem_idx, \ ++ MO_TESL | ctx->default_tcg_memop_mask); \ ++ gen_store_gpr(ret, a->rd); \ ++ \ ++ tcg_temp_free(addr); \ ++ tcg_temp_free(val); \ ++ tcg_temp_free(ret); \ ++ return true; \ ++ } ++#define TRANS_AM_D(name, op) \ ++ static bool trans_##name(DisasContext *ctx, arg_##name *a) \ ++ { \ ++ if ((a->rd != 0) && ((a->rj == a->rd) || (a->rk == a->rd))) { \ ++ printf("%s: warning, register equal\n", __func__); \ ++ return false; \ ++ } \ ++ int mem_idx = ctx->mem_idx; \ ++ TCGv addr = tcg_temp_new(); \ ++ TCGv val = tcg_temp_new(); \ ++ TCGv ret = tcg_temp_new(); \ ++ \ ++ gen_load_gpr(addr, a->rj); \ ++ gen_load_gpr(val, a->rk); \ ++ tcg_gen_atomic_##op##_tl(ret, addr, val, mem_idx, \ ++ MO_TEQ | ctx->default_tcg_memop_mask); \ ++ gen_store_gpr(ret, a->rd); \ ++ \ ++ tcg_temp_free(addr); \ ++ tcg_temp_free(val); \ ++ tcg_temp_free(ret); \ ++ return true; \ ++ } ++#define TRANS_AM(name, op) \ ++ TRANS_AM_W(name##_w, op) \ ++ TRANS_AM_D(name##_d, op) ++TRANS_AM(amswap, xchg) /* trans_amswap_w, trans_amswap_d */ ++TRANS_AM(amadd, fetch_add) /* trans_amadd_w, trans_amadd_d */ ++TRANS_AM(amand, fetch_and) /* trans_amand_w, trans_amand_d */ ++TRANS_AM(amor, fetch_or) /* trans_amor_w, trans_amor_d */ ++TRANS_AM(amxor, fetch_xor) /* trans_amxor_w, trans_amxor_d */ ++TRANS_AM(ammax, fetch_smax) /* trans_ammax_w, trans_ammax_d */ ++TRANS_AM(ammin, fetch_smin) /* trans_ammin_w, trans_ammin_d */ ++TRANS_AM_W(ammax_wu, fetch_umax) /* trans_ammax_wu */ ++TRANS_AM_D(ammax_du, fetch_umax) /* trans_ammax_du */ ++TRANS_AM_W(ammin_wu, fetch_umin) /* trans_ammin_wu */ ++TRANS_AM_D(ammin_du, fetch_umin) /* trans_ammin_du */ ++#undef TRANS_AM ++#undef TRANS_AM_W ++#undef TRANS_AM_D ++ ++#define TRANS_AM_DB_W(name, op) \ ++ static bool trans_##name(DisasContext *ctx, arg_##name *a) \ ++ { \ ++ if ((a->rd != 0) && ((a->rj == a->rd) || (a->rk == a->rd))) { \ ++ printf("%s: warning, register equal\n", __func__); \ ++ return false; \ ++ } \ ++ int mem_idx = ctx->mem_idx; \ ++ TCGv addr = tcg_temp_new(); \ ++ TCGv val = tcg_temp_new(); \ ++ TCGv ret = tcg_temp_new(); \ ++ \ ++ gen_sync(0x10); \ ++ gen_load_gpr(addr, a->rj); \ ++ gen_load_gpr(val, a->rk); \ ++ tcg_gen_atomic_##op##_tl(ret, addr, val, mem_idx, \ ++ MO_TESL | ctx->default_tcg_memop_mask); \ ++ gen_store_gpr(ret, a->rd); \ ++ \ ++ tcg_temp_free(addr); \ ++ tcg_temp_free(val); \ ++ tcg_temp_free(ret); \ ++ return true; \ ++ } ++#define TRANS_AM_DB_D(name, op) \ ++ static bool trans_##name(DisasContext *ctx, arg_##name *a) \ ++ { \ ++ if ((a->rd != 0) && ((a->rj == a->rd) || (a->rk == a->rd))) { \ ++ printf("%s: warning, register equal\n", __func__); \ ++ return false; \ ++ } \ ++ int mem_idx = ctx->mem_idx; \ ++ TCGv addr = tcg_temp_new(); \ ++ TCGv val = tcg_temp_new(); \ ++ TCGv ret = tcg_temp_new(); \ ++ \ ++ gen_sync(0x10); \ ++ gen_load_gpr(addr, a->rj); \ ++ gen_load_gpr(val, a->rk); \ ++ tcg_gen_atomic_##op##_tl(ret, addr, val, mem_idx, \ ++ MO_TEQ | ctx->default_tcg_memop_mask); \ ++ gen_store_gpr(ret, a->rd); \ ++ \ ++ tcg_temp_free(addr); \ ++ tcg_temp_free(val); \ ++ tcg_temp_free(ret); \ ++ return true; \ ++ } ++#define TRANS_AM_DB(name, op) \ ++ TRANS_AM_DB_W(name##_db_w, op) \ ++ TRANS_AM_DB_D(name##_db_d, op) ++TRANS_AM_DB(amswap, xchg) /* trans_amswap_db_w, trans_amswap_db_d */ ++TRANS_AM_DB(amadd, fetch_add) /* trans_amadd_db_w, trans_amadd_db_d */ ++TRANS_AM_DB(amand, fetch_and) /* trans_amand_db_w, trans_amand_db_d */ ++TRANS_AM_DB(amor, fetch_or) /* trans_amor_db_w, trans_amor_db_d */ ++TRANS_AM_DB(amxor, fetch_xor) /* trans_amxor_db_w, trans_amxor_db_d */ ++TRANS_AM_DB(ammax, fetch_smax) /* trans_ammax_db_w, trans_ammax_db_d */ ++TRANS_AM_DB(ammin, fetch_smin) /* trans_ammin_db_w, trans_ammin_db_d */ ++TRANS_AM_DB_W(ammax_db_wu, fetch_umax) /* trans_ammax_db_wu */ ++TRANS_AM_DB_D(ammax_db_du, fetch_umax) /* trans_ammax_db_du */ ++TRANS_AM_DB_W(ammin_db_wu, fetch_umin) /* trans_ammin_db_wu */ ++TRANS_AM_DB_D(ammin_db_du, fetch_umin) /* trans_ammin_db_du */ ++#undef TRANS_AM_DB ++#undef TRANS_AM_DB_W ++#undef TRANS_AM_DB_D ++ ++static bool trans_dbar(DisasContext *ctx, arg_dbar *a) ++{ ++ gen_sync(a->whint); ++ return true; ++} ++ ++static bool trans_ibar(DisasContext *ctx, arg_ibar *a) ++{ ++ /* ++ * FENCE_I is a no-op in QEMU, ++ * however we need to end the translation block ++ */ ++ ctx->base.is_jmp = DISAS_STOP; ++ return true; ++} ++ ++#define ASRTGT \ ++ do { \ ++ TCGv t1 = tcg_temp_new(); \ ++ TCGv t2 = tcg_temp_new(); \ ++ gen_load_gpr(t1, a->rj); \ ++ gen_load_gpr(t2, a->rk); \ ++ gen_helper_asrtgt_d(cpu_env, t1, t2); \ ++ tcg_temp_free(t1); \ ++ tcg_temp_free(t2); \ ++ } while (0) ++ ++#define ASRTLE \ ++ do { \ ++ TCGv t1 = tcg_temp_new(); \ ++ TCGv t2 = tcg_temp_new(); \ ++ gen_load_gpr(t1, a->rj); \ ++ gen_load_gpr(t2, a->rk); \ ++ gen_helper_asrtle_d(cpu_env, t1, t2); \ ++ tcg_temp_free(t1); \ ++ tcg_temp_free(t2); \ ++ } while (0) ++ ++static bool trans_fldgt_s(DisasContext *ctx, arg_fldgt_s *a) ++{ ++ ASRTGT; ++ gen_flt3_ldst(ctx, OPC_LARCH_FLDGT_S, a->fd, 0, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fldgt_d(DisasContext *ctx, arg_fldgt_d *a) ++{ ++ ASRTGT; ++ gen_flt3_ldst(ctx, OPC_LARCH_FLDGT_D, a->fd, 0, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fldle_s(DisasContext *ctx, arg_fldle_s *a) ++{ ++ ASRTLE; ++ gen_flt3_ldst(ctx, OPC_LARCH_FLDLE_S, a->fd, 0, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fldle_d(DisasContext *ctx, arg_fldle_d *a) ++{ ++ ASRTLE; ++ gen_flt3_ldst(ctx, OPC_LARCH_FLDLE_D, a->fd, 0, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fstgt_s(DisasContext *ctx, arg_fstgt_s *a) ++{ ++ ASRTGT; ++ gen_flt3_ldst(ctx, OPC_LARCH_FSTGT_S, 0, a->fd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fstgt_d(DisasContext *ctx, arg_fstgt_d *a) ++{ ++ ASRTGT; ++ gen_flt3_ldst(ctx, OPC_LARCH_FSTGT_D, 0, a->fd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fstle_s(DisasContext *ctx, arg_fstle_s *a) ++{ ++ ASRTLE; ++ gen_flt3_ldst(ctx, OPC_LARCH_FSTLE_S, 0, a->fd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_fstle_d(DisasContext *ctx, arg_fstle_d *a) ++{ ++ ASRTLE; ++ gen_flt3_ldst(ctx, OPC_LARCH_FSTLE_D, 0, a->fd, a->rj, a->rk); ++ return true; ++} ++ ++#define DECL_ARG(name) \ ++ arg_##name arg = { \ ++ .rd = a->rd, \ ++ .rj = a->rj, \ ++ .rk = a->rk, \ ++ }; ++ ++static bool trans_ldgt_b(DisasContext *ctx, arg_ldgt_b *a) ++{ ++ ASRTGT; ++ DECL_ARG(ldx_b) ++ trans_ldx_b(ctx, &arg); ++ return true; ++} ++ ++static bool trans_ldgt_h(DisasContext *ctx, arg_ldgt_h *a) ++{ ++ ASRTGT; ++ DECL_ARG(ldx_h) ++ trans_ldx_h(ctx, &arg); ++ return true; ++} ++ ++static bool trans_ldgt_w(DisasContext *ctx, arg_ldgt_w *a) ++{ ++ ASRTGT; ++ DECL_ARG(ldx_w) ++ trans_ldx_w(ctx, &arg); ++ return true; ++} ++ ++static bool trans_ldgt_d(DisasContext *ctx, arg_ldgt_d *a) ++{ ++ ASRTGT; ++ DECL_ARG(ldx_d) ++ trans_ldx_d(ctx, &arg); ++ return true; ++} ++ ++static bool trans_ldle_b(DisasContext *ctx, arg_ldle_b *a) ++{ ++ ASRTLE; ++ DECL_ARG(ldx_b) ++ trans_ldx_b(ctx, &arg); ++ return true; ++} ++ ++static bool trans_ldle_h(DisasContext *ctx, arg_ldle_h *a) ++{ ++ ASRTLE; ++ DECL_ARG(ldx_h) ++ trans_ldx_h(ctx, &arg); ++ return true; ++} ++ ++static bool trans_ldle_w(DisasContext *ctx, arg_ldle_w *a) ++{ ++ ASRTLE; ++ DECL_ARG(ldx_w) ++ trans_ldx_w(ctx, &arg); ++ return true; ++} ++ ++static bool trans_ldle_d(DisasContext *ctx, arg_ldle_d *a) ++{ ++ ASRTLE; ++ DECL_ARG(ldx_d) ++ trans_ldx_d(ctx, &arg); ++ return true; ++} ++ ++static bool trans_stgt_b(DisasContext *ctx, arg_stgt_b *a) ++{ ++ ASRTGT; ++ DECL_ARG(stx_b) ++ trans_stx_b(ctx, &arg); ++ return true; ++} ++ ++static bool trans_stgt_h(DisasContext *ctx, arg_stgt_h *a) ++{ ++ ASRTGT; ++ DECL_ARG(stx_h) ++ trans_stx_h(ctx, &arg); ++ return true; ++} ++ ++static bool trans_stgt_w(DisasContext *ctx, arg_stgt_w *a) ++{ ++ ASRTGT; ++ DECL_ARG(stx_w) ++ trans_stx_w(ctx, &arg); ++ return true; ++} ++ ++static bool trans_stgt_d(DisasContext *ctx, arg_stgt_d *a) ++{ ++ ASRTGT; ++ DECL_ARG(stx_d) ++ trans_stx_d(ctx, &arg); ++ return true; ++} ++ ++static bool trans_stle_b(DisasContext *ctx, arg_stle_b *a) ++{ ++ ASRTLE; ++ DECL_ARG(stx_b) ++ trans_stx_b(ctx, &arg); ++ return true; ++} ++ ++static bool trans_stle_h(DisasContext *ctx, arg_stle_h *a) ++{ ++ ASRTLE; ++ DECL_ARG(stx_h) ++ trans_stx_h(ctx, &arg); ++ return true; ++} ++ ++static bool trans_stle_w(DisasContext *ctx, arg_stle_w *a) ++{ ++ ASRTLE; ++ DECL_ARG(stx_w) ++ trans_stx_w(ctx, &arg); ++ return true; ++} ++ ++static bool trans_stle_d(DisasContext *ctx, arg_stle_d *a) ++{ ++ ASRTLE; ++ DECL_ARG(stx_d) ++ trans_stx_d(ctx, &arg); ++ return true; ++} ++ ++#undef ASRTGT ++#undef ASRTLE ++#undef DECL_ARG ++ ++static bool trans_beqz(DisasContext *ctx, arg_beqz *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_BEQZ, 4, a->rj, 0, a->offs21 << 2); ++ return true; ++} ++ ++static bool trans_bnez(DisasContext *ctx, arg_bnez *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_BNEZ, 4, a->rj, 0, a->offs21 << 2); ++ return true; ++} ++ ++static bool trans_bceqz(DisasContext *ctx, arg_bceqz *a) ++{ ++ TCGv_i32 cj = tcg_const_i32(a->cj); ++ TCGv v0 = tcg_temp_new(); ++ TCGv v1 = tcg_const_i64(0); ++ ++ gen_helper_movcf2reg(v0, cpu_env, cj); ++ tcg_gen_setcond_tl(TCG_COND_EQ, bcond, v0, v1); ++ ctx->hflags |= LARCH_HFLAG_BC; ++ ctx->btarget = ctx->base.pc_next + (a->offs21 << 2); ++ ++ tcg_temp_free_i32(cj); ++ tcg_temp_free(v0); ++ tcg_temp_free(v1); ++ return true; ++} ++ ++static bool trans_bcnez(DisasContext *ctx, arg_bcnez *a) ++{ ++ TCGv_i32 cj = tcg_const_i32(a->cj); ++ TCGv v0 = tcg_temp_new(); ++ TCGv v1 = tcg_const_i64(0); ++ ++ gen_helper_movcf2reg(v0, cpu_env, cj); ++ tcg_gen_setcond_tl(TCG_COND_NE, bcond, v0, v1); ++ ctx->hflags |= LARCH_HFLAG_BC; ++ ctx->btarget = ctx->base.pc_next + (a->offs21 << 2); ++ ++ tcg_temp_free_i32(cj); ++ tcg_temp_free(v0); ++ tcg_temp_free(v1); ++ return true; ++} ++ ++static bool trans_b(DisasContext *ctx, arg_b *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_B, 4, 0, 0, a->offs << 2); ++ return true; ++} ++ ++static bool trans_bl(DisasContext *ctx, arg_bl *a) ++{ ++ ctx->btarget = ctx->base.pc_next + (a->offs << 2); ++ tcg_gen_movi_tl(cpu_gpr[1], ctx->base.pc_next + 4); ++ ctx->hflags |= LARCH_HFLAG_B; ++ gen_branch(ctx, 4); ++ return true; ++} ++ ++static bool trans_blt(DisasContext *ctx, arg_blt *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_BLT, 4, a->rj, a->rd, a->offs16 << 2); ++ return true; ++} ++ ++static bool trans_bge(DisasContext *ctx, arg_bge *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_BGE, 4, a->rj, a->rd, a->offs16 << 2); ++ return true; ++} ++ ++static bool trans_bltu(DisasContext *ctx, arg_bltu *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_BLTU, 4, a->rj, a->rd, a->offs16 << 2); ++ return true; ++} ++ ++static bool trans_bgeu(DisasContext *ctx, arg_bgeu *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_BGEU, 4, a->rj, a->rd, a->offs16 << 2); ++ return true; ++} ++ ++static bool trans_beq(DisasContext *ctx, arg_beq *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_BEQ, 4, a->rj, a->rd, a->offs16 << 2); ++ return true; ++} ++ ++static bool trans_bne(DisasContext *ctx, arg_bne *a) ++{ ++ gen_compute_branch(ctx, OPC_LARCH_BNE, 4, a->rj, a->rd, a->offs16 << 2); ++ return true; ++} ++ ++static bool trans_jirl(DisasContext *ctx, arg_jirl *a) ++{ ++ gen_base_offset_addr(ctx, btarget, a->rj, a->offs16 << 2); ++ if (a->rd != 0) { ++ tcg_gen_movi_tl(cpu_gpr[a->rd], ctx->base.pc_next + 4); ++ } ++ ctx->hflags |= LARCH_HFLAG_BR; ++ gen_branch(ctx, 4); ++ ++ return true; ++} ++ ++#define TRANS_F4FR(name, fmt, op, bits) \ ++ static bool trans_##name##_##fmt(DisasContext *ctx, \ ++ arg_##name##_##fmt *a) \ ++ { \ ++ check_cp1_enabled(ctx); \ ++ TCGv_i##bits fp0 = tcg_temp_new_i##bits(); \ ++ TCGv_i##bits fp1 = tcg_temp_new_i##bits(); \ ++ TCGv_i##bits fp2 = tcg_temp_new_i##bits(); \ ++ TCGv_i##bits fp3 = tcg_temp_new_i##bits(); \ ++ check_cp1_enabled(ctx); \ ++ gen_load_fpr##bits(ctx, fp0, a->fj); \ ++ gen_load_fpr##bits(ctx, fp1, a->fk); \ ++ gen_load_fpr##bits(ctx, fp2, a->fa); \ ++ gen_helper_float_##op##_##fmt(fp3, cpu_env, fp0, fp1, fp2); \ ++ gen_store_fpr##bits(ctx, fp3, a->fd); \ ++ tcg_temp_free_i##bits(fp3); \ ++ tcg_temp_free_i##bits(fp2); \ ++ tcg_temp_free_i##bits(fp1); \ ++ tcg_temp_free_i##bits(fp0); \ ++ return true; \ ++ } ++ ++TRANS_F4FR(fmadd, s, maddf, 32) /* trans_fmadd_s */ ++TRANS_F4FR(fmadd, d, maddf, 64) /* trans_fmadd_d */ ++TRANS_F4FR(fmsub, s, msubf, 32) /* trans_fmsub_s */ ++TRANS_F4FR(fmsub, d, msubf, 64) /* trans_fmsub_d */ ++TRANS_F4FR(fnmadd, s, nmaddf, 32) /* trans_fnmadd_s */ ++TRANS_F4FR(fnmadd, d, nmaddf, 64) /* trans_fnmadd_d */ ++TRANS_F4FR(fnmsub, s, nmsubf, 32) /* trans_fnmsub_s */ ++TRANS_F4FR(fnmsub, d, nmsubf, 64) /* trans_fnmsub_d */ ++#undef TRANS_F4FR ++ ++static bool trans_fadd_s(DisasContext *ctx, arg_fadd_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FADD_S, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fadd_d(DisasContext *ctx, arg_fadd_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FADD_D, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fsub_s(DisasContext *ctx, arg_fsub_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FSUB_S, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fsub_d(DisasContext *ctx, arg_fsub_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FSUB_D, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmul_s(DisasContext *ctx, arg_fmul_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMUL_S, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmul_d(DisasContext *ctx, arg_fmul_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMUL_D, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fdiv_s(DisasContext *ctx, arg_fdiv_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FDIV_S, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fdiv_d(DisasContext *ctx, arg_fdiv_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FDIV_D, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmax_s(DisasContext *ctx, arg_fmax_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMAX_S, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmax_d(DisasContext *ctx, arg_fmax_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMAX_D, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmin_s(DisasContext *ctx, arg_fmin_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMIN_S, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmin_d(DisasContext *ctx, arg_fmin_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMIN_D, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmaxa_s(DisasContext *ctx, arg_fmaxa_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMAXA_S, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmaxa_d(DisasContext *ctx, arg_fmaxa_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMAXA_D, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmina_s(DisasContext *ctx, arg_fmina_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMINA_S, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmina_d(DisasContext *ctx, arg_fmina_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMINA_D, a->fk, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fscaleb_s(DisasContext *ctx, arg_fscaleb_s *a) ++{ ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ ++ check_cp1_enabled(ctx); ++ gen_load_fpr32(ctx, fp0, a->fj); ++ gen_load_fpr32(ctx, fp1, a->fk); ++ gen_helper_float_exp2_s(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i32(fp1); ++ gen_store_fpr32(ctx, fp0, a->fd); ++ tcg_temp_free_i32(fp0); ++ return true; ++} ++ ++static bool trans_fscaleb_d(DisasContext *ctx, arg_fscaleb_d *a) ++{ ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ ++ check_cp1_enabled(ctx); ++ gen_load_fpr64(ctx, fp0, a->fj); ++ gen_load_fpr64(ctx, fp1, a->fk); ++ gen_helper_float_exp2_d(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i64(fp1); ++ gen_store_fpr64(ctx, fp0, a->fd); ++ tcg_temp_free_i64(fp0); ++ return true; ++} ++ ++static bool trans_fcopysign_s(DisasContext *ctx, arg_fcopysign_s *a) ++{ ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ TCGv_i32 fp2 = tcg_temp_new_i32(); ++ ++ check_cp1_enabled(ctx); ++ gen_load_fpr32(ctx, fp0, a->fj); ++ gen_load_fpr32(ctx, fp1, a->fk); ++ tcg_gen_deposit_i32(fp2, fp1, fp0, 0, 31); ++ gen_store_fpr32(ctx, fp2, a->fd); ++ ++ tcg_temp_free_i32(fp2); ++ tcg_temp_free_i32(fp1); ++ tcg_temp_free_i32(fp0); ++ return true; ++} ++ ++static bool trans_fcopysign_d(DisasContext *ctx, arg_fcopysign_d *a) ++{ ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ TCGv_i64 fp2 = tcg_temp_new_i64(); ++ ++ check_cp1_enabled(ctx); ++ gen_load_fpr64(ctx, fp0, a->fj); ++ gen_load_fpr64(ctx, fp1, a->fk); ++ tcg_gen_deposit_i64(fp2, fp1, fp0, 0, 63); ++ gen_store_fpr64(ctx, fp2, a->fd); ++ ++ tcg_temp_free_i64(fp2); ++ tcg_temp_free_i64(fp1); ++ tcg_temp_free_i64(fp0); ++ return true; ++} ++ ++static bool trans_fabs_s(DisasContext *ctx, arg_fabs_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FABS_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fabs_d(DisasContext *ctx, arg_fabs_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FABS_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fneg_s(DisasContext *ctx, arg_fneg_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FNEG_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fneg_d(DisasContext *ctx, arg_fneg_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FNEG_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_flogb_s(DisasContext *ctx, arg_flogb_s *a) ++{ ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ ++ check_cp1_enabled(ctx); ++ gen_load_fpr32(ctx, fp0, a->fj); ++ gen_helper_float_logb_s(fp1, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp1, a->fd); ++ ++ tcg_temp_free_i32(fp0); ++ tcg_temp_free_i32(fp1); ++ return true; ++} ++ ++static bool trans_flogb_d(DisasContext *ctx, arg_flogb_d *a) ++{ ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ ++ check_cp1_enabled(ctx); ++ gen_load_fpr64(ctx, fp0, a->fj); ++ gen_helper_float_logb_d(fp1, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp1, a->fd); ++ ++ tcg_temp_free_i64(fp0); ++ tcg_temp_free_i64(fp1); ++ return true; ++} ++ ++static bool trans_fclass_s(DisasContext *ctx, arg_fclass_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FCLASS_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fclass_d(DisasContext *ctx, arg_fclass_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FCLASS_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fsqrt_s(DisasContext *ctx, arg_fsqrt_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FSQRT_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fsqrt_d(DisasContext *ctx, arg_fsqrt_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FSQRT_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_frecip_s(DisasContext *ctx, arg_frecip_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FRECIP_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_frecip_d(DisasContext *ctx, arg_frecip_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FRECIP_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_frsqrt_s(DisasContext *ctx, arg_frsqrt_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FRSQRT_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_frsqrt_d(DisasContext *ctx, arg_frsqrt_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FRSQRT_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmov_s(DisasContext *ctx, arg_fmov_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMOV_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fmov_d(DisasContext *ctx, arg_fmov_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FMOV_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_movgr2fr_w(DisasContext *ctx, arg_movgr2fr_w *a) ++{ ++ gen_cp1(ctx, OPC_LARCH_GR2FR_W, a->rj, a->fd); ++ return true; ++} ++ ++static bool trans_movgr2fr_d(DisasContext *ctx, arg_movgr2fr_d *a) ++{ ++ gen_cp1(ctx, OPC_LARCH_GR2FR_D, a->rj, a->fd); ++ return true; ++} ++ ++static bool trans_movgr2frh_w(DisasContext *ctx, arg_movgr2frh_w *a) ++{ ++ gen_cp1(ctx, OPC_LARCH_GR2FRH_W, a->rj, a->fd); ++ return true; ++} ++ ++static bool trans_movfr2gr_s(DisasContext *ctx, arg_movfr2gr_s *a) ++{ ++ gen_cp1(ctx, OPC_LARCH_FR2GR_S, a->rd, a->fj); ++ return true; ++} ++ ++static bool trans_movfr2gr_d(DisasContext *ctx, arg_movfr2gr_d *a) ++{ ++ gen_cp1(ctx, OPC_LARCH_FR2GR_D, a->rd, a->fj); ++ return true; ++} ++ ++static bool trans_movfrh2gr_s(DisasContext *ctx, arg_movfrh2gr_s *a) ++{ ++ gen_cp1(ctx, OPC_LARCH_FRH2GR_S, a->rd, a->fj); ++ return true; ++} ++ ++static bool trans_movgr2fcsr(DisasContext *ctx, arg_movgr2fcsr *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ ++ check_cp1_enabled(ctx); ++ gen_load_gpr(t0, a->rj); ++ save_cpu_state(ctx, 0); ++ { ++ TCGv_i32 fs_tmp = tcg_const_i32(a->fcsrd); ++ gen_helper_0e2i(movgr2fcsr, t0, fs_tmp, a->rj); ++ tcg_temp_free_i32(fs_tmp); ++ } ++ /* Stop translation as we may have changed hflags */ ++ ctx->base.is_jmp = DISAS_STOP; ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_movfcsr2gr(DisasContext *ctx, arg_movfcsr2gr *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ gen_helper_1e0i(movfcsr2gr, t0, a->fcsrs); ++ gen_store_gpr(t0, a->rd); ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_movfr2cf(DisasContext *ctx, arg_movfr2cf *a) ++{ ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i32 cd = tcg_const_i32(a->cd); ++ ++ check_cp1_enabled(ctx); ++ gen_load_fpr64(ctx, fp0, a->fj); ++ gen_helper_movreg2cf(cpu_env, cd, fp0); ++ ++ tcg_temp_free_i64(fp0); ++ tcg_temp_free_i32(cd); ++ return true; ++} ++ ++static bool trans_movcf2fr(DisasContext *ctx, arg_movcf2fr *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv_i32 cj = tcg_const_i32(a->cj); ++ ++ check_cp1_enabled(ctx); ++ gen_helper_movcf2reg(t0, cpu_env, cj); ++ gen_store_fpr64(ctx, t0, a->fd); ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_movgr2cf(DisasContext *ctx, arg_movgr2cf *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv_i32 cd = tcg_const_i32(a->cd); ++ ++ check_cp1_enabled(ctx); ++ gen_load_gpr(t0, a->rj); ++ gen_helper_movreg2cf(cpu_env, cd, t0); ++ ++ tcg_temp_free(t0); ++ tcg_temp_free_i32(cd); ++ return true; ++} ++ ++static bool trans_movcf2gr(DisasContext *ctx, arg_movcf2gr *a) ++{ ++ TCGv_i32 cj = tcg_const_i32(a->cj); ++ ++ check_cp1_enabled(ctx); ++ gen_helper_movcf2reg(cpu_gpr[a->rd], cpu_env, cj); ++ ++ tcg_temp_free_i32(cj); ++ return true; ++} ++ ++static bool trans_fcvt_s_d(DisasContext *ctx, arg_fcvt_s_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FCVT_S_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_fcvt_d_s(DisasContext *ctx, arg_fcvt_d_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FCVT_D_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrm_w_s(DisasContext *ctx, arg_ftintrm_l_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRM_W_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrm_w_d(DisasContext *ctx, arg_ftintrm_l_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRM_W_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrm_l_s(DisasContext *ctx, arg_ftintrm_l_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRM_L_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrm_l_d(DisasContext *ctx, arg_ftintrm_l_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRM_L_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrp_w_s(DisasContext *ctx, arg_ftintrp_w_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRP_W_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrp_w_d(DisasContext *ctx, arg_ftintrp_w_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRP_W_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrp_l_s(DisasContext *ctx, arg_ftintrp_l_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRP_L_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrp_l_d(DisasContext *ctx, arg_ftintrp_l_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRP_L_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrz_w_s(DisasContext *ctx, arg_ftintrz_w_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRZ_W_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrz_w_d(DisasContext *ctx, arg_ftintrz_w_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRZ_W_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrz_l_s(DisasContext *ctx, arg_ftintrz_l_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRZ_L_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrz_l_d(DisasContext *ctx, arg_ftintrz_l_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRZ_L_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrne_w_s(DisasContext *ctx, arg_ftintrne_w_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRNE_W_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrne_w_d(DisasContext *ctx, arg_ftintrne_w_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRNE_W_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrne_l_s(DisasContext *ctx, arg_ftintrne_l_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRNE_L_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftintrne_l_d(DisasContext *ctx, arg_ftintrne_l_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINTRNE_L_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftint_w_s(DisasContext *ctx, arg_ftint_w_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINT_W_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftint_w_d(DisasContext *ctx, arg_ftint_w_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINT_W_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftint_l_s(DisasContext *ctx, arg_ftint_l_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINT_L_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ftint_l_d(DisasContext *ctx, arg_ftint_l_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FTINT_L_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ffint_s_w(DisasContext *ctx, arg_ffint_s_w *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FFINT_S_W, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ffint_s_l(DisasContext *ctx, arg_ffint_s_l *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FFINT_S_L, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ffint_d_w(DisasContext *ctx, arg_ffint_d_w *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FFINT_D_W, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_ffint_d_l(DisasContext *ctx, arg_ffint_d_l *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FFINT_D_L, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_frint_s(DisasContext *ctx, arg_frint_s *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FRINT_S, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_frint_d(DisasContext *ctx, arg_frint_d *a) ++{ ++ gen_farith(ctx, OPC_LARCH_FRINT_D, 0, a->fj, a->fd, 0); ++ return true; ++} ++ ++static bool trans_alsl_w(DisasContext *ctx, arg_alsl_w *a) ++{ ++ gen_lsa(ctx, OPC_LARCH_ALSL_W, a->rd, a->rj, a->rk, a->sa2); ++ return true; ++} ++ ++static bool trans_alsl_wu(DisasContext *ctx, arg_alsl_wu *a) ++{ ++ TCGv t0, t1; ++ t0 = tcg_temp_new(); ++ t1 = tcg_temp_new(); ++ gen_load_gpr(t0, a->rj); ++ gen_load_gpr(t1, a->rk); ++ tcg_gen_shli_tl(t0, t0, a->sa2 + 1); ++ tcg_gen_add_tl(t0, t0, t1); ++ tcg_gen_ext32u_tl(cpu_gpr[a->rd], t0); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ ++ return true; ++} ++ ++static bool trans_alsl_d(DisasContext *ctx, arg_alsl_d *a) ++{ ++ check_larch_64(ctx); ++ gen_lsa(ctx, OPC_LARCH_ALSL_D, a->rd, a->rj, a->rk, a->sa2); ++ return true; ++} ++ ++static bool trans_bytepick_w(DisasContext *ctx, arg_bytepick_w *a) ++{ ++ gen_align(ctx, 32, a->rd, a->rj, a->rk, a->sa2); ++ return true; ++} ++ ++static bool trans_bytepick_d(DisasContext *ctx, arg_bytepick_d *a) ++{ ++ check_larch_64(ctx); ++ gen_align(ctx, 64, a->rd, a->rj, a->rk, a->sa3); ++ return true; ++} ++ ++static bool trans_add_w(DisasContext *ctx, arg_add_w *a) ++{ ++ gen_arith(ctx, OPC_LARCH_ADD_W, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_sub_w(DisasContext *ctx, arg_sub_w *a) ++{ ++ gen_arith(ctx, OPC_LARCH_SUB_W, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_add_d(DisasContext *ctx, arg_add_d *a) ++{ ++ gen_arith(ctx, OPC_LARCH_ADD_D, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_sub_d(DisasContext *ctx, arg_sub_d *a) ++{ ++ check_larch_64(ctx); ++ gen_arith(ctx, OPC_LARCH_SUB_D, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_slt(DisasContext *ctx, arg_slt *a) ++{ ++ gen_slt(ctx, OPC_LARCH_SLT, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_sltu(DisasContext *ctx, arg_sltu *a) ++{ ++ gen_slt(ctx, OPC_LARCH_SLTU, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_maskeqz(DisasContext *ctx, arg_maskeqz *a) ++{ ++ gen_cond_move(ctx, OPC_LARCH_MASKEQZ, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_masknez(DisasContext *ctx, arg_masknez *a) ++{ ++ gen_cond_move(ctx, OPC_LARCH_MASKNEZ, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_nor(DisasContext *ctx, arg_nor *a) ++{ ++ gen_logic(ctx, OPC_LARCH_NOR, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_and(DisasContext *ctx, arg_and *a) ++{ ++ gen_logic(ctx, OPC_LARCH_AND, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_or(DisasContext *ctx, arg_or *a) ++{ ++ gen_logic(ctx, OPC_LARCH_OR, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_xor(DisasContext *ctx, arg_xor *a) ++{ ++ gen_logic(ctx, OPC_LARCH_XOR, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_orn(DisasContext *ctx, arg_orn *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ gen_load_gpr(t0, a->rk); ++ tcg_gen_not_tl(t0, t0); ++ tcg_gen_or_tl(cpu_gpr[a->rd], cpu_gpr[a->rj], t0); ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_andn(DisasContext *ctx, arg_andn *a) ++{ ++ TCGv t0, t1; ++ t0 = tcg_temp_new(); ++ t1 = tcg_temp_new(); ++ gen_load_gpr(t0, a->rk); ++ gen_load_gpr(t1, a->rj); ++ tcg_gen_not_tl(t0, t0); ++ tcg_gen_and_tl(cpu_gpr[a->rd], t1, t0); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++static bool trans_sll_w(DisasContext *ctx, arg_sll_w *a) ++{ ++ gen_shift(ctx, OPC_LARCH_SLL_W, a->rd, a->rk, a->rj); ++ return true; ++} ++ ++static bool trans_srl_w(DisasContext *ctx, arg_srl_w *a) ++{ ++ gen_shift(ctx, OPC_LARCH_SRL_W, a->rd, a->rk, a->rj); ++ return true; ++} ++ ++static bool trans_sra_w(DisasContext *ctx, arg_sra_w *a) ++{ ++ gen_shift(ctx, OPC_LARCH_SRA_W, a->rd, a->rk, a->rj); ++ return true; ++} ++ ++static bool trans_sll_d(DisasContext *ctx, arg_sll_d *a) ++{ ++ check_larch_64(ctx); ++ gen_shift(ctx, OPC_LARCH_SLL_D, a->rd, a->rk, a->rj); ++ return true; ++} ++ ++static bool trans_srl_d(DisasContext *ctx, arg_srl_d *a) ++{ ++ check_larch_64(ctx); ++ gen_shift(ctx, OPC_LARCH_SRL_D, a->rd, a->rk, a->rj); ++ return true; ++} ++ ++static bool trans_sra_d(DisasContext *ctx, arg_sra_d *a) ++{ ++ check_larch_64(ctx); ++ gen_shift(ctx, OPC_LARCH_SRA_D, a->rd, a->rk, a->rj); ++ return true; ++} ++ ++static bool trans_rotr_w(DisasContext *ctx, arg_rotr_w *a) ++{ ++ gen_shift(ctx, OPC_LARCH_ROTR_W, a->rd, a->rk, a->rj); ++ return true; ++} ++ ++static bool trans_rotr_d(DisasContext *ctx, arg_rotr_d *a) ++{ ++ check_larch_64(ctx); ++ gen_shift(ctx, OPC_LARCH_ROTR_D, a->rd, a->rk, a->rj); ++ return true; ++} ++ ++static bool trans_crc_w_b_w(DisasContext *ctx, arg_crc_w_b_w *a) ++{ ++ gen_crc32(ctx, a->rd, a->rj, a->rk, 1, 0); ++ return true; ++} ++ ++static bool trans_crc_w_h_w(DisasContext *ctx, arg_crc_w_h_w *a) ++{ ++ gen_crc32(ctx, a->rd, a->rj, a->rk, 2, 0); ++ return true; ++} ++ ++static bool trans_crc_w_w_w(DisasContext *ctx, arg_crc_w_w_w *a) ++{ ++ gen_crc32(ctx, a->rd, a->rj, a->rk, 4, 0); ++ return true; ++} ++ ++static bool trans_crc_w_d_w(DisasContext *ctx, arg_crc_w_d_w *a) ++{ ++ gen_crc32(ctx, a->rd, a->rj, a->rk, 8, 0); ++ return true; ++} ++ ++static bool trans_crcc_w_b_w(DisasContext *ctx, arg_crcc_w_b_w *a) ++{ ++ gen_crc32(ctx, a->rd, a->rj, a->rk, 1, 1); ++ return true; ++} ++ ++static bool trans_crcc_w_h_w(DisasContext *ctx, arg_crcc_w_h_w *a) ++{ ++ gen_crc32(ctx, a->rd, a->rj, a->rk, 2, 1); ++ return true; ++} ++ ++static bool trans_crcc_w_w_w(DisasContext *ctx, arg_crcc_w_w_w *a) ++{ ++ gen_crc32(ctx, a->rd, a->rj, a->rk, 4, 1); ++ return true; ++} ++ ++static bool trans_crcc_w_d_w(DisasContext *ctx, arg_crcc_w_d_w *a) ++{ ++ gen_crc32(ctx, a->rd, a->rj, a->rk, 8, 1); ++ return true; ++} ++ ++static bool trans_mul_w(DisasContext *ctx, arg_mul_w *a) ++{ ++ gen_r6_muldiv(ctx, OPC_LARCH_MUL_W, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mulh_w(DisasContext *ctx, arg_mulh_w *a) ++{ ++ gen_r6_muldiv(ctx, OPC_LARCH_MULH_W, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mulh_wu(DisasContext *ctx, arg_mulh_wu *a) ++{ ++ gen_r6_muldiv(ctx, OPC_LARCH_MULH_WU, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mul_d(DisasContext *ctx, arg_mul_d *a) ++{ ++ check_larch_64(ctx); ++ gen_r6_muldiv(ctx, OPC_LARCH_MUL_D, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mulh_d(DisasContext *ctx, arg_mulh_d *a) ++{ ++ check_larch_64(ctx); ++ gen_r6_muldiv(ctx, OPC_LARCH_MULH_D, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mulh_du(DisasContext *ctx, arg_mulh_du *a) ++{ ++ check_larch_64(ctx); ++ gen_r6_muldiv(ctx, OPC_LARCH_MULH_DU, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mulw_d_w(DisasContext *ctx, arg_mulw_d_w *a) ++{ ++ TCGv_i64 t0 = tcg_temp_new_i64(); ++ TCGv_i64 t1 = tcg_temp_new_i64(); ++ TCGv_i64 t2 = tcg_temp_new_i64(); ++ gen_load_gpr(t0, a->rj); ++ gen_load_gpr(t1, a->rk); ++ tcg_gen_ext32s_i64(t0, t0); ++ tcg_gen_ext32s_i64(t1, t1); ++ tcg_gen_mul_i64(t2, t0, t1); ++ gen_store_gpr(t2, a->rd); ++ tcg_temp_free_i64(t0); ++ tcg_temp_free_i64(t1); ++ tcg_temp_free_i64(t2); ++ return true; ++} ++ ++static bool trans_mulw_d_wu(DisasContext *ctx, arg_mulw_d_wu *a) ++{ ++ TCGv_i64 t0 = tcg_temp_new_i64(); ++ TCGv_i64 t1 = tcg_temp_new_i64(); ++ TCGv_i64 t2 = tcg_temp_new_i64(); ++ gen_load_gpr(t0, a->rj); ++ gen_load_gpr(t1, a->rk); ++ tcg_gen_ext32u_i64(t0, t0); ++ tcg_gen_ext32u_i64(t1, t1); ++ tcg_gen_mul_i64(t2, t0, t1); ++ gen_store_gpr(t2, a->rd); ++ tcg_temp_free_i64(t0); ++ tcg_temp_free_i64(t1); ++ tcg_temp_free_i64(t2); ++ return true; ++} ++ ++static bool trans_div_w(DisasContext *ctx, arg_div_w *a) ++{ ++ gen_r6_muldiv(ctx, OPC_LARCH_DIV_W, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mod_w(DisasContext *ctx, arg_mod_w *a) ++{ ++ gen_r6_muldiv(ctx, OPC_LARCH_MOD_W, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_div_wu(DisasContext *ctx, arg_div_wu *a) ++{ ++ gen_r6_muldiv(ctx, OPC_LARCH_DIV_WU, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mod_wu(DisasContext *ctx, arg_mod_wu *a) ++{ ++ gen_r6_muldiv(ctx, OPC_LARCH_MOD_WU, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_div_d(DisasContext *ctx, arg_div_d *a) ++{ ++ check_larch_64(ctx); ++ gen_r6_muldiv(ctx, OPC_LARCH_DIV_D, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mod_d(DisasContext *ctx, arg_mod_d *a) ++{ ++ check_larch_64(ctx); ++ gen_r6_muldiv(ctx, OPC_LARCH_MOD_D, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_div_du(DisasContext *ctx, arg_div_du *a) ++{ ++ check_larch_64(ctx); ++ gen_r6_muldiv(ctx, OPC_LARCH_DIV_DU, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++static bool trans_mod_du(DisasContext *ctx, arg_mod_du *a) ++{ ++ check_larch_64(ctx); ++ gen_r6_muldiv(ctx, OPC_LARCH_MOD_DU, a->rd, a->rj, a->rk); ++ return true; ++} ++ ++/* do not update CP0.BadVaddr */ ++static bool trans_asrtle_d(DisasContext *ctx, arg_asrtle_d *a) ++{ ++ TCGv t1 = tcg_temp_new(); ++ TCGv t2 = tcg_temp_new(); ++ gen_load_gpr(t1, a->rj); ++ gen_load_gpr(t2, a->rk); ++ gen_helper_asrtle_d(cpu_env, t1, t2); ++ tcg_temp_free(t1); ++ tcg_temp_free(t2); ++ return true; ++} ++ ++/* do not update CP0.BadVaddr */ ++static bool trans_asrtgt_d(DisasContext *ctx, arg_asrtgt_d *a) ++{ ++ TCGv t1 = tcg_temp_new(); ++ TCGv t2 = tcg_temp_new(); ++ gen_load_gpr(t1, a->rj); ++ gen_load_gpr(t2, a->rk); ++ gen_helper_asrtgt_d(cpu_env, t1, t2); ++ tcg_temp_free(t1); ++ tcg_temp_free(t2); ++ return true; ++} ++ ++#ifdef CONFIG_USER_ONLY ++static bool trans_gr2scr(DisasContext *ctx, arg_gr2scr *a) ++{ ++ return false; ++} ++ ++static bool trans_scr2gr(DisasContext *ctx, arg_scr2gr *a) ++{ ++ return false; ++} ++#else ++static bool trans_gr2scr(DisasContext *ctx, arg_gr2scr *a) ++{ ++ TCGv_i32 sd = tcg_const_i32(a->sd); ++ TCGv val = tcg_temp_new(); ++ check_lbt_enabled(ctx); ++ gen_load_gpr(val, a->rj); ++ gen_helper_store_scr(cpu_env, sd, val); ++ tcg_temp_free_i32(sd); ++ tcg_temp_free(val); ++ return true; ++} ++ ++static bool trans_scr2gr(DisasContext *ctx, arg_scr2gr *a) ++{ ++ if (a->rd == 0) { ++ /* Nop */ ++ return true; ++ } ++ ++ TCGv_i32 tsj = tcg_const_i32(a->sj); ++ check_lbt_enabled(ctx); ++ gen_helper_load_scr(cpu_gpr[a->rd], cpu_env, tsj); ++ tcg_temp_free_i32(tsj); ++ return true; ++} ++#endif ++ ++static bool trans_clo_w(DisasContext *ctx, arg_clo_w *a) ++{ ++ gen_cl(ctx, OPC_LARCH_CLO_W, a->rd, a->rj); ++ return true; ++} ++ ++static bool trans_clz_w(DisasContext *ctx, arg_clz_w *a) ++{ ++ gen_cl(ctx, OPC_LARCH_CLZ_W, a->rd, a->rj); ++ return true; ++} ++ ++static bool trans_cto_w(DisasContext *ctx, arg_cto_w *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, a->rj); ++ gen_helper_cto_w(cpu_gpr[a->rd], cpu_env, t0); ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_ctz_w(DisasContext *ctx, arg_ctz_w *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, a->rj); ++ gen_helper_ctz_w(cpu_gpr[a->rd], cpu_env, t0); ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_clo_d(DisasContext *ctx, arg_clo_d *a) ++{ ++ check_larch_64(ctx); ++ gen_cl(ctx, OPC_LARCH_CLO_D, a->rd, a->rj); ++ return true; ++} ++ ++static bool trans_clz_d(DisasContext *ctx, arg_clz_d *a) ++{ ++ check_larch_64(ctx); ++ gen_cl(ctx, OPC_LARCH_CLZ_D, a->rd, a->rj); ++ return true; ++} ++ ++static bool trans_cto_d(DisasContext *ctx, arg_cto_d *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, a->rj); ++ gen_helper_cto_d(cpu_gpr[a->rd], cpu_env, t0); ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_ctz_d(DisasContext *ctx, arg_ctz_d *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, a->rj); ++ gen_helper_ctz_d(cpu_gpr[a->rd], cpu_env, t0); ++ ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_revb_2h(DisasContext *ctx, arg_revb_2h *a) ++{ ++ gen_bshfl(ctx, OPC_LARCH_REVB_2H, a->rj, a->rd); ++ return true; ++} ++ ++static bool trans_revb_4h(DisasContext *ctx, arg_revb_4h *a) ++{ ++ check_larch_64(ctx); ++ gen_bshfl(ctx, OPC_LARCH_REVB_4H, a->rj, a->rd); ++ return true; ++} ++ ++static bool trans_revb_2w(DisasContext *ctx, arg_revb_2w *a) ++{ ++ handle_rev32(ctx, a->rj, a->rd); ++ return true; ++} ++ ++static bool trans_revb_d(DisasContext *ctx, arg_revb_d *a) ++{ ++ handle_rev64(ctx, a->rj, a->rd); ++ return true; ++} ++ ++static bool trans_revh_2w(DisasContext *ctx, arg_revh_2w *a) ++{ ++ handle_rev16(ctx, a->rj, a->rd); ++ return true; ++} ++ ++static bool trans_revh_d(DisasContext *ctx, arg_revh_d *a) ++{ ++ check_larch_64(ctx); ++ gen_bshfl(ctx, OPC_LARCH_REVH_D, a->rj, a->rd); ++ return true; ++} ++ ++static bool trans_bitrev_4b(DisasContext *ctx, arg_bitrev_4b *a) ++{ ++ gen_bitswap(ctx, OPC_LARCH_BREV_4B, a->rd, a->rj); ++ return true; ++} ++ ++static bool trans_bitrev_8b(DisasContext *ctx, arg_bitrev_8b *a) ++{ ++ check_larch_64(ctx); ++ gen_bitswap(ctx, OPC_LARCH_BREV_8B, a->rd, a->rj); ++ return true; ++} ++ ++static bool trans_bitrev_w(DisasContext *ctx, arg_bitrev_w *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ gen_load_gpr(t0, a->rj); ++ gen_helper_bitrev_w(cpu_gpr[a->rd], cpu_env, t0); ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_bitrev_d(DisasContext *ctx, arg_bitrev_d *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ gen_load_gpr(t0, a->rj); ++ gen_helper_bitrev_d(cpu_gpr[a->rd], cpu_env, t0); ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_ext_w_h(DisasContext *ctx, arg_ext_w_h *a) ++{ ++ gen_bshfl(ctx, OPC_LARCH_EXT_WH, a->rj, a->rd); ++ return true; ++} ++ ++static bool trans_ext_w_b(DisasContext *ctx, arg_ext_w_b *a) ++{ ++ gen_bshfl(ctx, OPC_LARCH_EXT_WB, a->rj, a->rd); ++ return true; ++} ++ ++static bool trans_srli_w(DisasContext *ctx, arg_srli_w *a) ++{ ++ gen_shift_imm(ctx, OPC_LARCH_SRLI_W, a->rd, a->rj, a->ui5); ++ return true; ++} ++ ++static bool trans_srai_w(DisasContext *ctx, arg_srai_w *a) ++{ ++ gen_shift_imm(ctx, OPC_LARCH_SRAI_W, a->rd, a->rj, a->ui5); ++ return true; ++} ++ ++static bool trans_srai_d(DisasContext *ctx, arg_srai_d *a) ++{ ++ TCGv t0; ++ check_larch_64(ctx); ++ t0 = tcg_temp_new(); ++ gen_load_gpr(t0, a->rj); ++ tcg_gen_sari_tl(cpu_gpr[a->rd], t0, a->ui6); ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_rotri_w(DisasContext *ctx, arg_rotri_w *a) ++{ ++ gen_shift_imm(ctx, OPC_LARCH_ROTRI_W, a->rd, a->rj, a->ui5); ++ return true; ++} ++ ++static bool trans_rotri_d(DisasContext *ctx, arg_rotri_d *a) ++{ ++ TCGv t0; ++ check_larch_64(ctx); ++ t0 = tcg_temp_new(); ++ gen_load_gpr(t0, a->rj); ++ tcg_gen_rotri_tl(cpu_gpr[a->rd], t0, a->ui6); ++ tcg_temp_free(t0); ++ return true; ++} ++ ++static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a) ++{ ++ check_cp1_enabled(ctx); ++ gen_fcmp_s(ctx, a->fcond, a->fk, a->fj, a->cd); ++ return true; ++} ++ ++static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a) ++{ ++ check_cp1_enabled(ctx); ++ gen_fcmp_d(ctx, a->fcond, a->fk, a->fj, a->cd); ++ return true; ++} ++ ++static bool trans_fsel(DisasContext *ctx, arg_fsel *a) ++{ ++ TCGv_i64 fj = tcg_temp_new_i64(); ++ TCGv_i64 fk = tcg_temp_new_i64(); ++ TCGv_i64 fd = tcg_temp_new_i64(); ++ TCGv_i32 ca = tcg_const_i32(a->ca); ++ check_cp1_enabled(ctx); ++ gen_load_fpr64(ctx, fj, a->fj); ++ gen_load_fpr64(ctx, fk, a->fk); ++ gen_helper_fsel(fd, cpu_env, fj, fk, ca); ++ gen_store_fpr64(ctx, fd, a->fd); ++ tcg_temp_free_i64(fj); ++ tcg_temp_free_i64(fk); ++ tcg_temp_free_i64(fd); ++ tcg_temp_free_i32(ca); ++ return true; ++} ++ ++#include "cpu-csr.h" ++ ++#ifdef CONFIG_USER_ONLY ++ ++static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a) ++{ ++ return false; ++} ++ ++#else ++ ++#define GEN_CSRRQ_CASE(name) \ ++ do { \ ++ case LOONGARCH_CSR_##name: \ ++ gen_csr_rdq(ctx, cpu_gpr[rd], LOONGARCH_CSR_##name); \ ++ } while (0) ++ ++static bool trans_csrrd(DisasContext *ctx, unsigned rd, unsigned csr) ++{ ++ switch (csr) { ++ GEN_CSRRQ_CASE(CRMD); ++ break; ++ GEN_CSRRQ_CASE(PRMD); ++ break; ++ GEN_CSRRQ_CASE(EUEN); ++ break; ++ GEN_CSRRQ_CASE(MISC); ++ break; ++ GEN_CSRRQ_CASE(ECFG); ++ break; ++ GEN_CSRRQ_CASE(ESTAT); ++ break; ++ GEN_CSRRQ_CASE(ERA); ++ break; ++ GEN_CSRRQ_CASE(BADV); ++ break; ++ GEN_CSRRQ_CASE(BADI); ++ break; ++ GEN_CSRRQ_CASE(EEPN); ++ break; ++ GEN_CSRRQ_CASE(TLBIDX); ++ break; ++ GEN_CSRRQ_CASE(TLBEHI); ++ break; ++ GEN_CSRRQ_CASE(TLBELO0); ++ break; ++ GEN_CSRRQ_CASE(TLBELO1); ++ break; ++ GEN_CSRRQ_CASE(TLBWIRED); ++ break; ++ GEN_CSRRQ_CASE(GTLBC); ++ break; ++ GEN_CSRRQ_CASE(TRGP); ++ break; ++ GEN_CSRRQ_CASE(ASID); ++ break; ++ GEN_CSRRQ_CASE(PGDL); ++ break; ++ GEN_CSRRQ_CASE(PGDH); ++ break; ++ case LOONGARCH_CSR_PGD: ++ gen_helper_read_pgd(cpu_gpr[rd], cpu_env); ++ break; ++ GEN_CSRRQ_CASE(PWCTL0); ++ break; ++ GEN_CSRRQ_CASE(PWCTL1); ++ break; ++ GEN_CSRRQ_CASE(STLBPGSIZE); ++ break; ++ GEN_CSRRQ_CASE(RVACFG); ++ break; ++ GEN_CSRRQ_CASE(CPUID); ++ break; ++ GEN_CSRRQ_CASE(PRCFG1); ++ break; ++ GEN_CSRRQ_CASE(PRCFG2); ++ break; ++ GEN_CSRRQ_CASE(PRCFG3); ++ break; ++ GEN_CSRRQ_CASE(KS0); ++ break; ++ GEN_CSRRQ_CASE(KS1); ++ break; ++ GEN_CSRRQ_CASE(KS2); ++ break; ++ GEN_CSRRQ_CASE(KS3); ++ break; ++ GEN_CSRRQ_CASE(KS4); ++ break; ++ GEN_CSRRQ_CASE(KS5); ++ break; ++ GEN_CSRRQ_CASE(KS6); ++ break; ++ GEN_CSRRQ_CASE(KS7); ++ break; ++ GEN_CSRRQ_CASE(KS8); ++ break; ++ GEN_CSRRQ_CASE(TMID); ++ break; ++ GEN_CSRRQ_CASE(TCFG); ++ break; ++ GEN_CSRRQ_CASE(TVAL); ++ break; ++ GEN_CSRRQ_CASE(CNTC); ++ break; ++ GEN_CSRRQ_CASE(TINTCLR); ++ break; ++ GEN_CSRRQ_CASE(GSTAT); ++ break; ++ GEN_CSRRQ_CASE(GCFG); ++ break; ++ GEN_CSRRQ_CASE(GINTC); ++ break; ++ GEN_CSRRQ_CASE(GCNTC); ++ break; ++ GEN_CSRRQ_CASE(LLBCTL); ++ break; ++ GEN_CSRRQ_CASE(IMPCTL1); ++ break; ++ GEN_CSRRQ_CASE(IMPCTL2); ++ break; ++ GEN_CSRRQ_CASE(GNMI); ++ break; ++ GEN_CSRRQ_CASE(TLBRENT); ++ break; ++ GEN_CSRRQ_CASE(TLBRBADV); ++ break; ++ GEN_CSRRQ_CASE(TLBRERA); ++ break; ++ GEN_CSRRQ_CASE(TLBRSAVE); ++ break; ++ GEN_CSRRQ_CASE(TLBRELO0); ++ break; ++ GEN_CSRRQ_CASE(TLBRELO1); ++ break; ++ GEN_CSRRQ_CASE(TLBREHI); ++ break; ++ GEN_CSRRQ_CASE(TLBRPRMD); ++ break; ++ GEN_CSRRQ_CASE(ERRCTL); ++ break; ++ GEN_CSRRQ_CASE(ERRINFO); ++ break; ++ GEN_CSRRQ_CASE(ERRINFO1); ++ break; ++ GEN_CSRRQ_CASE(ERRENT); ++ break; ++ GEN_CSRRQ_CASE(ERRERA); ++ break; ++ GEN_CSRRQ_CASE(ERRSAVE); ++ break; ++ GEN_CSRRQ_CASE(CTAG); ++ break; ++ GEN_CSRRQ_CASE(DMWIN0); ++ break; ++ GEN_CSRRQ_CASE(DMWIN1); ++ break; ++ GEN_CSRRQ_CASE(DMWIN2); ++ break; ++ GEN_CSRRQ_CASE(DMWIN3); ++ break; ++ GEN_CSRRQ_CASE(PERFCTRL0); ++ break; ++ GEN_CSRRQ_CASE(PERFCNTR0); ++ break; ++ GEN_CSRRQ_CASE(PERFCTRL1); ++ break; ++ GEN_CSRRQ_CASE(PERFCNTR1); ++ break; ++ GEN_CSRRQ_CASE(PERFCTRL2); ++ break; ++ GEN_CSRRQ_CASE(PERFCNTR2); ++ break; ++ GEN_CSRRQ_CASE(PERFCTRL3); ++ break; ++ GEN_CSRRQ_CASE(PERFCNTR3); ++ break; ++ /* debug */ ++ GEN_CSRRQ_CASE(MWPC); ++ break; ++ GEN_CSRRQ_CASE(MWPS); ++ break; ++ GEN_CSRRQ_CASE(DB0ADDR); ++ break; ++ GEN_CSRRQ_CASE(DB0MASK); ++ break; ++ GEN_CSRRQ_CASE(DB0CTL); ++ break; ++ GEN_CSRRQ_CASE(DB0ASID); ++ break; ++ GEN_CSRRQ_CASE(DB1ADDR); ++ break; ++ GEN_CSRRQ_CASE(DB1MASK); ++ break; ++ GEN_CSRRQ_CASE(DB1CTL); ++ break; ++ GEN_CSRRQ_CASE(DB1ASID); ++ break; ++ GEN_CSRRQ_CASE(DB2ADDR); ++ break; ++ GEN_CSRRQ_CASE(DB2MASK); ++ break; ++ GEN_CSRRQ_CASE(DB2CTL); ++ break; ++ GEN_CSRRQ_CASE(DB2ASID); ++ break; ++ GEN_CSRRQ_CASE(DB3ADDR); ++ break; ++ GEN_CSRRQ_CASE(DB3MASK); ++ break; ++ GEN_CSRRQ_CASE(DB3CTL); ++ break; ++ GEN_CSRRQ_CASE(DB3ASID); ++ break; ++ GEN_CSRRQ_CASE(FWPC); ++ break; ++ GEN_CSRRQ_CASE(FWPS); ++ break; ++ GEN_CSRRQ_CASE(IB0ADDR); ++ break; ++ GEN_CSRRQ_CASE(IB0MASK); ++ break; ++ GEN_CSRRQ_CASE(IB0CTL); ++ break; ++ GEN_CSRRQ_CASE(IB0ASID); ++ break; ++ GEN_CSRRQ_CASE(IB1ADDR); ++ break; ++ GEN_CSRRQ_CASE(IB1MASK); ++ break; ++ GEN_CSRRQ_CASE(IB1CTL); ++ break; ++ GEN_CSRRQ_CASE(IB1ASID); ++ break; ++ GEN_CSRRQ_CASE(IB2ADDR); ++ break; ++ GEN_CSRRQ_CASE(IB2MASK); ++ break; ++ GEN_CSRRQ_CASE(IB2CTL); ++ break; ++ GEN_CSRRQ_CASE(IB2ASID); ++ break; ++ GEN_CSRRQ_CASE(IB3ADDR); ++ break; ++ GEN_CSRRQ_CASE(IB3MASK); ++ break; ++ GEN_CSRRQ_CASE(IB3CTL); ++ break; ++ GEN_CSRRQ_CASE(IB3ASID); ++ break; ++ GEN_CSRRQ_CASE(IB4ADDR); ++ break; ++ GEN_CSRRQ_CASE(IB4MASK); ++ break; ++ GEN_CSRRQ_CASE(IB4CTL); ++ break; ++ GEN_CSRRQ_CASE(IB4ASID); ++ break; ++ GEN_CSRRQ_CASE(IB5ADDR); ++ break; ++ GEN_CSRRQ_CASE(IB5MASK); ++ break; ++ GEN_CSRRQ_CASE(IB5CTL); ++ break; ++ GEN_CSRRQ_CASE(IB5ASID); ++ break; ++ GEN_CSRRQ_CASE(IB6ADDR); ++ break; ++ GEN_CSRRQ_CASE(IB6MASK); ++ break; ++ GEN_CSRRQ_CASE(IB6CTL); ++ break; ++ GEN_CSRRQ_CASE(IB6ASID); ++ break; ++ GEN_CSRRQ_CASE(IB7ADDR); ++ break; ++ GEN_CSRRQ_CASE(IB7MASK); ++ break; ++ GEN_CSRRQ_CASE(IB7CTL); ++ break; ++ GEN_CSRRQ_CASE(IB7ASID); ++ break; ++ GEN_CSRRQ_CASE(DEBUG); ++ break; ++ GEN_CSRRQ_CASE(DERA); ++ break; ++ GEN_CSRRQ_CASE(DESAVE); ++ break; ++ default: ++ return false; ++ } ++ ++#undef GEN_CSRRQ_CASE ++ ++ return true; ++} ++ ++#define GEN_CSRWQ_CASE(name) \ ++ do { \ ++ case LOONGARCH_CSR_##name: \ ++ gen_csr_wrq(ctx, cpu_gpr[rd], LOONGARCH_CSR_##name); \ ++ } while (0) ++ ++static bool trans_csrwr(DisasContext *ctx, unsigned rd, unsigned csr) ++{ ++ ++ switch (csr) { ++ case LOONGARCH_CSR_CRMD: ++ save_cpu_state(ctx, 1); ++ gen_csr_wrq(ctx, cpu_gpr[rd], LOONGARCH_CSR_CRMD); ++ gen_save_pc(ctx->base.pc_next + 4); ++ ctx->base.is_jmp = DISAS_EXIT; ++ break; ++ GEN_CSRWQ_CASE(PRMD); ++ break; ++ case LOONGARCH_CSR_EUEN: ++ gen_csr_wrq(ctx, cpu_gpr[rd], LOONGARCH_CSR_EUEN); ++ /* Stop translation */ ++ gen_save_pc(ctx->base.pc_next + 4); ++ ctx->base.is_jmp = DISAS_EXIT; ++ break; ++ GEN_CSRWQ_CASE(MISC); ++ break; ++ GEN_CSRWQ_CASE(ECFG); ++ break; ++ GEN_CSRWQ_CASE(ESTAT); ++ break; ++ GEN_CSRWQ_CASE(ERA); ++ break; ++ GEN_CSRWQ_CASE(BADV); ++ break; ++ GEN_CSRWQ_CASE(BADI); ++ break; ++ GEN_CSRWQ_CASE(EEPN); ++ break; ++ GEN_CSRWQ_CASE(TLBIDX); ++ break; ++ GEN_CSRWQ_CASE(TLBEHI); ++ break; ++ GEN_CSRWQ_CASE(TLBELO0); ++ break; ++ GEN_CSRWQ_CASE(TLBELO1); ++ break; ++ GEN_CSRWQ_CASE(TLBWIRED); ++ break; ++ GEN_CSRWQ_CASE(GTLBC); ++ break; ++ GEN_CSRWQ_CASE(TRGP); ++ break; ++ GEN_CSRWQ_CASE(ASID); ++ break; ++ GEN_CSRWQ_CASE(PGDL); ++ break; ++ GEN_CSRWQ_CASE(PGDH); ++ break; ++ GEN_CSRWQ_CASE(PGD); ++ break; ++ GEN_CSRWQ_CASE(PWCTL0); ++ break; ++ GEN_CSRWQ_CASE(PWCTL1); ++ break; ++ GEN_CSRWQ_CASE(STLBPGSIZE); ++ break; ++ GEN_CSRWQ_CASE(RVACFG); ++ break; ++ GEN_CSRWQ_CASE(CPUID); ++ break; ++ GEN_CSRWQ_CASE(PRCFG1); ++ break; ++ GEN_CSRWQ_CASE(PRCFG2); ++ break; ++ GEN_CSRWQ_CASE(PRCFG3); ++ break; ++ GEN_CSRWQ_CASE(KS0); ++ break; ++ GEN_CSRWQ_CASE(KS1); ++ break; ++ GEN_CSRWQ_CASE(KS2); ++ break; ++ GEN_CSRWQ_CASE(KS3); ++ break; ++ GEN_CSRWQ_CASE(KS4); ++ break; ++ GEN_CSRWQ_CASE(KS5); ++ break; ++ GEN_CSRWQ_CASE(KS6); ++ break; ++ GEN_CSRWQ_CASE(KS7); ++ break; ++ GEN_CSRWQ_CASE(KS8); ++ break; ++ GEN_CSRWQ_CASE(TMID); ++ break; ++ GEN_CSRWQ_CASE(TCFG); ++ break; ++ GEN_CSRWQ_CASE(TVAL); ++ break; ++ GEN_CSRWQ_CASE(CNTC); ++ break; ++ GEN_CSRWQ_CASE(TINTCLR); ++ break; ++ GEN_CSRWQ_CASE(GSTAT); ++ break; ++ GEN_CSRWQ_CASE(GCFG); ++ break; ++ GEN_CSRWQ_CASE(GINTC); ++ break; ++ GEN_CSRWQ_CASE(GCNTC); ++ break; ++ GEN_CSRWQ_CASE(LLBCTL); ++ break; ++ GEN_CSRWQ_CASE(IMPCTL1); ++ break; ++ GEN_CSRWQ_CASE(IMPCTL2); ++ break; ++ GEN_CSRWQ_CASE(GNMI); ++ break; ++ GEN_CSRWQ_CASE(TLBRENT); ++ break; ++ GEN_CSRWQ_CASE(TLBRBADV); ++ break; ++ GEN_CSRWQ_CASE(TLBRERA); ++ break; ++ GEN_CSRWQ_CASE(TLBRSAVE); ++ break; ++ GEN_CSRWQ_CASE(TLBRELO0); ++ break; ++ GEN_CSRWQ_CASE(TLBRELO1); ++ break; ++ GEN_CSRWQ_CASE(TLBREHI); ++ break; ++ GEN_CSRWQ_CASE(TLBRPRMD); ++ break; ++ GEN_CSRWQ_CASE(ERRCTL); ++ break; ++ GEN_CSRWQ_CASE(ERRINFO); ++ break; ++ GEN_CSRWQ_CASE(ERRINFO1); ++ break; ++ GEN_CSRWQ_CASE(ERRENT); ++ break; ++ GEN_CSRWQ_CASE(ERRERA); ++ break; ++ GEN_CSRWQ_CASE(ERRSAVE); ++ break; ++ GEN_CSRWQ_CASE(CTAG); ++ break; ++ GEN_CSRWQ_CASE(DMWIN0); ++ break; ++ GEN_CSRWQ_CASE(DMWIN1); ++ break; ++ GEN_CSRWQ_CASE(DMWIN2); ++ break; ++ GEN_CSRWQ_CASE(DMWIN3); ++ break; ++ GEN_CSRWQ_CASE(PERFCTRL0); ++ break; ++ GEN_CSRWQ_CASE(PERFCNTR0); ++ break; ++ GEN_CSRWQ_CASE(PERFCTRL1); ++ break; ++ GEN_CSRWQ_CASE(PERFCNTR1); ++ break; ++ GEN_CSRWQ_CASE(PERFCTRL2); ++ break; ++ GEN_CSRWQ_CASE(PERFCNTR2); ++ break; ++ GEN_CSRWQ_CASE(PERFCTRL3); ++ break; ++ GEN_CSRWQ_CASE(PERFCNTR3); ++ break; ++ /* debug */ ++ GEN_CSRWQ_CASE(MWPC); ++ break; ++ GEN_CSRWQ_CASE(MWPS); ++ break; ++ GEN_CSRWQ_CASE(DB0ADDR); ++ break; ++ GEN_CSRWQ_CASE(DB0MASK); ++ break; ++ GEN_CSRWQ_CASE(DB0CTL); ++ break; ++ GEN_CSRWQ_CASE(DB0ASID); ++ break; ++ GEN_CSRWQ_CASE(DB1ADDR); ++ break; ++ GEN_CSRWQ_CASE(DB1MASK); ++ break; ++ GEN_CSRWQ_CASE(DB1CTL); ++ break; ++ GEN_CSRWQ_CASE(DB1ASID); ++ break; ++ GEN_CSRWQ_CASE(DB2ADDR); ++ break; ++ GEN_CSRWQ_CASE(DB2MASK); ++ break; ++ GEN_CSRWQ_CASE(DB2CTL); ++ break; ++ GEN_CSRWQ_CASE(DB2ASID); ++ break; ++ GEN_CSRWQ_CASE(DB3ADDR); ++ break; ++ GEN_CSRWQ_CASE(DB3MASK); ++ break; ++ GEN_CSRWQ_CASE(DB3CTL); ++ break; ++ GEN_CSRWQ_CASE(DB3ASID); ++ break; ++ GEN_CSRWQ_CASE(FWPC); ++ break; ++ GEN_CSRWQ_CASE(FWPS); ++ break; ++ GEN_CSRWQ_CASE(IB0ADDR); ++ break; ++ GEN_CSRWQ_CASE(IB0MASK); ++ break; ++ GEN_CSRWQ_CASE(IB0CTL); ++ break; ++ GEN_CSRWQ_CASE(IB0ASID); ++ break; ++ GEN_CSRWQ_CASE(IB1ADDR); ++ break; ++ GEN_CSRWQ_CASE(IB1MASK); ++ break; ++ GEN_CSRWQ_CASE(IB1CTL); ++ break; ++ GEN_CSRWQ_CASE(IB1ASID); ++ break; ++ GEN_CSRWQ_CASE(IB2ADDR); ++ break; ++ GEN_CSRWQ_CASE(IB2MASK); ++ break; ++ GEN_CSRWQ_CASE(IB2CTL); ++ break; ++ GEN_CSRWQ_CASE(IB2ASID); ++ break; ++ GEN_CSRWQ_CASE(IB3ADDR); ++ break; ++ GEN_CSRWQ_CASE(IB3MASK); ++ break; ++ GEN_CSRWQ_CASE(IB3CTL); ++ break; ++ GEN_CSRWQ_CASE(IB3ASID); ++ break; ++ GEN_CSRWQ_CASE(IB4ADDR); ++ break; ++ GEN_CSRWQ_CASE(IB4MASK); ++ break; ++ GEN_CSRWQ_CASE(IB4CTL); ++ break; ++ GEN_CSRWQ_CASE(IB4ASID); ++ break; ++ GEN_CSRWQ_CASE(IB5ADDR); ++ break; ++ GEN_CSRWQ_CASE(IB5MASK); ++ break; ++ GEN_CSRWQ_CASE(IB5CTL); ++ break; ++ GEN_CSRWQ_CASE(IB5ASID); ++ break; ++ GEN_CSRWQ_CASE(IB6ADDR); ++ break; ++ GEN_CSRWQ_CASE(IB6MASK); ++ break; ++ GEN_CSRWQ_CASE(IB6CTL); ++ break; ++ GEN_CSRWQ_CASE(IB6ASID); ++ break; ++ GEN_CSRWQ_CASE(IB7ADDR); ++ break; ++ GEN_CSRWQ_CASE(IB7MASK); ++ break; ++ GEN_CSRWQ_CASE(IB7CTL); ++ break; ++ GEN_CSRWQ_CASE(IB7ASID); ++ break; ++ GEN_CSRWQ_CASE(DEBUG); ++ break; ++ GEN_CSRWQ_CASE(DERA); ++ break; ++ GEN_CSRWQ_CASE(DESAVE); ++ break; ++ default: ++ return false; ++ } ++ ++#undef GEN_CSRWQ_CASE ++ ++ return true; ++} ++ ++#define GEN_CSRXQ_CASE(name) \ ++ do { \ ++ case LOONGARCH_CSR_##name: \ ++ if (rd == 0) { \ ++ gen_csr_xchgq(ctx, zero, cpu_gpr[rj], LOONGARCH_CSR_##name); \ ++ } else { \ ++ gen_csr_xchgq(ctx, cpu_gpr[rd], cpu_gpr[rj], \ ++ LOONGARCH_CSR_##name); \ ++ } \ ++ } while (0) ++ ++static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a) ++{ ++ unsigned rd, rj, csr; ++ TCGv zero = tcg_const_tl(0); ++ rd = a->rd; ++ rj = a->rj; ++ csr = a->csr; ++ ++ if (rj == 0) { ++ return trans_csrrd(ctx, rd, csr); ++ } else if (rj == 1) { ++ return trans_csrwr(ctx, rd, csr); ++ } ++ ++ switch (csr) { ++ case LOONGARCH_CSR_CRMD: ++ save_cpu_state(ctx, 1); ++ if (rd == 0) { ++ gen_csr_xchgq(ctx, zero, cpu_gpr[rj], LOONGARCH_CSR_CRMD); ++ } else { ++ gen_csr_xchgq(ctx, cpu_gpr[rd], cpu_gpr[rj], LOONGARCH_CSR_CRMD); ++ } ++ gen_save_pc(ctx->base.pc_next + 4); ++ ctx->base.is_jmp = DISAS_EXIT; ++ break; ++ ++ GEN_CSRXQ_CASE(PRMD); ++ break; ++ case LOONGARCH_CSR_EUEN: ++ if (rd == 0) { ++ gen_csr_xchgq(ctx, zero, cpu_gpr[rj], LOONGARCH_CSR_EUEN); ++ } else { ++ gen_csr_xchgq(ctx, cpu_gpr[rd], cpu_gpr[rj], LOONGARCH_CSR_EUEN); ++ } ++ /* Stop translation */ ++ gen_save_pc(ctx->base.pc_next + 4); ++ ctx->base.is_jmp = DISAS_EXIT; ++ break; ++ GEN_CSRXQ_CASE(MISC); ++ break; ++ GEN_CSRXQ_CASE(ECFG); ++ break; ++ GEN_CSRXQ_CASE(ESTAT); ++ break; ++ GEN_CSRXQ_CASE(ERA); ++ break; ++ GEN_CSRXQ_CASE(BADV); ++ break; ++ GEN_CSRXQ_CASE(BADI); ++ break; ++ GEN_CSRXQ_CASE(EEPN); ++ break; ++ GEN_CSRXQ_CASE(TLBIDX); ++ break; ++ GEN_CSRXQ_CASE(TLBEHI); ++ break; ++ GEN_CSRXQ_CASE(TLBELO0); ++ break; ++ GEN_CSRXQ_CASE(TLBELO1); ++ break; ++ GEN_CSRXQ_CASE(TLBWIRED); ++ break; ++ GEN_CSRXQ_CASE(GTLBC); ++ break; ++ GEN_CSRXQ_CASE(TRGP); ++ break; ++ GEN_CSRXQ_CASE(ASID); ++ break; ++ GEN_CSRXQ_CASE(PGDL); ++ break; ++ GEN_CSRXQ_CASE(PGDH); ++ break; ++ GEN_CSRXQ_CASE(PGD); ++ break; ++ GEN_CSRXQ_CASE(PWCTL0); ++ break; ++ GEN_CSRXQ_CASE(PWCTL1); ++ break; ++ GEN_CSRXQ_CASE(STLBPGSIZE); ++ break; ++ GEN_CSRXQ_CASE(RVACFG); ++ break; ++ GEN_CSRXQ_CASE(CPUID); ++ break; ++ GEN_CSRXQ_CASE(PRCFG1); ++ break; ++ GEN_CSRXQ_CASE(PRCFG2); ++ break; ++ GEN_CSRXQ_CASE(PRCFG3); ++ break; ++ GEN_CSRXQ_CASE(KS0); ++ break; ++ GEN_CSRXQ_CASE(KS1); ++ break; ++ GEN_CSRXQ_CASE(KS2); ++ break; ++ GEN_CSRXQ_CASE(KS3); ++ break; ++ GEN_CSRXQ_CASE(KS4); ++ break; ++ GEN_CSRXQ_CASE(KS5); ++ break; ++ GEN_CSRXQ_CASE(KS6); ++ break; ++ GEN_CSRXQ_CASE(KS7); ++ break; ++ GEN_CSRXQ_CASE(KS8); ++ break; ++ GEN_CSRXQ_CASE(TMID); ++ break; ++ GEN_CSRXQ_CASE(TCFG); ++ break; ++ GEN_CSRXQ_CASE(TVAL); ++ break; ++ GEN_CSRXQ_CASE(CNTC); ++ break; ++ GEN_CSRXQ_CASE(TINTCLR); ++ break; ++ GEN_CSRXQ_CASE(GSTAT); ++ break; ++ GEN_CSRXQ_CASE(GCFG); ++ break; ++ GEN_CSRXQ_CASE(GINTC); ++ break; ++ GEN_CSRXQ_CASE(GCNTC); ++ break; ++ GEN_CSRXQ_CASE(LLBCTL); ++ break; ++ GEN_CSRXQ_CASE(IMPCTL1); ++ break; ++ GEN_CSRXQ_CASE(IMPCTL2); ++ break; ++ GEN_CSRXQ_CASE(GNMI); ++ break; ++ GEN_CSRXQ_CASE(TLBRENT); ++ break; ++ GEN_CSRXQ_CASE(TLBRBADV); ++ break; ++ GEN_CSRXQ_CASE(TLBRERA); ++ break; ++ GEN_CSRXQ_CASE(TLBRSAVE); ++ break; ++ GEN_CSRXQ_CASE(TLBRELO0); ++ break; ++ GEN_CSRXQ_CASE(TLBRELO1); ++ break; ++ GEN_CSRXQ_CASE(TLBREHI); ++ break; ++ GEN_CSRXQ_CASE(TLBRPRMD); ++ break; ++ GEN_CSRXQ_CASE(ERRCTL); ++ break; ++ GEN_CSRXQ_CASE(ERRINFO); ++ break; ++ GEN_CSRXQ_CASE(ERRINFO1); ++ break; ++ GEN_CSRXQ_CASE(ERRENT); ++ break; ++ GEN_CSRXQ_CASE(ERRERA); ++ break; ++ GEN_CSRXQ_CASE(ERRSAVE); ++ break; ++ GEN_CSRXQ_CASE(CTAG); ++ break; ++ GEN_CSRXQ_CASE(DMWIN0); ++ break; ++ GEN_CSRXQ_CASE(DMWIN1); ++ break; ++ GEN_CSRXQ_CASE(DMWIN2); ++ break; ++ GEN_CSRXQ_CASE(DMWIN3); ++ break; ++ GEN_CSRXQ_CASE(PERFCTRL0); ++ break; ++ GEN_CSRXQ_CASE(PERFCNTR0); ++ break; ++ GEN_CSRXQ_CASE(PERFCTRL1); ++ break; ++ GEN_CSRXQ_CASE(PERFCNTR1); ++ break; ++ GEN_CSRXQ_CASE(PERFCTRL2); ++ break; ++ GEN_CSRXQ_CASE(PERFCNTR2); ++ break; ++ GEN_CSRXQ_CASE(PERFCTRL3); ++ break; ++ GEN_CSRXQ_CASE(PERFCNTR3); ++ break; ++ /* debug */ ++ GEN_CSRXQ_CASE(MWPC); ++ break; ++ GEN_CSRXQ_CASE(MWPS); ++ break; ++ GEN_CSRXQ_CASE(DB0ADDR); ++ break; ++ GEN_CSRXQ_CASE(DB0MASK); ++ break; ++ GEN_CSRXQ_CASE(DB0CTL); ++ break; ++ GEN_CSRXQ_CASE(DB0ASID); ++ break; ++ GEN_CSRXQ_CASE(DB1ADDR); ++ break; ++ GEN_CSRXQ_CASE(DB1MASK); ++ break; ++ GEN_CSRXQ_CASE(DB1CTL); ++ break; ++ GEN_CSRXQ_CASE(DB1ASID); ++ break; ++ GEN_CSRXQ_CASE(DB2ADDR); ++ break; ++ GEN_CSRXQ_CASE(DB2MASK); ++ break; ++ GEN_CSRXQ_CASE(DB2CTL); ++ break; ++ GEN_CSRXQ_CASE(DB2ASID); ++ break; ++ GEN_CSRXQ_CASE(DB3ADDR); ++ break; ++ GEN_CSRXQ_CASE(DB3MASK); ++ break; ++ GEN_CSRXQ_CASE(DB3CTL); ++ break; ++ GEN_CSRXQ_CASE(DB3ASID); ++ break; ++ GEN_CSRXQ_CASE(FWPC); ++ break; ++ GEN_CSRXQ_CASE(FWPS); ++ break; ++ GEN_CSRXQ_CASE(IB0ADDR); ++ break; ++ GEN_CSRXQ_CASE(IB0MASK); ++ break; ++ GEN_CSRXQ_CASE(IB0CTL); ++ break; ++ GEN_CSRXQ_CASE(IB0ASID); ++ break; ++ GEN_CSRXQ_CASE(IB1ADDR); ++ break; ++ GEN_CSRXQ_CASE(IB1MASK); ++ break; ++ GEN_CSRXQ_CASE(IB1CTL); ++ break; ++ GEN_CSRXQ_CASE(IB1ASID); ++ break; ++ GEN_CSRXQ_CASE(IB2ADDR); ++ break; ++ GEN_CSRXQ_CASE(IB2MASK); ++ break; ++ GEN_CSRXQ_CASE(IB2CTL); ++ break; ++ GEN_CSRXQ_CASE(IB2ASID); ++ break; ++ GEN_CSRXQ_CASE(IB3ADDR); ++ break; ++ GEN_CSRXQ_CASE(IB3MASK); ++ break; ++ GEN_CSRXQ_CASE(IB3CTL); ++ break; ++ GEN_CSRXQ_CASE(IB3ASID); ++ break; ++ GEN_CSRXQ_CASE(IB4ADDR); ++ break; ++ GEN_CSRXQ_CASE(IB4MASK); ++ break; ++ GEN_CSRXQ_CASE(IB4CTL); ++ break; ++ GEN_CSRXQ_CASE(IB4ASID); ++ break; ++ GEN_CSRXQ_CASE(IB5ADDR); ++ break; ++ GEN_CSRXQ_CASE(IB5MASK); ++ break; ++ GEN_CSRXQ_CASE(IB5CTL); ++ break; ++ GEN_CSRXQ_CASE(IB5ASID); ++ break; ++ GEN_CSRXQ_CASE(IB6ADDR); ++ break; ++ GEN_CSRXQ_CASE(IB6MASK); ++ break; ++ GEN_CSRXQ_CASE(IB6CTL); ++ break; ++ GEN_CSRXQ_CASE(IB6ASID); ++ break; ++ GEN_CSRXQ_CASE(IB7ADDR); ++ break; ++ GEN_CSRXQ_CASE(IB7MASK); ++ break; ++ GEN_CSRXQ_CASE(IB7CTL); ++ break; ++ GEN_CSRXQ_CASE(IB7ASID); ++ break; ++ GEN_CSRXQ_CASE(DEBUG); ++ break; ++ GEN_CSRXQ_CASE(DERA); ++ break; ++ GEN_CSRXQ_CASE(DESAVE); ++ break; ++ default: ++ return false; ++ } ++ ++#undef GEN_CSRXQ_CASE ++ tcg_temp_free(zero); ++ return true; ++} ++ ++#endif ++ ++static bool trans_cacop(DisasContext *ctx, arg_cacop *a) ++{ ++ /* Treat as NOP. */ ++ return true; ++} ++ ++#ifdef CONFIG_USER_ONLY ++ ++static bool trans_ldpte(DisasContext *ctx, arg_ldpte *a) ++{ ++ return false; ++} ++ ++static bool trans_lddir(DisasContext *ctx, arg_lddir *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrrd_b(DisasContext *ctx, arg_iocsrrd_b *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrrd_h(DisasContext *ctx, arg_iocsrrd_h *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrrd_w(DisasContext *ctx, arg_iocsrrd_w *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrrd_d(DisasContext *ctx, arg_iocsrrd_d *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrwr_b(DisasContext *ctx, arg_iocsrwr_b *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrwr_h(DisasContext *ctx, arg_iocsrwr_h *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrwr_w(DisasContext *ctx, arg_iocsrwr_w *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrwr_d(DisasContext *ctx, arg_iocsrwr_d *a) ++{ ++ return false; ++} ++#else ++ ++static bool trans_ldpte(DisasContext *ctx, arg_ldpte *a) ++{ ++ TCGv t0, t1; ++ TCGv_i32 t2; ++ t0 = tcg_const_tl(a->rj); ++ t1 = tcg_const_tl(a->seq); ++ t2 = tcg_const_i32(ctx->mem_idx); ++ gen_helper_ldpte(cpu_env, t0, t1, t2); ++ ++ return true; ++} ++ ++static bool trans_lddir(DisasContext *ctx, arg_lddir *a) ++{ ++ TCGv t0, t1, t2; ++ TCGv_i32 t3; ++ t0 = tcg_const_tl(a->rj); ++ t1 = tcg_const_tl(a->rd); ++ t2 = tcg_const_tl(a->level); ++ t3 = tcg_const_i32(ctx->mem_idx); ++ gen_helper_lddir(cpu_env, t0, t1, t2, t3); ++ ++ return true; ++} ++ ++static bool trans_iocsrrd_b(DisasContext *ctx, arg_iocsrrd_b *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrrd_h(DisasContext *ctx, arg_iocsrrd_h *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrrd_w(DisasContext *ctx, arg_iocsrrd_w *a) ++{ ++ TCGv_i32 iocsr_op = tcg_const_i32(OPC_LARCH_LD_W); ++ TCGv t0, t1; ++ t0 = tcg_const_tl(a->rj); ++ t1 = tcg_const_tl(a->rd); ++ gen_helper_iocsr(cpu_env, t0, t1, iocsr_op); ++ return true; ++} ++ ++static bool trans_iocsrrd_d(DisasContext *ctx, arg_iocsrrd_d *a) ++{ ++ TCGv_i32 iocsr_op = tcg_const_i32(OPC_LARCH_LD_D); ++ TCGv t0, t1; ++ t0 = tcg_const_tl(a->rj); ++ t1 = tcg_const_tl(a->rd); ++ gen_helper_iocsr(cpu_env, t0, t1, iocsr_op); ++ return true; ++} ++ ++static bool trans_iocsrwr_b(DisasContext *ctx, arg_iocsrwr_b *a) ++{ ++ TCGv_i32 iocsr_op = tcg_const_i32(OPC_LARCH_ST_B); ++ TCGv t0, t1; ++ t0 = tcg_const_tl(a->rj); ++ t1 = tcg_const_tl(a->rd); ++ gen_helper_iocsr(cpu_env, t0, t1, iocsr_op); ++ return true; ++} ++ ++static bool trans_iocsrwr_h(DisasContext *ctx, arg_iocsrwr_h *a) ++{ ++ return false; ++} ++ ++static bool trans_iocsrwr_w(DisasContext *ctx, arg_iocsrwr_w *a) ++{ ++ TCGv_i32 iocsr_op = tcg_const_i32(OPC_LARCH_ST_W); ++ TCGv t0, t1; ++ t0 = tcg_const_tl(a->rj); ++ t1 = tcg_const_tl(a->rd); ++ gen_helper_iocsr(cpu_env, t0, t1, iocsr_op); ++ return true; ++} ++ ++static bool trans_iocsrwr_d(DisasContext *ctx, arg_iocsrwr_d *a) ++{ ++ TCGv_i32 iocsr_op = tcg_const_i32(OPC_LARCH_ST_D); ++ TCGv t0, t1; ++ t0 = tcg_const_tl(a->rj); ++ t1 = tcg_const_tl(a->rd); ++ gen_helper_iocsr(cpu_env, t0, t1, iocsr_op); ++ return true; ++} ++#endif /* !CONFIG_USER_ONLY */ ++ ++#ifdef CONFIG_USER_ONLY ++ ++#define GEN_FALSE_TRANS(name) \ ++ static bool trans_##name(DisasContext *ctx, arg_##name *a) \ ++ { \ ++ return false; \ ++ } ++ ++GEN_FALSE_TRANS(tlbclr) ++GEN_FALSE_TRANS(invtlb) ++GEN_FALSE_TRANS(tlbflush) ++GEN_FALSE_TRANS(tlbsrch) ++GEN_FALSE_TRANS(tlbrd) ++GEN_FALSE_TRANS(tlbwr) ++GEN_FALSE_TRANS(tlbfill) ++GEN_FALSE_TRANS(ertn) ++ ++#else ++ ++static bool trans_tlbclr(DisasContext *ctx, arg_tlbclr *a) ++{ ++ gen_helper_tlbclr(cpu_env); ++ return true; ++} ++ ++static bool trans_tlbflush(DisasContext *ctx, arg_tlbflush *a) ++{ ++ gen_helper_tlbflush(cpu_env); ++ return true; ++} ++ ++static bool trans_invtlb(DisasContext *ctx, arg_invtlb *a) ++{ ++ TCGv addr = tcg_temp_new(); ++ TCGv info = tcg_temp_new(); ++ TCGv op = tcg_const_tl(a->invop); ++ ++ gen_load_gpr(addr, a->addr); ++ gen_load_gpr(info, a->info); ++ gen_helper_invtlb(cpu_env, addr, info, op); ++ ++ tcg_temp_free(addr); ++ tcg_temp_free(info); ++ tcg_temp_free(op); ++ return true; ++} ++ ++static bool trans_tlbsrch(DisasContext *ctx, arg_tlbsrch *a) ++{ ++ gen_helper_tlbsrch(cpu_env); ++ return true; ++} ++ ++static bool trans_tlbrd(DisasContext *ctx, arg_tlbrd *a) ++{ ++ gen_helper_tlbrd(cpu_env); ++ return true; ++} ++ ++static bool trans_tlbwr(DisasContext *ctx, arg_tlbwr *a) ++{ ++ gen_helper_tlbwr(cpu_env); ++ return true; ++} ++ ++static bool trans_tlbfill(DisasContext *ctx, arg_tlbfill *a) ++{ ++ gen_helper_tlbfill(cpu_env); ++ return true; ++} ++ ++static bool trans_ertn(DisasContext *ctx, arg_ertn *a) ++{ ++ gen_helper_ertn(cpu_env); ++ ctx->base.is_jmp = DISAS_EXIT; ++ return true; ++} ++ ++#endif /* CONFIG_USER_ONLY */ ++ ++static bool trans_idle(DisasContext *ctx, arg_idle *a) ++{ ++ ctx->base.pc_next += 4; ++ save_cpu_state(ctx, 1); ++ ctx->base.pc_next -= 4; ++ gen_helper_idle(cpu_env); ++ ctx->base.is_jmp = DISAS_NORETURN; ++ return true; ++} ++ ++#ifdef CONFIG_USER_ONLY ++ ++static bool trans_rdtime_d(DisasContext *ctx, arg_rdtime_d *a) ++{ ++ /* Nop */ ++ return true; ++} ++ ++#else ++ ++static bool trans_rdtime_d(DisasContext *ctx, arg_rdtime_d *a) ++{ ++ TCGv t0, t1; ++ t0 = tcg_const_tl(a->rd); ++ t1 = tcg_const_tl(a->rj); ++ gen_helper_drdtime(cpu_env, t0, t1); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return true; ++} ++ ++#endif ++ ++static bool trans_cpucfg(DisasContext *ctx, arg_cpucfg *a) ++{ ++ TCGv t0 = tcg_temp_new(); ++ gen_load_gpr(t0, a->rj); ++ gen_helper_cpucfg(cpu_gpr[a->rd], cpu_env, t0); ++ tcg_temp_free(t0); ++ return true; ++} +diff --git a/target/loongarch64/translate.c b/target/loongarch64/translate.c +new file mode 100644 +index 0000000000..2c65e4826a +--- /dev/null ++++ b/target/loongarch64/translate.c +@@ -0,0 +1,2705 @@ ++/* ++ * LOONGARCH emulation for QEMU - main translation routines ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "qemu/osdep.h" ++#include "cpu.h" ++#include "internal.h" ++#include "disas/disas.h" ++#include "exec/exec-all.h" ++#include "tcg/tcg-op.h" ++#include "exec/cpu_ldst.h" ++#include "hw/loongarch/cpudevs.h" ++ ++#include "exec/helper-proto.h" ++#include "exec/helper-gen.h" ++#include "semihosting/semihost.h" ++ ++#include "trace-tcg.h" ++#include "exec/translator.h" ++#include "exec/log.h" ++ ++#include "instmap.h" ++ ++#define LARCH_DEBUG_DISAS 0 ++ ++/* Values for the fmt field in FP instructions */ ++enum { ++ /* 0 - 15 are reserved */ ++ FMT_S = 16, /* single fp */ ++ FMT_D = 17, /* double fp */ ++}; ++ ++/* global register indices */ ++static TCGv cpu_gpr[32], cpu_PC; ++static TCGv btarget, bcond; ++static TCGv cpu_lladdr, cpu_llval; ++static TCGv_i32 hflags; ++static TCGv_i32 fpu_fcsr0; ++static TCGv_i64 fpu_f64[32]; ++ ++#include "exec/gen-icount.h" ++ ++#define gen_helper_0e0i(name, arg) \ ++ do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg); \ ++ gen_helper_##name(cpu_env, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while (0) ++ ++#define gen_helper_0e1i(name, arg1, arg2) \ ++ do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg2); \ ++ gen_helper_##name(cpu_env, arg1, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while (0) ++ ++#define gen_helper_1e0i(name, ret, arg1) \ ++ do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg1); \ ++ gen_helper_##name(ret, cpu_env, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while (0) ++ ++#define gen_helper_1e1i(name, ret, arg1, arg2) \ ++ do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg2); \ ++ gen_helper_##name(ret, cpu_env, arg1, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while (0) ++ ++#define gen_helper_0e2i(name, arg1, arg2, arg3) \ ++ do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg3); \ ++ gen_helper_##name(cpu_env, arg1, arg2, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while (0) ++ ++#define gen_helper_1e2i(name, ret, arg1, arg2, arg3) \ ++ do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg3); \ ++ gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while (0) ++ ++#define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) \ ++ do { \ ++ TCGv_i32 helper_tmp = tcg_const_i32(arg4); \ ++ gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp); \ ++ tcg_temp_free_i32(helper_tmp); \ ++ } while (0) ++ ++typedef struct DisasContext { ++ DisasContextBase base; ++ target_ulong saved_pc; ++ target_ulong page_start; ++ uint32_t opcode; ++ uint64_t insn_flags; ++ /* Routine used to access memory */ ++ int mem_idx; ++ MemOp default_tcg_memop_mask; ++ uint32_t hflags, saved_hflags; ++ target_ulong btarget; ++} DisasContext; ++ ++#define DISAS_STOP DISAS_TARGET_0 ++#define DISAS_EXIT DISAS_TARGET_1 ++ ++#define LOG_DISAS(...) \ ++ do { \ ++ if (LARCH_DEBUG_DISAS) { \ ++ qemu_log_mask(CPU_LOG_TB_IN_ASM, ##__VA_ARGS__); \ ++ } \ ++ } while (0) ++ ++#define LARCH_INVAL(op) \ ++ do { \ ++ if (LARCH_DEBUG_DISAS) { \ ++ qemu_log_mask(CPU_LOG_TB_IN_ASM, \ ++ TARGET_FMT_lx ": %08x Invalid %s %03x %03x %03x\n", \ ++ ctx->base.pc_next, ctx->opcode, op, \ ++ ctx->opcode >> 26, ctx->opcode & 0x3F, \ ++ ((ctx->opcode >> 16) & 0x1F)); \ ++ } \ ++ } while (0) ++ ++/* General purpose registers moves. */ ++static inline void gen_load_gpr(TCGv t, int reg) ++{ ++ if (reg == 0) { ++ tcg_gen_movi_tl(t, 0); ++ } else { ++ tcg_gen_mov_tl(t, cpu_gpr[reg]); ++ } ++} ++ ++static inline void gen_store_gpr(TCGv t, int reg) ++{ ++ if (reg != 0) { ++ tcg_gen_mov_tl(cpu_gpr[reg], t); ++ } ++} ++ ++/* Moves to/from shadow registers. */ ++/* Tests */ ++static inline void gen_save_pc(target_ulong pc) ++{ ++ tcg_gen_movi_tl(cpu_PC, pc); ++} ++ ++static inline void save_cpu_state(DisasContext *ctx, int do_save_pc) ++{ ++ LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags); ++ if (do_save_pc && ctx->base.pc_next != ctx->saved_pc) { ++ gen_save_pc(ctx->base.pc_next); ++ ctx->saved_pc = ctx->base.pc_next; ++ } ++ if (ctx->hflags != ctx->saved_hflags) { ++ tcg_gen_movi_i32(hflags, ctx->hflags); ++ ctx->saved_hflags = ctx->hflags; ++ switch (ctx->hflags & LARCH_HFLAG_BMASK) { ++ case LARCH_HFLAG_BR: ++ break; ++ case LARCH_HFLAG_BC: ++ case LARCH_HFLAG_B: ++ tcg_gen_movi_tl(btarget, ctx->btarget); ++ break; ++ } ++ } ++} ++ ++static inline void restore_cpu_state(CPULOONGARCHState *env, DisasContext *ctx) ++{ ++ ctx->saved_hflags = ctx->hflags; ++ switch (ctx->hflags & LARCH_HFLAG_BMASK) { ++ case LARCH_HFLAG_BR: ++ break; ++ case LARCH_HFLAG_BC: ++ case LARCH_HFLAG_B: ++ ctx->btarget = env->btarget; ++ break; ++ } ++} ++ ++static inline void generate_exception_err(DisasContext *ctx, int excp, int err) ++{ ++ TCGv_i32 texcp = tcg_const_i32(excp); ++ TCGv_i32 terr = tcg_const_i32(err); ++ save_cpu_state(ctx, 1); ++ gen_helper_raise_exception_err(cpu_env, texcp, terr); ++ tcg_temp_free_i32(terr); ++ tcg_temp_free_i32(texcp); ++ ctx->base.is_jmp = DISAS_NORETURN; ++} ++ ++static inline void generate_exception_end(DisasContext *ctx, int excp) ++{ ++ generate_exception_err(ctx, excp, 0); ++} ++ ++/* Floating point register moves. */ ++static void gen_load_fpr32(DisasContext *ctx, TCGv_i32 t, int reg) ++{ ++ tcg_gen_extrl_i64_i32(t, fpu_f64[reg]); ++} ++ ++static void gen_store_fpr32(DisasContext *ctx, TCGv_i32 t, int reg) ++{ ++ TCGv_i64 t64; ++ t64 = tcg_temp_new_i64(); ++ tcg_gen_extu_i32_i64(t64, t); ++ tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32); ++ tcg_temp_free_i64(t64); ++} ++ ++static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg) ++{ ++ tcg_gen_extrh_i64_i32(t, fpu_f64[reg]); ++} ++ ++static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg) ++{ ++ TCGv_i64 t64 = tcg_temp_new_i64(); ++ tcg_gen_extu_i32_i64(t64, t); ++ tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32); ++ tcg_temp_free_i64(t64); ++} ++ ++static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg) ++{ ++ tcg_gen_mov_i64(t, fpu_f64[reg]); ++} ++ ++static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg) ++{ ++ tcg_gen_mov_i64(fpu_f64[reg], t); ++} ++ ++static inline int get_fp_bit(int cc) ++{ ++ if (cc) { ++ return 24 + cc; ++ } else { ++ return 23; ++ } ++} ++ ++/* Addresses computation */ ++static inline void gen_op_addr_add(DisasContext *ctx, TCGv ret, TCGv arg0, ++ TCGv arg1) ++{ ++ tcg_gen_add_tl(ret, arg0, arg1); ++ ++ if (ctx->hflags & LARCH_HFLAG_AWRAP) { ++ tcg_gen_ext32s_i64(ret, ret); ++ } ++} ++ ++static inline void gen_op_addr_addi(DisasContext *ctx, TCGv ret, TCGv base, ++ target_long ofs) ++{ ++ tcg_gen_addi_tl(ret, base, ofs); ++ ++ if (ctx->hflags & LARCH_HFLAG_AWRAP) { ++ tcg_gen_ext32s_i64(ret, ret); ++ } ++} ++ ++/* Sign-extract the low 32-bits to a target_long. */ ++static inline void gen_move_low32(TCGv ret, TCGv_i64 arg) ++{ ++ tcg_gen_ext32s_i64(ret, arg); ++} ++ ++/* Sign-extract the high 32-bits to a target_long. */ ++static inline void gen_move_high32(TCGv ret, TCGv_i64 arg) ++{ ++ tcg_gen_sari_i64(ret, arg, 32); ++} ++ ++static inline void check_cp1_enabled(DisasContext *ctx) ++{ ++#ifndef CONFIG_USER_ONLY ++ if (unlikely(!(ctx->hflags & LARCH_HFLAG_FPU))) { ++ generate_exception_err(ctx, EXCP_FPDIS, 1); ++ } ++#endif ++} ++ ++static inline void check_lsx_enabled(DisasContext *ctx) ++{ ++#ifndef CONFIG_USER_ONLY ++ if (unlikely(!(ctx->hflags & LARCH_HFLAG_LSX))) { ++ generate_exception_err(ctx, EXCP_LSXDIS, 1); ++ } ++#endif ++} ++ ++static inline void check_lasx_enabled(DisasContext *ctx) ++{ ++#ifndef CONFIG_USER_ONLY ++ if (unlikely(!(ctx->hflags & LARCH_HFLAG_LASX))) { ++ generate_exception_err(ctx, EXCP_LASXDIS, 1); ++ } ++#endif ++} ++ ++static inline void check_lbt_enabled(DisasContext *ctx) ++{ ++#ifndef CONFIG_USER_ONLY ++ if (unlikely(!(ctx->hflags & LARCH_HFLAG_LBT))) { ++ generate_exception_err(ctx, EXCP_BTDIS, 1); ++ } ++#endif ++} ++ ++/* ++ * This code generates a "reserved instruction" exception if the ++ * CPU does not support the instruction set corresponding to flags. ++ */ ++static inline void check_insn(DisasContext *ctx, uint64_t flags) ++{ ++ if (unlikely(!(ctx->insn_flags & flags))) { ++ generate_exception_end(ctx, EXCP_RI); ++ } ++} ++ ++/* ++ * This code generates a "reserved instruction" exception if the ++ * CPU has corresponding flag set which indicates that the instruction ++ * has been removed. ++ */ ++static inline void check_insn_opc_removed(DisasContext *ctx, uint64_t flags) ++{ ++ if (unlikely(ctx->insn_flags & flags)) { ++ generate_exception_end(ctx, EXCP_RI); ++ } ++} ++ ++/* ++ * The Linux kernel traps certain reserved instruction exceptions to ++ * emulate the corresponding instructions. QEMU is the kernel in user ++ * mode, so those traps are emulated by accepting the instructions. ++ * ++ * A reserved instruction exception is generated for flagged CPUs if ++ * QEMU runs in system mode. ++ */ ++static inline void check_insn_opc_user_only(DisasContext *ctx, uint64_t flags) ++{ ++#ifndef CONFIG_USER_ONLY ++ check_insn_opc_removed(ctx, flags); ++#endif ++} ++ ++/* ++ * This code generates a "reserved instruction" exception if 64-bit ++ * instructions are not enabled. ++ */ ++static inline void check_larch_64(DisasContext *ctx) ++{ ++ if (unlikely(!(ctx->hflags & LARCH_HFLAG_64))) { ++ generate_exception_end(ctx, EXCP_RI); ++ } ++} ++ ++/* ++ * Define small wrappers for gen_load_fpr* so that we have a uniform ++ * calling interface for 32 and 64-bit FPRs. No sense in changing ++ * all callers for gen_load_fpr32 when we need the CTX parameter for ++ * this one use. ++ */ ++#define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y) ++#define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y) ++#define FCOP_CONDNS(fmt, ifmt, bits, STORE) \ ++ static inline void gen_fcmp_##fmt(DisasContext *ctx, int n, int ft, \ ++ int fs, int cd) \ ++ { \ ++ TCGv_i##bits fp0 = tcg_temp_new_i##bits(); \ ++ TCGv_i##bits fp1 = tcg_temp_new_i##bits(); \ ++ TCGv_i32 fcc = tcg_const_i32(cd); \ ++ check_cp1_enabled(ctx); \ ++ gen_ldcmp_fpr##bits(ctx, fp0, fs); \ ++ gen_ldcmp_fpr##bits(ctx, fp1, ft); \ ++ switch (n) { \ ++ case 0: \ ++ gen_helper_cmp_##fmt##_af(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 1: \ ++ gen_helper_cmp_##fmt##_saf(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 2: \ ++ gen_helper_cmp_##fmt##_lt(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 3: \ ++ gen_helper_cmp_##fmt##_slt(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 4: \ ++ gen_helper_cmp_##fmt##_eq(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 5: \ ++ gen_helper_cmp_##fmt##_seq(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 6: \ ++ gen_helper_cmp_##fmt##_le(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 7: \ ++ gen_helper_cmp_##fmt##_sle(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 8: \ ++ gen_helper_cmp_##fmt##_un(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 9: \ ++ gen_helper_cmp_##fmt##_sun(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 10: \ ++ gen_helper_cmp_##fmt##_ult(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 11: \ ++ gen_helper_cmp_##fmt##_sult(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 12: \ ++ gen_helper_cmp_##fmt##_ueq(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 13: \ ++ gen_helper_cmp_##fmt##_sueq(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 14: \ ++ gen_helper_cmp_##fmt##_ule(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 15: \ ++ gen_helper_cmp_##fmt##_sule(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 16: \ ++ gen_helper_cmp_##fmt##_ne(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 17: \ ++ gen_helper_cmp_##fmt##_sne(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 20: \ ++ gen_helper_cmp_##fmt##_or(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 21: \ ++ gen_helper_cmp_##fmt##_sor(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 24: \ ++ gen_helper_cmp_##fmt##_une(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ case 25: \ ++ gen_helper_cmp_##fmt##_sune(fp0, cpu_env, fp0, fp1); \ ++ break; \ ++ default: \ ++ abort(); \ ++ } \ ++ STORE; \ ++ tcg_temp_free_i##bits(fp0); \ ++ tcg_temp_free_i##bits(fp1); \ ++ tcg_temp_free_i32(fcc); \ ++ } ++ ++FCOP_CONDNS(d, FMT_D, 64, gen_helper_movreg2cf_i64(cpu_env, fcc, fp0)) ++FCOP_CONDNS(s, FMT_S, 32, gen_helper_movreg2cf_i32(cpu_env, fcc, fp0)) ++#undef FCOP_CONDNS ++#undef gen_ldcmp_fpr32 ++#undef gen_ldcmp_fpr64 ++ ++/* load/store instructions. */ ++#ifdef CONFIG_USER_ONLY ++#define OP_LD_ATOMIC(insn, fname) \ ++ static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx, \ ++ DisasContext *ctx) \ ++ { \ ++ TCGv t0 = tcg_temp_new(); \ ++ tcg_gen_mov_tl(t0, arg1); \ ++ tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx); \ ++ tcg_gen_st_tl(t0, cpu_env, offsetof(CPULOONGARCHState, lladdr)); \ ++ tcg_gen_st_tl(ret, cpu_env, offsetof(CPULOONGARCHState, llval)); \ ++ tcg_temp_free(t0); \ ++ } ++#else ++#define OP_LD_ATOMIC(insn, fname) \ ++ static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx, \ ++ DisasContext *ctx) \ ++ { \ ++ gen_helper_1e1i(insn, ret, arg1, mem_idx); \ ++ } ++#endif ++ ++static void gen_base_offset_addr(DisasContext *ctx, TCGv addr, int base, ++ int offset) ++{ ++ if (base == 0) { ++ tcg_gen_movi_tl(addr, offset); ++ } else if (offset == 0) { ++ gen_load_gpr(addr, base); ++ } else { ++ tcg_gen_movi_tl(addr, offset); ++ gen_op_addr_add(ctx, addr, cpu_gpr[base], addr); ++ } ++} ++ ++/* Load */ ++static void gen_ld(DisasContext *ctx, uint32_t opc, int rt, int base, ++ int offset) ++{ ++ TCGv t0; ++ int mem_idx = ctx->mem_idx; ++ ++ t0 = tcg_temp_new(); ++ gen_base_offset_addr(ctx, t0, base, offset); ++ ++ switch (opc) { ++ case OPC_LARCH_LD_WU: ++ tcg_gen_qemu_ld_tl(t0, t0, mem_idx, ++ MO_TEUL | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_LDPTR_D: ++ case OPC_LARCH_LD_D: ++ tcg_gen_qemu_ld_tl(t0, t0, mem_idx, ++ MO_TEQ | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_LL_D: ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_LDPTR_W: ++ case OPC_LARCH_LD_W: ++ tcg_gen_qemu_ld_tl(t0, t0, mem_idx, ++ MO_TESL | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_LD_H: ++ tcg_gen_qemu_ld_tl(t0, t0, mem_idx, ++ MO_TESW | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_LD_HU: ++ tcg_gen_qemu_ld_tl(t0, t0, mem_idx, ++ MO_TEUW | ctx->default_tcg_memop_mask); ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_LD_B: ++ tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_SB); ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_LD_BU: ++ tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_UB); ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_LL_W: ++ gen_store_gpr(t0, rt); ++ break; ++ } ++ ++ tcg_temp_free(t0); ++} ++ ++/* Store */ ++static void gen_st(DisasContext *ctx, uint32_t opc, int rt, int base, ++ int offset) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ int mem_idx = ctx->mem_idx; ++ ++ gen_base_offset_addr(ctx, t0, base, offset); ++ gen_load_gpr(t1, rt); ++ ++ switch (opc) { ++ case OPC_LARCH_STPTR_D: ++ case OPC_LARCH_ST_D: ++ tcg_gen_qemu_st_tl(t1, t0, mem_idx, ++ MO_TEQ | ctx->default_tcg_memop_mask); ++ break; ++ case OPC_LARCH_STPTR_W: ++ case OPC_LARCH_ST_W: ++ tcg_gen_qemu_st_tl(t1, t0, mem_idx, ++ MO_TEUL | ctx->default_tcg_memop_mask); ++ break; ++ case OPC_LARCH_ST_H: ++ tcg_gen_qemu_st_tl(t1, t0, mem_idx, ++ MO_TEUW | ctx->default_tcg_memop_mask); ++ break; ++ case OPC_LARCH_ST_B: ++ tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_8); ++ break; ++ } ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++} ++ ++/* Store conditional */ ++static void gen_st_cond(DisasContext *ctx, int rt, int base, int offset, ++ MemOp tcg_mo, bool eva) ++{ ++ TCGv addr, t0, val; ++ TCGLabel *l1 = gen_new_label(); ++ TCGLabel *done = gen_new_label(); ++ ++ t0 = tcg_temp_new(); ++ addr = tcg_temp_new(); ++ /* compare the address against that of the preceeding LL */ ++ gen_base_offset_addr(ctx, addr, base, offset); ++ tcg_gen_brcond_tl(TCG_COND_EQ, addr, cpu_lladdr, l1); ++ tcg_temp_free(addr); ++ tcg_gen_movi_tl(t0, 0); ++ gen_store_gpr(t0, rt); ++ tcg_gen_br(done); ++ ++ gen_set_label(l1); ++ /* generate cmpxchg */ ++ val = tcg_temp_new(); ++ gen_load_gpr(val, rt); ++ tcg_gen_atomic_cmpxchg_tl(t0, cpu_lladdr, cpu_llval, val, ++ eva ? LARCH_HFLAG_UM : ctx->mem_idx, tcg_mo); ++ tcg_gen_setcond_tl(TCG_COND_EQ, t0, t0, cpu_llval); ++ gen_store_gpr(t0, rt); ++ tcg_temp_free(val); ++ ++ gen_set_label(done); ++ tcg_temp_free(t0); ++} ++ ++/* Load and store */ ++static void gen_flt_ldst(DisasContext *ctx, uint32_t opc, int ft, TCGv t0) ++{ ++ /* ++ * Don't do NOP if destination is zero: we must perform the actual ++ * memory access. ++ */ ++ switch (opc) { ++ case OPC_LARCH_FLD_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, ++ MO_TESL | ctx->default_tcg_memop_mask); ++ gen_store_fpr32(ctx, fp0, ft); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FST_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ gen_load_fpr32(ctx, fp0, ft); ++ tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, ++ MO_TEUL | ctx->default_tcg_memop_mask); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FLD_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, ++ MO_TEQ | ctx->default_tcg_memop_mask); ++ gen_store_fpr64(ctx, fp0, ft); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FST_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ gen_load_fpr64(ctx, fp0, ft); ++ tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, ++ MO_TEQ | ctx->default_tcg_memop_mask); ++ tcg_temp_free_i64(fp0); ++ } break; ++ default: ++ LARCH_INVAL("flt_ldst"); ++ generate_exception_end(ctx, EXCP_RI); ++ break; ++ } ++} ++ ++static void gen_fp_ldst(DisasContext *ctx, uint32_t op, int rt, int rs, ++ int16_t imm) ++{ ++ TCGv t0 = tcg_temp_new(); ++ ++ check_cp1_enabled(ctx); ++ gen_base_offset_addr(ctx, t0, rs, imm); ++ gen_flt_ldst(ctx, op, rt, t0); ++ tcg_temp_free(t0); ++} ++ ++/* Arithmetic with immediate operand */ ++static void gen_arith_imm(DisasContext *ctx, uint32_t opc, int rt, int rs, ++ int imm) ++{ ++ target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */ ++ ++ if (rt == 0) { ++ /* ++ * If no destination, treat it as a NOP. ++ * For addi, we must generate the overflow exception when needed. ++ */ ++ return; ++ } ++ switch (opc) { ++ case OPC_LARCH_ADDI_W: ++ if (rs != 0) { ++ tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm); ++ tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rt], uimm); ++ } ++ break; ++ case OPC_LARCH_ADDI_D: ++ if (rs != 0) { ++ tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rt], uimm); ++ } ++ break; ++ } ++} ++ ++/* Logic with immediate operand */ ++static void gen_logic_imm(DisasContext *ctx, uint32_t opc, int rt, int rs, ++ int16_t imm) ++{ ++ target_ulong uimm; ++ ++ if (rt == 0) { ++ /* If no destination, treat it as a NOP. */ ++ return; ++ } ++ uimm = (uint16_t)imm; ++ switch (opc) { ++ case OPC_LARCH_ANDI: ++ if (likely(rs != 0)) { ++ tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rt], 0); ++ } ++ break; ++ case OPC_LARCH_ORI: ++ if (rs != 0) { ++ tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rt], uimm); ++ } ++ break; ++ case OPC_LARCH_XORI: ++ if (likely(rs != 0)) { ++ tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rt], uimm); ++ } ++ break; ++ default: ++ break; ++ } ++} ++ ++/* Set on less than with immediate operand */ ++static void gen_slt_imm(DisasContext *ctx, uint32_t opc, int rt, int rs, ++ int16_t imm) ++{ ++ target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */ ++ TCGv t0; ++ ++ if (rt == 0) { ++ /* If no destination, treat it as a NOP. */ ++ return; ++ } ++ t0 = tcg_temp_new(); ++ gen_load_gpr(t0, rs); ++ switch (opc) { ++ case OPC_LARCH_SLTI: ++ tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm); ++ break; ++ case OPC_LARCH_SLTIU: ++ tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm); ++ break; ++ } ++ tcg_temp_free(t0); ++} ++ ++/* Shifts with immediate operand */ ++static void gen_shift_imm(DisasContext *ctx, uint32_t opc, int rt, int rs, ++ int16_t imm) ++{ ++ target_ulong uimm = ((uint16_t)imm) & 0x1f; ++ TCGv t0; ++ ++ if (rt == 0) { ++ /* If no destination, treat it as a NOP. */ ++ return; ++ } ++ ++ t0 = tcg_temp_new(); ++ gen_load_gpr(t0, rs); ++ switch (opc) { ++ case OPC_LARCH_SRAI_W: ++ tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm); ++ break; ++ case OPC_LARCH_SRLI_W: ++ if (uimm != 0) { ++ tcg_gen_ext32u_tl(t0, t0); ++ tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm); ++ } else { ++ tcg_gen_ext32s_tl(cpu_gpr[rt], t0); ++ } ++ break; ++ case OPC_LARCH_ROTRI_W: ++ if (uimm != 0) { ++ TCGv_i32 t1 = tcg_temp_new_i32(); ++ ++ tcg_gen_trunc_tl_i32(t1, t0); ++ tcg_gen_rotri_i32(t1, t1, uimm); ++ tcg_gen_ext_i32_tl(cpu_gpr[rt], t1); ++ tcg_temp_free_i32(t1); ++ } else { ++ tcg_gen_ext32s_tl(cpu_gpr[rt], t0); ++ } ++ break; ++ } ++ tcg_temp_free(t0); ++} ++ ++/* Arithmetic */ ++static void gen_arith(DisasContext *ctx, uint32_t opc, int rd, int rs, int rt) ++{ ++ if (rd == 0) { ++ /* ++ * If no destination, treat it as a NOP. ++ * For add & sub, we must generate the ++ * overflow exception when needed. ++ */ ++ return; ++ } ++ ++ switch (opc) { ++ case OPC_LARCH_ADD_W: ++ if (rs != 0 && rt != 0) { ++ tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]); ++ } else if (rs == 0 && rt != 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]); ++ } else if (rs != 0 && rt == 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rd], 0); ++ } ++ break; ++ case OPC_LARCH_SUB_W: ++ if (rs != 0 && rt != 0) { ++ tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]); ++ } else if (rs == 0 && rt != 0) { ++ tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]); ++ } else if (rs != 0 && rt == 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rd], 0); ++ } ++ break; ++ case OPC_LARCH_ADD_D: ++ if (rs != 0 && rt != 0) { ++ tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]); ++ } else if (rs == 0 && rt != 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]); ++ } else if (rs != 0 && rt == 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rd], 0); ++ } ++ break; ++ case OPC_LARCH_SUB_D: ++ if (rs != 0 && rt != 0) { ++ tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]); ++ } else if (rs == 0 && rt != 0) { ++ tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]); ++ } else if (rs != 0 && rt == 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rd], 0); ++ } ++ break; ++ } ++} ++ ++/* Conditional move */ ++static void gen_cond_move(DisasContext *ctx, uint32_t opc, int rd, int rs, ++ int rt) ++{ ++ TCGv t0, t1, t2; ++ ++ if (rd == 0) { ++ /* If no destination, treat it as a NOP. */ ++ return; ++ } ++ ++ t0 = tcg_temp_new(); ++ gen_load_gpr(t0, rt); ++ t1 = tcg_const_tl(0); ++ t2 = tcg_temp_new(); ++ gen_load_gpr(t2, rs); ++ switch (opc) { ++ case OPC_LARCH_MASKEQZ: ++ tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, t1); ++ break; ++ case OPC_LARCH_MASKNEZ: ++ tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, t1); ++ break; ++ } ++ tcg_temp_free(t2); ++ tcg_temp_free(t1); ++ tcg_temp_free(t0); ++} ++ ++/* Logic */ ++static void gen_logic(DisasContext *ctx, uint32_t opc, int rd, int rs, int rt) ++{ ++ if (rd == 0) { ++ /* If no destination, treat it as a NOP. */ ++ return; ++ } ++ ++ switch (opc) { ++ case OPC_LARCH_AND: ++ if (likely(rs != 0 && rt != 0)) { ++ tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rd], 0); ++ } ++ break; ++ case OPC_LARCH_NOR: ++ if (rs != 0 && rt != 0) { ++ tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]); ++ } else if (rs == 0 && rt != 0) { ++ tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]); ++ } else if (rs != 0 && rt == 0) { ++ tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0)); ++ } ++ break; ++ case OPC_LARCH_OR: ++ if (likely(rs != 0 && rt != 0)) { ++ tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]); ++ } else if (rs == 0 && rt != 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]); ++ } else if (rs != 0 && rt == 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rd], 0); ++ } ++ break; ++ case OPC_LARCH_XOR: ++ if (likely(rs != 0 && rt != 0)) { ++ tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]); ++ } else if (rs == 0 && rt != 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]); ++ } else if (rs != 0 && rt == 0) { ++ tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]); ++ } else { ++ tcg_gen_movi_tl(cpu_gpr[rd], 0); ++ } ++ break; ++ } ++} ++ ++/* Set on lower than */ ++static void gen_slt(DisasContext *ctx, uint32_t opc, int rd, int rs, int rt) ++{ ++ TCGv t0, t1; ++ ++ if (rd == 0) { ++ /* If no destination, treat it as a NOP. */ ++ return; ++ } ++ ++ t0 = tcg_temp_new(); ++ t1 = tcg_temp_new(); ++ gen_load_gpr(t0, rs); ++ gen_load_gpr(t1, rt); ++ switch (opc) { ++ case OPC_LARCH_SLT: ++ tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1); ++ break; ++ case OPC_LARCH_SLTU: ++ tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1); ++ break; ++ } ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++} ++ ++/* Shifts */ ++static void gen_shift(DisasContext *ctx, uint32_t opc, int rd, int rs, int rt) ++{ ++ TCGv t0, t1; ++ ++ if (rd == 0) { ++ /* ++ * If no destination, treat it as a NOP. ++ * For add & sub, we must generate the ++ * overflow exception when needed. ++ */ ++ return; ++ } ++ ++ t0 = tcg_temp_new(); ++ t1 = tcg_temp_new(); ++ gen_load_gpr(t0, rs); ++ gen_load_gpr(t1, rt); ++ switch (opc) { ++ case OPC_LARCH_SLL_W: ++ tcg_gen_andi_tl(t0, t0, 0x1f); ++ tcg_gen_shl_tl(t0, t1, t0); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], t0); ++ break; ++ case OPC_LARCH_SRA_W: ++ tcg_gen_andi_tl(t0, t0, 0x1f); ++ tcg_gen_sar_tl(cpu_gpr[rd], t1, t0); ++ break; ++ case OPC_LARCH_SRL_W: ++ tcg_gen_ext32u_tl(t1, t1); ++ tcg_gen_andi_tl(t0, t0, 0x1f); ++ tcg_gen_shr_tl(t0, t1, t0); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], t0); ++ break; ++ case OPC_LARCH_ROTR_W: { ++ TCGv_i32 t2 = tcg_temp_new_i32(); ++ TCGv_i32 t3 = tcg_temp_new_i32(); ++ ++ tcg_gen_trunc_tl_i32(t2, t0); ++ tcg_gen_trunc_tl_i32(t3, t1); ++ tcg_gen_andi_i32(t2, t2, 0x1f); ++ tcg_gen_rotr_i32(t2, t3, t2); ++ tcg_gen_ext_i32_tl(cpu_gpr[rd], t2); ++ tcg_temp_free_i32(t2); ++ tcg_temp_free_i32(t3); ++ } break; ++ case OPC_LARCH_SLL_D: ++ tcg_gen_andi_tl(t0, t0, 0x3f); ++ tcg_gen_shl_tl(cpu_gpr[rd], t1, t0); ++ break; ++ case OPC_LARCH_SRA_D: ++ tcg_gen_andi_tl(t0, t0, 0x3f); ++ tcg_gen_sar_tl(cpu_gpr[rd], t1, t0); ++ break; ++ case OPC_LARCH_SRL_D: ++ tcg_gen_andi_tl(t0, t0, 0x3f); ++ tcg_gen_shr_tl(cpu_gpr[rd], t1, t0); ++ break; ++ case OPC_LARCH_ROTR_D: ++ tcg_gen_andi_tl(t0, t0, 0x3f); ++ tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0); ++ break; ++ } ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++} ++ ++static inline void gen_r6_ld(target_long addr, int reg, int memidx, ++ MemOp memop) ++{ ++ TCGv t0 = tcg_const_tl(addr); ++ tcg_gen_qemu_ld_tl(t0, t0, memidx, memop); ++ gen_store_gpr(t0, reg); ++ tcg_temp_free(t0); ++} ++ ++static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt) ++{ ++ TCGv t0, t1; ++ ++ if (rd == 0) { ++ /* Treat as NOP. */ ++ return; ++ } ++ ++ t0 = tcg_temp_new(); ++ t1 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, rs); ++ gen_load_gpr(t1, rt); ++ ++ switch (opc) { ++ case OPC_LARCH_DIV_W: { ++ TCGv t2 = tcg_temp_new(); ++ TCGv t3 = tcg_temp_new(); ++ tcg_gen_ext32s_tl(t0, t0); ++ tcg_gen_ext32s_tl(t1, t1); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1); ++ tcg_gen_and_tl(t2, t2, t3); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0); ++ tcg_gen_or_tl(t2, t2, t3); ++ tcg_gen_movi_tl(t3, 0); ++ tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1); ++ tcg_gen_div_tl(cpu_gpr[rd], t0, t1); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]); ++ tcg_temp_free(t3); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_MOD_W: { ++ TCGv t2 = tcg_temp_new(); ++ TCGv t3 = tcg_temp_new(); ++ tcg_gen_ext32s_tl(t0, t0); ++ tcg_gen_ext32s_tl(t1, t1); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1); ++ tcg_gen_and_tl(t2, t2, t3); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0); ++ tcg_gen_or_tl(t2, t2, t3); ++ tcg_gen_movi_tl(t3, 0); ++ tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1); ++ tcg_gen_rem_tl(cpu_gpr[rd], t0, t1); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]); ++ tcg_temp_free(t3); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_DIV_WU: { ++ TCGv t2 = tcg_const_tl(0); ++ TCGv t3 = tcg_const_tl(1); ++ tcg_gen_ext32u_tl(t0, t0); ++ tcg_gen_ext32u_tl(t1, t1); ++ tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1); ++ tcg_gen_divu_tl(cpu_gpr[rd], t0, t1); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]); ++ tcg_temp_free(t3); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_MOD_WU: { ++ TCGv t2 = tcg_const_tl(0); ++ TCGv t3 = tcg_const_tl(1); ++ tcg_gen_ext32u_tl(t0, t0); ++ tcg_gen_ext32u_tl(t1, t1); ++ tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1); ++ tcg_gen_remu_tl(cpu_gpr[rd], t0, t1); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]); ++ tcg_temp_free(t3); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_MUL_W: { ++ TCGv_i32 t2 = tcg_temp_new_i32(); ++ TCGv_i32 t3 = tcg_temp_new_i32(); ++ tcg_gen_trunc_tl_i32(t2, t0); ++ tcg_gen_trunc_tl_i32(t3, t1); ++ tcg_gen_mul_i32(t2, t2, t3); ++ tcg_gen_ext_i32_tl(cpu_gpr[rd], t2); ++ tcg_temp_free_i32(t2); ++ tcg_temp_free_i32(t3); ++ } break; ++ case OPC_LARCH_MULH_W: { ++ TCGv_i32 t2 = tcg_temp_new_i32(); ++ TCGv_i32 t3 = tcg_temp_new_i32(); ++ tcg_gen_trunc_tl_i32(t2, t0); ++ tcg_gen_trunc_tl_i32(t3, t1); ++ tcg_gen_muls2_i32(t2, t3, t2, t3); ++ tcg_gen_ext_i32_tl(cpu_gpr[rd], t3); ++ tcg_temp_free_i32(t2); ++ tcg_temp_free_i32(t3); ++ } break; ++ case OPC_LARCH_MULH_WU: { ++ TCGv_i32 t2 = tcg_temp_new_i32(); ++ TCGv_i32 t3 = tcg_temp_new_i32(); ++ tcg_gen_trunc_tl_i32(t2, t0); ++ tcg_gen_trunc_tl_i32(t3, t1); ++ tcg_gen_mulu2_i32(t2, t3, t2, t3); ++ tcg_gen_ext_i32_tl(cpu_gpr[rd], t3); ++ tcg_temp_free_i32(t2); ++ tcg_temp_free_i32(t3); ++ } break; ++ case OPC_LARCH_DIV_D: { ++ TCGv t2 = tcg_temp_new(); ++ TCGv t3 = tcg_temp_new(); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL); ++ tcg_gen_and_tl(t2, t2, t3); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0); ++ tcg_gen_or_tl(t2, t2, t3); ++ tcg_gen_movi_tl(t3, 0); ++ tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1); ++ tcg_gen_div_tl(cpu_gpr[rd], t0, t1); ++ tcg_temp_free(t3); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_MOD_D: { ++ TCGv t2 = tcg_temp_new(); ++ TCGv t3 = tcg_temp_new(); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL); ++ tcg_gen_and_tl(t2, t2, t3); ++ tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0); ++ tcg_gen_or_tl(t2, t2, t3); ++ tcg_gen_movi_tl(t3, 0); ++ tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1); ++ tcg_gen_rem_tl(cpu_gpr[rd], t0, t1); ++ tcg_temp_free(t3); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_DIV_DU: { ++ TCGv t2 = tcg_const_tl(0); ++ TCGv t3 = tcg_const_tl(1); ++ tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1); ++ tcg_gen_divu_i64(cpu_gpr[rd], t0, t1); ++ tcg_temp_free(t3); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_MOD_DU: { ++ TCGv t2 = tcg_const_tl(0); ++ TCGv t3 = tcg_const_tl(1); ++ tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1); ++ tcg_gen_remu_i64(cpu_gpr[rd], t0, t1); ++ tcg_temp_free(t3); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_MUL_D: ++ tcg_gen_mul_i64(cpu_gpr[rd], t0, t1); ++ break; ++ case OPC_LARCH_MULH_D: { ++ TCGv t2 = tcg_temp_new(); ++ tcg_gen_muls2_i64(t2, cpu_gpr[rd], t0, t1); ++ tcg_temp_free(t2); ++ } break; ++ case OPC_LARCH_MULH_DU: { ++ TCGv t2 = tcg_temp_new(); ++ tcg_gen_mulu2_i64(t2, cpu_gpr[rd], t0, t1); ++ tcg_temp_free(t2); ++ } break; ++ default: ++ LARCH_INVAL("r6 mul/div"); ++ generate_exception_end(ctx, EXCP_RI); ++ goto out; ++ } ++out: ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++} ++ ++static void gen_cl(DisasContext *ctx, uint32_t opc, int rd, int rs) ++{ ++ TCGv t0; ++ ++ if (rd == 0) { ++ /* Treat as NOP. */ ++ return; ++ } ++ t0 = cpu_gpr[rd]; ++ gen_load_gpr(t0, rs); ++ ++ switch (opc) { ++ case OPC_LARCH_CLO_W: ++ case OPC_LARCH_CLO_D: ++ tcg_gen_not_tl(t0, t0); ++ break; ++ } ++ ++ switch (opc) { ++ case OPC_LARCH_CLO_W: ++ case OPC_LARCH_CLZ_W: ++ tcg_gen_ext32u_tl(t0, t0); ++ tcg_gen_clzi_tl(t0, t0, TARGET_LONG_BITS); ++ tcg_gen_subi_tl(t0, t0, TARGET_LONG_BITS - 32); ++ break; ++ case OPC_LARCH_CLO_D: ++ case OPC_LARCH_CLZ_D: ++ tcg_gen_clzi_i64(t0, t0, 64); ++ break; ++ } ++} ++ ++static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest) ++{ ++ if (unlikely(ctx->base.singlestep_enabled)) { ++ return false; ++ } ++ ++#ifndef CONFIG_USER_ONLY ++ return (ctx->base.tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK); ++#else ++ return true; ++#endif ++} ++ ++static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest) ++{ ++ if (use_goto_tb(ctx, dest)) { ++ tcg_gen_goto_tb(n); ++ gen_save_pc(dest); ++ tcg_gen_exit_tb(ctx->base.tb, n); ++ } else { ++ gen_save_pc(dest); ++ if (ctx->base.singlestep_enabled) { ++ save_cpu_state(ctx, 0); ++ gen_helper_raise_exception_debug(cpu_env); ++ } ++ tcg_gen_lookup_and_goto_ptr(); ++ } ++} ++ ++/* Branches */ ++static void gen_compute_branch(DisasContext *ctx, uint32_t opc, int insn_bytes, ++ int rs, int rt, int32_t offset) ++{ ++ target_ulong btgt = -1; ++ int bcond_compute = 0; ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ ++ if (ctx->hflags & LARCH_HFLAG_BMASK) { ++#ifdef LARCH_DEBUG_DISAS ++ LOG_DISAS("Branch at PC 0x" TARGET_FMT_lx "\n", ctx->base.pc_next); ++#endif ++ generate_exception_end(ctx, EXCP_RI); ++ goto out; ++ } ++ ++ /* Load needed operands */ ++ switch (opc) { ++ case OPC_LARCH_BLT: ++ case OPC_LARCH_BGE: ++ case OPC_LARCH_BLTU: ++ case OPC_LARCH_BGEU: ++ gen_load_gpr(t0, rs); ++ gen_load_gpr(t1, rt); ++ bcond_compute = 1; ++ btgt = ctx->base.pc_next + offset; ++ break; ++ case OPC_LARCH_BEQZ: ++ case OPC_LARCH_B: ++ case OPC_LARCH_BEQ: ++ case OPC_LARCH_BNEZ: ++ case OPC_LARCH_BNE: ++ /* Compare two registers */ ++ if (rs != rt) { ++ gen_load_gpr(t0, rs); ++ gen_load_gpr(t1, rt); ++ bcond_compute = 1; ++ } ++ btgt = ctx->base.pc_next + offset; ++ break; ++ default: ++ LARCH_INVAL("branch/jump"); ++ generate_exception_end(ctx, EXCP_RI); ++ goto out; ++ } ++ if (bcond_compute == 0) { ++ /* No condition to be computed */ ++ switch (opc) { ++ case OPC_LARCH_BEQZ: /* rx == rx */ ++ case OPC_LARCH_B: ++ case OPC_LARCH_BEQ: ++ /* Always take */ ++ ctx->hflags |= LARCH_HFLAG_B; ++ break; ++ case OPC_LARCH_BNEZ: ++ case OPC_LARCH_BNE: ++ /* Treat as NOP. */ ++ goto out; ++ default: ++ LARCH_INVAL("branch/jump"); ++ generate_exception_end(ctx, EXCP_RI); ++ goto out; ++ } ++ } else { ++ switch (opc) { ++ case OPC_LARCH_BLT: ++ tcg_gen_setcond_tl(TCG_COND_LT, bcond, t0, t1); ++ goto not_likely; ++ case OPC_LARCH_BGE: ++ tcg_gen_setcond_tl(TCG_COND_GE, bcond, t0, t1); ++ goto not_likely; ++ case OPC_LARCH_BLTU: ++ tcg_gen_setcond_tl(TCG_COND_LTU, bcond, t0, t1); ++ goto not_likely; ++ case OPC_LARCH_BGEU: ++ tcg_gen_setcond_tl(TCG_COND_GEU, bcond, t0, t1); ++ goto not_likely; ++ case OPC_LARCH_BEQZ: ++ case OPC_LARCH_B: ++ case OPC_LARCH_BEQ: ++ tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1); ++ goto not_likely; ++ case OPC_LARCH_BNEZ: ++ case OPC_LARCH_BNE: ++ tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1); ++ goto not_likely; ++ not_likely: ++ ctx->hflags |= LARCH_HFLAG_BC; ++ break; ++ default: ++ LARCH_INVAL("conditional branch/jump"); ++ generate_exception_end(ctx, EXCP_RI); ++ goto out; ++ } ++ } ++ ++ ctx->btarget = btgt; ++ ++out: ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++} ++ ++/* special3 bitfield operations */ ++static void gen_bitops(DisasContext *ctx, uint32_t opc, int rt, int rs, ++ int lsb, int msb) ++{ ++ TCGv t0 = tcg_temp_new(); ++ TCGv t1 = tcg_temp_new(); ++ ++ gen_load_gpr(t1, rs); ++ switch (opc) { ++ case OPC_LARCH_TRPICK_W: ++ if (lsb + msb > 31) { ++ goto fail; ++ } ++ if (msb != 31) { ++ tcg_gen_extract_tl(t0, t1, lsb, msb + 1); ++ } else { ++ /* ++ * The two checks together imply that lsb == 0, ++ * so this is a simple sign-extension. ++ */ ++ tcg_gen_ext32s_tl(t0, t1); ++ } ++ break; ++ case OPC_LARCH_TRINS_W: ++ if (lsb > msb) { ++ goto fail; ++ } ++ gen_load_gpr(t0, rt); ++ tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1); ++ tcg_gen_ext32s_tl(t0, t0); ++ break; ++ default: ++ fail: ++ LARCH_INVAL("bitops"); ++ generate_exception_end(ctx, EXCP_RI); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ return; ++ } ++ gen_store_gpr(t0, rt); ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++} ++ ++static void gen_bshfl(DisasContext *ctx, uint32_t op2, int rt, int rd) ++{ ++ TCGv t0; ++ ++ if (rd == 0) { ++ /* If no destination, treat it as a NOP. */ ++ return; ++ } ++ ++ t0 = tcg_temp_new(); ++ gen_load_gpr(t0, rt); ++ switch (op2) { ++ case OPC_LARCH_REVB_2H: { ++ TCGv t1 = tcg_temp_new(); ++ TCGv t2 = tcg_const_tl(0x00FF00FF); ++ ++ tcg_gen_shri_tl(t1, t0, 8); ++ tcg_gen_and_tl(t1, t1, t2); ++ tcg_gen_and_tl(t0, t0, t2); ++ tcg_gen_shli_tl(t0, t0, 8); ++ tcg_gen_or_tl(t0, t0, t1); ++ tcg_temp_free(t2); ++ tcg_temp_free(t1); ++ tcg_gen_ext32s_tl(cpu_gpr[rd], t0); ++ } break; ++ case OPC_LARCH_EXT_WB: ++ tcg_gen_ext8s_tl(cpu_gpr[rd], t0); ++ break; ++ case OPC_LARCH_EXT_WH: ++ tcg_gen_ext16s_tl(cpu_gpr[rd], t0); ++ break; ++ case OPC_LARCH_REVB_4H: { ++ TCGv t1 = tcg_temp_new(); ++ TCGv t2 = tcg_const_tl(0x00FF00FF00FF00FFULL); ++ ++ tcg_gen_shri_tl(t1, t0, 8); ++ tcg_gen_and_tl(t1, t1, t2); ++ tcg_gen_and_tl(t0, t0, t2); ++ tcg_gen_shli_tl(t0, t0, 8); ++ tcg_gen_or_tl(cpu_gpr[rd], t0, t1); ++ tcg_temp_free(t2); ++ tcg_temp_free(t1); ++ } break; ++ case OPC_LARCH_REVH_D: { ++ TCGv t1 = tcg_temp_new(); ++ TCGv t2 = tcg_const_tl(0x0000FFFF0000FFFFULL); ++ ++ tcg_gen_shri_tl(t1, t0, 16); ++ tcg_gen_and_tl(t1, t1, t2); ++ tcg_gen_and_tl(t0, t0, t2); ++ tcg_gen_shli_tl(t0, t0, 16); ++ tcg_gen_or_tl(t0, t0, t1); ++ tcg_gen_shri_tl(t1, t0, 32); ++ tcg_gen_shli_tl(t0, t0, 32); ++ tcg_gen_or_tl(cpu_gpr[rd], t0, t1); ++ tcg_temp_free(t2); ++ tcg_temp_free(t1); ++ } break; ++ default: ++ LARCH_INVAL("bsfhl"); ++ generate_exception_end(ctx, EXCP_RI); ++ tcg_temp_free(t0); ++ return; ++ } ++ tcg_temp_free(t0); ++} ++ ++/* REV with sf==1, opcode==3 ("REV64") */ ++static void handle_rev64(DisasContext *ctx, unsigned int rn, unsigned int rd) ++{ ++ tcg_gen_bswap64_i64(cpu_gpr[rd], cpu_gpr[rn]); ++} ++ ++/* ++ * REV with sf==0, opcode==2 ++ * REV32 (sf==1, opcode==2) ++ */ ++static void handle_rev32(DisasContext *ctx, unsigned int rn, unsigned int rd) ++{ ++ TCGv_i64 tcg_rd = tcg_temp_new_i64(); ++ gen_load_gpr(tcg_rd, rd); ++ ++ TCGv_i64 tcg_tmp = tcg_temp_new_i64(); ++ TCGv_i64 tcg_rn = tcg_temp_new_i64(); ++ gen_load_gpr(tcg_rn, rn); ++ ++ /* bswap32_i64 requires zero high word */ ++ tcg_gen_ext32u_i64(tcg_tmp, tcg_rn); ++ tcg_gen_bswap32_i64(tcg_rd, tcg_tmp, TCG_BSWAP_OZ); ++ tcg_gen_shri_i64(tcg_tmp, tcg_rn, 32); ++ tcg_gen_bswap32_i64(tcg_tmp, tcg_tmp, TCG_BSWAP_OZ); ++ tcg_gen_concat32_i64(cpu_gpr[rd], tcg_rd, tcg_tmp); ++ ++ tcg_temp_free_i64(tcg_tmp); ++ tcg_temp_free_i64(tcg_rd); ++ tcg_temp_free_i64(tcg_rn); ++} ++ ++/* REV16 */ ++static void handle_rev16(DisasContext *ctx, unsigned int rn, unsigned int rd) ++{ ++ TCGv_i64 tcg_rd = tcg_temp_new_i64(); ++ TCGv_i64 tcg_rn = tcg_temp_new_i64(); ++ gen_load_gpr(tcg_rd, rd); ++ gen_load_gpr(tcg_rn, rn); ++ TCGv_i64 tcg_tmp = tcg_temp_new_i64(); ++ TCGv_i64 mask = tcg_const_i64(0x0000ffff0000ffffull); ++ ++ tcg_gen_shri_i64(tcg_tmp, tcg_rn, 16); ++ tcg_gen_and_i64(tcg_rd, tcg_rn, mask); ++ tcg_gen_and_i64(tcg_tmp, tcg_tmp, mask); ++ tcg_gen_shli_i64(tcg_rd, tcg_rd, 16); ++ tcg_gen_or_i64(cpu_gpr[rd], tcg_rd, tcg_tmp); ++ ++ tcg_temp_free_i64(mask); ++ tcg_temp_free_i64(tcg_tmp); ++ tcg_temp_free_i64(tcg_rd); ++ tcg_temp_free_i64(tcg_rn); ++} ++ ++static void gen_lsa(DisasContext *ctx, int opc, int rd, int rs, int rt, ++ int imm2) ++{ ++ TCGv t0; ++ TCGv t1; ++ if (rd == 0) { ++ /* Treat as NOP. */ ++ return; ++ } ++ t0 = tcg_temp_new(); ++ t1 = tcg_temp_new(); ++ gen_load_gpr(t0, rs); ++ gen_load_gpr(t1, rt); ++ tcg_gen_shli_tl(t0, t0, imm2 + 1); ++ tcg_gen_add_tl(cpu_gpr[rd], t0, t1); ++ if (opc == OPC_LARCH_ALSL_W) { ++ tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]); ++ } ++ ++ tcg_temp_free(t1); ++ tcg_temp_free(t0); ++ ++ return; ++} ++ ++static void gen_align_bits(DisasContext *ctx, int wordsz, int rd, int rs, ++ int rt, int bits) ++{ ++ TCGv t0; ++ if (rd == 0) { ++ /* Treat as NOP. */ ++ return; ++ } ++ t0 = tcg_temp_new(); ++ if (bits == 0 || bits == wordsz) { ++ if (bits == 0) { ++ gen_load_gpr(t0, rt); ++ } else { ++ gen_load_gpr(t0, rs); ++ } ++ switch (wordsz) { ++ case 32: ++ tcg_gen_ext32s_tl(cpu_gpr[rd], t0); ++ break; ++ case 64: ++ tcg_gen_mov_tl(cpu_gpr[rd], t0); ++ break; ++ } ++ } else { ++ TCGv t1 = tcg_temp_new(); ++ gen_load_gpr(t0, rt); ++ gen_load_gpr(t1, rs); ++ switch (wordsz) { ++ case 32: { ++ TCGv_i64 t2 = tcg_temp_new_i64(); ++ tcg_gen_concat_tl_i64(t2, t1, t0); ++ tcg_gen_shri_i64(t2, t2, 32 - bits); ++ gen_move_low32(cpu_gpr[rd], t2); ++ tcg_temp_free_i64(t2); ++ } break; ++ case 64: ++ tcg_gen_shli_tl(t0, t0, bits); ++ tcg_gen_shri_tl(t1, t1, 64 - bits); ++ tcg_gen_or_tl(cpu_gpr[rd], t1, t0); ++ break; ++ } ++ tcg_temp_free(t1); ++ } ++ ++ tcg_temp_free(t0); ++} ++ ++static void gen_align(DisasContext *ctx, int wordsz, int rd, int rs, int rt, ++ int bp) ++{ ++ gen_align_bits(ctx, wordsz, rd, rs, rt, bp * 8); ++} ++ ++static void gen_bitswap(DisasContext *ctx, int opc, int rd, int rt) ++{ ++ TCGv t0; ++ if (rd == 0) { ++ /* Treat as NOP. */ ++ return; ++ } ++ t0 = tcg_temp_new(); ++ gen_load_gpr(t0, rt); ++ switch (opc) { ++ case OPC_LARCH_BREV_4B: ++ gen_helper_bitswap(cpu_gpr[rd], t0); ++ break; ++ case OPC_LARCH_BREV_8B: ++ gen_helper_dbitswap(cpu_gpr[rd], t0); ++ break; ++ } ++ tcg_temp_free(t0); ++} ++ ++static void gen_cp1(DisasContext *ctx, uint32_t opc, int rt, int fs) ++{ ++ TCGv t0 = tcg_temp_new(); ++ check_cp1_enabled(ctx); ++ ++ switch (opc) { ++ case OPC_LARCH_FR2GR_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ tcg_gen_ext_i32_tl(t0, fp0); ++ tcg_temp_free_i32(fp0); ++ } ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_GR2FR_W: ++ gen_load_gpr(t0, rt); ++ { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ tcg_gen_trunc_tl_i32(fp0, t0); ++ gen_store_fpr32(ctx, fp0, fs); ++ tcg_temp_free_i32(fp0); ++ } ++ break; ++ case OPC_LARCH_FR2GR_D: ++ gen_load_fpr64(ctx, t0, fs); ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_GR2FR_D: ++ gen_load_gpr(t0, rt); ++ gen_store_fpr64(ctx, t0, fs); ++ break; ++ case OPC_LARCH_FRH2GR_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32h(ctx, fp0, fs); ++ tcg_gen_ext_i32_tl(t0, fp0); ++ tcg_temp_free_i32(fp0); ++ } ++ gen_store_gpr(t0, rt); ++ break; ++ case OPC_LARCH_GR2FRH_W: ++ gen_load_gpr(t0, rt); ++ { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ tcg_gen_trunc_tl_i32(fp0, t0); ++ gen_store_fpr32h(ctx, fp0, fs); ++ tcg_temp_free_i32(fp0); ++ } ++ break; ++ default: ++ LARCH_INVAL("cp1 move"); ++ generate_exception_end(ctx, EXCP_RI); ++ goto out; ++ } ++ ++out: ++ tcg_temp_free(t0); ++} ++ ++static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd, int cc, ++ int tf) ++{ ++ int cond; ++ TCGv_i32 t0 = tcg_temp_new_i32(); ++ TCGLabel *l1 = gen_new_label(); ++ TCGLabel *l2 = gen_new_label(); ++ ++ if (tf) { ++ cond = TCG_COND_EQ; ++ } else { ++ cond = TCG_COND_NE; ++ } ++ ++ tcg_gen_andi_i32(t0, fpu_fcsr0, 1 << get_fp_bit(cc)); ++ tcg_gen_brcondi_i32(cond, t0, 0, l1); ++ gen_load_fpr32(ctx, t0, fs); ++ gen_store_fpr32(ctx, t0, fd); ++ gen_set_label(l1); ++ ++ tcg_gen_andi_i32(t0, fpu_fcsr0, 1 << get_fp_bit(cc + 1)); ++ tcg_gen_brcondi_i32(cond, t0, 0, l2); ++ gen_load_fpr32h(ctx, t0, fs); ++ gen_store_fpr32h(ctx, t0, fd); ++ tcg_temp_free_i32(t0); ++ gen_set_label(l2); ++} ++ ++static void gen_farith(DisasContext *ctx, uint32_t opc, int ft, int fs, int fd, ++ int cc) ++{ ++ check_cp1_enabled(ctx); ++ switch (opc) { ++ case OPC_LARCH_FADD_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_load_fpr32(ctx, fp1, ft); ++ gen_helper_float_add_s(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i32(fp1); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FSUB_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_load_fpr32(ctx, fp1, ft); ++ gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i32(fp1); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FMUL_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_load_fpr32(ctx, fp1, ft); ++ gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i32(fp1); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FDIV_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_load_fpr32(ctx, fp1, ft); ++ gen_helper_float_div_s(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i32(fp1); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FSQRT_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_sqrt_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FABS_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_abs_s(fp0, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FMOV_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FNEG_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_chs_s(fp0, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FTINTRNE_L_S: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr32(ctx, fp32, fs); ++ gen_helper_float_round_l_s(fp64, cpu_env, fp32); ++ tcg_temp_free_i32(fp32); ++ gen_store_fpr64(ctx, fp64, fd); ++ tcg_temp_free_i64(fp64); ++ } break; ++ case OPC_LARCH_FTINTRZ_L_S: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr32(ctx, fp32, fs); ++ gen_helper_float_trunc_l_s(fp64, cpu_env, fp32); ++ tcg_temp_free_i32(fp32); ++ gen_store_fpr64(ctx, fp64, fd); ++ tcg_temp_free_i64(fp64); ++ } break; ++ case OPC_LARCH_FTINTRP_L_S: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr32(ctx, fp32, fs); ++ gen_helper_float_ceil_l_s(fp64, cpu_env, fp32); ++ tcg_temp_free_i32(fp32); ++ gen_store_fpr64(ctx, fp64, fd); ++ tcg_temp_free_i64(fp64); ++ } break; ++ case OPC_LARCH_FTINTRM_L_S: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr32(ctx, fp32, fs); ++ gen_helper_float_floor_l_s(fp64, cpu_env, fp32); ++ tcg_temp_free_i32(fp32); ++ gen_store_fpr64(ctx, fp64, fd); ++ tcg_temp_free_i64(fp64); ++ } break; ++ case OPC_LARCH_FTINTRNE_W_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_round_w_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FTINTRZ_W_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_trunc_w_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FTINTRP_W_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_ceil_w_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FTINTRM_W_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_floor_w_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FRECIP_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_recip_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FRSQRT_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_rsqrt_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FRINT_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_rint_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FCLASS_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_class_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FMIN_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ TCGv_i32 fp2 = tcg_temp_new_i32(); ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_load_fpr32(ctx, fp1, ft); ++ gen_helper_float_min_s(fp2, cpu_env, fp0, fp1); ++ gen_store_fpr32(ctx, fp2, fd); ++ tcg_temp_free_i32(fp2); ++ tcg_temp_free_i32(fp1); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FMINA_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ TCGv_i32 fp2 = tcg_temp_new_i32(); ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_load_fpr32(ctx, fp1, ft); ++ gen_helper_float_mina_s(fp2, cpu_env, fp0, fp1); ++ gen_store_fpr32(ctx, fp2, fd); ++ tcg_temp_free_i32(fp2); ++ tcg_temp_free_i32(fp1); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FMAX_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_load_fpr32(ctx, fp1, ft); ++ gen_helper_float_max_s(fp1, cpu_env, fp0, fp1); ++ gen_store_fpr32(ctx, fp1, fd); ++ tcg_temp_free_i32(fp1); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FMAXA_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ TCGv_i32 fp1 = tcg_temp_new_i32(); ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_load_fpr32(ctx, fp1, ft); ++ gen_helper_float_maxa_s(fp1, cpu_env, fp0, fp1); ++ gen_store_fpr32(ctx, fp1, fd); ++ tcg_temp_free_i32(fp1); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FCVT_D_S: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr32(ctx, fp32, fs); ++ gen_helper_float_cvtd_s(fp64, cpu_env, fp32); ++ tcg_temp_free_i32(fp32); ++ gen_store_fpr64(ctx, fp64, fd); ++ tcg_temp_free_i64(fp64); ++ } break; ++ case OPC_LARCH_FTINT_W_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_cvt_w_s(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FTINT_L_S: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr32(ctx, fp32, fs); ++ gen_helper_float_cvt_l_s(fp64, cpu_env, fp32); ++ tcg_temp_free_i32(fp32); ++ gen_store_fpr64(ctx, fp64, fd); ++ tcg_temp_free_i64(fp64); ++ } break; ++ case OPC_LARCH_FADD_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_load_fpr64(ctx, fp1, ft); ++ gen_helper_float_add_d(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i64(fp1); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FSUB_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_load_fpr64(ctx, fp1, ft); ++ gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i64(fp1); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FMUL_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_load_fpr64(ctx, fp1, ft); ++ gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i64(fp1); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FDIV_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_load_fpr64(ctx, fp1, ft); ++ gen_helper_float_div_d(fp0, cpu_env, fp0, fp1); ++ tcg_temp_free_i64(fp1); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FSQRT_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_sqrt_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FABS_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_abs_d(fp0, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FMOV_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FNEG_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_chs_d(fp0, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FTINTRNE_L_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_round_l_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FTINTRZ_L_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_trunc_l_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FTINTRP_L_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_ceil_l_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FTINTRM_L_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_floor_l_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FTINTRNE_W_D: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp64, fs); ++ gen_helper_float_round_w_d(fp32, cpu_env, fp64); ++ tcg_temp_free_i64(fp64); ++ gen_store_fpr32(ctx, fp32, fd); ++ tcg_temp_free_i32(fp32); ++ } break; ++ case OPC_LARCH_FTINTRZ_W_D: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp64, fs); ++ gen_helper_float_trunc_w_d(fp32, cpu_env, fp64); ++ tcg_temp_free_i64(fp64); ++ gen_store_fpr32(ctx, fp32, fd); ++ tcg_temp_free_i32(fp32); ++ } break; ++ case OPC_LARCH_FTINTRP_W_D: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp64, fs); ++ gen_helper_float_ceil_w_d(fp32, cpu_env, fp64); ++ tcg_temp_free_i64(fp64); ++ gen_store_fpr32(ctx, fp32, fd); ++ tcg_temp_free_i32(fp32); ++ } break; ++ case OPC_LARCH_FTINTRM_W_D: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp64, fs); ++ gen_helper_float_floor_w_d(fp32, cpu_env, fp64); ++ tcg_temp_free_i64(fp64); ++ gen_store_fpr32(ctx, fp32, fd); ++ tcg_temp_free_i32(fp32); ++ } break; ++ case OPC_LARCH_FRECIP_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_recip_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FRSQRT_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_rsqrt_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FRINT_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_rint_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FCLASS_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_class_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FMIN_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_load_fpr64(ctx, fp1, ft); ++ gen_helper_float_min_d(fp1, cpu_env, fp0, fp1); ++ gen_store_fpr64(ctx, fp1, fd); ++ tcg_temp_free_i64(fp1); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FMINA_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_load_fpr64(ctx, fp1, ft); ++ gen_helper_float_mina_d(fp1, cpu_env, fp0, fp1); ++ gen_store_fpr64(ctx, fp1, fd); ++ tcg_temp_free_i64(fp1); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FMAX_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_load_fpr64(ctx, fp1, ft); ++ gen_helper_float_max_d(fp1, cpu_env, fp0, fp1); ++ gen_store_fpr64(ctx, fp1, fd); ++ tcg_temp_free_i64(fp1); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FMAXA_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ TCGv_i64 fp1 = tcg_temp_new_i64(); ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_load_fpr64(ctx, fp1, ft); ++ gen_helper_float_maxa_d(fp1, cpu_env, fp0, fp1); ++ gen_store_fpr64(ctx, fp1, fd); ++ tcg_temp_free_i64(fp1); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FCVT_S_D: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp64, fs); ++ gen_helper_float_cvts_d(fp32, cpu_env, fp64); ++ tcg_temp_free_i64(fp64); ++ gen_store_fpr32(ctx, fp32, fd); ++ tcg_temp_free_i32(fp32); ++ } break; ++ case OPC_LARCH_FTINT_W_D: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp64, fs); ++ gen_helper_float_cvt_w_d(fp32, cpu_env, fp64); ++ tcg_temp_free_i64(fp64); ++ gen_store_fpr32(ctx, fp32, fd); ++ tcg_temp_free_i32(fp32); ++ } break; ++ case OPC_LARCH_FTINT_L_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_cvt_l_d(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FFINT_S_W: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ gen_load_fpr32(ctx, fp0, fs); ++ gen_helper_float_cvts_w(fp0, cpu_env, fp0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FFINT_D_W: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr32(ctx, fp32, fs); ++ gen_helper_float_cvtd_w(fp64, cpu_env, fp32); ++ tcg_temp_free_i32(fp32); ++ gen_store_fpr64(ctx, fp64, fd); ++ tcg_temp_free_i64(fp64); ++ } break; ++ case OPC_LARCH_FFINT_S_L: { ++ TCGv_i32 fp32 = tcg_temp_new_i32(); ++ TCGv_i64 fp64 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp64, fs); ++ gen_helper_float_cvts_l(fp32, cpu_env, fp64); ++ tcg_temp_free_i64(fp64); ++ gen_store_fpr32(ctx, fp32, fd); ++ tcg_temp_free_i32(fp32); ++ } break; ++ case OPC_LARCH_FFINT_D_L: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ ++ gen_load_fpr64(ctx, fp0, fs); ++ gen_helper_float_cvtd_l(fp0, cpu_env, fp0); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ default: ++ LARCH_INVAL("farith"); ++ generate_exception_end(ctx, EXCP_RI); ++ return; ++ } ++} ++ ++/* Coprocessor 3 (FPU) */ ++static void gen_flt3_ldst(DisasContext *ctx, uint32_t opc, int fd, int fs, ++ int base, int index) ++{ ++ TCGv t0 = tcg_temp_new(); ++ ++ check_cp1_enabled(ctx); ++ if (base == 0) { ++ gen_load_gpr(t0, index); ++ } else if (index == 0) { ++ gen_load_gpr(t0, base); ++ } else { ++ gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]); ++ } ++ ++ /* ++ * Don't do NOP if destination is zero: we must perform the actual ++ * memory access. ++ */ ++ switch (opc) { ++ case OPC_LARCH_FLDX_S: ++ case OPC_LARCH_FLDGT_S: ++ case OPC_LARCH_FLDLE_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ ++ tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL); ++ tcg_gen_trunc_tl_i32(fp0, t0); ++ gen_store_fpr32(ctx, fp0, fd); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FLDX_D: ++ case OPC_LARCH_FLDGT_D: ++ case OPC_LARCH_FLDLE_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ); ++ gen_store_fpr64(ctx, fp0, fd); ++ tcg_temp_free_i64(fp0); ++ } break; ++ case OPC_LARCH_FSTX_S: ++ case OPC_LARCH_FSTGT_S: ++ case OPC_LARCH_FSTLE_S: { ++ TCGv_i32 fp0 = tcg_temp_new_i32(); ++ gen_load_fpr32(ctx, fp0, fs); ++ tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL); ++ tcg_temp_free_i32(fp0); ++ } break; ++ case OPC_LARCH_FSTX_D: ++ case OPC_LARCH_FSTGT_D: ++ case OPC_LARCH_FSTLE_D: { ++ TCGv_i64 fp0 = tcg_temp_new_i64(); ++ gen_load_fpr64(ctx, fp0, fs); ++ tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ); ++ tcg_temp_free_i64(fp0); ++ } break; ++ } ++ tcg_temp_free(t0); ++} ++ ++static inline void clear_branch_hflags(DisasContext *ctx) ++{ ++ ctx->hflags &= ~LARCH_HFLAG_BMASK; ++ if (ctx->base.is_jmp == DISAS_NEXT) { ++ save_cpu_state(ctx, 0); ++ } else { ++ /* ++ * It is not safe to save ctx->hflags as hflags may be changed ++ * in execution time. ++ */ ++ tcg_gen_andi_i32(hflags, hflags, ~LARCH_HFLAG_BMASK); ++ } ++} ++ ++static void gen_branch(DisasContext *ctx, int insn_bytes) ++{ ++ if (ctx->hflags & LARCH_HFLAG_BMASK) { ++ int proc_hflags = ctx->hflags & LARCH_HFLAG_BMASK; ++ /* Branches completion */ ++ clear_branch_hflags(ctx); ++ ctx->base.is_jmp = DISAS_NORETURN; ++ /* FIXME: Need to clear can_do_io. */ ++ switch (proc_hflags & LARCH_HFLAG_BMASK) { ++ case LARCH_HFLAG_B: ++ /* unconditional branch */ ++ gen_goto_tb(ctx, 0, ctx->btarget); ++ break; ++ case LARCH_HFLAG_BC: ++ /* Conditional branch */ ++ { ++ TCGLabel *l1 = gen_new_label(); ++ ++ tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1); ++ gen_goto_tb(ctx, 1, ctx->base.pc_next + insn_bytes); ++ gen_set_label(l1); ++ gen_goto_tb(ctx, 0, ctx->btarget); ++ } ++ break; ++ case LARCH_HFLAG_BR: ++ /* unconditional branch to register */ ++ tcg_gen_mov_tl(cpu_PC, btarget); ++ if (ctx->base.singlestep_enabled) { ++ save_cpu_state(ctx, 0); ++ gen_helper_raise_exception_debug(cpu_env); ++ } ++ tcg_gen_lookup_and_goto_ptr(); ++ break; ++ default: ++ fprintf(stderr, "unknown branch 0x%x\n", proc_hflags); ++ abort(); ++ } ++ } ++} ++ ++/* Signed immediate */ ++#define SIMM(op, start, width) \ ++ ((int32_t)(((op >> start) & ((~0U) >> (32 - width))) << (32 - width)) >> \ ++ (32 - width)) ++/* Zero-extended immediate */ ++#define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32 - width))) ++ ++static void gen_sync(int stype) ++{ ++ TCGBar tcg_mo = TCG_BAR_SC; ++ ++ switch (stype) { ++ case 0x4: /* SYNC_WMB */ ++ tcg_mo |= TCG_MO_ST_ST; ++ break; ++ case 0x10: /* SYNC_MB */ ++ tcg_mo |= TCG_MO_ALL; ++ break; ++ case 0x11: /* SYNC_ACQUIRE */ ++ tcg_mo |= TCG_MO_LD_LD | TCG_MO_LD_ST; ++ break; ++ case 0x12: /* SYNC_RELEASE */ ++ tcg_mo |= TCG_MO_ST_ST | TCG_MO_LD_ST; ++ break; ++ case 0x13: /* SYNC_RMB */ ++ tcg_mo |= TCG_MO_LD_LD; ++ break; ++ default: ++ tcg_mo |= TCG_MO_ALL; ++ break; ++ } ++ ++ tcg_gen_mb(tcg_mo); ++} ++ ++static void gen_crc32(DisasContext *ctx, int rd, int rs, int rt, int sz, ++ int crc32c) ++{ ++ TCGv t0; ++ TCGv t1; ++ TCGv_i32 tsz = tcg_const_i32(1 << sz); ++ if (rd == 0) { ++ /* Treat as NOP. */ ++ return; ++ } ++ t0 = tcg_temp_new(); ++ t1 = tcg_temp_new(); ++ ++ gen_load_gpr(t0, rt); ++ gen_load_gpr(t1, rs); ++ ++ if (crc32c) { ++ gen_helper_crc32c(cpu_gpr[rd], t0, t1, tsz); ++ } else { ++ gen_helper_crc32(cpu_gpr[rd], t0, t1, tsz); ++ } ++ ++ tcg_temp_free(t0); ++ tcg_temp_free(t1); ++ tcg_temp_free_i32(tsz); ++} ++ ++#include "cpu-csr.h" ++ ++#ifndef CONFIG_USER_ONLY ++ ++/* ++ * 64-bit CSR read ++ * ++ * @arg : GPR to store the value of CSR register ++ * @csr : CSR register number ++ */ ++static void gen_csr_rdq(DisasContext *ctx, TCGv rd, int64_t a1) ++{ ++ TCGv_i64 csr = tcg_const_i64(a1); ++ gen_helper_csr_rdq(rd, cpu_env, csr); ++} ++ ++/* ++ * 64-bit CSR write ++ * ++ * @arg : GPR that stores the new value of CSR register ++ * @csr : CSR register number ++ */ ++static void gen_csr_wrq(DisasContext *ctx, TCGv val, int64_t a1) ++{ ++ TCGv_i64 csr = tcg_const_i64(a1); ++ gen_helper_csr_wrq(val, cpu_env, val, csr); ++} ++ ++/* ++ * 64-bit CSR exchange ++ * ++ * @arg : GPR that stores the new value of CSR register ++ * @csr : CSR register number ++ */ ++static void gen_csr_xchgq(DisasContext *ctx, TCGv val, TCGv mask, int64_t a1) ++{ ++ TCGv_i64 csr = tcg_const_i64(a1); ++ gen_helper_csr_xchgq(val, cpu_env, val, mask, csr); ++} ++#endif /* !CONFIG_USER_ONLY */ ++ ++static void loongarch_tr_init_disas_context(DisasContextBase *dcbase, ++ CPUState *cs) ++{ ++ DisasContext *ctx = container_of(dcbase, DisasContext, base); ++ CPULOONGARCHState *env = cs->env_ptr; ++ ++ ctx->page_start = ctx->base.pc_first & TARGET_PAGE_MASK; ++ ctx->saved_pc = -1; ++ ctx->insn_flags = env->insn_flags; ++ ctx->btarget = 0; ++ /* Restore state from the tb context. */ ++ ctx->hflags = ++ (uint32_t)ctx->base.tb->flags; /* FIXME: maybe use 64 bits? */ ++ restore_cpu_state(env, ctx); ++#ifdef CONFIG_USER_ONLY ++ ctx->mem_idx = LARCH_HFLAG_UM; ++#else ++ ctx->mem_idx = hflags_mmu_index(ctx->hflags); ++#endif ++ ctx->default_tcg_memop_mask = MO_ALIGN; ++ ++ LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx, ++ ctx->hflags); ++} ++ ++static void loongarch_tr_tb_start(DisasContextBase *dcbase, CPUState *cs) ++{ ++} ++ ++static void loongarch_tr_insn_start(DisasContextBase *dcbase, CPUState *cs) ++{ ++ DisasContext *ctx = container_of(dcbase, DisasContext, base); ++ ++ tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & LARCH_HFLAG_BMASK, ++ ctx->btarget); ++} ++ ++/* 128 and 256 lsx vector instructions are not supported yet */ ++static bool decode_vector_lsx(uint32_t opcode) ++{ ++ uint32_t value = (opcode & 0xff000000); ++ ++ if ((opcode & 0xf0000000) == 0x70000000) { ++ return true; ++ } else if ((opcode & 0xfff00000) == 0x38400000) { ++ return true; ++ } else { ++ switch (value) { ++ case 0x09000000: ++ case 0x0a000000: ++ case 0x0e000000: ++ case 0x0f000000: ++ case 0x2c000000: ++ case 0x30000000: ++ case 0x31000000: ++ case 0x32000000: ++ case 0x33000000: ++ return true; ++ } ++ } ++ return false; ++} ++ ++static bool decode_insn(DisasContext *ctx, uint32_t insn); ++#include "decode-insn.c.inc" ++#include "trans.inc.c" ++ ++static void loongarch_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) ++{ ++ CPULOONGARCHState *env = cs->env_ptr; ++ DisasContext *ctx = container_of(dcbase, DisasContext, base); ++ int insn_bytes = 4; ++ ++ ctx->opcode = cpu_ldl_code(env, ctx->base.pc_next); ++ ++ if (!decode_insn(ctx, ctx->opcode)) { ++ if (decode_vector_lsx(ctx->opcode)) { ++ generate_exception_end(ctx, EXCP_RI); ++ } else { ++ fprintf(stderr, "Error: unkown opcode. 0x%lx: 0x%x\n", ++ ctx->base.pc_next, ctx->opcode); ++ generate_exception_end(ctx, EXCP_RI); ++ } ++ } ++ ++ if (ctx->hflags & LARCH_HFLAG_BMASK) { ++ gen_branch(ctx, insn_bytes); ++ } ++ ctx->base.pc_next += insn_bytes; ++} ++ ++static void loongarch_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) ++{ ++ DisasContext *ctx = container_of(dcbase, DisasContext, base); ++ ++ if (ctx->base.singlestep_enabled && ctx->base.is_jmp != DISAS_NORETURN) { ++ save_cpu_state(ctx, ctx->base.is_jmp != DISAS_EXIT); ++ gen_helper_raise_exception_debug(cpu_env); ++ } else { ++ switch (ctx->base.is_jmp) { ++ case DISAS_STOP: ++ gen_save_pc(ctx->base.pc_next); ++ tcg_gen_lookup_and_goto_ptr(); ++ break; ++ case DISAS_NEXT: ++ case DISAS_TOO_MANY: ++ save_cpu_state(ctx, 0); ++ gen_goto_tb(ctx, 0, ctx->base.pc_next); ++ break; ++ case DISAS_EXIT: ++ tcg_gen_exit_tb(NULL, 0); ++ break; ++ case DISAS_NORETURN: ++ break; ++ default: ++ g_assert_not_reached(); ++ } ++ } ++} ++ ++static void loongarch_tr_disas_log(const DisasContextBase *dcbase, ++ CPUState *cs) ++{ ++ qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first)); ++ log_target_disas(cs, dcbase->pc_first, dcbase->tb->size); ++} ++ ++static const TranslatorOps loongarch_tr_ops = { ++ .init_disas_context = loongarch_tr_init_disas_context, ++ .tb_start = loongarch_tr_tb_start, ++ .insn_start = loongarch_tr_insn_start, ++ .translate_insn = loongarch_tr_translate_insn, ++ .tb_stop = loongarch_tr_tb_stop, ++ .disas_log = loongarch_tr_disas_log, ++}; ++ ++void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb, ++ int max_insns) ++{ ++ DisasContext ctx; ++ ++ translator_loop(&loongarch_tr_ops, &ctx.base, cs, tb, max_insns); ++} ++ ++void loongarch_tcg_init(void) ++{ ++ int i; ++ ++ for (i = 0; i < 32; i++) ++ cpu_gpr[i] = tcg_global_mem_new( ++ cpu_env, offsetof(CPULOONGARCHState, active_tc.gpr[i]), ++ regnames[i]); ++ ++ for (i = 0; i < 32; i++) { ++ int off = offsetof(CPULOONGARCHState, active_fpu.fpr[i].d); ++ fpu_f64[i] = tcg_global_mem_new_i64(cpu_env, off, fregnames[i]); ++ } ++ ++ cpu_PC = tcg_global_mem_new( ++ cpu_env, offsetof(CPULOONGARCHState, active_tc.PC), "PC"); ++ bcond = tcg_global_mem_new(cpu_env, offsetof(CPULOONGARCHState, bcond), ++ "bcond"); ++ btarget = tcg_global_mem_new(cpu_env, offsetof(CPULOONGARCHState, btarget), ++ "btarget"); ++ hflags = tcg_global_mem_new_i32( ++ cpu_env, offsetof(CPULOONGARCHState, hflags), "hflags"); ++ fpu_fcsr0 = tcg_global_mem_new_i32( ++ cpu_env, offsetof(CPULOONGARCHState, active_fpu.fcsr0), "fcsr0"); ++ cpu_lladdr = tcg_global_mem_new( ++ cpu_env, offsetof(CPULOONGARCHState, lladdr), "lladdr"); ++ cpu_llval = tcg_global_mem_new(cpu_env, offsetof(CPULOONGARCHState, llval), ++ "llval"); ++} ++ ++void restore_state_to_opc(CPULOONGARCHState *env, TranslationBlock *tb, ++ target_ulong *data) ++{ ++ env->active_tc.PC = data[0]; ++ env->hflags &= ~LARCH_HFLAG_BMASK; ++ env->hflags |= data[1]; ++ switch (env->hflags & LARCH_HFLAG_BMASK) { ++ case LARCH_HFLAG_BR: ++ break; ++ case LARCH_HFLAG_BC: ++ case LARCH_HFLAG_B: ++ env->btarget = data[2]; ++ break; ++ } ++} +diff --git a/target/meson.build b/target/meson.build +index ec6bc97331..a824a390f9 100644 +--- a/target/meson.build ++++ b/target/meson.build +@@ -5,6 +5,7 @@ subdir('cris') + subdir('hexagon') + subdir('hppa') + subdir('i386') ++subdir('loongarch64') + subdir('m68k') + subdir('microblaze') + subdir('mips') +diff --git a/tcg/loongarch64/tcg-insn-defs.c.inc b/tcg/loongarch64/tcg-insn-defs.c.inc +new file mode 100644 +index 0000000000..2a8fdad626 +--- /dev/null ++++ b/tcg/loongarch64/tcg-insn-defs.c.inc +@@ -0,0 +1,985 @@ ++/* ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ ++ */ ++ ++typedef enum { ++ OPC_CLZ_W = 0x00001400, ++ OPC_CTZ_W = 0x00001c00, ++ OPC_CLZ_D = 0x00002400, ++ OPC_CTZ_D = 0x00002c00, ++ OPC_REVB_2H = 0x00003000, ++ OPC_REVB_2W = 0x00003800, ++ OPC_REVB_D = 0x00003c00, ++ OPC_SEXT_H = 0x00005800, ++ OPC_SEXT_B = 0x00005c00, ++ OPC_ADD_W = 0x00100000, ++ OPC_ADD_D = 0x00108000, ++ OPC_SUB_W = 0x00110000, ++ OPC_SUB_D = 0x00118000, ++ OPC_SLT = 0x00120000, ++ OPC_SLTU = 0x00128000, ++ OPC_MASKEQZ = 0x00130000, ++ OPC_MASKNEZ = 0x00138000, ++ OPC_NOR = 0x00140000, ++ OPC_AND = 0x00148000, ++ OPC_OR = 0x00150000, ++ OPC_XOR = 0x00158000, ++ OPC_ORN = 0x00160000, ++ OPC_ANDN = 0x00168000, ++ OPC_SLL_W = 0x00170000, ++ OPC_SRL_W = 0x00178000, ++ OPC_SRA_W = 0x00180000, ++ OPC_SLL_D = 0x00188000, ++ OPC_SRL_D = 0x00190000, ++ OPC_SRA_D = 0x00198000, ++ OPC_ROTR_W = 0x001b0000, ++ OPC_ROTR_D = 0x001b8000, ++ OPC_MUL_W = 0x001c0000, ++ OPC_MULH_W = 0x001c8000, ++ OPC_MULH_WU = 0x001d0000, ++ OPC_MUL_D = 0x001d8000, ++ OPC_MULH_D = 0x001e0000, ++ OPC_MULH_DU = 0x001e8000, ++ OPC_DIV_W = 0x00200000, ++ OPC_MOD_W = 0x00208000, ++ OPC_DIV_WU = 0x00210000, ++ OPC_MOD_WU = 0x00218000, ++ OPC_DIV_D = 0x00220000, ++ OPC_MOD_D = 0x00228000, ++ OPC_DIV_DU = 0x00230000, ++ OPC_MOD_DU = 0x00238000, ++ OPC_SLLI_W = 0x00408000, ++ OPC_SLLI_D = 0x00410000, ++ OPC_SRLI_W = 0x00448000, ++ OPC_SRLI_D = 0x00450000, ++ OPC_SRAI_W = 0x00488000, ++ OPC_SRAI_D = 0x00490000, ++ OPC_ROTRI_W = 0x004c8000, ++ OPC_ROTRI_D = 0x004d0000, ++ OPC_BSTRINS_W = 0x00600000, ++ OPC_BSTRPICK_W = 0x00608000, ++ OPC_BSTRINS_D = 0x00800000, ++ OPC_BSTRPICK_D = 0x00c00000, ++ OPC_SLTI = 0x02000000, ++ OPC_SLTUI = 0x02400000, ++ OPC_ADDI_W = 0x02800000, ++ OPC_ADDI_D = 0x02c00000, ++ OPC_CU52I_D = 0x03000000, ++ OPC_ANDI = 0x03400000, ++ OPC_ORI = 0x03800000, ++ OPC_XORI = 0x03c00000, ++ OPC_LU12I_W = 0x14000000, ++ OPC_CU32I_D = 0x16000000, ++ OPC_PCADDU2I = 0x18000000, ++ OPC_PCALAU12I = 0x1a000000, ++ OPC_PCADDU12I = 0x1c000000, ++ OPC_PCADDU18I = 0x1e000000, ++ OPC_LD_B = 0x28000000, ++ OPC_LD_H = 0x28400000, ++ OPC_LD_W = 0x28800000, ++ OPC_LD_D = 0x28c00000, ++ OPC_ST_B = 0x29000000, ++ OPC_ST_H = 0x29400000, ++ OPC_ST_W = 0x29800000, ++ OPC_ST_D = 0x29c00000, ++ OPC_LD_BU = 0x2a000000, ++ OPC_LD_HU = 0x2a400000, ++ OPC_LD_WU = 0x2a800000, ++ OPC_LDX_B = 0x38000000, ++ OPC_LDX_H = 0x38040000, ++ OPC_LDX_W = 0x38080000, ++ OPC_LDX_D = 0x380c0000, ++ OPC_STX_B = 0x38100000, ++ OPC_STX_H = 0x38140000, ++ OPC_STX_W = 0x38180000, ++ OPC_STX_D = 0x381c0000, ++ OPC_LDX_BU = 0x38200000, ++ OPC_LDX_HU = 0x38240000, ++ OPC_LDX_WU = 0x38280000, ++ OPC_DBAR = 0x38720000, ++ OPC_JIRL = 0x4c000000, ++ OPC_B = 0x50000000, ++ OPC_BL = 0x54000000, ++ OPC_BEQ = 0x58000000, ++ OPC_BNE = 0x5c000000, ++ OPC_BGT = 0x60000000, ++ OPC_BLE = 0x64000000, ++ OPC_BGTU = 0x68000000, ++ OPC_BLEU = 0x6c000000, ++} LoongArchInsn; ++ ++static int32_t __attribute__((unused)) ++encode_d_slot(LoongArchInsn opc, uint32_t d) ++{ ++ return opc | d; ++} ++ ++static int32_t __attribute__((unused)) ++encode_dj_slots(LoongArchInsn opc, uint32_t d, uint32_t j) ++{ ++ return opc | d | j << 5; ++} ++ ++static int32_t __attribute__((unused)) ++encode_djk_slots(LoongArchInsn opc, uint32_t d, uint32_t j, uint32_t k) ++{ ++ return opc | d | j << 5 | k << 10; ++} ++ ++static int32_t __attribute__((unused)) ++encode_djkm_slots(LoongArchInsn opc, uint32_t d, uint32_t j, uint32_t k, ++ uint32_t m) ++{ ++ return opc | d | j << 5 | k << 10 | m << 16; ++} ++ ++static int32_t __attribute__((unused)) ++encode_dk_slots(LoongArchInsn opc, uint32_t d, uint32_t k) ++{ ++ return opc | d | k << 10; ++} ++ ++static int32_t __attribute__((unused)) ++encode_dj_insn(LoongArchInsn opc, TCGReg d, TCGReg j) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ return encode_dj_slots(opc, d, j); ++} ++ ++static int32_t __attribute__((unused)) ++encode_djk_insn(LoongArchInsn opc, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ tcg_debug_assert(k >= 0 && k <= 0x1f); ++ return encode_djk_slots(opc, d, j, k); ++} ++ ++static int32_t __attribute__((unused)) ++encode_djsk12_insn(LoongArchInsn opc, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ tcg_debug_assert(sk12 >= -0x800 && sk12 <= 0x7ff); ++ return encode_djk_slots(opc, d, j, sk12 & 0xfff); ++} ++ ++static int32_t __attribute__((unused)) ++encode_djsk16_insn(LoongArchInsn opc, TCGReg d, TCGReg j, int32_t sk16) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ tcg_debug_assert(sk16 >= -0x8000 && sk16 <= 0x7fff); ++ return encode_djk_slots(opc, d, j, sk16 & 0xffff); ++} ++ ++static int32_t __attribute__((unused)) ++encode_djuk12_insn(LoongArchInsn opc, TCGReg d, TCGReg j, uint32_t uk12) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ tcg_debug_assert(uk12 <= 0xfff); ++ return encode_djk_slots(opc, d, j, uk12); ++} ++ ++static int32_t __attribute__((unused)) ++encode_djuk5_insn(LoongArchInsn opc, TCGReg d, TCGReg j, uint32_t uk5) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ tcg_debug_assert(uk5 <= 0x1f); ++ return encode_djk_slots(opc, d, j, uk5); ++} ++ ++static int32_t __attribute__((unused)) ++encode_djuk5um5_insn(LoongArchInsn opc, TCGReg d, TCGReg j, uint32_t uk5, ++ uint32_t um5) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ tcg_debug_assert(uk5 <= 0x1f); ++ tcg_debug_assert(um5 <= 0x1f); ++ return encode_djkm_slots(opc, d, j, uk5, um5); ++} ++ ++static int32_t __attribute__((unused)) ++encode_djuk6_insn(LoongArchInsn opc, TCGReg d, TCGReg j, uint32_t uk6) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ tcg_debug_assert(uk6 <= 0x3f); ++ return encode_djk_slots(opc, d, j, uk6); ++} ++ ++static int32_t __attribute__((unused)) ++encode_djuk6um6_insn(LoongArchInsn opc, TCGReg d, TCGReg j, uint32_t uk6, ++ uint32_t um6) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(j >= 0 && j <= 0x1f); ++ tcg_debug_assert(uk6 <= 0x3f); ++ tcg_debug_assert(um6 <= 0x3f); ++ return encode_djkm_slots(opc, d, j, uk6, um6); ++} ++ ++static int32_t __attribute__((unused)) ++encode_dsj20_insn(LoongArchInsn opc, TCGReg d, int32_t sj20) ++{ ++ tcg_debug_assert(d >= 0 && d <= 0x1f); ++ tcg_debug_assert(sj20 >= -0x80000 && sj20 <= 0x7ffff); ++ return encode_dj_slots(opc, d, sj20 & 0xfffff); ++} ++ ++static int32_t __attribute__((unused)) ++encode_sd10k16_insn(LoongArchInsn opc, int32_t sd10k16) ++{ ++ tcg_debug_assert(sd10k16 >= -0x2000000 && sd10k16 <= 0x1ffffff); ++ return encode_dk_slots(opc, (sd10k16 >> 16) & 0x3ff, sd10k16 & 0xffff); ++} ++ ++static int32_t __attribute__((unused)) ++encode_ud15_insn(LoongArchInsn opc, uint32_t ud15) ++{ ++ tcg_debug_assert(ud15 <= 0x7fff); ++ return encode_d_slot(opc, ud15); ++} ++ ++/* Emits the `clz.w d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_clz_w(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_CLZ_W, d, j)); ++} ++ ++/* Emits the `ctz.w d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ctz_w(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_CTZ_W, d, j)); ++} ++ ++/* Emits the `clz.d d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_clz_d(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_CLZ_D, d, j)); ++} ++ ++/* Emits the `ctz.d d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ctz_d(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_CTZ_D, d, j)); ++} ++ ++/* Emits the `revb.2h d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_revb_2h(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_REVB_2H, d, j)); ++} ++ ++/* Emits the `revb.2w d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_revb_2w(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_REVB_2W, d, j)); ++} ++ ++/* Emits the `revb.d d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_revb_d(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_REVB_D, d, j)); ++} ++ ++/* Emits the `sext.h d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sext_h(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_SEXT_H, d, j)); ++} ++ ++/* Emits the `sext.b d, j` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sext_b(TCGContext *s, TCGReg d, TCGReg j) ++{ ++ tcg_out32(s, encode_dj_insn(OPC_SEXT_B, d, j)); ++} ++ ++/* Emits the `add.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_add_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_ADD_W, d, j, k)); ++} ++ ++/* Emits the `add.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_add_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_ADD_D, d, j, k)); ++} ++ ++/* Emits the `sub.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sub_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SUB_W, d, j, k)); ++} ++ ++/* Emits the `sub.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sub_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SUB_D, d, j, k)); ++} ++ ++/* Emits the `slt d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_slt(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SLT, d, j, k)); ++} ++ ++/* Emits the `sltu d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sltu(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SLTU, d, j, k)); ++} ++ ++/* Emits the `maskeqz d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_maskeqz(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MASKEQZ, d, j, k)); ++} ++ ++/* Emits the `masknez d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_masknez(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MASKNEZ, d, j, k)); ++} ++ ++/* Emits the `nor d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_nor(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_NOR, d, j, k)); ++} ++ ++/* Emits the `and d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_and(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_AND, d, j, k)); ++} ++ ++/* Emits the `or d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_or(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_OR, d, j, k)); ++} ++ ++/* Emits the `xor d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_xor(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_XOR, d, j, k)); ++} ++ ++/* Emits the `orn d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_orn(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_ORN, d, j, k)); ++} ++ ++/* Emits the `andn d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_andn(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_ANDN, d, j, k)); ++} ++ ++/* Emits the `sll.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sll_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SLL_W, d, j, k)); ++} ++ ++/* Emits the `srl.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_srl_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SRL_W, d, j, k)); ++} ++ ++/* Emits the `sra.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sra_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SRA_W, d, j, k)); ++} ++ ++/* Emits the `sll.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sll_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SLL_D, d, j, k)); ++} ++ ++/* Emits the `srl.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_srl_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SRL_D, d, j, k)); ++} ++ ++/* Emits the `sra.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sra_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_SRA_D, d, j, k)); ++} ++ ++/* Emits the `rotr.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_rotr_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_ROTR_W, d, j, k)); ++} ++ ++/* Emits the `rotr.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_rotr_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_ROTR_D, d, j, k)); ++} ++ ++/* Emits the `mul.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mul_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MUL_W, d, j, k)); ++} ++ ++/* Emits the `mulh.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mulh_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MULH_W, d, j, k)); ++} ++ ++/* Emits the `mulh.wu d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mulh_wu(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MULH_WU, d, j, k)); ++} ++ ++/* Emits the `mul.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mul_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MUL_D, d, j, k)); ++} ++ ++/* Emits the `mulh.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mulh_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MULH_D, d, j, k)); ++} ++ ++/* Emits the `mulh.du d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mulh_du(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MULH_DU, d, j, k)); ++} ++ ++/* Emits the `div.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_div_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_DIV_W, d, j, k)); ++} ++ ++/* Emits the `mod.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mod_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MOD_W, d, j, k)); ++} ++ ++/* Emits the `div.wu d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_div_wu(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_DIV_WU, d, j, k)); ++} ++ ++/* Emits the `mod.wu d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mod_wu(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MOD_WU, d, j, k)); ++} ++ ++/* Emits the `div.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_div_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_DIV_D, d, j, k)); ++} ++ ++/* Emits the `mod.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mod_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MOD_D, d, j, k)); ++} ++ ++/* Emits the `div.du d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_div_du(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_DIV_DU, d, j, k)); ++} ++ ++/* Emits the `mod.du d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_mod_du(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_MOD_DU, d, j, k)); ++} ++ ++/* Emits the `slli.w d, j, uk5` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_slli_w(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk5) ++{ ++ tcg_out32(s, encode_djuk5_insn(OPC_SLLI_W, d, j, uk5)); ++} ++ ++/* Emits the `slli.d d, j, uk6` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_slli_d(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk6) ++{ ++ tcg_out32(s, encode_djuk6_insn(OPC_SLLI_D, d, j, uk6)); ++} ++ ++/* Emits the `srli.w d, j, uk5` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_srli_w(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk5) ++{ ++ tcg_out32(s, encode_djuk5_insn(OPC_SRLI_W, d, j, uk5)); ++} ++ ++/* Emits the `srli.d d, j, uk6` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_srli_d(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk6) ++{ ++ tcg_out32(s, encode_djuk6_insn(OPC_SRLI_D, d, j, uk6)); ++} ++ ++/* Emits the `srai.w d, j, uk5` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_srai_w(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk5) ++{ ++ tcg_out32(s, encode_djuk5_insn(OPC_SRAI_W, d, j, uk5)); ++} ++ ++/* Emits the `srai.d d, j, uk6` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_srai_d(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk6) ++{ ++ tcg_out32(s, encode_djuk6_insn(OPC_SRAI_D, d, j, uk6)); ++} ++ ++/* Emits the `rotri.w d, j, uk5` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_rotri_w(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk5) ++{ ++ tcg_out32(s, encode_djuk5_insn(OPC_ROTRI_W, d, j, uk5)); ++} ++ ++/* Emits the `rotri.d d, j, uk6` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_rotri_d(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk6) ++{ ++ tcg_out32(s, encode_djuk6_insn(OPC_ROTRI_D, d, j, uk6)); ++} ++ ++/* Emits the `bstrins.w d, j, uk5, um5` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bstrins_w(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk5, ++ uint32_t um5) ++{ ++ tcg_out32(s, encode_djuk5um5_insn(OPC_BSTRINS_W, d, j, uk5, um5)); ++} ++ ++/* Emits the `bstrpick.w d, j, uk5, um5` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bstrpick_w(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk5, ++ uint32_t um5) ++{ ++ tcg_out32(s, encode_djuk5um5_insn(OPC_BSTRPICK_W, d, j, uk5, um5)); ++} ++ ++/* Emits the `bstrins.d d, j, uk6, um6` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bstrins_d(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk6, ++ uint32_t um6) ++{ ++ tcg_out32(s, encode_djuk6um6_insn(OPC_BSTRINS_D, d, j, uk6, um6)); ++} ++ ++/* Emits the `bstrpick.d d, j, uk6, um6` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bstrpick_d(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk6, ++ uint32_t um6) ++{ ++ tcg_out32(s, encode_djuk6um6_insn(OPC_BSTRPICK_D, d, j, uk6, um6)); ++} ++ ++/* Emits the `slti d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_slti(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_SLTI, d, j, sk12)); ++} ++ ++/* Emits the `sltui d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_sltui(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_SLTUI, d, j, sk12)); ++} ++ ++/* Emits the `addi.w d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_addi_w(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_ADDI_W, d, j, sk12)); ++} ++ ++/* Emits the `addi.d d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_addi_d(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_ADDI_D, d, j, sk12)); ++} ++ ++/* Emits the `cu52i.d d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_cu52i_d(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_CU52I_D, d, j, sk12)); ++} ++ ++/* Emits the `andi d, j, uk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_andi(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk12) ++{ ++ tcg_out32(s, encode_djuk12_insn(OPC_ANDI, d, j, uk12)); ++} ++ ++/* Emits the `ori d, j, uk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ori(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk12) ++{ ++ tcg_out32(s, encode_djuk12_insn(OPC_ORI, d, j, uk12)); ++} ++ ++/* Emits the `xori d, j, uk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_xori(TCGContext *s, TCGReg d, TCGReg j, uint32_t uk12) ++{ ++ tcg_out32(s, encode_djuk12_insn(OPC_XORI, d, j, uk12)); ++} ++ ++/* Emits the `lu12i.w d, sj20` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_lu12i_w(TCGContext *s, TCGReg d, int32_t sj20) ++{ ++ tcg_out32(s, encode_dsj20_insn(OPC_LU12I_W, d, sj20)); ++} ++ ++/* Emits the `cu32i.d d, sj20` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_cu32i_d(TCGContext *s, TCGReg d, int32_t sj20) ++{ ++ tcg_out32(s, encode_dsj20_insn(OPC_CU32I_D, d, sj20)); ++} ++ ++/* Emits the `pcaddu2i d, sj20` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_pcaddu2i(TCGContext *s, TCGReg d, int32_t sj20) ++{ ++ tcg_out32(s, encode_dsj20_insn(OPC_PCADDU2I, d, sj20)); ++} ++ ++/* Emits the `pcalau12i d, sj20` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_pcalau12i(TCGContext *s, TCGReg d, int32_t sj20) ++{ ++ tcg_out32(s, encode_dsj20_insn(OPC_PCALAU12I, d, sj20)); ++} ++ ++/* Emits the `pcaddu12i d, sj20` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_pcaddu12i(TCGContext *s, TCGReg d, int32_t sj20) ++{ ++ tcg_out32(s, encode_dsj20_insn(OPC_PCADDU12I, d, sj20)); ++} ++ ++/* Emits the `pcaddu18i d, sj20` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_pcaddu18i(TCGContext *s, TCGReg d, int32_t sj20) ++{ ++ tcg_out32(s, encode_dsj20_insn(OPC_PCADDU18I, d, sj20)); ++} ++ ++/* Emits the `ld.b d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ld_b(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_LD_B, d, j, sk12)); ++} ++ ++/* Emits the `ld.h d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ld_h(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_LD_H, d, j, sk12)); ++} ++ ++/* Emits the `ld.w d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ld_w(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_LD_W, d, j, sk12)); ++} ++ ++/* Emits the `ld.d d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ld_d(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_LD_D, d, j, sk12)); ++} ++ ++/* Emits the `st.b d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_st_b(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_ST_B, d, j, sk12)); ++} ++ ++/* Emits the `st.h d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_st_h(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_ST_H, d, j, sk12)); ++} ++ ++/* Emits the `st.w d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_st_w(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_ST_W, d, j, sk12)); ++} ++ ++/* Emits the `st.d d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_st_d(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_ST_D, d, j, sk12)); ++} ++ ++/* Emits the `ld.bu d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ld_bu(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_LD_BU, d, j, sk12)); ++} ++ ++/* Emits the `ld.hu d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ld_hu(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_LD_HU, d, j, sk12)); ++} ++ ++/* Emits the `ld.wu d, j, sk12` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ld_wu(TCGContext *s, TCGReg d, TCGReg j, int32_t sk12) ++{ ++ tcg_out32(s, encode_djsk12_insn(OPC_LD_WU, d, j, sk12)); ++} ++ ++/* Emits the `ldx.b d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ldx_b(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_LDX_B, d, j, k)); ++} ++ ++/* Emits the `ldx.h d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ldx_h(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_LDX_H, d, j, k)); ++} ++ ++/* Emits the `ldx.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ldx_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_LDX_W, d, j, k)); ++} ++ ++/* Emits the `ldx.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ldx_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_LDX_D, d, j, k)); ++} ++ ++/* Emits the `stx.b d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_stx_b(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_STX_B, d, j, k)); ++} ++ ++/* Emits the `stx.h d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_stx_h(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_STX_H, d, j, k)); ++} ++ ++/* Emits the `stx.w d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_stx_w(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_STX_W, d, j, k)); ++} ++ ++/* Emits the `stx.d d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_stx_d(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_STX_D, d, j, k)); ++} ++ ++/* Emits the `ldx.bu d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ldx_bu(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_LDX_BU, d, j, k)); ++} ++ ++/* Emits the `ldx.hu d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ldx_hu(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_LDX_HU, d, j, k)); ++} ++ ++/* Emits the `ldx.wu d, j, k` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ldx_wu(TCGContext *s, TCGReg d, TCGReg j, TCGReg k) ++{ ++ tcg_out32(s, encode_djk_insn(OPC_LDX_WU, d, j, k)); ++} ++ ++/* Emits the `dbar ud15` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_dbar(TCGContext *s, uint32_t ud15) ++{ ++ tcg_out32(s, encode_ud15_insn(OPC_DBAR, ud15)); ++} ++ ++/* Emits the `jirl d, j, sk16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_jirl(TCGContext *s, TCGReg d, TCGReg j, int32_t sk16) ++{ ++ tcg_out32(s, encode_djsk16_insn(OPC_JIRL, d, j, sk16)); ++} ++ ++/* Emits the `b sd10k16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_b(TCGContext *s, int32_t sd10k16) ++{ ++ tcg_out32(s, encode_sd10k16_insn(OPC_B, sd10k16)); ++} ++ ++/* Emits the `bl sd10k16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bl(TCGContext *s, int32_t sd10k16) ++{ ++ tcg_out32(s, encode_sd10k16_insn(OPC_BL, sd10k16)); ++} ++ ++/* Emits the `beq d, j, sk16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_beq(TCGContext *s, TCGReg d, TCGReg j, int32_t sk16) ++{ ++ tcg_out32(s, encode_djsk16_insn(OPC_BEQ, d, j, sk16)); ++} ++ ++/* Emits the `bne d, j, sk16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bne(TCGContext *s, TCGReg d, TCGReg j, int32_t sk16) ++{ ++ tcg_out32(s, encode_djsk16_insn(OPC_BNE, d, j, sk16)); ++} ++ ++/* Emits the `bgt d, j, sk16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bgt(TCGContext *s, TCGReg d, TCGReg j, int32_t sk16) ++{ ++ tcg_out32(s, encode_djsk16_insn(OPC_BGT, d, j, sk16)); ++} ++ ++/* Emits the `ble d, j, sk16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_ble(TCGContext *s, TCGReg d, TCGReg j, int32_t sk16) ++{ ++ tcg_out32(s, encode_djsk16_insn(OPC_BLE, d, j, sk16)); ++} ++ ++/* Emits the `bgtu d, j, sk16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bgtu(TCGContext *s, TCGReg d, TCGReg j, int32_t sk16) ++{ ++ tcg_out32(s, encode_djsk16_insn(OPC_BGTU, d, j, sk16)); ++} ++ ++/* Emits the `bleu d, j, sk16` instruction. */ ++static void __attribute__((unused)) ++tcg_out_opc_bleu(TCGContext *s, TCGReg d, TCGReg j, int32_t sk16) ++{ ++ tcg_out32(s, encode_djsk16_insn(OPC_BLEU, d, j, sk16)); ++} ++/* End of generated code. */ +diff --git a/tcg/loongarch64/tcg-target-con-set.h b/tcg/loongarch64/tcg-target-con-set.h +new file mode 100644 +index 0000000000..7b0297034f +--- /dev/null ++++ b/tcg/loongarch64/tcg-target-con-set.h +@@ -0,0 +1,39 @@ ++/* ++ * Define LoongArch target-specific constraint sets. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++/* ++ * C_On_Im(...) defines a constraint set with outputs and inputs. ++ * Each operand should be a sequence of constraint letters as defined by ++ * tcg-target-con-str.h; the constraint combination is inclusive or. ++ */ ++C_O0_I1(r) ++C_O0_I2(rZ, r) ++C_O0_I2(rZ, rZ) ++C_O0_I2(LZ, L) ++C_O1_I1(r, r) ++C_O1_I1(r, L) ++C_O1_I2(r, r, rC) ++C_O1_I2(r, r, ri) ++C_O1_I2(r, r, rI) ++C_O1_I2(r, r, rU) ++C_O1_I2(r, r, rW) ++C_O1_I2(r, r, rZ) ++C_O1_I2(r, 0, rZ) ++C_O1_I2(r, rZ, rN) ++C_O1_I2(r, rZ, rZ) +diff --git a/tcg/loongarch64/tcg-target-con-str.h b/tcg/loongarch64/tcg-target-con-str.h +new file mode 100644 +index 0000000000..b105f5ebd8 +--- /dev/null ++++ b/tcg/loongarch64/tcg-target-con-str.h +@@ -0,0 +1,36 @@ ++/* ++ * Define LoongArch target-specific operand constraints. ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++/* ++ * Define constraint letters for register sets: ++ * REGS(letter, register_mask) ++ */ ++REGS('r', ALL_GENERAL_REGS) ++REGS('L', ALL_GENERAL_REGS & ~SOFTMMU_RESERVE_REGS) ++ ++/* ++ * Define constraint letters for constants: ++ * CONST(letter, TCG_CT_CONST_* bit set) ++ */ ++CONST('I', TCG_CT_CONST_S12) ++CONST('N', TCG_CT_CONST_N12) ++CONST('U', TCG_CT_CONST_U12) ++CONST('Z', TCG_CT_CONST_ZERO) ++CONST('C', TCG_CT_CONST_C12) ++CONST('W', TCG_CT_CONST_WSZ) +diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc +new file mode 100644 +index 0000000000..0b28b30002 +--- /dev/null ++++ b/tcg/loongarch64/tcg-target.c.inc +@@ -0,0 +1,1727 @@ ++/* ++ * Tiny Code Generator for QEMU ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#include "../tcg-ldst.c.inc" ++ ++#ifdef CONFIG_DEBUG_TCG ++static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { ++ "zero", ++ "ra", ++ "tp", ++ "sp", ++ "a0", ++ "a1", ++ "a2", ++ "a3", ++ "a4", ++ "a5", ++ "a6", ++ "a7", ++ "t0", ++ "t1", ++ "t2", ++ "t3", ++ "t4", ++ "t5", ++ "t6", ++ "t7", ++ "t8", ++ "r21", /* reserved in the LP64* ABI, hence no ABI name */ ++ "s9", ++ "s0", ++ "s1", ++ "s2", ++ "s3", ++ "s4", ++ "s5", ++ "s6", ++ "s7", ++ "s8" ++}; ++#endif ++ ++static const int tcg_target_reg_alloc_order[] = { ++ /* Registers preserved across calls */ ++ /* TCG_REG_S0 reserved for TCG_AREG0 */ ++ TCG_REG_S1, ++ TCG_REG_S2, ++ TCG_REG_S3, ++ TCG_REG_S4, ++ TCG_REG_S5, ++ TCG_REG_S6, ++ TCG_REG_S7, ++ TCG_REG_S8, ++ TCG_REG_S9, ++ ++ /* Registers (potentially) clobbered across calls */ ++ TCG_REG_T0, ++ TCG_REG_T1, ++ TCG_REG_T2, ++ TCG_REG_T3, ++ TCG_REG_T4, ++ TCG_REG_T5, ++ TCG_REG_T6, ++ TCG_REG_T7, ++ TCG_REG_T8, ++ ++ /* Argument registers, opposite order of allocation. */ ++ TCG_REG_A7, ++ TCG_REG_A6, ++ TCG_REG_A5, ++ TCG_REG_A4, ++ TCG_REG_A3, ++ TCG_REG_A2, ++ TCG_REG_A1, ++ TCG_REG_A0, ++}; ++ ++static const int tcg_target_call_iarg_regs[] = { ++ TCG_REG_A0, ++ TCG_REG_A1, ++ TCG_REG_A2, ++ TCG_REG_A3, ++ TCG_REG_A4, ++ TCG_REG_A5, ++ TCG_REG_A6, ++ TCG_REG_A7, ++}; ++ ++static const int tcg_target_call_oarg_regs[] = { ++ TCG_REG_A0, ++ TCG_REG_A1, ++}; ++ ++#ifndef CONFIG_SOFTMMU ++#define USE_GUEST_BASE (guest_base != 0) ++#define TCG_GUEST_BASE_REG TCG_REG_S1 ++#endif ++ ++#define TCG_CT_CONST_ZERO 0x100 ++#define TCG_CT_CONST_S12 0x200 ++#define TCG_CT_CONST_N12 0x400 ++#define TCG_CT_CONST_U12 0x800 ++#define TCG_CT_CONST_C12 0x1000 ++#define TCG_CT_CONST_WSZ 0x2000 ++ ++#define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32) ++/* ++ * For softmmu, we need to avoid conflicts with the first 5 ++ * argument registers to call the helper. Some of these are ++ * also used for the tlb lookup. ++ */ ++#ifdef CONFIG_SOFTMMU ++#define SOFTMMU_RESERVE_REGS MAKE_64BIT_MASK(TCG_REG_A0, 5) ++#else ++#define SOFTMMU_RESERVE_REGS 0 ++#endif ++ ++static inline tcg_target_long sextreg(tcg_target_long val, int pos, int len) ++{ ++ return sextract64(val, pos, len); ++} ++ ++/* test if a constant matches the constraint */ ++static bool tcg_target_const_match(int64_t val, TCGType type, int ct) ++{ ++ if (ct & TCG_CT_CONST) { ++ return true; ++ } ++ if ((ct & TCG_CT_CONST_ZERO) && val == 0) { ++ return true; ++ } ++ if ((ct & TCG_CT_CONST_S12) && val == sextreg(val, 0, 12)) { ++ return true; ++ } ++ if ((ct & TCG_CT_CONST_N12) && -val == sextreg(-val, 0, 12)) { ++ return true; ++ } ++ if ((ct & TCG_CT_CONST_U12) && val >= 0 && val <= 0xfff) { ++ return true; ++ } ++ if ((ct & TCG_CT_CONST_C12) && ~val >= 0 && ~val <= 0xfff) { ++ return true; ++ } ++ if ((ct & TCG_CT_CONST_WSZ) && val == (type == TCG_TYPE_I32 ? 32 : 64)) { ++ return true; ++ } ++ return false; ++} ++ ++/* ++ * Relocations ++ */ ++ ++/* ++ * Relocation records defined in LoongArch ELF psABI v1.00 is way too ++ * complicated; a whopping stack machine is needed to stuff the fields, at ++ * the very least one SOP_PUSH and one SOP_POP (of the correct format) are ++ * needed. ++ * ++ * Hence, define our own simpler relocation types. Numbers are chosen as to ++ * not collide with potential future additions to the true ELF relocation ++ * type enum. ++ */ ++ ++/* Field Sk16, shifted right by 2; suitable for conditional jumps */ ++#define R_LOONGARCH_BR_SK16 256 ++/* Field Sd10k16, shifted right by 2; suitable for B and BL */ ++#define R_LOONGARCH_BR_SD10K16 257 ++ ++static bool reloc_br_sk16(tcg_insn_unit *src_rw, const tcg_insn_unit *target) ++{ ++ const tcg_insn_unit *src_rx = tcg_splitwx_to_rx(src_rw); ++ intptr_t offset = (intptr_t)target - (intptr_t)src_rx; ++ ++ tcg_debug_assert((offset & 3) == 0); ++ offset >>= 2; ++ if (offset == sextreg(offset, 0, 16)) { ++ *src_rw = deposit64(*src_rw, 10, 16, offset); ++ return true; ++ } ++ ++ return false; ++} ++ ++static bool reloc_br_sd10k16(tcg_insn_unit *src_rw, ++ const tcg_insn_unit *target) ++{ ++ const tcg_insn_unit *src_rx = tcg_splitwx_to_rx(src_rw); ++ intptr_t offset = (intptr_t)target - (intptr_t)src_rx; ++ ++ tcg_debug_assert((offset & 3) == 0); ++ offset >>= 2; ++ if (offset == sextreg(offset, 0, 26)) { ++ *src_rw = deposit64(*src_rw, 0, 10, offset >> 16); /* slot d10 */ ++ *src_rw = deposit64(*src_rw, 10, 16, offset); /* slot k16 */ ++ return true; ++ } ++ ++ return false; ++} ++ ++static bool patch_reloc(tcg_insn_unit *code_ptr, int type, intptr_t value, ++ intptr_t addend) ++{ ++ tcg_debug_assert(addend == 0); ++ switch (type) { ++ case R_LOONGARCH_BR_SK16: ++ return reloc_br_sk16(code_ptr, (tcg_insn_unit *)value); ++ case R_LOONGARCH_BR_SD10K16: ++ return reloc_br_sd10k16(code_ptr, (tcg_insn_unit *)value); ++ default: ++ g_assert_not_reached(); ++ } ++} ++ ++#include "tcg-insn-defs.c.inc" ++ ++/* ++ * TCG intrinsics ++ */ ++ ++static void tcg_out_mb(TCGContext *s, TCGArg a0) ++{ ++ /* Baseline LoongArch only has the full barrier, unfortunately. */ ++ tcg_out_opc_dbar(s, 0); ++} ++ ++static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg) ++{ ++ if (ret == arg) { ++ return true; ++ } ++ switch (type) { ++ case TCG_TYPE_I32: ++ case TCG_TYPE_I64: ++ /* ++ * Conventional register-register move used in LoongArch is ++ * `or dst, src, zero`. ++ */ ++ tcg_out_opc_or(s, ret, arg, TCG_REG_ZERO); ++ break; ++ default: ++ g_assert_not_reached(); ++ } ++ return true; ++} ++ ++static bool imm_part_needs_loading(bool high_bits_are_ones, ++ tcg_target_long part) ++{ ++ if (high_bits_are_ones) { ++ return part != -1; ++ } else { ++ return part != 0; ++ } ++} ++ ++/* Loads a 32-bit immediate into rd, sign-extended. */ ++static void tcg_out_movi_i32(TCGContext *s, TCGReg rd, int32_t val) ++{ ++ tcg_target_long lo = sextreg(val, 0, 12); ++ tcg_target_long hi12 = sextreg(val, 12, 20); ++ ++ /* Single-instruction cases. */ ++ if (lo == val) { ++ /* val fits in simm12: addi.w rd, zero, val */ ++ tcg_out_opc_addi_w(s, rd, TCG_REG_ZERO, val); ++ return; ++ } ++ if (0x800 <= val && val <= 0xfff) { ++ /* val fits in uimm12: ori rd, zero, val */ ++ tcg_out_opc_ori(s, rd, TCG_REG_ZERO, val); ++ return; ++ } ++ ++ /* High bits must be set; load with lu12i.w + optional ori. */ ++ tcg_out_opc_lu12i_w(s, rd, hi12); ++ if (lo != 0) { ++ tcg_out_opc_ori(s, rd, rd, lo & 0xfff); ++ } ++} ++ ++static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd, ++ tcg_target_long val) ++{ ++ /* ++ * LoongArch conventionally loads 64-bit immediates in at most 4 steps, ++ * with dedicated instructions for filling the respective bitfields ++ * below: ++ * ++ * 6 5 4 3 ++ * 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 ++ * +-----------------------+---------------------------------------+... ++ * | hi52 | hi32 | ++ * +-----------------------+---------------------------------------+... ++ * 3 2 1 ++ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 ++ * ...+-------------------------------------+-------------------------+ ++ * | hi12 | lo | ++ * ...+-------------------------------------+-------------------------+ ++ * ++ * Check if val belong to one of the several fast cases, before falling ++ * back to the slow path. ++ */ ++ ++ intptr_t pc_offset; ++ tcg_target_long val_lo, val_hi, pc_hi, offset_hi; ++ tcg_target_long hi32, hi52; ++ bool rd_high_bits_are_ones; ++ ++ /* Value fits in signed i32. */ ++ if (type == TCG_TYPE_I32 || val == (int32_t)val) { ++ tcg_out_movi_i32(s, rd, val); ++ return; ++ } ++ ++ /* PC-relative cases. */ ++ pc_offset = tcg_pcrel_diff(s, (void *)val); ++ if (pc_offset == sextreg(pc_offset, 0, 22) && (pc_offset & 3) == 0) { ++ /* Single pcaddu2i. */ ++ tcg_out_opc_pcaddu2i(s, rd, pc_offset >> 2); ++ return; ++ } ++ ++ if (pc_offset == (int32_t)pc_offset) { ++ /* Offset within 32 bits; load with pcalau12i + ori. */ ++ val_lo = sextreg(val, 0, 12); ++ val_hi = val >> 12; ++ pc_hi = (val - pc_offset) >> 12; ++ offset_hi = val_hi - pc_hi; ++ ++ tcg_debug_assert(offset_hi == sextreg(offset_hi, 0, 20)); ++ tcg_out_opc_pcalau12i(s, rd, offset_hi); ++ if (val_lo != 0) { ++ tcg_out_opc_ori(s, rd, rd, val_lo & 0xfff); ++ } ++ return; ++ } ++ ++ hi32 = sextreg(val, 32, 20); ++ hi52 = sextreg(val, 52, 12); ++ ++ /* Single cu52i.d case. */ ++ if (ctz64(val) >= 52) { ++ tcg_out_opc_cu52i_d(s, rd, TCG_REG_ZERO, hi52); ++ return; ++ } ++ ++ /* Slow path. Initialize the low 32 bits, then concat high bits. */ ++ tcg_out_movi_i32(s, rd, val); ++ rd_high_bits_are_ones = (int32_t)val < 0; ++ ++ if (imm_part_needs_loading(rd_high_bits_are_ones, hi32)) { ++ tcg_out_opc_cu32i_d(s, rd, hi32); ++ rd_high_bits_are_ones = hi32 < 0; ++ } ++ ++ if (imm_part_needs_loading(rd_high_bits_are_ones, hi52)) { ++ tcg_out_opc_cu52i_d(s, rd, rd, hi52); ++ } ++} ++ ++static void tcg_out_ext8u(TCGContext *s, TCGReg ret, TCGReg arg) ++{ ++ tcg_out_opc_andi(s, ret, arg, 0xff); ++} ++ ++static void tcg_out_ext16u(TCGContext *s, TCGReg ret, TCGReg arg) ++{ ++ tcg_out_opc_bstrpick_w(s, ret, arg, 0, 15); ++} ++ ++static void tcg_out_ext32u(TCGContext *s, TCGReg ret, TCGReg arg) ++{ ++ tcg_out_opc_bstrpick_d(s, ret, arg, 0, 31); ++} ++ ++static void tcg_out_ext8s(TCGContext *s, TCGReg ret, TCGReg arg) ++{ ++ tcg_out_opc_sext_b(s, ret, arg); ++} ++ ++static void tcg_out_ext16s(TCGContext *s, TCGReg ret, TCGReg arg) ++{ ++ tcg_out_opc_sext_h(s, ret, arg); ++} ++ ++static void tcg_out_ext32s(TCGContext *s, TCGReg ret, TCGReg arg) ++{ ++ tcg_out_opc_addi_w(s, ret, arg, 0); ++} ++ ++static void tcg_out_clzctz(TCGContext *s, LoongArchInsn opc, TCGReg a0, ++ TCGReg a1, TCGReg a2, bool c2, bool is_32bit) ++{ ++ if (c2) { ++ /* ++ * Fast path: semantics already satisfied due to constraint and ++ * insn behavior, single instruction is enough. ++ */ ++ tcg_debug_assert(a2 == (is_32bit ? 32 : 64)); ++ /* all clz/ctz insns belong to DJ-format */ ++ tcg_out32(s, encode_dj_insn(opc, a0, a1)); ++ return; ++ } ++ ++ tcg_out32(s, encode_dj_insn(opc, TCG_REG_TMP0, a1)); ++ /* a0 = a1 ? REG_TMP0 : a2 */ ++ tcg_out_opc_maskeqz(s, TCG_REG_TMP0, TCG_REG_TMP0, a1); ++ tcg_out_opc_masknez(s, a0, a2, a1); ++ tcg_out_opc_or(s, a0, TCG_REG_TMP0, a0); ++} ++ ++static void tcg_out_setcond(TCGContext *s, TCGCond cond, TCGReg ret, ++ TCGReg arg1, TCGReg arg2, bool c2) ++{ ++ TCGReg tmp; ++ ++ if (c2) { ++ tcg_debug_assert(arg2 == 0); ++ } ++ ++ switch (cond) { ++ case TCG_COND_EQ: ++ if (c2) { ++ tmp = arg1; ++ } else { ++ tcg_out_opc_sub_d(s, ret, arg1, arg2); ++ tmp = ret; ++ } ++ tcg_out_opc_sltui(s, ret, tmp, 1); ++ break; ++ case TCG_COND_NE: ++ if (c2) { ++ tmp = arg1; ++ } else { ++ tcg_out_opc_sub_d(s, ret, arg1, arg2); ++ tmp = ret; ++ } ++ tcg_out_opc_sltu(s, ret, TCG_REG_ZERO, tmp); ++ break; ++ case TCG_COND_LT: ++ tcg_out_opc_slt(s, ret, arg1, arg2); ++ break; ++ case TCG_COND_GE: ++ tcg_out_opc_slt(s, ret, arg1, arg2); ++ tcg_out_opc_xori(s, ret, ret, 1); ++ break; ++ case TCG_COND_LE: ++ tcg_out_setcond(s, TCG_COND_GE, ret, arg2, arg1, false); ++ break; ++ case TCG_COND_GT: ++ tcg_out_setcond(s, TCG_COND_LT, ret, arg2, arg1, false); ++ break; ++ case TCG_COND_LTU: ++ tcg_out_opc_sltu(s, ret, arg1, arg2); ++ break; ++ case TCG_COND_GEU: ++ tcg_out_opc_sltu(s, ret, arg1, arg2); ++ tcg_out_opc_xori(s, ret, ret, 1); ++ break; ++ case TCG_COND_LEU: ++ tcg_out_setcond(s, TCG_COND_GEU, ret, arg2, arg1, false); ++ break; ++ case TCG_COND_GTU: ++ tcg_out_setcond(s, TCG_COND_LTU, ret, arg2, arg1, false); ++ break; ++ default: ++ g_assert_not_reached(); ++ break; ++ } ++} ++ ++/* ++ * Branch helpers ++ */ ++ ++static const struct { ++ LoongArchInsn op; ++ bool swap; ++} tcg_brcond_to_loongarch[] = { ++ [TCG_COND_EQ] = { OPC_BEQ, false }, [TCG_COND_NE] = { OPC_BNE, false }, ++ [TCG_COND_LT] = { OPC_BGT, true }, [TCG_COND_GE] = { OPC_BLE, true }, ++ [TCG_COND_LE] = { OPC_BLE, false }, [TCG_COND_GT] = { OPC_BGT, false }, ++ [TCG_COND_LTU] = { OPC_BGTU, true }, [TCG_COND_GEU] = { OPC_BLEU, true }, ++ [TCG_COND_LEU] = { OPC_BLEU, false }, [TCG_COND_GTU] = { OPC_BGTU, false } ++}; ++ ++static void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGReg arg1, ++ TCGReg arg2, TCGLabel *l) ++{ ++ LoongArchInsn op = tcg_brcond_to_loongarch[cond].op; ++ ++ tcg_debug_assert(op != 0); ++ ++ if (tcg_brcond_to_loongarch[cond].swap) { ++ TCGReg t = arg1; ++ arg1 = arg2; ++ arg2 = t; ++ } ++ ++ /* all conditional branch insns belong to DJSk16-format */ ++ tcg_out_reloc(s, s->code_ptr, R_LOONGARCH_BR_SK16, l, 0); ++ tcg_out32(s, encode_djsk16_insn(op, arg1, arg2, 0)); ++} ++ ++static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *arg, ++ bool tail) ++{ ++ TCGReg link = tail ? TCG_REG_ZERO : TCG_REG_RA; ++ ptrdiff_t offset = tcg_pcrel_diff(s, arg); ++ ++ tcg_debug_assert((offset & 3) == 0); ++ if (offset == sextreg(offset, 0, 28)) { ++ /* short jump: +/- 256MiB */ ++ if (tail) { ++ tcg_out_opc_b(s, offset >> 2); ++ } else { ++ tcg_out_opc_bl(s, offset >> 2); ++ } ++ } else if (offset == sextreg(offset, 0, 38)) { ++ /* long jump: +/- 256GiB */ ++ tcg_target_long lo = sextreg(offset, 0, 18); ++ tcg_target_long hi = offset - lo; ++ tcg_out_opc_pcaddu18i(s, TCG_REG_TMP0, hi >> 18); ++ tcg_out_opc_jirl(s, link, TCG_REG_TMP0, lo >> 2); ++ } else { ++ /* far jump: 64-bit */ ++ tcg_target_long lo = sextreg((tcg_target_long)arg, 0, 18); ++ tcg_target_long hi = (tcg_target_long)arg - lo; ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, hi); ++ tcg_out_opc_jirl(s, link, TCG_REG_TMP0, lo >> 2); ++ } ++} ++ ++static void tcg_out_call(TCGContext *s, const tcg_insn_unit *arg) ++{ ++ tcg_out_call_int(s, arg, false); ++} ++ ++/* ++ * Load/store helpers ++ */ ++ ++static void tcg_out_ldst(TCGContext *s, LoongArchInsn opc, TCGReg data, ++ TCGReg addr, intptr_t offset) ++{ ++ intptr_t imm12 = sextreg(offset, 0, 12); ++ ++ if (offset != imm12) { ++ intptr_t diff = offset - (uintptr_t)s->code_ptr; ++ ++ if (addr == TCG_REG_ZERO && diff == (int32_t)diff) { ++ imm12 = sextreg(diff, 0, 12); ++ tcg_out_opc_pcaddu12i(s, TCG_REG_TMP2, (diff - imm12) >> 12); ++ } else { ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP2, offset - imm12); ++ if (addr != TCG_REG_ZERO) { ++ tcg_out_opc_add_d(s, TCG_REG_TMP2, TCG_REG_TMP2, addr); ++ } ++ } ++ addr = TCG_REG_TMP2; ++ } ++ ++ switch (opc) { ++ case OPC_LD_B: ++ case OPC_LD_BU: ++ case OPC_LD_H: ++ case OPC_LD_HU: ++ case OPC_LD_W: ++ case OPC_LD_WU: ++ case OPC_LD_D: ++ case OPC_ST_B: ++ case OPC_ST_H: ++ case OPC_ST_W: ++ case OPC_ST_D: ++ tcg_out32(s, encode_djsk12_insn(opc, data, addr, imm12)); ++ break; ++ default: ++ g_assert_not_reached(); ++ } ++} ++ ++static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1, ++ intptr_t arg2) ++{ ++ bool is_32bit = type == TCG_TYPE_I32; ++ tcg_out_ldst(s, is_32bit ? OPC_LD_W : OPC_LD_D, arg, arg1, arg2); ++} ++ ++static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1, ++ intptr_t arg2) ++{ ++ bool is_32bit = type == TCG_TYPE_I32; ++ tcg_out_ldst(s, is_32bit ? OPC_ST_W : OPC_ST_D, arg, arg1, arg2); ++} ++ ++static bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val, TCGReg base, ++ intptr_t ofs) ++{ ++ if (val == 0) { ++ tcg_out_st(s, type, TCG_REG_ZERO, base, ofs); ++ return true; ++ } ++ return false; ++} ++ ++/* ++ * Load/store helpers for SoftMMU, and qemu_ld/st implementations ++ */ ++ ++#if defined(CONFIG_SOFTMMU) ++/* ++ * helper signature: helper_ret_ld_mmu(CPUState *env, target_ulong addr, ++ * MemOpIdx oi, uintptr_t ra) ++ */ ++static void *const qemu_ld_helpers[4] = { ++ [MO_8] = helper_ret_ldub_mmu, ++ [MO_16] = helper_le_lduw_mmu, ++ [MO_32] = helper_le_ldul_mmu, ++ [MO_64] = helper_le_ldq_mmu, ++}; ++ ++/* ++ * helper signature: helper_ret_st_mmu(CPUState *env, target_ulong addr, ++ * uintxx_t val, MemOpIdx oi, ++ * uintptr_t ra) ++ */ ++static void *const qemu_st_helpers[4] = { ++ [MO_8] = helper_ret_stb_mmu, ++ [MO_16] = helper_le_stw_mmu, ++ [MO_32] = helper_le_stl_mmu, ++ [MO_64] = helper_le_stq_mmu, ++}; ++ ++/* We expect to use a 12-bit negative offset from ENV. */ ++QEMU_BUILD_BUG_ON(TLB_MASK_TABLE_OFS(0) > 0); ++QEMU_BUILD_BUG_ON(TLB_MASK_TABLE_OFS(0) < -(1 << 11)); ++ ++static bool tcg_out_goto(TCGContext *s, const tcg_insn_unit *target) ++{ ++ tcg_out_opc_b(s, 0); ++ return reloc_br_sd10k16(s->code_ptr - 1, target); ++} ++ ++/* ++ * Emits common code for TLB addend lookup, that eventually loads the ++ * addend in TCG_REG_TMP2. ++ */ ++static void tcg_out_tlb_load(TCGContext *s, TCGReg addrl, MemOpIdx oi, ++ tcg_insn_unit **label_ptr, bool is_load) ++{ ++ MemOp opc = get_memop(oi); ++ unsigned s_bits = opc & MO_SIZE; ++ unsigned a_bits = get_alignment_bits(opc); ++ tcg_target_long compare_mask; ++ int mem_index = get_mmuidx(oi); ++ int fast_ofs = TLB_MASK_TABLE_OFS(mem_index); ++ int mask_ofs = fast_ofs + offsetof(CPUTLBDescFast, mask); ++ int table_ofs = fast_ofs + offsetof(CPUTLBDescFast, table); ++ ++ tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP0, TCG_AREG0, mask_ofs); ++ tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_AREG0, table_ofs); ++ ++ tcg_out_opc_srli_d(s, TCG_REG_TMP2, addrl, ++ TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS); ++ tcg_out_opc_and(s, TCG_REG_TMP2, TCG_REG_TMP2, TCG_REG_TMP0); ++ tcg_out_opc_add_d(s, TCG_REG_TMP2, TCG_REG_TMP2, TCG_REG_TMP1); ++ ++ /* Load the tlb comparator and the addend. */ ++ tcg_out_ld(s, TCG_TYPE_TL, TCG_REG_TMP0, TCG_REG_TMP2, ++ is_load ? offsetof(CPUTLBEntry, addr_read) ++ : offsetof(CPUTLBEntry, addr_write)); ++ tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP2, TCG_REG_TMP2, ++ offsetof(CPUTLBEntry, addend)); ++ ++ /* We don't support unaligned accesses. */ ++ if (a_bits < s_bits) { ++ a_bits = s_bits; ++ } ++ /* Clear the non-page, non-alignment bits from the address. */ ++ compare_mask = (tcg_target_long)TARGET_PAGE_MASK | ((1 << a_bits) - 1); ++ tcg_out_movi(s, TCG_TYPE_TL, TCG_REG_TMP1, compare_mask); ++ tcg_out_opc_and(s, TCG_REG_TMP1, TCG_REG_TMP1, addrl); ++ ++ /* Compare masked address with the TLB entry. */ ++ label_ptr[0] = s->code_ptr; ++ tcg_out_opc_bne(s, TCG_REG_TMP0, TCG_REG_TMP1, 0); ++ ++ /* TLB Hit - addend in TCG_REG_TMP2, ready for use. */ ++} ++ ++static void add_qemu_ldst_label(TCGContext *s, int is_ld, MemOpIdx oi, ++ TCGType type, TCGReg datalo, TCGReg addrlo, ++ void *raddr, tcg_insn_unit **label_ptr) ++{ ++ TCGLabelQemuLdst *label = new_ldst_label(s); ++ ++ label->is_ld = is_ld; ++ label->oi = oi; ++ label->type = type; ++ label->datalo_reg = datalo; ++ label->datahi_reg = 0; /* unused */ ++ label->addrlo_reg = addrlo; ++ label->addrhi_reg = 0; /* unused */ ++ label->raddr = tcg_splitwx_to_rx(raddr); ++ label->label_ptr[0] = label_ptr[0]; ++} ++ ++static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) ++{ ++ MemOpIdx oi = l->oi; ++ MemOp opc = get_memop(oi); ++ MemOp size = opc & MO_SIZE; ++ TCGType type = l->type; ++ ++ /* resolve label address */ ++ if (!reloc_br_sk16(l->label_ptr[0], tcg_splitwx_to_rx(s->code_ptr))) { ++ return false; ++ } ++ ++ /* call load helper */ ++ tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_A0, TCG_AREG0); ++ tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_A1, l->addrlo_reg); ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A2, oi); ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A3, (tcg_target_long)l->raddr); ++ ++ tcg_out_call(s, qemu_ld_helpers[size]); ++ ++ switch (opc & MO_SSIZE) { ++ case MO_SB: ++ tcg_out_ext8s(s, l->datalo_reg, TCG_REG_A0); ++ break; ++ case MO_SW: ++ tcg_out_ext16s(s, l->datalo_reg, TCG_REG_A0); ++ break; ++ case MO_SL: ++ tcg_out_ext32s(s, l->datalo_reg, TCG_REG_A0); ++ break; ++ case MO_UL: ++ if (type == TCG_TYPE_I32) { ++ /* MO_UL loads of i32 should be sign-extended too */ ++ tcg_out_ext32s(s, l->datalo_reg, TCG_REG_A0); ++ break; ++ } ++ /* fallthrough */ ++ default: ++ tcg_out_mov(s, type, l->datalo_reg, TCG_REG_A0); ++ break; ++ } ++ ++ return tcg_out_goto(s, l->raddr); ++} ++ ++static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l) ++{ ++ MemOpIdx oi = l->oi; ++ MemOp opc = get_memop(oi); ++ MemOp size = opc & MO_SIZE; ++ ++ /* resolve label address */ ++ if (!reloc_br_sk16(l->label_ptr[0], tcg_splitwx_to_rx(s->code_ptr))) { ++ return false; ++ } ++ ++ /* call store helper */ ++ tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_A0, TCG_AREG0); ++ tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_A1, l->addrlo_reg); ++ switch (size) { ++ case MO_8: ++ tcg_out_ext8u(s, TCG_REG_A2, l->datalo_reg); ++ break; ++ case MO_16: ++ tcg_out_ext16u(s, TCG_REG_A2, l->datalo_reg); ++ break; ++ case MO_32: ++ tcg_out_ext32u(s, TCG_REG_A2, l->datalo_reg); ++ break; ++ case MO_64: ++ tcg_out_mov(s, TCG_TYPE_I64, TCG_REG_A2, l->datalo_reg); ++ break; ++ default: ++ g_assert_not_reached(); ++ break; ++ } ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A3, oi); ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A4, (tcg_target_long)l->raddr); ++ ++ tcg_out_call(s, qemu_st_helpers[size]); ++ ++ return tcg_out_goto(s, l->raddr); ++} ++#else ++ ++/* ++ * Alignment helpers for user-mode emulation ++ */ ++ ++static void tcg_out_test_alignment(TCGContext *s, bool is_ld, TCGReg addr_reg, ++ unsigned a_bits) ++{ ++ TCGLabelQemuLdst *l = new_ldst_label(s); ++ ++ l->is_ld = is_ld; ++ l->addrlo_reg = addr_reg; ++ ++ /* ++ * Without micro-architecture details, we don't know which of bstrpick or ++ * andi is faster, so use bstrpick as it's not constrained by imm field ++ * width. (Not to say alignments >= 2^12 are going to happen any time ++ * soon, though) ++ */ ++ tcg_out_opc_bstrpick_d(s, TCG_REG_TMP1, addr_reg, 0, a_bits - 1); ++ ++ l->label_ptr[0] = s->code_ptr; ++ tcg_out_opc_bne(s, TCG_REG_TMP1, TCG_REG_ZERO, 0); ++ ++ l->raddr = tcg_splitwx_to_rx(s->code_ptr); ++} ++ ++static bool tcg_out_fail_alignment(TCGContext *s, TCGLabelQemuLdst *l) ++{ ++ /* resolve label address */ ++ if (!reloc_br_sk16(l->label_ptr[0], tcg_splitwx_to_rx(s->code_ptr))) { ++ return false; ++ } ++ ++ tcg_out_mov(s, TCG_TYPE_TL, TCG_REG_A1, l->addrlo_reg); ++ tcg_out_mov(s, TCG_TYPE_PTR, TCG_REG_A0, TCG_AREG0); ++ ++ /* tail call, with the return address back inline. */ ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_RA, (uintptr_t)l->raddr); ++ tcg_out_call_int( ++ s, ++ (const void *)(l->is_ld ? helper_unaligned_ld : helper_unaligned_st), ++ true); ++ return true; ++} ++ ++static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l) ++{ ++ return tcg_out_fail_alignment(s, l); ++} ++ ++static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l) ++{ ++ return tcg_out_fail_alignment(s, l); ++} ++ ++#endif /* CONFIG_SOFTMMU */ ++ ++/* ++ * `ext32u` the address register into the temp register given, ++ * if target is 32-bit, no-op otherwise. ++ * ++ * Returns the address register ready for use with TLB addend. ++ */ ++static TCGReg tcg_out_zext_addr_if_32_bit(TCGContext *s, TCGReg addr, ++ TCGReg tmp) ++{ ++ if (TARGET_LONG_BITS == 32) { ++ tcg_out_ext32u(s, tmp, addr); ++ return tmp; ++ } ++ return addr; ++} ++ ++static void tcg_out_qemu_ld_indexed(TCGContext *s, TCGReg rd, TCGReg rj, ++ TCGReg rk, MemOp opc, TCGType type) ++{ ++ /* Byte swapping is left to middle-end expansion. */ ++ tcg_debug_assert((opc & MO_BSWAP) == 0); ++ ++ switch (opc & MO_SSIZE) { ++ case MO_UB: ++ tcg_out_opc_ldx_bu(s, rd, rj, rk); ++ break; ++ case MO_SB: ++ tcg_out_opc_ldx_b(s, rd, rj, rk); ++ break; ++ case MO_UW: ++ tcg_out_opc_ldx_hu(s, rd, rj, rk); ++ break; ++ case MO_SW: ++ tcg_out_opc_ldx_h(s, rd, rj, rk); ++ break; ++ case MO_UL: ++ if (type == TCG_TYPE_I64) { ++ tcg_out_opc_ldx_wu(s, rd, rj, rk); ++ break; ++ } ++ /* fallthrough */ ++ case MO_SL: ++ tcg_out_opc_ldx_w(s, rd, rj, rk); ++ break; ++ case MO_Q: ++ tcg_out_opc_ldx_d(s, rd, rj, rk); ++ break; ++ default: ++ g_assert_not_reached(); ++ } ++} ++ ++static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, TCGType type) ++{ ++ TCGReg addr_regl; ++ TCGReg data_regl; ++ MemOpIdx oi; ++ MemOp opc; ++#if defined(CONFIG_SOFTMMU) ++ tcg_insn_unit *label_ptr[1]; ++#else ++ unsigned a_bits; ++#endif ++ TCGReg base; ++ ++ data_regl = *args++; ++ addr_regl = *args++; ++ oi = *args++; ++ opc = get_memop(oi); ++ ++#if defined(CONFIG_SOFTMMU) ++ tcg_out_tlb_load(s, addr_regl, oi, label_ptr, 1); ++ base = tcg_out_zext_addr_if_32_bit(s, addr_regl, TCG_REG_TMP0); ++ tcg_out_qemu_ld_indexed(s, data_regl, base, TCG_REG_TMP2, opc, type); ++ add_qemu_ldst_label(s, 1, oi, type, data_regl, addr_regl, s->code_ptr, ++ label_ptr); ++#else ++ a_bits = get_alignment_bits(opc); ++ if (a_bits) { ++ tcg_out_test_alignment(s, true, addr_regl, a_bits); ++ } ++ base = tcg_out_zext_addr_if_32_bit(s, addr_regl, TCG_REG_TMP0); ++ TCGReg guest_base_reg = USE_GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_ZERO; ++ tcg_out_qemu_ld_indexed(s, data_regl, base, guest_base_reg, opc, type); ++#endif ++} ++ ++static void tcg_out_qemu_st_indexed(TCGContext *s, TCGReg data, TCGReg rj, ++ TCGReg rk, MemOp opc) ++{ ++ /* Byte swapping is left to middle-end expansion. */ ++ tcg_debug_assert((opc & MO_BSWAP) == 0); ++ ++ switch (opc & MO_SIZE) { ++ case MO_8: ++ tcg_out_opc_stx_b(s, data, rj, rk); ++ break; ++ case MO_16: ++ tcg_out_opc_stx_h(s, data, rj, rk); ++ break; ++ case MO_32: ++ tcg_out_opc_stx_w(s, data, rj, rk); ++ break; ++ case MO_64: ++ tcg_out_opc_stx_d(s, data, rj, rk); ++ break; ++ default: ++ g_assert_not_reached(); ++ } ++} ++ ++static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args) ++{ ++ TCGReg addr_regl; ++ TCGReg data_regl; ++ MemOpIdx oi; ++ MemOp opc; ++#if defined(CONFIG_SOFTMMU) ++ tcg_insn_unit *label_ptr[1]; ++#else ++ unsigned a_bits; ++#endif ++ TCGReg base; ++ ++ data_regl = *args++; ++ addr_regl = *args++; ++ oi = *args++; ++ opc = get_memop(oi); ++ ++#if defined(CONFIG_SOFTMMU) ++ tcg_out_tlb_load(s, addr_regl, oi, label_ptr, 0); ++ base = tcg_out_zext_addr_if_32_bit(s, addr_regl, TCG_REG_TMP0); ++ tcg_out_qemu_st_indexed(s, data_regl, base, TCG_REG_TMP2, opc); ++ add_qemu_ldst_label(s, 0, oi, 0, /* type param is unused for stores */ ++ data_regl, addr_regl, s->code_ptr, label_ptr); ++#else ++ a_bits = get_alignment_bits(opc); ++ if (a_bits) { ++ tcg_out_test_alignment(s, false, addr_regl, a_bits); ++ } ++ base = tcg_out_zext_addr_if_32_bit(s, addr_regl, TCG_REG_TMP0); ++ TCGReg guest_base_reg = USE_GUEST_BASE ? TCG_GUEST_BASE_REG : TCG_REG_ZERO; ++ tcg_out_qemu_st_indexed(s, data_regl, base, guest_base_reg, opc); ++#endif ++} ++ ++/* ++ * Entry-points ++ */ ++ ++static const tcg_insn_unit *tb_ret_addr; ++ ++static void tcg_out_op(TCGContext *s, TCGOpcode opc, ++ const TCGArg args[TCG_MAX_OP_ARGS], ++ const int const_args[TCG_MAX_OP_ARGS]) ++{ ++ TCGArg a0 = args[0]; ++ TCGArg a1 = args[1]; ++ TCGArg a2 = args[2]; ++ int c2 = const_args[2]; ++ ++ switch (opc) { ++ case INDEX_op_exit_tb: ++ /* Reuse the zeroing that exists for goto_ptr. */ ++ if (a0 == 0) { ++ tcg_out_call_int(s, tcg_code_gen_epilogue, true); ++ } else { ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_A0, a0); ++ tcg_out_call_int(s, tb_ret_addr, true); ++ } ++ break; ++ ++ case INDEX_op_goto_tb: ++ assert(s->tb_jmp_insn_offset == 0); ++ /* indirect jump method */ ++ tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP0, TCG_REG_ZERO, ++ (uintptr_t)(s->tb_jmp_target_addr + a0)); ++ tcg_out_opc_jirl(s, TCG_REG_ZERO, TCG_REG_TMP0, 0); ++ set_jmp_reset_offset(s, a0); ++ break; ++ ++ case INDEX_op_mb: ++ tcg_out_mb(s, a0); ++ break; ++ ++ case INDEX_op_goto_ptr: ++ tcg_out_opc_jirl(s, TCG_REG_ZERO, a0, 0); ++ break; ++ ++ case INDEX_op_br: ++ tcg_out_reloc(s, s->code_ptr, R_LOONGARCH_BR_SD10K16, arg_label(a0), ++ 0); ++ tcg_out_opc_b(s, 0); ++ break; ++ ++ case INDEX_op_brcond_i32: ++ case INDEX_op_brcond_i64: ++ tcg_out_brcond(s, a2, a0, a1, arg_label(args[3])); ++ break; ++ ++ case INDEX_op_ext8s_i32: ++ case INDEX_op_ext8s_i64: ++ tcg_out_ext8s(s, a0, a1); ++ break; ++ ++ case INDEX_op_ext8u_i32: ++ case INDEX_op_ext8u_i64: ++ tcg_out_ext8u(s, a0, a1); ++ break; ++ ++ case INDEX_op_ext16s_i32: ++ case INDEX_op_ext16s_i64: ++ tcg_out_ext16s(s, a0, a1); ++ break; ++ ++ case INDEX_op_ext16u_i32: ++ case INDEX_op_ext16u_i64: ++ tcg_out_ext16u(s, a0, a1); ++ break; ++ ++ case INDEX_op_ext32u_i64: ++ case INDEX_op_extu_i32_i64: ++ tcg_out_ext32u(s, a0, a1); ++ break; ++ ++ case INDEX_op_ext32s_i64: ++ case INDEX_op_extrl_i64_i32: ++ case INDEX_op_ext_i32_i64: ++ tcg_out_ext32s(s, a0, a1); ++ break; ++ ++ case INDEX_op_extrh_i64_i32: ++ tcg_out_opc_srai_d(s, a0, a1, 32); ++ break; ++ ++ case INDEX_op_not_i32: ++ case INDEX_op_not_i64: ++ tcg_out_opc_nor(s, a0, a1, TCG_REG_ZERO); ++ break; ++ ++ case INDEX_op_nor_i32: ++ case INDEX_op_nor_i64: ++ if (c2) { ++ tcg_out_opc_ori(s, a0, a1, a2); ++ tcg_out_opc_nor(s, a0, a0, TCG_REG_ZERO); ++ } else { ++ tcg_out_opc_nor(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_andc_i32: ++ case INDEX_op_andc_i64: ++ if (c2) { ++ /* guaranteed to fit due to constraint */ ++ tcg_out_opc_andi(s, a0, a1, ~a2); ++ } else { ++ tcg_out_opc_andn(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_orc_i32: ++ case INDEX_op_orc_i64: ++ if (c2) { ++ /* guaranteed to fit due to constraint */ ++ tcg_out_opc_ori(s, a0, a1, ~a2); ++ } else { ++ tcg_out_opc_orn(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_and_i32: ++ case INDEX_op_and_i64: ++ if (c2) { ++ tcg_out_opc_andi(s, a0, a1, a2); ++ } else { ++ tcg_out_opc_and(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_or_i32: ++ case INDEX_op_or_i64: ++ if (c2) { ++ tcg_out_opc_ori(s, a0, a1, a2); ++ } else { ++ tcg_out_opc_or(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_xor_i32: ++ case INDEX_op_xor_i64: ++ if (c2) { ++ tcg_out_opc_xori(s, a0, a1, a2); ++ } else { ++ tcg_out_opc_xor(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_extract_i32: ++ tcg_out_opc_bstrpick_w(s, a0, a1, a2, a2 + args[3] - 1); ++ break; ++ case INDEX_op_extract_i64: ++ tcg_out_opc_bstrpick_d(s, a0, a1, a2, a2 + args[3] - 1); ++ break; ++ ++ case INDEX_op_deposit_i32: ++ tcg_out_opc_bstrins_w(s, a0, a2, args[3], args[3] + args[4] - 1); ++ break; ++ case INDEX_op_deposit_i64: ++ tcg_out_opc_bstrins_d(s, a0, a2, args[3], args[3] + args[4] - 1); ++ break; ++ ++ case INDEX_op_bswap16_i32: ++ case INDEX_op_bswap16_i64: ++ tcg_out_opc_revb_2h(s, a0, a1); ++ if (a2 & TCG_BSWAP_OS) { ++ tcg_out_ext16s(s, a0, a0); ++ } else if ((a2 & (TCG_BSWAP_IZ | TCG_BSWAP_OZ)) == TCG_BSWAP_OZ) { ++ tcg_out_ext16u(s, a0, a0); ++ } ++ break; ++ ++ case INDEX_op_bswap32_i32: ++ /* All 32-bit values are computed sign-extended in the register. */ ++ a2 = TCG_BSWAP_OS; ++ /* fallthrough */ ++ case INDEX_op_bswap32_i64: ++ tcg_out_opc_revb_2w(s, a0, a1); ++ if (a2 & TCG_BSWAP_OS) { ++ tcg_out_ext32s(s, a0, a0); ++ } else if ((a2 & (TCG_BSWAP_IZ | TCG_BSWAP_OZ)) == TCG_BSWAP_OZ) { ++ tcg_out_ext32u(s, a0, a0); ++ } ++ break; ++ ++ case INDEX_op_bswap64_i64: ++ tcg_out_opc_revb_d(s, a0, a1); ++ break; ++ ++ case INDEX_op_clz_i32: ++ tcg_out_clzctz(s, OPC_CLZ_W, a0, a1, a2, c2, true); ++ break; ++ case INDEX_op_clz_i64: ++ tcg_out_clzctz(s, OPC_CLZ_D, a0, a1, a2, c2, false); ++ break; ++ ++ case INDEX_op_ctz_i32: ++ tcg_out_clzctz(s, OPC_CTZ_W, a0, a1, a2, c2, true); ++ break; ++ case INDEX_op_ctz_i64: ++ tcg_out_clzctz(s, OPC_CTZ_D, a0, a1, a2, c2, false); ++ break; ++ ++ case INDEX_op_shl_i32: ++ if (c2) { ++ tcg_out_opc_slli_w(s, a0, a1, a2 & 0x1f); ++ } else { ++ tcg_out_opc_sll_w(s, a0, a1, a2); ++ } ++ break; ++ case INDEX_op_shl_i64: ++ if (c2) { ++ tcg_out_opc_slli_d(s, a0, a1, a2 & 0x3f); ++ } else { ++ tcg_out_opc_sll_d(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_shr_i32: ++ if (c2) { ++ tcg_out_opc_srli_w(s, a0, a1, a2 & 0x1f); ++ } else { ++ tcg_out_opc_srl_w(s, a0, a1, a2); ++ } ++ break; ++ case INDEX_op_shr_i64: ++ if (c2) { ++ tcg_out_opc_srli_d(s, a0, a1, a2 & 0x3f); ++ } else { ++ tcg_out_opc_srl_d(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_sar_i32: ++ if (c2) { ++ tcg_out_opc_srai_w(s, a0, a1, a2 & 0x1f); ++ } else { ++ tcg_out_opc_sra_w(s, a0, a1, a2); ++ } ++ break; ++ case INDEX_op_sar_i64: ++ if (c2) { ++ tcg_out_opc_srai_d(s, a0, a1, a2 & 0x3f); ++ } else { ++ tcg_out_opc_sra_d(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_rotl_i32: ++ /* transform into equivalent rotr/rotri */ ++ if (c2) { ++ tcg_out_opc_rotri_w(s, a0, a1, (32 - a2) & 0x1f); ++ } else { ++ tcg_out_opc_sub_w(s, TCG_REG_TMP0, TCG_REG_ZERO, a2); ++ tcg_out_opc_rotr_w(s, a0, a1, TCG_REG_TMP0); ++ } ++ break; ++ case INDEX_op_rotl_i64: ++ /* transform into equivalent rotr/rotri */ ++ if (c2) { ++ tcg_out_opc_rotri_d(s, a0, a1, (64 - a2) & 0x3f); ++ } else { ++ tcg_out_opc_sub_w(s, TCG_REG_TMP0, TCG_REG_ZERO, a2); ++ tcg_out_opc_rotr_d(s, a0, a1, TCG_REG_TMP0); ++ } ++ break; ++ ++ case INDEX_op_rotr_i32: ++ if (c2) { ++ tcg_out_opc_rotri_w(s, a0, a1, a2 & 0x1f); ++ } else { ++ tcg_out_opc_rotr_w(s, a0, a1, a2); ++ } ++ break; ++ case INDEX_op_rotr_i64: ++ if (c2) { ++ tcg_out_opc_rotri_d(s, a0, a1, a2 & 0x3f); ++ } else { ++ tcg_out_opc_rotr_d(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_add_i32: ++ if (c2) { ++ tcg_out_opc_addi_w(s, a0, a1, a2); ++ } else { ++ tcg_out_opc_add_w(s, a0, a1, a2); ++ } ++ break; ++ case INDEX_op_add_i64: ++ if (c2) { ++ tcg_out_opc_addi_d(s, a0, a1, a2); ++ } else { ++ tcg_out_opc_add_d(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_sub_i32: ++ if (c2) { ++ tcg_out_opc_addi_w(s, a0, a1, -a2); ++ } else { ++ tcg_out_opc_sub_w(s, a0, a1, a2); ++ } ++ break; ++ case INDEX_op_sub_i64: ++ if (c2) { ++ tcg_out_opc_addi_d(s, a0, a1, -a2); ++ } else { ++ tcg_out_opc_sub_d(s, a0, a1, a2); ++ } ++ break; ++ ++ case INDEX_op_mul_i32: ++ tcg_out_opc_mul_w(s, a0, a1, a2); ++ break; ++ case INDEX_op_mul_i64: ++ tcg_out_opc_mul_d(s, a0, a1, a2); ++ break; ++ ++ case INDEX_op_mulsh_i32: ++ tcg_out_opc_mulh_w(s, a0, a1, a2); ++ break; ++ case INDEX_op_mulsh_i64: ++ tcg_out_opc_mulh_d(s, a0, a1, a2); ++ break; ++ ++ case INDEX_op_muluh_i32: ++ tcg_out_opc_mulh_wu(s, a0, a1, a2); ++ break; ++ case INDEX_op_muluh_i64: ++ tcg_out_opc_mulh_du(s, a0, a1, a2); ++ break; ++ ++ case INDEX_op_div_i32: ++ tcg_out_opc_div_w(s, a0, a1, a2); ++ break; ++ case INDEX_op_div_i64: ++ tcg_out_opc_div_d(s, a0, a1, a2); ++ break; ++ ++ case INDEX_op_divu_i32: ++ tcg_out_opc_div_wu(s, a0, a1, a2); ++ break; ++ case INDEX_op_divu_i64: ++ tcg_out_opc_div_du(s, a0, a1, a2); ++ break; ++ ++ case INDEX_op_rem_i32: ++ tcg_out_opc_mod_w(s, a0, a1, a2); ++ break; ++ case INDEX_op_rem_i64: ++ tcg_out_opc_mod_d(s, a0, a1, a2); ++ break; ++ ++ case INDEX_op_remu_i32: ++ tcg_out_opc_mod_wu(s, a0, a1, a2); ++ break; ++ case INDEX_op_remu_i64: ++ tcg_out_opc_mod_du(s, a0, a1, a2); ++ break; ++ ++ case INDEX_op_setcond_i32: ++ case INDEX_op_setcond_i64: ++ tcg_out_setcond(s, args[3], a0, a1, a2, c2); ++ break; ++ ++ case INDEX_op_ld8s_i32: ++ case INDEX_op_ld8s_i64: ++ tcg_out_ldst(s, OPC_LD_B, a0, a1, a2); ++ break; ++ case INDEX_op_ld8u_i32: ++ case INDEX_op_ld8u_i64: ++ tcg_out_ldst(s, OPC_LD_BU, a0, a1, a2); ++ break; ++ case INDEX_op_ld16s_i32: ++ case INDEX_op_ld16s_i64: ++ tcg_out_ldst(s, OPC_LD_H, a0, a1, a2); ++ break; ++ case INDEX_op_ld16u_i32: ++ case INDEX_op_ld16u_i64: ++ tcg_out_ldst(s, OPC_LD_HU, a0, a1, a2); ++ break; ++ case INDEX_op_ld_i32: ++ case INDEX_op_ld32s_i64: ++ tcg_out_ldst(s, OPC_LD_W, a0, a1, a2); ++ break; ++ case INDEX_op_ld32u_i64: ++ tcg_out_ldst(s, OPC_LD_WU, a0, a1, a2); ++ break; ++ case INDEX_op_ld_i64: ++ tcg_out_ldst(s, OPC_LD_D, a0, a1, a2); ++ break; ++ ++ case INDEX_op_st8_i32: ++ case INDEX_op_st8_i64: ++ tcg_out_ldst(s, OPC_ST_B, a0, a1, a2); ++ break; ++ case INDEX_op_st16_i32: ++ case INDEX_op_st16_i64: ++ tcg_out_ldst(s, OPC_ST_H, a0, a1, a2); ++ break; ++ case INDEX_op_st_i32: ++ case INDEX_op_st32_i64: ++ tcg_out_ldst(s, OPC_ST_W, a0, a1, a2); ++ break; ++ case INDEX_op_st_i64: ++ tcg_out_ldst(s, OPC_ST_D, a0, a1, a2); ++ break; ++ ++ case INDEX_op_qemu_ld_i32: ++ tcg_out_qemu_ld(s, args, TCG_TYPE_I32); ++ break; ++ case INDEX_op_qemu_ld_i64: ++ tcg_out_qemu_ld(s, args, TCG_TYPE_I64); ++ break; ++ case INDEX_op_qemu_st_i32: ++ tcg_out_qemu_st(s, args); ++ break; ++ case INDEX_op_qemu_st_i64: ++ tcg_out_qemu_st(s, args); ++ break; ++ ++ case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */ ++ case INDEX_op_mov_i64: ++ case INDEX_op_call: /* Always emitted via tcg_out_call. */ ++ default: ++ g_assert_not_reached(); ++ } ++} ++ ++static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op) ++{ ++ switch (op) { ++ case INDEX_op_goto_ptr: ++ return C_O0_I1(r); ++ ++ case INDEX_op_st8_i32: ++ case INDEX_op_st8_i64: ++ case INDEX_op_st16_i32: ++ case INDEX_op_st16_i64: ++ case INDEX_op_st32_i64: ++ case INDEX_op_st_i32: ++ case INDEX_op_st_i64: ++ return C_O0_I2(rZ, r); ++ ++ case INDEX_op_brcond_i32: ++ case INDEX_op_brcond_i64: ++ return C_O0_I2(rZ, rZ); ++ ++ case INDEX_op_qemu_st_i32: ++ case INDEX_op_qemu_st_i64: ++ return C_O0_I2(LZ, L); ++ ++ case INDEX_op_ext8s_i32: ++ case INDEX_op_ext8s_i64: ++ case INDEX_op_ext8u_i32: ++ case INDEX_op_ext8u_i64: ++ case INDEX_op_ext16s_i32: ++ case INDEX_op_ext16s_i64: ++ case INDEX_op_ext16u_i32: ++ case INDEX_op_ext16u_i64: ++ case INDEX_op_ext32s_i64: ++ case INDEX_op_ext32u_i64: ++ case INDEX_op_extu_i32_i64: ++ case INDEX_op_extrl_i64_i32: ++ case INDEX_op_extrh_i64_i32: ++ case INDEX_op_ext_i32_i64: ++ case INDEX_op_not_i32: ++ case INDEX_op_not_i64: ++ case INDEX_op_extract_i32: ++ case INDEX_op_extract_i64: ++ case INDEX_op_bswap16_i32: ++ case INDEX_op_bswap16_i64: ++ case INDEX_op_bswap32_i32: ++ case INDEX_op_bswap32_i64: ++ case INDEX_op_bswap64_i64: ++ case INDEX_op_ld8s_i32: ++ case INDEX_op_ld8s_i64: ++ case INDEX_op_ld8u_i32: ++ case INDEX_op_ld8u_i64: ++ case INDEX_op_ld16s_i32: ++ case INDEX_op_ld16s_i64: ++ case INDEX_op_ld16u_i32: ++ case INDEX_op_ld16u_i64: ++ case INDEX_op_ld32s_i64: ++ case INDEX_op_ld32u_i64: ++ case INDEX_op_ld_i32: ++ case INDEX_op_ld_i64: ++ return C_O1_I1(r, r); ++ ++ case INDEX_op_qemu_ld_i32: ++ case INDEX_op_qemu_ld_i64: ++ return C_O1_I1(r, L); ++ ++ case INDEX_op_andc_i32: ++ case INDEX_op_andc_i64: ++ case INDEX_op_orc_i32: ++ case INDEX_op_orc_i64: ++ /* ++ * LoongArch insns for these ops don't have reg-imm forms, but we ++ * can express using andi/ori if ~constant satisfies ++ * TCG_CT_CONST_U12. ++ */ ++ return C_O1_I2(r, r, rC); ++ ++ case INDEX_op_shl_i32: ++ case INDEX_op_shl_i64: ++ case INDEX_op_shr_i32: ++ case INDEX_op_shr_i64: ++ case INDEX_op_sar_i32: ++ case INDEX_op_sar_i64: ++ case INDEX_op_rotl_i32: ++ case INDEX_op_rotl_i64: ++ case INDEX_op_rotr_i32: ++ case INDEX_op_rotr_i64: ++ return C_O1_I2(r, r, ri); ++ ++ case INDEX_op_add_i32: ++ case INDEX_op_add_i64: ++ return C_O1_I2(r, r, rI); ++ ++ case INDEX_op_and_i32: ++ case INDEX_op_and_i64: ++ case INDEX_op_nor_i32: ++ case INDEX_op_nor_i64: ++ case INDEX_op_or_i32: ++ case INDEX_op_or_i64: ++ case INDEX_op_xor_i32: ++ case INDEX_op_xor_i64: ++ /* LoongArch reg-imm bitops have their imms ZERO-extended */ ++ return C_O1_I2(r, r, rU); ++ ++ case INDEX_op_clz_i32: ++ case INDEX_op_clz_i64: ++ case INDEX_op_ctz_i32: ++ case INDEX_op_ctz_i64: ++ return C_O1_I2(r, r, rW); ++ ++ case INDEX_op_setcond_i32: ++ case INDEX_op_setcond_i64: ++ return C_O1_I2(r, r, rZ); ++ ++ case INDEX_op_deposit_i32: ++ case INDEX_op_deposit_i64: ++ /* Must deposit into the same register as input */ ++ return C_O1_I2(r, 0, rZ); ++ ++ case INDEX_op_sub_i32: ++ case INDEX_op_sub_i64: ++ return C_O1_I2(r, rZ, rN); ++ ++ case INDEX_op_mul_i32: ++ case INDEX_op_mul_i64: ++ case INDEX_op_mulsh_i32: ++ case INDEX_op_mulsh_i64: ++ case INDEX_op_muluh_i32: ++ case INDEX_op_muluh_i64: ++ case INDEX_op_div_i32: ++ case INDEX_op_div_i64: ++ case INDEX_op_divu_i32: ++ case INDEX_op_divu_i64: ++ case INDEX_op_rem_i32: ++ case INDEX_op_rem_i64: ++ case INDEX_op_remu_i32: ++ case INDEX_op_remu_i64: ++ return C_O1_I2(r, rZ, rZ); ++ ++ default: ++ g_assert_not_reached(); ++ } ++} ++ ++static const int tcg_target_callee_save_regs[] = { ++ TCG_REG_S0, /* used for the global env (TCG_AREG0) */ ++ TCG_REG_S1, ++ TCG_REG_S2, ++ TCG_REG_S3, ++ TCG_REG_S4, ++ TCG_REG_S5, ++ TCG_REG_S6, ++ TCG_REG_S7, ++ TCG_REG_S8, ++ TCG_REG_S9, ++ TCG_REG_RA, /* should be last for ABI compliance */ ++}; ++ ++/* Stack frame parameters. */ ++#define REG_SIZE (TCG_TARGET_REG_BITS / 8) ++#define SAVE_SIZE ((int)ARRAY_SIZE(tcg_target_callee_save_regs) * REG_SIZE) ++#define TEMP_SIZE (CPU_TEMP_BUF_NLONGS * (int)sizeof(long)) ++#define FRAME_SIZE \ ++ ((TCG_STATIC_CALL_ARGS_SIZE + TEMP_SIZE + SAVE_SIZE + \ ++ TCG_TARGET_STACK_ALIGN - 1) & \ ++ -TCG_TARGET_STACK_ALIGN) ++#define SAVE_OFS (TCG_STATIC_CALL_ARGS_SIZE + TEMP_SIZE) ++ ++/* We're expecting to be able to use an immediate for frame allocation. */ ++QEMU_BUILD_BUG_ON(FRAME_SIZE > 0x7ff); ++ ++/* Generate global QEMU prologue and epilogue code */ ++static void tcg_target_qemu_prologue(TCGContext *s) ++{ ++ int i; ++ ++ tcg_set_frame(s, TCG_REG_SP, TCG_STATIC_CALL_ARGS_SIZE, TEMP_SIZE); ++ ++ /* TB prologue */ ++ tcg_out_opc_addi_d(s, TCG_REG_SP, TCG_REG_SP, -FRAME_SIZE); ++ for (i = 0; i < ARRAY_SIZE(tcg_target_callee_save_regs); i++) { ++ tcg_out_st(s, TCG_TYPE_REG, tcg_target_callee_save_regs[i], TCG_REG_SP, ++ SAVE_OFS + i * REG_SIZE); ++ } ++ ++#if !defined(CONFIG_SOFTMMU) ++ if (USE_GUEST_BASE) { ++ tcg_out_movi(s, TCG_TYPE_PTR, TCG_GUEST_BASE_REG, guest_base); ++ tcg_regset_set_reg(s->reserved_regs, TCG_GUEST_BASE_REG); ++ } ++#endif ++ ++ /* Call generated code */ ++ tcg_out_mov(s, TCG_TYPE_PTR, TCG_AREG0, tcg_target_call_iarg_regs[0]); ++ tcg_out_opc_jirl(s, TCG_REG_ZERO, tcg_target_call_iarg_regs[1], 0); ++ ++ /* Return path for goto_ptr. Set return value to 0 */ ++ tcg_code_gen_epilogue = tcg_splitwx_to_rx(s->code_ptr); ++ tcg_out_mov(s, TCG_TYPE_REG, TCG_REG_A0, TCG_REG_ZERO); ++ ++ /* TB epilogue */ ++ tb_ret_addr = tcg_splitwx_to_rx(s->code_ptr); ++ for (i = 0; i < ARRAY_SIZE(tcg_target_callee_save_regs); i++) { ++ tcg_out_ld(s, TCG_TYPE_REG, tcg_target_callee_save_regs[i], TCG_REG_SP, ++ SAVE_OFS + i * REG_SIZE); ++ } ++ ++ tcg_out_opc_addi_d(s, TCG_REG_SP, TCG_REG_SP, FRAME_SIZE); ++ tcg_out_opc_jirl(s, TCG_REG_ZERO, TCG_REG_RA, 0); ++} ++ ++static void tcg_target_init(TCGContext *s) ++{ ++ tcg_target_available_regs[TCG_TYPE_I32] = ALL_GENERAL_REGS; ++ tcg_target_available_regs[TCG_TYPE_I64] = ALL_GENERAL_REGS; ++ ++ tcg_target_call_clobber_regs = ALL_GENERAL_REGS; ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S0); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S1); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S2); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S3); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S4); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S5); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S6); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S7); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S8); ++ tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S9); ++ ++ s->reserved_regs = 0; ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_ZERO); ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP0); ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP1); ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP2); ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_SP); ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_TP); ++ tcg_regset_set_reg(s->reserved_regs, TCG_REG_RESERVED); ++} ++ ++typedef struct { ++ DebugFrameHeader h; ++ uint8_t fde_def_cfa[4]; ++ uint8_t fde_reg_ofs[ARRAY_SIZE(tcg_target_callee_save_regs) * 2]; ++} DebugFrame; ++ ++#define ELF_HOST_MACHINE EM_LOONGARCH ++ ++static const DebugFrame ++ debug_frame = { .h.cie.len = sizeof(DebugFrameCIE) - ++ 4, /* length after .len member */ ++ .h.cie.id = -1, ++ .h.cie.version = 1, ++ .h.cie.code_align = 1, ++ .h.cie.data_align = ++ -(TCG_TARGET_REG_BITS / 8) & 0x7f, /* sleb128 */ ++ .h.cie.return_column = TCG_REG_RA, ++ ++ /* Total FDE size does not include the "len" member. */ ++ .h.fde.len = sizeof(DebugFrame) - ++ offsetof(DebugFrame, h.fde.cie_offset), ++ ++ .fde_def_cfa = { 12, ++ TCG_REG_SP, /* DW_CFA_def_cfa sp, ... */ ++ (FRAME_SIZE & 0x7f) | ++ 0x80, /* ... uleb128 FRAME_SIZE */ ++ (FRAME_SIZE >> 7) }, ++ .fde_reg_ofs = { ++ 0x80 + 23, 11, /* DW_CFA_offset, s0, -88 */ ++ 0x80 + 24, 10, /* DW_CFA_offset, s1, -80 */ ++ 0x80 + 25, 9, /* DW_CFA_offset, s2, -72 */ ++ 0x80 + 26, 8, /* DW_CFA_offset, s3, -64 */ ++ 0x80 + 27, 7, /* DW_CFA_offset, s4, -56 */ ++ 0x80 + 28, 6, /* DW_CFA_offset, s5, -48 */ ++ 0x80 + 29, 5, /* DW_CFA_offset, s6, -40 */ ++ 0x80 + 30, 4, /* DW_CFA_offset, s7, -32 */ ++ 0x80 + 31, 3, /* DW_CFA_offset, s8, -24 */ ++ 0x80 + 22, 2, /* DW_CFA_offset, s9, -16 */ ++ 0x80 + 1, 1, /* DW_CFA_offset, ra, -8 */ ++ } }; ++ ++void tcg_register_jit(const void *buf, size_t buf_size) ++{ ++ tcg_register_jit_int(buf, buf_size, &debug_frame, sizeof(debug_frame)); ++} +diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h +new file mode 100644 +index 0000000000..20f77b707d +--- /dev/null ++++ b/tcg/loongarch64/tcg-target.h +@@ -0,0 +1,168 @@ ++/* ++ * Tiny Code Generator for QEMU ++ * ++ * Copyright (c) 2023 Loongarch Technology ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2 or later, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope it will be useful, but WITHOUT ++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ * more details. ++ * ++ * You should have received a copy of the GNU General Public License along with ++ * this program. If not, see . ++ * ++ */ ++ ++#ifndef LOONGARCH_TCG_TARGET_H ++#define LOONGARCH_TCG_TARGET_H ++ ++/* ++ * Loongson removed the (incomplete) 32-bit support from kernel and toolchain ++ * for the initial upstreaming of this architecture, so don't bother and just ++ * support the LP64* ABI for now. ++ */ ++ ++#if defined(__loongarch64) ++#define TCG_TARGET_REG_BITS 64 ++#else ++#error unsupported LoongArch register size ++#endif ++ ++#define TCG_TARGET_INSN_UNIT_SIZE 4 ++#define TCG_TARGET_NB_REGS 32 ++#define MAX_CODE_GEN_BUFFER_SIZE SIZE_MAX ++ ++typedef enum { ++ TCG_REG_ZERO, ++ TCG_REG_RA, ++ TCG_REG_TP, ++ TCG_REG_SP, ++ TCG_REG_A0, ++ TCG_REG_A1, ++ TCG_REG_A2, ++ TCG_REG_A3, ++ TCG_REG_A4, ++ TCG_REG_A5, ++ TCG_REG_A6, ++ TCG_REG_A7, ++ TCG_REG_T0, ++ TCG_REG_T1, ++ TCG_REG_T2, ++ TCG_REG_T3, ++ TCG_REG_T4, ++ TCG_REG_T5, ++ TCG_REG_T6, ++ TCG_REG_T7, ++ TCG_REG_T8, ++ TCG_REG_RESERVED, ++ TCG_REG_S9, ++ TCG_REG_S0, ++ TCG_REG_S1, ++ TCG_REG_S2, ++ TCG_REG_S3, ++ TCG_REG_S4, ++ TCG_REG_S5, ++ TCG_REG_S6, ++ TCG_REG_S7, ++ TCG_REG_S8, ++ ++ /* aliases */ ++ TCG_AREG0 = TCG_REG_S0, ++ TCG_REG_TMP0 = TCG_REG_T8, ++ TCG_REG_TMP1 = TCG_REG_T7, ++ TCG_REG_TMP2 = TCG_REG_T6, ++} TCGReg; ++ ++/* used for function call generation */ ++#define TCG_REG_CALL_STACK TCG_REG_SP ++#define TCG_TARGET_STACK_ALIGN 16 ++#define TCG_TARGET_CALL_ALIGN_ARGS 1 ++#define TCG_TARGET_CALL_STACK_OFFSET 0 ++ ++/* optional instructions */ ++#define TCG_TARGET_HAS_movcond_i32 0 ++#define TCG_TARGET_HAS_div_i32 1 ++#define TCG_TARGET_HAS_rem_i32 1 ++#define TCG_TARGET_HAS_div2_i32 0 ++#define TCG_TARGET_HAS_rot_i32 1 ++#define TCG_TARGET_HAS_deposit_i32 1 ++#define TCG_TARGET_HAS_extract_i32 1 ++#define TCG_TARGET_HAS_sextract_i32 0 ++#define TCG_TARGET_HAS_extract2_i32 0 ++#define TCG_TARGET_HAS_add2_i32 0 ++#define TCG_TARGET_HAS_sub2_i32 0 ++#define TCG_TARGET_HAS_mulu2_i32 0 ++#define TCG_TARGET_HAS_muls2_i32 0 ++#define TCG_TARGET_HAS_muluh_i32 1 ++#define TCG_TARGET_HAS_mulsh_i32 1 ++#define TCG_TARGET_HAS_ext8s_i32 1 ++#define TCG_TARGET_HAS_ext16s_i32 1 ++#define TCG_TARGET_HAS_ext8u_i32 1 ++#define TCG_TARGET_HAS_ext16u_i32 1 ++#define TCG_TARGET_HAS_bswap16_i32 1 ++#define TCG_TARGET_HAS_bswap32_i32 1 ++#define TCG_TARGET_HAS_not_i32 1 ++#define TCG_TARGET_HAS_neg_i32 0 ++#define TCG_TARGET_HAS_andc_i32 1 ++#define TCG_TARGET_HAS_orc_i32 1 ++#define TCG_TARGET_HAS_eqv_i32 0 ++#define TCG_TARGET_HAS_nand_i32 0 ++#define TCG_TARGET_HAS_nor_i32 1 ++#define TCG_TARGET_HAS_clz_i32 1 ++#define TCG_TARGET_HAS_ctz_i32 1 ++#define TCG_TARGET_HAS_ctpop_i32 0 ++#define TCG_TARGET_HAS_direct_jump 0 ++#define TCG_TARGET_HAS_brcond2 0 ++#define TCG_TARGET_HAS_setcond2 0 ++#define TCG_TARGET_HAS_qemu_st8_i32 0 ++ ++/* 64-bit operations */ ++#define TCG_TARGET_HAS_movcond_i64 0 ++#define TCG_TARGET_HAS_div_i64 1 ++#define TCG_TARGET_HAS_rem_i64 1 ++#define TCG_TARGET_HAS_div2_i64 0 ++#define TCG_TARGET_HAS_rot_i64 1 ++#define TCG_TARGET_HAS_deposit_i64 1 ++#define TCG_TARGET_HAS_extract_i64 1 ++#define TCG_TARGET_HAS_sextract_i64 0 ++#define TCG_TARGET_HAS_extract2_i64 0 ++#define TCG_TARGET_HAS_extrl_i64_i32 1 ++#define TCG_TARGET_HAS_extrh_i64_i32 1 ++#define TCG_TARGET_HAS_ext8s_i64 1 ++#define TCG_TARGET_HAS_ext16s_i64 1 ++#define TCG_TARGET_HAS_ext32s_i64 1 ++#define TCG_TARGET_HAS_ext8u_i64 1 ++#define TCG_TARGET_HAS_ext16u_i64 1 ++#define TCG_TARGET_HAS_ext32u_i64 1 ++#define TCG_TARGET_HAS_bswap16_i64 1 ++#define TCG_TARGET_HAS_bswap32_i64 1 ++#define TCG_TARGET_HAS_bswap64_i64 1 ++#define TCG_TARGET_HAS_not_i64 1 ++#define TCG_TARGET_HAS_neg_i64 0 ++#define TCG_TARGET_HAS_andc_i64 1 ++#define TCG_TARGET_HAS_orc_i64 1 ++#define TCG_TARGET_HAS_eqv_i64 0 ++#define TCG_TARGET_HAS_nand_i64 0 ++#define TCG_TARGET_HAS_nor_i64 1 ++#define TCG_TARGET_HAS_clz_i64 1 ++#define TCG_TARGET_HAS_ctz_i64 1 ++#define TCG_TARGET_HAS_ctpop_i64 0 ++#define TCG_TARGET_HAS_add2_i64 0 ++#define TCG_TARGET_HAS_sub2_i64 0 ++#define TCG_TARGET_HAS_mulu2_i64 0 ++#define TCG_TARGET_HAS_muls2_i64 0 ++#define TCG_TARGET_HAS_muluh_i64 1 ++#define TCG_TARGET_HAS_mulsh_i64 1 ++ ++/* not defined -- call should be eliminated at compile time */ ++void tb_target_set_jmp_target(uintptr_t, uintptr_t, uintptr_t, uintptr_t); ++ ++#define TCG_TARGET_DEFAULT_MO (0) ++#define TCG_TARGET_HAS_MEMORY_BSWAP 0 ++#define TCG_TARGET_NEED_LDST_LABELS ++ ++#endif /* LOONGARCH_TCG_TARGET_H */ +-- +2.27.0 + diff --git a/qemu.spec b/qemu.spec index b1b7e023..e0227277 100644 --- a/qemu.spec +++ b/qemu.spec @@ -1,6 +1,6 @@ Name: qemu Version: 6.2.0 -Release: 60 +Release: 61 Epoch: 10 Summary: QEMU is a generic and open source machine emulator and virtualizer License: GPLv2 and BSD and MIT and CC-BY-SA-4.0 @@ -434,6 +434,7 @@ Patch0422: migration-report-multiFd-related-thread-pid-to-libvi.patch Patch0423: vhost_net-keep-acked_feature-only-for-NET_CLIENT_DRI.patch Patch0424: linux-user-Add-strace-output-for-timer_settime64-sys.patch Patch0425: fix-qemu-core-when-vhost-user-net-config-with-server.patch +Patch0426: qemu-support-for-loongarch.patch BuildRequires: flex BuildRequires: gcc @@ -592,6 +593,12 @@ Requires: qemu %description system-riscv This package provides the QEMU system emulator for riscv. +%package system-loongarch64 +Summary: Qemu-system-loongarch64 +Requires: qemu +%description system-loongarch64 +This package provides the QEMU system emulator for loongarch64. + %prep %setup -q -n qemu-%{version}%{?rcstr} %autopatch -p1 @@ -605,6 +612,10 @@ targetarch="aarch64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu" buildarch="aarch64-softmmu" targetarch="x86_64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu" %endif +%ifarch loongarch64 +buildarch="loongarch64-softmmu" +targetarch="x86_64-softmmu aarch64-softmmu arm-softmmu riscv32-softmmu riscv64-softmmu" +%endif buildldflags="VL_LDFLAGS=-Wl,--build-id" qemubuilddir="build" @@ -728,14 +739,15 @@ rm -rf %{buildroot}%{_bindir}/ivshmem* rm -f %{buildroot}%{_datadir}/%{name}/edk2* rm -rf %{buildroot}%{_datadir}/%{name}/firmware rm -rf %{buildroot}%{_datadir}/%{name}/qemu-nsis.bmp -rm -rf %{buildroot}%{_libdir}/%{name}/audio-oss.so rm -rf %{buildroot}%{_libdir}/%{name}/audio-pa.so rm -rf %{buildroot}%{_libdir}/%{name}/block-gluster.so -rm -rf %{buildroot}%{_libdir}/%{name}/ui-curses.so -rm -rf %{buildroot}%{_libdir}/%{name}/ui-gtk.so rm -rf %{buildroot}%{_libdir}/%{name}/ui-sdl.so -rm -rf %{buildroot}%{_libdir}/%{name}/audio-spice.so rm -rf %{buildroot}%{_libdir}/%{name}/chardev-baum.so +%ifnarch loongarch64 +rm -rf %{buildroot}%{_libdir}/%{name}/audio-oss.so +rm -rf %{buildroot}%{_libdir}/%{name}/audio-spice.so +rm -rf %{buildroot}%{_libdir}/%{name}/ui-curses.so +rm -rf %{buildroot}%{_libdir}/%{name}/ui-gtk.so rm -rf %{buildroot}%{_libdir}/%{name}/chardev-spice.so rm -rf %{buildroot}%{_libdir}/%{name}/hw-display-qxl.so rm -rf %{buildroot}%{_libdir}/%{name}/hw-s390x-virtio-gpu-ccw.so @@ -743,6 +755,7 @@ rm -rf %{buildroot}%{_libdir}/%{name}/hw-usb-redirect.so rm -rf %{buildroot}%{_libdir}/%{name}/ui-opengl.so rm -rf %{buildroot}%{_libdir}/%{name}/ui-spice-app.so rm -rf %{buildroot}%{_libdir}/%{name}/ui-spice-core.so +%endif rm -rf %{buildroot}%{_libexecdir}/vhost-user-gpu rm -rf %{buildroot}%{_datadir}/%{name}/vhost-user/50-qemu-gpu.json @@ -886,6 +899,27 @@ getent passwd qemu >/dev/null || \ %{_datadir}/%{name}/opensbi-riscv*.bin %{_datadir}/%{name}/opensbi-riscv*.elf +%ifarch loongarch64 +%files system-loongarch64 +%{_bindir}/qemu-system-loongarch64 +%{_datadir}/%{name}/loongarch_*.bin +%{_libdir}/%{name}/audio-oss.so +%{_libdir}/%{name}/ui-curses.so +%{_libdir}/%{name}/ui-gtk.so +%{_libdir}/%{name}/audio-spice.so +%{_libdir}/%{name}/chardev-spice.so +%{_libdir}/%{name}/hw-display-qxl.so +%{_libdir}/%{name}/hw-s390x-virtio-gpu-ccw.so +%{_libdir}/%{name}/hw-usb-redirect.so +%{_libdir}/%{name}/ui-opengl.so +%{_libdir}/%{name}/ui-spice-app.so +%{_libdir}/%{name}/ui-spice-core.so +%endif + +%ifnarch loongarch64 +%exclude %{_datadir}/%{name}/loongarch_*.bin +%endif + %files help %dir %{qemudocdir} %doc %{qemudocdir}/about @@ -948,6 +982,9 @@ getent passwd qemu >/dev/null || \ %endif %changelog +* Fri Dec 23 2022 xianglaili - 10:6.2.0-61 +- Add loongarch supoort + * Tue Dec 20 2022 yezengruan - 10:6.2.0-60 - linux-user: Add strace output for timer_settime64() syscall - fix qemu-core when vhost-user-net config with server mode -- Gitee