1
The following changes since commit 3d48b6b687c558a042d91370633b91c6e29e0e05:
1
v2: Fix target/loongarch printf formats for vaddr
2
Include two more reviewed patches.
2
3
3
Merge tag 'pull-request-2024-05-14' of https://gitlab.com/thuth/qemu into staging (2024-05-14 17:24:04 +0200)
4
4
5
are available in the Git repository at:
5
r~
6
7
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20240515
8
9
for you to fetch changes up to c9290dfebfdba5c13baa5e1f10e13a1c876b0643:
10
11
tcg/loongarch64: Fill out tcg_out_{ld,st} for vector regs (2024-05-15 08:57:39 +0200)
12
13
----------------------------------------------------------------
14
tcg/loongarch64: Fill out tcg_out_{ld,st} for vector regs
15
accel/tcg: Improve disassembly for target and plugin
16
17
----------------------------------------------------------------
18
Philippe Mathieu-Daudé (1):
19
accel/tcg: Remove cpu_ldsb_code / cpu_ldsw_code
20
21
Richard Henderson (33):
22
accel/tcg: Use vaddr in translator_ld*
23
accel/tcg: Hide in_same_page outside of a target-specific context
24
accel/tcg: Pass DisasContextBase to translator_fake_ldb
25
accel/tcg: Reorg translator_ld*
26
accel/tcg: Cap the translation block when we encounter mmio
27
accel/tcg: Record mmio bytes during translation
28
accel/tcg: Record when translator_fake_ldb is used
29
accel/tcg: Record DisasContextBase in tcg_ctx for plugins
30
plugins: Copy memory in qemu_plugin_insn_data
31
accel/tcg: Implement translator_st
32
plugins: Use translator_st for qemu_plugin_insn_data
33
plugins: Read mem_only directly from TB cflags
34
plugins: Use DisasContextBase for qemu_plugin_insn_haddr
35
plugins: Use DisasContextBase for qemu_plugin_tb_vaddr
36
plugins: Merge alloc_tcg_plugin_context into plugin_gen_tb_start
37
accel/tcg: Provide default implementation of disas_log
38
accel/tcg: Return bool from TranslatorOps.disas_log
39
disas: Split disas.c
40
disas: Use translator_st to get disassembly data
41
accel/tcg: Introduce translator_fake_ld
42
target/s390x: Fix translator_fake_ld length
43
target/s390x: Disassemble EXECUTEd instructions
44
target/hexagon: Use translator_ldl in pkt_crosses_page
45
target/microblaze: Use translator_ldl
46
target/i386: Use translator_ldub for everything
47
target/avr: Use translator_lduw
48
target/cris: Use translator_ld* in cris_fetch
49
target/cris: Use cris_fetch in translate_v10.c.inc
50
target/riscv: Use translator_ld* for everything
51
target/rx: Use translator_ld*
52
target/xtensa: Use translator_ldub in xtensa_insn_len
53
target/s390x: Use translator_lduw in get_next_pc
54
tcg/loongarch64: Fill out tcg_out_{ld,st} for vector regs
55
56
disas/disas-internal.h | 4 +
57
include/disas/disas.h | 9 +-
58
include/exec/cpu_ldst.h | 10 --
59
include/exec/plugin-gen.h | 7 +-
60
include/exec/translator.h | 74 ++++++---
61
include/qemu/plugin.h | 22 +--
62
include/qemu/qemu-plugin.h | 15 +-
63
include/qemu/typedefs.h | 1 +
64
include/tcg/tcg.h | 1 +
65
accel/tcg/plugin-gen.c | 63 +++-----
66
accel/tcg/translator.c | 331 ++++++++++++++++++++++++--------------
67
contrib/plugins/execlog.c | 5 +-
68
contrib/plugins/howvec.c | 4 +-
69
disas/disas-common.c | 104 ++++++++++++
70
disas/disas-host.c | 129 +++++++++++++++
71
disas/disas-mon.c | 15 ++
72
disas/disas-target.c | 99 ++++++++++++
73
disas/disas.c | 338 ---------------------------------------
74
disas/objdump.c | 37 +++++
75
plugins/api.c | 57 +++++--
76
target/alpha/translate.c | 9 --
77
target/arm/tcg/translate-a64.c | 11 --
78
target/arm/tcg/translate.c | 12 --
79
target/avr/translate.c | 11 +-
80
target/cris/translate.c | 37 +----
81
target/hexagon/translate.c | 11 +-
82
target/hppa/translate.c | 21 ++-
83
target/i386/tcg/translate.c | 19 +--
84
target/loongarch/tcg/translate.c | 8 -
85
target/m68k/translate.c | 9 --
86
target/microblaze/translate.c | 11 +-
87
target/mips/tcg/translate.c | 9 --
88
target/openrisc/translate.c | 11 --
89
target/ppc/translate.c | 9 --
90
target/riscv/translate.c | 24 +--
91
target/rx/translate.c | 35 ++--
92
target/s390x/tcg/translate.c | 26 ++-
93
target/sh4/translate.c | 9 --
94
target/sparc/translate.c | 9 --
95
target/tricore/translate.c | 9 --
96
target/xtensa/translate.c | 12 +-
97
tcg/tcg.c | 12 --
98
target/cris/translate_v10.c.inc | 30 ++--
99
tcg/loongarch64/tcg-target.c.inc | 103 +++++++++---
100
disas/meson.build | 8 +-
101
45 files changed, 899 insertions(+), 891 deletions(-)
102
create mode 100644 disas/disas-common.c
103
create mode 100644 disas/disas-host.c
104
create mode 100644 disas/disas-target.c
105
delete mode 100644 disas/disas.c
106
create mode 100644 disas/objdump.c
107
diff view generated by jsdifflib
1
We don't need to allocate plugin context at startup,
1
These should have been removed with the rest. There are
2
we can wait until we actually use it.
2
a couple of hosts which can emit guest_base into the
3
constant pool: aarch64, mips64, ppc64, riscv64.
3
4
5
Fixes: a417ef835058 ("tcg: Remove TCG_TARGET_NEED_LDST_LABELS and TCG_TARGET_NEED_POOL_LABELS")
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
8
---
7
accel/tcg/plugin-gen.c | 36 ++++++++++++++++++++----------------
9
tcg/tci/tcg-target.h | 1 -
8
tcg/tcg.c | 11 -----------
10
tcg/tcg.c | 4 ----
9
2 files changed, 20 insertions(+), 27 deletions(-)
11
2 files changed, 5 deletions(-)
10
12
11
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
13
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/accel/tcg/plugin-gen.c
15
--- a/tcg/tci/tcg-target.h
14
+++ b/accel/tcg/plugin-gen.c
16
+++ b/tcg/tci/tcg-target.h
15
@@ -XXX,XX +XXX,XX @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
17
@@ -XXX,XX +XXX,XX @@ typedef enum {
16
18
} TCGReg;
17
bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db)
19
18
{
20
#define HAVE_TCG_QEMU_TB_EXEC
19
- bool ret = false;
21
-#define TCG_TARGET_NEED_POOL_LABELS
20
+ struct qemu_plugin_tb *ptb;
22
21
23
#endif /* TCG_TARGET_H */
22
- if (test_bit(QEMU_PLUGIN_EV_VCPU_TB_TRANS, cpu->plugin_state->event_mask)) {
23
- struct qemu_plugin_tb *ptb = tcg_ctx->plugin_tb;
24
-
25
- /* reset callbacks */
26
- if (ptb->cbs) {
27
- g_array_set_size(ptb->cbs, 0);
28
- }
29
- ptb->n = 0;
30
-
31
- ret = true;
32
-
33
- ptb->mem_helper = false;
34
-
35
- tcg_gen_plugin_cb(PLUGIN_GEN_FROM_TB);
36
+ if (!test_bit(QEMU_PLUGIN_EV_VCPU_TB_TRANS,
37
+ cpu->plugin_state->event_mask)) {
38
+ return false;
39
}
40
41
tcg_ctx->plugin_db = db;
42
tcg_ctx->plugin_insn = NULL;
43
+ ptb = tcg_ctx->plugin_tb;
44
45
- return ret;
46
+ if (ptb) {
47
+ /* Reset callbacks */
48
+ if (ptb->cbs) {
49
+ g_array_set_size(ptb->cbs, 0);
50
+ }
51
+ ptb->n = 0;
52
+ ptb->mem_helper = false;
53
+ } else {
54
+ ptb = g_new0(struct qemu_plugin_tb, 1);
55
+ tcg_ctx->plugin_tb = ptb;
56
+ ptb->insns = g_ptr_array_new();
57
+ }
58
+
59
+ tcg_gen_plugin_cb(PLUGIN_GEN_FROM_TB);
60
+ return true;
61
}
62
63
void plugin_gen_insn_start(CPUState *cpu, const DisasContextBase *db)
64
diff --git a/tcg/tcg.c b/tcg/tcg.c
24
diff --git a/tcg/tcg.c b/tcg/tcg.c
65
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
66
--- a/tcg/tcg.c
26
--- a/tcg/tcg.c
67
+++ b/tcg/tcg.c
27
+++ b/tcg/tcg.c
68
@@ -XXX,XX +XXX,XX @@ QEMU_BUILD_BUG_ON((int)(offsetof(CPUNegativeOffsetState, tlb.f[0]) -
28
@@ -XXX,XX +XXX,XX @@ void tcg_prologue_init(void)
69
< MIN_TLB_MASK_TABLE_OFS);
29
tcg_qemu_tb_exec = (tcg_prologue_fn *)tcg_splitwx_to_rx(s->code_ptr);
70
#endif
30
#endif
71
31
72
-static void alloc_tcg_plugin_context(TCGContext *s)
32
-#ifdef TCG_TARGET_NEED_POOL_LABELS
73
-{
33
s->pool_labels = NULL;
74
-#ifdef CONFIG_PLUGIN
75
- s->plugin_tb = g_new0(struct qemu_plugin_tb, 1);
76
- s->plugin_tb->insns = g_ptr_array_new();
77
-#endif
34
-#endif
78
-}
35
79
-
36
qemu_thread_jit_write();
80
/*
37
/* Generate the prologue. */
81
* All TCG threads except the parent (i.e. the one that called tcg_context_init
38
tcg_target_qemu_prologue(s);
82
* and registered the target's TCG globals) must register with this function
39
83
@@ -XXX,XX +XXX,XX @@ void tcg_register_thread(void)
40
-#ifdef TCG_TARGET_NEED_POOL_LABELS
84
qatomic_set(&tcg_ctxs[n], s);
41
/* Allow the prologue to put e.g. guest_base into a pool entry. */
85
42
{
86
if (n > 0) {
43
int result = tcg_out_pool_finalize(s);
87
- alloc_tcg_plugin_context(s);
44
tcg_debug_assert(result == 0);
88
tcg_region_initial_alloc(s);
89
}
45
}
90
46
-#endif
91
@@ -XXX,XX +XXX,XX @@ static void tcg_context_init(unsigned max_cpus)
47
92
indirect_reg_alloc_order[i] = tcg_target_reg_alloc_order[i];
48
prologue_size = tcg_current_code_size(s);
93
}
49
perf_report_prologue(s->code_gen_ptr, prologue_size);
94
95
- alloc_tcg_plugin_context(s);
96
-
97
tcg_ctx = s;
98
/*
99
* In user-mode we simply share the init context among threads, since we
100
--
50
--
101
2.34.1
51
2.43.0
102
52
103
53
diff view generated by jsdifflib
1
The routines in disas-common.c are also used from disas-mon.c.
1
This is now prohibited in configuration.
2
Otherwise the rest of disassembly is only used from tcg.
2
3
While we're at it, put host and target code into separate files.
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
5
---
8
disas/disas-internal.h | 4 +
6
include/qemu/atomic.h | 18 +++--------------
9
include/disas/disas.h | 4 +
7
include/tcg/oversized-guest.h | 23 ----------------------
10
disas/disas-common.c | 118 ++++++++++++++
8
accel/tcg/cputlb.c | 7 -------
11
disas/disas-host.c | 129 ++++++++++++++++
9
accel/tcg/tcg-all.c | 9 ++++-----
12
disas/disas-target.c | 84 ++++++++++
10
target/arm/ptw.c | 34 ---------------------------------
13
disas/disas.c | 338 -----------------------------------------
11
target/riscv/cpu_helper.c | 13 +------------
14
disas/objdump.c | 37 +++++
12
docs/devel/multi-thread-tcg.rst | 1 -
15
disas/meson.build | 8 +-
13
7 files changed, 8 insertions(+), 97 deletions(-)
16
8 files changed, 382 insertions(+), 340 deletions(-)
14
delete mode 100644 include/tcg/oversized-guest.h
17
create mode 100644 disas/disas-common.c
15
18
create mode 100644 disas/disas-host.c
16
diff --git a/include/qemu/atomic.h b/include/qemu/atomic.h
19
create mode 100644 disas/disas-target.c
17
index XXXXXXX..XXXXXXX 100644
20
delete mode 100644 disas/disas.c
18
--- a/include/qemu/atomic.h
21
create mode 100644 disas/objdump.c
19
+++ b/include/qemu/atomic.h
22
20
@@ -XXX,XX +XXX,XX @@
23
diff --git a/disas/disas-internal.h b/disas/disas-internal.h
21
*/
24
index XXXXXXX..XXXXXXX 100644
22
#define signal_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)
25
--- a/disas/disas-internal.h
23
26
+++ b/disas/disas-internal.h
24
-/* Sanity check that the size of an atomic operation isn't "overly large".
27
@@ -XXX,XX +XXX,XX @@ typedef struct CPUDebug {
28
CPUState *cpu;
29
} CPUDebug;
30
31
+void disas_initialize_debug(CPUDebug *s);
32
void disas_initialize_debug_target(CPUDebug *s, CPUState *cpu);
33
int disas_gstring_printf(FILE *stream, const char *fmt, ...)
34
G_GNUC_PRINTF(2, 3);
35
36
+int print_insn_od_host(bfd_vma pc, disassemble_info *info);
37
+int print_insn_od_target(bfd_vma pc, disassemble_info *info);
38
+
39
#endif
40
diff --git a/include/disas/disas.h b/include/disas/disas.h
41
index XXXXXXX..XXXXXXX 100644
42
--- a/include/disas/disas.h
43
+++ b/include/disas/disas.h
44
@@ -XXX,XX +XXX,XX @@
45
#define QEMU_DISAS_H
46
47
/* Disassemble this for me please... (debugging). */
48
+#ifdef CONFIG_TCG
49
void disas(FILE *out, const void *code, size_t size);
50
void target_disas(FILE *out, CPUState *cpu, uint64_t code, size_t size);
51
+#endif
52
53
void monitor_disas(Monitor *mon, CPUState *cpu, uint64_t pc,
54
int nb_insn, bool is_physical);
55
56
+#ifdef CONFIG_PLUGIN
57
char *plugin_disas(CPUState *cpu, uint64_t addr, size_t size);
58
+#endif
59
60
/* Look up symbol for debugging purpose. Returns "" if unknown. */
61
const char *lookup_symbol(uint64_t orig_addr);
62
diff --git a/disas/disas-common.c b/disas/disas-common.c
63
new file mode 100644
64
index XXXXXXX..XXXXXXX
65
--- /dev/null
66
+++ b/disas/disas-common.c
67
@@ -XXX,XX +XXX,XX @@
68
+/*
25
+/*
69
+ * Common routines for disassembly.
26
+ * Sanity check that the size of an atomic operation isn't "overly large".
70
+ * SPDX-License-Identifier: GPL-2.0-or-later
27
* Despite the fact that e.g. i686 has 64-bit atomic operations, we do not
71
+ */
28
* want to use them because we ought not need them, and this lets us do a
72
+
29
* bit of sanity checking that other 32-bit hosts might build.
73
+#include "qemu/osdep.h"
30
- *
74
+#include "disas/disas.h"
31
- * That said, we have a problem on 64-bit ILP32 hosts in that in order to
75
+#include "disas/capstone.h"
32
- * sync with TCG_OVERSIZED_GUEST, this must match TCG_TARGET_REG_BITS.
76
+#include "hw/core/cpu.h"
33
- * We'd prefer not want to pull in everything else TCG related, so handle
77
+#include "exec/tswap.h"
34
- * those few cases by hand.
78
+#include "exec/memory.h"
35
- *
79
+#include "disas-internal.h"
36
- * Note that x32 is fully detected with __x86_64__ + _ILP32, and that for
80
+
37
- * Sparc we always force the use of sparcv9 in configure. MIPS n32 (ILP32) &
81
+
38
- * n64 (LP64) ABIs are both detected using __mips64.
82
+/* Filled in by elfload.c. Simplistic, but will do for now. */
39
*/
83
+struct syminfo *syminfos = NULL;
40
-#if defined(__x86_64__) || defined(__sparc__) || defined(__mips64)
84
+
41
-# define ATOMIC_REG_SIZE 8
85
+/*
42
-#else
86
+ * Get LENGTH bytes from info's buffer, at target address memaddr.
43
-# define ATOMIC_REG_SIZE sizeof(void *)
87
+ * Transfer them to myaddr.
44
-#endif
88
+ */
45
+#define ATOMIC_REG_SIZE sizeof(void *)
89
+static int target_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
46
90
+ struct disassemble_info *info)
47
/* Weak atomic operations prevent the compiler moving other
91
+{
48
* loads/stores past the atomic operation load/store. However there is
92
+ CPUDebug *s = container_of(info, CPUDebug, info);
49
diff --git a/include/tcg/oversized-guest.h b/include/tcg/oversized-guest.h
93
+ int r = cpu_memory_rw_debug(s->cpu, memaddr, myaddr, length, 0);
94
+ return r ? EIO : 0;
95
+}
96
+
97
+/*
98
+ * Print an error message. We can assume that this is in response to
99
+ * an error return from {host,target}_read_memory.
100
+ */
101
+static void perror_memory(int status, bfd_vma memaddr,
102
+ struct disassemble_info *info)
103
+{
104
+ if (status != EIO) {
105
+ /* Can't happen. */
106
+ info->fprintf_func(info->stream, "Unknown error %d\n", status);
107
+ } else {
108
+ /* Address between memaddr and memaddr + len was out of bounds. */
109
+ info->fprintf_func(info->stream,
110
+ "Address 0x%" PRIx64 " is out of bounds.\n",
111
+ memaddr);
112
+ }
113
+}
114
+
115
+/* Print address in hex. */
116
+static void print_address(bfd_vma addr, struct disassemble_info *info)
117
+{
118
+ info->fprintf_func(info->stream, "0x%" PRIx64, addr);
119
+}
120
+
121
+/* Stub prevents some fruitless earching in optabs disassemblers. */
122
+static int symbol_at_address(bfd_vma addr, struct disassemble_info *info)
123
+{
124
+ return 1;
125
+}
126
+
127
+void disas_initialize_debug(CPUDebug *s)
128
+{
129
+ memset(s, 0, sizeof(*s));
130
+ s->info.arch = bfd_arch_unknown;
131
+ s->info.cap_arch = -1;
132
+ s->info.cap_insn_unit = 4;
133
+ s->info.cap_insn_split = 4;
134
+ s->info.memory_error_func = perror_memory;
135
+ s->info.symbol_at_address_func = symbol_at_address;
136
+}
137
+
138
+void disas_initialize_debug_target(CPUDebug *s, CPUState *cpu)
139
+{
140
+ disas_initialize_debug(s);
141
+
142
+ s->cpu = cpu;
143
+ s->info.read_memory_func = target_read_memory;
144
+ s->info.print_address_func = print_address;
145
+ if (target_words_bigendian()) {
146
+ s->info.endian = BFD_ENDIAN_BIG;
147
+ } else {
148
+ s->info.endian = BFD_ENDIAN_LITTLE;
149
+ }
150
+
151
+ CPUClass *cc = CPU_GET_CLASS(cpu);
152
+ if (cc->disas_set_info) {
153
+ cc->disas_set_info(cpu, &s->info);
154
+ }
155
+}
156
+
157
+int disas_gstring_printf(FILE *stream, const char *fmt, ...)
158
+{
159
+ /* We abuse the FILE parameter to pass a GString. */
160
+ GString *s = (GString *)stream;
161
+ int initial_len = s->len;
162
+ va_list va;
163
+
164
+ va_start(va, fmt);
165
+ g_string_append_vprintf(s, fmt, va);
166
+ va_end(va);
167
+
168
+ return s->len - initial_len;
169
+}
170
+
171
+/* Look up symbol for debugging purpose. Returns "" if unknown. */
172
+const char *lookup_symbol(uint64_t orig_addr)
173
+{
174
+ const char *symbol = "";
175
+ struct syminfo *s;
176
+
177
+ for (s = syminfos; s; s = s->next) {
178
+ symbol = s->lookup_symbol(s, orig_addr);
179
+ if (symbol[0] != '\0') {
180
+ break;
181
+ }
182
+ }
183
+
184
+ return symbol;
185
+}
186
diff --git a/disas/disas-host.c b/disas/disas-host.c
187
new file mode 100644
188
index XXXXXXX..XXXXXXX
189
--- /dev/null
190
+++ b/disas/disas-host.c
191
@@ -XXX,XX +XXX,XX @@
192
+/*
193
+ * Routines for host instruction disassembly.
194
+ * SPDX-License-Identifier: GPL-2.0-or-later
195
+ */
196
+
197
+#include "qemu/osdep.h"
198
+#include "disas/disas.h"
199
+#include "disas/capstone.h"
200
+#include "disas-internal.h"
201
+
202
+
203
+/*
204
+ * Get LENGTH bytes from info's buffer, at host address memaddr.
205
+ * Transfer them to myaddr.
206
+ */
207
+static int host_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
208
+ struct disassemble_info *info)
209
+{
210
+ if (memaddr < info->buffer_vma
211
+ || memaddr + length > info->buffer_vma + info->buffer_length) {
212
+ /* Out of bounds. Use EIO because GDB uses it. */
213
+ return EIO;
214
+ }
215
+ memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length);
216
+ return 0;
217
+}
218
+
219
+/* Print address in hex, truncated to the width of a host virtual address. */
220
+static void host_print_address(bfd_vma addr, struct disassemble_info *info)
221
+{
222
+ info->fprintf_func(info->stream, "0x%" PRIxPTR, (uintptr_t)addr);
223
+}
224
+
225
+static void initialize_debug_host(CPUDebug *s)
226
+{
227
+ disas_initialize_debug(s);
228
+
229
+ s->info.read_memory_func = host_read_memory;
230
+ s->info.print_address_func = host_print_address;
231
+#if HOST_BIG_ENDIAN
232
+ s->info.endian = BFD_ENDIAN_BIG;
233
+#else
234
+ s->info.endian = BFD_ENDIAN_LITTLE;
235
+#endif
236
+#if defined(CONFIG_TCG_INTERPRETER)
237
+ s->info.print_insn = print_insn_tci;
238
+#elif defined(__i386__)
239
+ s->info.mach = bfd_mach_i386_i386;
240
+ s->info.cap_arch = CS_ARCH_X86;
241
+ s->info.cap_mode = CS_MODE_32;
242
+ s->info.cap_insn_unit = 1;
243
+ s->info.cap_insn_split = 8;
244
+#elif defined(__x86_64__)
245
+ s->info.mach = bfd_mach_x86_64;
246
+ s->info.cap_arch = CS_ARCH_X86;
247
+ s->info.cap_mode = CS_MODE_64;
248
+ s->info.cap_insn_unit = 1;
249
+ s->info.cap_insn_split = 8;
250
+#elif defined(_ARCH_PPC)
251
+ s->info.cap_arch = CS_ARCH_PPC;
252
+# ifdef _ARCH_PPC64
253
+ s->info.cap_mode = CS_MODE_64;
254
+# endif
255
+#elif defined(__riscv)
256
+#if defined(_ILP32) || (__riscv_xlen == 32)
257
+ s->info.print_insn = print_insn_riscv32;
258
+#elif defined(_LP64)
259
+ s->info.print_insn = print_insn_riscv64;
260
+#else
261
+#error unsupported RISC-V ABI
262
+#endif
263
+#elif defined(__aarch64__)
264
+ s->info.cap_arch = CS_ARCH_ARM64;
265
+#elif defined(__alpha__)
266
+ s->info.print_insn = print_insn_alpha;
267
+#elif defined(__sparc__)
268
+ s->info.print_insn = print_insn_sparc;
269
+ s->info.mach = bfd_mach_sparc_v9b;
270
+#elif defined(__arm__)
271
+ /* TCG only generates code for arm mode. */
272
+ s->info.cap_arch = CS_ARCH_ARM;
273
+#elif defined(__MIPSEB__)
274
+ s->info.print_insn = print_insn_big_mips;
275
+#elif defined(__MIPSEL__)
276
+ s->info.print_insn = print_insn_little_mips;
277
+#elif defined(__m68k__)
278
+ s->info.print_insn = print_insn_m68k;
279
+#elif defined(__s390__)
280
+ s->info.cap_arch = CS_ARCH_SYSZ;
281
+ s->info.cap_insn_unit = 2;
282
+ s->info.cap_insn_split = 6;
283
+#elif defined(__hppa__)
284
+ s->info.print_insn = print_insn_hppa;
285
+#elif defined(__loongarch__)
286
+ s->info.print_insn = print_insn_loongarch;
287
+#endif
288
+}
289
+
290
+/* Disassemble this for me please... (debugging). */
291
+void disas(FILE *out, const void *code, size_t size)
292
+{
293
+ uintptr_t pc;
294
+ int count;
295
+ CPUDebug s;
296
+
297
+ initialize_debug_host(&s);
298
+ s.info.fprintf_func = fprintf;
299
+ s.info.stream = out;
300
+ s.info.buffer = code;
301
+ s.info.buffer_vma = (uintptr_t)code;
302
+ s.info.buffer_length = size;
303
+ s.info.show_opcodes = true;
304
+
305
+ if (s.info.cap_arch >= 0 && cap_disas_host(&s.info, code, size)) {
306
+ return;
307
+ }
308
+
309
+ if (s.info.print_insn == NULL) {
310
+ s.info.print_insn = print_insn_od_host;
311
+ }
312
+ for (pc = (uintptr_t)code; size > 0; pc += count, size -= count) {
313
+ fprintf(out, "0x%08" PRIxPTR ": ", pc);
314
+ count = s.info.print_insn(pc, &s.info);
315
+ fprintf(out, "\n");
316
+ if (count < 0) {
317
+ break;
318
+ }
319
+ }
320
+}
321
diff --git a/disas/disas-target.c b/disas/disas-target.c
322
new file mode 100644
323
index XXXXXXX..XXXXXXX
324
--- /dev/null
325
+++ b/disas/disas-target.c
326
@@ -XXX,XX +XXX,XX @@
327
+/*
328
+ * Routines for target instruction disassembly.
329
+ * SPDX-License-Identifier: GPL-2.0-or-later
330
+ */
331
+
332
+#include "qemu/osdep.h"
333
+#include "disas/disas.h"
334
+#include "disas/capstone.h"
335
+#include "disas-internal.h"
336
+
337
+
338
+void target_disas(FILE *out, CPUState *cpu, uint64_t code, size_t size)
339
+{
340
+ uint64_t pc;
341
+ int count;
342
+ CPUDebug s;
343
+
344
+ disas_initialize_debug_target(&s, cpu);
345
+ s.info.fprintf_func = fprintf;
346
+ s.info.stream = out;
347
+ s.info.buffer_vma = code;
348
+ s.info.buffer_length = size;
349
+ s.info.show_opcodes = true;
350
+
351
+ if (s.info.cap_arch >= 0 && cap_disas_target(&s.info, code, size)) {
352
+ return;
353
+ }
354
+
355
+ if (s.info.print_insn == NULL) {
356
+ s.info.print_insn = print_insn_od_target;
357
+ }
358
+
359
+ for (pc = code; size > 0; pc += count, size -= count) {
360
+ fprintf(out, "0x%08" PRIx64 ": ", pc);
361
+ count = s.info.print_insn(pc, &s.info);
362
+ fprintf(out, "\n");
363
+ if (count < 0) {
364
+ break;
365
+ }
366
+ if (size < count) {
367
+ fprintf(out,
368
+ "Disassembler disagrees with translator over instruction "
369
+ "decoding\n"
370
+ "Please report this to qemu-devel@nongnu.org\n");
371
+ break;
372
+ }
373
+ }
374
+}
375
+
376
+#ifdef CONFIG_PLUGIN
377
+static void plugin_print_address(bfd_vma addr, struct disassemble_info *info)
378
+{
379
+ /* does nothing */
380
+}
381
+
382
+/*
383
+ * We should only be dissembling one instruction at a time here. If
384
+ * there is left over it usually indicates the front end has read more
385
+ * bytes than it needed.
386
+ */
387
+char *plugin_disas(CPUState *cpu, uint64_t addr, size_t size)
388
+{
389
+ CPUDebug s;
390
+ GString *ds = g_string_new(NULL);
391
+
392
+ disas_initialize_debug_target(&s, cpu);
393
+ s.info.fprintf_func = disas_gstring_printf;
394
+ s.info.stream = (FILE *)ds; /* abuse this slot */
395
+ s.info.buffer_vma = addr;
396
+ s.info.buffer_length = size;
397
+ s.info.print_address_func = plugin_print_address;
398
+
399
+ if (s.info.cap_arch >= 0 && cap_disas_plugin(&s.info, addr, size)) {
400
+ ; /* done */
401
+ } else if (s.info.print_insn) {
402
+ s.info.print_insn(addr, &s.info);
403
+ } else {
404
+ ; /* cannot disassemble -- return empty string */
405
+ }
406
+
407
+ /* Return the buffer, freeing the GString container. */
408
+ return g_string_free(ds, false);
409
+}
410
+#endif /* CONFIG_PLUGIN */
411
diff --git a/disas/disas.c b/disas/disas.c
412
deleted file mode 100644
50
deleted file mode 100644
413
index XXXXXXX..XXXXXXX
51
index XXXXXXX..XXXXXXX
414
--- a/disas/disas.c
52
--- a/include/tcg/oversized-guest.h
415
+++ /dev/null
53
+++ /dev/null
416
@@ -XXX,XX +XXX,XX @@
54
@@ -XXX,XX +XXX,XX @@
417
-/* General "disassemble this chunk" code. Used for debugging. */
55
-/* SPDX-License-Identifier: MIT */
418
-#include "qemu/osdep.h"
419
-#include "disas/disas-internal.h"
420
-#include "elf.h"
421
-#include "qemu/qemu-print.h"
422
-#include "disas/disas.h"
423
-#include "disas/capstone.h"
424
-#include "hw/core/cpu.h"
425
-#include "exec/tswap.h"
426
-#include "exec/memory.h"
427
-
428
-/* Filled in by elfload.c. Simplistic, but will do for now. */
429
-struct syminfo *syminfos = NULL;
430
-
431
-/*
56
-/*
432
- * Get LENGTH bytes from info's buffer, at host address memaddr.
57
- * Define TCG_OVERSIZED_GUEST
433
- * Transfer them to myaddr.
58
- * Copyright (c) 2008 Fabrice Bellard
434
- */
59
- */
435
-static int host_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
60
-
436
- struct disassemble_info *info)
61
-#ifndef EXEC_TCG_OVERSIZED_GUEST_H
437
-{
62
-#define EXEC_TCG_OVERSIZED_GUEST_H
438
- if (memaddr < info->buffer_vma
63
-
439
- || memaddr + length > info->buffer_vma + info->buffer_length) {
64
-#include "tcg-target-reg-bits.h"
440
- /* Out of bounds. Use EIO because GDB uses it. */
65
-#include "cpu-param.h"
441
- return EIO;
66
-
67
-/*
68
- * Oversized TCG guests make things like MTTCG hard
69
- * as we can't use atomics for cputlb updates.
70
- */
71
-#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS
72
-#define TCG_OVERSIZED_GUEST 1
73
-#else
74
-#define TCG_OVERSIZED_GUEST 0
75
-#endif
76
-
77
-#endif
78
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
79
index XXXXXXX..XXXXXXX 100644
80
--- a/accel/tcg/cputlb.c
81
+++ b/accel/tcg/cputlb.c
82
@@ -XXX,XX +XXX,XX @@
83
#include "qemu/plugin-memory.h"
84
#endif
85
#include "tcg/tcg-ldst.h"
86
-#include "tcg/oversized-guest.h"
87
88
/* DEBUG defines, enable DEBUG_TLB_LOG to log to the CPU_LOG_MMU target */
89
/* #define DEBUG_TLB */
90
@@ -XXX,XX +XXX,XX @@ static inline uint64_t tlb_read_idx(const CPUTLBEntry *entry,
91
return qatomic_read(ptr);
92
#else
93
const uint64_t *ptr = &entry->addr_idx[access_type];
94
-# if TCG_OVERSIZED_GUEST
95
- return *ptr;
96
-# else
97
/* ofs might correspond to .addr_write, so use qatomic_read */
98
return qatomic_read(ptr);
99
-# endif
100
#endif
101
}
102
103
@@ -XXX,XX +XXX,XX @@ static void tlb_reset_dirty_range_locked(CPUTLBEntry *tlb_entry,
104
uint32_t *ptr_write = (uint32_t *)&tlb_entry->addr_write;
105
ptr_write += HOST_BIG_ENDIAN;
106
qatomic_set(ptr_write, *ptr_write | TLB_NOTDIRTY);
107
-#elif TCG_OVERSIZED_GUEST
108
- tlb_entry->addr_write |= TLB_NOTDIRTY;
109
#else
110
qatomic_set(&tlb_entry->addr_write,
111
tlb_entry->addr_write | TLB_NOTDIRTY);
112
diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c
113
index XXXXXXX..XXXXXXX 100644
114
--- a/accel/tcg/tcg-all.c
115
+++ b/accel/tcg/tcg-all.c
116
@@ -XXX,XX +XXX,XX @@
117
#include "exec/replay-core.h"
118
#include "system/cpu-timers.h"
119
#include "tcg/startup.h"
120
-#include "tcg/oversized-guest.h"
121
#include "qapi/error.h"
122
#include "qemu/error-report.h"
123
#include "qemu/accel.h"
124
@@ -XXX,XX +XXX,XX @@
125
#include "hw/boards.h"
126
#endif
127
#include "internal-common.h"
128
+#include "cpu-param.h"
129
+
130
131
struct TCGState {
132
AccelState parent_obj;
133
@@ -XXX,XX +XXX,XX @@ DECLARE_INSTANCE_CHECKER(TCGState, TCG_STATE,
134
135
static bool default_mttcg_enabled(void)
136
{
137
- if (icount_enabled() || TCG_OVERSIZED_GUEST) {
138
+ if (icount_enabled()) {
139
return false;
140
}
141
#ifdef TARGET_SUPPORTS_MTTCG
142
@@ -XXX,XX +XXX,XX @@ static void tcg_set_thread(Object *obj, const char *value, Error **errp)
143
TCGState *s = TCG_STATE(obj);
144
145
if (strcmp(value, "multi") == 0) {
146
- if (TCG_OVERSIZED_GUEST) {
147
- error_setg(errp, "No MTTCG when guest word size > hosts");
148
- } else if (icount_enabled()) {
149
+ if (icount_enabled()) {
150
error_setg(errp, "No MTTCG when icount is enabled");
151
} else {
152
#ifndef TARGET_SUPPORTS_MTTCG
153
diff --git a/target/arm/ptw.c b/target/arm/ptw.c
154
index XXXXXXX..XXXXXXX 100644
155
--- a/target/arm/ptw.c
156
+++ b/target/arm/ptw.c
157
@@ -XXX,XX +XXX,XX @@
158
#include "internals.h"
159
#include "cpu-features.h"
160
#include "idau.h"
161
-#ifdef CONFIG_TCG
162
-# include "tcg/oversized-guest.h"
163
-#endif
164
165
typedef struct S1Translate {
166
/*
167
@@ -XXX,XX +XXX,XX @@ static uint64_t arm_casq_ptw(CPUARMState *env, uint64_t old_val,
168
ptw->out_rw = true;
169
}
170
171
-#ifdef CONFIG_ATOMIC64
172
if (ptw->out_be) {
173
old_val = cpu_to_be64(old_val);
174
new_val = cpu_to_be64(new_val);
175
@@ -XXX,XX +XXX,XX @@ static uint64_t arm_casq_ptw(CPUARMState *env, uint64_t old_val,
176
cur_val = qatomic_cmpxchg__nocheck((uint64_t *)host, old_val, new_val);
177
cur_val = le64_to_cpu(cur_val);
178
}
179
-#else
180
- /*
181
- * We can't support the full 64-bit atomic cmpxchg on the host.
182
- * Because this is only used for FEAT_HAFDBS, which is only for AA64,
183
- * we know that TCG_OVERSIZED_GUEST is set, which means that we are
184
- * running in round-robin mode and could only race with dma i/o.
185
- */
186
-#if !TCG_OVERSIZED_GUEST
187
-# error "Unexpected configuration"
188
-#endif
189
- bool locked = bql_locked();
190
- if (!locked) {
191
- bql_lock();
442
- }
192
- }
443
- memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length);
193
- if (ptw->out_be) {
444
- return 0;
194
- cur_val = ldq_be_p(host);
445
-}
195
- if (cur_val == old_val) {
446
-
196
- stq_be_p(host, new_val);
447
-/*
448
- * Get LENGTH bytes from info's buffer, at target address memaddr.
449
- * Transfer them to myaddr.
450
- */
451
-static int target_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
452
- struct disassemble_info *info)
453
-{
454
- CPUDebug *s = container_of(info, CPUDebug, info);
455
- int r = cpu_memory_rw_debug(s->cpu, memaddr, myaddr, length, 0);
456
- return r ? EIO : 0;
457
-}
458
-
459
-/*
460
- * Print an error message. We can assume that this is in response to
461
- * an error return from {host,target}_read_memory.
462
- */
463
-static void perror_memory(int status, bfd_vma memaddr,
464
- struct disassemble_info *info)
465
-{
466
- if (status != EIO) {
467
- /* Can't happen. */
468
- info->fprintf_func(info->stream, "Unknown error %d\n", status);
469
- } else {
470
- /* Address between memaddr and memaddr + len was out of bounds. */
471
- info->fprintf_func(info->stream,
472
- "Address 0x%" PRIx64 " is out of bounds.\n",
473
- memaddr);
474
- }
475
-}
476
-
477
-/* Print address in hex. */
478
-static void print_address(bfd_vma addr, struct disassemble_info *info)
479
-{
480
- info->fprintf_func(info->stream, "0x%" PRIx64, addr);
481
-}
482
-
483
-/* Print address in hex, truncated to the width of a host virtual address. */
484
-static void host_print_address(bfd_vma addr, struct disassemble_info *info)
485
-{
486
- print_address((uintptr_t)addr, info);
487
-}
488
-
489
-/* Stub prevents some fruitless earching in optabs disassemblers. */
490
-static int symbol_at_address(bfd_vma addr, struct disassemble_info *info)
491
-{
492
- return 1;
493
-}
494
-
495
-static int print_insn_objdump(bfd_vma pc, disassemble_info *info,
496
- const char *prefix)
497
-{
498
- int i, n = info->buffer_length;
499
- g_autofree uint8_t *buf = g_malloc(n);
500
-
501
- if (info->read_memory_func(pc, buf, n, info) == 0) {
502
- for (i = 0; i < n; ++i) {
503
- if (i % 32 == 0) {
504
- info->fprintf_func(info->stream, "\n%s: ", prefix);
505
- }
506
- info->fprintf_func(info->stream, "%02x", buf[i]);
507
- }
197
- }
508
- } else {
198
- } else {
509
- info->fprintf_func(info->stream, "unable to read memory");
199
- cur_val = ldq_le_p(host);
510
- }
200
- if (cur_val == old_val) {
511
- return n;
201
- stq_le_p(host, new_val);
512
-}
513
-
514
-static int print_insn_od_host(bfd_vma pc, disassemble_info *info)
515
-{
516
- return print_insn_objdump(pc, info, "OBJD-H");
517
-}
518
-
519
-static int print_insn_od_target(bfd_vma pc, disassemble_info *info)
520
-{
521
- return print_insn_objdump(pc, info, "OBJD-T");
522
-}
523
-
524
-static void initialize_debug(CPUDebug *s)
525
-{
526
- memset(s, 0, sizeof(*s));
527
- s->info.arch = bfd_arch_unknown;
528
- s->info.cap_arch = -1;
529
- s->info.cap_insn_unit = 4;
530
- s->info.cap_insn_split = 4;
531
- s->info.memory_error_func = perror_memory;
532
- s->info.symbol_at_address_func = symbol_at_address;
533
-}
534
-
535
-void disas_initialize_debug_target(CPUDebug *s, CPUState *cpu)
536
-{
537
- initialize_debug(s);
538
-
539
- s->cpu = cpu;
540
- s->info.read_memory_func = target_read_memory;
541
- s->info.print_address_func = print_address;
542
- if (target_words_bigendian()) {
543
- s->info.endian = BFD_ENDIAN_BIG;
544
- } else {
545
- s->info.endian = BFD_ENDIAN_LITTLE;
546
- }
547
-
548
- CPUClass *cc = CPU_GET_CLASS(cpu);
549
- if (cc->disas_set_info) {
550
- cc->disas_set_info(cpu, &s->info);
551
- }
552
-}
553
-
554
-static void initialize_debug_host(CPUDebug *s)
555
-{
556
- initialize_debug(s);
557
-
558
- s->info.read_memory_func = host_read_memory;
559
- s->info.print_address_func = host_print_address;
560
-#if HOST_BIG_ENDIAN
561
- s->info.endian = BFD_ENDIAN_BIG;
562
-#else
563
- s->info.endian = BFD_ENDIAN_LITTLE;
564
-#endif
565
-#if defined(CONFIG_TCG_INTERPRETER)
566
- s->info.print_insn = print_insn_tci;
567
-#elif defined(__i386__)
568
- s->info.mach = bfd_mach_i386_i386;
569
- s->info.cap_arch = CS_ARCH_X86;
570
- s->info.cap_mode = CS_MODE_32;
571
- s->info.cap_insn_unit = 1;
572
- s->info.cap_insn_split = 8;
573
-#elif defined(__x86_64__)
574
- s->info.mach = bfd_mach_x86_64;
575
- s->info.cap_arch = CS_ARCH_X86;
576
- s->info.cap_mode = CS_MODE_64;
577
- s->info.cap_insn_unit = 1;
578
- s->info.cap_insn_split = 8;
579
-#elif defined(_ARCH_PPC)
580
- s->info.cap_arch = CS_ARCH_PPC;
581
-# ifdef _ARCH_PPC64
582
- s->info.cap_mode = CS_MODE_64;
583
-# endif
584
-#elif defined(__riscv)
585
-#if defined(_ILP32) || (__riscv_xlen == 32)
586
- s->info.print_insn = print_insn_riscv32;
587
-#elif defined(_LP64)
588
- s->info.print_insn = print_insn_riscv64;
589
-#else
590
-#error unsupported RISC-V ABI
591
-#endif
592
-#elif defined(__aarch64__)
593
- s->info.cap_arch = CS_ARCH_ARM64;
594
-#elif defined(__alpha__)
595
- s->info.print_insn = print_insn_alpha;
596
-#elif defined(__sparc__)
597
- s->info.print_insn = print_insn_sparc;
598
- s->info.mach = bfd_mach_sparc_v9b;
599
-#elif defined(__arm__)
600
- /* TCG only generates code for arm mode. */
601
- s->info.cap_arch = CS_ARCH_ARM;
602
-#elif defined(__MIPSEB__)
603
- s->info.print_insn = print_insn_big_mips;
604
-#elif defined(__MIPSEL__)
605
- s->info.print_insn = print_insn_little_mips;
606
-#elif defined(__m68k__)
607
- s->info.print_insn = print_insn_m68k;
608
-#elif defined(__s390__)
609
- s->info.cap_arch = CS_ARCH_SYSZ;
610
- s->info.cap_insn_unit = 2;
611
- s->info.cap_insn_split = 6;
612
-#elif defined(__hppa__)
613
- s->info.print_insn = print_insn_hppa;
614
-#elif defined(__loongarch__)
615
- s->info.print_insn = print_insn_loongarch;
616
-#endif
617
-}
618
-
619
-/* Disassemble this for me please... (debugging). */
620
-void target_disas(FILE *out, CPUState *cpu, uint64_t code, size_t size)
621
-{
622
- uint64_t pc;
623
- int count;
624
- CPUDebug s;
625
-
626
- disas_initialize_debug_target(&s, cpu);
627
- s.info.fprintf_func = fprintf;
628
- s.info.stream = out;
629
- s.info.buffer_vma = code;
630
- s.info.buffer_length = size;
631
- s.info.show_opcodes = true;
632
-
633
- if (s.info.cap_arch >= 0 && cap_disas_target(&s.info, code, size)) {
634
- return;
635
- }
636
-
637
- if (s.info.print_insn == NULL) {
638
- s.info.print_insn = print_insn_od_target;
639
- }
640
-
641
- for (pc = code; size > 0; pc += count, size -= count) {
642
- fprintf(out, "0x%08" PRIx64 ": ", pc);
643
- count = s.info.print_insn(pc, &s.info);
644
- fprintf(out, "\n");
645
- if (count < 0) {
646
- break;
647
- }
648
- if (size < count) {
649
- fprintf(out,
650
- "Disassembler disagrees with translator over instruction "
651
- "decoding\n"
652
- "Please report this to qemu-devel@nongnu.org\n");
653
- break;
654
- }
202
- }
655
- }
203
- }
656
-}
204
- if (!locked) {
657
-
205
- bql_unlock();
658
-int disas_gstring_printf(FILE *stream, const char *fmt, ...)
659
-{
660
- /* We abuse the FILE parameter to pass a GString. */
661
- GString *s = (GString *)stream;
662
- int initial_len = s->len;
663
- va_list va;
664
-
665
- va_start(va, fmt);
666
- g_string_append_vprintf(s, fmt, va);
667
- va_end(va);
668
-
669
- return s->len - initial_len;
670
-}
671
-
672
-static void plugin_print_address(bfd_vma addr, struct disassemble_info *info)
673
-{
674
- /* does nothing */
675
-}
676
-
677
-
678
-/*
679
- * We should only be dissembling one instruction at a time here. If
680
- * there is left over it usually indicates the front end has read more
681
- * bytes than it needed.
682
- */
683
-char *plugin_disas(CPUState *cpu, uint64_t addr, size_t size)
684
-{
685
- CPUDebug s;
686
- GString *ds = g_string_new(NULL);
687
-
688
- disas_initialize_debug_target(&s, cpu);
689
- s.info.fprintf_func = disas_gstring_printf;
690
- s.info.stream = (FILE *)ds; /* abuse this slot */
691
- s.info.buffer_vma = addr;
692
- s.info.buffer_length = size;
693
- s.info.print_address_func = plugin_print_address;
694
-
695
- if (s.info.cap_arch >= 0 && cap_disas_plugin(&s.info, addr, size)) {
696
- ; /* done */
697
- } else if (s.info.print_insn) {
698
- s.info.print_insn(addr, &s.info);
699
- } else {
700
- ; /* cannot disassemble -- return empty string */
701
- }
206
- }
702
-
207
-#endif
703
- /* Return the buffer, freeing the GString container. */
208
-
704
- return g_string_free(ds, false);
209
return cur_val;
705
-}
210
#else
706
-
211
/* AArch32 does not have FEAT_HADFS; non-TCG guests only use debug-mode. */
707
-/* Disassemble this for me please... (debugging). */
212
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
708
-void disas(FILE *out, const void *code, size_t size)
213
index XXXXXXX..XXXXXXX 100644
709
-{
214
--- a/target/riscv/cpu_helper.c
710
- uintptr_t pc;
215
+++ b/target/riscv/cpu_helper.c
711
- int count;
216
@@ -XXX,XX +XXX,XX @@
712
- CPUDebug s;
217
#include "system/cpu-timers.h"
713
-
218
#include "cpu_bits.h"
714
- initialize_debug_host(&s);
219
#include "debug.h"
715
- s.info.fprintf_func = fprintf;
220
-#include "tcg/oversized-guest.h"
716
- s.info.stream = out;
221
#include "pmp.h"
717
- s.info.buffer = code;
222
718
- s.info.buffer_vma = (uintptr_t)code;
223
int riscv_env_mmu_index(CPURISCVState *env, bool ifetch)
719
- s.info.buffer_length = size;
224
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical,
720
- s.info.show_opcodes = true;
225
hwaddr pte_addr;
721
-
226
int i;
722
- if (s.info.cap_arch >= 0 && cap_disas_host(&s.info, code, size)) {
227
723
- return;
228
-#if !TCG_OVERSIZED_GUEST
724
- }
229
-restart:
725
-
230
-#endif
726
- if (s.info.print_insn == NULL) {
231
+ restart:
727
- s.info.print_insn = print_insn_od_host;
232
for (i = 0; i < levels; i++, ptshift -= ptidxbits) {
728
- }
233
target_ulong idx;
729
- for (pc = (uintptr_t)code; size > 0; pc += count, size -= count) {
234
if (i == 0) {
730
- fprintf(out, "0x%08" PRIxPTR ": ", pc);
235
@@ -XXX,XX +XXX,XX @@ restart:
731
- count = s.info.print_insn(pc, &s.info);
236
false, MEMTXATTRS_UNSPECIFIED);
732
- fprintf(out, "\n");
237
if (memory_region_is_ram(mr)) {
733
- if (count < 0) {
238
target_ulong *pte_pa = qemu_map_ram_ptr(mr->ram_block, addr1);
734
- break;
239
-#if TCG_OVERSIZED_GUEST
735
- }
240
- /*
736
- }
241
- * MTTCG is not enabled on oversized TCG guests so
737
-
242
- * page table updates do not need to be atomic
738
-}
243
- */
739
-
244
- *pte_pa = pte = updated_pte;
740
-/* Look up symbol for debugging purpose. Returns "" if unknown. */
245
-#else
741
-const char *lookup_symbol(uint64_t orig_addr)
246
target_ulong old_pte;
742
-{
247
if (riscv_cpu_sxl(env) == MXL_RV32) {
743
- const char *symbol = "";
248
old_pte = qatomic_cmpxchg((uint32_t *)pte_pa, pte, updated_pte);
744
- struct syminfo *s;
249
@@ -XXX,XX +XXX,XX @@ restart:
745
-
250
goto restart;
746
- for (s = syminfos; s; s = s->next) {
251
}
747
- symbol = s->lookup_symbol(s, orig_addr);
252
pte = updated_pte;
748
- if (symbol[0] != '\0') {
253
-#endif
749
- break;
254
} else {
750
- }
255
/*
751
- }
256
* Misconfigured PTE in ROM (AD bits are not preset) or
752
-
257
diff --git a/docs/devel/multi-thread-tcg.rst b/docs/devel/multi-thread-tcg.rst
753
- return symbol;
258
index XXXXXXX..XXXXXXX 100644
754
-}
259
--- a/docs/devel/multi-thread-tcg.rst
755
diff --git a/disas/objdump.c b/disas/objdump.c
260
+++ b/docs/devel/multi-thread-tcg.rst
756
new file mode 100644
261
@@ -XXX,XX +XXX,XX @@ if:
757
index XXXXXXX..XXXXXXX
262
758
--- /dev/null
263
* forced by --accel tcg,thread=single
759
+++ b/disas/objdump.c
264
* enabling --icount mode
760
@@ -XXX,XX +XXX,XX @@
265
-* 64 bit guests on 32 bit hosts (TCG_OVERSIZED_GUEST)
761
+/*
266
762
+ * Dump disassembly as text, for processing by scripts/disas-objdump.pl.
267
In the general case of running translated code there should be no
763
+ * SPDX-License-Identifier: GPL-2.0-or-later
268
inter-vCPU dependencies and all vCPUs should be able to run at full
764
+ */
765
+
766
+#include "qemu/osdep.h"
767
+#include "disas-internal.h"
768
+
769
+
770
+static int print_insn_objdump(bfd_vma pc, disassemble_info *info,
771
+ const char *prefix)
772
+{
773
+ int i, n = info->buffer_length;
774
+ g_autofree uint8_t *buf = g_malloc(n);
775
+
776
+ if (info->read_memory_func(pc, buf, n, info) == 0) {
777
+ for (i = 0; i < n; ++i) {
778
+ if (i % 32 == 0) {
779
+ info->fprintf_func(info->stream, "\n%s: ", prefix);
780
+ }
781
+ info->fprintf_func(info->stream, "%02x", buf[i]);
782
+ }
783
+ } else {
784
+ info->fprintf_func(info->stream, "unable to read memory");
785
+ }
786
+ return n;
787
+}
788
+
789
+int print_insn_od_host(bfd_vma pc, disassemble_info *info)
790
+{
791
+ return print_insn_objdump(pc, info, "OBJD-H");
792
+}
793
+
794
+int print_insn_od_target(bfd_vma pc, disassemble_info *info)
795
+{
796
+ return print_insn_objdump(pc, info, "OBJD-T");
797
+}
798
diff --git a/disas/meson.build b/disas/meson.build
799
index XXXXXXX..XXXXXXX 100644
800
--- a/disas/meson.build
801
+++ b/disas/meson.build
802
@@ -XXX,XX +XXX,XX @@ common_ss.add(when: 'CONFIG_SH4_DIS', if_true: files('sh4.c'))
803
common_ss.add(when: 'CONFIG_SPARC_DIS', if_true: files('sparc.c'))
804
common_ss.add(when: 'CONFIG_XTENSA_DIS', if_true: files('xtensa.c'))
805
common_ss.add(when: capstone, if_true: [files('capstone.c'), capstone])
806
-common_ss.add(files('disas.c'))
807
-
808
+common_ss.add(when: 'CONFIG_TCG', if_true: files(
809
+ 'disas-host.c',
810
+ 'disas-target.c',
811
+ 'objdump.c'
812
+))
813
+common_ss.add(files('disas-common.c'))
814
system_ss.add(files('disas-mon.c'))
815
specific_ss.add(capstone)
816
--
269
--
817
2.34.1
270
2.43.0
818
271
819
272
diff view generated by jsdifflib
1
Use the bytes that we record for the entire TB, rather than
2
a per-insn GByteArray. Record the length of the insn in
3
plugin_gen_insn_end rather than infering from the length
4
of the array.
5
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
3
---
9
include/qemu/plugin.h | 14 +-------------
4
tcg/tcg-op-ldst.c | 21 +++------------------
10
accel/tcg/plugin-gen.c | 7 +++++--
5
tcg/tcg.c | 4 +---
11
accel/tcg/translator.c | 26 --------------------------
6
2 files changed, 4 insertions(+), 21 deletions(-)
12
plugins/api.c | 12 +++++++-----
13
tcg/tcg.c | 3 +--
14
5 files changed, 14 insertions(+), 48 deletions(-)
15
7
16
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
8
diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
17
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
18
--- a/include/qemu/plugin.h
10
--- a/tcg/tcg-op-ldst.c
19
+++ b/include/qemu/plugin.h
11
+++ b/tcg/tcg-op-ldst.c
20
@@ -XXX,XX +XXX,XX @@ struct qemu_plugin_dyn_cb {
12
@@ -XXX,XX +XXX,XX @@ static MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st)
21
13
static void gen_ldst(TCGOpcode opc, TCGType type, TCGTemp *vl, TCGTemp *vh,
22
/* Internal context for instrumenting an instruction */
14
TCGTemp *addr, MemOpIdx oi)
23
struct qemu_plugin_insn {
15
{
24
- GByteArray *data;
16
- if (TCG_TARGET_REG_BITS == 64 || tcg_ctx->addr_type == TCG_TYPE_I32) {
25
uint64_t vaddr;
17
- if (vh) {
26
void *haddr;
18
- tcg_gen_op4(opc, type, temp_arg(vl), temp_arg(vh),
27
GArray *insn_cbs;
19
- temp_arg(addr), oi);
28
GArray *mem_cbs;
20
- } else {
29
+ uint8_t len;
21
- tcg_gen_op3(opc, type, temp_arg(vl), temp_arg(addr), oi);
30
bool calls_helpers;
22
- }
31
23
+ if (vh) {
32
/* if set, the instruction calls helpers that might access guest memory */
24
+ tcg_gen_op4(opc, type, temp_arg(vl), temp_arg(vh), temp_arg(addr), oi);
33
@@ -XXX,XX +XXX,XX @@ struct qemu_plugin_scoreboard {
25
} else {
34
QLIST_ENTRY(qemu_plugin_scoreboard) entry;
26
- /* See TCGV_LOW/HIGH. */
35
};
27
- TCGTemp *al = addr + HOST_BIG_ENDIAN;
36
28
- TCGTemp *ah = addr + !HOST_BIG_ENDIAN;
37
-/*
38
- * qemu_plugin_insn allocate and cleanup functions. We don't expect to
39
- * cleanup many of these structures. They are reused for each fresh
40
- * translation.
41
- */
42
-
29
-
43
-static inline void qemu_plugin_insn_cleanup_fn(gpointer data)
30
- if (vh) {
44
-{
31
- tcg_gen_op5(opc, type, temp_arg(vl), temp_arg(vh),
45
- struct qemu_plugin_insn *insn = (struct qemu_plugin_insn *) data;
32
- temp_arg(al), temp_arg(ah), oi);
46
- g_byte_array_free(insn->data, true);
33
- } else {
47
-}
34
- tcg_gen_op4(opc, type, temp_arg(vl),
48
-
35
- temp_arg(al), temp_arg(ah), oi);
49
/* Internal context for this TranslationBlock */
36
- }
50
struct qemu_plugin_tb {
37
+ tcg_gen_op3(opc, type, temp_arg(vl), temp_arg(addr), oi);
51
GPtrArray *insns;
52
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/accel/tcg/plugin-gen.c
55
+++ b/accel/tcg/plugin-gen.c
56
@@ -XXX,XX +XXX,XX @@ void plugin_gen_insn_start(CPUState *cpu, const DisasContextBase *db)
57
ptb->n = n;
58
if (n <= ptb->insns->len) {
59
insn = g_ptr_array_index(ptb->insns, n - 1);
60
- g_byte_array_set_size(insn->data, 0);
61
} else {
62
assert(n - 1 == ptb->insns->len);
63
insn = g_new0(struct qemu_plugin_insn, 1);
64
- insn->data = g_byte_array_sized_new(4);
65
g_ptr_array_add(ptb->insns, insn);
66
}
38
}
67
68
@@ -XXX,XX +XXX,XX @@ void plugin_gen_insn_start(CPUState *cpu, const DisasContextBase *db)
69
70
void plugin_gen_insn_end(void)
71
{
72
+ const DisasContextBase *db = tcg_ctx->plugin_db;
73
+ struct qemu_plugin_insn *pinsn = tcg_ctx->plugin_insn;
74
+
75
+ pinsn->len = db->fake_insn ? db->record_len : db->pc_next - pinsn->vaddr;
76
+
77
tcg_gen_plugin_cb(PLUGIN_GEN_AFTER_INSN);
78
}
39
}
79
40
80
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/accel/tcg/translator.c
83
+++ b/accel/tcg/translator.c
84
@@ -XXX,XX +XXX,XX @@ bool translator_st(const DisasContextBase *db, void *dest,
85
return false;
86
}
87
88
-static void plugin_insn_append(vaddr pc, const void *from, size_t size)
89
-{
90
-#ifdef CONFIG_PLUGIN
91
- struct qemu_plugin_insn *insn = tcg_ctx->plugin_insn;
92
- size_t off;
93
-
94
- if (insn == NULL) {
95
- return;
96
- }
97
- off = pc - insn->vaddr;
98
- if (off < insn->data->len) {
99
- g_byte_array_set_size(insn->data, off);
100
- } else if (off > insn->data->len) {
101
- /* we have an unexpected gap */
102
- g_assert_not_reached();
103
- }
104
-
105
- insn->data = g_byte_array_append(insn->data, from, size);
106
-#endif
107
-}
108
-
109
uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc)
110
{
111
uint8_t raw;
112
@@ -XXX,XX +XXX,XX @@ uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc)
113
raw = cpu_ldub_code(env, pc);
114
record_save(db, pc, &raw, sizeof(raw));
115
}
116
- plugin_insn_append(pc, &raw, sizeof(raw));
117
return raw;
118
}
119
120
@@ -XXX,XX +XXX,XX @@ uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc)
121
raw = tswap16(tgt);
122
record_save(db, pc, &raw, sizeof(raw));
123
}
124
- plugin_insn_append(pc, &raw, sizeof(raw));
125
return tgt;
126
}
127
128
@@ -XXX,XX +XXX,XX @@ uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc)
129
raw = tswap32(tgt);
130
record_save(db, pc, &raw, sizeof(raw));
131
}
132
- plugin_insn_append(pc, &raw, sizeof(raw));
133
return tgt;
134
}
135
136
@@ -XXX,XX +XXX,XX @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
137
raw = tswap64(tgt);
138
record_save(db, pc, &raw, sizeof(raw));
139
}
140
- plugin_insn_append(pc, &raw, sizeof(raw));
141
return tgt;
142
}
143
144
@@ -XXX,XX +XXX,XX @@ void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8)
145
assert(pc >= db->pc_first);
146
db->fake_insn = true;
147
record_save(db, pc, &insn8, sizeof(insn8));
148
- plugin_insn_append(pc, &insn8, sizeof(insn8));
149
}
150
diff --git a/plugins/api.c b/plugins/api.c
151
index XXXXXXX..XXXXXXX 100644
152
--- a/plugins/api.c
153
+++ b/plugins/api.c
154
@@ -XXX,XX +XXX,XX @@
155
#include "tcg/tcg.h"
156
#include "exec/exec-all.h"
157
#include "exec/gdbstub.h"
158
+#include "exec/translator.h"
159
#include "disas/disas.h"
160
#include "plugin.h"
161
#ifndef CONFIG_USER_ONLY
162
@@ -XXX,XX +XXX,XX @@ qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx)
163
size_t qemu_plugin_insn_data(const struct qemu_plugin_insn *insn,
164
void *dest, size_t len)
165
{
166
- len = MIN(len, insn->data->len);
167
- memcpy(dest, insn->data->data, len);
168
- return len;
169
+ const DisasContextBase *db = tcg_ctx->plugin_db;
170
+
171
+ len = MIN(len, insn->len);
172
+ return translator_st(db, dest, insn->vaddr, len) ? len : 0;
173
}
174
175
size_t qemu_plugin_insn_size(const struct qemu_plugin_insn *insn)
176
{
177
- return insn->data->len;
178
+ return insn->len;
179
}
180
181
uint64_t qemu_plugin_insn_vaddr(const struct qemu_plugin_insn *insn)
182
@@ -XXX,XX +XXX,XX @@ void *qemu_plugin_insn_haddr(const struct qemu_plugin_insn *insn)
183
char *qemu_plugin_insn_disas(const struct qemu_plugin_insn *insn)
184
{
185
CPUState *cpu = current_cpu;
186
- return plugin_disas(cpu, insn->vaddr, insn->data->len);
187
+ return plugin_disas(cpu, insn->vaddr, insn->len);
188
}
189
190
const char *qemu_plugin_insn_symbol(const struct qemu_plugin_insn *insn)
191
diff --git a/tcg/tcg.c b/tcg/tcg.c
41
diff --git a/tcg/tcg.c b/tcg/tcg.c
192
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
193
--- a/tcg/tcg.c
43
--- a/tcg/tcg.c
194
+++ b/tcg/tcg.c
44
+++ b/tcg/tcg.c
195
@@ -XXX,XX +XXX,XX @@ static void alloc_tcg_plugin_context(TCGContext *s)
45
@@ -XXX,XX +XXX,XX @@ void tcg_func_start(TCGContext *s)
196
{
46
s->emit_before_op = NULL;
197
#ifdef CONFIG_PLUGIN
47
QSIMPLEQ_INIT(&s->labels);
198
s->plugin_tb = g_new0(struct qemu_plugin_tb, 1);
48
199
- s->plugin_tb->insns =
49
- tcg_debug_assert(s->addr_type == TCG_TYPE_I32 ||
200
- g_ptr_array_new_with_free_func(qemu_plugin_insn_cleanup_fn);
50
- s->addr_type == TCG_TYPE_I64);
201
+ s->plugin_tb->insns = g_ptr_array_new();
51
-
202
#endif
52
+ tcg_debug_assert(s->addr_type <= TCG_TYPE_REG);
53
tcg_debug_assert(s->insn_start_words > 0);
203
}
54
}
204
55
205
--
56
--
206
2.34.1
57
2.43.0
207
58
208
59
diff view generated by jsdifflib
1
Almost all of the disas_log implementations are identical.
1
Since 64-on-32 is now unsupported, guest addresses always
2
Unify them within translator_loop.
2
fit in one host register. Drop the replication of opcodes.
3
4
Drop extra Priv/Virt logging from target/riscv.
5
3
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
6
---
9
accel/tcg/translator.c | 9 ++++++++-
7
include/tcg/tcg-opc.h | 28 ++------
10
target/alpha/translate.c | 9 ---------
8
tcg/optimize.c | 21 ++----
11
target/arm/tcg/translate-a64.c | 11 -----------
9
tcg/tcg-op-ldst.c | 82 +++++----------------
12
target/arm/tcg/translate.c | 12 ------------
10
tcg/tcg.c | 42 ++++-------
13
target/avr/translate.c | 8 --------
11
tcg/tci.c | 119 ++++++-------------------------
14
target/cris/translate.c | 11 -----------
12
tcg/aarch64/tcg-target.c.inc | 36 ++++------
15
target/hexagon/translate.c | 9 ---------
13
tcg/arm/tcg-target.c.inc | 40 +++--------
16
target/hppa/translate.c | 6 ++++--
14
tcg/i386/tcg-target.c.inc | 69 ++++--------------
17
target/i386/tcg/translate.c | 11 -----------
15
tcg/loongarch64/tcg-target.c.inc | 36 ++++------
18
target/loongarch/tcg/translate.c | 8 --------
16
tcg/mips/tcg-target.c.inc | 51 +++----------
19
target/m68k/translate.c | 9 ---------
17
tcg/ppc/tcg-target.c.inc | 68 ++++--------------
20
target/microblaze/translate.c | 9 ---------
18
tcg/riscv/tcg-target.c.inc | 24 +++----
21
target/mips/tcg/translate.c | 9 ---------
19
tcg/s390x/tcg-target.c.inc | 36 ++++------
22
target/openrisc/translate.c | 11 -----------
20
tcg/sparc64/tcg-target.c.inc | 24 +++----
23
target/ppc/translate.c | 9 ---------
21
tcg/tci/tcg-target.c.inc | 60 ++++------------
24
target/riscv/translate.c | 18 ------------------
22
15 files changed, 177 insertions(+), 559 deletions(-)
25
target/rx/translate.c | 8 --------
26
target/sh4/translate.c | 9 ---------
27
target/sparc/translate.c | 9 ---------
28
target/tricore/translate.c | 9 ---------
29
target/xtensa/translate.c | 9 ---------
30
21 files changed, 12 insertions(+), 191 deletions(-)
31
23
32
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
24
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
33
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
34
--- a/accel/tcg/translator.c
26
--- a/include/tcg/tcg-opc.h
35
+++ b/accel/tcg/translator.c
27
+++ b/include/tcg/tcg-opc.h
36
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@ DEF(goto_ptr, 0, 1, 0, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
37
#include "exec/cpu_ldst.h"
29
DEF(plugin_cb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
38
#include "tcg/tcg-op-common.h"
30
DEF(plugin_mem_cb, 0, 1, 1, TCG_OPF_NOT_PRESENT)
39
#include "internal-target.h"
31
40
+#include "disas/disas.h"
32
-/* Replicate ld/st ops for 32 and 64-bit guest addresses. */
41
33
-DEF(qemu_ld_a32_i32, 1, 1, 1,
42
static void set_can_do_io(DisasContextBase *db, bool val)
34
+DEF(qemu_ld_i32, 1, 1, 1,
35
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
36
-DEF(qemu_st_a32_i32, 0, 1 + 1, 1,
37
+DEF(qemu_st_i32, 0, 1 + 1, 1,
38
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
39
-DEF(qemu_ld_a32_i64, DATA64_ARGS, 1, 1,
40
+DEF(qemu_ld_i64, DATA64_ARGS, 1, 1,
41
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
42
-DEF(qemu_st_a32_i64, 0, DATA64_ARGS + 1, 1,
43
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
44
-
45
-DEF(qemu_ld_a64_i32, 1, DATA64_ARGS, 1,
46
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
47
-DEF(qemu_st_a64_i32, 0, 1 + DATA64_ARGS, 1,
48
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
49
-DEF(qemu_ld_a64_i64, DATA64_ARGS, DATA64_ARGS, 1,
50
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
51
-DEF(qemu_st_a64_i64, 0, DATA64_ARGS + DATA64_ARGS, 1,
52
+DEF(qemu_st_i64, 0, DATA64_ARGS + 1, 1,
53
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
54
55
/* Only used by i386 to cope with stupid register constraints. */
56
-DEF(qemu_st8_a32_i32, 0, 1 + 1, 1,
57
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
58
-DEF(qemu_st8_a64_i32, 0, 1 + DATA64_ARGS, 1,
59
+DEF(qemu_st8_i32, 0, 1 + 1, 1,
60
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
61
62
/* Only for 64-bit hosts at the moment. */
63
-DEF(qemu_ld_a32_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
64
-DEF(qemu_ld_a64_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
65
-DEF(qemu_st_a32_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
66
-DEF(qemu_st_a64_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
67
+DEF(qemu_ld_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
68
+DEF(qemu_st_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
69
70
/* Host vector support. */
71
72
diff --git a/tcg/optimize.c b/tcg/optimize.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/tcg/optimize.c
75
+++ b/tcg/optimize.c
76
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
77
CASE_OP_32_64_VEC(orc):
78
done = fold_orc(&ctx, op);
79
break;
80
- case INDEX_op_qemu_ld_a32_i32:
81
- case INDEX_op_qemu_ld_a64_i32:
82
+ case INDEX_op_qemu_ld_i32:
83
done = fold_qemu_ld_1reg(&ctx, op);
84
break;
85
- case INDEX_op_qemu_ld_a32_i64:
86
- case INDEX_op_qemu_ld_a64_i64:
87
+ case INDEX_op_qemu_ld_i64:
88
if (TCG_TARGET_REG_BITS == 64) {
89
done = fold_qemu_ld_1reg(&ctx, op);
90
break;
91
}
92
QEMU_FALLTHROUGH;
93
- case INDEX_op_qemu_ld_a32_i128:
94
- case INDEX_op_qemu_ld_a64_i128:
95
+ case INDEX_op_qemu_ld_i128:
96
done = fold_qemu_ld_2reg(&ctx, op);
97
break;
98
- case INDEX_op_qemu_st8_a32_i32:
99
- case INDEX_op_qemu_st8_a64_i32:
100
- case INDEX_op_qemu_st_a32_i32:
101
- case INDEX_op_qemu_st_a64_i32:
102
- case INDEX_op_qemu_st_a32_i64:
103
- case INDEX_op_qemu_st_a64_i64:
104
- case INDEX_op_qemu_st_a32_i128:
105
- case INDEX_op_qemu_st_a64_i128:
106
+ case INDEX_op_qemu_st8_i32:
107
+ case INDEX_op_qemu_st_i32:
108
+ case INDEX_op_qemu_st_i64:
109
+ case INDEX_op_qemu_st_i128:
110
done = fold_qemu_st(&ctx, op);
111
break;
112
CASE_OP_32_64(rem):
113
diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
114
index XXXXXXX..XXXXXXX 100644
115
--- a/tcg/tcg-op-ldst.c
116
+++ b/tcg/tcg-op-ldst.c
117
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,
118
MemOp orig_memop;
119
MemOpIdx orig_oi, oi;
120
TCGv_i64 copy_addr;
121
- TCGOpcode opc;
122
123
tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
124
orig_memop = memop = tcg_canonicalize_memop(memop, 0, 0);
125
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,
126
}
127
128
copy_addr = plugin_maybe_preserve_addr(addr);
129
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
130
- opc = INDEX_op_qemu_ld_a32_i32;
131
- } else {
132
- opc = INDEX_op_qemu_ld_a64_i32;
133
- }
134
- gen_ldst(opc, TCG_TYPE_I32, tcgv_i32_temp(val), NULL, addr, oi);
135
+ gen_ldst(INDEX_op_qemu_ld_i32, TCG_TYPE_I32,
136
+ tcgv_i32_temp(val), NULL, addr, oi);
137
plugin_gen_mem_callbacks_i32(val, copy_addr, addr, orig_oi,
138
QEMU_PLUGIN_MEM_R);
139
140
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i32_int(TCGv_i32 val, TCGTemp *addr,
141
}
142
143
if (TCG_TARGET_HAS_qemu_st8_i32 && (memop & MO_SIZE) == MO_8) {
144
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
145
- opc = INDEX_op_qemu_st8_a32_i32;
146
- } else {
147
- opc = INDEX_op_qemu_st8_a64_i32;
148
- }
149
+ opc = INDEX_op_qemu_st8_i32;
150
} else {
151
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
152
- opc = INDEX_op_qemu_st_a32_i32;
153
- } else {
154
- opc = INDEX_op_qemu_st_a64_i32;
155
- }
156
+ opc = INDEX_op_qemu_st_i32;
157
}
158
gen_ldst(opc, TCG_TYPE_I32, tcgv_i32_temp(val), NULL, addr, oi);
159
plugin_gen_mem_callbacks_i32(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W);
160
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i64_int(TCGv_i64 val, TCGTemp *addr,
161
MemOp orig_memop;
162
MemOpIdx orig_oi, oi;
163
TCGv_i64 copy_addr;
164
- TCGOpcode opc;
165
166
if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) {
167
tcg_gen_qemu_ld_i32_int(TCGV_LOW(val), addr, idx, memop);
168
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i64_int(TCGv_i64 val, TCGTemp *addr,
169
}
170
171
copy_addr = plugin_maybe_preserve_addr(addr);
172
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
173
- opc = INDEX_op_qemu_ld_a32_i64;
174
- } else {
175
- opc = INDEX_op_qemu_ld_a64_i64;
176
- }
177
- gen_ldst_i64(opc, val, addr, oi);
178
+ gen_ldst_i64(INDEX_op_qemu_ld_i64, val, addr, oi);
179
plugin_gen_mem_callbacks_i64(val, copy_addr, addr, orig_oi,
180
QEMU_PLUGIN_MEM_R);
181
182
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i64_int(TCGv_i64 val, TCGTemp *addr,
43
{
183
{
44
@@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
184
TCGv_i64 swap = NULL;
45
FILE *logfile = qemu_log_trylock();
185
MemOpIdx orig_oi, oi;
46
if (logfile) {
186
- TCGOpcode opc;
47
fprintf(logfile, "----------------\n");
187
48
- ops->disas_log(db, cpu, logfile);
188
if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) {
49
+
189
tcg_gen_qemu_st_i32_int(TCGV_LOW(val), addr, idx, memop);
50
+ if (ops->disas_log) {
190
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i64_int(TCGv_i64 val, TCGTemp *addr,
51
+ ops->disas_log(db, cpu, logfile);
191
oi = make_memop_idx(memop, idx);
52
+ } else {
53
+ fprintf(logfile, "IN: %s\n", lookup_symbol(db->pc_first));
54
+ target_disas(logfile, cpu, db->pc_first, db->tb->size);
55
+ }
56
fprintf(logfile, "\n");
57
qemu_log_unlock(logfile);
58
}
59
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/alpha/translate.c
62
+++ b/target/alpha/translate.c
63
@@ -XXX,XX +XXX,XX @@
64
#include "qemu/osdep.h"
65
#include "cpu.h"
66
#include "sysemu/cpus.h"
67
-#include "disas/disas.h"
68
#include "qemu/host-utils.h"
69
#include "exec/exec-all.h"
70
#include "tcg/tcg-op.h"
71
@@ -XXX,XX +XXX,XX @@ static void alpha_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
72
}
192
}
193
194
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
195
- opc = INDEX_op_qemu_st_a32_i64;
196
- } else {
197
- opc = INDEX_op_qemu_st_a64_i64;
198
- }
199
- gen_ldst_i64(opc, val, addr, oi);
200
+ gen_ldst_i64(INDEX_op_qemu_st_i64, val, addr, oi);
201
plugin_gen_mem_callbacks_i64(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W);
202
203
if (swap) {
204
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
205
{
206
MemOpIdx orig_oi;
207
TCGv_i64 ext_addr = NULL;
208
- TCGOpcode opc;
209
210
check_max_alignment(memop_alignment_bits(memop));
211
tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
212
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
213
hi = TCGV128_HIGH(val);
214
}
215
216
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
217
- opc = INDEX_op_qemu_ld_a32_i128;
218
- } else {
219
- opc = INDEX_op_qemu_ld_a64_i128;
220
- }
221
- gen_ldst(opc, TCG_TYPE_I128, tcgv_i64_temp(lo),
222
+ gen_ldst(INDEX_op_qemu_ld_i128, TCG_TYPE_I128, tcgv_i64_temp(lo),
223
tcgv_i64_temp(hi), addr, oi);
224
225
if (need_bswap) {
226
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
227
canonicalize_memop_i128_as_i64(mop, memop);
228
need_bswap = (mop[0] ^ memop) & MO_BSWAP;
229
230
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
231
- opc = INDEX_op_qemu_ld_a32_i64;
232
- } else {
233
- opc = INDEX_op_qemu_ld_a64_i64;
234
- }
235
-
236
/*
237
* Since there are no global TCGv_i128, there is no visible state
238
* changed if the second load faults. Load directly into the two
239
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
240
y = TCGV128_LOW(val);
241
}
242
243
- gen_ldst_i64(opc, x, addr, make_memop_idx(mop[0], idx));
244
+ gen_ldst_i64(INDEX_op_qemu_ld_i64, x, addr,
245
+ make_memop_idx(mop[0], idx));
246
247
if (need_bswap) {
248
tcg_gen_bswap64_i64(x, x);
249
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
250
addr_p8 = tcgv_i64_temp(t);
251
}
252
253
- gen_ldst_i64(opc, y, addr_p8, make_memop_idx(mop[1], idx));
254
+ gen_ldst_i64(INDEX_op_qemu_ld_i64, y, addr_p8,
255
+ make_memop_idx(mop[1], idx));
256
tcg_temp_free_internal(addr_p8);
257
258
if (need_bswap) {
259
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
260
{
261
MemOpIdx orig_oi;
262
TCGv_i64 ext_addr = NULL;
263
- TCGOpcode opc;
264
265
check_max_alignment(memop_alignment_bits(memop));
266
tcg_gen_req_mo(TCG_MO_ST_LD | TCG_MO_ST_ST);
267
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
268
hi = TCGV128_HIGH(val);
269
}
270
271
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
272
- opc = INDEX_op_qemu_st_a32_i128;
273
- } else {
274
- opc = INDEX_op_qemu_st_a64_i128;
275
- }
276
- gen_ldst(opc, TCG_TYPE_I128, tcgv_i64_temp(lo),
277
- tcgv_i64_temp(hi), addr, oi);
278
+ gen_ldst(INDEX_op_qemu_st_i128, TCG_TYPE_I128,
279
+ tcgv_i64_temp(lo), tcgv_i64_temp(hi), addr, oi);
280
281
if (need_bswap) {
282
tcg_temp_free_i64(lo);
283
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
284
285
canonicalize_memop_i128_as_i64(mop, memop);
286
287
- if (tcg_ctx->addr_type == TCG_TYPE_I32) {
288
- opc = INDEX_op_qemu_st_a32_i64;
289
- } else {
290
- opc = INDEX_op_qemu_st_a64_i64;
291
- }
292
-
293
if ((memop & MO_BSWAP) == MO_LE) {
294
x = TCGV128_LOW(val);
295
y = TCGV128_HIGH(val);
296
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
297
x = b;
298
}
299
300
- gen_ldst_i64(opc, x, addr, make_memop_idx(mop[0], idx));
301
+ gen_ldst_i64(INDEX_op_qemu_st_i64, x, addr,
302
+ make_memop_idx(mop[0], idx));
303
304
if (tcg_ctx->addr_type == TCG_TYPE_I32) {
305
TCGv_i32 t = tcg_temp_ebb_new_i32();
306
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
307
308
if (b) {
309
tcg_gen_bswap64_i64(b, y);
310
- gen_ldst_i64(opc, b, addr_p8, make_memop_idx(mop[1], idx));
311
+ gen_ldst_i64(INDEX_op_qemu_st_i64, b, addr_p8,
312
+ make_memop_idx(mop[1], idx));
313
tcg_temp_free_i64(b);
314
} else {
315
- gen_ldst_i64(opc, y, addr_p8, make_memop_idx(mop[1], idx));
316
+ gen_ldst_i64(INDEX_op_qemu_st_i64, y, addr_p8,
317
+ make_memop_idx(mop[1], idx));
318
}
319
tcg_temp_free_internal(addr_p8);
320
} else {
321
diff --git a/tcg/tcg.c b/tcg/tcg.c
322
index XXXXXXX..XXXXXXX 100644
323
--- a/tcg/tcg.c
324
+++ b/tcg/tcg.c
325
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
326
case INDEX_op_exit_tb:
327
case INDEX_op_goto_tb:
328
case INDEX_op_goto_ptr:
329
- case INDEX_op_qemu_ld_a32_i32:
330
- case INDEX_op_qemu_ld_a64_i32:
331
- case INDEX_op_qemu_st_a32_i32:
332
- case INDEX_op_qemu_st_a64_i32:
333
- case INDEX_op_qemu_ld_a32_i64:
334
- case INDEX_op_qemu_ld_a64_i64:
335
- case INDEX_op_qemu_st_a32_i64:
336
- case INDEX_op_qemu_st_a64_i64:
337
+ case INDEX_op_qemu_ld_i32:
338
+ case INDEX_op_qemu_st_i32:
339
+ case INDEX_op_qemu_ld_i64:
340
+ case INDEX_op_qemu_st_i64:
341
return true;
342
343
- case INDEX_op_qemu_st8_a32_i32:
344
- case INDEX_op_qemu_st8_a64_i32:
345
+ case INDEX_op_qemu_st8_i32:
346
return TCG_TARGET_HAS_qemu_st8_i32;
347
348
- case INDEX_op_qemu_ld_a32_i128:
349
- case INDEX_op_qemu_ld_a64_i128:
350
- case INDEX_op_qemu_st_a32_i128:
351
- case INDEX_op_qemu_st_a64_i128:
352
+ case INDEX_op_qemu_ld_i128:
353
+ case INDEX_op_qemu_st_i128:
354
return TCG_TARGET_HAS_qemu_ldst_i128;
355
356
case INDEX_op_mov_i32:
357
@@ -XXX,XX +XXX,XX @@ void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
358
}
359
i = 1;
360
break;
361
- case INDEX_op_qemu_ld_a32_i32:
362
- case INDEX_op_qemu_ld_a64_i32:
363
- case INDEX_op_qemu_st_a32_i32:
364
- case INDEX_op_qemu_st_a64_i32:
365
- case INDEX_op_qemu_st8_a32_i32:
366
- case INDEX_op_qemu_st8_a64_i32:
367
- case INDEX_op_qemu_ld_a32_i64:
368
- case INDEX_op_qemu_ld_a64_i64:
369
- case INDEX_op_qemu_st_a32_i64:
370
- case INDEX_op_qemu_st_a64_i64:
371
- case INDEX_op_qemu_ld_a32_i128:
372
- case INDEX_op_qemu_ld_a64_i128:
373
- case INDEX_op_qemu_st_a32_i128:
374
- case INDEX_op_qemu_st_a64_i128:
375
+ case INDEX_op_qemu_ld_i32:
376
+ case INDEX_op_qemu_st_i32:
377
+ case INDEX_op_qemu_st8_i32:
378
+ case INDEX_op_qemu_ld_i64:
379
+ case INDEX_op_qemu_st_i64:
380
+ case INDEX_op_qemu_ld_i128:
381
+ case INDEX_op_qemu_st_i128:
382
{
383
const char *s_al, *s_op, *s_at;
384
MemOpIdx oi = op->args[k++];
385
diff --git a/tcg/tci.c b/tcg/tci.c
386
index XXXXXXX..XXXXXXX 100644
387
--- a/tcg/tci.c
388
+++ b/tcg/tci.c
389
@@ -XXX,XX +XXX,XX @@ static void tci_args_rrrbb(uint32_t insn, TCGReg *r0, TCGReg *r1,
390
*i4 = extract32(insn, 26, 6);
73
}
391
}
74
392
75
-static void alpha_tr_disas_log(const DisasContextBase *dcbase,
393
-static void tci_args_rrrrr(uint32_t insn, TCGReg *r0, TCGReg *r1,
76
- CPUState *cpu, FILE *logfile)
394
- TCGReg *r2, TCGReg *r3, TCGReg *r4)
77
-{
395
-{
78
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
396
- *r0 = extract32(insn, 8, 4);
79
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
397
- *r1 = extract32(insn, 12, 4);
398
- *r2 = extract32(insn, 16, 4);
399
- *r3 = extract32(insn, 20, 4);
400
- *r4 = extract32(insn, 24, 4);
80
-}
401
-}
81
-
402
-
82
static const TranslatorOps alpha_tr_ops = {
403
static void tci_args_rrrr(uint32_t insn,
83
.init_disas_context = alpha_tr_init_disas_context,
404
TCGReg *r0, TCGReg *r1, TCGReg *r2, TCGReg *r3)
84
.tb_start = alpha_tr_tb_start,
405
{
85
.insn_start = alpha_tr_insn_start,
406
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
86
.translate_insn = alpha_tr_translate_insn,
407
tb_ptr = ptr;
87
.tb_stop = alpha_tr_tb_stop,
408
break;
88
- .disas_log = alpha_tr_disas_log,
409
89
};
410
- case INDEX_op_qemu_ld_a32_i32:
90
411
+ case INDEX_op_qemu_ld_i32:
91
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
412
tci_args_rrm(insn, &r0, &r1, &oi);
92
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
413
- taddr = (uint32_t)regs[r1];
93
index XXXXXXX..XXXXXXX 100644
414
- goto do_ld_i32;
94
--- a/target/arm/tcg/translate-a64.c
415
- case INDEX_op_qemu_ld_a64_i32:
95
+++ b/target/arm/tcg/translate-a64.c
416
- if (TCG_TARGET_REG_BITS == 64) {
96
@@ -XXX,XX +XXX,XX @@
417
- tci_args_rrm(insn, &r0, &r1, &oi);
97
#include "translate.h"
418
- taddr = regs[r1];
98
#include "translate-a64.h"
419
- } else {
99
#include "qemu/log.h"
420
- tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
100
-#include "disas/disas.h"
421
- taddr = tci_uint64(regs[r2], regs[r1]);
101
#include "arm_ldst.h"
422
- oi = regs[r3];
102
#include "semihosting/semihost.h"
423
- }
103
#include "cpregs.h"
424
- do_ld_i32:
104
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
425
+ taddr = regs[r1];
105
}
426
regs[r0] = tci_qemu_ld(env, taddr, oi, tb_ptr);
427
break;
428
429
- case INDEX_op_qemu_ld_a32_i64:
430
- if (TCG_TARGET_REG_BITS == 64) {
431
- tci_args_rrm(insn, &r0, &r1, &oi);
432
- taddr = (uint32_t)regs[r1];
433
- } else {
434
- tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
435
- taddr = (uint32_t)regs[r2];
436
- oi = regs[r3];
437
- }
438
- goto do_ld_i64;
439
- case INDEX_op_qemu_ld_a64_i64:
440
+ case INDEX_op_qemu_ld_i64:
441
if (TCG_TARGET_REG_BITS == 64) {
442
tci_args_rrm(insn, &r0, &r1, &oi);
443
taddr = regs[r1];
444
} else {
445
- tci_args_rrrrr(insn, &r0, &r1, &r2, &r3, &r4);
446
- taddr = tci_uint64(regs[r3], regs[r2]);
447
- oi = regs[r4];
448
+ tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
449
+ taddr = regs[r2];
450
+ oi = regs[r3];
451
}
452
- do_ld_i64:
453
tmp64 = tci_qemu_ld(env, taddr, oi, tb_ptr);
454
if (TCG_TARGET_REG_BITS == 32) {
455
tci_write_reg64(regs, r1, r0, tmp64);
456
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
457
}
458
break;
459
460
- case INDEX_op_qemu_st_a32_i32:
461
+ case INDEX_op_qemu_st_i32:
462
tci_args_rrm(insn, &r0, &r1, &oi);
463
- taddr = (uint32_t)regs[r1];
464
- goto do_st_i32;
465
- case INDEX_op_qemu_st_a64_i32:
466
- if (TCG_TARGET_REG_BITS == 64) {
467
- tci_args_rrm(insn, &r0, &r1, &oi);
468
- taddr = regs[r1];
469
- } else {
470
- tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
471
- taddr = tci_uint64(regs[r2], regs[r1]);
472
- oi = regs[r3];
473
- }
474
- do_st_i32:
475
+ taddr = regs[r1];
476
tci_qemu_st(env, taddr, regs[r0], oi, tb_ptr);
477
break;
478
479
- case INDEX_op_qemu_st_a32_i64:
480
- if (TCG_TARGET_REG_BITS == 64) {
481
- tci_args_rrm(insn, &r0, &r1, &oi);
482
- tmp64 = regs[r0];
483
- taddr = (uint32_t)regs[r1];
484
- } else {
485
- tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
486
- tmp64 = tci_uint64(regs[r1], regs[r0]);
487
- taddr = (uint32_t)regs[r2];
488
- oi = regs[r3];
489
- }
490
- goto do_st_i64;
491
- case INDEX_op_qemu_st_a64_i64:
492
+ case INDEX_op_qemu_st_i64:
493
if (TCG_TARGET_REG_BITS == 64) {
494
tci_args_rrm(insn, &r0, &r1, &oi);
495
tmp64 = regs[r0];
496
taddr = regs[r1];
497
} else {
498
- tci_args_rrrrr(insn, &r0, &r1, &r2, &r3, &r4);
499
+ tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
500
tmp64 = tci_uint64(regs[r1], regs[r0]);
501
- taddr = tci_uint64(regs[r3], regs[r2]);
502
- oi = regs[r4];
503
+ taddr = regs[r2];
504
+ oi = regs[r3];
505
}
506
- do_st_i64:
507
tci_qemu_st(env, taddr, tmp64, oi, tb_ptr);
508
break;
509
510
@@ -XXX,XX +XXX,XX @@ int print_insn_tci(bfd_vma addr, disassemble_info *info)
511
str_r(r3), str_r(r4), str_r(r5));
512
break;
513
514
- case INDEX_op_qemu_ld_a32_i32:
515
- case INDEX_op_qemu_st_a32_i32:
516
- len = 1 + 1;
517
- goto do_qemu_ldst;
518
- case INDEX_op_qemu_ld_a32_i64:
519
- case INDEX_op_qemu_st_a32_i64:
520
- case INDEX_op_qemu_ld_a64_i32:
521
- case INDEX_op_qemu_st_a64_i32:
522
- len = 1 + DIV_ROUND_UP(64, TCG_TARGET_REG_BITS);
523
- goto do_qemu_ldst;
524
- case INDEX_op_qemu_ld_a64_i64:
525
- case INDEX_op_qemu_st_a64_i64:
526
- len = 2 * DIV_ROUND_UP(64, TCG_TARGET_REG_BITS);
527
- goto do_qemu_ldst;
528
- do_qemu_ldst:
529
- switch (len) {
530
- case 2:
531
- tci_args_rrm(insn, &r0, &r1, &oi);
532
- info->fprintf_func(info->stream, "%-12s %s, %s, %x",
533
- op_name, str_r(r0), str_r(r1), oi);
534
- break;
535
- case 3:
536
+ case INDEX_op_qemu_ld_i64:
537
+ case INDEX_op_qemu_st_i64:
538
+ if (TCG_TARGET_REG_BITS == 32) {
539
tci_args_rrrr(insn, &r0, &r1, &r2, &r3);
540
info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s",
541
op_name, str_r(r0), str_r(r1),
542
str_r(r2), str_r(r3));
543
break;
544
- case 4:
545
- tci_args_rrrrr(insn, &r0, &r1, &r2, &r3, &r4);
546
- info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s, %s",
547
- op_name, str_r(r0), str_r(r1),
548
- str_r(r2), str_r(r3), str_r(r4));
549
- break;
550
- default:
551
- g_assert_not_reached();
552
}
553
+ /* fall through */
554
+ case INDEX_op_qemu_ld_i32:
555
+ case INDEX_op_qemu_st_i32:
556
+ tci_args_rrm(insn, &r0, &r1, &oi);
557
+ info->fprintf_func(info->stream, "%-12s %s, %s, %x",
558
+ op_name, str_r(r0), str_r(r1), oi);
559
break;
560
561
case 0:
562
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
563
index XXXXXXX..XXXXXXX 100644
564
--- a/tcg/aarch64/tcg-target.c.inc
565
+++ b/tcg/aarch64/tcg-target.c.inc
566
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
567
tcg_out_insn(s, 3506, CSEL, ext, a0, REG0(3), REG0(4), args[5]);
568
break;
569
570
- case INDEX_op_qemu_ld_a32_i32:
571
- case INDEX_op_qemu_ld_a64_i32:
572
- case INDEX_op_qemu_ld_a32_i64:
573
- case INDEX_op_qemu_ld_a64_i64:
574
+ case INDEX_op_qemu_ld_i32:
575
+ case INDEX_op_qemu_ld_i64:
576
tcg_out_qemu_ld(s, a0, a1, a2, ext);
577
break;
578
- case INDEX_op_qemu_st_a32_i32:
579
- case INDEX_op_qemu_st_a64_i32:
580
- case INDEX_op_qemu_st_a32_i64:
581
- case INDEX_op_qemu_st_a64_i64:
582
+ case INDEX_op_qemu_st_i32:
583
+ case INDEX_op_qemu_st_i64:
584
tcg_out_qemu_st(s, REG0(0), a1, a2, ext);
585
break;
586
- case INDEX_op_qemu_ld_a32_i128:
587
- case INDEX_op_qemu_ld_a64_i128:
588
+ case INDEX_op_qemu_ld_i128:
589
tcg_out_qemu_ldst_i128(s, a0, a1, a2, args[3], true);
590
break;
591
- case INDEX_op_qemu_st_a32_i128:
592
- case INDEX_op_qemu_st_a64_i128:
593
+ case INDEX_op_qemu_st_i128:
594
tcg_out_qemu_ldst_i128(s, REG0(0), REG0(1), a2, args[3], false);
595
break;
596
597
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
598
case INDEX_op_movcond_i64:
599
return C_O1_I4(r, r, rC, rZ, rZ);
600
601
- case INDEX_op_qemu_ld_a32_i32:
602
- case INDEX_op_qemu_ld_a64_i32:
603
- case INDEX_op_qemu_ld_a32_i64:
604
- case INDEX_op_qemu_ld_a64_i64:
605
+ case INDEX_op_qemu_ld_i32:
606
+ case INDEX_op_qemu_ld_i64:
607
return C_O1_I1(r, r);
608
- case INDEX_op_qemu_ld_a32_i128:
609
- case INDEX_op_qemu_ld_a64_i128:
610
+ case INDEX_op_qemu_ld_i128:
611
return C_O2_I1(r, r, r);
612
- case INDEX_op_qemu_st_a32_i32:
613
- case INDEX_op_qemu_st_a64_i32:
614
- case INDEX_op_qemu_st_a32_i64:
615
- case INDEX_op_qemu_st_a64_i64:
616
+ case INDEX_op_qemu_st_i32:
617
+ case INDEX_op_qemu_st_i64:
618
return C_O0_I2(rZ, r);
619
- case INDEX_op_qemu_st_a32_i128:
620
- case INDEX_op_qemu_st_a64_i128:
621
+ case INDEX_op_qemu_st_i128:
622
return C_O0_I3(rZ, rZ, r);
623
624
case INDEX_op_deposit_i32:
625
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
626
index XXXXXXX..XXXXXXX 100644
627
--- a/tcg/arm/tcg-target.c.inc
628
+++ b/tcg/arm/tcg-target.c.inc
629
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
630
ARITH_MOV, args[0], 0, 0);
631
break;
632
633
- case INDEX_op_qemu_ld_a32_i32:
634
+ case INDEX_op_qemu_ld_i32:
635
tcg_out_qemu_ld(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32);
636
break;
637
- case INDEX_op_qemu_ld_a64_i32:
638
- tcg_out_qemu_ld(s, args[0], -1, args[1], args[2],
639
- args[3], TCG_TYPE_I32);
640
- break;
641
- case INDEX_op_qemu_ld_a32_i64:
642
+ case INDEX_op_qemu_ld_i64:
643
tcg_out_qemu_ld(s, args[0], args[1], args[2], -1,
644
args[3], TCG_TYPE_I64);
645
break;
646
- case INDEX_op_qemu_ld_a64_i64:
647
- tcg_out_qemu_ld(s, args[0], args[1], args[2], args[3],
648
- args[4], TCG_TYPE_I64);
649
- break;
650
651
- case INDEX_op_qemu_st_a32_i32:
652
+ case INDEX_op_qemu_st_i32:
653
tcg_out_qemu_st(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32);
654
break;
655
- case INDEX_op_qemu_st_a64_i32:
656
- tcg_out_qemu_st(s, args[0], -1, args[1], args[2],
657
- args[3], TCG_TYPE_I32);
658
- break;
659
- case INDEX_op_qemu_st_a32_i64:
660
+ case INDEX_op_qemu_st_i64:
661
tcg_out_qemu_st(s, args[0], args[1], args[2], -1,
662
args[3], TCG_TYPE_I64);
663
break;
664
- case INDEX_op_qemu_st_a64_i64:
665
- tcg_out_qemu_st(s, args[0], args[1], args[2], args[3],
666
- args[4], TCG_TYPE_I64);
667
- break;
668
669
case INDEX_op_bswap16_i32:
670
tcg_out_bswap16(s, COND_AL, args[0], args[1], args[2]);
671
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
672
case INDEX_op_setcond2_i32:
673
return C_O1_I4(r, r, r, rI, rI);
674
675
- case INDEX_op_qemu_ld_a32_i32:
676
+ case INDEX_op_qemu_ld_i32:
677
return C_O1_I1(r, q);
678
- case INDEX_op_qemu_ld_a64_i32:
679
- return C_O1_I2(r, q, q);
680
- case INDEX_op_qemu_ld_a32_i64:
681
+ case INDEX_op_qemu_ld_i64:
682
return C_O2_I1(e, p, q);
683
- case INDEX_op_qemu_ld_a64_i64:
684
- return C_O2_I2(e, p, q, q);
685
- case INDEX_op_qemu_st_a32_i32:
686
+ case INDEX_op_qemu_st_i32:
687
return C_O0_I2(q, q);
688
- case INDEX_op_qemu_st_a64_i32:
689
- return C_O0_I3(q, q, q);
690
- case INDEX_op_qemu_st_a32_i64:
691
+ case INDEX_op_qemu_st_i64:
692
return C_O0_I3(Q, p, q);
693
- case INDEX_op_qemu_st_a64_i64:
694
- return C_O0_I4(Q, p, q, q);
695
696
case INDEX_op_st_vec:
697
return C_O0_I2(w, r);
698
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
699
index XXXXXXX..XXXXXXX 100644
700
--- a/tcg/i386/tcg-target.c.inc
701
+++ b/tcg/i386/tcg-target.c.inc
702
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
703
tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_NOT, a0);
704
break;
705
706
- case INDEX_op_qemu_ld_a64_i32:
707
- if (TCG_TARGET_REG_BITS == 32) {
708
- tcg_out_qemu_ld(s, a0, -1, a1, a2, args[3], TCG_TYPE_I32);
709
- break;
710
- }
711
- /* fall through */
712
- case INDEX_op_qemu_ld_a32_i32:
713
+ case INDEX_op_qemu_ld_i32:
714
tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I32);
715
break;
716
- case INDEX_op_qemu_ld_a32_i64:
717
+ case INDEX_op_qemu_ld_i64:
718
if (TCG_TARGET_REG_BITS == 64) {
719
tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I64);
720
} else {
721
tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I64);
722
}
723
break;
724
- case INDEX_op_qemu_ld_a64_i64:
725
- if (TCG_TARGET_REG_BITS == 64) {
726
- tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I64);
727
- } else {
728
- tcg_out_qemu_ld(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64);
729
- }
730
- break;
731
- case INDEX_op_qemu_ld_a32_i128:
732
- case INDEX_op_qemu_ld_a64_i128:
733
+ case INDEX_op_qemu_ld_i128:
734
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
735
tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128);
736
break;
737
738
- case INDEX_op_qemu_st_a64_i32:
739
- case INDEX_op_qemu_st8_a64_i32:
740
- if (TCG_TARGET_REG_BITS == 32) {
741
- tcg_out_qemu_st(s, a0, -1, a1, a2, args[3], TCG_TYPE_I32);
742
- break;
743
- }
744
- /* fall through */
745
- case INDEX_op_qemu_st_a32_i32:
746
- case INDEX_op_qemu_st8_a32_i32:
747
+ case INDEX_op_qemu_st_i32:
748
+ case INDEX_op_qemu_st8_i32:
749
tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I32);
750
break;
751
- case INDEX_op_qemu_st_a32_i64:
752
+ case INDEX_op_qemu_st_i64:
753
if (TCG_TARGET_REG_BITS == 64) {
754
tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I64);
755
} else {
756
tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I64);
757
}
758
break;
759
- case INDEX_op_qemu_st_a64_i64:
760
- if (TCG_TARGET_REG_BITS == 64) {
761
- tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I64);
762
- } else {
763
- tcg_out_qemu_st(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64);
764
- }
765
- break;
766
- case INDEX_op_qemu_st_a32_i128:
767
- case INDEX_op_qemu_st_a64_i128:
768
+ case INDEX_op_qemu_st_i128:
769
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
770
tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128);
771
break;
772
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
773
case INDEX_op_clz_i64:
774
return have_lzcnt ? C_N1_I2(r, r, rW) : C_N1_I2(r, r, r);
775
776
- case INDEX_op_qemu_ld_a32_i32:
777
+ case INDEX_op_qemu_ld_i32:
778
return C_O1_I1(r, L);
779
- case INDEX_op_qemu_ld_a64_i32:
780
- return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, L) : C_O1_I2(r, L, L);
781
782
- case INDEX_op_qemu_st_a32_i32:
783
+ case INDEX_op_qemu_st_i32:
784
return C_O0_I2(L, L);
785
- case INDEX_op_qemu_st_a64_i32:
786
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(L, L) : C_O0_I3(L, L, L);
787
- case INDEX_op_qemu_st8_a32_i32:
788
+ case INDEX_op_qemu_st8_i32:
789
return C_O0_I2(s, L);
790
- case INDEX_op_qemu_st8_a64_i32:
791
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(s, L) : C_O0_I3(s, L, L);
792
793
- case INDEX_op_qemu_ld_a32_i64:
794
+ case INDEX_op_qemu_ld_i64:
795
return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, L) : C_O2_I1(r, r, L);
796
- case INDEX_op_qemu_ld_a64_i64:
797
- return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, L) : C_O2_I2(r, r, L, L);
798
799
- case INDEX_op_qemu_st_a32_i64:
800
+ case INDEX_op_qemu_st_i64:
801
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(L, L) : C_O0_I3(L, L, L);
802
- case INDEX_op_qemu_st_a64_i64:
803
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(L, L) : C_O0_I4(L, L, L, L);
804
805
- case INDEX_op_qemu_ld_a32_i128:
806
- case INDEX_op_qemu_ld_a64_i128:
807
+ case INDEX_op_qemu_ld_i128:
808
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
809
return C_O2_I1(r, r, L);
810
- case INDEX_op_qemu_st_a32_i128:
811
- case INDEX_op_qemu_st_a64_i128:
812
+ case INDEX_op_qemu_st_i128:
813
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
814
return C_O0_I3(L, L, L);
815
816
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
817
index XXXXXXX..XXXXXXX 100644
818
--- a/tcg/loongarch64/tcg-target.c.inc
819
+++ b/tcg/loongarch64/tcg-target.c.inc
820
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
821
tcg_out_ldst(s, OPC_ST_D, a0, a1, a2);
822
break;
823
824
- case INDEX_op_qemu_ld_a32_i32:
825
- case INDEX_op_qemu_ld_a64_i32:
826
+ case INDEX_op_qemu_ld_i32:
827
tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I32);
828
break;
829
- case INDEX_op_qemu_ld_a32_i64:
830
- case INDEX_op_qemu_ld_a64_i64:
831
+ case INDEX_op_qemu_ld_i64:
832
tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I64);
833
break;
834
- case INDEX_op_qemu_ld_a32_i128:
835
- case INDEX_op_qemu_ld_a64_i128:
836
+ case INDEX_op_qemu_ld_i128:
837
tcg_out_qemu_ldst_i128(s, a0, a1, a2, a3, true);
838
break;
839
- case INDEX_op_qemu_st_a32_i32:
840
- case INDEX_op_qemu_st_a64_i32:
841
+ case INDEX_op_qemu_st_i32:
842
tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I32);
843
break;
844
- case INDEX_op_qemu_st_a32_i64:
845
- case INDEX_op_qemu_st_a64_i64:
846
+ case INDEX_op_qemu_st_i64:
847
tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I64);
848
break;
849
- case INDEX_op_qemu_st_a32_i128:
850
- case INDEX_op_qemu_st_a64_i128:
851
+ case INDEX_op_qemu_st_i128:
852
tcg_out_qemu_ldst_i128(s, a0, a1, a2, a3, false);
853
break;
854
855
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
856
case INDEX_op_st32_i64:
857
case INDEX_op_st_i32:
858
case INDEX_op_st_i64:
859
- case INDEX_op_qemu_st_a32_i32:
860
- case INDEX_op_qemu_st_a64_i32:
861
- case INDEX_op_qemu_st_a32_i64:
862
- case INDEX_op_qemu_st_a64_i64:
863
+ case INDEX_op_qemu_st_i32:
864
+ case INDEX_op_qemu_st_i64:
865
return C_O0_I2(rZ, r);
866
867
- case INDEX_op_qemu_ld_a32_i128:
868
- case INDEX_op_qemu_ld_a64_i128:
869
+ case INDEX_op_qemu_ld_i128:
870
return C_N2_I1(r, r, r);
871
872
- case INDEX_op_qemu_st_a32_i128:
873
- case INDEX_op_qemu_st_a64_i128:
874
+ case INDEX_op_qemu_st_i128:
875
return C_O0_I3(r, r, r);
876
877
case INDEX_op_brcond_i32:
878
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
879
case INDEX_op_ld32u_i64:
880
case INDEX_op_ld_i32:
881
case INDEX_op_ld_i64:
882
- case INDEX_op_qemu_ld_a32_i32:
883
- case INDEX_op_qemu_ld_a64_i32:
884
- case INDEX_op_qemu_ld_a32_i64:
885
- case INDEX_op_qemu_ld_a64_i64:
886
+ case INDEX_op_qemu_ld_i32:
887
+ case INDEX_op_qemu_ld_i64:
888
return C_O1_I1(r, r);
889
890
case INDEX_op_andc_i32:
891
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
892
index XXXXXXX..XXXXXXX 100644
893
--- a/tcg/mips/tcg-target.c.inc
894
+++ b/tcg/mips/tcg-target.c.inc
895
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
896
tcg_out_setcond2(s, args[5], a0, a1, a2, args[3], args[4]);
897
break;
898
899
- case INDEX_op_qemu_ld_a64_i32:
900
- if (TCG_TARGET_REG_BITS == 32) {
901
- tcg_out_qemu_ld(s, a0, 0, a1, a2, args[3], TCG_TYPE_I32);
902
- break;
903
- }
904
- /* fall through */
905
- case INDEX_op_qemu_ld_a32_i32:
906
+ case INDEX_op_qemu_ld_i32:
907
tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I32);
908
break;
909
- case INDEX_op_qemu_ld_a32_i64:
910
+ case INDEX_op_qemu_ld_i64:
911
if (TCG_TARGET_REG_BITS == 64) {
912
tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I64);
913
} else {
914
tcg_out_qemu_ld(s, a0, a1, a2, 0, args[3], TCG_TYPE_I64);
915
}
916
break;
917
- case INDEX_op_qemu_ld_a64_i64:
918
- if (TCG_TARGET_REG_BITS == 64) {
919
- tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I64);
920
- } else {
921
- tcg_out_qemu_ld(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64);
922
- }
923
- break;
924
925
- case INDEX_op_qemu_st_a64_i32:
926
- if (TCG_TARGET_REG_BITS == 32) {
927
- tcg_out_qemu_st(s, a0, 0, a1, a2, args[3], TCG_TYPE_I32);
928
- break;
929
- }
930
- /* fall through */
931
- case INDEX_op_qemu_st_a32_i32:
932
+ case INDEX_op_qemu_st_i32:
933
tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I32);
934
break;
935
- case INDEX_op_qemu_st_a32_i64:
936
+ case INDEX_op_qemu_st_i64:
937
if (TCG_TARGET_REG_BITS == 64) {
938
tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I64);
939
} else {
940
tcg_out_qemu_st(s, a0, a1, a2, 0, args[3], TCG_TYPE_I64);
941
}
942
break;
943
- case INDEX_op_qemu_st_a64_i64:
944
- if (TCG_TARGET_REG_BITS == 64) {
945
- tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I64);
946
- } else {
947
- tcg_out_qemu_st(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64);
948
- }
949
- break;
950
951
case INDEX_op_add2_i32:
952
tcg_out_addsub2(s, a0, a1, a2, args[3], args[4], args[5],
953
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
954
case INDEX_op_brcond2_i32:
955
return C_O0_I4(rZ, rZ, rZ, rZ);
956
957
- case INDEX_op_qemu_ld_a32_i32:
958
+ case INDEX_op_qemu_ld_i32:
959
return C_O1_I1(r, r);
960
- case INDEX_op_qemu_ld_a64_i32:
961
- return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O1_I2(r, r, r);
962
- case INDEX_op_qemu_st_a32_i32:
963
+ case INDEX_op_qemu_st_i32:
964
return C_O0_I2(rZ, r);
965
- case INDEX_op_qemu_st_a64_i32:
966
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rZ, r) : C_O0_I3(rZ, r, r);
967
- case INDEX_op_qemu_ld_a32_i64:
968
+ case INDEX_op_qemu_ld_i64:
969
return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I1(r, r, r);
970
- case INDEX_op_qemu_ld_a64_i64:
971
- return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I2(r, r, r, r);
972
- case INDEX_op_qemu_st_a32_i64:
973
+ case INDEX_op_qemu_st_i64:
974
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rZ, r) : C_O0_I3(rZ, rZ, r);
975
- case INDEX_op_qemu_st_a64_i64:
976
- return (TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rZ, r)
977
- : C_O0_I4(rZ, rZ, r, r));
978
979
default:
980
return C_NotImplemented;
981
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
982
index XXXXXXX..XXXXXXX 100644
983
--- a/tcg/ppc/tcg-target.c.inc
984
+++ b/tcg/ppc/tcg-target.c.inc
985
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
986
tcg_out32(s, MODUD | TAB(args[0], args[1], args[2]));
987
break;
988
989
- case INDEX_op_qemu_ld_a64_i32:
990
- if (TCG_TARGET_REG_BITS == 32) {
991
- tcg_out_qemu_ld(s, args[0], -1, args[1], args[2],
992
- args[3], TCG_TYPE_I32);
993
- break;
994
- }
995
- /* fall through */
996
- case INDEX_op_qemu_ld_a32_i32:
997
+ case INDEX_op_qemu_ld_i32:
998
tcg_out_qemu_ld(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32);
999
break;
1000
- case INDEX_op_qemu_ld_a32_i64:
1001
+ case INDEX_op_qemu_ld_i64:
1002
if (TCG_TARGET_REG_BITS == 64) {
1003
tcg_out_qemu_ld(s, args[0], -1, args[1], -1,
1004
args[2], TCG_TYPE_I64);
1005
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
1006
args[3], TCG_TYPE_I64);
1007
}
1008
break;
1009
- case INDEX_op_qemu_ld_a64_i64:
1010
- if (TCG_TARGET_REG_BITS == 64) {
1011
- tcg_out_qemu_ld(s, args[0], -1, args[1], -1,
1012
- args[2], TCG_TYPE_I64);
1013
- } else {
1014
- tcg_out_qemu_ld(s, args[0], args[1], args[2], args[3],
1015
- args[4], TCG_TYPE_I64);
1016
- }
1017
- break;
1018
- case INDEX_op_qemu_ld_a32_i128:
1019
- case INDEX_op_qemu_ld_a64_i128:
1020
+ case INDEX_op_qemu_ld_i128:
1021
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
1022
tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], true);
1023
break;
1024
1025
- case INDEX_op_qemu_st_a64_i32:
1026
- if (TCG_TARGET_REG_BITS == 32) {
1027
- tcg_out_qemu_st(s, args[0], -1, args[1], args[2],
1028
- args[3], TCG_TYPE_I32);
1029
- break;
1030
- }
1031
- /* fall through */
1032
- case INDEX_op_qemu_st_a32_i32:
1033
+ case INDEX_op_qemu_st_i32:
1034
tcg_out_qemu_st(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32);
1035
break;
1036
- case INDEX_op_qemu_st_a32_i64:
1037
+ case INDEX_op_qemu_st_i64:
1038
if (TCG_TARGET_REG_BITS == 64) {
1039
tcg_out_qemu_st(s, args[0], -1, args[1], -1,
1040
args[2], TCG_TYPE_I64);
1041
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
1042
args[3], TCG_TYPE_I64);
1043
}
1044
break;
1045
- case INDEX_op_qemu_st_a64_i64:
1046
- if (TCG_TARGET_REG_BITS == 64) {
1047
- tcg_out_qemu_st(s, args[0], -1, args[1], -1,
1048
- args[2], TCG_TYPE_I64);
1049
- } else {
1050
- tcg_out_qemu_st(s, args[0], args[1], args[2], args[3],
1051
- args[4], TCG_TYPE_I64);
1052
- }
1053
- break;
1054
- case INDEX_op_qemu_st_a32_i128:
1055
- case INDEX_op_qemu_st_a64_i128:
1056
+ case INDEX_op_qemu_st_i128:
1057
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
1058
tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], false);
1059
break;
1060
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
1061
case INDEX_op_sub2_i32:
1062
return C_O2_I4(r, r, rI, rZM, r, r);
1063
1064
- case INDEX_op_qemu_ld_a32_i32:
1065
+ case INDEX_op_qemu_ld_i32:
1066
return C_O1_I1(r, r);
1067
- case INDEX_op_qemu_ld_a64_i32:
1068
- return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O1_I2(r, r, r);
1069
- case INDEX_op_qemu_ld_a32_i64:
1070
+ case INDEX_op_qemu_ld_i64:
1071
return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I1(r, r, r);
1072
- case INDEX_op_qemu_ld_a64_i64:
1073
- return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I2(r, r, r, r);
1074
1075
- case INDEX_op_qemu_st_a32_i32:
1076
+ case INDEX_op_qemu_st_i32:
1077
return C_O0_I2(r, r);
1078
- case INDEX_op_qemu_st_a64_i32:
1079
+ case INDEX_op_qemu_st_i64:
1080
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I3(r, r, r);
1081
- case INDEX_op_qemu_st_a32_i64:
1082
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I3(r, r, r);
1083
- case INDEX_op_qemu_st_a64_i64:
1084
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I4(r, r, r, r);
1085
1086
- case INDEX_op_qemu_ld_a32_i128:
1087
- case INDEX_op_qemu_ld_a64_i128:
1088
+ case INDEX_op_qemu_ld_i128:
1089
return C_N1O1_I1(o, m, r);
1090
- case INDEX_op_qemu_st_a32_i128:
1091
- case INDEX_op_qemu_st_a64_i128:
1092
+ case INDEX_op_qemu_st_i128:
1093
return C_O0_I3(o, m, r);
1094
1095
case INDEX_op_add_vec:
1096
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
1097
index XXXXXXX..XXXXXXX 100644
1098
--- a/tcg/riscv/tcg-target.c.inc
1099
+++ b/tcg/riscv/tcg-target.c.inc
1100
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
1101
args[3], const_args[3], args[4], const_args[4]);
1102
break;
1103
1104
- case INDEX_op_qemu_ld_a32_i32:
1105
- case INDEX_op_qemu_ld_a64_i32:
1106
+ case INDEX_op_qemu_ld_i32:
1107
tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I32);
1108
break;
1109
- case INDEX_op_qemu_ld_a32_i64:
1110
- case INDEX_op_qemu_ld_a64_i64:
1111
+ case INDEX_op_qemu_ld_i64:
1112
tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I64);
1113
break;
1114
- case INDEX_op_qemu_st_a32_i32:
1115
- case INDEX_op_qemu_st_a64_i32:
1116
+ case INDEX_op_qemu_st_i32:
1117
tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I32);
1118
break;
1119
- case INDEX_op_qemu_st_a32_i64:
1120
- case INDEX_op_qemu_st_a64_i64:
1121
+ case INDEX_op_qemu_st_i64:
1122
tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I64);
1123
break;
1124
1125
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
1126
case INDEX_op_sub2_i64:
1127
return C_O2_I4(r, r, rZ, rZ, rM, rM);
1128
1129
- case INDEX_op_qemu_ld_a32_i32:
1130
- case INDEX_op_qemu_ld_a64_i32:
1131
- case INDEX_op_qemu_ld_a32_i64:
1132
- case INDEX_op_qemu_ld_a64_i64:
1133
+ case INDEX_op_qemu_ld_i32:
1134
+ case INDEX_op_qemu_ld_i64:
1135
return C_O1_I1(r, r);
1136
- case INDEX_op_qemu_st_a32_i32:
1137
- case INDEX_op_qemu_st_a64_i32:
1138
- case INDEX_op_qemu_st_a32_i64:
1139
- case INDEX_op_qemu_st_a64_i64:
1140
+ case INDEX_op_qemu_st_i32:
1141
+ case INDEX_op_qemu_st_i64:
1142
return C_O0_I2(rZ, r);
1143
1144
case INDEX_op_st_vec:
1145
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
1146
index XXXXXXX..XXXXXXX 100644
1147
--- a/tcg/s390x/tcg-target.c.inc
1148
+++ b/tcg/s390x/tcg-target.c.inc
1149
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
1150
args[2], const_args[2], args[3], const_args[3], args[4]);
1151
break;
1152
1153
- case INDEX_op_qemu_ld_a32_i32:
1154
- case INDEX_op_qemu_ld_a64_i32:
1155
+ case INDEX_op_qemu_ld_i32:
1156
tcg_out_qemu_ld(s, args[0], args[1], args[2], TCG_TYPE_I32);
1157
break;
1158
- case INDEX_op_qemu_ld_a32_i64:
1159
- case INDEX_op_qemu_ld_a64_i64:
1160
+ case INDEX_op_qemu_ld_i64:
1161
tcg_out_qemu_ld(s, args[0], args[1], args[2], TCG_TYPE_I64);
1162
break;
1163
- case INDEX_op_qemu_st_a32_i32:
1164
- case INDEX_op_qemu_st_a64_i32:
1165
+ case INDEX_op_qemu_st_i32:
1166
tcg_out_qemu_st(s, args[0], args[1], args[2], TCG_TYPE_I32);
1167
break;
1168
- case INDEX_op_qemu_st_a32_i64:
1169
- case INDEX_op_qemu_st_a64_i64:
1170
+ case INDEX_op_qemu_st_i64:
1171
tcg_out_qemu_st(s, args[0], args[1], args[2], TCG_TYPE_I64);
1172
break;
1173
- case INDEX_op_qemu_ld_a32_i128:
1174
- case INDEX_op_qemu_ld_a64_i128:
1175
+ case INDEX_op_qemu_ld_i128:
1176
tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], true);
1177
break;
1178
- case INDEX_op_qemu_st_a32_i128:
1179
- case INDEX_op_qemu_st_a64_i128:
1180
+ case INDEX_op_qemu_st_i128:
1181
tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], false);
1182
break;
1183
1184
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
1185
case INDEX_op_ctpop_i64:
1186
return C_O1_I1(r, r);
1187
1188
- case INDEX_op_qemu_ld_a32_i32:
1189
- case INDEX_op_qemu_ld_a64_i32:
1190
- case INDEX_op_qemu_ld_a32_i64:
1191
- case INDEX_op_qemu_ld_a64_i64:
1192
+ case INDEX_op_qemu_ld_i32:
1193
+ case INDEX_op_qemu_ld_i64:
1194
return C_O1_I1(r, r);
1195
- case INDEX_op_qemu_st_a32_i64:
1196
- case INDEX_op_qemu_st_a64_i64:
1197
- case INDEX_op_qemu_st_a32_i32:
1198
- case INDEX_op_qemu_st_a64_i32:
1199
+ case INDEX_op_qemu_st_i64:
1200
+ case INDEX_op_qemu_st_i32:
1201
return C_O0_I2(r, r);
1202
- case INDEX_op_qemu_ld_a32_i128:
1203
- case INDEX_op_qemu_ld_a64_i128:
1204
+ case INDEX_op_qemu_ld_i128:
1205
return C_O2_I1(o, m, r);
1206
- case INDEX_op_qemu_st_a32_i128:
1207
- case INDEX_op_qemu_st_a64_i128:
1208
+ case INDEX_op_qemu_st_i128:
1209
return C_O0_I3(o, m, r);
1210
1211
case INDEX_op_deposit_i32:
1212
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
1213
index XXXXXXX..XXXXXXX 100644
1214
--- a/tcg/sparc64/tcg-target.c.inc
1215
+++ b/tcg/sparc64/tcg-target.c.inc
1216
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
1217
tcg_out_arithi(s, a1, a0, 32, SHIFT_SRLX);
1218
break;
1219
1220
- case INDEX_op_qemu_ld_a32_i32:
1221
- case INDEX_op_qemu_ld_a64_i32:
1222
+ case INDEX_op_qemu_ld_i32:
1223
tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I32);
1224
break;
1225
- case INDEX_op_qemu_ld_a32_i64:
1226
- case INDEX_op_qemu_ld_a64_i64:
1227
+ case INDEX_op_qemu_ld_i64:
1228
tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I64);
1229
break;
1230
- case INDEX_op_qemu_st_a32_i32:
1231
- case INDEX_op_qemu_st_a64_i32:
1232
+ case INDEX_op_qemu_st_i32:
1233
tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I32);
1234
break;
1235
- case INDEX_op_qemu_st_a32_i64:
1236
- case INDEX_op_qemu_st_a64_i64:
1237
+ case INDEX_op_qemu_st_i64:
1238
tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I64);
1239
break;
1240
1241
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
1242
case INDEX_op_extu_i32_i64:
1243
case INDEX_op_extract_i64:
1244
case INDEX_op_sextract_i64:
1245
- case INDEX_op_qemu_ld_a32_i32:
1246
- case INDEX_op_qemu_ld_a64_i32:
1247
- case INDEX_op_qemu_ld_a32_i64:
1248
- case INDEX_op_qemu_ld_a64_i64:
1249
+ case INDEX_op_qemu_ld_i32:
1250
+ case INDEX_op_qemu_ld_i64:
1251
return C_O1_I1(r, r);
1252
1253
case INDEX_op_st8_i32:
1254
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
1255
case INDEX_op_st_i32:
1256
case INDEX_op_st32_i64:
1257
case INDEX_op_st_i64:
1258
- case INDEX_op_qemu_st_a32_i32:
1259
- case INDEX_op_qemu_st_a64_i32:
1260
- case INDEX_op_qemu_st_a32_i64:
1261
- case INDEX_op_qemu_st_a64_i64:
1262
+ case INDEX_op_qemu_st_i32:
1263
+ case INDEX_op_qemu_st_i64:
1264
return C_O0_I2(rZ, r);
1265
1266
case INDEX_op_add_i32:
1267
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
1268
index XXXXXXX..XXXXXXX 100644
1269
--- a/tcg/tci/tcg-target.c.inc
1270
+++ b/tcg/tci/tcg-target.c.inc
1271
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
1272
case INDEX_op_setcond2_i32:
1273
return C_O1_I4(r, r, r, r, r);
1274
1275
- case INDEX_op_qemu_ld_a32_i32:
1276
+ case INDEX_op_qemu_ld_i32:
1277
return C_O1_I1(r, r);
1278
- case INDEX_op_qemu_ld_a64_i32:
1279
- return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O1_I2(r, r, r);
1280
- case INDEX_op_qemu_ld_a32_i64:
1281
+ case INDEX_op_qemu_ld_i64:
1282
return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I1(r, r, r);
1283
- case INDEX_op_qemu_ld_a64_i64:
1284
- return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I2(r, r, r, r);
1285
- case INDEX_op_qemu_st_a32_i32:
1286
+ case INDEX_op_qemu_st_i32:
1287
return C_O0_I2(r, r);
1288
- case INDEX_op_qemu_st_a64_i32:
1289
+ case INDEX_op_qemu_st_i64:
1290
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I3(r, r, r);
1291
- case INDEX_op_qemu_st_a32_i64:
1292
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I3(r, r, r);
1293
- case INDEX_op_qemu_st_a64_i64:
1294
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I4(r, r, r, r);
1295
1296
default:
1297
return C_NotImplemented;
1298
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op_rrrbb(TCGContext *s, TCGOpcode op, TCGReg r0,
1299
tcg_out32(s, insn);
106
}
1300
}
107
1301
108
-static void aarch64_tr_disas_log(const DisasContextBase *dcbase,
1302
-static void tcg_out_op_rrrrr(TCGContext *s, TCGOpcode op, TCGReg r0,
109
- CPUState *cpu, FILE *logfile)
1303
- TCGReg r1, TCGReg r2, TCGReg r3, TCGReg r4)
110
-{
1304
-{
111
- DisasContext *dc = container_of(dcbase, DisasContext, base);
1305
- tcg_insn_unit insn = 0;
112
-
1306
-
113
- fprintf(logfile, "IN: %s\n", lookup_symbol(dc->base.pc_first));
1307
- insn = deposit32(insn, 0, 8, op);
114
- target_disas(logfile, cpu, dc->base.pc_first, dc->base.tb->size);
1308
- insn = deposit32(insn, 8, 4, r0);
1309
- insn = deposit32(insn, 12, 4, r1);
1310
- insn = deposit32(insn, 16, 4, r2);
1311
- insn = deposit32(insn, 20, 4, r3);
1312
- insn = deposit32(insn, 24, 4, r4);
1313
- tcg_out32(s, insn);
115
-}
1314
-}
116
-
1315
-
117
const TranslatorOps aarch64_translator_ops = {
1316
static void tcg_out_op_rrrr(TCGContext *s, TCGOpcode op,
118
.init_disas_context = aarch64_tr_init_disas_context,
1317
TCGReg r0, TCGReg r1, TCGReg r2, TCGReg r3)
119
.tb_start = aarch64_tr_tb_start,
120
.insn_start = aarch64_tr_insn_start,
121
.translate_insn = aarch64_tr_translate_insn,
122
.tb_stop = aarch64_tr_tb_stop,
123
- .disas_log = aarch64_tr_disas_log,
124
};
125
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
126
index XXXXXXX..XXXXXXX 100644
127
--- a/target/arm/tcg/translate.c
128
+++ b/target/arm/tcg/translate.c
129
@@ -XXX,XX +XXX,XX @@
130
#include "translate.h"
131
#include "translate-a32.h"
132
#include "qemu/log.h"
133
-#include "disas/disas.h"
134
#include "arm_ldst.h"
135
#include "semihosting/semihost.h"
136
#include "cpregs.h"
137
@@ -XXX,XX +XXX,XX @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
138
}
139
}
140
141
-static void arm_tr_disas_log(const DisasContextBase *dcbase,
142
- CPUState *cpu, FILE *logfile)
143
-{
144
- DisasContext *dc = container_of(dcbase, DisasContext, base);
145
-
146
- fprintf(logfile, "IN: %s\n", lookup_symbol(dc->base.pc_first));
147
- target_disas(logfile, cpu, dc->base.pc_first, dc->base.tb->size);
148
-}
149
-
150
static const TranslatorOps arm_translator_ops = {
151
.init_disas_context = arm_tr_init_disas_context,
152
.tb_start = arm_tr_tb_start,
153
.insn_start = arm_tr_insn_start,
154
.translate_insn = arm_tr_translate_insn,
155
.tb_stop = arm_tr_tb_stop,
156
- .disas_log = arm_tr_disas_log,
157
};
158
159
static const TranslatorOps thumb_translator_ops = {
160
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps thumb_translator_ops = {
161
.insn_start = arm_tr_insn_start,
162
.translate_insn = thumb_tr_translate_insn,
163
.tb_stop = arm_tr_tb_stop,
164
- .disas_log = arm_tr_disas_log,
165
};
166
167
/* generate intermediate code for basic block 'tb'. */
168
diff --git a/target/avr/translate.c b/target/avr/translate.c
169
index XXXXXXX..XXXXXXX 100644
170
--- a/target/avr/translate.c
171
+++ b/target/avr/translate.c
172
@@ -XXX,XX +XXX,XX @@ static void avr_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
173
}
174
}
175
176
-static void avr_tr_disas_log(const DisasContextBase *dcbase,
177
- CPUState *cs, FILE *logfile)
178
-{
179
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
180
- target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
181
-}
182
-
183
static const TranslatorOps avr_tr_ops = {
184
.init_disas_context = avr_tr_init_disas_context,
185
.tb_start = avr_tr_tb_start,
186
.insn_start = avr_tr_insn_start,
187
.translate_insn = avr_tr_translate_insn,
188
.tb_stop = avr_tr_tb_stop,
189
- .disas_log = avr_tr_disas_log,
190
};
191
192
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
193
diff --git a/target/cris/translate.c b/target/cris/translate.c
194
index XXXXXXX..XXXXXXX 100644
195
--- a/target/cris/translate.c
196
+++ b/target/cris/translate.c
197
@@ -XXX,XX +XXX,XX @@
198
199
#include "qemu/osdep.h"
200
#include "cpu.h"
201
-#include "disas/disas.h"
202
#include "exec/exec-all.h"
203
#include "tcg/tcg-op.h"
204
#include "exec/helper-proto.h"
205
@@ -XXX,XX +XXX,XX @@ static void cris_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
206
}
207
}
208
209
-static void cris_tr_disas_log(const DisasContextBase *dcbase,
210
- CPUState *cpu, FILE *logfile)
211
-{
212
- if (!DISAS_CRIS) {
213
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
214
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
215
- }
216
-}
217
-
218
static const TranslatorOps cris_tr_ops = {
219
.init_disas_context = cris_tr_init_disas_context,
220
.tb_start = cris_tr_tb_start,
221
.insn_start = cris_tr_insn_start,
222
.translate_insn = cris_tr_translate_insn,
223
.tb_stop = cris_tr_tb_stop,
224
- .disas_log = cris_tr_disas_log,
225
};
226
227
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
228
diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
229
index XXXXXXX..XXXXXXX 100644
230
--- a/target/hexagon/translate.c
231
+++ b/target/hexagon/translate.c
232
@@ -XXX,XX +XXX,XX @@ static void hexagon_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
233
}
234
}
235
236
-static void hexagon_tr_disas_log(const DisasContextBase *dcbase,
237
- CPUState *cpu, FILE *logfile)
238
-{
239
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
240
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
241
-}
242
-
243
-
244
static const TranslatorOps hexagon_tr_ops = {
245
.init_disas_context = hexagon_tr_init_disas_context,
246
.tb_start = hexagon_tr_tb_start,
247
.insn_start = hexagon_tr_insn_start,
248
.translate_insn = hexagon_tr_translate_packet,
249
.tb_stop = hexagon_tr_tb_stop,
250
- .disas_log = hexagon_tr_disas_log,
251
};
252
253
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
254
diff --git a/target/hppa/translate.c b/target/hppa/translate.c
255
index XXXXXXX..XXXXXXX 100644
256
--- a/target/hppa/translate.c
257
+++ b/target/hppa/translate.c
258
@@ -XXX,XX +XXX,XX @@ static void hppa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
259
}
260
}
261
262
+#ifdef CONFIG_USER_ONLY
263
static void hppa_tr_disas_log(const DisasContextBase *dcbase,
264
CPUState *cs, FILE *logfile)
265
{
1318
{
266
target_ulong pc = dcbase->pc_first;
1319
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
267
1320
tcg_out_op_rrrr(s, opc, args[0], args[1], args[2], args[3]);
268
-#ifdef CONFIG_USER_ONLY
1321
break;
269
switch (pc) {
1322
270
case 0x00:
1323
- case INDEX_op_qemu_ld_a32_i32:
271
fprintf(logfile, "IN:\n0x00000000: (null)\n");
1324
- case INDEX_op_qemu_st_a32_i32:
272
@@ -XXX,XX +XXX,XX @@ static void hppa_tr_disas_log(const DisasContextBase *dcbase,
1325
- tcg_out_op_rrm(s, opc, args[0], args[1], args[2]);
273
fprintf(logfile, "IN:\n0x00000100: syscall\n");
1326
- break;
274
return;
1327
- case INDEX_op_qemu_ld_a64_i32:
275
}
1328
- case INDEX_op_qemu_st_a64_i32:
276
-#endif
1329
- case INDEX_op_qemu_ld_a32_i64:
277
1330
- case INDEX_op_qemu_st_a32_i64:
278
fprintf(logfile, "IN: %s\n", lookup_symbol(pc));
1331
- if (TCG_TARGET_REG_BITS == 64) {
279
target_disas(logfile, cs, pc, dcbase->tb->size);
1332
- tcg_out_op_rrm(s, opc, args[0], args[1], args[2]);
280
}
1333
- } else {
281
+#endif
1334
+ case INDEX_op_qemu_ld_i64:
282
1335
+ case INDEX_op_qemu_st_i64:
283
static const TranslatorOps hppa_tr_ops = {
1336
+ if (TCG_TARGET_REG_BITS == 32) {
284
.init_disas_context = hppa_tr_init_disas_context,
1337
tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_TMP, args[3]);
285
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps hppa_tr_ops = {
1338
tcg_out_op_rrrr(s, opc, args[0], args[1], args[2], TCG_REG_TMP);
286
.insn_start = hppa_tr_insn_start,
1339
+ break;
287
.translate_insn = hppa_tr_translate_insn,
1340
}
288
.tb_stop = hppa_tr_tb_stop,
1341
- break;
289
+#ifdef CONFIG_USER_ONLY
1342
- case INDEX_op_qemu_ld_a64_i64:
290
.disas_log = hppa_tr_disas_log,
1343
- case INDEX_op_qemu_st_a64_i64:
291
+#endif
1344
- if (TCG_TARGET_REG_BITS == 64) {
292
};
1345
- tcg_out_op_rrm(s, opc, args[0], args[1], args[2]);
293
1346
+ /* fall through */
294
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
1347
+ case INDEX_op_qemu_ld_i32:
295
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
1348
+ case INDEX_op_qemu_st_i32:
296
index XXXXXXX..XXXXXXX 100644
1349
+ if (TCG_TARGET_REG_BITS == 64 && s->addr_type == TCG_TYPE_I32) {
297
--- a/target/i386/tcg/translate.c
1350
+ tcg_out_ext32u(s, TCG_REG_TMP, args[1]);
298
+++ b/target/i386/tcg/translate.c
1351
+ tcg_out_op_rrm(s, opc, args[0], TCG_REG_TMP, args[2]);
299
@@ -XXX,XX +XXX,XX @@
1352
} else {
300
1353
- tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_TMP, args[4]);
301
#include "qemu/host-utils.h"
1354
- tcg_out_op_rrrrr(s, opc, args[0], args[1],
302
#include "cpu.h"
1355
- args[2], args[3], TCG_REG_TMP);
303
-#include "disas/disas.h"
1356
+ tcg_out_op_rrm(s, opc, args[0], args[1], args[2]);
304
#include "exec/exec-all.h"
1357
}
305
#include "tcg/tcg-op.h"
1358
break;
306
#include "tcg/tcg-op-gvec.h"
1359
307
@@ -XXX,XX +XXX,XX @@ static void i386_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
308
}
309
}
310
311
-static void i386_tr_disas_log(const DisasContextBase *dcbase,
312
- CPUState *cpu, FILE *logfile)
313
-{
314
- DisasContext *dc = container_of(dcbase, DisasContext, base);
315
-
316
- fprintf(logfile, "IN: %s\n", lookup_symbol(dc->base.pc_first));
317
- target_disas(logfile, cpu, dc->base.pc_first, dc->base.tb->size);
318
-}
319
-
320
static const TranslatorOps i386_tr_ops = {
321
.init_disas_context = i386_tr_init_disas_context,
322
.tb_start = i386_tr_tb_start,
323
.insn_start = i386_tr_insn_start,
324
.translate_insn = i386_tr_translate_insn,
325
.tb_stop = i386_tr_tb_stop,
326
- .disas_log = i386_tr_disas_log,
327
};
328
329
/* generate intermediate code for basic block 'tb'. */
330
diff --git a/target/loongarch/tcg/translate.c b/target/loongarch/tcg/translate.c
331
index XXXXXXX..XXXXXXX 100644
332
--- a/target/loongarch/tcg/translate.c
333
+++ b/target/loongarch/tcg/translate.c
334
@@ -XXX,XX +XXX,XX @@ static void loongarch_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
335
}
336
}
337
338
-static void loongarch_tr_disas_log(const DisasContextBase *dcbase,
339
- CPUState *cpu, FILE *logfile)
340
-{
341
- qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
342
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
343
-}
344
-
345
static const TranslatorOps loongarch_tr_ops = {
346
.init_disas_context = loongarch_tr_init_disas_context,
347
.tb_start = loongarch_tr_tb_start,
348
.insn_start = loongarch_tr_insn_start,
349
.translate_insn = loongarch_tr_translate_insn,
350
.tb_stop = loongarch_tr_tb_stop,
351
- .disas_log = loongarch_tr_disas_log,
352
};
353
354
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
355
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
356
index XXXXXXX..XXXXXXX 100644
357
--- a/target/m68k/translate.c
358
+++ b/target/m68k/translate.c
359
@@ -XXX,XX +XXX,XX @@
360
361
#include "qemu/osdep.h"
362
#include "cpu.h"
363
-#include "disas/disas.h"
364
#include "exec/exec-all.h"
365
#include "tcg/tcg-op.h"
366
#include "qemu/log.h"
367
@@ -XXX,XX +XXX,XX @@ static void m68k_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
368
}
369
}
370
371
-static void m68k_tr_disas_log(const DisasContextBase *dcbase,
372
- CPUState *cpu, FILE *logfile)
373
-{
374
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
375
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
376
-}
377
-
378
static const TranslatorOps m68k_tr_ops = {
379
.init_disas_context = m68k_tr_init_disas_context,
380
.tb_start = m68k_tr_tb_start,
381
.insn_start = m68k_tr_insn_start,
382
.translate_insn = m68k_tr_translate_insn,
383
.tb_stop = m68k_tr_tb_stop,
384
- .disas_log = m68k_tr_disas_log,
385
};
386
387
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
388
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
389
index XXXXXXX..XXXXXXX 100644
390
--- a/target/microblaze/translate.c
391
+++ b/target/microblaze/translate.c
392
@@ -XXX,XX +XXX,XX @@
393
394
#include "qemu/osdep.h"
395
#include "cpu.h"
396
-#include "disas/disas.h"
397
#include "exec/exec-all.h"
398
#include "exec/cpu_ldst.h"
399
#include "tcg/tcg-op.h"
400
@@ -XXX,XX +XXX,XX @@ static void mb_tr_tb_stop(DisasContextBase *dcb, CPUState *cs)
401
}
402
}
403
404
-static void mb_tr_disas_log(const DisasContextBase *dcb,
405
- CPUState *cs, FILE *logfile)
406
-{
407
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcb->pc_first));
408
- target_disas(logfile, cs, dcb->pc_first, dcb->tb->size);
409
-}
410
-
411
static const TranslatorOps mb_tr_ops = {
412
.init_disas_context = mb_tr_init_disas_context,
413
.tb_start = mb_tr_tb_start,
414
.insn_start = mb_tr_insn_start,
415
.translate_insn = mb_tr_translate_insn,
416
.tb_stop = mb_tr_tb_stop,
417
- .disas_log = mb_tr_disas_log,
418
};
419
420
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
421
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
422
index XXXXXXX..XXXXXXX 100644
423
--- a/target/mips/tcg/translate.c
424
+++ b/target/mips/tcg/translate.c
425
@@ -XXX,XX +XXX,XX @@
426
#include "exec/translation-block.h"
427
#include "semihosting/semihost.h"
428
#include "trace.h"
429
-#include "disas/disas.h"
430
#include "fpu_helper.h"
431
432
#define HELPER_H "helper.h"
433
@@ -XXX,XX +XXX,XX @@ static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
434
}
435
}
436
437
-static void mips_tr_disas_log(const DisasContextBase *dcbase,
438
- CPUState *cs, FILE *logfile)
439
-{
440
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
441
- target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
442
-}
443
-
444
static const TranslatorOps mips_tr_ops = {
445
.init_disas_context = mips_tr_init_disas_context,
446
.tb_start = mips_tr_tb_start,
447
.insn_start = mips_tr_insn_start,
448
.translate_insn = mips_tr_translate_insn,
449
.tb_stop = mips_tr_tb_stop,
450
- .disas_log = mips_tr_disas_log,
451
};
452
453
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
454
diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c
455
index XXXXXXX..XXXXXXX 100644
456
--- a/target/openrisc/translate.c
457
+++ b/target/openrisc/translate.c
458
@@ -XXX,XX +XXX,XX @@
459
#include "qemu/osdep.h"
460
#include "cpu.h"
461
#include "exec/exec-all.h"
462
-#include "disas/disas.h"
463
#include "tcg/tcg-op.h"
464
#include "qemu/log.h"
465
#include "qemu/bitops.h"
466
@@ -XXX,XX +XXX,XX @@ static void openrisc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
467
}
468
}
469
470
-static void openrisc_tr_disas_log(const DisasContextBase *dcbase,
471
- CPUState *cs, FILE *logfile)
472
-{
473
- DisasContext *s = container_of(dcbase, DisasContext, base);
474
-
475
- fprintf(logfile, "IN: %s\n", lookup_symbol(s->base.pc_first));
476
- target_disas(logfile, cs, s->base.pc_first, s->base.tb->size);
477
-}
478
-
479
static const TranslatorOps openrisc_tr_ops = {
480
.init_disas_context = openrisc_tr_init_disas_context,
481
.tb_start = openrisc_tr_tb_start,
482
.insn_start = openrisc_tr_insn_start,
483
.translate_insn = openrisc_tr_translate_insn,
484
.tb_stop = openrisc_tr_tb_stop,
485
- .disas_log = openrisc_tr_disas_log,
486
};
487
488
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
489
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
490
index XXXXXXX..XXXXXXX 100644
491
--- a/target/ppc/translate.c
492
+++ b/target/ppc/translate.c
493
@@ -XXX,XX +XXX,XX @@
494
#include "qemu/osdep.h"
495
#include "cpu.h"
496
#include "internal.h"
497
-#include "disas/disas.h"
498
#include "exec/exec-all.h"
499
#include "tcg/tcg-op.h"
500
#include "tcg/tcg-op-gvec.h"
501
@@ -XXX,XX +XXX,XX @@ static void ppc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
502
}
503
}
504
505
-static void ppc_tr_disas_log(const DisasContextBase *dcbase,
506
- CPUState *cs, FILE *logfile)
507
-{
508
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
509
- target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
510
-}
511
-
512
static const TranslatorOps ppc_tr_ops = {
513
.init_disas_context = ppc_tr_init_disas_context,
514
.tb_start = ppc_tr_tb_start,
515
.insn_start = ppc_tr_insn_start,
516
.translate_insn = ppc_tr_translate_insn,
517
.tb_stop = ppc_tr_tb_stop,
518
- .disas_log = ppc_tr_disas_log,
519
};
520
521
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
522
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
523
index XXXXXXX..XXXXXXX 100644
524
--- a/target/riscv/translate.c
525
+++ b/target/riscv/translate.c
526
@@ -XXX,XX +XXX,XX @@
527
#include "qemu/log.h"
528
#include "cpu.h"
529
#include "tcg/tcg-op.h"
530
-#include "disas/disas.h"
531
#include "exec/cpu_ldst.h"
532
#include "exec/exec-all.h"
533
#include "exec/helper-proto.h"
534
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
535
}
536
}
537
538
-static void riscv_tr_disas_log(const DisasContextBase *dcbase,
539
- CPUState *cpu, FILE *logfile)
540
-{
541
-#ifndef CONFIG_USER_ONLY
542
- RISCVCPU *rvcpu = RISCV_CPU(cpu);
543
- CPURISCVState *env = &rvcpu->env;
544
-#endif
545
-
546
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
547
-#ifndef CONFIG_USER_ONLY
548
- fprintf(logfile, "Priv: "TARGET_FMT_ld"; Virt: %d\n",
549
- env->priv, env->virt_enabled);
550
-#endif
551
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
552
-}
553
-
554
static const TranslatorOps riscv_tr_ops = {
555
.init_disas_context = riscv_tr_init_disas_context,
556
.tb_start = riscv_tr_tb_start,
557
.insn_start = riscv_tr_insn_start,
558
.translate_insn = riscv_tr_translate_insn,
559
.tb_stop = riscv_tr_tb_stop,
560
- .disas_log = riscv_tr_disas_log,
561
};
562
563
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
564
diff --git a/target/rx/translate.c b/target/rx/translate.c
565
index XXXXXXX..XXXXXXX 100644
566
--- a/target/rx/translate.c
567
+++ b/target/rx/translate.c
568
@@ -XXX,XX +XXX,XX @@ static void rx_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
569
}
570
}
571
572
-static void rx_tr_disas_log(const DisasContextBase *dcbase,
573
- CPUState *cs, FILE *logfile)
574
-{
575
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
576
- target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
577
-}
578
-
579
static const TranslatorOps rx_tr_ops = {
580
.init_disas_context = rx_tr_init_disas_context,
581
.tb_start = rx_tr_tb_start,
582
.insn_start = rx_tr_insn_start,
583
.translate_insn = rx_tr_translate_insn,
584
.tb_stop = rx_tr_tb_stop,
585
- .disas_log = rx_tr_disas_log,
586
};
587
588
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
589
diff --git a/target/sh4/translate.c b/target/sh4/translate.c
590
index XXXXXXX..XXXXXXX 100644
591
--- a/target/sh4/translate.c
592
+++ b/target/sh4/translate.c
593
@@ -XXX,XX +XXX,XX @@
594
595
#include "qemu/osdep.h"
596
#include "cpu.h"
597
-#include "disas/disas.h"
598
#include "exec/exec-all.h"
599
#include "tcg/tcg-op.h"
600
#include "exec/helper-proto.h"
601
@@ -XXX,XX +XXX,XX @@ static void sh4_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
602
}
603
}
604
605
-static void sh4_tr_disas_log(const DisasContextBase *dcbase,
606
- CPUState *cs, FILE *logfile)
607
-{
608
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
609
- target_disas(logfile, cs, dcbase->pc_first, dcbase->tb->size);
610
-}
611
-
612
static const TranslatorOps sh4_tr_ops = {
613
.init_disas_context = sh4_tr_init_disas_context,
614
.tb_start = sh4_tr_tb_start,
615
.insn_start = sh4_tr_insn_start,
616
.translate_insn = sh4_tr_translate_insn,
617
.tb_stop = sh4_tr_tb_stop,
618
- .disas_log = sh4_tr_disas_log,
619
};
620
621
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
622
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
623
index XXXXXXX..XXXXXXX 100644
624
--- a/target/sparc/translate.c
625
+++ b/target/sparc/translate.c
626
@@ -XXX,XX +XXX,XX @@
627
#include "qemu/osdep.h"
628
629
#include "cpu.h"
630
-#include "disas/disas.h"
631
#include "exec/helper-proto.h"
632
#include "exec/exec-all.h"
633
#include "tcg/tcg-op.h"
634
@@ -XXX,XX +XXX,XX @@ static void sparc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
635
}
636
}
637
638
-static void sparc_tr_disas_log(const DisasContextBase *dcbase,
639
- CPUState *cpu, FILE *logfile)
640
-{
641
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
642
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
643
-}
644
-
645
static const TranslatorOps sparc_tr_ops = {
646
.init_disas_context = sparc_tr_init_disas_context,
647
.tb_start = sparc_tr_tb_start,
648
.insn_start = sparc_tr_insn_start,
649
.translate_insn = sparc_tr_translate_insn,
650
.tb_stop = sparc_tr_tb_stop,
651
- .disas_log = sparc_tr_disas_log,
652
};
653
654
void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
655
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
656
index XXXXXXX..XXXXXXX 100644
657
--- a/target/tricore/translate.c
658
+++ b/target/tricore/translate.c
659
@@ -XXX,XX +XXX,XX @@
660
661
#include "qemu/osdep.h"
662
#include "cpu.h"
663
-#include "disas/disas.h"
664
#include "exec/exec-all.h"
665
#include "tcg/tcg-op.h"
666
#include "exec/cpu_ldst.h"
667
@@ -XXX,XX +XXX,XX @@ static void tricore_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
668
}
669
}
670
671
-static void tricore_tr_disas_log(const DisasContextBase *dcbase,
672
- CPUState *cpu, FILE *logfile)
673
-{
674
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
675
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
676
-}
677
-
678
static const TranslatorOps tricore_tr_ops = {
679
.init_disas_context = tricore_tr_init_disas_context,
680
.tb_start = tricore_tr_tb_start,
681
.insn_start = tricore_tr_insn_start,
682
.translate_insn = tricore_tr_translate_insn,
683
.tb_stop = tricore_tr_tb_stop,
684
- .disas_log = tricore_tr_disas_log,
685
};
686
687
688
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
689
index XXXXXXX..XXXXXXX 100644
690
--- a/target/xtensa/translate.c
691
+++ b/target/xtensa/translate.c
692
@@ -XXX,XX +XXX,XX @@
693
694
#include "cpu.h"
695
#include "exec/exec-all.h"
696
-#include "disas/disas.h"
697
#include "tcg/tcg-op.h"
698
#include "qemu/log.h"
699
#include "qemu/qemu-print.h"
700
@@ -XXX,XX +XXX,XX @@ static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
701
}
702
}
703
704
-static void xtensa_tr_disas_log(const DisasContextBase *dcbase,
705
- CPUState *cpu, FILE *logfile)
706
-{
707
- fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
708
- target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
709
-}
710
-
711
static const TranslatorOps xtensa_translator_ops = {
712
.init_disas_context = xtensa_tr_init_disas_context,
713
.tb_start = xtensa_tr_tb_start,
714
.insn_start = xtensa_tr_insn_start,
715
.translate_insn = xtensa_tr_translate_insn,
716
.tb_stop = xtensa_tr_tb_stop,
717
- .disas_log = xtensa_tr_disas_log,
718
};
719
720
void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
721
--
1360
--
722
2.34.1
1361
2.43.0
723
1362
724
1363
diff view generated by jsdifflib
1
Read from already translated pages, or saved mmio data.
1
The guest address will now always be TCG_TYPE_I32.
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
5
---
6
include/disas/disas.h | 5 +++--
6
tcg/arm/tcg-target.c.inc | 73 +++++++++++++---------------------------
7
include/exec/translator.h | 4 ++--
7
1 file changed, 23 insertions(+), 50 deletions(-)
8
include/qemu/typedefs.h | 1 +
8
9
accel/tcg/translator.c | 2 +-
9
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
10
disas/disas-common.c | 14 --------------
11
disas/disas-mon.c | 15 +++++++++++++++
12
disas/disas-target.c | 19 +++++++++++++++++--
13
plugins/api.c | 4 ++--
14
8 files changed, 41 insertions(+), 23 deletions(-)
15
16
diff --git a/include/disas/disas.h b/include/disas/disas.h
17
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
18
--- a/include/disas/disas.h
11
--- a/tcg/arm/tcg-target.c.inc
19
+++ b/include/disas/disas.h
12
+++ b/tcg/arm/tcg-target.c.inc
20
@@ -XXX,XX +XXX,XX @@
13
@@ -XXX,XX +XXX,XX @@ static void tcg_out_ldrd_r(TCGContext *s, ARMCond cond, TCGReg rt,
21
/* Disassemble this for me please... (debugging). */
14
tcg_out_memop_r(s, cond, INSN_LDRD_REG, rt, rn, rm, 1, 1, 0);
22
#ifdef CONFIG_TCG
15
}
23
void disas(FILE *out, const void *code, size_t size);
16
24
-void target_disas(FILE *out, CPUState *cpu, uint64_t code, size_t size);
17
-static void __attribute__((unused))
25
+void target_disas(FILE *out, CPUState *cpu, const DisasContextBase *db);
18
-tcg_out_ldrd_rwb(TCGContext *s, ARMCond cond, TCGReg rt, TCGReg rn, TCGReg rm)
26
#endif
27
28
void monitor_disas(Monitor *mon, CPUState *cpu, uint64_t pc,
29
int nb_insn, bool is_physical);
30
31
#ifdef CONFIG_PLUGIN
32
-char *plugin_disas(CPUState *cpu, uint64_t addr, size_t size);
33
+char *plugin_disas(CPUState *cpu, const DisasContextBase *db,
34
+ uint64_t addr, size_t size);
35
#endif
36
37
/* Look up symbol for debugging purpose. Returns "" if unknown. */
38
diff --git a/include/exec/translator.h b/include/exec/translator.h
39
index XXXXXXX..XXXXXXX 100644
40
--- a/include/exec/translator.h
41
+++ b/include/exec/translator.h
42
@@ -XXX,XX +XXX,XX @@ typedef enum DisasJumpType {
43
*
44
* Architecture-agnostic disassembly context.
45
*/
46
-typedef struct DisasContextBase {
47
+struct DisasContextBase {
48
TranslationBlock *tb;
49
vaddr pc_first;
50
vaddr pc_next;
51
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContextBase {
52
int record_start;
53
int record_len;
54
uint8_t record[32];
55
-} DisasContextBase;
56
+};
57
58
/**
59
* TranslatorOps:
60
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
61
index XXXXXXX..XXXXXXX 100644
62
--- a/include/qemu/typedefs.h
63
+++ b/include/qemu/typedefs.h
64
@@ -XXX,XX +XXX,XX @@ typedef struct CPUPluginState CPUPluginState;
65
typedef struct CPUState CPUState;
66
typedef struct DeviceState DeviceState;
67
typedef struct DirtyBitmapSnapshot DirtyBitmapSnapshot;
68
+typedef struct DisasContextBase DisasContextBase;
69
typedef struct DisplayChangeListener DisplayChangeListener;
70
typedef struct DriveInfo DriveInfo;
71
typedef struct DumpState DumpState;
72
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/accel/tcg/translator.c
75
+++ b/accel/tcg/translator.c
76
@@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
77
if (!ops->disas_log ||
78
!ops->disas_log(db, cpu, logfile)) {
79
fprintf(logfile, "IN: %s\n", lookup_symbol(db->pc_first));
80
- target_disas(logfile, cpu, db->pc_first, db->tb->size);
81
+ target_disas(logfile, cpu, db);
82
}
83
fprintf(logfile, "\n");
84
qemu_log_unlock(logfile);
85
diff --git a/disas/disas-common.c b/disas/disas-common.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/disas/disas-common.c
88
+++ b/disas/disas-common.c
89
@@ -XXX,XX +XXX,XX @@
90
#include "disas/capstone.h"
91
#include "hw/core/cpu.h"
92
#include "exec/tswap.h"
93
-#include "exec/memory.h"
94
#include "disas-internal.h"
95
96
97
/* Filled in by elfload.c. Simplistic, but will do for now. */
98
struct syminfo *syminfos = NULL;
99
100
-/*
101
- * Get LENGTH bytes from info's buffer, at target address memaddr.
102
- * Transfer them to myaddr.
103
- */
104
-static int target_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
105
- struct disassemble_info *info)
106
-{
19
-{
107
- CPUDebug *s = container_of(info, CPUDebug, info);
20
- tcg_out_memop_r(s, cond, INSN_LDRD_REG, rt, rn, rm, 1, 1, 1);
108
- int r = cpu_memory_rw_debug(s->cpu, memaddr, myaddr, length, 0);
109
- return r ? EIO : 0;
110
-}
21
-}
111
-
22
-
112
/*
23
-static void __attribute__((unused))
113
* Print an error message. We can assume that this is in response to
24
-tcg_out_strd_8(TCGContext *s, ARMCond cond, TCGReg rt, TCGReg rn, int imm8)
114
* an error return from {host,target}_read_memory.
25
+static void tcg_out_strd_8(TCGContext *s, ARMCond cond, TCGReg rt,
115
@@ -XXX,XX +XXX,XX @@ void disas_initialize_debug_target(CPUDebug *s, CPUState *cpu)
26
+ TCGReg rn, int imm8)
116
disas_initialize_debug(s);
27
{
117
28
tcg_out_memop_8(s, cond, INSN_STRD_IMM, rt, rn, imm8, 1, 0);
118
s->cpu = cpu;
29
}
119
- s->info.read_memory_func = target_read_memory;
30
@@ -XXX,XX +XXX,XX @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
120
s->info.print_address_func = print_address;
31
#define MIN_TLB_MASK_TABLE_OFS -256
121
if (target_words_bigendian()) {
32
122
s->info.endian = BFD_ENDIAN_BIG;
33
static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
123
diff --git a/disas/disas-mon.c b/disas/disas-mon.c
34
- TCGReg addrlo, TCGReg addrhi,
124
index XXXXXXX..XXXXXXX 100644
35
- MemOpIdx oi, bool is_ld)
125
--- a/disas/disas-mon.c
36
+ TCGReg addr, MemOpIdx oi, bool is_ld)
126
+++ b/disas/disas-mon.c
37
{
127
@@ -XXX,XX +XXX,XX @@
38
TCGLabelQemuLdst *ldst = NULL;
128
#include "hw/core/cpu.h"
39
MemOp opc = get_memop(oi);
129
#include "monitor/monitor.h"
40
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
130
41
if (tcg_use_softmmu) {
131
+/*
42
*h = (HostAddress){
132
+ * Get LENGTH bytes from info's buffer, at target address memaddr.
43
.cond = COND_AL,
133
+ * Transfer them to myaddr.
44
- .base = addrlo,
134
+ */
45
+ .base = addr,
135
+static int
46
.index = TCG_REG_R1,
136
+virtual_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
47
.index_scratch = true,
137
+ struct disassemble_info *info)
48
};
138
+{
49
} else {
139
+ CPUDebug *s = container_of(info, CPUDebug, info);
50
*h = (HostAddress){
140
+ int r = cpu_memory_rw_debug(s->cpu, memaddr, myaddr, length, 0);
51
.cond = COND_AL,
141
+ return r ? EIO : 0;
52
- .base = addrlo,
142
+}
53
+ .base = addr,
143
+
54
.index = guest_base ? TCG_REG_GUEST_BASE : -1,
144
static int
55
.index_scratch = false,
145
physical_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
56
};
146
struct disassemble_info *info)
57
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
147
@@ -XXX,XX +XXX,XX @@ void monitor_disas(Monitor *mon, CPUState *cpu, uint64_t pc,
58
ldst = new_ldst_label(s);
148
59
ldst->is_ld = is_ld;
149
if (is_physical) {
60
ldst->oi = oi;
150
s.info.read_memory_func = physical_read_memory;
61
- ldst->addrlo_reg = addrlo;
151
+ } else {
62
- ldst->addrhi_reg = addrhi;
152
+ s.info.read_memory_func = virtual_read_memory;
63
+ ldst->addrlo_reg = addr;
64
65
/* Load cpu->neg.tlb.f[mmu_idx].{mask,table} into {r0,r1}. */
66
QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, mask) != 0);
67
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
68
tcg_out_ldrd_8(s, COND_AL, TCG_REG_R0, TCG_AREG0, fast_off);
69
70
/* Extract the tlb index from the address into R0. */
71
- tcg_out_dat_reg(s, COND_AL, ARITH_AND, TCG_REG_R0, TCG_REG_R0, addrlo,
72
+ tcg_out_dat_reg(s, COND_AL, ARITH_AND, TCG_REG_R0, TCG_REG_R0, addr,
73
SHIFT_IMM_LSR(s->page_bits - CPU_TLB_ENTRY_BITS));
74
75
/*
76
* Add the tlb_table pointer, creating the CPUTLBEntry address in R1.
77
- * Load the tlb comparator into R2/R3 and the fast path addend into R1.
78
+ * Load the tlb comparator into R2 and the fast path addend into R1.
79
*/
80
QEMU_BUILD_BUG_ON(HOST_BIG_ENDIAN);
81
if (cmp_off == 0) {
82
- if (s->addr_type == TCG_TYPE_I32) {
83
- tcg_out_ld32_rwb(s, COND_AL, TCG_REG_R2,
84
- TCG_REG_R1, TCG_REG_R0);
85
- } else {
86
- tcg_out_ldrd_rwb(s, COND_AL, TCG_REG_R2,
87
- TCG_REG_R1, TCG_REG_R0);
88
- }
89
+ tcg_out_ld32_rwb(s, COND_AL, TCG_REG_R2, TCG_REG_R1, TCG_REG_R0);
90
} else {
91
tcg_out_dat_reg(s, COND_AL, ARITH_ADD,
92
TCG_REG_R1, TCG_REG_R1, TCG_REG_R0, 0);
93
- if (s->addr_type == TCG_TYPE_I32) {
94
- tcg_out_ld32_12(s, COND_AL, TCG_REG_R2, TCG_REG_R1, cmp_off);
95
- } else {
96
- tcg_out_ldrd_8(s, COND_AL, TCG_REG_R2, TCG_REG_R1, cmp_off);
97
- }
98
+ tcg_out_ld32_12(s, COND_AL, TCG_REG_R2, TCG_REG_R1, cmp_off);
99
}
100
101
/* Load the tlb addend. */
102
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
103
* This leaves the least significant alignment bits unchanged, and of
104
* course must be zero.
105
*/
106
- t_addr = addrlo;
107
+ t_addr = addr;
108
if (a_mask < s_mask) {
109
t_addr = TCG_REG_R0;
110
tcg_out_dat_imm(s, COND_AL, ARITH_ADD, t_addr,
111
- addrlo, s_mask - a_mask);
112
+ addr, s_mask - a_mask);
113
}
114
if (use_armv7_instructions && s->page_bits <= 16) {
115
tcg_out_movi32(s, COND_AL, TCG_REG_TMP, ~(s->page_mask | a_mask));
116
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
117
} else {
118
if (a_mask) {
119
tcg_debug_assert(a_mask <= 0xff);
120
- tcg_out_dat_imm(s, COND_AL, ARITH_TST, 0, addrlo, a_mask);
121
+ tcg_out_dat_imm(s, COND_AL, ARITH_TST, 0, addr, a_mask);
122
}
123
tcg_out_dat_reg(s, COND_AL, ARITH_MOV, TCG_REG_TMP, 0, t_addr,
124
SHIFT_IMM_LSR(s->page_bits));
125
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
126
0, TCG_REG_R2, TCG_REG_TMP,
127
SHIFT_IMM_LSL(s->page_bits));
128
}
129
-
130
- if (s->addr_type != TCG_TYPE_I32) {
131
- tcg_out_dat_reg(s, COND_EQ, ARITH_CMP, 0, TCG_REG_R3, addrhi, 0);
132
- }
133
} else if (a_mask) {
134
ldst = new_ldst_label(s);
135
ldst->is_ld = is_ld;
136
ldst->oi = oi;
137
- ldst->addrlo_reg = addrlo;
138
- ldst->addrhi_reg = addrhi;
139
+ ldst->addrlo_reg = addr;
140
141
/* We are expecting alignment to max out at 7 */
142
tcg_debug_assert(a_mask <= 0xff);
143
/* tst addr, #mask */
144
- tcg_out_dat_imm(s, COND_AL, ARITH_TST, 0, addrlo, a_mask);
145
+ tcg_out_dat_imm(s, COND_AL, ARITH_TST, 0, addr, a_mask);
153
}
146
}
154
s.info.buffer_vma = pc;
147
155
148
return ldst;
156
diff --git a/disas/disas-target.c b/disas/disas-target.c
149
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld_direct(TCGContext *s, MemOp opc, TCGReg datalo,
157
index XXXXXXX..XXXXXXX 100644
150
}
158
--- a/disas/disas-target.c
151
159
+++ b/disas/disas-target.c
152
static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi,
160
@@ -XXX,XX +XXX,XX @@
153
- TCGReg addrlo, TCGReg addrhi,
161
#include "qemu/osdep.h"
154
- MemOpIdx oi, TCGType data_type)
162
#include "disas/disas.h"
155
+ TCGReg addr, MemOpIdx oi, TCGType data_type)
163
#include "disas/capstone.h"
156
{
164
+#include "exec/translator.h"
157
MemOp opc = get_memop(oi);
165
#include "disas-internal.h"
158
TCGLabelQemuLdst *ldst;
166
159
HostAddress h;
167
160
168
-void target_disas(FILE *out, CPUState *cpu, uint64_t code, size_t size)
161
- ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, true);
169
+static int translator_read_memory(bfd_vma memaddr, bfd_byte *myaddr,
162
+ ldst = prepare_host_addr(s, &h, addr, oi, true);
170
+ int length, struct disassemble_info *info)
163
if (ldst) {
171
{
164
ldst->type = data_type;
172
+ const DisasContextBase *db = info->application_data;
165
ldst->datalo_reg = datalo;
173
+ return translator_st(db, myaddr, memaddr, length) ? 0 : EIO;
166
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st_direct(TCGContext *s, MemOp opc, TCGReg datalo,
174
+}
167
}
175
+
168
176
+void target_disas(FILE *out, CPUState *cpu, const struct DisasContextBase *db)
169
static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi,
177
+{
170
- TCGReg addrlo, TCGReg addrhi,
178
+ uint64_t code = db->pc_first;
171
- MemOpIdx oi, TCGType data_type)
179
+ size_t size = translator_st_len(db);
172
+ TCGReg addr, MemOpIdx oi, TCGType data_type)
180
uint64_t pc;
173
{
181
int count;
174
MemOp opc = get_memop(oi);
182
CPUDebug s;
175
TCGLabelQemuLdst *ldst;
183
176
HostAddress h;
184
disas_initialize_debug_target(&s, cpu);
177
185
+ s.info.read_memory_func = translator_read_memory;
178
- ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, false);
186
+ s.info.application_data = (void *)db;
179
+ ldst = prepare_host_addr(s, &h, addr, oi, false);
187
s.info.fprintf_func = fprintf;
180
if (ldst) {
188
s.info.stream = out;
181
ldst->type = data_type;
189
s.info.buffer_vma = code;
182
ldst->datalo_reg = datalo;
190
@@ -XXX,XX +XXX,XX @@ static void plugin_print_address(bfd_vma addr, struct disassemble_info *info)
183
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
191
* there is left over it usually indicates the front end has read more
184
break;
192
* bytes than it needed.
185
193
*/
186
case INDEX_op_qemu_ld_i32:
194
-char *plugin_disas(CPUState *cpu, uint64_t addr, size_t size)
187
- tcg_out_qemu_ld(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32);
195
+char *plugin_disas(CPUState *cpu, const DisasContextBase *db,
188
+ tcg_out_qemu_ld(s, args[0], -1, args[1], args[2], TCG_TYPE_I32);
196
+ uint64_t addr, size_t size)
189
break;
197
{
190
case INDEX_op_qemu_ld_i64:
198
CPUDebug s;
191
- tcg_out_qemu_ld(s, args[0], args[1], args[2], -1,
199
GString *ds = g_string_new(NULL);
192
- args[3], TCG_TYPE_I64);
200
193
+ tcg_out_qemu_ld(s, args[0], args[1], args[2], args[3], TCG_TYPE_I64);
201
disas_initialize_debug_target(&s, cpu);
194
break;
202
+ s.info.read_memory_func = translator_read_memory;
195
203
+ s.info.application_data = (void *)db;
196
case INDEX_op_qemu_st_i32:
204
s.info.fprintf_func = disas_gstring_printf;
197
- tcg_out_qemu_st(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32);
205
s.info.stream = (FILE *)ds; /* abuse this slot */
198
+ tcg_out_qemu_st(s, args[0], -1, args[1], args[2], TCG_TYPE_I32);
206
s.info.buffer_vma = addr;
199
break;
207
diff --git a/plugins/api.c b/plugins/api.c
200
case INDEX_op_qemu_st_i64:
208
index XXXXXXX..XXXXXXX 100644
201
- tcg_out_qemu_st(s, args[0], args[1], args[2], -1,
209
--- a/plugins/api.c
202
- args[3], TCG_TYPE_I64);
210
+++ b/plugins/api.c
203
+ tcg_out_qemu_st(s, args[0], args[1], args[2], args[3], TCG_TYPE_I64);
211
@@ -XXX,XX +XXX,XX @@ void *qemu_plugin_insn_haddr(const struct qemu_plugin_insn *insn)
204
break;
212
205
213
char *qemu_plugin_insn_disas(const struct qemu_plugin_insn *insn)
206
case INDEX_op_bswap16_i32:
214
{
215
- CPUState *cpu = current_cpu;
216
- return plugin_disas(cpu, insn->vaddr, insn->len);
217
+ return plugin_disas(tcg_ctx->cpu, tcg_ctx->plugin_db,
218
+ insn->vaddr, insn->len);
219
}
220
221
const char *qemu_plugin_insn_symbol(const struct qemu_plugin_insn *insn)
222
--
207
--
223
2.34.1
208
2.43.0
224
209
225
210
diff view generated by jsdifflib
1
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
1
The guest address will now always fit in one register.
2
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
---
5
target/cris/translate.c | 25 ++++++++-----------------
6
tcg/i386/tcg-target.c.inc | 56 ++++++++++++++-------------------------
6
1 file changed, 8 insertions(+), 17 deletions(-)
7
1 file changed, 20 insertions(+), 36 deletions(-)
7
8
8
diff --git a/target/cris/translate.c b/target/cris/translate.c
9
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
9
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
10
--- a/target/cris/translate.c
11
--- a/tcg/i386/tcg-target.c.inc
11
+++ b/target/cris/translate.c
12
+++ b/tcg/i386/tcg-target.c.inc
12
@@ -XXX,XX +XXX,XX @@ static int sign_extend(unsigned int val, unsigned int width)
13
@@ -XXX,XX +XXX,XX @@ static inline int setup_guest_base_seg(void)
14
* is required and fill in @h with the host address for the fast path.
15
*/
16
static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
17
- TCGReg addrlo, TCGReg addrhi,
18
- MemOpIdx oi, bool is_ld)
19
+ TCGReg addr, MemOpIdx oi, bool is_ld)
20
{
21
TCGLabelQemuLdst *ldst = NULL;
22
MemOp opc = get_memop(oi);
23
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
24
} else {
25
*h = x86_guest_base;
26
}
27
- h->base = addrlo;
28
+ h->base = addr;
29
h->aa = atom_and_align_for_opc(s, opc, MO_ATOM_IFALIGN, s_bits == MO_128);
30
a_mask = (1 << h->aa.align) - 1;
31
32
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
33
ldst = new_ldst_label(s);
34
ldst->is_ld = is_ld;
35
ldst->oi = oi;
36
- ldst->addrlo_reg = addrlo;
37
- ldst->addrhi_reg = addrhi;
38
+ ldst->addrlo_reg = addr;
39
40
if (TCG_TARGET_REG_BITS == 64) {
41
ttype = s->addr_type;
42
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
43
}
44
}
45
46
- tcg_out_mov(s, tlbtype, TCG_REG_L0, addrlo);
47
+ tcg_out_mov(s, tlbtype, TCG_REG_L0, addr);
48
tcg_out_shifti(s, SHIFT_SHR + tlbrexw, TCG_REG_L0,
49
s->page_bits - CPU_TLB_ENTRY_BITS);
50
51
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
52
* check that we don't cross pages for the complete access.
53
*/
54
if (a_mask >= s_mask) {
55
- tcg_out_mov(s, ttype, TCG_REG_L1, addrlo);
56
+ tcg_out_mov(s, ttype, TCG_REG_L1, addr);
57
} else {
58
tcg_out_modrm_offset(s, OPC_LEA + trexw, TCG_REG_L1,
59
- addrlo, s_mask - a_mask);
60
+ addr, s_mask - a_mask);
61
}
62
tlb_mask = s->page_mask | a_mask;
63
tgen_arithi(s, ARITH_AND + trexw, TCG_REG_L1, tlb_mask, 0);
64
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
65
ldst->label_ptr[0] = s->code_ptr;
66
s->code_ptr += 4;
67
68
- if (TCG_TARGET_REG_BITS == 32 && s->addr_type == TCG_TYPE_I64) {
69
- /* cmp 4(TCG_REG_L0), addrhi */
70
- tcg_out_modrm_offset(s, OPC_CMP_GvEv, addrhi,
71
- TCG_REG_L0, cmp_ofs + 4);
72
-
73
- /* jne slow_path */
74
- tcg_out_opc(s, OPC_JCC_long + JCC_JNE, 0, 0, 0);
75
- ldst->label_ptr[1] = s->code_ptr;
76
- s->code_ptr += 4;
77
- }
78
-
79
/* TLB Hit. */
80
tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_L0, TCG_REG_L0,
81
offsetof(CPUTLBEntry, addend));
82
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
83
ldst = new_ldst_label(s);
84
ldst->is_ld = is_ld;
85
ldst->oi = oi;
86
- ldst->addrlo_reg = addrlo;
87
- ldst->addrhi_reg = addrhi;
88
+ ldst->addrlo_reg = addr;
89
90
/* jne slow_path */
91
- jcc = tcg_out_cmp(s, TCG_COND_TSTNE, addrlo, a_mask, true, false);
92
+ jcc = tcg_out_cmp(s, TCG_COND_TSTNE, addr, a_mask, true, false);
93
tcg_out_opc(s, OPC_JCC_long + jcc, 0, 0, 0);
94
ldst->label_ptr[0] = s->code_ptr;
95
s->code_ptr += 4;
96
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
13
}
97
}
14
98
15
static int cris_fetch(CPUCRISState *env, DisasContext *dc, uint32_t addr,
99
static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi,
16
- unsigned int size, unsigned int sign)
100
- TCGReg addrlo, TCGReg addrhi,
17
+ unsigned int size, bool sign)
101
- MemOpIdx oi, TCGType data_type)
102
+ TCGReg addr, MemOpIdx oi, TCGType data_type)
18
{
103
{
19
int r;
104
TCGLabelQemuLdst *ldst;
20
105
HostAddress h;
21
switch (size) {
106
22
case 4:
107
- ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, true);
23
- {
108
+ ldst = prepare_host_addr(s, &h, addr, oi, true);
24
- r = cpu_ldl_code(env, addr);
109
tcg_out_qemu_ld_direct(s, datalo, datahi, h, data_type, get_memop(oi));
25
+ r = translator_ldl(env, &dc->base, addr);
110
111
if (ldst) {
112
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
113
}
114
115
static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi,
116
- TCGReg addrlo, TCGReg addrhi,
117
- MemOpIdx oi, TCGType data_type)
118
+ TCGReg addr, MemOpIdx oi, TCGType data_type)
119
{
120
TCGLabelQemuLdst *ldst;
121
HostAddress h;
122
123
- ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, false);
124
+ ldst = prepare_host_addr(s, &h, addr, oi, false);
125
tcg_out_qemu_st_direct(s, datalo, datahi, h, get_memop(oi));
126
127
if (ldst) {
128
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
26
break;
129
break;
27
- }
130
28
case 2:
131
case INDEX_op_qemu_ld_i32:
29
- {
132
- tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I32);
30
+ r = translator_lduw(env, &dc->base, addr);
133
+ tcg_out_qemu_ld(s, a0, -1, a1, a2, TCG_TYPE_I32);
31
if (sign) {
134
break;
32
- r = cpu_ldsw_code(env, addr);
135
case INDEX_op_qemu_ld_i64:
33
- } else {
136
if (TCG_TARGET_REG_BITS == 64) {
34
- r = cpu_lduw_code(env, addr);
137
- tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I64);
35
+ r = (int16_t)r;
138
+ tcg_out_qemu_ld(s, a0, -1, a1, a2, TCG_TYPE_I64);
139
} else {
140
- tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I64);
141
+ tcg_out_qemu_ld(s, a0, a1, a2, args[3], TCG_TYPE_I64);
36
}
142
}
37
break;
143
break;
38
- }
144
case INDEX_op_qemu_ld_i128:
39
case 1:
145
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
40
- {
146
- tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128);
41
+ r = translator_ldub(env, &dc->base, addr);
147
+ tcg_out_qemu_ld(s, a0, a1, a2, args[3], TCG_TYPE_I128);
42
if (sign) {
148
break;
43
- r = cpu_ldsb_code(env, addr);
149
44
- } else {
150
case INDEX_op_qemu_st_i32:
45
- r = cpu_ldub_code(env, addr);
151
case INDEX_op_qemu_st8_i32:
46
+ r = (int8_t)r;
152
- tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I32);
153
+ tcg_out_qemu_st(s, a0, -1, a1, a2, TCG_TYPE_I32);
154
break;
155
case INDEX_op_qemu_st_i64:
156
if (TCG_TARGET_REG_BITS == 64) {
157
- tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I64);
158
+ tcg_out_qemu_st(s, a0, -1, a1, a2, TCG_TYPE_I64);
159
} else {
160
- tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I64);
161
+ tcg_out_qemu_st(s, a0, a1, a2, args[3], TCG_TYPE_I64);
47
}
162
}
48
break;
163
break;
49
- }
164
case INDEX_op_qemu_st_i128:
50
default:
165
tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
51
- cpu_abort(CPU(dc->cpu), "Invalid fetch size %d\n", size);
166
- tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128);
52
- break;
167
+ tcg_out_qemu_st(s, a0, a1, a2, args[3], TCG_TYPE_I128);
53
+ g_assert_not_reached();
168
break;
54
}
169
55
return r;
170
OP_32_64(mulu2):
56
}
57
@@ -XXX,XX +XXX,XX @@ static unsigned int crisv32_decoder(CPUCRISState *env, DisasContext *dc)
58
int i;
59
60
/* Load a halfword onto the instruction register. */
61
- dc->ir = cris_fetch(env, dc, dc->pc, 2, 0);
62
+ dc->ir = cris_fetch(env, dc, dc->pc, 2, 0);
63
64
/* Now decode it. */
65
dc->opcode = EXTRACT_FIELD(dc->ir, 4, 11);
66
--
171
--
67
2.34.1
172
2.43.0
68
173
69
174
diff view generated by jsdifflib
1
Reorg translator_access into translator_ld, with a more
1
The guest address will now always fit in one register.
2
memcpy-ish interface. If both pages are in ram, do not
3
go through the caller's slow path.
4
5
Assert that the access is within the two pages that we are
6
prepared to protect, per TranslationBlock. Allow access
7
prior to pc_first, so long as it is within the first page.
8
2
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
---
5
---
12
accel/tcg/translator.c | 189 ++++++++++++++++++++++-------------------
6
tcg/mips/tcg-target.c.inc | 62 ++++++++++++++-------------------------
13
1 file changed, 101 insertions(+), 88 deletions(-)
7
1 file changed, 22 insertions(+), 40 deletions(-)
14
8
15
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
9
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
16
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
17
--- a/accel/tcg/translator.c
11
--- a/tcg/mips/tcg-target.c.inc
18
+++ b/accel/tcg/translator.c
12
+++ b/tcg/mips/tcg-target.c.inc
19
@@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
13
@@ -XXX,XX +XXX,XX @@ bool tcg_target_has_memory_bswap(MemOp memop)
20
}
14
* is required and fill in @h with the host address for the fast path.
21
}
15
*/
22
16
static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
23
-static void *translator_access(CPUArchState *env, DisasContextBase *db,
17
- TCGReg addrlo, TCGReg addrhi,
24
- vaddr pc, size_t len)
18
- MemOpIdx oi, bool is_ld)
25
+static bool translator_ld(CPUArchState *env, DisasContextBase *db,
19
+ TCGReg addr, MemOpIdx oi, bool is_ld)
26
+ void *dest, vaddr pc, size_t len)
27
{
20
{
28
+ TranslationBlock *tb = db->tb;
21
TCGType addr_type = s->addr_type;
29
+ vaddr last = pc + len - 1;
22
TCGLabelQemuLdst *ldst = NULL;
30
void *host;
23
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
31
- vaddr base, end;
24
ldst = new_ldst_label(s);
32
- TranslationBlock *tb;
25
ldst->is_ld = is_ld;
26
ldst->oi = oi;
27
- ldst->addrlo_reg = addrlo;
28
- ldst->addrhi_reg = addrhi;
29
+ ldst->addrlo_reg = addr;
30
31
/* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx]. */
32
tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP0, TCG_AREG0, mask_off);
33
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
34
35
/* Extract the TLB index from the address into TMP3. */
36
if (TCG_TARGET_REG_BITS == 32 || addr_type == TCG_TYPE_I32) {
37
- tcg_out_opc_sa(s, OPC_SRL, TCG_TMP3, addrlo,
38
+ tcg_out_opc_sa(s, OPC_SRL, TCG_TMP3, addr,
39
s->page_bits - CPU_TLB_ENTRY_BITS);
40
} else {
41
- tcg_out_dsrl(s, TCG_TMP3, addrlo,
42
- s->page_bits - CPU_TLB_ENTRY_BITS);
43
+ tcg_out_dsrl(s, TCG_TMP3, addr, s->page_bits - CPU_TLB_ENTRY_BITS);
44
}
45
tcg_out_opc_reg(s, OPC_AND, TCG_TMP3, TCG_TMP3, TCG_TMP0);
46
47
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
48
tcg_out_opc_imm(s, (TCG_TARGET_REG_BITS == 32
49
|| addr_type == TCG_TYPE_I32
50
? OPC_ADDIU : OPC_DADDIU),
51
- TCG_TMP2, addrlo, s_mask - a_mask);
52
+ TCG_TMP2, addr, s_mask - a_mask);
53
tcg_out_opc_reg(s, OPC_AND, TCG_TMP1, TCG_TMP1, TCG_TMP2);
54
} else {
55
- tcg_out_opc_reg(s, OPC_AND, TCG_TMP1, TCG_TMP1, addrlo);
56
+ tcg_out_opc_reg(s, OPC_AND, TCG_TMP1, TCG_TMP1, addr);
57
}
58
59
/* Zero extend a 32-bit guest address for a 64-bit host. */
60
if (TCG_TARGET_REG_BITS == 64 && addr_type == TCG_TYPE_I32) {
61
- tcg_out_ext32u(s, TCG_TMP2, addrlo);
62
- addrlo = TCG_TMP2;
63
+ tcg_out_ext32u(s, TCG_TMP2, addr);
64
+ addr = TCG_TMP2;
65
}
66
67
ldst->label_ptr[0] = s->code_ptr;
68
tcg_out_opc_br(s, OPC_BNE, TCG_TMP1, TCG_TMP0);
69
70
- /* Load and test the high half tlb comparator. */
71
- if (TCG_TARGET_REG_BITS == 32 && addr_type != TCG_TYPE_I32) {
72
- /* delay slot */
73
- tcg_out_ldst(s, OPC_LW, TCG_TMP0, TCG_TMP3, cmp_off + HI_OFF);
33
-
74
-
34
- tb = db->tb;
75
- /* Load the tlb addend for the fast path. */
35
+ vaddr base;
76
- tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP3, TCG_TMP3, add_off);
36
37
/* Use slow path if first page is MMIO. */
38
if (unlikely(tb_page_addr0(tb) == -1)) {
39
- return NULL;
40
+ return false;
41
}
42
43
- end = pc + len - 1;
44
- if (likely(is_same_page(db, end))) {
45
- host = db->host_addr[0];
46
- base = db->pc_first;
47
- } else {
48
+ host = db->host_addr[0];
49
+ base = db->pc_first;
50
+
51
+ if (likely(((base ^ last) & TARGET_PAGE_MASK) == 0)) {
52
+ /* Entire read is from the first page. */
53
+ memcpy(dest, host + (pc - base), len);
54
+ return true;
55
+ }
56
+
57
+ if (unlikely(((base ^ pc) & TARGET_PAGE_MASK) == 0)) {
58
+ /* Read begins on the first page and extends to the second. */
59
+ size_t len0 = -(pc | TARGET_PAGE_MASK);
60
+ memcpy(dest, host + (pc - base), len0);
61
+ pc += len0;
62
+ dest += len0;
63
+ len -= len0;
64
+ }
65
+
66
+ /*
67
+ * The read must conclude on the second page and not extend to a third.
68
+ *
69
+ * TODO: We could allow the two pages to be virtually discontiguous,
70
+ * since we already allow the two pages to be physically discontiguous.
71
+ * The only reasonable use case would be executing an insn at the end
72
+ * of the address space wrapping around to the beginning. For that,
73
+ * we would need to know the current width of the address space.
74
+ * In the meantime, assert.
75
+ */
76
+ base = (base & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
77
+ assert(((base ^ pc) & TARGET_PAGE_MASK) == 0);
78
+ assert(((base ^ last) & TARGET_PAGE_MASK) == 0);
79
+ host = db->host_addr[1];
80
+
81
+ if (host == NULL) {
82
+ tb_page_addr_t page0, old_page1, new_page1;
83
+
84
+ new_page1 = get_page_addr_code_hostp(env, base, &db->host_addr[1]);
85
+
86
+ /*
87
+ * If the second page is MMIO, treat as if the first page
88
+ * was MMIO as well, so that we do not cache the TB.
89
+ */
90
+ if (unlikely(new_page1 == -1)) {
91
+ tb_unlock_pages(tb);
92
+ tb_set_page_addr0(tb, -1);
93
+ return false;
94
+ }
95
+
96
+ /*
97
+ * If this is not the first time around, and page1 matches,
98
+ * then we already have the page locked. Alternately, we're
99
+ * not doing anything to prevent the PTE from changing, so
100
+ * we might wind up with a different page, requiring us to
101
+ * re-do the locking.
102
+ */
103
+ old_page1 = tb_page_addr1(tb);
104
+ if (likely(new_page1 != old_page1)) {
105
+ page0 = tb_page_addr0(tb);
106
+ if (unlikely(old_page1 != -1)) {
107
+ tb_unlock_page1(page0, old_page1);
108
+ }
109
+ tb_set_page_addr1(tb, new_page1);
110
+ tb_lock_page1(page0, new_page1);
111
+ }
112
host = db->host_addr[1];
113
- base = TARGET_PAGE_ALIGN(db->pc_first);
114
- if (host == NULL) {
115
- tb_page_addr_t page0, old_page1, new_page1;
116
-
77
-
117
- new_page1 = get_page_addr_code_hostp(env, base, &db->host_addr[1]);
78
- ldst->label_ptr[1] = s->code_ptr;
118
-
79
- tcg_out_opc_br(s, OPC_BNE, addrhi, TCG_TMP0);
119
- /*
120
- * If the second page is MMIO, treat as if the first page
121
- * was MMIO as well, so that we do not cache the TB.
122
- */
123
- if (unlikely(new_page1 == -1)) {
124
- tb_unlock_pages(tb);
125
- tb_set_page_addr0(tb, -1);
126
- return NULL;
127
- }
128
-
129
- /*
130
- * If this is not the first time around, and page1 matches,
131
- * then we already have the page locked. Alternately, we're
132
- * not doing anything to prevent the PTE from changing, so
133
- * we might wind up with a different page, requiring us to
134
- * re-do the locking.
135
- */
136
- old_page1 = tb_page_addr1(tb);
137
- if (likely(new_page1 != old_page1)) {
138
- page0 = tb_page_addr0(tb);
139
- if (unlikely(old_page1 != -1)) {
140
- tb_unlock_page1(page0, old_page1);
141
- }
142
- tb_set_page_addr1(tb, new_page1);
143
- tb_lock_page1(page0, new_page1);
144
- }
145
- host = db->host_addr[1];
146
- }
80
- }
147
-
81
-
148
- /* Use slow path when crossing pages. */
82
/* delay slot */
149
- if (is_same_page(db, pc)) {
83
base = TCG_TMP3;
150
- return NULL;
84
- tcg_out_opc_reg(s, ALIAS_PADD, base, TCG_TMP3, addrlo);
151
- }
85
+ tcg_out_opc_reg(s, ALIAS_PADD, base, TCG_TMP3, addr);
152
}
86
} else {
153
87
if (a_mask && (use_mips32r6_instructions || a_bits != s_bits)) {
154
- tcg_debug_assert(pc >= base);
88
ldst = new_ldst_label(s);
155
- return host + (pc - base);
89
156
+ memcpy(dest, host + (pc - base), len);
90
ldst->is_ld = is_ld;
157
+ return true;
91
ldst->oi = oi;
92
- ldst->addrlo_reg = addrlo;
93
- ldst->addrhi_reg = addrhi;
94
+ ldst->addrlo_reg = addr;
95
96
/* We are expecting a_bits to max out at 7, much lower than ANDI. */
97
tcg_debug_assert(a_bits < 16);
98
- tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, addrlo, a_mask);
99
+ tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, addr, a_mask);
100
101
ldst->label_ptr[0] = s->code_ptr;
102
if (use_mips32r6_instructions) {
103
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
104
}
105
}
106
107
- base = addrlo;
108
+ base = addr;
109
if (TCG_TARGET_REG_BITS == 64 && addr_type == TCG_TYPE_I32) {
110
tcg_out_ext32u(s, TCG_REG_A0, base);
111
base = TCG_REG_A0;
112
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld_unalign(TCGContext *s, TCGReg lo, TCGReg hi,
158
}
113
}
159
114
160
static void plugin_insn_append(vaddr pc, const void *from, size_t size)
115
static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi,
161
@@ -XXX,XX +XXX,XX @@ static void plugin_insn_append(vaddr pc, const void *from, size_t size)
116
- TCGReg addrlo, TCGReg addrhi,
162
117
- MemOpIdx oi, TCGType data_type)
163
uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc)
118
+ TCGReg addr, MemOpIdx oi, TCGType data_type)
164
{
119
{
165
- uint8_t ret;
120
MemOp opc = get_memop(oi);
166
- void *p = translator_access(env, db, pc, sizeof(ret));
121
TCGLabelQemuLdst *ldst;
167
+ uint8_t raw;
122
HostAddress h;
168
123
169
- if (p) {
124
- ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, true);
170
- plugin_insn_append(pc, p, sizeof(ret));
125
+ ldst = prepare_host_addr(s, &h, addr, oi, true);
171
- return ldub_p(p);
126
172
+ if (!translator_ld(env, db, &raw, pc, sizeof(raw))) {
127
if (use_mips32r6_instructions || h.aa.align >= (opc & MO_SIZE)) {
173
+ raw = cpu_ldub_code(env, pc);
128
tcg_out_qemu_ld_direct(s, datalo, datahi, h.base, opc, data_type);
174
}
129
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st_unalign(TCGContext *s, TCGReg lo, TCGReg hi,
175
- ret = cpu_ldub_code(env, pc);
176
- plugin_insn_append(pc, &ret, sizeof(ret));
177
- return ret;
178
+ plugin_insn_append(pc, &raw, sizeof(raw));
179
+ return raw;
180
}
130
}
181
131
182
uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc)
132
static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi,
133
- TCGReg addrlo, TCGReg addrhi,
134
- MemOpIdx oi, TCGType data_type)
135
+ TCGReg addr, MemOpIdx oi, TCGType data_type)
183
{
136
{
184
- uint16_t ret, plug;
137
MemOp opc = get_memop(oi);
185
- void *p = translator_access(env, db, pc, sizeof(ret));
138
TCGLabelQemuLdst *ldst;
186
+ uint16_t raw, tgt;
139
HostAddress h;
187
140
188
- if (p) {
141
- ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, false);
189
- plugin_insn_append(pc, p, sizeof(ret));
142
+ ldst = prepare_host_addr(s, &h, addr, oi, false);
190
- return lduw_p(p);
143
191
+ if (translator_ld(env, db, &raw, pc, sizeof(raw))) {
144
if (use_mips32r6_instructions || h.aa.align >= (opc & MO_SIZE)) {
192
+ tgt = tswap16(raw);
145
tcg_out_qemu_st_direct(s, datalo, datahi, h.base, opc);
193
+ } else {
146
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
194
+ tgt = cpu_lduw_code(env, pc);
147
break;
195
+ raw = tswap16(tgt);
148
196
}
149
case INDEX_op_qemu_ld_i32:
197
- ret = cpu_lduw_code(env, pc);
150
- tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I32);
198
- plug = tswap16(ret);
151
+ tcg_out_qemu_ld(s, a0, 0, a1, a2, TCG_TYPE_I32);
199
- plugin_insn_append(pc, &plug, sizeof(ret));
152
break;
200
- return ret;
153
case INDEX_op_qemu_ld_i64:
201
+ plugin_insn_append(pc, &raw, sizeof(raw));
154
if (TCG_TARGET_REG_BITS == 64) {
202
+ return tgt;
155
- tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I64);
203
}
156
+ tcg_out_qemu_ld(s, a0, 0, a1, a2, TCG_TYPE_I64);
204
157
} else {
205
uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc)
158
- tcg_out_qemu_ld(s, a0, a1, a2, 0, args[3], TCG_TYPE_I64);
206
{
159
+ tcg_out_qemu_ld(s, a0, a1, a2, args[3], TCG_TYPE_I64);
207
- uint32_t ret, plug;
160
}
208
- void *p = translator_access(env, db, pc, sizeof(ret));
161
break;
209
+ uint32_t raw, tgt;
162
210
163
case INDEX_op_qemu_st_i32:
211
- if (p) {
164
- tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I32);
212
- plugin_insn_append(pc, p, sizeof(ret));
165
+ tcg_out_qemu_st(s, a0, 0, a1, a2, TCG_TYPE_I32);
213
- return ldl_p(p);
166
break;
214
+ if (translator_ld(env, db, &raw, pc, sizeof(raw))) {
167
case INDEX_op_qemu_st_i64:
215
+ tgt = tswap32(raw);
168
if (TCG_TARGET_REG_BITS == 64) {
216
+ } else {
169
- tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I64);
217
+ tgt = cpu_ldl_code(env, pc);
170
+ tcg_out_qemu_st(s, a0, 0, a1, a2, TCG_TYPE_I64);
218
+ raw = tswap32(tgt);
171
} else {
219
}
172
- tcg_out_qemu_st(s, a0, a1, a2, 0, args[3], TCG_TYPE_I64);
220
- ret = cpu_ldl_code(env, pc);
173
+ tcg_out_qemu_st(s, a0, a1, a2, args[3], TCG_TYPE_I64);
221
- plug = tswap32(ret);
174
}
222
- plugin_insn_append(pc, &plug, sizeof(ret));
175
break;
223
- return ret;
176
224
+ plugin_insn_append(pc, &raw, sizeof(raw));
225
+ return tgt;
226
}
227
228
uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
229
{
230
- uint64_t ret, plug;
231
- void *p = translator_access(env, db, pc, sizeof(ret));
232
+ uint64_t raw, tgt;
233
234
- if (p) {
235
- plugin_insn_append(pc, p, sizeof(ret));
236
- return ldq_p(p);
237
+ if (translator_ld(env, db, &raw, pc, sizeof(raw))) {
238
+ tgt = tswap64(raw);
239
+ } else {
240
+ tgt = cpu_ldq_code(env, pc);
241
+ raw = tswap64(tgt);
242
}
243
- ret = cpu_ldq_code(env, pc);
244
- plug = tswap64(ret);
245
- plugin_insn_append(pc, &plug, sizeof(ret));
246
- return ret;
247
+ plugin_insn_append(pc, &raw, sizeof(raw));
248
+ return tgt;
249
}
250
251
void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8)
252
--
177
--
253
2.34.1
178
2.43.0
254
179
255
180
diff view generated by jsdifflib
1
Replace translator_fake_ldb, which required multiple calls,
1
The guest address will now always fit in one register.
2
with translator_fake_ld, which can take all data at once.
3
2
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
include/exec/translator.h | 8 ++++----
6
tcg/ppc/tcg-target.c.inc | 75 ++++++++++++----------------------------
8
accel/tcg/translator.c | 5 ++---
7
1 file changed, 23 insertions(+), 52 deletions(-)
9
target/s390x/tcg/translate.c | 8 ++++----
8
10
3 files changed, 10 insertions(+), 11 deletions(-)
9
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
11
12
diff --git a/include/exec/translator.h b/include/exec/translator.h
13
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
14
--- a/include/exec/translator.h
11
--- a/tcg/ppc/tcg-target.c.inc
15
+++ b/include/exec/translator.h
12
+++ b/tcg/ppc/tcg-target.c.inc
16
@@ -XXX,XX +XXX,XX @@ translator_ldq_swap(CPUArchState *env, DisasContextBase *db,
13
@@ -XXX,XX +XXX,XX @@ bool tcg_target_has_memory_bswap(MemOp memop)
14
* is required and fill in @h with the host address for the fast path.
15
*/
16
static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
17
- TCGReg addrlo, TCGReg addrhi,
18
- MemOpIdx oi, bool is_ld)
19
+ TCGReg addr, MemOpIdx oi, bool is_ld)
20
{
21
TCGType addr_type = s->addr_type;
22
TCGLabelQemuLdst *ldst = NULL;
23
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
24
ldst = new_ldst_label(s);
25
ldst->is_ld = is_ld;
26
ldst->oi = oi;
27
- ldst->addrlo_reg = addrlo;
28
- ldst->addrhi_reg = addrhi;
29
+ ldst->addrlo_reg = addr;
30
31
/* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx]. */
32
tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_AREG0, mask_off);
33
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
34
35
/* Extract the page index, shifted into place for tlb index. */
36
if (TCG_TARGET_REG_BITS == 32) {
37
- tcg_out_shri32(s, TCG_REG_R0, addrlo,
38
+ tcg_out_shri32(s, TCG_REG_R0, addr,
39
s->page_bits - CPU_TLB_ENTRY_BITS);
40
} else {
41
- tcg_out_shri64(s, TCG_REG_R0, addrlo,
42
+ tcg_out_shri64(s, TCG_REG_R0, addr,
43
s->page_bits - CPU_TLB_ENTRY_BITS);
44
}
45
tcg_out32(s, AND | SAB(TCG_REG_TMP1, TCG_REG_TMP1, TCG_REG_R0));
46
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
47
if (a_bits < s_bits) {
48
a_bits = s_bits;
49
}
50
- tcg_out_rlw(s, RLWINM, TCG_REG_R0, addrlo, 0,
51
+ tcg_out_rlw(s, RLWINM, TCG_REG_R0, addr, 0,
52
(32 - a_bits) & 31, 31 - s->page_bits);
53
} else {
54
- TCGReg t = addrlo;
55
+ TCGReg t = addr;
56
57
/*
58
* If the access is unaligned, we need to make sure we fail if we
59
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
60
}
61
}
62
63
- if (TCG_TARGET_REG_BITS == 32 && addr_type != TCG_TYPE_I32) {
64
- /* Low part comparison into cr7. */
65
- tcg_out_cmp(s, TCG_COND_EQ, TCG_REG_R0, TCG_REG_TMP2,
66
- 0, 7, TCG_TYPE_I32);
67
-
68
- /* Load the high part TLB comparator into TMP2. */
69
- tcg_out_ld(s, TCG_TYPE_I32, TCG_REG_TMP2, TCG_REG_TMP1,
70
- cmp_off + 4 * !HOST_BIG_ENDIAN);
71
-
72
- /* Load addend, deferred for this case. */
73
- tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_REG_TMP1,
74
- offsetof(CPUTLBEntry, addend));
75
-
76
- /* High part comparison into cr6. */
77
- tcg_out_cmp(s, TCG_COND_EQ, addrhi, TCG_REG_TMP2,
78
- 0, 6, TCG_TYPE_I32);
79
-
80
- /* Combine comparisons into cr0. */
81
- tcg_out32(s, CRAND | BT(0, CR_EQ) | BA(6, CR_EQ) | BB(7, CR_EQ));
82
- } else {
83
- /* Full comparison into cr0. */
84
- tcg_out_cmp(s, TCG_COND_EQ, TCG_REG_R0, TCG_REG_TMP2,
85
- 0, 0, addr_type);
86
- }
87
+ /* Full comparison into cr0. */
88
+ tcg_out_cmp(s, TCG_COND_EQ, TCG_REG_R0, TCG_REG_TMP2, 0, 0, addr_type);
89
90
/* Load a pointer into the current opcode w/conditional branch-link. */
91
ldst->label_ptr[0] = s->code_ptr;
92
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
93
ldst = new_ldst_label(s);
94
ldst->is_ld = is_ld;
95
ldst->oi = oi;
96
- ldst->addrlo_reg = addrlo;
97
- ldst->addrhi_reg = addrhi;
98
+ ldst->addrlo_reg = addr;
99
100
/* We are expecting a_bits to max out at 7, much lower than ANDI. */
101
tcg_debug_assert(a_bits < 16);
102
- tcg_out32(s, ANDI | SAI(addrlo, TCG_REG_R0, (1 << a_bits) - 1));
103
+ tcg_out32(s, ANDI | SAI(addr, TCG_REG_R0, (1 << a_bits) - 1));
104
105
ldst->label_ptr[0] = s->code_ptr;
106
tcg_out32(s, BC | BI(0, CR_EQ) | BO_COND_FALSE | LK);
107
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
108
109
if (TCG_TARGET_REG_BITS == 64 && addr_type == TCG_TYPE_I32) {
110
/* Zero-extend the guest address for use in the host address. */
111
- tcg_out_ext32u(s, TCG_REG_TMP2, addrlo);
112
+ tcg_out_ext32u(s, TCG_REG_TMP2, addr);
113
h->index = TCG_REG_TMP2;
114
} else {
115
- h->index = addrlo;
116
+ h->index = addr;
117
}
118
119
return ldst;
17
}
120
}
18
121
19
/**
122
static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi,
20
- * translator_fake_ldb - fake instruction load
123
- TCGReg addrlo, TCGReg addrhi,
21
+ * translator_fake_ld - fake instruction load
124
- MemOpIdx oi, TCGType data_type)
22
* @db: Disassembly context
125
+ TCGReg addr, MemOpIdx oi, TCGType data_type)
23
- * @pc: program counter of instruction
126
{
24
- * @insn8: byte of instruction
127
MemOp opc = get_memop(oi);
25
+ * @data: bytes of instruction
128
TCGLabelQemuLdst *ldst;
26
+ * @len: number of bytes
129
HostAddress h;
27
*
130
28
* This is a special case helper used where the instruction we are
131
- ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, true);
29
* about to translate comes from somewhere else (e.g. being
132
+ ldst = prepare_host_addr(s, &h, addr, oi, true);
30
* re-synthesised for s390x "ex"). It ensures we update other areas of
133
31
* the translator with details of the executed instruction.
134
if (TCG_TARGET_REG_BITS == 32 && (opc & MO_SIZE) == MO_64) {
32
*/
135
if (opc & MO_BSWAP) {
33
-void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8);
136
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi,
34
+void translator_fake_ld(DisasContextBase *db, const void *data, size_t len);
35
36
/**
37
* translator_st
38
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/accel/tcg/translator.c
41
+++ b/accel/tcg/translator.c
42
@@ -XXX,XX +XXX,XX @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
43
return tgt;
44
}
137
}
45
138
46
-void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8)
139
static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi,
47
+void translator_fake_ld(DisasContextBase *db, const void *data, size_t len)
140
- TCGReg addrlo, TCGReg addrhi,
141
- MemOpIdx oi, TCGType data_type)
142
+ TCGReg addr, MemOpIdx oi, TCGType data_type)
48
{
143
{
49
- assert(pc >= db->pc_first);
144
MemOp opc = get_memop(oi);
50
db->fake_insn = true;
145
TCGLabelQemuLdst *ldst;
51
- record_save(db, pc, &insn8, sizeof(insn8));
146
HostAddress h;
52
+ record_save(db, db->pc_first, data, len);
147
53
}
148
- ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, false);
54
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
149
+ ldst = prepare_host_addr(s, &h, addr, oi, false);
55
index XXXXXXX..XXXXXXX 100644
150
56
--- a/target/s390x/tcg/translate.c
151
if (TCG_TARGET_REG_BITS == 32 && (opc & MO_SIZE) == MO_64) {
57
+++ b/target/s390x/tcg/translate.c
152
if (opc & MO_BSWAP) {
58
@@ -XXX,XX +XXX,XX @@ static const DisasInsn *extract_insn(CPUS390XState *env, DisasContext *s)
153
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ldst_i128(TCGContext *s, TCGReg datalo, TCGReg datahi,
59
const DisasInsn *info;
154
uint32_t insn;
60
155
TCGReg index;
61
if (unlikely(s->ex_value)) {
156
62
+ uint64_t be_insn;
157
- ldst = prepare_host_addr(s, &h, addr_reg, -1, oi, is_ld);
63
+
158
+ ldst = prepare_host_addr(s, &h, addr_reg, oi, is_ld);
64
/* Drop the EX data now, so that it's clear on exception paths. */
159
65
tcg_gen_st_i64(tcg_constant_i64(0), tcg_env,
160
/* Compose the final address, as LQ/STQ have no indexing. */
66
offsetof(CPUS390XState, ex_value));
161
index = h.index;
67
@@ -XXX,XX +XXX,XX @@ static const DisasInsn *extract_insn(CPUS390XState *env, DisasContext *s)
162
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
68
ilen = s->ex_value & 0xf;
163
break;
69
164
70
/* Register insn bytes with translator so plugins work. */
165
case INDEX_op_qemu_ld_i32:
71
- for (int i = 0; i < ilen; i++) {
166
- tcg_out_qemu_ld(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32);
72
- uint8_t byte = extract64(insn, 56 - (i * 8), 8);
167
+ tcg_out_qemu_ld(s, args[0], -1, args[1], args[2], TCG_TYPE_I32);
73
- translator_fake_ldb(&s->base, pc + i, byte);
168
break;
74
- }
169
case INDEX_op_qemu_ld_i64:
75
+ be_insn = cpu_to_be64(insn);
170
if (TCG_TARGET_REG_BITS == 64) {
76
+ translator_fake_ld(&s->base, &be_insn, ilen);
171
- tcg_out_qemu_ld(s, args[0], -1, args[1], -1,
77
op = insn >> 56;
172
- args[2], TCG_TYPE_I64);
78
} else {
173
+ tcg_out_qemu_ld(s, args[0], -1, args[1], args[2], TCG_TYPE_I64);
79
insn = ld_code2(env, s, pc);
174
} else {
175
- tcg_out_qemu_ld(s, args[0], args[1], args[2], -1,
176
+ tcg_out_qemu_ld(s, args[0], args[1], args[2],
177
args[3], TCG_TYPE_I64);
178
}
179
break;
180
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
181
break;
182
183
case INDEX_op_qemu_st_i32:
184
- tcg_out_qemu_st(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32);
185
+ tcg_out_qemu_st(s, args[0], -1, args[1], args[2], TCG_TYPE_I32);
186
break;
187
case INDEX_op_qemu_st_i64:
188
if (TCG_TARGET_REG_BITS == 64) {
189
- tcg_out_qemu_st(s, args[0], -1, args[1], -1,
190
- args[2], TCG_TYPE_I64);
191
+ tcg_out_qemu_st(s, args[0], -1, args[1], args[2], TCG_TYPE_I64);
192
} else {
193
- tcg_out_qemu_st(s, args[0], args[1], args[2], -1,
194
+ tcg_out_qemu_st(s, args[0], args[1], args[2],
195
args[3], TCG_TYPE_I64);
196
}
197
break;
80
--
198
--
81
2.34.1
199
2.43.0
82
200
83
201
diff view generated by jsdifflib
1
While there are other methods that could be used to replace
1
There is now always only one guest address register.
2
TARGET_PAGE_MASK, the function is not really required outside
3
the context of target-specific translation.
4
5
This makes the header usable by target independent code.
6
2
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
---
5
---
10
include/exec/translator.h | 2 ++
6
tcg/tcg.c | 18 +++++++++---------
11
1 file changed, 2 insertions(+)
7
tcg/aarch64/tcg-target.c.inc | 4 ++--
12
8
tcg/arm/tcg-target.c.inc | 4 ++--
13
diff --git a/include/exec/translator.h b/include/exec/translator.h
9
tcg/i386/tcg-target.c.inc | 4 ++--
14
index XXXXXXX..XXXXXXX 100644
10
tcg/loongarch64/tcg-target.c.inc | 4 ++--
15
--- a/include/exec/translator.h
11
tcg/mips/tcg-target.c.inc | 4 ++--
16
+++ b/include/exec/translator.h
12
tcg/ppc/tcg-target.c.inc | 4 ++--
17
@@ -XXX,XX +XXX,XX @@ translator_ldq_swap(CPUArchState *env, DisasContextBase *db,
13
tcg/riscv/tcg-target.c.inc | 4 ++--
18
*/
14
tcg/s390x/tcg-target.c.inc | 4 ++--
19
void translator_fake_ldb(uint8_t insn8, vaddr pc);
15
tcg/sparc64/tcg-target.c.inc | 4 ++--
20
16
10 files changed, 27 insertions(+), 27 deletions(-)
21
+#ifdef COMPILING_PER_TARGET
17
22
/*
18
diff --git a/tcg/tcg.c b/tcg/tcg.c
23
* Return whether addr is on the same page as where disassembly started.
19
index XXXXXXX..XXXXXXX 100644
24
* Translators can use this to enforce the rule that only single-insn
20
--- a/tcg/tcg.c
25
@@ -XXX,XX +XXX,XX @@ static inline bool is_same_page(const DisasContextBase *db, vaddr addr)
21
+++ b/tcg/tcg.c
26
{
22
@@ -XXX,XX +XXX,XX @@ struct TCGLabelQemuLdst {
27
return ((addr ^ db->pc_first) & TARGET_PAGE_MASK) == 0;
23
bool is_ld; /* qemu_ld: true, qemu_st: false */
28
}
24
MemOpIdx oi;
29
+#endif
25
TCGType type; /* result type of a load */
30
26
- TCGReg addrlo_reg; /* reg index for low word of guest virtual addr */
31
#endif /* EXEC__TRANSLATOR_H */
27
- TCGReg addrhi_reg; /* reg index for high word of guest virtual addr */
28
+ TCGReg addr_reg; /* reg index for guest virtual addr */
29
TCGReg datalo_reg; /* reg index for low word to be loaded or stored */
30
TCGReg datahi_reg; /* reg index for high word to be loaded or stored */
31
const tcg_insn_unit *raddr; /* addr of the next IR of qemu_ld/st IR */
32
@@ -XXX,XX +XXX,XX @@ static void tcg_out_ld_helper_args(TCGContext *s, const TCGLabelQemuLdst *ldst,
33
*/
34
tcg_out_helper_add_mov(mov, loc + HOST_BIG_ENDIAN,
35
TCG_TYPE_I32, TCG_TYPE_I32,
36
- ldst->addrlo_reg, -1);
37
+ ldst->addr_reg, -1);
38
tcg_out_helper_load_slots(s, 1, mov, parm);
39
40
tcg_out_helper_load_imm(s, loc[!HOST_BIG_ENDIAN].arg_slot,
41
@@ -XXX,XX +XXX,XX @@ static void tcg_out_ld_helper_args(TCGContext *s, const TCGLabelQemuLdst *ldst,
42
next_arg += 2;
43
} else {
44
nmov = tcg_out_helper_add_mov(mov, loc, TCG_TYPE_I64, s->addr_type,
45
- ldst->addrlo_reg, ldst->addrhi_reg);
46
+ ldst->addr_reg, -1);
47
tcg_out_helper_load_slots(s, nmov, mov, parm);
48
next_arg += nmov;
49
}
50
@@ -XXX,XX +XXX,XX @@ static void tcg_out_st_helper_args(TCGContext *s, const TCGLabelQemuLdst *ldst,
51
52
/* Handle addr argument. */
53
loc = &info->in[next_arg];
54
- if (TCG_TARGET_REG_BITS == 32 && s->addr_type == TCG_TYPE_I32) {
55
+ tcg_debug_assert(s->addr_type <= TCG_TYPE_REG);
56
+ if (TCG_TARGET_REG_BITS == 32) {
57
/*
58
- * 32-bit host with 32-bit guest: zero-extend the guest address
59
+ * 32-bit host (and thus 32-bit guest): zero-extend the guest address
60
* to 64-bits for the helper by storing the low part. Later,
61
* after we have processed the register inputs, we will load a
62
* zero for the high part.
63
*/
64
tcg_out_helper_add_mov(mov, loc + HOST_BIG_ENDIAN,
65
TCG_TYPE_I32, TCG_TYPE_I32,
66
- ldst->addrlo_reg, -1);
67
+ ldst->addr_reg, -1);
68
next_arg += 2;
69
nmov += 1;
70
} else {
71
n = tcg_out_helper_add_mov(mov, loc, TCG_TYPE_I64, s->addr_type,
72
- ldst->addrlo_reg, ldst->addrhi_reg);
73
+ ldst->addr_reg, -1);
74
next_arg += n;
75
nmov += n;
76
}
77
@@ -XXX,XX +XXX,XX @@ static void tcg_out_st_helper_args(TCGContext *s, const TCGLabelQemuLdst *ldst,
78
g_assert_not_reached();
79
}
80
81
- if (TCG_TARGET_REG_BITS == 32 && s->addr_type == TCG_TYPE_I32) {
82
+ if (TCG_TARGET_REG_BITS == 32) {
83
/* Zero extend the address by loading a zero for the high part. */
84
loc = &info->in[1 + !HOST_BIG_ENDIAN];
85
tcg_out_helper_load_imm(s, loc->arg_slot, TCG_TYPE_I32, 0, parm);
86
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
87
index XXXXXXX..XXXXXXX 100644
88
--- a/tcg/aarch64/tcg-target.c.inc
89
+++ b/tcg/aarch64/tcg-target.c.inc
90
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
91
ldst = new_ldst_label(s);
92
ldst->is_ld = is_ld;
93
ldst->oi = oi;
94
- ldst->addrlo_reg = addr_reg;
95
+ ldst->addr_reg = addr_reg;
96
97
mask_type = (s->page_bits + s->tlb_dyn_max_bits > 32
98
? TCG_TYPE_I64 : TCG_TYPE_I32);
99
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
100
101
ldst->is_ld = is_ld;
102
ldst->oi = oi;
103
- ldst->addrlo_reg = addr_reg;
104
+ ldst->addr_reg = addr_reg;
105
106
/* tst addr, #mask */
107
tcg_out_logicali(s, I3404_ANDSI, 0, TCG_REG_XZR, addr_reg, a_mask);
108
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
109
index XXXXXXX..XXXXXXX 100644
110
--- a/tcg/arm/tcg-target.c.inc
111
+++ b/tcg/arm/tcg-target.c.inc
112
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
113
ldst = new_ldst_label(s);
114
ldst->is_ld = is_ld;
115
ldst->oi = oi;
116
- ldst->addrlo_reg = addr;
117
+ ldst->addr_reg = addr;
118
119
/* Load cpu->neg.tlb.f[mmu_idx].{mask,table} into {r0,r1}. */
120
QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, mask) != 0);
121
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
122
ldst = new_ldst_label(s);
123
ldst->is_ld = is_ld;
124
ldst->oi = oi;
125
- ldst->addrlo_reg = addr;
126
+ ldst->addr_reg = addr;
127
128
/* We are expecting alignment to max out at 7 */
129
tcg_debug_assert(a_mask <= 0xff);
130
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
131
index XXXXXXX..XXXXXXX 100644
132
--- a/tcg/i386/tcg-target.c.inc
133
+++ b/tcg/i386/tcg-target.c.inc
134
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
135
ldst = new_ldst_label(s);
136
ldst->is_ld = is_ld;
137
ldst->oi = oi;
138
- ldst->addrlo_reg = addr;
139
+ ldst->addr_reg = addr;
140
141
if (TCG_TARGET_REG_BITS == 64) {
142
ttype = s->addr_type;
143
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
144
ldst = new_ldst_label(s);
145
ldst->is_ld = is_ld;
146
ldst->oi = oi;
147
- ldst->addrlo_reg = addr;
148
+ ldst->addr_reg = addr;
149
150
/* jne slow_path */
151
jcc = tcg_out_cmp(s, TCG_COND_TSTNE, addr, a_mask, true, false);
152
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
153
index XXXXXXX..XXXXXXX 100644
154
--- a/tcg/loongarch64/tcg-target.c.inc
155
+++ b/tcg/loongarch64/tcg-target.c.inc
156
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
157
ldst = new_ldst_label(s);
158
ldst->is_ld = is_ld;
159
ldst->oi = oi;
160
- ldst->addrlo_reg = addr_reg;
161
+ ldst->addr_reg = addr_reg;
162
163
tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP0, TCG_AREG0, mask_ofs);
164
tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_AREG0, table_ofs);
165
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
166
167
ldst->is_ld = is_ld;
168
ldst->oi = oi;
169
- ldst->addrlo_reg = addr_reg;
170
+ ldst->addr_reg = addr_reg;
171
172
/*
173
* Without micro-architecture details, we don't know which of
174
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
175
index XXXXXXX..XXXXXXX 100644
176
--- a/tcg/mips/tcg-target.c.inc
177
+++ b/tcg/mips/tcg-target.c.inc
178
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
179
ldst = new_ldst_label(s);
180
ldst->is_ld = is_ld;
181
ldst->oi = oi;
182
- ldst->addrlo_reg = addr;
183
+ ldst->addr_reg = addr;
184
185
/* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx]. */
186
tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP0, TCG_AREG0, mask_off);
187
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
188
189
ldst->is_ld = is_ld;
190
ldst->oi = oi;
191
- ldst->addrlo_reg = addr;
192
+ ldst->addr_reg = addr;
193
194
/* We are expecting a_bits to max out at 7, much lower than ANDI. */
195
tcg_debug_assert(a_bits < 16);
196
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
197
index XXXXXXX..XXXXXXX 100644
198
--- a/tcg/ppc/tcg-target.c.inc
199
+++ b/tcg/ppc/tcg-target.c.inc
200
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
201
ldst = new_ldst_label(s);
202
ldst->is_ld = is_ld;
203
ldst->oi = oi;
204
- ldst->addrlo_reg = addr;
205
+ ldst->addr_reg = addr;
206
207
/* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx]. */
208
tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_AREG0, mask_off);
209
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
210
ldst = new_ldst_label(s);
211
ldst->is_ld = is_ld;
212
ldst->oi = oi;
213
- ldst->addrlo_reg = addr;
214
+ ldst->addr_reg = addr;
215
216
/* We are expecting a_bits to max out at 7, much lower than ANDI. */
217
tcg_debug_assert(a_bits < 16);
218
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
219
index XXXXXXX..XXXXXXX 100644
220
--- a/tcg/riscv/tcg-target.c.inc
221
+++ b/tcg/riscv/tcg-target.c.inc
222
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, TCGReg *pbase,
223
ldst = new_ldst_label(s);
224
ldst->is_ld = is_ld;
225
ldst->oi = oi;
226
- ldst->addrlo_reg = addr_reg;
227
+ ldst->addr_reg = addr_reg;
228
229
init_setting_vtype(s);
230
231
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, TCGReg *pbase,
232
ldst = new_ldst_label(s);
233
ldst->is_ld = is_ld;
234
ldst->oi = oi;
235
- ldst->addrlo_reg = addr_reg;
236
+ ldst->addr_reg = addr_reg;
237
238
init_setting_vtype(s);
239
240
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
241
index XXXXXXX..XXXXXXX 100644
242
--- a/tcg/s390x/tcg-target.c.inc
243
+++ b/tcg/s390x/tcg-target.c.inc
244
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
245
ldst = new_ldst_label(s);
246
ldst->is_ld = is_ld;
247
ldst->oi = oi;
248
- ldst->addrlo_reg = addr_reg;
249
+ ldst->addr_reg = addr_reg;
250
251
tcg_out_sh64(s, RSY_SRLG, TCG_TMP0, addr_reg, TCG_REG_NONE,
252
s->page_bits - CPU_TLB_ENTRY_BITS);
253
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
254
ldst = new_ldst_label(s);
255
ldst->is_ld = is_ld;
256
ldst->oi = oi;
257
- ldst->addrlo_reg = addr_reg;
258
+ ldst->addr_reg = addr_reg;
259
260
tcg_debug_assert(a_mask <= 0xffff);
261
tcg_out_insn(s, RI, TMLL, addr_reg, a_mask);
262
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
263
index XXXXXXX..XXXXXXX 100644
264
--- a/tcg/sparc64/tcg-target.c.inc
265
+++ b/tcg/sparc64/tcg-target.c.inc
266
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
267
ldst = new_ldst_label(s);
268
ldst->is_ld = is_ld;
269
ldst->oi = oi;
270
- ldst->addrlo_reg = addr_reg;
271
+ ldst->addr_reg = addr_reg;
272
ldst->label_ptr[0] = s->code_ptr;
273
274
/* bne,pn %[xi]cc, label0 */
275
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
276
ldst = new_ldst_label(s);
277
ldst->is_ld = is_ld;
278
ldst->oi = oi;
279
- ldst->addrlo_reg = addr_reg;
280
+ ldst->addr_reg = addr_reg;
281
ldst->label_ptr[0] = s->code_ptr;
282
283
/* bne,pn %icc, label0 */
32
--
284
--
33
2.34.1
285
2.43.0
34
286
35
287
diff view generated by jsdifflib
1
Do not pass around a boolean between multiple structures,
1
The declaration uses uint64_t for addr.
2
just read it from the TranslationBlock in the TCGContext.
3
2
3
Fixes: 595cd9ce2ec ("plugins: add plugin API to read guest memory")
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
6
---
7
include/exec/plugin-gen.h | 7 +++----
7
plugins/api.c | 2 +-
8
include/qemu/plugin.h | 3 ---
8
1 file changed, 1 insertion(+), 1 deletion(-)
9
accel/tcg/plugin-gen.c | 4 +---
10
accel/tcg/translator.c | 2 +-
11
plugins/api.c | 14 +++++++++-----
12
5 files changed, 14 insertions(+), 16 deletions(-)
13
9
14
diff --git a/include/exec/plugin-gen.h b/include/exec/plugin-gen.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/plugin-gen.h
17
+++ b/include/exec/plugin-gen.h
18
@@ -XXX,XX +XXX,XX @@ struct DisasContextBase;
19
20
#ifdef CONFIG_PLUGIN
21
22
-bool plugin_gen_tb_start(CPUState *cpu, const struct DisasContextBase *db,
23
- bool supress);
24
+bool plugin_gen_tb_start(CPUState *cpu, const struct DisasContextBase *db);
25
void plugin_gen_tb_end(CPUState *cpu, size_t num_insns);
26
void plugin_gen_insn_start(CPUState *cpu, const struct DisasContextBase *db);
27
void plugin_gen_insn_end(void);
28
@@ -XXX,XX +XXX,XX @@ void plugin_gen_disable_mem_helpers(void);
29
30
#else /* !CONFIG_PLUGIN */
31
32
-static inline bool
33
-plugin_gen_tb_start(CPUState *cpu, const struct DisasContextBase *db, bool sup)
34
+static inline
35
+bool plugin_gen_tb_start(CPUState *cpu, const struct DisasContextBase *db)
36
{
37
return false;
38
}
39
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
40
index XXXXXXX..XXXXXXX 100644
41
--- a/include/qemu/plugin.h
42
+++ b/include/qemu/plugin.h
43
@@ -XXX,XX +XXX,XX @@ struct qemu_plugin_insn {
44
45
/* if set, the instruction calls helpers that might access guest memory */
46
bool mem_helper;
47
-
48
- bool mem_only;
49
};
50
51
/* A scoreboard is an array of values, indexed by vcpu_index */
52
@@ -XXX,XX +XXX,XX @@ struct qemu_plugin_tb {
53
uint64_t vaddr2;
54
void *haddr1;
55
void *haddr2;
56
- bool mem_only;
57
58
/* if set, the TB calls helpers that might access guest memory */
59
bool mem_helper;
60
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/accel/tcg/plugin-gen.c
63
+++ b/accel/tcg/plugin-gen.c
64
@@ -XXX,XX +XXX,XX @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
65
}
66
}
67
68
-bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db,
69
- bool mem_only)
70
+bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db)
71
{
72
bool ret = false;
73
74
@@ -XXX,XX +XXX,XX @@ bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db,
75
ptb->vaddr2 = -1;
76
ptb->haddr1 = db->host_addr[0];
77
ptb->haddr2 = NULL;
78
- ptb->mem_only = mem_only;
79
ptb->mem_helper = false;
80
81
tcg_gen_plugin_cb(PLUGIN_GEN_FROM_TB);
82
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/accel/tcg/translator.c
85
+++ b/accel/tcg/translator.c
86
@@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
87
ops->tb_start(db, cpu);
88
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
89
90
- plugin_enabled = plugin_gen_tb_start(cpu, db, cflags & CF_MEMI_ONLY);
91
+ plugin_enabled = plugin_gen_tb_start(cpu, db);
92
db->plugin_enabled = plugin_enabled;
93
94
while (true) {
95
diff --git a/plugins/api.c b/plugins/api.c
10
diff --git a/plugins/api.c b/plugins/api.c
96
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
97
--- a/plugins/api.c
12
--- a/plugins/api.c
98
+++ b/plugins/api.c
13
+++ b/plugins/api.c
99
@@ -XXX,XX +XXX,XX @@ void qemu_plugin_register_vcpu_exit_cb(qemu_plugin_id_t id,
14
@@ -XXX,XX +XXX,XX @@ GArray *qemu_plugin_get_registers(void)
100
plugin_register_cb(id, QEMU_PLUGIN_EV_VCPU_EXIT, cb);
15
return create_register_handles(regs);
101
}
16
}
102
17
103
+static bool tb_is_mem_only(void)
18
-bool qemu_plugin_read_memory_vaddr(vaddr addr, GByteArray *data, size_t len)
104
+{
19
+bool qemu_plugin_read_memory_vaddr(uint64_t addr, GByteArray *data, size_t len)
105
+ return tb_cflags(tcg_ctx->gen_tb) & CF_MEMI_ONLY;
106
+}
107
+
108
void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb,
109
qemu_plugin_vcpu_udata_cb_t cb,
110
enum qemu_plugin_cb_flags flags,
111
void *udata)
112
{
20
{
113
- if (!tb->mem_only) {
21
g_assert(current_cpu);
114
+ if (!tb_is_mem_only()) {
115
plugin_register_dyn_cb__udata(&tb->cbs, cb, flags, udata);
116
}
117
}
118
@@ -XXX,XX +XXX,XX @@ void qemu_plugin_register_vcpu_tb_exec_inline_per_vcpu(
119
qemu_plugin_u64 entry,
120
uint64_t imm)
121
{
122
- if (!tb->mem_only) {
123
+ if (!tb_is_mem_only()) {
124
plugin_register_inline_op_on_entry(&tb->cbs, 0, op, entry, imm);
125
}
126
}
127
@@ -XXX,XX +XXX,XX @@ void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn,
128
enum qemu_plugin_cb_flags flags,
129
void *udata)
130
{
131
- if (!insn->mem_only) {
132
+ if (!tb_is_mem_only()) {
133
plugin_register_dyn_cb__udata(&insn->insn_cbs, cb, flags, udata);
134
}
135
}
136
@@ -XXX,XX +XXX,XX @@ void qemu_plugin_register_vcpu_insn_exec_inline_per_vcpu(
137
qemu_plugin_u64 entry,
138
uint64_t imm)
139
{
140
- if (!insn->mem_only) {
141
+ if (!tb_is_mem_only()) {
142
plugin_register_inline_op_on_entry(&insn->insn_cbs, 0, op, entry, imm);
143
}
144
}
145
@@ -XXX,XX +XXX,XX @@ qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx)
146
return NULL;
147
}
148
insn = g_ptr_array_index(tb->insns, idx);
149
- insn->mem_only = tb->mem_only;
150
return insn;
151
}
152
22
153
--
23
--
154
2.34.1
24
2.43.0
155
25
156
26
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
The declarations use vaddr for size.
2
2
3
Previous commits replaced them by translator_ld* calls.
4
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Message-Id: <20240405131532.40913-1-philmd@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
4
---
9
include/exec/cpu_ldst.h | 10 ----------
5
accel/tcg/cputlb.c | 4 ++--
10
1 file changed, 10 deletions(-)
6
1 file changed, 2 insertions(+), 2 deletions(-)
11
7
12
diff --git a/include/exec/cpu_ldst.h b/include/exec/cpu_ldst.h
8
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
13
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
14
--- a/include/exec/cpu_ldst.h
10
--- a/accel/tcg/cputlb.c
15
+++ b/include/exec/cpu_ldst.h
11
+++ b/accel/tcg/cputlb.c
16
@@ -XXX,XX +XXX,XX @@ uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr addr);
12
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_full(CPUState *cpu, int mmu_idx,
17
uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr addr);
13
18
uint64_t cpu_ldq_code(CPUArchState *env, abi_ptr addr);
14
void tlb_set_page_with_attrs(CPUState *cpu, vaddr addr,
19
15
hwaddr paddr, MemTxAttrs attrs, int prot,
20
-static inline int cpu_ldsb_code(CPUArchState *env, abi_ptr addr)
16
- int mmu_idx, uint64_t size)
21
-{
17
+ int mmu_idx, vaddr size)
22
- return (int8_t)cpu_ldub_code(env, addr);
18
{
23
-}
19
CPUTLBEntryFull full = {
24
-
20
.phys_addr = paddr,
25
-static inline int cpu_ldsw_code(CPUArchState *env, abi_ptr addr)
21
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, vaddr addr,
26
-{
22
27
- return (int16_t)cpu_lduw_code(env, addr);
23
void tlb_set_page(CPUState *cpu, vaddr addr,
28
-}
24
hwaddr paddr, int prot,
29
-
25
- int mmu_idx, uint64_t size)
30
/**
26
+ int mmu_idx, vaddr size)
31
* tlb_vaddr_to_host:
27
{
32
* @env: CPUArchState
28
tlb_set_page_with_attrs(cpu, addr, paddr, MEMTXATTRS_UNSPECIFIED,
29
prot, mmu_idx, size);
33
--
30
--
34
2.34.1
31
2.43.0
35
36
diff view generated by jsdifflib
1
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
1
DisasContextBase.pc_next has type vaddr; use the correct log format.
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
4
---
5
target/microblaze/translate.c | 3 +--
5
target/loongarch/tcg/translate.c | 2 +-
6
1 file changed, 1 insertion(+), 2 deletions(-)
6
target/loongarch/tcg/insn_trans/trans_atomic.c.inc | 2 +-
7
2 files changed, 2 insertions(+), 2 deletions(-)
7
8
8
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
9
diff --git a/target/loongarch/tcg/translate.c b/target/loongarch/tcg/translate.c
9
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
10
--- a/target/microblaze/translate.c
11
--- a/target/loongarch/tcg/translate.c
11
+++ b/target/microblaze/translate.c
12
+++ b/target/loongarch/tcg/translate.c
12
@@ -XXX,XX +XXX,XX @@
13
@@ -XXX,XX +XXX,XX @@ static void loongarch_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
13
#include "tcg/tcg-op.h"
14
14
#include "exec/helper-proto.h"
15
if (!decode(ctx, ctx->opcode)) {
15
#include "exec/helper-gen.h"
16
qemu_log_mask(LOG_UNIMP, "Error: unknown opcode. "
16
-#include "exec/cpu_ldst.h"
17
- TARGET_FMT_lx ": 0x%x\n",
17
#include "exec/translator.h"
18
+ "0x%" VADDR_PRIx ": 0x%x\n",
18
#include "qemu/qemu-print.h"
19
ctx->base.pc_next, ctx->opcode);
19
20
generate_exception(ctx, EXCCODE_INE);
20
@@ -XXX,XX +XXX,XX @@ static void mb_tr_translate_insn(DisasContextBase *dcb, CPUState *cs)
21
}
21
22
diff --git a/target/loongarch/tcg/insn_trans/trans_atomic.c.inc b/target/loongarch/tcg/insn_trans/trans_atomic.c.inc
22
dc->tb_flags_to_set = 0;
23
index XXXXXXX..XXXXXXX 100644
23
24
--- a/target/loongarch/tcg/insn_trans/trans_atomic.c.inc
24
- ir = cpu_ldl_code(cpu_env(cs), dc->base.pc_next);
25
+++ b/target/loongarch/tcg/insn_trans/trans_atomic.c.inc
25
+ ir = translator_ldl(cpu_env(cs), &dc->base, dc->base.pc_next);
26
@@ -XXX,XX +XXX,XX @@ static bool gen_am(DisasContext *ctx, arg_rrr *a,
26
if (!decode(dc, ir)) {
27
if (a->rd != 0 && (a->rj == a->rd || a->rk == a->rd)) {
27
trap_illegal(dc, true);
28
qemu_log_mask(LOG_GUEST_ERROR,
29
"Warning: source register overlaps destination register"
30
- "in atomic insn at pc=0x" TARGET_FMT_lx "\n",
31
+ "in atomic insn at pc=0x%" VADDR_PRIx "\n",
32
ctx->base.pc_next - 4);
33
return false;
28
}
34
}
29
--
35
--
30
2.34.1
36
2.43.0
31
32
diff view generated by jsdifflib
1
Instead of returning a host pointer, copy the data into
1
Since we no longer support 64-bit guests on 32-bit hosts,
2
storage provided by the caller.
2
we can use a 32-bit type on a 32-bit host.
3
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
6
---
7
include/qemu/qemu-plugin.h | 15 +++++++--------
7
include/exec/vaddr.h | 16 +++++++++-------
8
contrib/plugins/execlog.c | 5 +++--
8
1 file changed, 9 insertions(+), 7 deletions(-)
9
contrib/plugins/howvec.c | 4 ++--
10
plugins/api.c | 7 +++++--
11
4 files changed, 17 insertions(+), 14 deletions(-)
12
9
13
diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
10
diff --git a/include/exec/vaddr.h b/include/exec/vaddr.h
14
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
15
--- a/include/qemu/qemu-plugin.h
12
--- a/include/exec/vaddr.h
16
+++ b/include/qemu/qemu-plugin.h
13
+++ b/include/exec/vaddr.h
17
@@ -XXX,XX +XXX,XX @@ typedef uint64_t qemu_plugin_id_t;
14
@@ -XXX,XX +XXX,XX @@
18
19
extern QEMU_PLUGIN_EXPORT int qemu_plugin_version;
20
21
-#define QEMU_PLUGIN_VERSION 2
22
+#define QEMU_PLUGIN_VERSION 3
23
24
/**
15
/**
25
* struct qemu_info_t - system information for plugins
16
* vaddr:
26
@@ -XXX,XX +XXX,XX @@ struct qemu_plugin_insn *
17
* Type wide enough to contain any #target_ulong virtual address.
27
qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx);
18
+ * We do not support 64-bit guest on 32-host and detect at configure time.
28
19
+ * Therefore, a host pointer width will always fit a guest pointer.
29
/**
30
- * qemu_plugin_insn_data() - return ptr to instruction data
31
+ * qemu_plugin_insn_data() - copy instruction data
32
* @insn: opaque instruction handle from qemu_plugin_tb_get_insn()
33
+ * @dest: destination into which data is copied
34
+ * @len: length of dest
35
*
36
- * Note: data is only valid for duration of callback. See
37
- * qemu_plugin_insn_size() to calculate size of stream.
38
- *
39
- * Returns: pointer to a stream of bytes containing the value of this
40
- * instructions opcode.
41
+ * Returns the number of bytes copied, minimum of @len and insn size.
42
*/
20
*/
43
QEMU_PLUGIN_API
21
-typedef uint64_t vaddr;
44
-const void *qemu_plugin_insn_data(const struct qemu_plugin_insn *insn);
22
-#define VADDR_PRId PRId64
45
+size_t qemu_plugin_insn_data(const struct qemu_plugin_insn *insn,
23
-#define VADDR_PRIu PRIu64
46
+ void *dest, size_t len);
24
-#define VADDR_PRIo PRIo64
47
25
-#define VADDR_PRIx PRIx64
48
/**
26
-#define VADDR_PRIX PRIX64
49
* qemu_plugin_insn_size() - return size of instruction
27
-#define VADDR_MAX UINT64_MAX
50
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
28
+typedef uintptr_t vaddr;
51
index XXXXXXX..XXXXXXX 100644
29
+#define VADDR_PRId PRIdPTR
52
--- a/contrib/plugins/execlog.c
30
+#define VADDR_PRIu PRIuPTR
53
+++ b/contrib/plugins/execlog.c
31
+#define VADDR_PRIo PRIoPTR
54
@@ -XXX,XX +XXX,XX @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
32
+#define VADDR_PRIx PRIxPTR
55
NULL);
33
+#define VADDR_PRIX PRIXPTR
56
}
34
+#define VADDR_MAX UINTPTR_MAX
57
} else {
35
58
- uint32_t insn_opcode;
36
#endif
59
- insn_opcode = *((uint32_t *)qemu_plugin_insn_data(insn));
60
+ uint32_t insn_opcode = 0;
61
+ qemu_plugin_insn_data(insn, &insn_opcode, sizeof(insn_opcode));
62
+
63
char *output = g_strdup_printf("0x%"PRIx64", 0x%"PRIx32", \"%s\"",
64
insn_vaddr, insn_opcode, insn_disas);
65
66
diff --git a/contrib/plugins/howvec.c b/contrib/plugins/howvec.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/contrib/plugins/howvec.c
69
+++ b/contrib/plugins/howvec.c
70
@@ -XXX,XX +XXX,XX @@ static struct qemu_plugin_scoreboard *find_counter(
71
{
72
int i;
73
uint64_t *cnt = NULL;
74
- uint32_t opcode;
75
+ uint32_t opcode = 0;
76
InsnClassExecCount *class = NULL;
77
78
/*
79
@@ -XXX,XX +XXX,XX @@ static struct qemu_plugin_scoreboard *find_counter(
80
* They would probably benefit from a more tailored plugin.
81
* However we can fall back to individual instruction counting.
82
*/
83
- opcode = *((uint32_t *)qemu_plugin_insn_data(insn));
84
+ qemu_plugin_insn_data(insn, &opcode, sizeof(opcode));
85
86
for (i = 0; !cnt && i < class_table_sz; i++) {
87
class = &class_table[i];
88
diff --git a/plugins/api.c b/plugins/api.c
89
index XXXXXXX..XXXXXXX 100644
90
--- a/plugins/api.c
91
+++ b/plugins/api.c
92
@@ -XXX,XX +XXX,XX @@ qemu_plugin_tb_get_insn(const struct qemu_plugin_tb *tb, size_t idx)
93
* instruction being translated.
94
*/
95
96
-const void *qemu_plugin_insn_data(const struct qemu_plugin_insn *insn)
97
+size_t qemu_plugin_insn_data(const struct qemu_plugin_insn *insn,
98
+ void *dest, size_t len)
99
{
100
- return insn->data->data;
101
+ len = MIN(len, insn->data->len);
102
+ memcpy(dest, insn->data->data, len);
103
+ return len;
104
}
105
106
size_t qemu_plugin_insn_size(const struct qemu_plugin_insn *insn)
107
--
37
--
108
2.34.1
38
2.43.0
109
39
110
40
diff view generated by jsdifflib
1
We have eliminated most uses of this hook. Reduce
1
Since we no longer support 64-bit guests on 32-bit hosts,
2
further by allowing the hook to handle only the
2
we can use a 32-bit type on a 32-bit host. This shrinks
3
special cases, returning false for normal processing.
3
the size of the structure to 16 bytes on a 32-bit host.
4
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
7
---
8
include/exec/translator.h | 2 +-
8
include/exec/tlb-common.h | 10 +++++-----
9
accel/tcg/translator.c | 5 ++---
9
accel/tcg/cputlb.c | 21 ++++-----------------
10
target/hppa/translate.c | 15 ++++++---------
10
tcg/arm/tcg-target.c.inc | 1 -
11
target/s390x/tcg/translate.c | 8 +++-----
11
tcg/mips/tcg-target.c.inc | 12 +++++-------
12
4 files changed, 12 insertions(+), 18 deletions(-)
12
tcg/ppc/tcg-target.c.inc | 21 +++++----------------
13
5 files changed, 19 insertions(+), 46 deletions(-)
13
14
14
diff --git a/include/exec/translator.h b/include/exec/translator.h
15
diff --git a/include/exec/tlb-common.h b/include/exec/tlb-common.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/translator.h
17
--- a/include/exec/tlb-common.h
17
+++ b/include/exec/translator.h
18
+++ b/include/exec/tlb-common.h
18
@@ -XXX,XX +XXX,XX @@ typedef struct TranslatorOps {
19
@@ -XXX,XX +XXX,XX @@
19
void (*insn_start)(DisasContextBase *db, CPUState *cpu);
20
#ifndef EXEC_TLB_COMMON_H
20
void (*translate_insn)(DisasContextBase *db, CPUState *cpu);
21
#define EXEC_TLB_COMMON_H 1
21
void (*tb_stop)(DisasContextBase *db, CPUState *cpu);
22
22
- void (*disas_log)(const DisasContextBase *db, CPUState *cpu, FILE *f);
23
-#define CPU_TLB_ENTRY_BITS 5
23
+ bool (*disas_log)(const DisasContextBase *db, CPUState *cpu, FILE *f);
24
+#define CPU_TLB_ENTRY_BITS (HOST_LONG_BITS == 32 ? 4 : 5)
24
} TranslatorOps;
25
25
26
/* Minimalized TLB entry for use by TCG fast path. */
26
/**
27
typedef union CPUTLBEntry {
27
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
28
struct {
29
- uint64_t addr_read;
30
- uint64_t addr_write;
31
- uint64_t addr_code;
32
+ uintptr_t addr_read;
33
+ uintptr_t addr_write;
34
+ uintptr_t addr_code;
35
/*
36
* Addend to virtual address to get host address. IO accesses
37
* use the corresponding iotlb value.
38
@@ -XXX,XX +XXX,XX @@ typedef union CPUTLBEntry {
39
* Padding to get a power of two size, as well as index
40
* access to addr_{read,write,code}.
41
*/
42
- uint64_t addr_idx[(1 << CPU_TLB_ENTRY_BITS) / sizeof(uint64_t)];
43
+ uintptr_t addr_idx[(1 << CPU_TLB_ENTRY_BITS) / sizeof(uintptr_t)];
44
} CPUTLBEntry;
45
46
QEMU_BUILD_BUG_ON(sizeof(CPUTLBEntry) != (1 << CPU_TLB_ENTRY_BITS));
47
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
28
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
29
--- a/accel/tcg/translator.c
49
--- a/accel/tcg/cputlb.c
30
+++ b/accel/tcg/translator.c
50
+++ b/accel/tcg/cputlb.c
31
@@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
51
@@ -XXX,XX +XXX,XX @@ static inline uint64_t tlb_read_idx(const CPUTLBEntry *entry,
32
if (logfile) {
52
{
33
fprintf(logfile, "----------------\n");
53
/* Do not rearrange the CPUTLBEntry structure members. */
34
54
QEMU_BUILD_BUG_ON(offsetof(CPUTLBEntry, addr_read) !=
35
- if (ops->disas_log) {
55
- MMU_DATA_LOAD * sizeof(uint64_t));
36
- ops->disas_log(db, cpu, logfile);
56
+ MMU_DATA_LOAD * sizeof(uintptr_t));
37
- } else {
57
QEMU_BUILD_BUG_ON(offsetof(CPUTLBEntry, addr_write) !=
38
+ if (!ops->disas_log ||
58
- MMU_DATA_STORE * sizeof(uint64_t));
39
+ !ops->disas_log(db, cpu, logfile)) {
59
+ MMU_DATA_STORE * sizeof(uintptr_t));
40
fprintf(logfile, "IN: %s\n", lookup_symbol(db->pc_first));
60
QEMU_BUILD_BUG_ON(offsetof(CPUTLBEntry, addr_code) !=
41
target_disas(logfile, cpu, db->pc_first, db->tb->size);
61
- MMU_INST_FETCH * sizeof(uint64_t));
42
}
62
+ MMU_INST_FETCH * sizeof(uintptr_t));
43
diff --git a/target/hppa/translate.c b/target/hppa/translate.c
63
44
index XXXXXXX..XXXXXXX 100644
64
-#if TARGET_LONG_BITS == 32
45
--- a/target/hppa/translate.c
65
- /* Use qatomic_read, in case of addr_write; only care about low bits. */
46
+++ b/target/hppa/translate.c
66
- const uint32_t *ptr = (uint32_t *)&entry->addr_idx[access_type];
47
@@ -XXX,XX +XXX,XX @@
67
- ptr += HOST_BIG_ENDIAN;
48
68
- return qatomic_read(ptr);
49
#include "qemu/osdep.h"
69
-#else
50
#include "cpu.h"
70
- const uint64_t *ptr = &entry->addr_idx[access_type];
51
-#include "disas/disas.h"
71
+ const uintptr_t *ptr = &entry->addr_idx[access_type];
52
#include "qemu/host-utils.h"
72
/* ofs might correspond to .addr_write, so use qatomic_read */
53
#include "exec/exec-all.h"
73
return qatomic_read(ptr);
54
#include "exec/page-protection.h"
74
-#endif
55
@@ -XXX,XX +XXX,XX @@ static void hppa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
56
}
75
}
57
76
58
#ifdef CONFIG_USER_ONLY
77
static inline uint64_t tlb_addr_write(const CPUTLBEntry *entry)
59
-static void hppa_tr_disas_log(const DisasContextBase *dcbase,
78
@@ -XXX,XX +XXX,XX @@ static void tlb_reset_dirty_range_locked(CPUTLBEntry *tlb_entry,
60
+static bool hppa_tr_disas_log(const DisasContextBase *dcbase,
79
addr &= TARGET_PAGE_MASK;
61
CPUState *cs, FILE *logfile)
80
addr += tlb_entry->addend;
62
{
81
if ((addr - start) < length) {
63
target_ulong pc = dcbase->pc_first;
82
-#if TARGET_LONG_BITS == 32
64
@@ -XXX,XX +XXX,XX @@ static void hppa_tr_disas_log(const DisasContextBase *dcbase,
83
- uint32_t *ptr_write = (uint32_t *)&tlb_entry->addr_write;
65
switch (pc) {
84
- ptr_write += HOST_BIG_ENDIAN;
66
case 0x00:
85
- qatomic_set(ptr_write, *ptr_write | TLB_NOTDIRTY);
67
fprintf(logfile, "IN:\n0x00000000: (null)\n");
86
-#else
68
- return;
87
qatomic_set(&tlb_entry->addr_write,
69
+ return true;
88
tlb_entry->addr_write | TLB_NOTDIRTY);
70
case 0xb0:
89
-#endif
71
fprintf(logfile, "IN:\n0x000000b0: light-weight-syscall\n");
90
}
72
- return;
73
+ return true;
74
case 0xe0:
75
fprintf(logfile, "IN:\n0x000000e0: set-thread-pointer-syscall\n");
76
- return;
77
+ return true;
78
case 0x100:
79
fprintf(logfile, "IN:\n0x00000100: syscall\n");
80
- return;
81
+ return true;
82
}
83
-
84
- fprintf(logfile, "IN: %s\n", lookup_symbol(pc));
85
- target_disas(logfile, cs, pc, dcbase->tb->size);
86
+ return false;
87
}
88
#endif
89
90
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/target/s390x/tcg/translate.c
93
+++ b/target/s390x/tcg/translate.c
94
@@ -XXX,XX +XXX,XX @@
95
#include "qemu/osdep.h"
96
#include "cpu.h"
97
#include "s390x-internal.h"
98
-#include "disas/disas.h"
99
#include "exec/exec-all.h"
100
#include "tcg/tcg-op.h"
101
#include "tcg/tcg-op-gvec.h"
102
@@ -XXX,XX +XXX,XX @@ static void s390x_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
103
}
91
}
104
}
92
}
105
93
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
106
-static void s390x_tr_disas_log(const DisasContextBase *dcbase,
94
index XXXXXXX..XXXXXXX 100644
107
+static bool s390x_tr_disas_log(const DisasContextBase *dcbase,
95
--- a/tcg/arm/tcg-target.c.inc
108
CPUState *cs, FILE *logfile)
96
+++ b/tcg/arm/tcg-target.c.inc
109
{
97
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
110
DisasContext *dc = container_of(dcbase, DisasContext, base);
98
* Add the tlb_table pointer, creating the CPUTLBEntry address in R1.
111
@@ -XXX,XX +XXX,XX @@ static void s390x_tr_disas_log(const DisasContextBase *dcbase,
99
* Load the tlb comparator into R2 and the fast path addend into R1.
112
if (unlikely(dc->ex_value)) {
100
*/
113
/* ??? Unfortunately target_disas can't use host memory. */
101
- QEMU_BUILD_BUG_ON(HOST_BIG_ENDIAN);
114
fprintf(logfile, "IN: EXECUTE %016" PRIx64, dc->ex_value);
102
if (cmp_off == 0) {
115
- } else {
103
tcg_out_ld32_rwb(s, COND_AL, TCG_REG_R2, TCG_REG_R1, TCG_REG_R0);
116
- fprintf(logfile, "IN: %s\n", lookup_symbol(dc->base.pc_first));
104
} else {
117
- target_disas(logfile, cs, dc->base.pc_first, dc->base.tb->size);
105
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
118
+ return true;
106
index XXXXXXX..XXXXXXX 100644
119
}
107
--- a/tcg/mips/tcg-target.c.inc
120
+ return false;
108
+++ b/tcg/mips/tcg-target.c.inc
121
}
109
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
122
110
/* Add the tlb_table pointer, creating the CPUTLBEntry address. */
123
static const TranslatorOps s390x_tr_ops = {
111
tcg_out_opc_reg(s, ALIAS_PADD, TCG_TMP3, TCG_TMP3, TCG_TMP1);
112
113
- if (TCG_TARGET_REG_BITS == 32 || addr_type == TCG_TYPE_I32) {
114
- /* Load the (low half) tlb comparator. */
115
+ /* Load the tlb comparator. */
116
+ if (TCG_TARGET_REG_BITS == 64 && addr_type == TCG_TYPE_I32) {
117
tcg_out_ld(s, TCG_TYPE_I32, TCG_TMP0, TCG_TMP3,
118
cmp_off + HOST_BIG_ENDIAN * 4);
119
} else {
120
- tcg_out_ld(s, TCG_TYPE_I64, TCG_TMP0, TCG_TMP3, cmp_off);
121
+ tcg_out_ld(s, TCG_TYPE_REG, TCG_TMP0, TCG_TMP3, cmp_off);
122
}
123
124
- if (TCG_TARGET_REG_BITS == 64 || addr_type == TCG_TYPE_I32) {
125
- /* Load the tlb addend for the fast path. */
126
- tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP3, TCG_TMP3, add_off);
127
- }
128
+ /* Load the tlb addend for the fast path. */
129
+ tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP3, TCG_TMP3, add_off);
130
131
/*
132
* Mask the page bits, keeping the alignment bits to compare against.
133
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
134
index XXXXXXX..XXXXXXX 100644
135
--- a/tcg/ppc/tcg-target.c.inc
136
+++ b/tcg/ppc/tcg-target.c.inc
137
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
138
tcg_out32(s, AND | SAB(TCG_REG_TMP1, TCG_REG_TMP1, TCG_REG_R0));
139
140
/*
141
- * Load the (low part) TLB comparator into TMP2.
142
+ * Load the TLB comparator into TMP2.
143
* For 64-bit host, always load the entire 64-bit slot for simplicity.
144
* We will ignore the high bits with tcg_out_cmp(..., addr_type).
145
*/
146
- if (TCG_TARGET_REG_BITS == 64) {
147
- if (cmp_off == 0) {
148
- tcg_out32(s, LDUX | TAB(TCG_REG_TMP2,
149
- TCG_REG_TMP1, TCG_REG_TMP2));
150
- } else {
151
- tcg_out32(s, ADD | TAB(TCG_REG_TMP1,
152
- TCG_REG_TMP1, TCG_REG_TMP2));
153
- tcg_out_ld(s, TCG_TYPE_I64, TCG_REG_TMP2,
154
- TCG_REG_TMP1, cmp_off);
155
- }
156
- } else if (cmp_off == 0 && !HOST_BIG_ENDIAN) {
157
- tcg_out32(s, LWZUX | TAB(TCG_REG_TMP2,
158
- TCG_REG_TMP1, TCG_REG_TMP2));
159
+ if (cmp_off == 0) {
160
+ tcg_out32(s, (TCG_TARGET_REG_BITS == 64 ? LDUX : LWZUX)
161
+ | TAB(TCG_REG_TMP2, TCG_REG_TMP1, TCG_REG_TMP2));
162
} else {
163
tcg_out32(s, ADD | TAB(TCG_REG_TMP1, TCG_REG_TMP1, TCG_REG_TMP2));
164
- tcg_out_ld(s, TCG_TYPE_I32, TCG_REG_TMP2, TCG_REG_TMP1,
165
- cmp_off + 4 * HOST_BIG_ENDIAN);
166
+ tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP2, TCG_REG_TMP1, cmp_off);
167
}
168
169
/*
124
--
170
--
125
2.34.1
171
2.43.0
126
172
127
173
diff view generated by jsdifflib
1
For loongarch, mips, riscv and sparc, a zero register is
2
available all the time. For aarch64, register index 31
3
depends on context: sometimes it is the stack pointer,
4
and sometimes it is the zero register.
5
6
Introduce a new general-purpose constraint which maps 0
7
to TCG_REG_ZERO, if defined. This differs from existing
8
constant constraints in that const_arg[*] is recorded as
9
false, indicating that the value is in a register.
10
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
13
---
4
include/tcg/tcg.h | 1 +
14
include/tcg/tcg.h | 3 ++-
5
accel/tcg/plugin-gen.c | 1 +
15
tcg/aarch64/tcg-target.h | 2 ++
6
2 files changed, 2 insertions(+)
16
tcg/loongarch64/tcg-target.h | 2 ++
17
tcg/mips/tcg-target.h | 2 ++
18
tcg/riscv/tcg-target.h | 2 ++
19
tcg/sparc64/tcg-target.h | 3 ++-
20
tcg/tcg.c | 29 ++++++++++++++++++++++-------
21
docs/devel/tcg-ops.rst | 4 +++-
22
8 files changed, 37 insertions(+), 10 deletions(-)
7
23
8
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
24
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
9
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
10
--- a/include/tcg/tcg.h
26
--- a/include/tcg/tcg.h
11
+++ b/include/tcg/tcg.h
27
+++ b/include/tcg/tcg.h
12
@@ -XXX,XX +XXX,XX @@ struct TCGContext {
28
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *, int,
13
* space for instructions (for variable-instruction-length ISAs).
29
14
*/
30
void tcg_set_frame(TCGContext *s, TCGReg reg, intptr_t start, intptr_t size);
15
struct qemu_plugin_tb *plugin_tb;
31
16
+ const struct DisasContextBase *plugin_db;
32
-#define TCG_CT_CONST 1 /* any constant of register size */
17
33
+#define TCG_CT_CONST 1 /* any constant of register size */
18
/* descriptor of the instruction being translated */
34
+#define TCG_CT_REG_ZERO 2 /* zero, in TCG_REG_ZERO */
19
struct qemu_plugin_insn *plugin_insn;
35
20
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
36
typedef struct TCGArgConstraint {
37
unsigned ct : 16;
38
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
21
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
22
--- a/accel/tcg/plugin-gen.c
40
--- a/tcg/aarch64/tcg-target.h
23
+++ b/accel/tcg/plugin-gen.c
41
+++ b/tcg/aarch64/tcg-target.h
24
@@ -XXX,XX +XXX,XX @@ bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db,
42
@@ -XXX,XX +XXX,XX @@ typedef enum {
25
tcg_gen_plugin_cb(PLUGIN_GEN_FROM_TB);
43
TCG_AREG0 = TCG_REG_X19,
26
}
44
} TCGReg;
27
45
28
+ tcg_ctx->plugin_db = db;
46
+#define TCG_REG_ZERO TCG_REG_XZR
29
tcg_ctx->plugin_insn = NULL;
47
+
30
48
#define TCG_TARGET_NB_REGS 64
31
return ret;
49
50
#endif /* AARCH64_TCG_TARGET_H */
51
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
52
index XXXXXXX..XXXXXXX 100644
53
--- a/tcg/loongarch64/tcg-target.h
54
+++ b/tcg/loongarch64/tcg-target.h
55
@@ -XXX,XX +XXX,XX @@ typedef enum {
56
TCG_VEC_TMP0 = TCG_REG_V23,
57
} TCGReg;
58
59
+#define TCG_REG_ZERO TCG_REG_ZERO
60
+
61
#endif /* LOONGARCH_TCG_TARGET_H */
62
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
63
index XXXXXXX..XXXXXXX 100644
64
--- a/tcg/mips/tcg-target.h
65
+++ b/tcg/mips/tcg-target.h
66
@@ -XXX,XX +XXX,XX @@ typedef enum {
67
TCG_AREG0 = TCG_REG_S8,
68
} TCGReg;
69
70
+#define TCG_REG_ZERO TCG_REG_ZERO
71
+
72
#endif
73
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
74
index XXXXXXX..XXXXXXX 100644
75
--- a/tcg/riscv/tcg-target.h
76
+++ b/tcg/riscv/tcg-target.h
77
@@ -XXX,XX +XXX,XX @@ typedef enum {
78
TCG_REG_TMP2 = TCG_REG_T4,
79
} TCGReg;
80
81
+#define TCG_REG_ZERO TCG_REG_ZERO
82
+
83
#endif
84
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
85
index XXXXXXX..XXXXXXX 100644
86
--- a/tcg/sparc64/tcg-target.h
87
+++ b/tcg/sparc64/tcg-target.h
88
@@ -XXX,XX +XXX,XX @@ typedef enum {
89
TCG_REG_I7,
90
} TCGReg;
91
92
-#define TCG_AREG0 TCG_REG_I0
93
+#define TCG_AREG0 TCG_REG_I0
94
+#define TCG_REG_ZERO TCG_REG_G0
95
96
#endif
97
diff --git a/tcg/tcg.c b/tcg/tcg.c
98
index XXXXXXX..XXXXXXX 100644
99
--- a/tcg/tcg.c
100
+++ b/tcg/tcg.c
101
@@ -XXX,XX +XXX,XX @@ static void process_constraint_sets(void)
102
case 'i':
103
args_ct[i].ct |= TCG_CT_CONST;
104
break;
105
+#ifdef TCG_REG_ZERO
106
+ case 'z':
107
+ args_ct[i].ct |= TCG_CT_REG_ZERO;
108
+ break;
109
+#endif
110
111
/* Include all of the target-specific constraints. */
112
113
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
114
arg_ct = &args_ct[i];
115
ts = arg_temp(arg);
116
117
- if (ts->val_type == TEMP_VAL_CONST
118
- && tcg_target_const_match(ts->val, arg_ct->ct, ts->type,
119
- op_cond, TCGOP_VECE(op))) {
120
- /* constant is OK for instruction */
121
- const_args[i] = 1;
122
- new_args[i] = ts->val;
123
- continue;
124
+ if (ts->val_type == TEMP_VAL_CONST) {
125
+#ifdef TCG_REG_ZERO
126
+ if (ts->val == 0 && (arg_ct->ct & TCG_CT_REG_ZERO)) {
127
+ /* Hardware zero register: indicate register via non-const. */
128
+ const_args[i] = 0;
129
+ new_args[i] = TCG_REG_ZERO;
130
+ continue;
131
+ }
132
+#endif
133
+
134
+ if (tcg_target_const_match(ts->val, arg_ct->ct, ts->type,
135
+ op_cond, TCGOP_VECE(op))) {
136
+ /* constant is OK for instruction */
137
+ const_args[i] = 1;
138
+ new_args[i] = ts->val;
139
+ continue;
140
+ }
141
}
142
143
reg = ts->reg;
144
diff --git a/docs/devel/tcg-ops.rst b/docs/devel/tcg-ops.rst
145
index XXXXXXX..XXXXXXX 100644
146
--- a/docs/devel/tcg-ops.rst
147
+++ b/docs/devel/tcg-ops.rst
148
@@ -XXX,XX +XXX,XX @@ operation uses a constant input constraint which does not allow all
149
constants, it must also accept registers in order to have a fallback.
150
The constraint '``i``' is defined generically to accept any constant.
151
The constraint '``r``' is not defined generically, but is consistently
152
-used by each backend to indicate all registers.
153
+used by each backend to indicate all registers. If ``TCG_REG_ZERO``
154
+is defined by the backend, the constraint '``z``' is defined generically
155
+to map constant 0 to the hardware zero register.
156
157
The movi_i32 and movi_i64 operations must accept any constants.
158
32
--
159
--
33
2.34.1
160
2.43.0
34
161
35
162
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Note that 'Z' is still used for addsub2.
2
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
---
4
include/exec/translator.h | 21 +++++++++------------
5
tcg/aarch64/tcg-target-con-set.h | 12 ++++-----
5
accel/tcg/translator.c | 15 ++++++++-------
6
tcg/aarch64/tcg-target.c.inc | 46 ++++++++++++++------------------
6
target/hexagon/translate.c | 1 +
7
2 files changed, 26 insertions(+), 32 deletions(-)
7
target/microblaze/translate.c | 1 +
8
4 files changed, 19 insertions(+), 19 deletions(-)
9
8
10
diff --git a/include/exec/translator.h b/include/exec/translator.h
9
diff --git a/tcg/aarch64/tcg-target-con-set.h b/tcg/aarch64/tcg-target-con-set.h
11
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
12
--- a/include/exec/translator.h
11
--- a/tcg/aarch64/tcg-target-con-set.h
13
+++ b/include/exec/translator.h
12
+++ b/tcg/aarch64/tcg-target-con-set.h
14
@@ -XXX,XX +XXX,XX @@
13
@@ -XXX,XX +XXX,XX @@
15
*/
14
*/
16
15
C_O0_I1(r)
17
#include "qemu/bswap.h"
16
C_O0_I2(r, rC)
18
-#include "exec/cpu-common.h"
17
-C_O0_I2(rZ, r)
19
-#include "exec/cpu-defs.h"
18
+C_O0_I2(rz, r)
20
-#include "exec/abi_ptr.h"
19
C_O0_I2(w, r)
21
-#include "cpu.h"
20
-C_O0_I3(rZ, rZ, r)
22
+#include "exec/vaddr.h"
21
+C_O0_I3(rz, rz, r)
23
22
C_O1_I1(r, r)
24
/**
23
C_O1_I1(w, r)
25
* gen_intermediate_code
24
C_O1_I1(w, w)
26
@@ -XXX,XX +XXX,XX @@ bool translator_io_start(DisasContextBase *db);
25
C_O1_I1(w, wr)
27
* the relevant information at translation time.
26
-C_O1_I2(r, 0, rZ)
28
*/
27
+C_O1_I2(r, 0, rz)
29
28
C_O1_I2(r, r, r)
30
-uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, abi_ptr pc);
29
C_O1_I2(r, r, rA)
31
-uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, abi_ptr pc);
30
C_O1_I2(r, r, rAL)
32
-uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, abi_ptr pc);
31
C_O1_I2(r, r, rC)
33
-uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, abi_ptr pc);
32
C_O1_I2(r, r, ri)
34
+uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc);
33
C_O1_I2(r, r, rL)
35
+uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc);
34
-C_O1_I2(r, rZ, rZ)
36
+uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc);
35
+C_O1_I2(r, rz, rz)
37
+uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc);
36
C_O1_I2(w, 0, w)
38
37
C_O1_I2(w, w, w)
39
static inline uint16_t
38
C_O1_I2(w, w, wN)
40
translator_lduw_swap(CPUArchState *env, DisasContextBase *db,
39
C_O1_I2(w, w, wO)
41
- abi_ptr pc, bool do_swap)
40
C_O1_I2(w, w, wZ)
42
+ vaddr pc, bool do_swap)
41
C_O1_I3(w, w, w, w)
43
{
42
-C_O1_I4(r, r, rC, rZ, rZ)
44
uint16_t ret = translator_lduw(env, db, pc);
43
+C_O1_I4(r, r, rC, rz, rz)
45
if (do_swap) {
44
C_O2_I1(r, r, r)
46
@@ -XXX,XX +XXX,XX @@ translator_lduw_swap(CPUArchState *env, DisasContextBase *db,
45
-C_O2_I4(r, r, rZ, rZ, rA, rMZ)
47
46
+C_O2_I4(r, r, rz, rz, rA, rMZ)
48
static inline uint32_t
47
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
49
translator_ldl_swap(CPUArchState *env, DisasContextBase *db,
50
- abi_ptr pc, bool do_swap)
51
+ vaddr pc, bool do_swap)
52
{
53
uint32_t ret = translator_ldl(env, db, pc);
54
if (do_swap) {
55
@@ -XXX,XX +XXX,XX @@ translator_ldl_swap(CPUArchState *env, DisasContextBase *db,
56
57
static inline uint64_t
58
translator_ldq_swap(CPUArchState *env, DisasContextBase *db,
59
- abi_ptr pc, bool do_swap)
60
+ vaddr pc, bool do_swap)
61
{
62
uint64_t ret = translator_ldq(env, db, pc);
63
if (do_swap) {
64
@@ -XXX,XX +XXX,XX @@ translator_ldq_swap(CPUArchState *env, DisasContextBase *db,
65
* re-synthesised for s390x "ex"). It ensures we update other areas of
66
* the translator with details of the executed instruction.
67
*/
68
-void translator_fake_ldb(uint8_t insn8, abi_ptr pc);
69
+void translator_fake_ldb(uint8_t insn8, vaddr pc);
70
71
/*
72
* Return whether addr is on the same page as where disassembly started.
73
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
74
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
75
--- a/accel/tcg/translator.c
49
--- a/tcg/aarch64/tcg-target.c.inc
76
+++ b/accel/tcg/translator.c
50
+++ b/tcg/aarch64/tcg-target.c.inc
77
@@ -XXX,XX +XXX,XX @@
51
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
78
#include "exec/translator.h"
52
TCGArg a2 = args[2];
79
#include "exec/cpu_ldst.h"
53
int c2 = const_args[2];
80
#include "exec/plugin-gen.h"
54
81
+#include "exec/cpu_ldst.h"
55
- /* Some operands are defined with "rZ" constraint, a register or
82
#include "tcg/tcg-op-common.h"
56
- the zero register. These need not actually test args[I] == 0. */
83
#include "internal-target.h"
57
-#define REG0(I) (const_args[I] ? TCG_REG_XZR : (TCGReg)args[I])
84
58
-
85
@@ -XXX,XX +XXX,XX @@ static void *translator_access(CPUArchState *env, DisasContextBase *db,
59
switch (opc) {
86
return host + (pc - base);
60
case INDEX_op_goto_ptr:
61
tcg_out_insn(s, 3207, BR, a0);
62
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
63
64
case INDEX_op_st8_i32:
65
case INDEX_op_st8_i64:
66
- tcg_out_ldst(s, I3312_STRB, REG0(0), a1, a2, 0);
67
+ tcg_out_ldst(s, I3312_STRB, a0, a1, a2, 0);
68
break;
69
case INDEX_op_st16_i32:
70
case INDEX_op_st16_i64:
71
- tcg_out_ldst(s, I3312_STRH, REG0(0), a1, a2, 1);
72
+ tcg_out_ldst(s, I3312_STRH, a0, a1, a2, 1);
73
break;
74
case INDEX_op_st_i32:
75
case INDEX_op_st32_i64:
76
- tcg_out_ldst(s, I3312_STRW, REG0(0), a1, a2, 2);
77
+ tcg_out_ldst(s, I3312_STRW, a0, a1, a2, 2);
78
break;
79
case INDEX_op_st_i64:
80
- tcg_out_ldst(s, I3312_STRX, REG0(0), a1, a2, 3);
81
+ tcg_out_ldst(s, I3312_STRX, a0, a1, a2, 3);
82
break;
83
84
case INDEX_op_add_i32:
85
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
86
/* FALLTHRU */
87
case INDEX_op_movcond_i64:
88
tcg_out_cmp(s, ext, args[5], a1, a2, c2);
89
- tcg_out_insn(s, 3506, CSEL, ext, a0, REG0(3), REG0(4), args[5]);
90
+ tcg_out_insn(s, 3506, CSEL, ext, a0, args[3], args[4], args[5]);
91
break;
92
93
case INDEX_op_qemu_ld_i32:
94
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
95
break;
96
case INDEX_op_qemu_st_i32:
97
case INDEX_op_qemu_st_i64:
98
- tcg_out_qemu_st(s, REG0(0), a1, a2, ext);
99
+ tcg_out_qemu_st(s, a0, a1, a2, ext);
100
break;
101
case INDEX_op_qemu_ld_i128:
102
tcg_out_qemu_ldst_i128(s, a0, a1, a2, args[3], true);
103
break;
104
case INDEX_op_qemu_st_i128:
105
- tcg_out_qemu_ldst_i128(s, REG0(0), REG0(1), a2, args[3], false);
106
+ tcg_out_qemu_ldst_i128(s, a0, a1, a2, args[3], false);
107
break;
108
109
case INDEX_op_bswap64_i64:
110
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
111
112
case INDEX_op_deposit_i64:
113
case INDEX_op_deposit_i32:
114
- tcg_out_dep(s, ext, a0, REG0(2), args[3], args[4]);
115
+ tcg_out_dep(s, ext, a0, a2, args[3], args[4]);
116
break;
117
118
case INDEX_op_extract_i64:
119
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
120
121
case INDEX_op_extract2_i64:
122
case INDEX_op_extract2_i32:
123
- tcg_out_extr(s, ext, a0, REG0(2), REG0(1), args[3]);
124
+ tcg_out_extr(s, ext, a0, a2, a1, args[3]);
125
break;
126
127
case INDEX_op_add2_i32:
128
- tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, REG0(2), REG0(3),
129
+ tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, a2, args[3],
130
(int32_t)args[4], args[5], const_args[4],
131
const_args[5], false);
132
break;
133
case INDEX_op_add2_i64:
134
- tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, REG0(2), REG0(3), args[4],
135
+ tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, a2, args[3], args[4],
136
args[5], const_args[4], const_args[5], false);
137
break;
138
case INDEX_op_sub2_i32:
139
- tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, REG0(2), REG0(3),
140
+ tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, a2, args[3],
141
(int32_t)args[4], args[5], const_args[4],
142
const_args[5], true);
143
break;
144
case INDEX_op_sub2_i64:
145
- tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, REG0(2), REG0(3), args[4],
146
+ tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, a2, args[3], args[4],
147
args[5], const_args[4], const_args[5], true);
148
break;
149
150
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
151
default:
152
g_assert_not_reached();
153
}
154
-
155
-#undef REG0
87
}
156
}
88
157
89
-static void plugin_insn_append(abi_ptr pc, const void *from, size_t size)
158
static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
90
+static void plugin_insn_append(vaddr pc, const void *from, size_t size)
159
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
91
{
160
case INDEX_op_st16_i64:
92
#ifdef CONFIG_PLUGIN
161
case INDEX_op_st32_i64:
93
struct qemu_plugin_insn *insn = tcg_ctx->plugin_insn;
162
case INDEX_op_st_i64:
94
- abi_ptr off;
163
- return C_O0_I2(rZ, r);
95
+ size_t off;
164
+ return C_O0_I2(rz, r);
96
165
97
if (insn == NULL) {
166
case INDEX_op_add_i32:
98
return;
167
case INDEX_op_add_i64:
99
@@ -XXX,XX +XXX,XX @@ static void plugin_insn_append(abi_ptr pc, const void *from, size_t size)
168
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
100
#endif
169
101
}
170
case INDEX_op_movcond_i32:
102
171
case INDEX_op_movcond_i64:
103
-uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, abi_ptr pc)
172
- return C_O1_I4(r, r, rC, rZ, rZ);
104
+uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc)
173
+ return C_O1_I4(r, r, rC, rz, rz);
105
{
174
106
uint8_t ret;
175
case INDEX_op_qemu_ld_i32:
107
void *p = translator_access(env, db, pc, sizeof(ret));
176
case INDEX_op_qemu_ld_i64:
108
@@ -XXX,XX +XXX,XX @@ uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, abi_ptr pc)
177
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
109
return ret;
178
return C_O2_I1(r, r, r);
110
}
179
case INDEX_op_qemu_st_i32:
111
180
case INDEX_op_qemu_st_i64:
112
-uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, abi_ptr pc)
181
- return C_O0_I2(rZ, r);
113
+uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc)
182
+ return C_O0_I2(rz, r);
114
{
183
case INDEX_op_qemu_st_i128:
115
uint16_t ret, plug;
184
- return C_O0_I3(rZ, rZ, r);
116
void *p = translator_access(env, db, pc, sizeof(ret));
185
+ return C_O0_I3(rz, rz, r);
117
@@ -XXX,XX +XXX,XX @@ uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, abi_ptr pc)
186
118
return ret;
187
case INDEX_op_deposit_i32:
119
}
188
case INDEX_op_deposit_i64:
120
189
- return C_O1_I2(r, 0, rZ);
121
-uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, abi_ptr pc)
190
+ return C_O1_I2(r, 0, rz);
122
+uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc)
191
123
{
192
case INDEX_op_extract2_i32:
124
uint32_t ret, plug;
193
case INDEX_op_extract2_i64:
125
void *p = translator_access(env, db, pc, sizeof(ret));
194
- return C_O1_I2(r, rZ, rZ);
126
@@ -XXX,XX +XXX,XX @@ uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, abi_ptr pc)
195
+ return C_O1_I2(r, rz, rz);
127
return ret;
196
128
}
197
case INDEX_op_add2_i32:
129
198
case INDEX_op_add2_i64:
130
-uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, abi_ptr pc)
199
case INDEX_op_sub2_i32:
131
+uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
200
case INDEX_op_sub2_i64:
132
{
201
- return C_O2_I4(r, r, rZ, rZ, rA, rMZ);
133
uint64_t ret, plug;
202
+ return C_O2_I4(r, r, rz, rz, rA, rMZ);
134
void *p = translator_access(env, db, pc, sizeof(ret));
203
135
@@ -XXX,XX +XXX,XX @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, abi_ptr pc)
204
case INDEX_op_add_vec:
136
return ret;
205
case INDEX_op_sub_vec:
137
}
138
139
-void translator_fake_ldb(uint8_t insn8, abi_ptr pc)
140
+void translator_fake_ldb(uint8_t insn8, vaddr pc)
141
{
142
plugin_insn_append(pc, &insn8, sizeof(insn8));
143
}
144
diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
145
index XXXXXXX..XXXXXXX 100644
146
--- a/target/hexagon/translate.c
147
+++ b/target/hexagon/translate.c
148
@@ -XXX,XX +XXX,XX @@
149
#include "exec/translation-block.h"
150
#include "exec/cpu_ldst.h"
151
#include "exec/log.h"
152
+#include "exec/cpu_ldst.h"
153
#include "internal.h"
154
#include "attribs.h"
155
#include "insn.h"
156
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
157
index XXXXXXX..XXXXXXX 100644
158
--- a/target/microblaze/translate.c
159
+++ b/target/microblaze/translate.c
160
@@ -XXX,XX +XXX,XX @@
161
#include "tcg/tcg-op.h"
162
#include "exec/helper-proto.h"
163
#include "exec/helper-gen.h"
164
+#include "exec/cpu_ldst.h"
165
#include "exec/translator.h"
166
#include "qemu/qemu-print.h"
167
168
--
206
--
169
2.34.1
207
2.43.0
170
171
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
include/exec/translator.h | 5 +++--
5
accel/tcg/translator.c | 2 +-
6
target/s390x/tcg/translate.c | 2 +-
7
3 files changed, 5 insertions(+), 4 deletions(-)
8
1
9
diff --git a/include/exec/translator.h b/include/exec/translator.h
10
index XXXXXXX..XXXXXXX 100644
11
--- a/include/exec/translator.h
12
+++ b/include/exec/translator.h
13
@@ -XXX,XX +XXX,XX @@ translator_ldq_swap(CPUArchState *env, DisasContextBase *db,
14
15
/**
16
* translator_fake_ldb - fake instruction load
17
- * @insn8: byte of instruction
18
+ * @db: Disassembly context
19
* @pc: program counter of instruction
20
+ * @insn8: byte of instruction
21
*
22
* This is a special case helper used where the instruction we are
23
* about to translate comes from somewhere else (e.g. being
24
* re-synthesised for s390x "ex"). It ensures we update other areas of
25
* the translator with details of the executed instruction.
26
*/
27
-void translator_fake_ldb(uint8_t insn8, vaddr pc);
28
+void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8);
29
30
#ifdef COMPILING_PER_TARGET
31
/*
32
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/accel/tcg/translator.c
35
+++ b/accel/tcg/translator.c
36
@@ -XXX,XX +XXX,XX @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
37
return ret;
38
}
39
40
-void translator_fake_ldb(uint8_t insn8, vaddr pc)
41
+void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8)
42
{
43
plugin_insn_append(pc, &insn8, sizeof(insn8));
44
}
45
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/s390x/tcg/translate.c
48
+++ b/target/s390x/tcg/translate.c
49
@@ -XXX,XX +XXX,XX @@ static const DisasInsn *extract_insn(CPUS390XState *env, DisasContext *s)
50
/* Register insn bytes with translator so plugins work. */
51
for (int i = 0; i < ilen; i++) {
52
uint8_t byte = extract64(insn, 56 - (i * 8), 8);
53
- translator_fake_ldb(byte, pc + i);
54
+ translator_fake_ldb(&s->base, pc + i, byte);
55
}
56
op = insn >> 56;
57
} else {
58
--
59
2.34.1
60
61
diff view generated by jsdifflib
1
Replace target-specific 'Z' with generic 'z'.
2
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/s390x/tcg/translate.c | 5 +++--
6
tcg/loongarch64/tcg-target-con-set.h | 15 ++++++-------
5
1 file changed, 3 insertions(+), 2 deletions(-)
7
tcg/loongarch64/tcg-target-con-str.h | 1 -
8
tcg/loongarch64/tcg-target.c.inc | 32 ++++++++++++----------------
9
3 files changed, 21 insertions(+), 27 deletions(-)
6
10
7
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
11
diff --git a/tcg/loongarch64/tcg-target-con-set.h b/tcg/loongarch64/tcg-target-con-set.h
8
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
9
--- a/target/s390x/tcg/translate.c
13
--- a/tcg/loongarch64/tcg-target-con-set.h
10
+++ b/target/s390x/tcg/translate.c
14
+++ b/tcg/loongarch64/tcg-target-con-set.h
11
@@ -XXX,XX +XXX,XX @@ static bool s390x_tr_disas_log(const DisasContextBase *dcbase,
15
@@ -XXX,XX +XXX,XX @@
12
DisasContext *dc = container_of(dcbase, DisasContext, base);
16
* tcg-target-con-str.h; the constraint combination is inclusive or.
13
17
*/
14
if (unlikely(dc->ex_value)) {
18
C_O0_I1(r)
15
- /* ??? Unfortunately target_disas can't use host memory. */
19
-C_O0_I2(rZ, r)
16
- fprintf(logfile, "IN: EXECUTE %016" PRIx64, dc->ex_value);
20
-C_O0_I2(rZ, rZ)
17
+ /* The ex_value has been recorded with translator_fake_ld. */
21
+C_O0_I2(rz, r)
18
+ fprintf(logfile, "IN: EXECUTE\n");
22
+C_O0_I2(rz, rz)
19
+ target_disas(logfile, cs, &dc->base);
23
C_O0_I2(w, r)
24
C_O0_I3(r, r, r)
25
C_O1_I1(r, r)
26
@@ -XXX,XX +XXX,XX @@ C_O1_I2(r, r, rI)
27
C_O1_I2(r, r, rJ)
28
C_O1_I2(r, r, rU)
29
C_O1_I2(r, r, rW)
30
-C_O1_I2(r, r, rZ)
31
-C_O1_I2(r, 0, rZ)
32
-C_O1_I2(r, rZ, ri)
33
-C_O1_I2(r, rZ, rJ)
34
-C_O1_I2(r, rZ, rZ)
35
+C_O1_I2(r, 0, rz)
36
+C_O1_I2(r, rz, ri)
37
+C_O1_I2(r, rz, rJ)
38
+C_O1_I2(r, rz, rz)
39
C_O1_I2(w, w, w)
40
C_O1_I2(w, w, wM)
41
C_O1_I2(w, w, wA)
42
C_O1_I3(w, w, w, w)
43
-C_O1_I4(r, rZ, rJ, rZ, rZ)
44
+C_O1_I4(r, rz, rJ, rz, rz)
45
C_N2_I1(r, r, r)
46
diff --git a/tcg/loongarch64/tcg-target-con-str.h b/tcg/loongarch64/tcg-target-con-str.h
47
index XXXXXXX..XXXXXXX 100644
48
--- a/tcg/loongarch64/tcg-target-con-str.h
49
+++ b/tcg/loongarch64/tcg-target-con-str.h
50
@@ -XXX,XX +XXX,XX @@ REGS('w', ALL_VECTOR_REGS)
51
CONST('I', TCG_CT_CONST_S12)
52
CONST('J', TCG_CT_CONST_S32)
53
CONST('U', TCG_CT_CONST_U12)
54
-CONST('Z', TCG_CT_CONST_ZERO)
55
CONST('C', TCG_CT_CONST_C12)
56
CONST('W', TCG_CT_CONST_WSZ)
57
CONST('M', TCG_CT_CONST_VCMP)
58
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
59
index XXXXXXX..XXXXXXX 100644
60
--- a/tcg/loongarch64/tcg-target.c.inc
61
+++ b/tcg/loongarch64/tcg-target.c.inc
62
@@ -XXX,XX +XXX,XX @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
63
64
#define TCG_GUEST_BASE_REG TCG_REG_S1
65
66
-#define TCG_CT_CONST_ZERO 0x100
67
-#define TCG_CT_CONST_S12 0x200
68
-#define TCG_CT_CONST_S32 0x400
69
-#define TCG_CT_CONST_U12 0x800
70
-#define TCG_CT_CONST_C12 0x1000
71
-#define TCG_CT_CONST_WSZ 0x2000
72
-#define TCG_CT_CONST_VCMP 0x4000
73
-#define TCG_CT_CONST_VADD 0x8000
74
+#define TCG_CT_CONST_S12 0x100
75
+#define TCG_CT_CONST_S32 0x200
76
+#define TCG_CT_CONST_U12 0x400
77
+#define TCG_CT_CONST_C12 0x800
78
+#define TCG_CT_CONST_WSZ 0x1000
79
+#define TCG_CT_CONST_VCMP 0x2000
80
+#define TCG_CT_CONST_VADD 0x4000
81
82
#define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32)
83
#define ALL_VECTOR_REGS MAKE_64BIT_MASK(32, 32)
84
@@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, int ct,
85
if (ct & TCG_CT_CONST) {
20
return true;
86
return true;
21
}
87
}
22
return false;
88
- if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
89
- return true;
90
- }
91
if ((ct & TCG_CT_CONST_S12) && val == sextreg(val, 0, 12)) {
92
return true;
93
}
94
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
95
case INDEX_op_st_i64:
96
case INDEX_op_qemu_st_i32:
97
case INDEX_op_qemu_st_i64:
98
- return C_O0_I2(rZ, r);
99
+ return C_O0_I2(rz, r);
100
101
case INDEX_op_qemu_ld_i128:
102
return C_N2_I1(r, r, r);
103
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
104
105
case INDEX_op_brcond_i32:
106
case INDEX_op_brcond_i64:
107
- return C_O0_I2(rZ, rZ);
108
+ return C_O0_I2(rz, rz);
109
110
case INDEX_op_ext8s_i32:
111
case INDEX_op_ext8s_i64:
112
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
113
case INDEX_op_deposit_i32:
114
case INDEX_op_deposit_i64:
115
/* Must deposit into the same register as input */
116
- return C_O1_I2(r, 0, rZ);
117
+ return C_O1_I2(r, 0, rz);
118
119
case INDEX_op_sub_i32:
120
case INDEX_op_setcond_i32:
121
- return C_O1_I2(r, rZ, ri);
122
+ return C_O1_I2(r, rz, ri);
123
case INDEX_op_sub_i64:
124
case INDEX_op_setcond_i64:
125
- return C_O1_I2(r, rZ, rJ);
126
+ return C_O1_I2(r, rz, rJ);
127
128
case INDEX_op_mul_i32:
129
case INDEX_op_mul_i64:
130
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
131
case INDEX_op_rem_i64:
132
case INDEX_op_remu_i32:
133
case INDEX_op_remu_i64:
134
- return C_O1_I2(r, rZ, rZ);
135
+ return C_O1_I2(r, rz, rz);
136
137
case INDEX_op_movcond_i32:
138
case INDEX_op_movcond_i64:
139
- return C_O1_I4(r, rZ, rJ, rZ, rZ);
140
+ return C_O1_I4(r, rz, rJ, rz, rz);
141
142
case INDEX_op_ld_vec:
143
case INDEX_op_dupm_vec:
23
--
144
--
24
2.34.1
145
2.43.0
25
146
26
147
diff view generated by jsdifflib
1
This will be able to replace plugin_insn_append, and will
1
Replace target-specific 'Z' with generic 'z'.
2
be usable for disassembly.
3
2
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
include/exec/translator.h | 12 ++++++++++++
6
tcg/mips/tcg-target-con-set.h | 26 ++++++++++-----------
8
accel/tcg/translator.c | 41 +++++++++++++++++++++++++++++++++++++++
7
tcg/mips/tcg-target-con-str.h | 1 -
9
2 files changed, 53 insertions(+)
8
tcg/mips/tcg-target.c.inc | 44 ++++++++++++++---------------------
9
3 files changed, 31 insertions(+), 40 deletions(-)
10
10
11
diff --git a/include/exec/translator.h b/include/exec/translator.h
11
diff --git a/tcg/mips/tcg-target-con-set.h b/tcg/mips/tcg-target-con-set.h
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/include/exec/translator.h
13
--- a/tcg/mips/tcg-target-con-set.h
14
+++ b/include/exec/translator.h
14
+++ b/tcg/mips/tcg-target-con-set.h
15
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContextBase {
15
@@ -XXX,XX +XXX,XX @@
16
bool plugin_enabled;
16
* tcg-target-con-str.h; the constraint combination is inclusive or.
17
struct TCGOp *insn_start;
17
*/
18
void *host_addr[2];
18
C_O0_I1(r)
19
+
19
-C_O0_I2(rZ, r)
20
+ /*
20
-C_O0_I2(rZ, rZ)
21
+ * Record insn data that we cannot read directly from host memory.
21
-C_O0_I3(rZ, r, r)
22
+ * There are only two reasons we cannot use host memory:
22
-C_O0_I3(rZ, rZ, r)
23
+ * (1) We are executing from I/O,
23
-C_O0_I4(rZ, rZ, rZ, rZ)
24
+ * (2) We are executing a synthetic instruction (s390x EX).
24
-C_O0_I4(rZ, rZ, r, r)
25
+ * In both cases we need record exactly one instruction,
25
+C_O0_I2(rz, r)
26
+ * and thus the maximum amount of data we record is limited.
26
+C_O0_I2(rz, rz)
27
+ */
27
+C_O0_I3(rz, r, r)
28
+ int record_start;
28
+C_O0_I3(rz, rz, r)
29
+ int record_len;
29
+C_O0_I4(rz, rz, rz, rz)
30
+ uint8_t record[32];
30
+C_O0_I4(rz, rz, r, r)
31
} DisasContextBase;
31
C_O1_I1(r, r)
32
32
-C_O1_I2(r, 0, rZ)
33
/**
33
+C_O1_I2(r, 0, rz)
34
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
34
C_O1_I2(r, r, r)
35
C_O1_I2(r, r, ri)
36
C_O1_I2(r, r, rI)
37
C_O1_I2(r, r, rIK)
38
C_O1_I2(r, r, rJ)
39
-C_O1_I2(r, r, rWZ)
40
-C_O1_I2(r, rZ, rN)
41
-C_O1_I2(r, rZ, rZ)
42
-C_O1_I4(r, rZ, rZ, rZ, 0)
43
-C_O1_I4(r, rZ, rZ, rZ, rZ)
44
+C_O1_I2(r, r, rzW)
45
+C_O1_I2(r, rz, rN)
46
+C_O1_I2(r, rz, rz)
47
+C_O1_I4(r, rz, rz, rz, 0)
48
+C_O1_I4(r, rz, rz, rz, rz)
49
C_O2_I1(r, r, r)
50
C_O2_I2(r, r, r, r)
51
-C_O2_I4(r, r, rZ, rZ, rN, rN)
52
+C_O2_I4(r, r, rz, rz, rN, rN)
53
diff --git a/tcg/mips/tcg-target-con-str.h b/tcg/mips/tcg-target-con-str.h
35
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
36
--- a/accel/tcg/translator.c
55
--- a/tcg/mips/tcg-target-con-str.h
37
+++ b/accel/tcg/translator.c
56
+++ b/tcg/mips/tcg-target-con-str.h
38
@@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
57
@@ -XXX,XX +XXX,XX @@ CONST('J', TCG_CT_CONST_S16)
39
db->insn_start = NULL;
58
CONST('K', TCG_CT_CONST_P2M1)
40
db->host_addr[0] = host_pc;
59
CONST('N', TCG_CT_CONST_N16)
41
db->host_addr[1] = NULL;
60
CONST('W', TCG_CT_CONST_WSZ)
42
+ db->record_start = 0;
61
-CONST('Z', TCG_CT_CONST_ZERO)
43
+ db->record_len = 0;
62
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
44
63
index XXXXXXX..XXXXXXX 100644
45
ops->init_disas_context(db, cpu);
64
--- a/tcg/mips/tcg-target.c.inc
46
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
65
+++ b/tcg/mips/tcg-target.c.inc
47
@@ -XXX,XX +XXX,XX @@ static bool translator_ld(CPUArchState *env, DisasContextBase *db,
66
@@ -XXX,XX +XXX,XX @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
48
return true;
67
g_assert_not_reached();
49
}
68
}
50
69
51
+static void record_save(DisasContextBase *db, vaddr pc,
70
-#define TCG_CT_CONST_ZERO 0x100
52
+ const void *from, int size)
71
-#define TCG_CT_CONST_U16 0x200 /* Unsigned 16-bit: 0 - 0xffff. */
53
+{
72
-#define TCG_CT_CONST_S16 0x400 /* Signed 16-bit: -32768 - 32767 */
54
+ int offset;
73
-#define TCG_CT_CONST_P2M1 0x800 /* Power of 2 minus 1. */
55
+
74
-#define TCG_CT_CONST_N16 0x1000 /* "Negatable" 16-bit: -32767 - 32767 */
56
+ /* Do not record probes before the start of TB. */
75
-#define TCG_CT_CONST_WSZ 0x2000 /* word size */
57
+ if (pc < db->pc_first) {
76
+#define TCG_CT_CONST_U16 0x100 /* Unsigned 16-bit: 0 - 0xffff. */
58
+ return;
77
+#define TCG_CT_CONST_S16 0x200 /* Signed 16-bit: -32768 - 32767 */
59
+ }
78
+#define TCG_CT_CONST_P2M1 0x400 /* Power of 2 minus 1. */
60
+
79
+#define TCG_CT_CONST_N16 0x800 /* "Negatable" 16-bit: -32767 - 32767 */
61
+ /*
80
+#define TCG_CT_CONST_WSZ 0x1000 /* word size */
62
+ * In translator_access, we verified that pc is within 2 pages
81
63
+ * of pc_first, thus this will never overflow.
82
#define ALL_GENERAL_REGS 0xffffffffu
64
+ */
83
65
+ offset = pc - db->pc_first;
84
@@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, int ct,
66
+
67
+ /*
68
+ * Either the first or second page may be I/O. If it is the second,
69
+ * then the first byte we need to record will be at a non-zero offset.
70
+ * In either case, we should not need to record but a single insn.
71
+ */
72
+ if (db->record_len == 0) {
73
+ db->record_start = offset;
74
+ db->record_len = size;
75
+ } else {
76
+ assert(offset == db->record_start + db->record_len);
77
+ assert(db->record_len + size <= sizeof(db->record));
78
+ db->record_len += size;
79
+ }
80
+
81
+ memcpy(db->record + (offset - db->record_start), from, size);
82
+}
83
+
84
static void plugin_insn_append(vaddr pc, const void *from, size_t size)
85
{
85
{
86
#ifdef CONFIG_PLUGIN
86
if (ct & TCG_CT_CONST) {
87
@@ -XXX,XX +XXX,XX @@ uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc)
87
return 1;
88
88
- } else if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
89
if (!translator_ld(env, db, &raw, pc, sizeof(raw))) {
89
- return 1;
90
raw = cpu_ldub_code(env, pc);
90
} else if ((ct & TCG_CT_CONST_U16) && val == (uint16_t)val) {
91
+ record_save(db, pc, &raw, sizeof(raw));
91
return 1;
92
}
92
} else if ((ct & TCG_CT_CONST_S16) && val == (int16_t)val) {
93
plugin_insn_append(pc, &raw, sizeof(raw));
93
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
94
return raw;
94
TCGArg a0, a1, a2;
95
@@ -XXX,XX +XXX,XX @@ uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc)
95
int c2;
96
} else {
96
97
tgt = cpu_lduw_code(env, pc);
97
- /*
98
raw = tswap16(tgt);
98
- * Note that many operands use the constraint set "rZ".
99
+ record_save(db, pc, &raw, sizeof(raw));
99
- * We make use of the fact that 0 is the ZERO register,
100
}
100
- * and hence such cases need not check for const_args.
101
plugin_insn_append(pc, &raw, sizeof(raw));
101
- */
102
return tgt;
102
a0 = args[0];
103
@@ -XXX,XX +XXX,XX @@ uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc)
103
a1 = args[1];
104
} else {
104
a2 = args[2];
105
tgt = cpu_ldl_code(env, pc);
105
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
106
raw = tswap32(tgt);
106
case INDEX_op_st16_i64:
107
+ record_save(db, pc, &raw, sizeof(raw));
107
case INDEX_op_st32_i64:
108
}
108
case INDEX_op_st_i64:
109
plugin_insn_append(pc, &raw, sizeof(raw));
109
- return C_O0_I2(rZ, r);
110
return tgt;
110
+ return C_O0_I2(rz, r);
111
@@ -XXX,XX +XXX,XX @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
111
112
} else {
112
case INDEX_op_add_i32:
113
tgt = cpu_ldq_code(env, pc);
113
case INDEX_op_add_i64:
114
raw = tswap64(tgt);
114
return C_O1_I2(r, r, rJ);
115
+ record_save(db, pc, &raw, sizeof(raw));
115
case INDEX_op_sub_i32:
116
}
116
case INDEX_op_sub_i64:
117
plugin_insn_append(pc, &raw, sizeof(raw));
117
- return C_O1_I2(r, rZ, rN);
118
return tgt;
118
+ return C_O1_I2(r, rz, rN);
119
@@ -XXX,XX +XXX,XX @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
119
case INDEX_op_mul_i32:
120
120
case INDEX_op_mulsh_i32:
121
void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8)
121
case INDEX_op_muluh_i32:
122
{
122
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
123
+ assert(pc >= db->pc_first);
123
case INDEX_op_remu_i64:
124
+ record_save(db, pc, &insn8, sizeof(insn8));
124
case INDEX_op_nor_i64:
125
plugin_insn_append(pc, &insn8, sizeof(insn8));
125
case INDEX_op_setcond_i64:
126
}
126
- return C_O1_I2(r, rZ, rZ);
127
+ return C_O1_I2(r, rz, rz);
128
case INDEX_op_muls2_i32:
129
case INDEX_op_mulu2_i32:
130
case INDEX_op_muls2_i64:
131
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
132
return C_O1_I2(r, r, ri);
133
case INDEX_op_clz_i32:
134
case INDEX_op_clz_i64:
135
- return C_O1_I2(r, r, rWZ);
136
+ return C_O1_I2(r, r, rzW);
137
138
case INDEX_op_deposit_i32:
139
case INDEX_op_deposit_i64:
140
- return C_O1_I2(r, 0, rZ);
141
+ return C_O1_I2(r, 0, rz);
142
case INDEX_op_brcond_i32:
143
case INDEX_op_brcond_i64:
144
- return C_O0_I2(rZ, rZ);
145
+ return C_O0_I2(rz, rz);
146
case INDEX_op_movcond_i32:
147
case INDEX_op_movcond_i64:
148
return (use_mips32r6_instructions
149
- ? C_O1_I4(r, rZ, rZ, rZ, rZ)
150
- : C_O1_I4(r, rZ, rZ, rZ, 0));
151
+ ? C_O1_I4(r, rz, rz, rz, rz)
152
+ : C_O1_I4(r, rz, rz, rz, 0));
153
case INDEX_op_add2_i32:
154
case INDEX_op_sub2_i32:
155
- return C_O2_I4(r, r, rZ, rZ, rN, rN);
156
+ return C_O2_I4(r, r, rz, rz, rN, rN);
157
case INDEX_op_setcond2_i32:
158
- return C_O1_I4(r, rZ, rZ, rZ, rZ);
159
+ return C_O1_I4(r, rz, rz, rz, rz);
160
case INDEX_op_brcond2_i32:
161
- return C_O0_I4(rZ, rZ, rZ, rZ);
162
+ return C_O0_I4(rz, rz, rz, rz);
163
164
case INDEX_op_qemu_ld_i32:
165
return C_O1_I1(r, r);
166
case INDEX_op_qemu_st_i32:
167
- return C_O0_I2(rZ, r);
168
+ return C_O0_I2(rz, r);
169
case INDEX_op_qemu_ld_i64:
170
return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I1(r, r, r);
171
case INDEX_op_qemu_st_i64:
172
- return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rZ, r) : C_O0_I3(rZ, rZ, r);
173
+ return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rz, r) : C_O0_I3(rz, rz, r);
174
175
default:
176
return C_NotImplemented;
127
--
177
--
128
2.34.1
178
2.43.0
129
179
130
180
diff view generated by jsdifflib
1
We do not need to separately record the start of the TB.
1
Replace target-specific 'Z' with generic 'z'.
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
5
---
6
include/qemu/plugin.h | 1 -
6
tcg/riscv/tcg-target-con-set.h | 10 +++++-----
7
accel/tcg/plugin-gen.c | 3 +--
7
tcg/riscv/tcg-target-con-str.h | 1 -
8
plugins/api.c | 3 ++-
8
tcg/riscv/tcg-target.c.inc | 28 ++++++++++++----------------
9
3 files changed, 3 insertions(+), 4 deletions(-)
9
3 files changed, 17 insertions(+), 22 deletions(-)
10
10
11
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
11
diff --git a/tcg/riscv/tcg-target-con-set.h b/tcg/riscv/tcg-target-con-set.h
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/include/qemu/plugin.h
13
--- a/tcg/riscv/tcg-target-con-set.h
14
+++ b/include/qemu/plugin.h
14
+++ b/tcg/riscv/tcg-target-con-set.h
15
@@ -XXX,XX +XXX,XX @@ struct qemu_plugin_scoreboard {
15
@@ -XXX,XX +XXX,XX @@
16
struct qemu_plugin_tb {
16
* tcg-target-con-str.h; the constraint combination is inclusive or.
17
GPtrArray *insns;
17
*/
18
size_t n;
18
C_O0_I1(r)
19
- uint64_t vaddr;
19
-C_O0_I2(rZ, r)
20
20
-C_O0_I2(rZ, rZ)
21
/* if set, the TB calls helpers that might access guest memory */
21
+C_O0_I2(rz, r)
22
bool mem_helper;
22
+C_O0_I2(rz, rz)
23
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
23
C_O1_I1(r, r)
24
C_O1_I2(r, r, ri)
25
C_O1_I2(r, r, rI)
26
C_O1_I2(r, r, rJ)
27
-C_O1_I2(r, rZ, rN)
28
-C_O1_I2(r, rZ, rZ)
29
+C_O1_I2(r, rz, rN)
30
+C_O1_I2(r, rz, rz)
31
C_N1_I2(r, r, rM)
32
C_O1_I4(r, r, rI, rM, rM)
33
-C_O2_I4(r, r, rZ, rZ, rM, rM)
34
+C_O2_I4(r, r, rz, rz, rM, rM)
35
C_O0_I2(v, r)
36
C_O1_I1(v, r)
37
C_O1_I1(v, v)
38
diff --git a/tcg/riscv/tcg-target-con-str.h b/tcg/riscv/tcg-target-con-str.h
24
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
25
--- a/accel/tcg/plugin-gen.c
40
--- a/tcg/riscv/tcg-target-con-str.h
26
+++ b/accel/tcg/plugin-gen.c
41
+++ b/tcg/riscv/tcg-target-con-str.h
27
@@ -XXX,XX +XXX,XX @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
42
@@ -XXX,XX +XXX,XX @@ CONST('K', TCG_CT_CONST_S5)
28
int insn_idx = -1;
43
CONST('L', TCG_CT_CONST_CMP_VI)
29
44
CONST('N', TCG_CT_CONST_N12)
30
if (unlikely(qemu_loglevel_mask(LOG_TB_OP_PLUGIN)
45
CONST('M', TCG_CT_CONST_M12)
31
- && qemu_log_in_addr_range(plugin_tb->vaddr))) {
46
-CONST('Z', TCG_CT_CONST_ZERO)
32
+ && qemu_log_in_addr_range(tcg_ctx->plugin_db->pc_first))) {
47
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
33
FILE *logfile = qemu_log_trylock();
34
if (logfile) {
35
fprintf(logfile, "OP before plugin injection:\n");
36
@@ -XXX,XX +XXX,XX @@ bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db)
37
38
ret = true;
39
40
- ptb->vaddr = db->pc_first;
41
ptb->mem_helper = false;
42
43
tcg_gen_plugin_cb(PLUGIN_GEN_FROM_TB);
44
diff --git a/plugins/api.c b/plugins/api.c
45
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
46
--- a/plugins/api.c
49
--- a/tcg/riscv/tcg-target.c.inc
47
+++ b/plugins/api.c
50
+++ b/tcg/riscv/tcg-target.c.inc
48
@@ -XXX,XX +XXX,XX @@ size_t qemu_plugin_tb_n_insns(const struct qemu_plugin_tb *tb)
51
@@ -XXX,XX +XXX,XX @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
49
52
return TCG_REG_A0 + slot;
50
uint64_t qemu_plugin_tb_vaddr(const struct qemu_plugin_tb *tb)
51
{
52
- return tb->vaddr;
53
+ const DisasContextBase *db = tcg_ctx->plugin_db;
54
+ return db->pc_first;
55
}
53
}
56
54
57
struct qemu_plugin_insn *
55
-#define TCG_CT_CONST_ZERO 0x100
56
-#define TCG_CT_CONST_S12 0x200
57
-#define TCG_CT_CONST_N12 0x400
58
-#define TCG_CT_CONST_M12 0x800
59
-#define TCG_CT_CONST_J12 0x1000
60
-#define TCG_CT_CONST_S5 0x2000
61
-#define TCG_CT_CONST_CMP_VI 0x4000
62
+#define TCG_CT_CONST_S12 0x100
63
+#define TCG_CT_CONST_N12 0x200
64
+#define TCG_CT_CONST_M12 0x400
65
+#define TCG_CT_CONST_J12 0x800
66
+#define TCG_CT_CONST_S5 0x1000
67
+#define TCG_CT_CONST_CMP_VI 0x2000
68
69
#define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32)
70
#define ALL_VECTOR_REGS MAKE_64BIT_MASK(32, 32)
71
@@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, int ct,
72
if (ct & TCG_CT_CONST) {
73
return 1;
74
}
75
- if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
76
- return 1;
77
- }
78
if (type >= TCG_TYPE_V64) {
79
/* Val is replicated by VECE; extract the highest element. */
80
val >>= (-8 << vece) & 63;
81
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
82
case INDEX_op_st16_i64:
83
case INDEX_op_st32_i64:
84
case INDEX_op_st_i64:
85
- return C_O0_I2(rZ, r);
86
+ return C_O0_I2(rz, r);
87
88
case INDEX_op_add_i32:
89
case INDEX_op_and_i32:
90
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
91
92
case INDEX_op_sub_i32:
93
case INDEX_op_sub_i64:
94
- return C_O1_I2(r, rZ, rN);
95
+ return C_O1_I2(r, rz, rN);
96
97
case INDEX_op_mul_i32:
98
case INDEX_op_mulsh_i32:
99
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
100
case INDEX_op_divu_i64:
101
case INDEX_op_rem_i64:
102
case INDEX_op_remu_i64:
103
- return C_O1_I2(r, rZ, rZ);
104
+ return C_O1_I2(r, rz, rz);
105
106
case INDEX_op_shl_i32:
107
case INDEX_op_shr_i32:
108
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
109
110
case INDEX_op_brcond_i32:
111
case INDEX_op_brcond_i64:
112
- return C_O0_I2(rZ, rZ);
113
+ return C_O0_I2(rz, rz);
114
115
case INDEX_op_movcond_i32:
116
case INDEX_op_movcond_i64:
117
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
118
case INDEX_op_add2_i64:
119
case INDEX_op_sub2_i32:
120
case INDEX_op_sub2_i64:
121
- return C_O2_I4(r, r, rZ, rZ, rM, rM);
122
+ return C_O2_I4(r, r, rz, rz, rM, rM);
123
124
case INDEX_op_qemu_ld_i32:
125
case INDEX_op_qemu_ld_i64:
126
return C_O1_I1(r, r);
127
case INDEX_op_qemu_st_i32:
128
case INDEX_op_qemu_st_i64:
129
- return C_O0_I2(rZ, r);
130
+ return C_O0_I2(rz, r);
131
132
case INDEX_op_st_vec:
133
return C_O0_I2(v, r);
58
--
134
--
59
2.34.1
135
2.43.0
60
136
61
137
diff view generated by jsdifflib
1
Do not allow translation to proceed beyond one insn with mmio,
1
Replace target-specific 'Z' with generic 'z'.
2
as we will not be caching the TranslationBlock.
3
2
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
accel/tcg/translator.c | 4 ++++
6
tcg/sparc64/tcg-target-con-set.h | 12 ++++++------
8
1 file changed, 4 insertions(+)
7
tcg/sparc64/tcg-target-con-str.h | 1 -
8
tcg/sparc64/tcg-target.c.inc | 17 +++++++----------
9
3 files changed, 13 insertions(+), 17 deletions(-)
9
10
10
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
11
diff --git a/tcg/sparc64/tcg-target-con-set.h b/tcg/sparc64/tcg-target-con-set.h
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/accel/tcg/translator.c
13
--- a/tcg/sparc64/tcg-target-con-set.h
13
+++ b/accel/tcg/translator.c
14
+++ b/tcg/sparc64/tcg-target-con-set.h
14
@@ -XXX,XX +XXX,XX @@ static bool translator_ld(CPUArchState *env, DisasContextBase *db,
15
@@ -XXX,XX +XXX,XX @@
15
16
* tcg-target-con-str.h; the constraint combination is inclusive or.
16
/* Use slow path if first page is MMIO. */
17
*/
17
if (unlikely(tb_page_addr0(tb) == -1)) {
18
C_O0_I1(r)
18
+ /* We capped translation with first page MMIO in tb_gen_code. */
19
-C_O0_I2(rZ, r)
19
+ tcg_debug_assert(db->max_insns == 1);
20
-C_O0_I2(rZ, rJ)
20
return false;
21
+C_O0_I2(rz, r)
22
+C_O0_I2(rz, rJ)
23
C_O1_I1(r, r)
24
C_O1_I2(r, r, r)
25
-C_O1_I2(r, rZ, rJ)
26
-C_O1_I4(r, rZ, rJ, rI, 0)
27
-C_O2_I2(r, r, rZ, rJ)
28
-C_O2_I4(r, r, rZ, rZ, rJ, rJ)
29
+C_O1_I2(r, rz, rJ)
30
+C_O1_I4(r, rz, rJ, rI, 0)
31
+C_O2_I2(r, r, rz, rJ)
32
+C_O2_I4(r, r, rz, rz, rJ, rJ)
33
diff --git a/tcg/sparc64/tcg-target-con-str.h b/tcg/sparc64/tcg-target-con-str.h
34
index XXXXXXX..XXXXXXX 100644
35
--- a/tcg/sparc64/tcg-target-con-str.h
36
+++ b/tcg/sparc64/tcg-target-con-str.h
37
@@ -XXX,XX +XXX,XX @@ REGS('r', ALL_GENERAL_REGS)
38
*/
39
CONST('I', TCG_CT_CONST_S11)
40
CONST('J', TCG_CT_CONST_S13)
41
-CONST('Z', TCG_CT_CONST_ZERO)
42
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
43
index XXXXXXX..XXXXXXX 100644
44
--- a/tcg/sparc64/tcg-target.c.inc
45
+++ b/tcg/sparc64/tcg-target.c.inc
46
@@ -XXX,XX +XXX,XX @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
47
48
#define TCG_CT_CONST_S11 0x100
49
#define TCG_CT_CONST_S13 0x200
50
-#define TCG_CT_CONST_ZERO 0x400
51
52
#define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32)
53
54
@@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, int ct,
55
val = (int32_t)val;
21
}
56
}
22
57
23
@@ -XXX,XX +XXX,XX @@ static bool translator_ld(CPUArchState *env, DisasContextBase *db,
58
- if ((ct & TCG_CT_CONST_ZERO) && val == 0) {
24
if (unlikely(new_page1 == -1)) {
59
- return 1;
25
tb_unlock_pages(tb);
60
- } else if ((ct & TCG_CT_CONST_S11) && check_fit_tl(val, 11)) {
26
tb_set_page_addr0(tb, -1);
61
+ if ((ct & TCG_CT_CONST_S11) && check_fit_tl(val, 11)) {
27
+ /* Require that this be the final insn. */
62
return 1;
28
+ db->max_insns = db->num_insns;
63
} else if ((ct & TCG_CT_CONST_S13) && check_fit_tl(val, 13)) {
29
return false;
64
return 1;
30
}
65
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
66
case INDEX_op_st_i64:
67
case INDEX_op_qemu_st_i32:
68
case INDEX_op_qemu_st_i64:
69
- return C_O0_I2(rZ, r);
70
+ return C_O0_I2(rz, r);
71
72
case INDEX_op_add_i32:
73
case INDEX_op_add_i64:
74
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
75
case INDEX_op_setcond_i64:
76
case INDEX_op_negsetcond_i32:
77
case INDEX_op_negsetcond_i64:
78
- return C_O1_I2(r, rZ, rJ);
79
+ return C_O1_I2(r, rz, rJ);
80
81
case INDEX_op_brcond_i32:
82
case INDEX_op_brcond_i64:
83
- return C_O0_I2(rZ, rJ);
84
+ return C_O0_I2(rz, rJ);
85
case INDEX_op_movcond_i32:
86
case INDEX_op_movcond_i64:
87
- return C_O1_I4(r, rZ, rJ, rI, 0);
88
+ return C_O1_I4(r, rz, rJ, rI, 0);
89
case INDEX_op_add2_i32:
90
case INDEX_op_add2_i64:
91
case INDEX_op_sub2_i32:
92
case INDEX_op_sub2_i64:
93
- return C_O2_I4(r, r, rZ, rZ, rJ, rJ);
94
+ return C_O2_I4(r, r, rz, rz, rJ, rJ);
95
case INDEX_op_mulu2_i32:
96
case INDEX_op_muls2_i32:
97
- return C_O2_I2(r, r, rZ, rJ);
98
+ return C_O2_I2(r, r, rz, rJ);
99
case INDEX_op_muluh_i64:
100
return C_O1_I2(r, r, r);
31
101
32
--
102
--
33
2.34.1
103
2.43.0
34
104
35
105
diff view generated by jsdifflib
1
The ilen value extracted from ex_value is the length of the
1
From: Fabiano Rosas <farosas@suse.de>
2
EXECUTE instruction itself, and so is the increment to the pc.
3
However, the length of the synthetic insn is located in the
4
opcode like all other instructions.
5
2
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
When complying with the alignment requested in the ELF and unmapping
4
the excess reservation, having align_end not aligned to the guest page
5
causes the unmap to be rejected by the alignment check at
6
target_munmap and later brk adjustments hit an EEXIST.
7
8
Fix by aligning the start of region to be unmapped.
9
10
Fixes: c81d1fafa6 ("linux-user: Honor elf alignment when placing images")
11
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1913
12
Signed-off-by: Fabiano Rosas <farosas@suse.de>
13
[rth: Align load_end as well.]
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-ID: <20250213143558.10504-1-farosas@suse.de>
8
---
16
---
9
target/s390x/tcg/translate.c | 4 ++--
17
linux-user/elfload.c | 4 ++--
10
1 file changed, 2 insertions(+), 2 deletions(-)
18
1 file changed, 2 insertions(+), 2 deletions(-)
11
19
12
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
20
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
13
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
14
--- a/target/s390x/tcg/translate.c
22
--- a/linux-user/elfload.c
15
+++ b/target/s390x/tcg/translate.c
23
+++ b/linux-user/elfload.c
16
@@ -XXX,XX +XXX,XX @@ static const DisasInsn *extract_insn(CPUS390XState *env, DisasContext *s)
24
@@ -XXX,XX +XXX,XX @@ static void load_elf_image(const char *image_name, const ImageSource *src,
17
/* Extract the values saved by EXECUTE. */
25
18
insn = s->ex_value & 0xffffffffffff0000ull;
26
if (align_size != reserve_size) {
19
ilen = s->ex_value & 0xf;
27
abi_ulong align_addr = ROUND_UP(load_addr, align);
20
+ op = insn >> 56;
28
- abi_ulong align_end = align_addr + reserve_size;
21
29
- abi_ulong load_end = load_addr + align_size;
22
/* Register insn bytes with translator so plugins work. */
30
+ abi_ulong align_end = TARGET_PAGE_ALIGN(align_addr + reserve_size);
23
be_insn = cpu_to_be64(insn);
31
+ abi_ulong load_end = TARGET_PAGE_ALIGN(load_addr + align_size);
24
- translator_fake_ld(&s->base, &be_insn, ilen);
32
25
- op = insn >> 56;
33
if (align_addr != load_addr) {
26
+ translator_fake_ld(&s->base, &be_insn, get_ilen(op));
34
target_munmap(load_addr, align_addr - load_addr);
27
} else {
28
insn = ld_code2(env, s, pc);
29
op = (insn >> 8) & 0xff;
30
--
35
--
31
2.34.1
36
2.43.0
32
33
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Andreas Schwab <schwab@suse.de>
2
3
SA_RESTORER and the associated sa_restorer field of struct sigaction are
4
an obsolete feature, not expected to be used by future architectures.
5
They are also absent on RISC-V, LoongArch, Hexagon and OpenRISC, but
6
defined due to their use of generic/signal.h. This leads to corrupted
7
data and out-of-bounds accesses.
8
9
Move the definition of TARGET_SA_RESTORER out of generic/signal.h into the
10
target_signal.h files that need it. Note that m68k has the sa_restorer
11
field, but does not use it and does not define SA_RESTORER.
12
13
Reported-by: Thomas Weißschuh <thomas@t-8ch.de>
14
Signed-off-by: Andreas Schwab <schwab@suse.de>
15
Reviewed-by: Thomas Weißschuh <thomas@t-8ch.de>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
17
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
18
Message-ID: <mvmed060xc9.fsf@suse.de>
3
---
19
---
4
target/s390x/tcg/translate.c | 3 +--
20
linux-user/aarch64/target_signal.h | 2 ++
5
1 file changed, 1 insertion(+), 2 deletions(-)
21
linux-user/arm/target_signal.h | 2 ++
22
linux-user/generic/signal.h | 1 -
23
linux-user/i386/target_signal.h | 2 ++
24
linux-user/m68k/target_signal.h | 1 +
25
linux-user/microblaze/target_signal.h | 2 ++
26
linux-user/ppc/target_signal.h | 2 ++
27
linux-user/s390x/target_signal.h | 2 ++
28
linux-user/sh4/target_signal.h | 2 ++
29
linux-user/x86_64/target_signal.h | 2 ++
30
linux-user/xtensa/target_signal.h | 2 ++
31
11 files changed, 19 insertions(+), 1 deletion(-)
6
32
7
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
33
diff --git a/linux-user/aarch64/target_signal.h b/linux-user/aarch64/target_signal.h
8
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
9
--- a/target/s390x/tcg/translate.c
35
--- a/linux-user/aarch64/target_signal.h
10
+++ b/target/s390x/tcg/translate.c
36
+++ b/linux-user/aarch64/target_signal.h
11
@@ -XXX,XX +XXX,XX @@
37
@@ -XXX,XX +XXX,XX @@
12
#include "tcg/tcg-op-gvec.h"
38
13
#include "qemu/log.h"
39
#include "../generic/signal.h"
14
#include "qemu/host-utils.h"
40
15
-#include "exec/cpu_ldst.h"
41
+#define TARGET_SA_RESTORER 0x04000000
16
#include "exec/helper-proto.h"
42
+
17
#include "exec/helper-gen.h"
43
#define TARGET_SEGV_MTEAERR 8 /* Asynchronous ARM MTE error */
18
44
#define TARGET_SEGV_MTESERR 9 /* Synchronous ARM MTE exception */
19
@@ -XXX,XX +XXX,XX @@ static void s390x_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
45
20
static target_ulong get_next_pc(CPUS390XState *env, DisasContext *s,
46
diff --git a/linux-user/arm/target_signal.h b/linux-user/arm/target_signal.h
21
uint64_t pc)
47
index XXXXXXX..XXXXXXX 100644
22
{
48
--- a/linux-user/arm/target_signal.h
23
- uint64_t insn = cpu_lduw_code(env, pc);
49
+++ b/linux-user/arm/target_signal.h
24
+ uint64_t insn = translator_lduw(env, &s->base, pc);
50
@@ -XXX,XX +XXX,XX @@
25
51
26
return pc + get_ilen((insn >> 8) & 0xff);
52
#include "../generic/signal.h"
27
}
53
54
+#define TARGET_SA_RESTORER 0x04000000
55
+
56
#define TARGET_ARCH_HAS_SETUP_FRAME
57
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
58
59
diff --git a/linux-user/generic/signal.h b/linux-user/generic/signal.h
60
index XXXXXXX..XXXXXXX 100644
61
--- a/linux-user/generic/signal.h
62
+++ b/linux-user/generic/signal.h
63
@@ -XXX,XX +XXX,XX @@
64
#define TARGET_SA_RESTART 0x10000000
65
#define TARGET_SA_NODEFER 0x40000000
66
#define TARGET_SA_RESETHAND 0x80000000
67
-#define TARGET_SA_RESTORER 0x04000000
68
69
#define TARGET_SIGHUP 1
70
#define TARGET_SIGINT 2
71
diff --git a/linux-user/i386/target_signal.h b/linux-user/i386/target_signal.h
72
index XXXXXXX..XXXXXXX 100644
73
--- a/linux-user/i386/target_signal.h
74
+++ b/linux-user/i386/target_signal.h
75
@@ -XXX,XX +XXX,XX @@
76
77
#include "../generic/signal.h"
78
79
+#define TARGET_SA_RESTORER 0x04000000
80
+
81
#define TARGET_ARCH_HAS_SETUP_FRAME
82
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
83
84
diff --git a/linux-user/m68k/target_signal.h b/linux-user/m68k/target_signal.h
85
index XXXXXXX..XXXXXXX 100644
86
--- a/linux-user/m68k/target_signal.h
87
+++ b/linux-user/m68k/target_signal.h
88
@@ -XXX,XX +XXX,XX @@
89
90
#include "../generic/signal.h"
91
92
+#define TARGET_ARCH_HAS_SA_RESTORER 1
93
#define TARGET_ARCH_HAS_SETUP_FRAME
94
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
95
96
diff --git a/linux-user/microblaze/target_signal.h b/linux-user/microblaze/target_signal.h
97
index XXXXXXX..XXXXXXX 100644
98
--- a/linux-user/microblaze/target_signal.h
99
+++ b/linux-user/microblaze/target_signal.h
100
@@ -XXX,XX +XXX,XX @@
101
102
#include "../generic/signal.h"
103
104
+#define TARGET_SA_RESTORER 0x04000000
105
+
106
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
107
108
#endif /* MICROBLAZE_TARGET_SIGNAL_H */
109
diff --git a/linux-user/ppc/target_signal.h b/linux-user/ppc/target_signal.h
110
index XXXXXXX..XXXXXXX 100644
111
--- a/linux-user/ppc/target_signal.h
112
+++ b/linux-user/ppc/target_signal.h
113
@@ -XXX,XX +XXX,XX @@
114
115
#include "../generic/signal.h"
116
117
+#define TARGET_SA_RESTORER 0x04000000
118
+
119
#if !defined(TARGET_PPC64)
120
#define TARGET_ARCH_HAS_SETUP_FRAME
121
#endif
122
diff --git a/linux-user/s390x/target_signal.h b/linux-user/s390x/target_signal.h
123
index XXXXXXX..XXXXXXX 100644
124
--- a/linux-user/s390x/target_signal.h
125
+++ b/linux-user/s390x/target_signal.h
126
@@ -XXX,XX +XXX,XX @@
127
128
#include "../generic/signal.h"
129
130
+#define TARGET_SA_RESTORER 0x04000000
131
+
132
#define TARGET_ARCH_HAS_SETUP_FRAME
133
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
134
135
diff --git a/linux-user/sh4/target_signal.h b/linux-user/sh4/target_signal.h
136
index XXXXXXX..XXXXXXX 100644
137
--- a/linux-user/sh4/target_signal.h
138
+++ b/linux-user/sh4/target_signal.h
139
@@ -XXX,XX +XXX,XX @@
140
141
#include "../generic/signal.h"
142
143
+#define TARGET_SA_RESTORER 0x04000000
144
+
145
#define TARGET_ARCH_HAS_SETUP_FRAME
146
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
147
148
diff --git a/linux-user/x86_64/target_signal.h b/linux-user/x86_64/target_signal.h
149
index XXXXXXX..XXXXXXX 100644
150
--- a/linux-user/x86_64/target_signal.h
151
+++ b/linux-user/x86_64/target_signal.h
152
@@ -XXX,XX +XXX,XX @@
153
154
#include "../generic/signal.h"
155
156
+#define TARGET_SA_RESTORER 0x04000000
157
+
158
/* For x86_64, use of SA_RESTORER is mandatory. */
159
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0
160
161
diff --git a/linux-user/xtensa/target_signal.h b/linux-user/xtensa/target_signal.h
162
index XXXXXXX..XXXXXXX 100644
163
--- a/linux-user/xtensa/target_signal.h
164
+++ b/linux-user/xtensa/target_signal.h
165
@@ -XXX,XX +XXX,XX @@
166
167
#include "../generic/signal.h"
168
169
+#define TARGET_SA_RESTORER 0x04000000
170
+
171
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
172
173
#endif
28
--
174
--
29
2.34.1
175
2.43.0
30
176
31
177
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Mikael Szreder <git@miszr.win>
2
3
A bug was introduced in commit 0bba7572d40d which causes the fdtox
4
and fqtox instructions to incorrectly select the destination registers.
5
More information and a test program can be found in issue #2802.
6
7
Cc: qemu-stable@nongnu.org
8
Fixes: 0bba7572d40d ("target/sparc: Perform DFPREG/QFPREG in decodetree")
9
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2802
10
Signed-off-by: Mikael Szreder <git@miszr.win>
11
Acked-by: Artyom Tarasenko <atar4qemu@gmail.com>
12
[rth: Squash patches together, since the second fixes a typo in the first.]
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-ID: <20250205090333.19626-3-git@miszr.win>
3
---
15
---
4
target/xtensa/translate.c | 3 +--
16
target/sparc/insns.decode | 12 ++++++------
5
1 file changed, 1 insertion(+), 2 deletions(-)
17
1 file changed, 6 insertions(+), 6 deletions(-)
6
18
7
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
19
diff --git a/target/sparc/insns.decode b/target/sparc/insns.decode
8
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
9
--- a/target/xtensa/translate.c
21
--- a/target/sparc/insns.decode
10
+++ b/target/xtensa/translate.c
22
+++ b/target/sparc/insns.decode
11
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ FdMULq 10 ..... 110100 ..... 0 0110 1110 ..... @q_d_d
12
#include "tcg/tcg-op.h"
24
FNHADDs 10 ..... 110100 ..... 0 0111 0001 ..... @r_r_r
13
#include "qemu/log.h"
25
FNHADDd 10 ..... 110100 ..... 0 0111 0010 ..... @d_d_d
14
#include "qemu/qemu-print.h"
26
FNsMULd 10 ..... 110100 ..... 0 0111 1001 ..... @d_r_r
15
-#include "exec/cpu_ldst.h"
27
-FsTOx 10 ..... 110100 00000 0 1000 0001 ..... @r_r2
16
#include "semihosting/semihost.h"
28
-FdTOx 10 ..... 110100 00000 0 1000 0010 ..... @r_d2
17
#include "exec/translator.h"
29
-FqTOx 10 ..... 110100 00000 0 1000 0011 ..... @r_q2
18
30
-FxTOs 10 ..... 110100 00000 0 1000 0100 ..... @r_r2
19
@@ -XXX,XX +XXX,XX @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc)
31
-FxTOd 10 ..... 110100 00000 0 1000 1000 ..... @d_r2
20
32
-FxTOq 10 ..... 110100 00000 0 1000 1100 ..... @q_r2
21
static inline unsigned xtensa_insn_len(CPUXtensaState *env, DisasContext *dc)
33
+FsTOx 10 ..... 110100 00000 0 1000 0001 ..... @d_r2
22
{
34
+FdTOx 10 ..... 110100 00000 0 1000 0010 ..... @d_d2
23
- uint8_t b0 = cpu_ldub_code(env, dc->pc);
35
+FqTOx 10 ..... 110100 00000 0 1000 0011 ..... @d_q2
24
+ uint8_t b0 = translator_ldub(env, &dc->base, dc->pc);
36
+FxTOs 10 ..... 110100 00000 0 1000 0100 ..... @r_d2
25
return xtensa_op0_insn_len(dc, b0);
37
+FxTOd 10 ..... 110100 00000 0 1000 1000 ..... @d_d2
26
}
38
+FxTOq 10 ..... 110100 00000 0 1000 1100 ..... @q_d2
27
39
FiTOs 10 ..... 110100 00000 0 1100 0100 ..... @r_r2
40
FdTOs 10 ..... 110100 00000 0 1100 0110 ..... @r_d2
41
FqTOs 10 ..... 110100 00000 0 1100 0111 ..... @r_q2
28
--
42
--
29
2.34.1
43
2.43.0
30
31
diff view generated by jsdifflib
1
TCG register spill/fill uses tcg_out_ld/st with all types,
1
From: Mikael Szreder <git@miszr.win>
2
not necessarily going through INDEX_op_{ld,st}_vec.
2
3
The gdbstub implementation for the Sparc architecture would
4
incorrectly calculate the the floating point register offset.
5
This resulted in, for example, registers f32 and f34 to point to
6
the same value.
7
8
The issue was caused by the confusion between even register numbers
9
and even register indexes. For example, the register index of f32 is 64
10
and f34 is 65.
3
11
4
Cc: qemu-stable@nongnu.org
12
Cc: qemu-stable@nongnu.org
5
Fixes: 16288ded944 ("tcg/loongarch64: Lower basic tcg vec ops to LSX")
13
Fixes: 30038fd81808 ("target-sparc: Change fpr representation to doubles.")
6
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2336
14
Signed-off-by: Mikael Szreder <git@miszr.win>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
16
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Song Gao <gaosong@loongson.cn>
17
Message-ID: <20250214070343.11501-1-git@miszr.win>
9
Tested-by: Song Gao <gaosong@loongson.cn>
10
---
18
---
11
tcg/loongarch64/tcg-target.c.inc | 103 ++++++++++++++++++++++++-------
19
target/sparc/gdbstub.c | 18 ++++++++++++++----
12
1 file changed, 80 insertions(+), 23 deletions(-)
20
1 file changed, 14 insertions(+), 4 deletions(-)
13
21
14
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
22
diff --git a/target/sparc/gdbstub.c b/target/sparc/gdbstub.c
15
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
16
--- a/tcg/loongarch64/tcg-target.c.inc
24
--- a/target/sparc/gdbstub.c
17
+++ b/tcg/loongarch64/tcg-target.c.inc
25
+++ b/target/sparc/gdbstub.c
18
@@ -XXX,XX +XXX,XX @@ static void tcg_out_ldst(TCGContext *s, LoongArchInsn opc, TCGReg data,
26
@@ -XXX,XX +XXX,XX @@ int sparc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
27
}
19
}
28
}
20
}
29
if (n < 80) {
21
30
- /* f32-f62 (double width, even numbers only) */
22
-static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg arg,
31
- return gdb_get_reg64(mem_buf, env->fpr[(n - 32) / 2].ll);
23
- TCGReg arg1, intptr_t arg2)
32
+ /* f32-f62 (16 double width registers, even register numbers only)
24
+static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg dest,
33
+ * n == 64: f32 : env->fpr[16]
25
+ TCGReg base, intptr_t offset)
34
+ * n == 65: f34 : env->fpr[17]
26
{
35
+ * etc...
27
- bool is_32bit = type == TCG_TYPE_I32;
36
+ * n == 79: f62 : env->fpr[31]
28
- tcg_out_ldst(s, is_32bit ? OPC_LD_W : OPC_LD_D, arg, arg1, arg2);
37
+ */
29
+ switch (type) {
38
+ return gdb_get_reg64(mem_buf, env->fpr[(n - 64) + 16].ll);
30
+ case TCG_TYPE_I32:
39
}
31
+ if (dest < TCG_REG_V0) {
40
switch (n) {
32
+ tcg_out_ldst(s, OPC_LD_W, dest, base, offset);
41
case 80:
33
+ } else {
42
@@ -XXX,XX +XXX,XX @@ int sparc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
34
+ tcg_out_dupm_vec(s, TCG_TYPE_I128, MO_32, dest, base, offset);
43
}
35
+ }
44
return 4;
36
+ break;
45
} else if (n < 80) {
37
+ case TCG_TYPE_I64:
46
- /* f32-f62 (double width, even numbers only) */
38
+ if (dest < TCG_REG_V0) {
47
- env->fpr[(n - 32) / 2].ll = tmp;
39
+ tcg_out_ldst(s, OPC_LD_D, dest, base, offset);
48
+ /* f32-f62 (16 double width registers, even register numbers only)
40
+ } else {
49
+ * n == 64: f32 : env->fpr[16]
41
+ tcg_out_dupm_vec(s, TCG_TYPE_I128, MO_64, dest, base, offset);
50
+ * n == 65: f34 : env->fpr[17]
42
+ }
51
+ * etc...
43
+ break;
52
+ * n == 79: f62 : env->fpr[31]
44
+ case TCG_TYPE_V128:
53
+ */
45
+ if (-0x800 <= offset && offset <= 0x7ff) {
54
+ env->fpr[(n - 64) + 16].ll = tmp;
46
+ tcg_out_opc_vld(s, dest, base, offset);
55
} else {
47
+ } else {
56
switch (n) {
48
+ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, offset);
57
case 80:
49
+ tcg_out_opc_vldx(s, dest, base, TCG_REG_TMP0);
50
+ }
51
+ break;
52
+ default:
53
+ g_assert_not_reached();
54
+ }
55
}
56
57
-static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg,
58
- TCGReg arg1, intptr_t arg2)
59
+static void tcg_out_st(TCGContext *s, TCGType type, TCGReg src,
60
+ TCGReg base, intptr_t offset)
61
{
62
- bool is_32bit = type == TCG_TYPE_I32;
63
- tcg_out_ldst(s, is_32bit ? OPC_ST_W : OPC_ST_D, arg, arg1, arg2);
64
+ switch (type) {
65
+ case TCG_TYPE_I32:
66
+ if (src < TCG_REG_V0) {
67
+ tcg_out_ldst(s, OPC_ST_W, src, base, offset);
68
+ } else {
69
+ /* TODO: Could use fst_s, fstx_s */
70
+ if (offset < -0x100 || offset > 0xff || (offset & 3)) {
71
+ if (-0x800 <= offset && offset <= 0x7ff) {
72
+ tcg_out_opc_addi_d(s, TCG_REG_TMP0, base, offset);
73
+ } else {
74
+ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, offset);
75
+ tcg_out_opc_add_d(s, TCG_REG_TMP0, TCG_REG_TMP0, base);
76
+ }
77
+ base = TCG_REG_TMP0;
78
+ offset = 0;
79
+ }
80
+ tcg_out_opc_vstelm_w(s, src, base, offset, 0);
81
+ }
82
+ break;
83
+ case TCG_TYPE_I64:
84
+ if (src < TCG_REG_V0) {
85
+ tcg_out_ldst(s, OPC_ST_D, src, base, offset);
86
+ } else {
87
+ /* TODO: Could use fst_d, fstx_d */
88
+ if (offset < -0x100 || offset > 0xff || (offset & 7)) {
89
+ if (-0x800 <= offset && offset <= 0x7ff) {
90
+ tcg_out_opc_addi_d(s, TCG_REG_TMP0, base, offset);
91
+ } else {
92
+ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, offset);
93
+ tcg_out_opc_add_d(s, TCG_REG_TMP0, TCG_REG_TMP0, base);
94
+ }
95
+ base = TCG_REG_TMP0;
96
+ offset = 0;
97
+ }
98
+ tcg_out_opc_vstelm_d(s, src, base, offset, 0);
99
+ }
100
+ break;
101
+ case TCG_TYPE_V128:
102
+ if (-0x800 <= offset && offset <= 0x7ff) {
103
+ tcg_out_opc_vst(s, src, base, offset);
104
+ } else {
105
+ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, offset);
106
+ tcg_out_opc_vstx(s, src, base, TCG_REG_TMP0);
107
+ }
108
+ break;
109
+ default:
110
+ g_assert_not_reached();
111
+ }
112
}
113
114
static bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
115
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
116
{
117
TCGType type = vecl + TCG_TYPE_V64;
118
TCGArg a0, a1, a2, a3;
119
- TCGReg temp = TCG_REG_TMP0;
120
TCGReg temp_vec = TCG_VEC_TMP0;
121
122
static const LoongArchInsn cmp_vec_insn[16][4] = {
123
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
124
125
switch (opc) {
126
case INDEX_op_st_vec:
127
- /* Try to fit vst imm */
128
- if (-0x800 <= a2 && a2 <= 0x7ff) {
129
- tcg_out_opc_vst(s, a0, a1, a2);
130
- } else {
131
- tcg_out_movi(s, TCG_TYPE_I64, temp, a2);
132
- tcg_out_opc_vstx(s, a0, a1, temp);
133
- }
134
+ tcg_out_st(s, type, a0, a1, a2);
135
break;
136
case INDEX_op_ld_vec:
137
- /* Try to fit vld imm */
138
- if (-0x800 <= a2 && a2 <= 0x7ff) {
139
- tcg_out_opc_vld(s, a0, a1, a2);
140
- } else {
141
- tcg_out_movi(s, TCG_TYPE_I64, temp, a2);
142
- tcg_out_opc_vldx(s, a0, a1, temp);
143
- }
144
+ tcg_out_ld(s, type, a0, a1, a2);
145
break;
146
case INDEX_op_and_vec:
147
tcg_out_opc_vand_v(s, a0, a1, a2);
148
--
58
--
149
2.34.1
59
2.43.0
diff view generated by jsdifflib
1
Copy data out of a completed translation. This will be used
1
From: Artyom Tarasenko <atar4qemu@gmail.com>
2
for both plugins and disassembly.
3
2
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Fake access to
4
PCR Performance Control Register
5
and
6
PIC Performance Instrumentation Counter.
7
8
Ignore writes in privileged mode, and return 0 on reads.
9
10
This allows booting Tribblix, MilaX and v9os under Niagara target.
11
12
Signed-off-by: Artyom Tarasenko <atar4qemu@gmail.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-ID: <20250209211248.50383-1-atar4qemu@gmail.com>
6
---
16
---
7
include/exec/translator.h | 23 ++++++++++++++++
17
target/sparc/translate.c | 19 +++++++++++++++++++
8
accel/tcg/translator.c | 55 +++++++++++++++++++++++++++++++++++++++
18
target/sparc/insns.decode | 7 ++++++-
9
2 files changed, 78 insertions(+)
19
2 files changed, 25 insertions(+), 1 deletion(-)
10
20
11
diff --git a/include/exec/translator.h b/include/exec/translator.h
21
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
12
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
13
--- a/include/exec/translator.h
23
--- a/target/sparc/translate.c
14
+++ b/include/exec/translator.h
24
+++ b/target/sparc/translate.c
15
@@ -XXX,XX +XXX,XX @@ translator_ldq_swap(CPUArchState *env, DisasContextBase *db,
25
@@ -XXX,XX +XXX,XX @@ static TCGv do_rd_leon3_config(DisasContext *dc, TCGv dst)
16
*/
26
17
void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8);
27
TRANS(RDASR17, ASR17, do_rd_special, true, a->rd, do_rd_leon3_config)
18
28
19
+/**
29
+static TCGv do_rdpic(DisasContext *dc, TCGv dst)
20
+ * translator_st
21
+ * @db: disassembly context
22
+ * @dest: address to copy into
23
+ * @addr: virtual address within TB
24
+ * @len: length
25
+ *
26
+ * Copy @len bytes from @addr into @dest.
27
+ * All bytes must have been read during translation.
28
+ * Return true on success or false on failure.
29
+ */
30
+bool translator_st(const DisasContextBase *db, void *dest,
31
+ vaddr addr, size_t len);
32
+
33
+/**
34
+ * translator_st_len
35
+ * @db: disassembly context
36
+ *
37
+ * Return the number of bytes available to copy from the
38
+ * current translation block with translator_st.
39
+ */
40
+size_t translator_st_len(const DisasContextBase *db);
41
+
42
#ifdef COMPILING_PER_TARGET
43
/*
44
* Return whether addr is on the same page as where disassembly started.
45
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/accel/tcg/translator.c
48
+++ b/accel/tcg/translator.c
49
@@ -XXX,XX +XXX,XX @@ static void record_save(DisasContextBase *db, vaddr pc,
50
memcpy(db->record + (offset - db->record_start), from, size);
51
}
52
53
+size_t translator_st_len(const DisasContextBase *db)
54
+{
30
+{
55
+ return db->fake_insn ? db->record_len : db->tb->size;
31
+ return tcg_constant_tl(0);
56
+}
32
+}
57
+
33
+
58
+bool translator_st(const DisasContextBase *db, void *dest,
34
+TRANS(RDPIC, HYPV, do_rd_special, supervisor(dc), a->rd, do_rdpic)
59
+ vaddr addr, size_t len)
35
+
36
+
37
static TCGv do_rdccr(DisasContext *dc, TCGv dst)
38
{
39
gen_helper_rdccr(dst, tcg_env);
40
@@ -XXX,XX +XXX,XX @@ static void do_wrfprs(DisasContext *dc, TCGv src)
41
42
TRANS(WRFPRS, 64, do_wr_special, a, true, do_wrfprs)
43
44
+static bool do_priv_nop(DisasContext *dc, bool priv)
60
+{
45
+{
61
+ size_t offset, offset_end;
46
+ if (!priv) {
62
+
47
+ return raise_priv(dc);
63
+ if (addr < db->pc_first) {
64
+ return false;
65
+ }
48
+ }
66
+ offset = addr - db->pc_first;
49
+ return advance_pc(dc);
67
+ offset_end = offset + len;
68
+ if (offset_end > translator_st_len(db)) {
69
+ return false;
70
+ }
71
+
72
+ if (!db->fake_insn) {
73
+ size_t offset_page1 = -(db->pc_first | TARGET_PAGE_MASK);
74
+
75
+ /* Get all the bytes from the first page. */
76
+ if (db->host_addr[0]) {
77
+ if (offset_end <= offset_page1) {
78
+ memcpy(dest, db->host_addr[0] + offset, len);
79
+ return true;
80
+ }
81
+ if (offset < offset_page1) {
82
+ size_t len0 = offset_page1 - offset;
83
+ memcpy(dest, db->host_addr[0] + offset, len0);
84
+ offset += len0;
85
+ dest += len0;
86
+ }
87
+ }
88
+
89
+ /* Get any bytes from the second page. */
90
+ if (db->host_addr[1] && offset >= offset_page1) {
91
+ memcpy(dest, db->host_addr[1] + (offset - offset_page1),
92
+ offset_end - offset);
93
+ return true;
94
+ }
95
+ }
96
+
97
+ /* Else get recorded bytes. */
98
+ if (db->record_len != 0 &&
99
+ offset >= db->record_start &&
100
+ offset_end <= db->record_start + db->record_len) {
101
+ memcpy(dest, db->record + (offset - db->record_start),
102
+ offset_end - offset);
103
+ return true;
104
+ }
105
+ return false;
106
+}
50
+}
107
+
51
+
108
static void plugin_insn_append(vaddr pc, const void *from, size_t size)
52
+TRANS(WRPCR, HYPV, do_priv_nop, supervisor(dc))
53
+TRANS(WRPIC, HYPV, do_priv_nop, supervisor(dc))
54
+
55
static void do_wrgsr(DisasContext *dc, TCGv src)
109
{
56
{
110
#ifdef CONFIG_PLUGIN
57
gen_trap_ifnofpu(dc);
58
diff --git a/target/sparc/insns.decode b/target/sparc/insns.decode
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/sparc/insns.decode
61
+++ b/target/sparc/insns.decode
62
@@ -XXX,XX +XXX,XX @@ CALL 01 i:s30
63
RDTICK 10 rd:5 101000 00100 0 0000000000000
64
RDPC 10 rd:5 101000 00101 0 0000000000000
65
RDFPRS 10 rd:5 101000 00110 0 0000000000000
66
- RDASR17 10 rd:5 101000 10001 0 0000000000000
67
+ {
68
+ RDASR17 10 rd:5 101000 10001 0 0000000000000
69
+ RDPIC 10 rd:5 101000 10001 0 0000000000000
70
+ }
71
RDGSR 10 rd:5 101000 10011 0 0000000000000
72
RDSOFTINT 10 rd:5 101000 10110 0 0000000000000
73
RDTICK_CMPR 10 rd:5 101000 10111 0 0000000000000
74
@@ -XXX,XX +XXX,XX @@ CALL 01 i:s30
75
WRCCR 10 00010 110000 ..... . ............. @n_r_ri
76
WRASI 10 00011 110000 ..... . ............. @n_r_ri
77
WRFPRS 10 00110 110000 ..... . ............. @n_r_ri
78
+ WRPCR 10 10000 110000 01000 0 0000000000000
79
+ WRPIC 10 10001 110000 01000 0 0000000000000
80
{
81
WRGSR 10 10011 110000 ..... . ............. @n_r_ri
82
WRPOWERDOWN 10 10011 110000 ..... . ............. @n_r_ri
111
--
83
--
112
2.34.1
84
2.43.0
113
114
diff view generated by jsdifflib
1
Remove left-over comment from commit dcd092a063
1
Eliminate code repetition by using the appropriate helpers.
2
("accel/tcg: Improve can_do_io management").
3
2
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
include/exec/translator.h | 3 ++-
6
tcg/i386/tcg-target.c.inc | 65 +++++----------------------------------
8
accel/tcg/translator.c | 2 ++
7
1 file changed, 8 insertions(+), 57 deletions(-)
9
2 files changed, 4 insertions(+), 1 deletion(-)
10
8
11
diff --git a/include/exec/translator.h b/include/exec/translator.h
9
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
12
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
13
--- a/include/exec/translator.h
11
--- a/tcg/i386/tcg-target.c.inc
14
+++ b/include/exec/translator.h
12
+++ b/tcg/i386/tcg-target.c.inc
15
@@ -XXX,XX +XXX,XX @@ typedef enum DisasJumpType {
13
@@ -XXX,XX +XXX,XX @@ static void tcg_out_brcond2(TCGContext *s, const TCGArg *args,
16
* @num_insns: Number of translated instructions (including current).
14
tcg_out_brcond(s, 0, cond, args[1], args[3], const_args[3],
17
* @max_insns: Maximum number of instructions to be translated in this TB.
15
label_this, small);
18
* @singlestep_enabled: "Hardware" single stepping enabled.
16
break;
19
- * @saved_can_do_io: Known value of cpu->neg.can_do_io, or -1 for unknown.
17
+
20
* @plugin_enabled: TCG plugin enabled in this TB.
18
case TCG_COND_NE:
21
+ * @fake_insn: True if translator_fake_ldb used.
19
case TCG_COND_TSTNE:
22
* @insn_start: The last op emitted by the insn_start hook,
20
tcg_out_brcond(s, 0, cond, args[0], args[2], const_args[2],
23
* which is expected to be INDEX_op_insn_start.
21
@@ -XXX,XX +XXX,XX @@ static void tcg_out_brcond2(TCGContext *s, const TCGArg *args,
24
*
22
tcg_out_brcond(s, 0, cond, args[1], args[3], const_args[3],
25
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContextBase {
23
label_this, small);
26
int max_insns;
24
break;
27
bool singlestep_enabled;
25
- case TCG_COND_LT:
28
bool plugin_enabled;
26
- tcg_out_brcond(s, 0, TCG_COND_LT, args[1], args[3], const_args[3],
29
+ bool fake_insn;
27
- label_this, small);
30
struct TCGOp *insn_start;
28
- tcg_out_jxx(s, JCC_JNE, label_next, 1);
31
void *host_addr[2];
29
- tcg_out_brcond(s, 0, TCG_COND_LTU, args[0], args[2], const_args[2],
32
30
- label_this, small);
33
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
31
- break;
34
index XXXXXXX..XXXXXXX 100644
32
- case TCG_COND_LE:
35
--- a/accel/tcg/translator.c
33
- tcg_out_brcond(s, 0, TCG_COND_LT, args[1], args[3], const_args[3],
36
+++ b/accel/tcg/translator.c
34
- label_this, small);
37
@@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
35
- tcg_out_jxx(s, JCC_JNE, label_next, 1);
38
db->max_insns = *max_insns;
36
- tcg_out_brcond(s, 0, TCG_COND_LEU, args[0], args[2], const_args[2],
39
db->singlestep_enabled = cflags & CF_SINGLE_STEP;
37
- label_this, small);
40
db->insn_start = NULL;
38
- break;
41
+ db->fake_insn = false;
39
- case TCG_COND_GT:
42
db->host_addr[0] = host_pc;
40
- tcg_out_brcond(s, 0, TCG_COND_GT, args[1], args[3], const_args[3],
43
db->host_addr[1] = NULL;
41
- label_this, small);
44
db->record_start = 0;
42
- tcg_out_jxx(s, JCC_JNE, label_next, 1);
45
@@ -XXX,XX +XXX,XX @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
43
- tcg_out_brcond(s, 0, TCG_COND_GTU, args[0], args[2], const_args[2],
46
void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8)
44
- label_this, small);
47
{
45
- break;
48
assert(pc >= db->pc_first);
46
- case TCG_COND_GE:
49
+ db->fake_insn = true;
47
- tcg_out_brcond(s, 0, TCG_COND_GT, args[1], args[3], const_args[3],
50
record_save(db, pc, &insn8, sizeof(insn8));
48
- label_this, small);
51
plugin_insn_append(pc, &insn8, sizeof(insn8));
49
- tcg_out_jxx(s, JCC_JNE, label_next, 1);
50
- tcg_out_brcond(s, 0, TCG_COND_GEU, args[0], args[2], const_args[2],
51
- label_this, small);
52
- break;
53
- case TCG_COND_LTU:
54
- tcg_out_brcond(s, 0, TCG_COND_LTU, args[1], args[3], const_args[3],
55
- label_this, small);
56
- tcg_out_jxx(s, JCC_JNE, label_next, 1);
57
- tcg_out_brcond(s, 0, TCG_COND_LTU, args[0], args[2], const_args[2],
58
- label_this, small);
59
- break;
60
- case TCG_COND_LEU:
61
- tcg_out_brcond(s, 0, TCG_COND_LTU, args[1], args[3], const_args[3],
62
- label_this, small);
63
- tcg_out_jxx(s, JCC_JNE, label_next, 1);
64
- tcg_out_brcond(s, 0, TCG_COND_LEU, args[0], args[2], const_args[2],
65
- label_this, small);
66
- break;
67
- case TCG_COND_GTU:
68
- tcg_out_brcond(s, 0, TCG_COND_GTU, args[1], args[3], const_args[3],
69
- label_this, small);
70
- tcg_out_jxx(s, JCC_JNE, label_next, 1);
71
- tcg_out_brcond(s, 0, TCG_COND_GTU, args[0], args[2], const_args[2],
72
- label_this, small);
73
- break;
74
- case TCG_COND_GEU:
75
- tcg_out_brcond(s, 0, TCG_COND_GTU, args[1], args[3], const_args[3],
76
- label_this, small);
77
- tcg_out_jxx(s, JCC_JNE, label_next, 1);
78
- tcg_out_brcond(s, 0, TCG_COND_GEU, args[0], args[2], const_args[2],
79
- label_this, small);
80
- break;
81
+
82
default:
83
- g_assert_not_reached();
84
+ tcg_out_brcond(s, 0, tcg_high_cond(cond), args[1],
85
+ args[3], const_args[3], label_this, small);
86
+ tcg_out_jxx(s, JCC_JNE, label_next, 1);
87
+ tcg_out_brcond(s, 0, tcg_unsigned_cond(cond), args[0],
88
+ args[2], const_args[2], label_this, small);
89
+ break;
90
}
91
tcg_out_label(s, label_next);
52
}
92
}
53
--
93
--
54
2.34.1
94
2.43.0
55
95
56
96
diff view generated by jsdifflib
Deleted patch
1
We can delay the computation of haddr until the plugin
2
actually requests it.
3
1
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
include/qemu/plugin.h | 4 ----
8
accel/tcg/plugin-gen.c | 20 --------------------
9
plugins/api.c | 25 ++++++++++++++++++++++++-
10
3 files changed, 24 insertions(+), 25 deletions(-)
11
12
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
13
index XXXXXXX..XXXXXXX 100644
14
--- a/include/qemu/plugin.h
15
+++ b/include/qemu/plugin.h
16
@@ -XXX,XX +XXX,XX @@ struct qemu_plugin_dyn_cb {
17
/* Internal context for instrumenting an instruction */
18
struct qemu_plugin_insn {
19
uint64_t vaddr;
20
- void *haddr;
21
GArray *insn_cbs;
22
GArray *mem_cbs;
23
uint8_t len;
24
@@ -XXX,XX +XXX,XX @@ struct qemu_plugin_tb {
25
GPtrArray *insns;
26
size_t n;
27
uint64_t vaddr;
28
- uint64_t vaddr2;
29
- void *haddr1;
30
- void *haddr2;
31
32
/* if set, the TB calls helpers that might access guest memory */
33
bool mem_helper;
34
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/accel/tcg/plugin-gen.c
37
+++ b/accel/tcg/plugin-gen.c
38
@@ -XXX,XX +XXX,XX @@ bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db)
39
ret = true;
40
41
ptb->vaddr = db->pc_first;
42
- ptb->vaddr2 = -1;
43
- ptb->haddr1 = db->host_addr[0];
44
- ptb->haddr2 = NULL;
45
ptb->mem_helper = false;
46
47
tcg_gen_plugin_cb(PLUGIN_GEN_FROM_TB);
48
@@ -XXX,XX +XXX,XX @@ void plugin_gen_insn_start(CPUState *cpu, const DisasContextBase *db)
49
pc = db->pc_next;
50
insn->vaddr = pc;
51
52
- /*
53
- * Detect page crossing to get the new host address.
54
- * Note that we skip this when haddr1 == NULL, e.g. when we're
55
- * fetching instructions from a region not backed by RAM.
56
- */
57
- if (ptb->haddr1 == NULL) {
58
- insn->haddr = NULL;
59
- } else if (is_same_page(db, db->pc_next)) {
60
- insn->haddr = ptb->haddr1 + pc - ptb->vaddr;
61
- } else {
62
- if (ptb->vaddr2 == -1) {
63
- ptb->vaddr2 = TARGET_PAGE_ALIGN(db->pc_first);
64
- get_page_addr_code_hostp(cpu_env(cpu), ptb->vaddr2, &ptb->haddr2);
65
- }
66
- insn->haddr = ptb->haddr2 + pc - ptb->vaddr2;
67
- }
68
-
69
tcg_gen_plugin_cb(PLUGIN_GEN_FROM_INSN);
70
}
71
72
diff --git a/plugins/api.c b/plugins/api.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/plugins/api.c
75
+++ b/plugins/api.c
76
@@ -XXX,XX +XXX,XX @@ uint64_t qemu_plugin_insn_vaddr(const struct qemu_plugin_insn *insn)
77
78
void *qemu_plugin_insn_haddr(const struct qemu_plugin_insn *insn)
79
{
80
- return insn->haddr;
81
+ const DisasContextBase *db = tcg_ctx->plugin_db;
82
+ vaddr page0_last = db->pc_first | ~TARGET_PAGE_MASK;
83
+
84
+ if (db->fake_insn) {
85
+ return NULL;
86
+ }
87
+
88
+ /*
89
+ * ??? The return value is not intended for use of host memory,
90
+ * but as a proxy for address space and physical address.
91
+ * Thus we are only interested in the first byte and do not
92
+ * care about spanning pages.
93
+ */
94
+ if (insn->vaddr <= page0_last) {
95
+ if (db->host_addr[0] == NULL) {
96
+ return NULL;
97
+ }
98
+ return db->host_addr[0] + insn->vaddr - db->pc_first;
99
+ } else {
100
+ if (db->host_addr[1] == NULL) {
101
+ return NULL;
102
+ }
103
+ return db->host_addr[1] + insn->vaddr - (page0_last + 1);
104
+ }
105
}
106
107
char *qemu_plugin_insn_disas(const struct qemu_plugin_insn *insn)
108
--
109
2.34.1
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/hexagon/translate.c | 3 +--
5
1 file changed, 1 insertion(+), 2 deletions(-)
6
1
7
diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/hexagon/translate.c
10
+++ b/target/hexagon/translate.c
11
@@ -XXX,XX +XXX,XX @@
12
#include "exec/translation-block.h"
13
#include "exec/cpu_ldst.h"
14
#include "exec/log.h"
15
-#include "exec/cpu_ldst.h"
16
#include "internal.h"
17
#include "attribs.h"
18
#include "insn.h"
19
@@ -XXX,XX +XXX,XX @@ static bool pkt_crosses_page(CPUHexagonState *env, DisasContext *ctx)
20
int nwords;
21
22
for (nwords = 0; !found_end && nwords < PACKET_WORDS_MAX; nwords++) {
23
- uint32_t word = cpu_ldl_code(env,
24
+ uint32_t word = translator_ldl(env, &ctx->base,
25
ctx->base.pc_next + nwords * sizeof(uint32_t));
26
found_end = is_packet_end(word);
27
}
28
--
29
2.34.1
30
31
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/i386/tcg/translate.c | 8 +++-----
5
1 file changed, 3 insertions(+), 5 deletions(-)
6
1
7
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/i386/tcg/translate.c
10
+++ b/target/i386/tcg/translate.c
11
@@ -XXX,XX +XXX,XX @@
12
#include "exec/exec-all.h"
13
#include "tcg/tcg-op.h"
14
#include "tcg/tcg-op-gvec.h"
15
-#include "exec/cpu_ldst.h"
16
#include "exec/translator.h"
17
#include "fpu/softfloat.h"
18
19
@@ -XXX,XX +XXX,XX @@ static uint64_t advance_pc(CPUX86State *env, DisasContext *s, int num_bytes)
20
* This can happen even if the operand is only one byte long!
21
*/
22
if (((s->pc - 1) ^ (pc - 1)) & TARGET_PAGE_MASK) {
23
- volatile uint8_t unused =
24
- cpu_ldub_code(env, (s->pc - 1) & TARGET_PAGE_MASK);
25
- (void) unused;
26
+ (void)translator_ldub(env, &s->base,
27
+ (s->pc - 1) & TARGET_PAGE_MASK);
28
}
29
siglongjmp(s->jmpbuf, 1);
30
}
31
@@ -XXX,XX +XXX,XX @@ static void gen_unknown_opcode(CPUX86State *env, DisasContext *s)
32
33
fprintf(logfile, "ILLOPC: " TARGET_FMT_lx ":", pc);
34
for (; pc < end; ++pc) {
35
- fprintf(logfile, " %02x", cpu_ldub_code(env, pc));
36
+ fprintf(logfile, " %02x", translator_ldub(env, &s->base, pc));
37
}
38
fprintf(logfile, "\n");
39
qemu_log_unlock(logfile);
40
--
41
2.34.1
42
43
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/avr/translate.c | 3 +--
5
1 file changed, 1 insertion(+), 2 deletions(-)
6
1
7
diff --git a/target/avr/translate.c b/target/avr/translate.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/avr/translate.c
10
+++ b/target/avr/translate.c
11
@@ -XXX,XX +XXX,XX @@
12
#include "cpu.h"
13
#include "exec/exec-all.h"
14
#include "tcg/tcg-op.h"
15
-#include "exec/cpu_ldst.h"
16
#include "exec/helper-proto.h"
17
#include "exec/helper-gen.h"
18
#include "exec/log.h"
19
@@ -XXX,XX +XXX,XX @@ static int to_regs_00_30_by_two(DisasContext *ctx, int indx)
20
21
static uint16_t next_word(DisasContext *ctx)
22
{
23
- return cpu_lduw_code(ctx->env, ctx->npc++ * 2);
24
+ return translator_lduw(ctx->env, &ctx->base, ctx->npc++ * 2);
25
}
26
27
static int append_16(DisasContext *ctx, int x)
28
--
29
2.34.1
30
31
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@amd.com>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
target/cris/translate.c | 1 -
6
target/cris/translate_v10.c.inc | 30 +++++++++---------------------
7
2 files changed, 9 insertions(+), 22 deletions(-)
8
1
9
diff --git a/target/cris/translate.c b/target/cris/translate.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/cris/translate.c
12
+++ b/target/cris/translate.c
13
@@ -XXX,XX +XXX,XX @@
14
#include "tcg/tcg-op.h"
15
#include "exec/helper-proto.h"
16
#include "mmu.h"
17
-#include "exec/cpu_ldst.h"
18
#include "exec/translator.h"
19
#include "crisv32-decode.h"
20
#include "qemu/qemu-print.h"
21
diff --git a/target/cris/translate_v10.c.inc b/target/cris/translate_v10.c.inc
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/cris/translate_v10.c.inc
24
+++ b/target/cris/translate_v10.c.inc
25
@@ -XXX,XX +XXX,XX @@ static int dec10_prep_move_m(CPUCRISState *env, DisasContext *dc,
26
27
/* Load [$rs] onto T1. */
28
if (is_imm) {
29
- if (memsize != 4) {
30
- if (s_ext) {
31
- if (memsize == 1)
32
- imm = cpu_ldsb_code(env, dc->pc + 2);
33
- else
34
- imm = cpu_ldsw_code(env, dc->pc + 2);
35
- } else {
36
- if (memsize == 1)
37
- imm = cpu_ldub_code(env, dc->pc + 2);
38
- else
39
- imm = cpu_lduw_code(env, dc->pc + 2);
40
- }
41
- } else
42
- imm = cpu_ldl_code(env, dc->pc + 2);
43
+ imm = cris_fetch(env, dc, dc->pc + 2, memsize, s_ext);
44
45
tcg_gen_movi_tl(dst, imm);
46
47
@@ -XXX,XX +XXX,XX @@ static int dec10_dip(CPUCRISState *env, DisasContext *dc)
48
LOG_DIS("dip pc=%x opcode=%d r%d r%d\n",
49
dc->pc, dc->opcode, dc->src, dc->dst);
50
if (dc->src == 15) {
51
- imm = cpu_ldl_code(env, dc->pc + 2);
52
+ imm = cris_fetch(env, dc, dc->pc + 2, 4, 0);
53
tcg_gen_movi_tl(cpu_PR[PR_PREFIX], imm);
54
- if (dc->postinc)
55
+ if (dc->postinc) {
56
insn_len += 4;
57
+ }
58
tcg_gen_addi_tl(cpu_R[15], cpu_R[15], insn_len - 2);
59
} else {
60
gen_load(dc, cpu_PR[PR_PREFIX], cpu_R[dc->src], 4, 0);
61
@@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc)
62
if (dc->src == 15) {
63
LOG_DIS("jump.%d %d r%d r%d direct\n", size,
64
dc->opcode, dc->src, dc->dst);
65
- imm = cpu_ldl_code(env, dc->pc + 2);
66
- if (dc->mode == CRISV10_MODE_AUTOINC)
67
+ imm = cris_fetch(env, dc, dc->pc + 2, size, 0);
68
+ if (dc->mode == CRISV10_MODE_AUTOINC) {
69
insn_len += size;
70
-
71
+ }
72
c = tcg_constant_tl(dc->pc + insn_len);
73
t_gen_mov_preg_TN(dc, dc->dst, c);
74
dc->jmp_pc = imm;
75
@@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc)
76
case CRISV10_IND_BCC_M:
77
78
cris_cc_mask(dc, 0);
79
- simm = cpu_ldsw_code(env, dc->pc + 2);
80
+ simm = cris_fetch(env, dc, dc->pc + 2, 2, 1);
81
simm += 4;
82
83
LOG_DIS("bcc_m: b%s %x\n", cc_name(dc->cond), dc->pc + simm);
84
@@ -XXX,XX +XXX,XX @@ static unsigned int crisv10_decoder(CPUCRISState *env, DisasContext *dc)
85
unsigned int insn_len = 2;
86
87
/* Load a halfword onto the instruction register. */
88
- dc->ir = cpu_lduw_code(env, dc->pc);
89
+ dc->ir = cris_fetch(env, dc, dc->pc, 2, 0);
90
91
/* Now decode it. */
92
dc->opcode = EXTRACT_FIELD(dc->ir, 6, 9);
93
--
94
2.34.1
95
96
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
target/riscv/translate.c | 6 +++---
6
1 file changed, 3 insertions(+), 3 deletions(-)
7
1
8
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/riscv/translate.c
11
+++ b/target/riscv/translate.c
12
@@ -XXX,XX +XXX,XX @@
13
#include "qemu/log.h"
14
#include "cpu.h"
15
#include "tcg/tcg-op.h"
16
-#include "exec/cpu_ldst.h"
17
#include "exec/exec-all.h"
18
#include "exec/helper-proto.h"
19
#include "exec/helper-gen.h"
20
@@ -XXX,XX +XXX,XX @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
21
CPUState *cpu = ctx->cs;
22
CPURISCVState *env = cpu_env(cpu);
23
24
- return cpu_ldl_code(env, pc);
25
+ return translator_ldl(env, &ctx->base, pc);
26
}
27
28
/* Include insn module translation function */
29
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
30
unsigned page_ofs = ctx->base.pc_next & ~TARGET_PAGE_MASK;
31
32
if (page_ofs > TARGET_PAGE_SIZE - MAX_INSN_LEN) {
33
- uint16_t next_insn = cpu_lduw_code(env, ctx->base.pc_next);
34
+ uint16_t next_insn =
35
+ translator_lduw(env, &ctx->base, ctx->base.pc_next);
36
int len = insn_len(next_insn);
37
38
if (!is_same_page(&ctx->base, ctx->base.pc_next + len - 1)) {
39
--
40
2.34.1
41
42
diff view generated by jsdifflib
1
Reviewed-by: Yoshinori Sato <ysato@users.sourceforge.jp>
1
These defines never should have been added as they were
2
never used. Only 32-bit hosts may have these opcodes and
3
they have them unconditionally.
4
5
Fixes: 6cb14e4de29 ("tcg/loongarch64: Add the tcg-target.h file")
6
Fixes: fb1f70f3685 ("tcg/riscv: Add the tcg-target.h file")
7
Acked-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
10
---
5
target/rx/translate.c | 27 ++++++++++++++-------------
11
tcg/loongarch64/tcg-target-has.h | 2 --
6
1 file changed, 14 insertions(+), 13 deletions(-)
12
tcg/riscv/tcg-target-has.h | 2 --
13
2 files changed, 4 deletions(-)
7
14
8
diff --git a/target/rx/translate.c b/target/rx/translate.c
15
diff --git a/tcg/loongarch64/tcg-target-has.h b/tcg/loongarch64/tcg-target-has.h
9
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
10
--- a/target/rx/translate.c
17
--- a/tcg/loongarch64/tcg-target-has.h
11
+++ b/target/rx/translate.c
18
+++ b/tcg/loongarch64/tcg-target-has.h
12
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
13
#include "cpu.h"
20
#define TCG_TARGET_HAS_clz_i32 1
14
#include "exec/exec-all.h"
21
#define TCG_TARGET_HAS_ctz_i32 1
15
#include "tcg/tcg-op.h"
22
#define TCG_TARGET_HAS_ctpop_i32 0
16
-#include "exec/cpu_ldst.h"
23
-#define TCG_TARGET_HAS_brcond2 0
17
#include "exec/helper-proto.h"
24
-#define TCG_TARGET_HAS_setcond2 0
18
#include "exec/helper-gen.h"
25
#define TCG_TARGET_HAS_qemu_st8_i32 0
19
#include "exec/translator.h"
26
20
@@ -XXX,XX +XXX,XX @@ static TCGv_i64 cpu_acc;
27
/* 64-bit operations */
21
28
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
22
/* decoder helper */
29
index XXXXXXX..XXXXXXX 100644
23
static uint32_t decode_load_bytes(DisasContext *ctx, uint32_t insn,
30
--- a/tcg/riscv/tcg-target-has.h
24
- int i, int n)
31
+++ b/tcg/riscv/tcg-target-has.h
25
+ int i, int n)
32
@@ -XXX,XX +XXX,XX @@
26
{
33
#define TCG_TARGET_HAS_clz_i32 (cpuinfo & CPUINFO_ZBB)
27
while (++i <= n) {
34
#define TCG_TARGET_HAS_ctz_i32 (cpuinfo & CPUINFO_ZBB)
28
- uint8_t b = cpu_ldub_code(ctx->env, ctx->base.pc_next++);
35
#define TCG_TARGET_HAS_ctpop_i32 (cpuinfo & CPUINFO_ZBB)
29
+ uint8_t b = translator_ldub(ctx->env, &ctx->base, ctx->base.pc_next++);
36
-#define TCG_TARGET_HAS_brcond2 1
30
insn |= b << (32 - i * 8);
37
-#define TCG_TARGET_HAS_setcond2 1
31
}
38
#define TCG_TARGET_HAS_qemu_st8_i32 0
32
return insn;
39
33
@@ -XXX,XX +XXX,XX @@ static uint32_t li(DisasContext *ctx, int sz)
40
#define TCG_TARGET_HAS_negsetcond_i64 1
34
CPURXState *env = ctx->env;
35
addr = ctx->base.pc_next;
36
37
- tcg_debug_assert(sz < 4);
38
switch (sz) {
39
case 1:
40
ctx->base.pc_next += 1;
41
- return cpu_ldsb_code(env, addr);
42
+ return (int8_t)translator_ldub(env, &ctx->base, addr);
43
case 2:
44
ctx->base.pc_next += 2;
45
- return cpu_ldsw_code(env, addr);
46
+ return (int16_t)translator_lduw(env, &ctx->base, addr);
47
case 3:
48
ctx->base.pc_next += 3;
49
- tmp = cpu_ldsb_code(env, addr + 2) << 16;
50
- tmp |= cpu_lduw_code(env, addr) & 0xffff;
51
+ tmp = (int8_t)translator_ldub(env, &ctx->base, addr + 2);
52
+ tmp <<= 16;
53
+ tmp |= translator_lduw(env, &ctx->base, addr);
54
return tmp;
55
case 0:
56
ctx->base.pc_next += 4;
57
- return cpu_ldl_code(env, addr);
58
+ return translator_ldl(env, &ctx->base, addr);
59
+ default:
60
+ g_assert_not_reached();
61
}
62
return 0;
63
}
64
@@ -XXX,XX +XXX,XX @@ static inline TCGv rx_index_addr(DisasContext *ctx, TCGv mem,
65
{
66
uint32_t dsp;
67
68
- tcg_debug_assert(ld < 3);
69
switch (ld) {
70
case 0:
71
return cpu_regs[reg];
72
case 1:
73
- dsp = cpu_ldub_code(ctx->env, ctx->base.pc_next) << size;
74
+ dsp = translator_ldub(ctx->env, &ctx->base, ctx->base.pc_next) << size;
75
tcg_gen_addi_i32(mem, cpu_regs[reg], dsp);
76
ctx->base.pc_next += 1;
77
return mem;
78
case 2:
79
- dsp = cpu_lduw_code(ctx->env, ctx->base.pc_next) << size;
80
+ dsp = translator_lduw(ctx->env, &ctx->base, ctx->base.pc_next) << size;
81
tcg_gen_addi_i32(mem, cpu_regs[reg], dsp);
82
ctx->base.pc_next += 2;
83
return mem;
84
+ default:
85
+ g_assert_not_reached();
86
}
87
- return NULL;
88
}
89
90
static inline MemOp mi_to_mop(unsigned mi)
91
--
41
--
92
2.34.1
42
2.43.0
93
43
94
44
diff view generated by jsdifflib