summaryrefslogtreecommitdiffstats
path: root/linux-user
diff options
context:
space:
mode:
authorPeter Maydell2019-03-19 13:55:02 +0100
committerPeter Maydell2019-03-19 13:55:02 +0100
commitb98a66201dbc7cf3b962f4bb260f66100cc75578 (patch)
treec92ba2a23b71389ac9c5f68db0d60aca5d381396 /linux-user
parentMerge remote-tracking branch 'remotes/dgibson/tags/ppc-for-4.0-20190319' into... (diff)
parentriscv: sifive_u: Correct UART0's IRQ in the device tree (diff)
downloadqemu-b98a66201dbc7cf3b962f4bb260f66100cc75578.tar.gz
qemu-b98a66201dbc7cf3b962f4bb260f66100cc75578.tar.xz
qemu-b98a66201dbc7cf3b962f4bb260f66100cc75578.zip
Merge remote-tracking branch 'remotes/palmer/tags/riscv-for-master-4.0-rc0-2' into staging
RISC-V Patches for 4.0-rc0, Part 2 This patch set contains three major sources of bug fixes: * Jim has added support for GDB XML files, as well as fixing access to CSRs via the GDB stub. * Alistair has rebased a large set of fixes from Michael that were still in his patch queue. These fix bugs all over our tree, including: * Logging of PMP errors. * User ABI cleanups and fixes, most notably on RVE guests. * Fixes for interrupt emulation fidelity. * Improvements to the emulation fidelity of the sifive_u machine. * Bin Meng has improved the emulation fidelity of the SiFive UART, which now supports both TX and RX interrupts (as well as setting the correct interrupt line). # gpg: Signature made Tue 19 Mar 2019 12:42:11 GMT # gpg: using RSA key 00CE76D1834960DFCE886DF8EF4CA1502CCBAB41 # gpg: issuer "palmer@dabbelt.com" # gpg: Good signature from "Palmer Dabbelt <palmer@dabbelt.com>" [unknown] # gpg: aka "Palmer Dabbelt <palmer@sifive.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 00CE 76D1 8349 60DF CE88 6DF8 EF4C A150 2CCB AB41 * remotes/palmer/tags/riscv-for-master-4.0-rc0-2: riscv: sifive_u: Correct UART0's IRQ in the device tree riscv: sifive_uart: Generate TX interrupt target/riscv: Remove unused struct riscv: sifive_u: Allow up to 4 CPUs to be created RISC-V: Update load reservation comment in do_interrupt RISC-V: Convert trap debugging to trace events RISC-V: Add support for vectored interrupts RISC-V: Change local interrupts from edge to level RISC-V: linux-user support for RVE ABI elf: Add RISC-V PSABI ELF header defines RISC-V: Remove unnecessary disassembler constraints RISC-V: Allow interrupt controllers to claim interrupts RISC-V: Replace __builtin_popcount with ctpop8 in PLIC riscv: pmp: Log pmp access errors as guest errors RISC-V: Add hooks to use the gdb xml files. RISC-V: Add debug support for accessing CSRs. RISC-V: Fixes to CSR_* register macros. RISC-V: Add 64-bit gdb xml files. RISC-V: Add 32-bit gdb xml files. Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'linux-user')
-rw-r--r--linux-user/riscv/cpu_loop.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/linux-user/riscv/cpu_loop.c b/linux-user/riscv/cpu_loop.c
index 4cf3e94632..a9bac4ca79 100644
--- a/linux-user/riscv/cpu_loop.c
+++ b/linux-user/riscv/cpu_loop.c
@@ -18,8 +18,10 @@
*/
#include "qemu/osdep.h"
+#include "qemu/error-report.h"
#include "qemu.h"
#include "cpu_loop-common.h"
+#include "elf.h"
void cpu_loop(CPURISCVState *env)
{
@@ -53,7 +55,8 @@ void cpu_loop(CPURISCVState *env)
ret = 0;
} else {
ret = do_syscall(env,
- env->gpr[xA7],
+ env->gpr[(env->elf_flags & EF_RISCV_RVE)
+ ? xT0 : xA7],
env->gpr[xA0],
env->gpr[xA1],
env->gpr[xA2],
@@ -113,6 +116,16 @@ void cpu_loop(CPURISCVState *env)
void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
{
+ CPUState *cpu = ENV_GET_CPU(env);
+ TaskState *ts = cpu->opaque;
+ struct image_info *info = ts->info;
+
env->pc = regs->sepc;
env->gpr[xSP] = regs->sp;
+ env->elf_flags = info->elf_flags;
+
+ if ((env->misa & RVE) && !(env->elf_flags & EF_RISCV_RVE)) {
+ error_report("Incompatible ELF: RVE cpu requires RVE ABI binary");
+ exit(EXIT_FAILURE);
+ }
}