From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Cc: patches@linaro.org, "Michael Matz" <matz@suse.de>,
"Claudio Fontana" <claudio.fontana@linaro.org>,
"Dirk Mueller" <dmueller@suse.de>,
"Will Newton" <will.newton@linaro.org>,
"Laurent Desnogues" <laurent.desnogues@gmail.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
kvmarm@lists.cs.columbia.edu,
"Christoffer Dall" <christoffer.dall@linaro.org>,
"Richard Henderson" <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH 13/21] target-arm: A64: Implement MRS/MSR/SYS/SYSL
Date: Tue, 17 Dec 2013 15:12:16 +0000 [thread overview]
Message-ID: <1387293144-11554-14-git-send-email-peter.maydell@linaro.org> (raw)
In-Reply-To: <1387293144-11554-1-git-send-email-peter.maydell@linaro.org>
The AArch64 equivalent of the traditional AArch32
cp15 coprocessor registers is the set of instructions
MRS/MSR/SYS/SYSL, which cover between them both true
system registers and the "operations with side effects"
such as cache maintenance which in AArch32 are mixed
in with other cp15 registers. Implement these instructions
to look in the cpregs hashtable for the register or
operation.
Since we don't yet populate the cpregs hashtable with
any registers with the "AA64" bit set, everything will
still UNDEF at this point.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
target-arm/translate-a64.c | 115 +++++++++++++++++++++++++++++++++------------
1 file changed, 86 insertions(+), 29 deletions(-)
diff --git a/target-arm/translate-a64.c b/target-arm/translate-a64.c
index 38017a3..dd37962 100644
--- a/target-arm/translate-a64.c
+++ b/target-arm/translate-a64.c
@@ -113,6 +113,13 @@ void gen_a64_set_pc_im(uint64_t val)
tcg_gen_movi_i64(cpu_pc, val);
}
+/* Force a TB lookup after an instruction that changes the CPU state */
+static inline void gen_lookup_tb(DisasContext *s)
+{
+ gen_a64_set_pc_im(s->pc);
+ s->is_jmp = DISAS_UPDATE;
+}
+
static void gen_exception(int excp)
{
TCGv_i32 tmp = tcg_temp_new_i32();
@@ -731,28 +738,88 @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
unsupported_encoding(s, insn);
}
-/* C5.6.204 SYS */
-static void handle_sys(DisasContext *s, uint32_t insn, unsigned int l,
- unsigned int op1, unsigned int op2,
+/* C5.6.129 MRS - move from system register
+ * C5.6.131 MSR (register) - move to system register
+ * C5.6.204 SYS
+ * C5.6.205 SYSL
+ * These are all essentially the same insn in 'read' and 'write'
+ * versions, with varying op0 fields.
+ */
+static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
+ unsigned int op0, unsigned int op1, unsigned int op2,
unsigned int crn, unsigned int crm, unsigned int rt)
{
- unsupported_encoding(s, insn);
-}
+ const ARMCPRegInfo *ri;
+ TCGv_i64 tcg_rt;
-/* C5.6.129 MRS - move from system register */
-static void handle_mrs(DisasContext *s, uint32_t insn, unsigned int op0,
- unsigned int op1, unsigned int op2,
- unsigned int crn, unsigned int crm, unsigned int rt)
-{
- unsupported_encoding(s, insn);
-}
+ ri = get_arm_cp_reginfo(s->cp_regs,
+ ENCODE_AA64_CP_REG(CP_REG_ARM64_SYSREG_CP,
+ crn, crm, op0, op1, op2));
-/* C5.6.131 MSR (register) - move to system register */
-static void handle_msr(DisasContext *s, uint32_t insn, unsigned int op0,
- unsigned int op1, unsigned int op2,
- unsigned int crn, unsigned int crm, unsigned int rt)
-{
- unsupported_encoding(s, insn);
+ if (!ri) {
+ /* Unknown register */
+ unallocated_encoding(s);
+ return;
+ }
+
+ /* Check access permissions */
+ if (!cp_access_ok(env, ri, isread)) {
+ unallocated_encoding(s);
+ return;
+ }
+
+ /* Handle special cases first */
+ switch (ri->type & ~(ARM_CP_FLAG_MASK & ~ARM_CP_SPECIAL)) {
+ case ARM_CP_NOP:
+ return;
+ default:
+ break;
+ }
+
+ if (use_icount && (ri->type & ARM_CP_IO)) {
+ gen_io_start();
+ }
+
+ tcg_rt = cpu_reg(s, rt);
+
+ if (isread) {
+ if (ri->type & ARM_CP_CONST) {
+ tcg_gen_movi_i64(tcg_rt, ri->resetvalue);
+ } else if (ri->readfn) {
+ TCGv_ptr tmpptr;
+ gen_a64_set_pc_im(s->pc - 4);
+ tmpptr = tcg_const_ptr(ri);
+ gen_helper_get_cp_reg64(tcg_rt, cpu_env, tmpptr);
+ tcg_temp_free_ptr(tmpptr);
+ } else {
+ tcg_gen_ld_i64(tcg_rt, cpu_env, ri->fieldoffset);
+ }
+ } else {
+ if (ri->type & ARM_CP_CONST) {
+ /* If not forbidden by access permissions, treat as WI */
+ return;
+ } else if (ri->writefn) {
+ TCGv_ptr tmpptr;
+ gen_a64_set_pc_im(s->pc - 4);
+ tmpptr = tcg_const_ptr(ri);
+ gen_helper_set_cp_reg64(cpu_env, tmpptr, tcg_rt);
+ tcg_temp_free_ptr(tmpptr);
+ } else {
+ tcg_gen_st_i64(tcg_rt, cpu_env, ri->fieldoffset);
+ }
+ }
+
+ if (use_icount && (ri->type & ARM_CP_IO)) {
+ /* I/O operations must end the TB here (whether read or write) */
+ gen_io_end();
+ gen_lookup_tb(s);
+ } else if (!isread && !(ri->type & ARM_CP_SUPPRESS_TB_END)) {
+ /* We default to ending the TB on a coprocessor register write,
+ * but allow this to be suppressed by the register definition
+ * (usually only necessary to work around guest bugs).
+ */
+ gen_lookup_tb(s);
+ }
}
/* C3.2.4 System
@@ -793,17 +860,7 @@ static void disas_system(DisasContext *s, uint32_t insn)
}
return;
}
-
- if (op0 == 1) {
- /* C5.6.204 SYS */
- handle_sys(s, insn, l, op1, op2, crn, crm, rt);
- } else if (l) { /* op0 > 1 */
- /* C5.6.129 MRS - move from system register */
- handle_mrs(s, insn, op0, op1, op2, crn, crm, rt);
- } else {
- /* C5.6.131 MSR (register) - move to system register */
- handle_msr(s, insn, op0, op1, op2, crn, crm, rt);
- }
+ handle_sys(s, insn, l, op0, op1, op2, crn, crm, rt);
}
/* C3.2.3 Exception generation
--
1.8.5
next prev parent reply other threads:[~2013-12-17 15:27 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-17 15:12 [Qemu-devel] [PATCH 00/21] target-arm: A64 decoder sets 3 and 4: everything but fp & simd Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 01/21] target-arm: A64: add support for ld/st pair Peter Maydell
2013-12-19 16:58 ` Richard Henderson
2013-12-19 17:25 ` Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 02/21] target-arm: A64: add support for ld/st unsigned imm Peter Maydell
2013-12-19 17:46 ` Richard Henderson
2013-12-20 16:08 ` Peter Maydell
2013-12-20 16:26 ` Richard Henderson
2013-12-20 16:29 ` Peter Maydell
2013-12-20 16:44 ` Richard Henderson
2013-12-20 16:52 ` Peter Maydell
2013-12-20 16:57 ` Richard Henderson
2013-12-20 17:16 ` Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 03/21] target-arm: A64: add support for ld/st with reg offset Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 04/21] target-arm: A64: add support for ld/st with index Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 05/21] target-arm: A64: add support for add, addi, sub, subi Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 06/21] target-arm: A64: add support for move wide instructions Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 07/21] target-arm: A64: add support for 3 src data proc insns Peter Maydell
2013-12-19 19:29 ` Richard Henderson
2013-12-20 13:18 ` Peter Maydell
2013-12-20 14:10 ` Richard Henderson
2013-12-20 14:19 ` Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 08/21] target-arm: A64: implement SVC, BRK Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 09/21] target-arm: A64: Add decoder skeleton for FP instructions Peter Maydell
2013-12-19 20:00 ` Richard Henderson
2013-12-17 15:12 ` [Qemu-devel] [PATCH 10/21] target-arm: A64: implement FMOV Peter Maydell
2013-12-19 20:18 ` Richard Henderson
2013-12-17 15:12 ` [Qemu-devel] [PATCH 11/21] target-arm: Update generic cpreg code for AArch64 Peter Maydell
2013-12-19 6:01 ` Peter Crosthwaite
2013-12-19 9:11 ` Peter Maydell
2013-12-20 4:24 ` Peter Crosthwaite
2013-12-20 10:00 ` Peter Maydell
2013-12-20 18:16 ` Peter Maydell
2013-12-20 21:41 ` Peter Crosthwaite
2013-12-20 22:07 ` Peter Maydell
2013-12-20 22:16 ` Peter Maydell
2013-12-22 19:50 ` Peter Maydell
2013-12-20 22:29 ` Peter Crosthwaite
2013-12-20 23:04 ` Peter Maydell
2013-12-20 17:41 ` Peter Maydell
2013-12-20 4:25 ` Peter Crosthwaite
2013-12-20 16:43 ` Peter Maydell
2013-12-20 18:53 ` Christoffer Dall
2013-12-17 15:12 ` [Qemu-devel] [PATCH 12/21] target-arm: Remove ARMCPU/CPUARMState from cpregs APIs used by decoder Peter Maydell
2013-12-17 15:12 ` Peter Maydell [this message]
2013-12-19 20:30 ` [Qemu-devel] [PATCH 13/21] target-arm: A64: Implement MRS/MSR/SYS/SYSL Richard Henderson
2013-12-20 13:27 ` Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 14/21] target-arm: A64: Implement minimal set of EL0-visible sysregs Peter Maydell
2013-12-19 20:35 ` Richard Henderson
2013-12-21 22:56 ` Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 15/21] target-arm: Widen thread-local register state fields to 64 bits Peter Maydell
2013-12-19 20:53 ` Richard Henderson
2013-12-19 21:04 ` Peter Maydell
2013-12-19 21:09 ` Richard Henderson
2013-12-17 15:12 ` [Qemu-devel] [PATCH 16/21] target-arm: A64: add support for add/sub with carry Peter Maydell
2013-12-19 20:57 ` Richard Henderson
2013-12-17 15:12 ` [Qemu-devel] [PATCH 17/21] target-arm: A64: add support for conditional compare insns Peter Maydell
2013-12-19 21:04 ` Richard Henderson
2013-12-19 21:23 ` Peter Maydell
2013-12-19 21:26 ` Richard Henderson
2013-12-19 21:31 ` Peter Maydell
2013-12-20 16:19 ` Peter Maydell
2013-12-20 16:22 ` Richard Henderson
2013-12-17 15:12 ` [Qemu-devel] [PATCH 18/21] target-arm: aarch64: add support for ld lit Peter Maydell
2013-12-19 21:07 ` Richard Henderson
2013-12-17 15:12 ` [Qemu-devel] [PATCH 19/21] target-arm: Widen exclusive-access support struct fields to 64 bits Peter Maydell
2013-12-17 15:12 ` [Qemu-devel] [PATCH 20/21] target-arm: A64: support for ld/st/cl exclusive Peter Maydell
2013-12-19 21:15 ` Richard Henderson
2013-12-17 15:12 ` [Qemu-devel] [PATCH 21/21] default-configs: Add config for aarch64-linux-user Peter Maydell
2013-12-19 21:15 ` 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=1387293144-11554-14-git-send-email-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=christoffer.dall@linaro.org \
--cc=claudio.fontana@linaro.org \
--cc=dmueller@suse.de \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=laurent.desnogues@gmail.com \
--cc=matz@suse.de \
--cc=patches@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
--cc=will.newton@linaro.org \
/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).