代码拉取完成,页面将自动刷新
同步操作将从 src-anolis-os/qemu-kvm 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From 42c6c2a89fa44100141cd2b7e178f965d1b8f80f Mon Sep 17 00:00:00 2001
From: lixianglai <lixianglai@loongson.cn>
Date: Sat, 20 Aug 2022 02:18:41 -0400
Subject: [PATCH 07/28] Modify kvm cpu vga qapi.
Change-Id: I7923af804bdbe6d44d3f521df1859aa081afceba
Signed-off-by: lixianglai <lixianglai@loongson.cn>
Signed-off-by: Mao Bibo <maobibo@loongson.cn>
---
hw/acpi/cpu.c | 11 ++++++
hw/loongarch/iocsr.c | 2 ++
hw/loongarch/larch_3a.c | 18 +++++-----
hw/meson.build | 1 +
include/disas/dis-asm.h | 1 +
include/elf.h | 2 ++
include/hw/loongarch/larch.h | 1 -
include/qemu/osdep.h | 3 ++
include/sysemu/arch_init.h | 1 +
linux-headers/linux/kvm.h | 23 +++++++++++++
linux-user/elfload.c | 67 ++++++++++++++++++++++++++++++++++++
linux-user/meson.build | 1 +
linux-user/qemu.h | 2 +-
linux-user/syscall.c | 3 ++
linux-user/syscall_defs.h | 9 ++---
meson.build | 1 +
pc-bios/meson.build | 1 +
qapi/machine-target.json | 6 ++--
qapi/machine.json | 2 +-
qapi/misc-target.json | 1 +
20 files changed, 138 insertions(+), 18 deletions(-)
diff --git a/hw/acpi/cpu.c b/hw/acpi/cpu.c
index b20903ea3..cd73fab65 100644
--- a/hw/acpi/cpu.c
+++ b/hw/acpi/cpu.c
@@ -371,14 +371,25 @@ void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
aml_append(cpu_ctrl_dev, aml_mutex(CPU_LOCK, 0));
crs = aml_resource_template();
+#ifdef __loongarch__
+ aml_append(crs, aml_memory32_fixed(io_base,
+ ACPI_CPU_HOTPLUG_REG_LEN, AML_READ_WRITE));
+#else
aml_append(crs, aml_io(AML_DECODE16, io_base, io_base, 1,
ACPI_CPU_HOTPLUG_REG_LEN));
+#endif
aml_append(cpu_ctrl_dev, aml_name_decl("_CRS", crs));
/* declare CPU hotplug MMIO region with related access fields */
+#ifdef __loongarch__
+ aml_append(cpu_ctrl_dev,
+ aml_operation_region("PRST", AML_SYSTEM_MEMORY, aml_int(io_base),
+ ACPI_CPU_HOTPLUG_REG_LEN));
+#else
aml_append(cpu_ctrl_dev,
aml_operation_region("PRST", AML_SYSTEM_IO, aml_int(io_base),
ACPI_CPU_HOTPLUG_REG_LEN));
+#endif
field = aml_field("PRST", AML_BYTE_ACC, AML_NOLOCK,
AML_WRITE_AS_ZEROS);
diff --git a/hw/loongarch/iocsr.c b/hw/loongarch/iocsr.c
index 14521c2d5..60daafd6e 100644
--- a/hw/loongarch/iocsr.c
+++ b/hw/loongarch/iocsr.c
@@ -59,6 +59,7 @@ enum {
IOCSR_MAX
};
+#ifdef CONFIG_KVM
static uint32_t iocsr_array[IOCSR_MAX] = {
[IOCSR_FEATURES] = LOONGARCH_IOCSR_FEATURES,
[IOCSR_VENDOR] = LOONGARCH_IOCSR_VENDOR,
@@ -66,6 +67,7 @@ static uint32_t iocsr_array[IOCSR_MAX] = {
[IOCSR_NODECNT] = LOONGARCH_IOCSR_NODECNT,
[IOCSR_MISC_FUNC] = LOONGARCH_IOCSR_MISC_FUNC,
};
+#endif
#define TYPE_IOCSR "iocsr"
diff --git a/hw/loongarch/larch_3a.c b/hw/loongarch/larch_3a.c
index 3db269274..3194a822c 100644
--- a/hw/loongarch/larch_3a.c
+++ b/hw/loongarch/larch_3a.c
@@ -846,7 +846,7 @@ static void fw_cfg_add_kernel_info(FWCfgState *fw_cfg,
if (0 < initrd_size) {
if (initrd_size > highram_size) {
error_report("initrd size is too big, should below %ld MB",
- highram_size / S_1MiB);
+ highram_size / MiB);
/*prevent write io memory address space*/
exit(1);
}
@@ -1033,7 +1033,9 @@ static void *ls3a_intctl_init(MachineState *machine, CPULOONGARCHState *env[])
SysBusDevice *busdev;
MemoryRegion *address_space_mem = get_system_memory();
MemoryRegion *iomem = NULL;
+#ifdef CONFIG_KVM
int i;
+#endif
s = g_malloc0(sizeof(ls3a_intctlstate));
@@ -1214,8 +1216,6 @@ static void loongarch_build_smbios(LoongarchMachineState *lsms)
product = "Loongarch-3A5K-7A1000-TCG";
}
- host_cpufreq = get_host_cpu_freq();
-
smbios_set_defaults("Loongson", product, lsmc->cpu_name, false,
true, NULL, NULL, SMBIOS_ENTRY_POINT_30);
@@ -1672,15 +1672,15 @@ static void ls3a5k_init(MachineState *args)
offset += lowram_size;
if (nb_numa_nodes > 0) {
- highram_size = numa_info[0].node_mem - S_256MiB;
- if (numa_info[0].node_mem > S_1GiB) {
- memmap_size = numa_info[0].node_mem - S_1GiB;
+ 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 - S_256MiB;
- if (ram_size > S_1GiB) {
- memmap_size = ram_size - S_1GiB;
+ highram_size = ram_size - 256 * MiB;
+ if (ram_size > GiB) {
+ memmap_size = ram_size - GiB;
la_memmap_add_entry(0xc0000000ULL, memmap_size, SYSTEM_RAM);
}
}
diff --git a/hw/meson.build b/hw/meson.build
index b3366c888..f224f8ad2 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/include/disas/dis-asm.h b/include/disas/dis-asm.h
index 08e1beec8..95b93f100 100644
--- a/include/disas/dis-asm.h
+++ b/include/disas/dis-asm.h
@@ -461,6 +461,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 4edab8e5a..c614bfb12 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/loongarch/larch.h b/include/hw/loongarch/larch.h
index 0886ed52a..62e2830e2 100644
--- a/include/hw/loongarch/larch.h
+++ b/include/hw/loongarch/larch.h
@@ -159,5 +159,4 @@ bool loongarch_is_acpi_enabled(LoongarchMachineState *vms);
void ls7a_madt_cpu_entry(AcpiDeviceIf *adev, int uid,
const CPUArchIdList *apic_ids, GArray *entry, bool force_enabled);
void slave_cpu_reset(void *opaque);
-extern uint64_t host_cpufreq;
#endif
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
index 60718fc34..903475bb2 100644
--- a/include/qemu/osdep.h
+++ b/include/qemu/osdep.h
@@ -533,6 +533,9 @@ 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 70c579560..62d1a4b92 100644
--- a/include/sysemu/arch_init.h
+++ b/include/sysemu/arch_init.h
@@ -24,6 +24,7 @@ enum {
QEMU_ARCH_RX = (1 << 20),
QEMU_ARCH_AVR = (1 << 21),
QEMU_ARCH_HEXAGON = (1 << 22),
+ QEMU_ARCH_LOONGARCH64 = (1 << 23),
};
extern const uint32_t arch_type;
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
index c65930288..0e50d3749 100644
--- a/linux-headers/linux/kvm.h
+++ b/linux-headers/linux/kvm.h
@@ -2115,6 +2115,29 @@ 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 165
+#define KVM_CAP_LOONGARCH_LSX 166
+#define KVM_CAP_LOONGARCH_VZ 167
+#define KVM_REG_LOONGARCH 0x8000000000000000ULL
+#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 767f54c76..9fb632780 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1041,6 +1041,73 @@ 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;
+
+ for (i = 0; i < TARGET_EF_R0; i++) {
+ (*regs)[i] = 0;
+ }
+ (*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/meson.build b/linux-user/meson.build
index bf62c13e3..195f9e83a 100644
--- a/linux-user/meson.build
+++ b/linux-user/meson.build
@@ -39,3 +39,4 @@ subdir('sh4')
subdir('sparc')
subdir('x86_64')
subdir('xtensa')
+subdir('loongarch64')
diff --git a/linux-user/qemu.h b/linux-user/qemu.h
index 5c713fa8a..66ddb25d1 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 f1cfcc810..729131ecd 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 0b1397593..7e2915d53 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,7 @@ 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 +2161,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 +2331,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 5f6ba86db..fc2dc58f3 100644
--- a/meson.build
+++ b/meson.build
@@ -1814,6 +1814,7 @@ disassemblers = {
'sh4' : ['CONFIG_SH4_DIS'],
'sparc' : ['CONFIG_SPARC_DIS'],
'xtensa' : ['CONFIG_XTENSA_DIS'],
+ 'loongarch64' : ['CONFIG_LOONGARCH_DIS'],
}
if link_language == 'cpp'
disassemblers += {
diff --git a/pc-bios/meson.build b/pc-bios/meson.build
index b40ff3f2b..a09ca4d03 100644
--- a/pc-bios/meson.build
+++ b/pc-bios/meson.build
@@ -83,6 +83,7 @@ blobs = files(
'opensbi-riscv32-generic-fw_dynamic.elf',
'opensbi-riscv64-generic-fw_dynamic.elf',
'npcm7xx_bootrom.bin',
+ 'loongarch_bios.bin',
)
if get_option('install_blobs')
diff --git a/qapi/machine-target.json b/qapi/machine-target.json
index f5ec4bc17..682dc86b4 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 a9f33d0f2..cd47b8d6b 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 ede905244..2cf4fa418 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' ] } }
##
--
2.43.5
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。