From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Song Gao" <gaosong@loongson.cn>,
"Xiaojuan Yang" <yangxiaojuan@loongson.cn>,
"Philippe Mathieu-Daudé" <f4bug@amsat.org>
Subject: [PULL 03/23] linux-user: Add LoongArch elf support
Date: Mon, 4 Jul 2022 15:03:37 +0530 [thread overview]
Message-ID: <20220704093357.983255-4-richard.henderson@linaro.org> (raw)
In-Reply-To: <20220704093357.983255-1-richard.henderson@linaro.org>
From: Song Gao <gaosong@loongson.cn>
Signed-off-by: Song Gao <gaosong@loongson.cn>
Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20220624031049.1716097-4-gaosong@loongson.cn>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/loongarch64/target_elf.h | 12 ++++
linux-user/elfload.c | 91 +++++++++++++++++++++++++++++
2 files changed, 103 insertions(+)
create mode 100644 linux-user/loongarch64/target_elf.h
diff --git a/linux-user/loongarch64/target_elf.h b/linux-user/loongarch64/target_elf.h
new file mode 100644
index 0000000000..95c3f05a46
--- /dev/null
+++ b/linux-user/loongarch64/target_elf.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (c) 2021 Loongson Technology Corporation Limited
+ */
+
+#ifndef LOONGARCH_TARGET_ELF_H
+#define LOONGARCH_TARGET_ELF_H
+static inline const char *cpu_get_model(uint32_t eflags)
+{
+ return "la464";
+}
+#endif
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index 163fc8a1ee..1de77c7959 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -922,6 +922,97 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUPPCState *en
#endif
+#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)
+{
+ /*Set crmd PG,DA = 1,0 */
+ regs->csr.crmd = 2 << 3;
+ regs->csr.era = infop->entry;
+ regs->regs[3] = infop->start_stack;
+}
+
+/* See linux kernel: arch/loongarch/include/asm/elf.h */
+#define ELF_NREG 45
+typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
+
+enum {
+ TARGET_EF_R0 = 0,
+ TARGET_EF_CSR_ERA = TARGET_EF_R0 + 33,
+ TARGET_EF_CSR_BADV = TARGET_EF_R0 + 34,
+};
+
+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->gpr); i++) {
+ (*regs)[TARGET_EF_R0 + i] = tswapreg(env->gpr[i]);
+ }
+
+ (*regs)[TARGET_EF_CSR_ERA] = tswapreg(env->pc);
+ (*regs)[TARGET_EF_CSR_BADV] = tswapreg(env->CSR_BADV);
+}
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 4096
+
+#define ELF_HWCAP get_elf_hwcap()
+
+/* See arch/loongarch/include/uapi/asm/hwcap.h */
+enum {
+ HWCAP_LOONGARCH_CPUCFG = (1 << 0),
+ HWCAP_LOONGARCH_LAM = (1 << 1),
+ HWCAP_LOONGARCH_UAL = (1 << 2),
+ HWCAP_LOONGARCH_FPU = (1 << 3),
+ HWCAP_LOONGARCH_LSX = (1 << 4),
+ HWCAP_LOONGARCH_LASX = (1 << 5),
+ HWCAP_LOONGARCH_CRC32 = (1 << 6),
+ HWCAP_LOONGARCH_COMPLEX = (1 << 7),
+ HWCAP_LOONGARCH_CRYPTO = (1 << 8),
+ HWCAP_LOONGARCH_LVZ = (1 << 9),
+ HWCAP_LOONGARCH_LBT_X86 = (1 << 10),
+ HWCAP_LOONGARCH_LBT_ARM = (1 << 11),
+ HWCAP_LOONGARCH_LBT_MIPS = (1 << 12),
+};
+
+static uint32_t get_elf_hwcap(void)
+{
+ LoongArchCPU *cpu = LOONGARCH_CPU(thread_cpu);
+ uint32_t hwcaps = 0;
+
+ hwcaps |= HWCAP_LOONGARCH_CRC32;
+
+ if (FIELD_EX32(cpu->env.cpucfg[1], CPUCFG1, UAL)) {
+ hwcaps |= HWCAP_LOONGARCH_UAL;
+ }
+
+ if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, FP)) {
+ hwcaps |= HWCAP_LOONGARCH_FPU;
+ }
+
+ if (FIELD_EX32(cpu->env.cpucfg[2], CPUCFG2, LAM)) {
+ hwcaps |= HWCAP_LOONGARCH_LAM;
+ }
+
+ return hwcaps;
+}
+
+#define ELF_PLATFORM "loongarch"
+
+#endif /* TARGET_LOONGARCH64 */
+
#ifdef TARGET_MIPS
#define ELF_START_MMAP 0x80000000
--
2.34.1
next prev parent reply other threads:[~2022-07-04 9:36 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-04 9:33 [PULL 00/23] loongarch64 patch queue Richard Henderson
2022-07-04 9:33 ` [PULL 01/23] linux-user: Add LoongArch generic header files Richard Henderson
2022-07-04 9:33 ` [PULL 02/23] linux-user: Add LoongArch signal support Richard Henderson
2022-07-04 9:33 ` Richard Henderson [this message]
2022-07-04 9:33 ` [PULL 04/23] linux-user: Add LoongArch syscall support Richard Henderson
2022-07-04 9:33 ` [PULL 05/23] linux-user: Add LoongArch cpu_loop support Richard Henderson
2022-07-04 9:33 ` [PULL 06/23] scripts: add loongarch64 binfmt config Richard Henderson
2022-07-04 9:33 ` [PULL 07/23] target/loongarch: remove badaddr from CPULoongArch Richard Henderson
2022-07-04 9:33 ` [PULL 08/23] target/loongarch: Fix missing update CSR_BADV Richard Henderson
2022-07-04 9:33 ` [PULL 09/23] target/loongarch: Fix helper_asrtle_d/asrtgt_d raise wrong exception Richard Henderson
2022-07-04 9:33 ` [PULL 10/23] target/loongarch: remove unused include hw/loader.h Richard Henderson
2022-07-04 9:33 ` [PULL 11/23] target/loongarch: Adjust functions and structure to support user-mode Richard Henderson
2022-07-04 9:33 ` [PULL 12/23] default-configs: Add loongarch linux-user support Richard Henderson
2022-07-04 9:33 ` [PULL 13/23] target/loongarch: Update README Richard Henderson
2023-03-06 14:29 ` Philippe Mathieu-Daudé
2023-03-07 1:53 ` gaosong
2023-03-07 10:03 ` Philippe Mathieu-Daudé
2022-07-04 9:33 ` [PULL 14/23] hw/intc/loongarch_pch_msi: Fix msi vector convertion Richard Henderson
2022-07-04 9:33 ` [PULL 15/23] hw/rtc/ls7a_rtc: Fix uninitialied bugs and toymatch writing function Richard Henderson
2022-07-04 9:33 ` [PULL 16/23] hw/rtc/ls7a_rtc: Fix timer call back function Richard Henderson
2022-07-04 9:33 ` [PULL 17/23] hw/rtc/ls7a_rtc: Remove unimplemented device in realized function Richard Henderson
2022-07-04 9:33 ` [PULL 18/23] hw/rtc/ls7a_rtc: Add reset function Richard Henderson
2022-07-04 9:33 ` [PULL 19/23] hw/rtc/ls7a_rtc: Fix rtc enable and disable function Richard Henderson
2022-07-04 9:33 ` [PULL 20/23] hw/rtc/ls7a_rtc: Use tm struct pointer as arguments in toy_time_to_val() Richard Henderson
2022-07-04 9:33 ` [PULL 21/23] hw/rtc/ls7a_rtc: Fix 'calculate' spelling errors Richard Henderson
2022-07-04 9:33 ` [PULL 22/23] target/loongarch: Fix the meaning of ECFG reg's VS field Richard Henderson
2022-07-04 9:33 ` [PULL 23/23] target/loongarch: Add lock when writing timer clear reg Richard Henderson
2022-07-04 15:16 ` [PULL 00/23] loongarch64 patch queue Richard Henderson
2022-07-05 7:31 ` Thomas Huth
2022-07-05 8:00 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220704093357.983255-4-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=f4bug@amsat.org \
--cc=gaosong@loongson.cn \
--cc=qemu-devel@nongnu.org \
--cc=yangxiaojuan@loongson.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).