1
The following changes since commit 3e08b2b9cb64bff2b73fa9128c0e49bfcde0dd40:
1
The following changes since commit 6587b0c1331d427b0939c37e763842550ed581db:
2
2
3
Merge remote-tracking branch 'remotes/philmd-gitlab/tags/edk2-next-20200121' into staging (2020-01-21 15:29:25 +0000)
3
Merge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2021-10-15' into staging (2021-10-15 14:16:28 -0700)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/rth7680/qemu.git tags/pull-tcg-20200121
7
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20211016
8
8
9
for you to fetch changes up to 75fa376cdab5e5db2c7fdd107358e16f95503ac6:
9
for you to fetch changes up to 995b87dedc78b0467f5f18bbc3546072ba97516a:
10
10
11
scripts/git.orderfile: Display decodetree before C source (2020-01-21 15:26:09 -1000)
11
Revert "cpu: Move cpu_common_props to hw/core/cpu.c" (2021-10-15 16:39:15 -0700)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Remove another limit to NB_MMU_MODES.
14
Move gdb singlestep to generic code
15
Fix compilation using uclibc.
15
Fix cpu_common_props
16
Fix defaulting of -accel parameters.
17
Tidy cputlb basic routines.
18
Adjust git.orderfile for decodetree.
19
16
20
----------------------------------------------------------------
17
----------------------------------------------------------------
21
Carlos Santos (1):
18
Richard Henderson (24):
22
util/cacheinfo: fix crash when compiling with uClibc
19
accel/tcg: Handle gdb singlestep in cpu_tb_exec
20
target/alpha: Drop checks for singlestep_enabled
21
target/avr: Drop checks for singlestep_enabled
22
target/cris: Drop checks for singlestep_enabled
23
target/hexagon: Drop checks for singlestep_enabled
24
target/arm: Drop checks for singlestep_enabled
25
target/hppa: Drop checks for singlestep_enabled
26
target/i386: Check CF_NO_GOTO_TB for dc->jmp_opt
27
target/i386: Drop check for singlestep_enabled
28
target/m68k: Drop checks for singlestep_enabled
29
target/microblaze: Check CF_NO_GOTO_TB for DISAS_JUMP
30
target/microblaze: Drop checks for singlestep_enabled
31
target/mips: Fix single stepping
32
target/mips: Drop exit checks for singlestep_enabled
33
target/openrisc: Drop checks for singlestep_enabled
34
target/ppc: Drop exit checks for singlestep_enabled
35
target/riscv: Remove dead code after exception
36
target/riscv: Remove exit_tb and lookup_and_goto_ptr
37
target/rx: Drop checks for singlestep_enabled
38
target/s390x: Drop check for singlestep_enabled
39
target/sh4: Drop check for singlestep_enabled
40
target/tricore: Drop check for singlestep_enabled
41
target/xtensa: Drop check for singlestep_enabled
42
Revert "cpu: Move cpu_common_props to hw/core/cpu.c"
23
43
24
Philippe Mathieu-Daudé (1):
44
include/hw/core/cpu.h | 1 +
25
scripts/git.orderfile: Display decodetree before C source
45
target/i386/helper.h | 1 -
46
target/rx/helper.h | 1 -
47
target/sh4/helper.h | 1 -
48
target/tricore/helper.h | 1 -
49
accel/tcg/cpu-exec.c | 11 ++++
50
cpu.c | 21 ++++++++
51
hw/core/cpu-common.c | 17 +-----
52
target/alpha/translate.c | 13 ++---
53
target/arm/translate-a64.c | 10 +---
54
target/arm/translate.c | 36 +++----------
55
target/avr/translate.c | 19 ++-----
56
target/cris/translate.c | 16 ------
57
target/hexagon/translate.c | 12 +----
58
target/hppa/translate.c | 17 ++----
59
target/i386/tcg/misc_helper.c | 8 ---
60
target/i386/tcg/translate.c | 9 ++--
61
target/m68k/translate.c | 44 ++++-----------
62
target/microblaze/translate.c | 18 ++-----
63
target/mips/tcg/translate.c | 75 ++++++++++++--------------
64
target/openrisc/translate.c | 18 ++-----
65
target/ppc/translate.c | 38 +++----------
66
target/riscv/translate.c | 27 +---------
67
target/rx/op_helper.c | 8 ---
68
target/rx/translate.c | 12 +----
69
target/s390x/tcg/translate.c | 8 +--
70
target/sh4/op_helper.c | 5 --
71
target/sh4/translate.c | 14 ++---
72
target/tricore/op_helper.c | 7 ---
73
target/tricore/translate.c | 14 +----
74
target/xtensa/translate.c | 25 +++------
75
target/riscv/insn_trans/trans_privileged.c.inc | 10 ++--
76
target/riscv/insn_trans/trans_rvi.c.inc | 8 ++-
77
target/riscv/insn_trans/trans_rvv.c.inc | 2 +-
78
34 files changed, 141 insertions(+), 386 deletions(-)
26
79
27
Richard Henderson (14):
28
cputlb: Handle NB_MMU_MODES > TARGET_PAGE_BITS_MIN
29
vl: Remove unused variable in configure_accelerators
30
vl: Reduce scope of variables in configure_accelerators
31
vl: Remove useless test in configure_accelerators
32
vl: Only choose enabled accelerators in configure_accelerators
33
cputlb: Merge tlb_table_flush_by_mmuidx into tlb_flush_one_mmuidx_locked
34
cputlb: Make tlb_n_entries private to cputlb.c
35
cputlb: Pass CPUTLBDescFast to tlb_n_entries and sizeof_tlb
36
cputlb: Hoist tlb portions in tlb_mmu_resize_locked
37
cputlb: Hoist tlb portions in tlb_flush_one_mmuidx_locked
38
cputlb: Split out tlb_mmu_flush_locked
39
cputlb: Partially merge tlb_dyn_init into tlb_init
40
cputlb: Initialize tlbs as flushed
41
cputlb: Hoist timestamp outside of loops over tlbs
42
43
include/exec/cpu_ldst.h | 5 -
44
accel/tcg/cputlb.c | 287 +++++++++++++++++++++++++++++++++---------------
45
util/cacheinfo.c | 10 +-
46
vl.c | 27 +++--
47
scripts/git.orderfile | 3 +
48
5 files changed, 223 insertions(+), 109 deletions(-)
49
diff view generated by jsdifflib
New patch
1
Currently the change in cpu_tb_exec is masked by the debug exception
2
being raised by the translators. But this allows us to remove that code.
1
3
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
accel/tcg/cpu-exec.c | 11 +++++++++++
7
1 file changed, 11 insertions(+)
8
9
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/accel/tcg/cpu-exec.c
12
+++ b/accel/tcg/cpu-exec.c
13
@@ -XXX,XX +XXX,XX @@ cpu_tb_exec(CPUState *cpu, TranslationBlock *itb, int *tb_exit)
14
cc->set_pc(cpu, last_tb->pc);
15
}
16
}
17
+
18
+ /*
19
+ * If gdb single-step, and we haven't raised another exception,
20
+ * raise a debug exception. Single-step with another exception
21
+ * is handled in cpu_handle_exception.
22
+ */
23
+ if (unlikely(cpu->singlestep_enabled) && cpu->exception_index == -1) {
24
+ cpu->exception_index = EXCP_DEBUG;
25
+ cpu_loop_exit(cpu);
26
+ }
27
+
28
return last_tb;
29
}
30
31
--
32
2.25.1
33
34
diff view generated by jsdifflib
New patch
1
GDB single-stepping is now handled generically.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/alpha/translate.c | 13 +++----------
7
1 file changed, 3 insertions(+), 10 deletions(-)
8
9
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/alpha/translate.c
12
+++ b/target/alpha/translate.c
13
@@ -XXX,XX +XXX,XX @@ static void alpha_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
14
tcg_gen_movi_i64(cpu_pc, ctx->base.pc_next);
15
/* FALLTHRU */
16
case DISAS_PC_UPDATED:
17
- if (!ctx->base.singlestep_enabled) {
18
- tcg_gen_lookup_and_goto_ptr();
19
- break;
20
- }
21
- /* FALLTHRU */
22
+ tcg_gen_lookup_and_goto_ptr();
23
+ break;
24
case DISAS_PC_UPDATED_NOCHAIN:
25
- if (ctx->base.singlestep_enabled) {
26
- gen_excp_1(EXCP_DEBUG, 0);
27
- } else {
28
- tcg_gen_exit_tb(NULL, 0);
29
- }
30
+ tcg_gen_exit_tb(NULL, 0);
31
break;
32
default:
33
g_assert_not_reached();
34
--
35
2.25.1
36
37
diff view generated by jsdifflib
New patch
1
GDB single-stepping is now handled generically.
1
2
3
Tested-by: Michael Rolnik <mrolnik@gmail.com>
4
Reviewed-by: Michael Rolnik <mrolnik@gmail.com>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
target/avr/translate.c | 19 ++++---------------
9
1 file changed, 4 insertions(+), 15 deletions(-)
10
11
diff --git a/target/avr/translate.c b/target/avr/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/avr/translate.c
14
+++ b/target/avr/translate.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
16
tcg_gen_exit_tb(tb, n);
17
} else {
18
tcg_gen_movi_i32(cpu_pc, dest);
19
- if (ctx->base.singlestep_enabled) {
20
- gen_helper_debug(cpu_env);
21
- } else {
22
- tcg_gen_lookup_and_goto_ptr();
23
- }
24
+ tcg_gen_lookup_and_goto_ptr();
25
}
26
ctx->base.is_jmp = DISAS_NORETURN;
27
}
28
@@ -XXX,XX +XXX,XX @@ static void avr_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
29
tcg_gen_movi_tl(cpu_pc, ctx->npc);
30
/* fall through */
31
case DISAS_LOOKUP:
32
- if (!ctx->base.singlestep_enabled) {
33
- tcg_gen_lookup_and_goto_ptr();
34
- break;
35
- }
36
- /* fall through */
37
+ tcg_gen_lookup_and_goto_ptr();
38
+ break;
39
case DISAS_EXIT:
40
- if (ctx->base.singlestep_enabled) {
41
- gen_helper_debug(cpu_env);
42
- } else {
43
- tcg_gen_exit_tb(NULL, 0);
44
- }
45
+ tcg_gen_exit_tb(NULL, 0);
46
break;
47
default:
48
g_assert_not_reached();
49
--
50
2.25.1
51
52
diff view generated by jsdifflib
New patch
1
GDB single-stepping is now handled generically.
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
target/cris/translate.c | 16 ----------------
6
1 file changed, 16 deletions(-)
7
8
diff --git a/target/cris/translate.c b/target/cris/translate.c
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/cris/translate.c
11
+++ b/target/cris/translate.c
12
@@ -XXX,XX +XXX,XX @@ static void cris_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
13
}
14
}
15
16
- if (unlikely(dc->base.singlestep_enabled)) {
17
- switch (is_jmp) {
18
- case DISAS_TOO_MANY:
19
- case DISAS_UPDATE_NEXT:
20
- tcg_gen_movi_tl(env_pc, npc);
21
- /* fall through */
22
- case DISAS_JUMP:
23
- case DISAS_UPDATE:
24
- t_gen_raise_exception(EXCP_DEBUG);
25
- return;
26
- default:
27
- break;
28
- }
29
- g_assert_not_reached();
30
- }
31
-
32
switch (is_jmp) {
33
case DISAS_TOO_MANY:
34
gen_goto_tb(dc, 0, npc);
35
--
36
2.25.1
37
38
diff view generated by jsdifflib
New patch
1
GDB single-stepping is now handled generically.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/hexagon/translate.c | 12 ++----------
7
1 file changed, 2 insertions(+), 10 deletions(-)
8
9
diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/hexagon/translate.c
12
+++ b/target/hexagon/translate.c
13
@@ -XXX,XX +XXX,XX @@ static void gen_end_tb(DisasContext *ctx)
14
{
15
gen_exec_counters(ctx);
16
tcg_gen_mov_tl(hex_gpr[HEX_REG_PC], hex_next_PC);
17
- if (ctx->base.singlestep_enabled) {
18
- gen_exception_raw(EXCP_DEBUG);
19
- } else {
20
- tcg_gen_exit_tb(NULL, 0);
21
- }
22
+ tcg_gen_exit_tb(NULL, 0);
23
ctx->base.is_jmp = DISAS_NORETURN;
24
}
25
26
@@ -XXX,XX +XXX,XX @@ static void hexagon_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
27
case DISAS_TOO_MANY:
28
gen_exec_counters(ctx);
29
tcg_gen_movi_tl(hex_gpr[HEX_REG_PC], ctx->base.pc_next);
30
- if (ctx->base.singlestep_enabled) {
31
- gen_exception_raw(EXCP_DEBUG);
32
- } else {
33
- tcg_gen_exit_tb(NULL, 0);
34
- }
35
+ tcg_gen_exit_tb(NULL, 0);
36
break;
37
case DISAS_NORETURN:
38
break;
39
--
40
2.25.1
41
42
diff view generated by jsdifflib
New patch
1
GDB single-stepping is now handled generically.
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
target/arm/translate-a64.c | 10 ++--------
6
target/arm/translate.c | 36 ++++++------------------------------
7
2 files changed, 8 insertions(+), 38 deletions(-)
8
9
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/arm/translate-a64.c
12
+++ b/target/arm/translate-a64.c
13
@@ -XXX,XX +XXX,XX @@ static inline void gen_goto_tb(DisasContext *s, int n, uint64_t dest)
14
gen_a64_set_pc_im(dest);
15
if (s->ss_active) {
16
gen_step_complete_exception(s);
17
- } else if (s->base.singlestep_enabled) {
18
- gen_exception_internal(EXCP_DEBUG);
19
} else {
20
tcg_gen_lookup_and_goto_ptr();
21
s->base.is_jmp = DISAS_NORETURN;
22
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
23
{
24
DisasContext *dc = container_of(dcbase, DisasContext, base);
25
26
- if (unlikely(dc->base.singlestep_enabled || dc->ss_active)) {
27
+ if (unlikely(dc->ss_active)) {
28
/* Note that this means single stepping WFI doesn't halt the CPU.
29
* For conditional branch insns this is harmless unreachable code as
30
* gen_goto_tb() has already handled emitting the debug exception
31
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
32
/* fall through */
33
case DISAS_EXIT:
34
case DISAS_JUMP:
35
- if (dc->base.singlestep_enabled) {
36
- gen_exception_internal(EXCP_DEBUG);
37
- } else {
38
- gen_step_complete_exception(dc);
39
- }
40
+ gen_step_complete_exception(dc);
41
break;
42
case DISAS_NORETURN:
43
break;
44
diff --git a/target/arm/translate.c b/target/arm/translate.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/translate.c
47
+++ b/target/arm/translate.c
48
@@ -XXX,XX +XXX,XX @@ static void gen_exception_internal(int excp)
49
tcg_temp_free_i32(tcg_excp);
50
}
51
52
-static void gen_step_complete_exception(DisasContext *s)
53
+static void gen_singlestep_exception(DisasContext *s)
54
{
55
/* We just completed step of an insn. Move from Active-not-pending
56
* to Active-pending, and then also take the swstep exception.
57
@@ -XXX,XX +XXX,XX @@ static void gen_step_complete_exception(DisasContext *s)
58
s->base.is_jmp = DISAS_NORETURN;
59
}
60
61
-static void gen_singlestep_exception(DisasContext *s)
62
-{
63
- /* Generate the right kind of exception for singlestep, which is
64
- * either the architectural singlestep or EXCP_DEBUG for QEMU's
65
- * gdb singlestepping.
66
- */
67
- if (s->ss_active) {
68
- gen_step_complete_exception(s);
69
- } else {
70
- gen_exception_internal(EXCP_DEBUG);
71
- }
72
-}
73
-
74
-static inline bool is_singlestepping(DisasContext *s)
75
-{
76
- /* Return true if we are singlestepping either because of
77
- * architectural singlestep or QEMU gdbstub singlestep. This does
78
- * not include the command line '-singlestep' mode which is rather
79
- * misnamed as it only means "one instruction per TB" and doesn't
80
- * affect the code we generate.
81
- */
82
- return s->base.singlestep_enabled || s->ss_active;
83
-}
84
-
85
void clear_eci_state(DisasContext *s)
86
{
87
/*
88
@@ -XXX,XX +XXX,XX @@ static inline void gen_bx_excret_final_code(DisasContext *s)
89
/* Is the new PC value in the magic range indicating exception return? */
90
tcg_gen_brcondi_i32(TCG_COND_GEU, cpu_R[15], min_magic, excret_label);
91
/* No: end the TB as we would for a DISAS_JMP */
92
- if (is_singlestepping(s)) {
93
+ if (s->ss_active) {
94
gen_singlestep_exception(s);
95
} else {
96
tcg_gen_exit_tb(NULL, 0);
97
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *s, int n, target_ulong dest)
98
/* Jump, specifying which TB number to use if we gen_goto_tb() */
99
static inline void gen_jmp_tb(DisasContext *s, uint32_t dest, int tbno)
100
{
101
- if (unlikely(is_singlestepping(s))) {
102
+ if (unlikely(s->ss_active)) {
103
/* An indirect jump so that we still trigger the debug exception. */
104
gen_set_pc_im(s, dest);
105
s->base.is_jmp = DISAS_JUMP;
106
@@ -XXX,XX +XXX,XX @@ static void arm_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
107
dc->page_start = dc->base.pc_first & TARGET_PAGE_MASK;
108
109
/* If architectural single step active, limit to 1. */
110
- if (is_singlestepping(dc)) {
111
+ if (dc->ss_active) {
112
dc->base.max_insns = 1;
113
}
114
115
@@ -XXX,XX +XXX,XX @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
116
* insn codepath itself.
117
*/
118
gen_bx_excret_final_code(dc);
119
- } else if (unlikely(is_singlestepping(dc))) {
120
+ } else if (unlikely(dc->ss_active)) {
121
/* Unconditional and "condition passed" instruction codepath. */
122
switch (dc->base.is_jmp) {
123
case DISAS_SWI:
124
@@ -XXX,XX +XXX,XX @@ static void arm_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
125
/* "Condition failed" instruction codepath for the branch/trap insn */
126
gen_set_label(dc->condlabel);
127
gen_set_condexec(dc);
128
- if (unlikely(is_singlestepping(dc))) {
129
+ if (unlikely(dc->ss_active)) {
130
gen_set_pc_im(dc, dc->base.pc_next);
131
gen_singlestep_exception(dc);
132
} else {
133
--
134
2.25.1
135
136
diff view generated by jsdifflib
New patch
1
GDB single-stepping is now handled generically.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/hppa/translate.c | 17 ++++-------------
7
1 file changed, 4 insertions(+), 13 deletions(-)
8
9
diff --git a/target/hppa/translate.c b/target/hppa/translate.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/hppa/translate.c
12
+++ b/target/hppa/translate.c
13
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int which,
14
} else {
15
copy_iaoq_entry(cpu_iaoq_f, f, cpu_iaoq_b);
16
copy_iaoq_entry(cpu_iaoq_b, b, ctx->iaoq_n_var);
17
- if (ctx->base.singlestep_enabled) {
18
- gen_excp_1(EXCP_DEBUG);
19
- } else {
20
- tcg_gen_lookup_and_goto_ptr();
21
- }
22
+ tcg_gen_lookup_and_goto_ptr();
23
}
24
}
25
26
@@ -XXX,XX +XXX,XX @@ static bool do_rfi(DisasContext *ctx, bool rfi_r)
27
gen_helper_rfi(cpu_env);
28
}
29
/* Exit the TB to recognize new interrupts. */
30
- if (ctx->base.singlestep_enabled) {
31
- gen_excp_1(EXCP_DEBUG);
32
- } else {
33
- tcg_gen_exit_tb(NULL, 0);
34
- }
35
+ tcg_gen_exit_tb(NULL, 0);
36
ctx->base.is_jmp = DISAS_NORETURN;
37
38
return nullify_end(ctx);
39
@@ -XXX,XX +XXX,XX @@ static void hppa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
40
nullify_save(ctx);
41
/* FALLTHRU */
42
case DISAS_IAQ_N_UPDATED:
43
- if (ctx->base.singlestep_enabled) {
44
- gen_excp_1(EXCP_DEBUG);
45
- } else if (is_jmp != DISAS_IAQ_N_STALE_EXIT) {
46
+ if (is_jmp != DISAS_IAQ_N_STALE_EXIT) {
47
tcg_gen_lookup_and_goto_ptr();
48
+ break;
49
}
50
/* FALLTHRU */
51
case DISAS_EXIT:
52
--
53
2.25.1
54
55
diff view generated by jsdifflib
New patch
1
We were using singlestep_enabled as a proxy for whether
2
translator_use_goto_tb would always return false.
1
3
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/i386/tcg/translate.c | 5 +++--
7
1 file changed, 3 insertions(+), 2 deletions(-)
8
9
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/i386/tcg/translate.c
12
+++ b/target/i386/tcg/translate.c
13
@@ -XXX,XX +XXX,XX @@ static void i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
14
DisasContext *dc = container_of(dcbase, DisasContext, base);
15
CPUX86State *env = cpu->env_ptr;
16
uint32_t flags = dc->base.tb->flags;
17
+ uint32_t cflags = tb_cflags(dc->base.tb);
18
int cpl = (flags >> HF_CPL_SHIFT) & 3;
19
int iopl = (flags >> IOPL_SHIFT) & 3;
20
21
@@ -XXX,XX +XXX,XX @@ static void i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
22
dc->cpuid_ext3_features = env->features[FEAT_8000_0001_ECX];
23
dc->cpuid_7_0_ebx_features = env->features[FEAT_7_0_EBX];
24
dc->cpuid_xsave_features = env->features[FEAT_XSAVE];
25
- dc->jmp_opt = !(dc->base.singlestep_enabled ||
26
+ dc->jmp_opt = !((cflags & CF_NO_GOTO_TB) ||
27
(flags & (HF_TF_MASK | HF_INHIBIT_IRQ_MASK)));
28
/*
29
* If jmp_opt, we want to handle each string instruction individually.
30
* For icount also disable repz optimization so that each iteration
31
* is accounted separately.
32
*/
33
- dc->repz_opt = !dc->jmp_opt && !(tb_cflags(dc->base.tb) & CF_USE_ICOUNT);
34
+ dc->repz_opt = !dc->jmp_opt && !(cflags & CF_USE_ICOUNT);
35
36
dc->T0 = tcg_temp_new();
37
dc->T1 = tcg_temp_new();
38
--
39
2.25.1
40
41
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
GDB single-stepping is now handled generically.
2
2
3
To avoid scrolling each instruction when reviewing tcg
4
helpers written for the decodetree script, display the
5
.decode files (similar to header declarations) before
6
the C source (implementation of previous declarations).
7
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
10
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
11
Message-Id: <20191230082856.30556-1-philmd@redhat.com>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
---
4
---
14
scripts/git.orderfile | 3 +++
5
target/i386/helper.h | 1 -
15
1 file changed, 3 insertions(+)
6
target/i386/tcg/misc_helper.c | 8 --------
7
target/i386/tcg/translate.c | 4 +---
8
3 files changed, 1 insertion(+), 12 deletions(-)
16
9
17
diff --git a/scripts/git.orderfile b/scripts/git.orderfile
10
diff --git a/target/i386/helper.h b/target/i386/helper.h
18
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
19
--- a/scripts/git.orderfile
12
--- a/target/i386/helper.h
20
+++ b/scripts/git.orderfile
13
+++ b/target/i386/helper.h
21
@@ -XXX,XX +XXX,XX @@ qga/*.json
14
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(syscall, void, env, int)
22
# headers
15
DEF_HELPER_2(sysret, void, env, int)
23
*.h
16
#endif
24
17
DEF_HELPER_FLAGS_2(pause, TCG_CALL_NO_WG, noreturn, env, int)
25
+# decoding tree specification
18
-DEF_HELPER_FLAGS_1(debug, TCG_CALL_NO_WG, noreturn, env)
26
+*.decode
19
DEF_HELPER_1(reset_rf, void, env)
27
+
20
DEF_HELPER_FLAGS_3(raise_interrupt, TCG_CALL_NO_WG, noreturn, env, int, int)
28
# code
21
DEF_HELPER_FLAGS_2(raise_exception, TCG_CALL_NO_WG, noreturn, env, int)
29
*.c
22
diff --git a/target/i386/tcg/misc_helper.c b/target/i386/tcg/misc_helper.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/target/i386/tcg/misc_helper.c
25
+++ b/target/i386/tcg/misc_helper.c
26
@@ -XXX,XX +XXX,XX @@ void QEMU_NORETURN helper_pause(CPUX86State *env, int next_eip_addend)
27
do_pause(env);
28
}
29
30
-void QEMU_NORETURN helper_debug(CPUX86State *env)
31
-{
32
- CPUState *cs = env_cpu(env);
33
-
34
- cs->exception_index = EXCP_DEBUG;
35
- cpu_loop_exit(cs);
36
-}
37
-
38
uint64_t helper_rdpkru(CPUX86State *env, uint32_t ecx)
39
{
40
if ((env->cr[4] & CR4_PKE_MASK) == 0) {
41
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/target/i386/tcg/translate.c
44
+++ b/target/i386/tcg/translate.c
45
@@ -XXX,XX +XXX,XX @@ do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, bool jr)
46
if (s->base.tb->flags & HF_RF_MASK) {
47
gen_helper_reset_rf(cpu_env);
48
}
49
- if (s->base.singlestep_enabled) {
50
- gen_helper_debug(cpu_env);
51
- } else if (recheck_tf) {
52
+ if (recheck_tf) {
53
gen_helper_rechecking_single_step(cpu_env);
54
tcg_gen_exit_tb(NULL, 0);
55
} else if (s->flags & HF_TF_MASK) {
30
--
56
--
31
2.20.1
57
2.25.1
32
58
33
59
diff view generated by jsdifflib
1
There is only one caller for tlb_table_flush_by_mmuidx. Place
1
GDB single-stepping is now handled generically.
2
the result at the earlier line number, due to an expected user
3
in the near future.
4
2
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
3
Acked-by: Laurent Vivier <laurent@vivier.eu>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
5
---
9
accel/tcg/cputlb.c | 19 +++++++------------
6
target/m68k/translate.c | 44 +++++++++--------------------------------
10
1 file changed, 7 insertions(+), 12 deletions(-)
7
1 file changed, 9 insertions(+), 35 deletions(-)
11
8
12
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
9
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
13
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
14
--- a/accel/tcg/cputlb.c
11
--- a/target/m68k/translate.c
15
+++ b/accel/tcg/cputlb.c
12
+++ b/target/m68k/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void tlb_mmu_resize_locked(CPUArchState *env, int mmu_idx)
13
@@ -XXX,XX +XXX,XX @@ static void do_writebacks(DisasContext *s)
17
}
14
}
18
}
15
}
19
16
20
-static inline void tlb_table_flush_by_mmuidx(CPUArchState *env, int mmu_idx)
17
-static bool is_singlestepping(DisasContext *s)
21
+static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
22
{
23
tlb_mmu_resize_locked(env, mmu_idx);
24
- memset(env_tlb(env)->f[mmu_idx].table, -1, sizeof_tlb(env, mmu_idx));
25
env_tlb(env)->d[mmu_idx].n_used_entries = 0;
26
+ env_tlb(env)->d[mmu_idx].large_page_addr = -1;
27
+ env_tlb(env)->d[mmu_idx].large_page_mask = -1;
28
+ env_tlb(env)->d[mmu_idx].vindex = 0;
29
+ memset(env_tlb(env)->f[mmu_idx].table, -1, sizeof_tlb(env, mmu_idx));
30
+ memset(env_tlb(env)->d[mmu_idx].vtable, -1,
31
+ sizeof(env_tlb(env)->d[0].vtable));
32
}
33
34
static inline void tlb_n_used_entries_inc(CPUArchState *env, uintptr_t mmu_idx)
35
@@ -XXX,XX +XXX,XX @@ void tlb_flush_counts(size_t *pfull, size_t *ppart, size_t *pelide)
36
*pelide = elide;
37
}
38
39
-static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
40
-{
18
-{
41
- tlb_table_flush_by_mmuidx(env, mmu_idx);
19
- /*
42
- env_tlb(env)->d[mmu_idx].large_page_addr = -1;
20
- * Return true if we are singlestepping either because of
43
- env_tlb(env)->d[mmu_idx].large_page_mask = -1;
21
- * architectural singlestep or QEMU gdbstub singlestep. This does
44
- env_tlb(env)->d[mmu_idx].vindex = 0;
22
- * not include the command line '-singlestep' mode which is rather
45
- memset(env_tlb(env)->d[mmu_idx].vtable, -1,
23
- * misnamed as it only means "one instruction per TB" and doesn't
46
- sizeof(env_tlb(env)->d[0].vtable));
24
- * affect the code we generate.
25
- */
26
- return s->base.singlestep_enabled || s->ss_active;
47
-}
27
-}
48
-
28
-
49
static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data)
29
/* is_jmp field values */
30
#define DISAS_JUMP DISAS_TARGET_0 /* only pc was modified dynamically */
31
#define DISAS_EXIT DISAS_TARGET_1 /* cpu state was modified dynamically */
32
@@ -XXX,XX +XXX,XX @@ static void gen_exception(DisasContext *s, uint32_t dest, int nr)
33
s->base.is_jmp = DISAS_NORETURN;
34
}
35
36
-static void gen_singlestep_exception(DisasContext *s)
37
-{
38
- /*
39
- * Generate the right kind of exception for singlestep, which is
40
- * either the architectural singlestep or EXCP_DEBUG for QEMU's
41
- * gdb singlestepping.
42
- */
43
- if (s->ss_active) {
44
- gen_raise_exception(EXCP_TRACE);
45
- } else {
46
- gen_raise_exception(EXCP_DEBUG);
47
- }
48
-}
49
-
50
static inline void gen_addr_fault(DisasContext *s)
50
{
51
{
51
CPUArchState *env = cpu->env_ptr;
52
gen_exception(s, s->base.pc_next, EXCP_ADDRESS);
53
@@ -XXX,XX +XXX,XX @@ static void gen_exit_tb(DisasContext *s)
54
/* Generate a jump to an immediate address. */
55
static void gen_jmp_tb(DisasContext *s, int n, uint32_t dest)
56
{
57
- if (unlikely(is_singlestepping(s))) {
58
+ if (unlikely(s->ss_active)) {
59
update_cc_op(s);
60
tcg_gen_movi_i32(QREG_PC, dest);
61
- gen_singlestep_exception(s);
62
+ gen_raise_exception(EXCP_TRACE);
63
} else if (translator_use_goto_tb(&s->base, dest)) {
64
tcg_gen_goto_tb(n);
65
tcg_gen_movi_i32(QREG_PC, dest);
66
@@ -XXX,XX +XXX,XX @@ static void m68k_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
67
68
dc->ss_active = (M68K_SR_TRACE(env->sr) == M68K_SR_TRACE_ANY_INS);
69
/* If architectural single step active, limit to 1 */
70
- if (is_singlestepping(dc)) {
71
+ if (dc->ss_active) {
72
dc->base.max_insns = 1;
73
}
74
}
75
@@ -XXX,XX +XXX,XX @@ static void m68k_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
76
break;
77
case DISAS_TOO_MANY:
78
update_cc_op(dc);
79
- if (is_singlestepping(dc)) {
80
+ if (dc->ss_active) {
81
tcg_gen_movi_i32(QREG_PC, dc->pc);
82
- gen_singlestep_exception(dc);
83
+ gen_raise_exception(EXCP_TRACE);
84
} else {
85
gen_jmp_tb(dc, 0, dc->pc);
86
}
87
break;
88
case DISAS_JUMP:
89
/* We updated CC_OP and PC in gen_jmp/gen_jmp_im. */
90
- if (is_singlestepping(dc)) {
91
- gen_singlestep_exception(dc);
92
+ if (dc->ss_active) {
93
+ gen_raise_exception(EXCP_TRACE);
94
} else {
95
tcg_gen_lookup_and_goto_ptr();
96
}
97
@@ -XXX,XX +XXX,XX @@ static void m68k_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
98
* We updated CC_OP and PC in gen_exit_tb, but also modified
99
* other state that may require returning to the main loop.
100
*/
101
- if (is_singlestepping(dc)) {
102
- gen_singlestep_exception(dc);
103
+ if (dc->ss_active) {
104
+ gen_raise_exception(EXCP_TRACE);
105
} else {
106
tcg_gen_exit_tb(NULL, 0);
107
}
52
--
108
--
53
2.20.1
109
2.25.1
54
110
55
111
diff view generated by jsdifflib
1
By choosing "tcg:kvm" when kvm is not enabled, we generate
1
We were using singlestep_enabled as a proxy for whether
2
an incorrect warning: "invalid accelerator kvm".
2
translator_use_goto_tb would always return false.
3
3
4
At the same time, use g_str_has_suffix rather than open-coding
5
the same operation.
6
7
Presumably the inverse is also true with --disable-tcg.
8
9
Fixes: 28a0961757fc
10
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Reviewed by: Aleksandar Markovic <amarkovic@wavecomp.com>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
---
5
---
15
vl.c | 21 +++++++++++++--------
6
target/microblaze/translate.c | 4 ++--
16
1 file changed, 13 insertions(+), 8 deletions(-)
7
1 file changed, 2 insertions(+), 2 deletions(-)
17
8
18
diff --git a/vl.c b/vl.c
9
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
19
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
20
--- a/vl.c
11
--- a/target/microblaze/translate.c
21
+++ b/vl.c
12
+++ b/target/microblaze/translate.c
22
@@ -XXX,XX +XXX,XX @@ static void configure_accelerators(const char *progname)
13
@@ -XXX,XX +XXX,XX @@ static void mb_tr_tb_stop(DisasContextBase *dcb, CPUState *cs)
23
14
break;
24
if (accel == NULL) {
15
25
/* Select the default accelerator */
16
case DISAS_JUMP:
26
- if (!accel_find("tcg") && !accel_find("kvm")) {
17
- if (dc->jmp_dest != -1 && !cs->singlestep_enabled) {
27
- error_report("No accelerator selected and"
18
+ if (dc->jmp_dest != -1 && !(tb_cflags(dc->base.tb) & CF_NO_GOTO_TB)) {
28
- " no default accelerator available");
19
/* Direct jump. */
29
- exit(1);
20
tcg_gen_discard_i32(cpu_btarget);
30
- } else {
21
31
- int pnlen = strlen(progname);
22
@@ -XXX,XX +XXX,XX @@ static void mb_tr_tb_stop(DisasContextBase *dcb, CPUState *cs)
32
- if (pnlen >= 3 && g_str_equal(&progname[pnlen - 3], "kvm")) {
23
return;
33
+ bool have_tcg = accel_find("tcg");
34
+ bool have_kvm = accel_find("kvm");
35
+
36
+ if (have_tcg && have_kvm) {
37
+ if (g_str_has_suffix(progname, "kvm")) {
38
/* If the program name ends with "kvm", we prefer KVM */
39
accel = "kvm:tcg";
40
} else {
41
accel = "tcg:kvm";
42
}
43
+ } else if (have_kvm) {
44
+ accel = "kvm";
45
+ } else if (have_tcg) {
46
+ accel = "tcg";
47
+ } else {
48
+ error_report("No accelerator selected and"
49
+ " no default accelerator available");
50
+ exit(1);
51
}
52
}
24
}
53
-
25
54
accel_list = g_strsplit(accel, ":", 0);
26
- /* Indirect jump (or direct jump w/ singlestep) */
55
27
+ /* Indirect jump (or direct jump w/ goto_tb disabled) */
56
for (tmp = accel_list; *tmp; tmp++) {
28
tcg_gen_mov_i32(cpu_pc, cpu_btarget);
29
tcg_gen_discard_i32(cpu_btarget);
30
57
--
31
--
58
2.20.1
32
2.25.1
59
33
60
34
diff view generated by jsdifflib
1
The result of g_strsplit is never NULL.
1
GDB single-stepping is now handled generically.
2
2
3
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Reviewed by: Aleksandar Markovic <amarkovic@wavecomp.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
4
---
9
vl.c | 2 +-
5
target/microblaze/translate.c | 14 ++------------
10
1 file changed, 1 insertion(+), 1 deletion(-)
6
1 file changed, 2 insertions(+), 12 deletions(-)
11
7
12
diff --git a/vl.c b/vl.c
8
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
13
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
14
--- a/vl.c
10
--- a/target/microblaze/translate.c
15
+++ b/vl.c
11
+++ b/target/microblaze/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void configure_accelerators(const char *progname)
12
@@ -XXX,XX +XXX,XX @@ static void gen_raise_hw_excp(DisasContext *dc, uint32_t esr_ec)
17
13
18
accel_list = g_strsplit(accel, ":", 0);
14
static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest)
19
15
{
20
- for (tmp = accel_list; tmp && *tmp; tmp++) {
16
- if (dc->base.singlestep_enabled) {
21
+ for (tmp = accel_list; *tmp; tmp++) {
17
- TCGv_i32 tmp = tcg_const_i32(EXCP_DEBUG);
22
/*
18
- tcg_gen_movi_i32(cpu_pc, dest);
23
* Filter invalid accelerators here, to prevent obscenities
19
- gen_helper_raise_exception(cpu_env, tmp);
24
* such as "-machine accel=tcg,,thread=single".
20
- tcg_temp_free_i32(tmp);
21
- } else if (translator_use_goto_tb(&dc->base, dest)) {
22
+ if (translator_use_goto_tb(&dc->base, dest)) {
23
tcg_gen_goto_tb(n);
24
tcg_gen_movi_i32(cpu_pc, dest);
25
tcg_gen_exit_tb(dc->base.tb, n);
26
@@ -XXX,XX +XXX,XX @@ static void mb_tr_tb_stop(DisasContextBase *dcb, CPUState *cs)
27
/* Indirect jump (or direct jump w/ goto_tb disabled) */
28
tcg_gen_mov_i32(cpu_pc, cpu_btarget);
29
tcg_gen_discard_i32(cpu_btarget);
30
-
31
- if (unlikely(cs->singlestep_enabled)) {
32
- gen_raise_exception(dc, EXCP_DEBUG);
33
- } else {
34
- tcg_gen_lookup_and_goto_ptr();
35
- }
36
+ tcg_gen_lookup_and_goto_ptr();
37
return;
38
39
default:
25
--
40
--
26
2.20.1
41
2.25.1
27
42
28
43
diff view generated by jsdifflib
1
No functional change, but the smaller expressions make
1
As per an ancient comment in mips_tr_translate_insn about the
2
the code easier to read.
2
expectations of gdb, when restarting the insn in a delay slot
3
we also re-execute the branch. Which means that we are
4
expected to execute two insns in this case.
3
5
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
This has been broken since 8b86d6d2580, where we forced max_insns
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
to 1 while single-stepping. This resulted in an exit from the
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
translator loop after the branch but before the delay slot is
9
translated.
10
11
Increase the max_insns to 2 for this case. In addition, bypass
12
the end-of-page check, for when the branch itself ends the page.
13
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
15
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
16
---
9
accel/tcg/cputlb.c | 35 +++++++++++++++++------------------
17
target/mips/tcg/translate.c | 25 ++++++++++++++++---------
10
1 file changed, 17 insertions(+), 18 deletions(-)
18
1 file changed, 16 insertions(+), 9 deletions(-)
11
19
12
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
20
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
13
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
14
--- a/accel/tcg/cputlb.c
22
--- a/target/mips/tcg/translate.c
15
+++ b/accel/tcg/cputlb.c
23
+++ b/target/mips/tcg/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void tlb_dyn_init(CPUArchState *env)
24
@@ -XXX,XX +XXX,XX @@ static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
17
25
ctx->default_tcg_memop_mask = (ctx->insn_flags & (ISA_MIPS_R6 |
18
/**
26
INSN_LOONGSON3A)) ? MO_UNALN : MO_ALIGN;
19
* tlb_mmu_resize_locked() - perform TLB resize bookkeeping; resize if necessary
27
20
- * @env: CPU that owns the TLB
28
+ /*
21
- * @mmu_idx: MMU index of the TLB
29
+ * Execute a branch and its delay slot as a single instruction.
22
+ * @desc: The CPUTLBDesc portion of the TLB
30
+ * This is what GDB expects and is consistent with what the
23
+ * @fast: The CPUTLBDescFast portion of the same TLB
31
+ * hardware does (e.g. if a delay slot instruction faults, the
24
*
32
+ * reported PC is the PC of the branch).
25
* Called with tlb_lock_held.
33
+ */
26
*
34
+ if (ctx->base.singlestep_enabled && (ctx->hflags & MIPS_HFLAG_BMASK)) {
27
@@ -XXX,XX +XXX,XX @@ static void tlb_dyn_init(CPUArchState *env)
35
+ ctx->base.max_insns = 2;
28
* high), since otherwise we are likely to have a significant amount of
36
+ }
29
* conflict misses.
37
+
30
*/
38
LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx,
31
-static void tlb_mmu_resize_locked(CPUArchState *env, int mmu_idx)
39
ctx->hflags);
32
+static void tlb_mmu_resize_locked(CPUTLBDesc *desc, CPUTLBDescFast *fast)
40
}
33
{
41
@@ -XXX,XX +XXX,XX @@ static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
34
- CPUTLBDesc *desc = &env_tlb(env)->d[mmu_idx];
42
if (ctx->base.is_jmp != DISAS_NEXT) {
35
- size_t old_size = tlb_n_entries(&env_tlb(env)->f[mmu_idx]);
36
+ size_t old_size = tlb_n_entries(fast);
37
size_t rate;
38
size_t new_size = old_size;
39
int64_t now = get_clock_realtime();
40
@@ -XXX,XX +XXX,XX @@ static void tlb_mmu_resize_locked(CPUArchState *env, int mmu_idx)
41
return;
43
return;
42
}
44
}
43
44
- g_free(env_tlb(env)->f[mmu_idx].table);
45
- g_free(env_tlb(env)->d[mmu_idx].iotlb);
46
+ g_free(fast->table);
47
+ g_free(desc->iotlb);
48
49
tlb_window_reset(desc, now, 0);
50
/* desc->n_used_entries is cleared by the caller */
51
- env_tlb(env)->f[mmu_idx].mask = (new_size - 1) << CPU_TLB_ENTRY_BITS;
52
- env_tlb(env)->f[mmu_idx].table = g_try_new(CPUTLBEntry, new_size);
53
- env_tlb(env)->d[mmu_idx].iotlb = g_try_new(CPUIOTLBEntry, new_size);
54
+ fast->mask = (new_size - 1) << CPU_TLB_ENTRY_BITS;
55
+ fast->table = g_try_new(CPUTLBEntry, new_size);
56
+ desc->iotlb = g_try_new(CPUIOTLBEntry, new_size);
57
+
45
+
58
/*
46
/*
59
* If the allocations fail, try smaller sizes. We just freed some
47
- * Execute a branch and its delay slot as a single instruction.
60
* memory, so going back to half of new_size has a good chance of working.
48
- * This is what GDB expects and is consistent with what the
61
@@ -XXX,XX +XXX,XX @@ static void tlb_mmu_resize_locked(CPUArchState *env, int mmu_idx)
49
- * hardware does (e.g. if a delay slot instruction faults, the
62
* allocations to fail though, so we progressively reduce the allocation
50
- * reported PC is the PC of the branch).
63
* size, aborting if we cannot even allocate the smallest TLB we support.
51
+ * End the TB on (most) page crossings.
52
+ * See mips_tr_init_disas_context about single-stepping a branch
53
+ * together with its delay slot.
64
*/
54
*/
65
- while (env_tlb(env)->f[mmu_idx].table == NULL ||
55
- if (ctx->base.singlestep_enabled &&
66
- env_tlb(env)->d[mmu_idx].iotlb == NULL) {
56
- (ctx->hflags & MIPS_HFLAG_BMASK) == 0) {
67
+ while (fast->table == NULL || desc->iotlb == NULL) {
57
- ctx->base.is_jmp = DISAS_TOO_MANY;
68
if (new_size == (1 << CPU_TLB_DYN_MIN_BITS)) {
58
- }
69
error_report("%s: %s", __func__, strerror(errno));
59
- if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE) {
70
abort();
60
+ if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE
71
}
61
+ && !ctx->base.singlestep_enabled) {
72
new_size = MAX(new_size >> 1, 1 << CPU_TLB_DYN_MIN_BITS);
62
ctx->base.is_jmp = DISAS_TOO_MANY;
73
- env_tlb(env)->f[mmu_idx].mask = (new_size - 1) << CPU_TLB_ENTRY_BITS;
74
+ fast->mask = (new_size - 1) << CPU_TLB_ENTRY_BITS;
75
76
- g_free(env_tlb(env)->f[mmu_idx].table);
77
- g_free(env_tlb(env)->d[mmu_idx].iotlb);
78
- env_tlb(env)->f[mmu_idx].table = g_try_new(CPUTLBEntry, new_size);
79
- env_tlb(env)->d[mmu_idx].iotlb = g_try_new(CPUIOTLBEntry, new_size);
80
+ g_free(fast->table);
81
+ g_free(desc->iotlb);
82
+ fast->table = g_try_new(CPUTLBEntry, new_size);
83
+ desc->iotlb = g_try_new(CPUIOTLBEntry, new_size);
84
}
63
}
85
}
64
}
86
87
static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
88
{
89
- tlb_mmu_resize_locked(env, mmu_idx);
90
+ tlb_mmu_resize_locked(&env_tlb(env)->d[mmu_idx], &env_tlb(env)->f[mmu_idx]);
91
env_tlb(env)->d[mmu_idx].n_used_entries = 0;
92
env_tlb(env)->d[mmu_idx].large_page_addr = -1;
93
env_tlb(env)->d[mmu_idx].large_page_mask = -1;
94
--
65
--
95
2.20.1
66
2.25.1
96
67
97
68
diff view generated by jsdifflib
1
In target/arm we will shortly have "too many" mmu_idx.
1
GDB single-stepping is now handled generically.
2
The current minimum barrier is caused by the way in which
3
tlb_flush_page_by_mmuidx is coded.
4
2
5
We can remove this limitation by allocating memory for
3
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
consumption by the worker. Let us assume that this is
7
the unlikely case, as will be the case for the majority
8
of targets which have so far satisfied the BUILD_BUG_ON,
9
and only allocate memory when necessary.
10
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
---
5
---
14
accel/tcg/cputlb.c | 167 +++++++++++++++++++++++++++++++++++----------
6
target/mips/tcg/translate.c | 50 +++++++++++++------------------------
15
1 file changed, 132 insertions(+), 35 deletions(-)
7
1 file changed, 18 insertions(+), 32 deletions(-)
16
8
17
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
9
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
18
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
19
--- a/accel/tcg/cputlb.c
11
--- a/target/mips/tcg/translate.c
20
+++ b/accel/tcg/cputlb.c
12
+++ b/target/mips/tcg/translate.c
21
@@ -XXX,XX +XXX,XX @@ static void tlb_flush_page_locked(CPUArchState *env, int midx,
13
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
14
tcg_gen_exit_tb(ctx->base.tb, n);
15
} else {
16
gen_save_pc(dest);
17
- if (ctx->base.singlestep_enabled) {
18
- save_cpu_state(ctx, 0);
19
- gen_helper_raise_exception_debug(cpu_env);
20
- } else {
21
- tcg_gen_lookup_and_goto_ptr();
22
- }
23
+ tcg_gen_lookup_and_goto_ptr();
22
}
24
}
23
}
25
}
24
26
25
-/* As we are going to hijack the bottom bits of the page address for a
27
@@ -XXX,XX +XXX,XX @@ static void gen_branch(DisasContext *ctx, int insn_bytes)
26
- * mmuidx bit mask we need to fail to build if we can't do that
28
} else {
27
+/**
29
tcg_gen_mov_tl(cpu_PC, btarget);
28
+ * tlb_flush_page_by_mmuidx_async_0:
30
}
29
+ * @cpu: cpu on which to flush
31
- if (ctx->base.singlestep_enabled) {
30
+ * @addr: page of virtual address to flush
32
- save_cpu_state(ctx, 0);
31
+ * @idxmap: set of mmu_idx to flush
33
- gen_helper_raise_exception_debug(cpu_env);
32
+ *
34
- }
33
+ * Helper for tlb_flush_page_by_mmuidx and friends, flush one page
35
tcg_gen_lookup_and_goto_ptr();
34
+ * at @addr from the tlbs indicated by @idxmap from @cpu.
36
break;
35
*/
37
default:
36
-QEMU_BUILD_BUG_ON(NB_MMU_MODES > TARGET_PAGE_BITS_MIN);
38
@@ -XXX,XX +XXX,XX @@ static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
37
-
38
-static void tlb_flush_page_by_mmuidx_async_work(CPUState *cpu,
39
- run_on_cpu_data data)
40
+static void tlb_flush_page_by_mmuidx_async_0(CPUState *cpu,
41
+ target_ulong addr,
42
+ uint16_t idxmap)
43
{
39
{
44
CPUArchState *env = cpu->env_ptr;
40
DisasContext *ctx = container_of(dcbase, DisasContext, base);
45
- target_ulong addr_and_mmuidx = (target_ulong) data.target_ptr;
41
46
- target_ulong addr = addr_and_mmuidx & TARGET_PAGE_MASK;
42
- if (ctx->base.singlestep_enabled && ctx->base.is_jmp != DISAS_NORETURN) {
47
- unsigned long mmu_idx_bitmap = addr_and_mmuidx & ALL_MMUIDX_BITS;
43
- save_cpu_state(ctx, ctx->base.is_jmp != DISAS_EXIT);
48
int mmu_idx;
44
- gen_helper_raise_exception_debug(cpu_env);
49
45
- } else {
50
assert_cpu_is_self(cpu);
46
- switch (ctx->base.is_jmp) {
51
47
- case DISAS_STOP:
52
- tlb_debug("page addr:" TARGET_FMT_lx " mmu_map:0x%lx\n",
48
- gen_save_pc(ctx->base.pc_next);
53
- addr, mmu_idx_bitmap);
49
- tcg_gen_lookup_and_goto_ptr();
54
+ tlb_debug("page addr:" TARGET_FMT_lx " mmu_map:0x%x\n", addr, idxmap);
50
- break;
55
51
- case DISAS_NEXT:
56
qemu_spin_lock(&env_tlb(env)->c.lock);
52
- case DISAS_TOO_MANY:
57
for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
53
- save_cpu_state(ctx, 0);
58
- if (test_bit(mmu_idx, &mmu_idx_bitmap)) {
54
- gen_goto_tb(ctx, 0, ctx->base.pc_next);
59
+ if ((idxmap >> mmu_idx) & 1) {
55
- break;
60
tlb_flush_page_locked(env, mmu_idx, addr);
56
- case DISAS_EXIT:
61
}
57
- tcg_gen_exit_tb(NULL, 0);
62
}
58
- break;
63
@@ -XXX,XX +XXX,XX @@ static void tlb_flush_page_by_mmuidx_async_work(CPUState *cpu,
59
- case DISAS_NORETURN:
64
tb_flush_jmp_cache(cpu, addr);
60
- break;
65
}
61
- default:
66
62
- g_assert_not_reached();
67
+/**
63
- }
68
+ * tlb_flush_page_by_mmuidx_async_1:
64
+ switch (ctx->base.is_jmp) {
69
+ * @cpu: cpu on which to flush
65
+ case DISAS_STOP:
70
+ * @data: encoded addr + idxmap
66
+ gen_save_pc(ctx->base.pc_next);
71
+ *
67
+ tcg_gen_lookup_and_goto_ptr();
72
+ * Helper for tlb_flush_page_by_mmuidx and friends, called through
68
+ break;
73
+ * async_run_on_cpu. The idxmap parameter is encoded in the page
69
+ case DISAS_NEXT:
74
+ * offset of the target_ptr field. This limits the set of mmu_idx
70
+ case DISAS_TOO_MANY:
75
+ * that can be passed via this method.
71
+ save_cpu_state(ctx, 0);
76
+ */
72
+ gen_goto_tb(ctx, 0, ctx->base.pc_next);
77
+static void tlb_flush_page_by_mmuidx_async_1(CPUState *cpu,
73
+ break;
78
+ run_on_cpu_data data)
74
+ case DISAS_EXIT:
79
+{
75
+ tcg_gen_exit_tb(NULL, 0);
80
+ target_ulong addr_and_idxmap = (target_ulong) data.target_ptr;
76
+ break;
81
+ target_ulong addr = addr_and_idxmap & TARGET_PAGE_MASK;
77
+ case DISAS_NORETURN:
82
+ uint16_t idxmap = addr_and_idxmap & ~TARGET_PAGE_MASK;
78
+ break;
83
+
79
+ default:
84
+ tlb_flush_page_by_mmuidx_async_0(cpu, addr, idxmap);
80
+ g_assert_not_reached();
85
+}
86
+
87
+typedef struct {
88
+ target_ulong addr;
89
+ uint16_t idxmap;
90
+} TLBFlushPageByMMUIdxData;
91
+
92
+/**
93
+ * tlb_flush_page_by_mmuidx_async_2:
94
+ * @cpu: cpu on which to flush
95
+ * @data: allocated addr + idxmap
96
+ *
97
+ * Helper for tlb_flush_page_by_mmuidx and friends, called through
98
+ * async_run_on_cpu. The addr+idxmap parameters are stored in a
99
+ * TLBFlushPageByMMUIdxData structure that has been allocated
100
+ * specifically for this helper. Free the structure when done.
101
+ */
102
+static void tlb_flush_page_by_mmuidx_async_2(CPUState *cpu,
103
+ run_on_cpu_data data)
104
+{
105
+ TLBFlushPageByMMUIdxData *d = data.host_ptr;
106
+
107
+ tlb_flush_page_by_mmuidx_async_0(cpu, d->addr, d->idxmap);
108
+ g_free(d);
109
+}
110
+
111
void tlb_flush_page_by_mmuidx(CPUState *cpu, target_ulong addr, uint16_t idxmap)
112
{
113
- target_ulong addr_and_mmu_idx;
114
-
115
tlb_debug("addr: "TARGET_FMT_lx" mmu_idx:%" PRIx16 "\n", addr, idxmap);
116
117
/* This should already be page aligned */
118
- addr_and_mmu_idx = addr & TARGET_PAGE_MASK;
119
- addr_and_mmu_idx |= idxmap;
120
+ addr &= TARGET_PAGE_MASK;
121
122
- if (!qemu_cpu_is_self(cpu)) {
123
- async_run_on_cpu(cpu, tlb_flush_page_by_mmuidx_async_work,
124
- RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
125
+ if (qemu_cpu_is_self(cpu)) {
126
+ tlb_flush_page_by_mmuidx_async_0(cpu, addr, idxmap);
127
+ } else if (idxmap < TARGET_PAGE_SIZE) {
128
+ /*
129
+ * Most targets have only a few mmu_idx. In the case where
130
+ * we can stuff idxmap into the low TARGET_PAGE_BITS, avoid
131
+ * allocating memory for this operation.
132
+ */
133
+ async_run_on_cpu(cpu, tlb_flush_page_by_mmuidx_async_1,
134
+ RUN_ON_CPU_TARGET_PTR(addr | idxmap));
135
} else {
136
- tlb_flush_page_by_mmuidx_async_work(
137
- cpu, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
138
+ TLBFlushPageByMMUIdxData *d = g_new(TLBFlushPageByMMUIdxData, 1);
139
+
140
+ /* Otherwise allocate a structure, freed by the worker. */
141
+ d->addr = addr;
142
+ d->idxmap = idxmap;
143
+ async_run_on_cpu(cpu, tlb_flush_page_by_mmuidx_async_2,
144
+ RUN_ON_CPU_HOST_PTR(d));
145
}
81
}
146
}
82
}
147
83
148
@@ -XXX,XX +XXX,XX @@ void tlb_flush_page(CPUState *cpu, target_ulong addr)
149
void tlb_flush_page_by_mmuidx_all_cpus(CPUState *src_cpu, target_ulong addr,
150
uint16_t idxmap)
151
{
152
- const run_on_cpu_func fn = tlb_flush_page_by_mmuidx_async_work;
153
- target_ulong addr_and_mmu_idx;
154
-
155
tlb_debug("addr: "TARGET_FMT_lx" mmu_idx:%"PRIx16"\n", addr, idxmap);
156
157
/* This should already be page aligned */
158
- addr_and_mmu_idx = addr & TARGET_PAGE_MASK;
159
- addr_and_mmu_idx |= idxmap;
160
+ addr &= TARGET_PAGE_MASK;
161
162
- flush_all_helper(src_cpu, fn, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
163
- fn(src_cpu, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
164
+ /*
165
+ * Allocate memory to hold addr+idxmap only when needed.
166
+ * See tlb_flush_page_by_mmuidx for details.
167
+ */
168
+ if (idxmap < TARGET_PAGE_SIZE) {
169
+ flush_all_helper(src_cpu, tlb_flush_page_by_mmuidx_async_1,
170
+ RUN_ON_CPU_TARGET_PTR(addr | idxmap));
171
+ } else {
172
+ CPUState *dst_cpu;
173
+
174
+ /* Allocate a separate data block for each destination cpu. */
175
+ CPU_FOREACH(dst_cpu) {
176
+ if (dst_cpu != src_cpu) {
177
+ TLBFlushPageByMMUIdxData *d
178
+ = g_new(TLBFlushPageByMMUIdxData, 1);
179
+
180
+ d->addr = addr;
181
+ d->idxmap = idxmap;
182
+ async_run_on_cpu(dst_cpu, tlb_flush_page_by_mmuidx_async_2,
183
+ RUN_ON_CPU_HOST_PTR(d));
184
+ }
185
+ }
186
+ }
187
+
188
+ tlb_flush_page_by_mmuidx_async_0(src_cpu, addr, idxmap);
189
}
190
191
void tlb_flush_page_all_cpus(CPUState *src, target_ulong addr)
192
@@ -XXX,XX +XXX,XX @@ void tlb_flush_page_by_mmuidx_all_cpus_synced(CPUState *src_cpu,
193
target_ulong addr,
194
uint16_t idxmap)
195
{
196
- const run_on_cpu_func fn = tlb_flush_page_by_mmuidx_async_work;
197
- target_ulong addr_and_mmu_idx;
198
-
199
tlb_debug("addr: "TARGET_FMT_lx" mmu_idx:%"PRIx16"\n", addr, idxmap);
200
201
/* This should already be page aligned */
202
- addr_and_mmu_idx = addr & TARGET_PAGE_MASK;
203
- addr_and_mmu_idx |= idxmap;
204
+ addr &= TARGET_PAGE_MASK;
205
206
- flush_all_helper(src_cpu, fn, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
207
- async_safe_run_on_cpu(src_cpu, fn, RUN_ON_CPU_TARGET_PTR(addr_and_mmu_idx));
208
+ /*
209
+ * Allocate memory to hold addr+idxmap only when needed.
210
+ * See tlb_flush_page_by_mmuidx for details.
211
+ */
212
+ if (idxmap < TARGET_PAGE_SIZE) {
213
+ flush_all_helper(src_cpu, tlb_flush_page_by_mmuidx_async_1,
214
+ RUN_ON_CPU_TARGET_PTR(addr | idxmap));
215
+ async_safe_run_on_cpu(src_cpu, tlb_flush_page_by_mmuidx_async_1,
216
+ RUN_ON_CPU_TARGET_PTR(addr | idxmap));
217
+ } else {
218
+ CPUState *dst_cpu;
219
+ TLBFlushPageByMMUIdxData *d;
220
+
221
+ /* Allocate a separate data block for each destination cpu. */
222
+ CPU_FOREACH(dst_cpu) {
223
+ if (dst_cpu != src_cpu) {
224
+ d = g_new(TLBFlushPageByMMUIdxData, 1);
225
+ d->addr = addr;
226
+ d->idxmap = idxmap;
227
+ async_run_on_cpu(dst_cpu, tlb_flush_page_by_mmuidx_async_2,
228
+ RUN_ON_CPU_HOST_PTR(d));
229
+ }
230
+ }
231
+
232
+ d = g_new(TLBFlushPageByMMUIdxData, 1);
233
+ d->addr = addr;
234
+ d->idxmap = idxmap;
235
+ async_safe_run_on_cpu(src_cpu, tlb_flush_page_by_mmuidx_async_2,
236
+ RUN_ON_CPU_HOST_PTR(d));
237
+ }
238
}
239
240
void tlb_flush_page_all_cpus_synced(CPUState *src, target_ulong addr)
241
--
84
--
242
2.20.1
85
2.25.1
243
86
244
87
diff view generated by jsdifflib
1
The accel_list and tmp variables are only used when manufacturing
1
GDB single-stepping is now handled generically.
2
-machine accel, options based on -accel.
3
2
4
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
3
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed by: Aleksandar Markovic <amarkovic@wavecomp.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
5
---
9
vl.c | 3 ++-
6
target/openrisc/translate.c | 18 +++---------------
10
1 file changed, 2 insertions(+), 1 deletion(-)
7
1 file changed, 3 insertions(+), 15 deletions(-)
11
8
12
diff --git a/vl.c b/vl.c
9
diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c
13
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
14
--- a/vl.c
11
--- a/target/openrisc/translate.c
15
+++ b/vl.c
12
+++ b/target/openrisc/translate.c
16
@@ -XXX,XX +XXX,XX @@ static int do_configure_accelerator(void *opaque, QemuOpts *opts, Error **errp)
13
@@ -XXX,XX +XXX,XX @@ static void openrisc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
17
static void configure_accelerators(const char *progname)
14
/* The jump destination is indirect/computed; use jmp_pc. */
18
{
15
tcg_gen_mov_tl(cpu_pc, jmp_pc);
19
const char *accel;
16
tcg_gen_discard_tl(jmp_pc);
20
- char **accel_list, **tmp;
17
- if (unlikely(dc->base.singlestep_enabled)) {
21
bool init_failed = false;
18
- gen_exception(dc, EXCP_DEBUG);
22
19
- } else {
23
qemu_opts_foreach(qemu_find_opts("icount"),
20
- tcg_gen_lookup_and_goto_ptr();
24
@@ -XXX,XX +XXX,XX @@ static void configure_accelerators(const char *progname)
21
- }
25
22
+ tcg_gen_lookup_and_goto_ptr();
26
accel = qemu_opt_get(qemu_get_machine_opts(), "accel");
23
break;
27
if (QTAILQ_EMPTY(&qemu_accel_opts.head)) {
24
}
28
+ char **accel_list, **tmp;
25
/* The jump destination is direct; use jmp_pc_imm.
29
+
26
@@ -XXX,XX +XXX,XX @@ static void openrisc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
30
if (accel == NULL) {
27
break;
31
/* Select the default accelerator */
28
}
32
if (!accel_find("tcg") && !accel_find("kvm")) {
29
tcg_gen_movi_tl(cpu_pc, jmp_dest);
30
- if (unlikely(dc->base.singlestep_enabled)) {
31
- gen_exception(dc, EXCP_DEBUG);
32
- } else {
33
- tcg_gen_lookup_and_goto_ptr();
34
- }
35
+ tcg_gen_lookup_and_goto_ptr();
36
break;
37
38
case DISAS_EXIT:
39
- if (unlikely(dc->base.singlestep_enabled)) {
40
- gen_exception(dc, EXCP_DEBUG);
41
- } else {
42
- tcg_gen_exit_tb(NULL, 0);
43
- }
44
+ tcg_gen_exit_tb(NULL, 0);
45
break;
46
default:
47
g_assert_not_reached();
33
--
48
--
34
2.20.1
49
2.25.1
35
50
36
51
diff view generated by jsdifflib
1
Do not call get_clock_realtime() in tlb_mmu_resize_locked,
1
GDB single-stepping is now handled generically.
2
but hoist outside of any loop over a set of tlbs. This is
2
Reuse gen_debug_exception to handle architectural debug exceptions.
3
only two (indirect) callers, tlb_flush_by_mmuidx_async_work
4
and tlb_flush_page_locked, so not onerous.
5
3
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
---
5
---
11
accel/tcg/cputlb.c | 14 ++++++++------
6
target/ppc/translate.c | 38 ++++++++------------------------------
12
1 file changed, 8 insertions(+), 6 deletions(-)
7
1 file changed, 8 insertions(+), 30 deletions(-)
13
8
14
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
9
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
15
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
16
--- a/accel/tcg/cputlb.c
11
--- a/target/ppc/translate.c
17
+++ b/accel/tcg/cputlb.c
12
+++ b/target/ppc/translate.c
18
@@ -XXX,XX +XXX,XX @@ static void tlb_window_reset(CPUTLBDesc *desc, int64_t ns,
13
@@ -XXX,XX +XXX,XX @@
19
* high), since otherwise we are likely to have a significant amount of
14
20
* conflict misses.
15
#define CPU_SINGLE_STEP 0x1
21
*/
16
#define CPU_BRANCH_STEP 0x2
22
-static void tlb_mmu_resize_locked(CPUTLBDesc *desc, CPUTLBDescFast *fast)
17
-#define GDBSTUB_SINGLE_STEP 0x4
23
+static void tlb_mmu_resize_locked(CPUTLBDesc *desc, CPUTLBDescFast *fast,
18
24
+ int64_t now)
19
/* Include definitions for instructions classes and implementations flags */
20
/* #define PPC_DEBUG_DISAS */
21
@@ -XXX,XX +XXX,XX @@ static uint32_t gen_prep_dbgex(DisasContext *ctx)
22
23
static void gen_debug_exception(DisasContext *ctx)
25
{
24
{
26
size_t old_size = tlb_n_entries(fast);
25
- gen_helper_raise_exception(cpu_env, tcg_constant_i32(EXCP_DEBUG));
27
size_t rate;
26
+ gen_helper_raise_exception(cpu_env, tcg_constant_i32(gen_prep_dbgex(ctx)));
28
size_t new_size = old_size;
27
ctx->base.is_jmp = DISAS_NORETURN;
29
- int64_t now = get_clock_realtime();
30
int64_t window_len_ms = 100;
31
int64_t window_len_ns = window_len_ms * 1000 * 1000;
32
bool window_expired = now > desc->window_begin_ns + window_len_ns;
33
@@ -XXX,XX +XXX,XX @@ static void tlb_mmu_flush_locked(CPUTLBDesc *desc, CPUTLBDescFast *fast)
34
memset(desc->vtable, -1, sizeof(desc->vtable));
35
}
28
}
36
29
37
-static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
30
@@ -XXX,XX +XXX,XX @@ static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
38
+static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx,
31
39
+ int64_t now)
32
static void gen_lookup_and_goto_ptr(DisasContext *ctx)
40
{
33
{
41
CPUTLBDesc *desc = &env_tlb(env)->d[mmu_idx];
34
- int sse = ctx->singlestep_enabled;
42
CPUTLBDescFast *fast = &env_tlb(env)->f[mmu_idx];
35
- if (unlikely(sse)) {
43
36
- if (sse & GDBSTUB_SINGLE_STEP) {
44
- tlb_mmu_resize_locked(desc, fast);
37
- gen_debug_exception(ctx);
45
+ tlb_mmu_resize_locked(desc, fast, now);
38
- } else if (sse & (CPU_SINGLE_STEP | CPU_BRANCH_STEP)) {
46
tlb_mmu_flush_locked(desc, fast);
39
- gen_helper_raise_exception(cpu_env, tcg_constant_i32(gen_prep_dbgex(ctx)));
40
- } else {
41
- tcg_gen_exit_tb(NULL, 0);
42
- }
43
+ if (unlikely(ctx->singlestep_enabled)) {
44
+ gen_debug_exception(ctx);
45
} else {
46
tcg_gen_lookup_and_goto_ptr();
47
}
48
@@ -XXX,XX +XXX,XX @@ static void ppc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
49
ctx->singlestep_enabled = 0;
50
if ((hflags >> HFLAGS_SE) & 1) {
51
ctx->singlestep_enabled |= CPU_SINGLE_STEP;
52
+ ctx->base.max_insns = 1;
53
}
54
if ((hflags >> HFLAGS_BE) & 1) {
55
ctx->singlestep_enabled |= CPU_BRANCH_STEP;
56
}
57
- if (unlikely(ctx->base.singlestep_enabled)) {
58
- ctx->singlestep_enabled |= GDBSTUB_SINGLE_STEP;
59
- }
60
-
61
- if (ctx->singlestep_enabled & (CPU_SINGLE_STEP | GDBSTUB_SINGLE_STEP)) {
62
- ctx->base.max_insns = 1;
63
- }
47
}
64
}
48
65
49
@@ -XXX,XX +XXX,XX @@ static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data)
66
static void ppc_tr_tb_start(DisasContextBase *db, CPUState *cs)
50
CPUArchState *env = cpu->env_ptr;
67
@@ -XXX,XX +XXX,XX @@ static void ppc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
51
uint16_t asked = data.host_int;
68
DisasContext *ctx = container_of(dcbase, DisasContext, base);
52
uint16_t all_dirty, work, to_clean;
69
DisasJumpType is_jmp = ctx->base.is_jmp;
53
+ int64_t now = get_clock_realtime();
70
target_ulong nip = ctx->base.pc_next;
54
71
- int sse;
55
assert_cpu_is_self(cpu);
72
56
73
if (is_jmp == DISAS_NORETURN) {
57
@@ -XXX,XX +XXX,XX @@ static void tlb_flush_by_mmuidx_async_work(CPUState *cpu, run_on_cpu_data data)
74
/* We have already exited the TB. */
58
75
@@ -XXX,XX +XXX,XX @@ static void ppc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
59
for (work = to_clean; work != 0; work &= work - 1) {
60
int mmu_idx = ctz32(work);
61
- tlb_flush_one_mmuidx_locked(env, mmu_idx);
62
+ tlb_flush_one_mmuidx_locked(env, mmu_idx, now);
63
}
76
}
64
77
65
qemu_spin_unlock(&env_tlb(env)->c.lock);
78
/* Honor single stepping. */
66
@@ -XXX,XX +XXX,XX @@ static void tlb_flush_page_locked(CPUArchState *env, int midx,
79
- sse = ctx->singlestep_enabled & (CPU_SINGLE_STEP | GDBSTUB_SINGLE_STEP);
67
tlb_debug("forcing full flush midx %d ("
80
- if (unlikely(sse)) {
68
TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
81
+ if (unlikely(ctx->singlestep_enabled & CPU_SINGLE_STEP)
69
midx, lp_addr, lp_mask);
82
+ && (nip <= 0x100 || nip > 0xf00)) {
70
- tlb_flush_one_mmuidx_locked(env, midx);
83
switch (is_jmp) {
71
+ tlb_flush_one_mmuidx_locked(env, midx, get_clock_realtime());
84
case DISAS_TOO_MANY:
72
} else {
85
case DISAS_EXIT_UPDATE:
73
if (tlb_flush_entry_locked(tlb_entry(env, midx, page), page)) {
86
@@ -XXX,XX +XXX,XX @@ static void ppc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
74
tlb_n_used_entries_dec(env, midx);
87
g_assert_not_reached();
88
}
89
90
- if (sse & GDBSTUB_SINGLE_STEP) {
91
- gen_debug_exception(ctx);
92
- return;
93
- }
94
- /* else CPU_SINGLE_STEP... */
95
- if (nip <= 0x100 || nip > 0xf00) {
96
- gen_helper_raise_exception(cpu_env, tcg_constant_i32(gen_prep_dbgex(ctx)));
97
- return;
98
- }
99
+ gen_debug_exception(ctx);
100
+ return;
101
}
102
103
switch (is_jmp) {
75
--
104
--
76
2.20.1
105
2.25.1
77
106
78
107
diff view generated by jsdifflib
1
We do not need the entire CPUArchState to compute these values.
1
We have already set DISAS_NORETURN in generate_exception,
2
which makes the exit_tb unreachable.
2
3
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
6
---
8
accel/tcg/cputlb.c | 15 ++++++++-------
7
target/riscv/insn_trans/trans_privileged.c.inc | 6 +-----
9
1 file changed, 8 insertions(+), 7 deletions(-)
8
1 file changed, 1 insertion(+), 5 deletions(-)
10
9
11
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
10
diff --git a/target/riscv/insn_trans/trans_privileged.c.inc b/target/riscv/insn_trans/trans_privileged.c.inc
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/accel/tcg/cputlb.c
12
--- a/target/riscv/insn_trans/trans_privileged.c.inc
14
+++ b/accel/tcg/cputlb.c
13
+++ b/target/riscv/insn_trans/trans_privileged.c.inc
15
@@ -XXX,XX +XXX,XX @@ QEMU_BUILD_BUG_ON(sizeof(target_ulong) > sizeof(run_on_cpu_data));
14
@@ -XXX,XX +XXX,XX @@ static bool trans_ecall(DisasContext *ctx, arg_ecall *a)
16
QEMU_BUILD_BUG_ON(NB_MMU_MODES > 16);
17
#define ALL_MMUIDX_BITS ((1 << NB_MMU_MODES) - 1)
18
19
-static inline size_t tlb_n_entries(CPUArchState *env, uintptr_t mmu_idx)
20
+static inline size_t tlb_n_entries(CPUTLBDescFast *fast)
21
{
15
{
22
- return (env_tlb(env)->f[mmu_idx].mask >> CPU_TLB_ENTRY_BITS) + 1;
16
/* always generates U-level ECALL, fixed in do_interrupt handler */
23
+ return (fast->mask >> CPU_TLB_ENTRY_BITS) + 1;
17
generate_exception(ctx, RISCV_EXCP_U_ECALL);
18
- exit_tb(ctx); /* no chaining */
19
- ctx->base.is_jmp = DISAS_NORETURN;
20
return true;
24
}
21
}
25
22
26
-static inline size_t sizeof_tlb(CPUArchState *env, uintptr_t mmu_idx)
23
@@ -XXX,XX +XXX,XX @@ static bool trans_ebreak(DisasContext *ctx, arg_ebreak *a)
27
+static inline size_t sizeof_tlb(CPUTLBDescFast *fast)
24
post = opcode_at(&ctx->base, post_addr);
28
{
25
}
29
- return env_tlb(env)->f[mmu_idx].mask + (1 << CPU_TLB_ENTRY_BITS);
26
30
+ return fast->mask + (1 << CPU_TLB_ENTRY_BITS);
27
- if (pre == 0x01f01013 && ebreak == 0x00100073 && post == 0x40705013) {
28
+ if (pre == 0x01f01013 && ebreak == 0x00100073 && post == 0x40705013) {
29
generate_exception(ctx, RISCV_EXCP_SEMIHOST);
30
} else {
31
generate_exception(ctx, RISCV_EXCP_BREAKPOINT);
32
}
33
- exit_tb(ctx); /* no chaining */
34
- ctx->base.is_jmp = DISAS_NORETURN;
35
return true;
31
}
36
}
32
37
33
static void tlb_window_reset(CPUTLBDesc *desc, int64_t ns,
34
@@ -XXX,XX +XXX,XX @@ static void tlb_dyn_init(CPUArchState *env)
35
static void tlb_mmu_resize_locked(CPUArchState *env, int mmu_idx)
36
{
37
CPUTLBDesc *desc = &env_tlb(env)->d[mmu_idx];
38
- size_t old_size = tlb_n_entries(env, mmu_idx);
39
+ size_t old_size = tlb_n_entries(&env_tlb(env)->f[mmu_idx]);
40
size_t rate;
41
size_t new_size = old_size;
42
int64_t now = get_clock_realtime();
43
@@ -XXX,XX +XXX,XX @@ static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
44
env_tlb(env)->d[mmu_idx].large_page_addr = -1;
45
env_tlb(env)->d[mmu_idx].large_page_mask = -1;
46
env_tlb(env)->d[mmu_idx].vindex = 0;
47
- memset(env_tlb(env)->f[mmu_idx].table, -1, sizeof_tlb(env, mmu_idx));
48
+ memset(env_tlb(env)->f[mmu_idx].table, -1,
49
+ sizeof_tlb(&env_tlb(env)->f[mmu_idx]));
50
memset(env_tlb(env)->d[mmu_idx].vtable, -1,
51
sizeof(env_tlb(env)->d[0].vtable));
52
}
53
@@ -XXX,XX +XXX,XX @@ void tlb_reset_dirty(CPUState *cpu, ram_addr_t start1, ram_addr_t length)
54
qemu_spin_lock(&env_tlb(env)->c.lock);
55
for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
56
unsigned int i;
57
- unsigned int n = tlb_n_entries(env, mmu_idx);
58
+ unsigned int n = tlb_n_entries(&env_tlb(env)->f[mmu_idx]);
59
60
for (i = 0; i < n; i++) {
61
tlb_reset_dirty_range_locked(&env_tlb(env)->f[mmu_idx].table[i],
62
--
38
--
63
2.20.1
39
2.25.1
64
40
65
41
diff view generated by jsdifflib
1
There's little point in leaving these data structures half initialized,
1
GDB single-stepping is now handled generically, which means
2
and relying on a flush to be done during reset.
2
we don't need to do anything in the wrappers.
3
3
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
6
---
8
accel/tcg/cputlb.c | 5 +++--
7
target/riscv/translate.c | 27 +------------------
9
1 file changed, 3 insertions(+), 2 deletions(-)
8
.../riscv/insn_trans/trans_privileged.c.inc | 4 +--
9
target/riscv/insn_trans/trans_rvi.c.inc | 8 +++---
10
target/riscv/insn_trans/trans_rvv.c.inc | 2 +-
11
4 files changed, 7 insertions(+), 34 deletions(-)
10
12
11
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
13
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/accel/tcg/cputlb.c
15
--- a/target/riscv/translate.c
14
+++ b/accel/tcg/cputlb.c
16
+++ b/target/riscv/translate.c
15
@@ -XXX,XX +XXX,XX @@ static void tlb_mmu_init(CPUTLBDesc *desc, CPUTLBDescFast *fast, int64_t now)
17
@@ -XXX,XX +XXX,XX @@ static void generate_exception_mtval(DisasContext *ctx, int excp)
16
fast->mask = (n_entries - 1) << CPU_TLB_ENTRY_BITS;
18
ctx->base.is_jmp = DISAS_NORETURN;
17
fast->table = g_new(CPUTLBEntry, n_entries);
18
desc->iotlb = g_new(CPUIOTLBEntry, n_entries);
19
+ tlb_mmu_flush_locked(desc, fast);
20
}
19
}
21
20
22
static inline void tlb_n_used_entries_inc(CPUArchState *env, uintptr_t mmu_idx)
21
-static void gen_exception_debug(void)
23
@@ -XXX,XX +XXX,XX @@ void tlb_init(CPUState *cpu)
22
-{
24
23
- gen_helper_raise_exception(cpu_env, tcg_constant_i32(EXCP_DEBUG));
25
qemu_spin_init(&env_tlb(env)->c.lock);
24
-}
26
25
-
27
- /* Ensure that cpu_reset performs a full flush. */
26
-/* Wrapper around tcg_gen_exit_tb that handles single stepping */
28
- env_tlb(env)->c.dirty = ALL_MMUIDX_BITS;
27
-static void exit_tb(DisasContext *ctx)
29
+ /* All tlbs are initialized flushed. */
28
-{
30
+ env_tlb(env)->c.dirty = 0;
29
- if (ctx->base.singlestep_enabled) {
31
30
- gen_exception_debug();
32
for (i = 0; i < NB_MMU_MODES; i++) {
31
- } else {
33
tlb_mmu_init(&env_tlb(env)->d[i], &env_tlb(env)->f[i], now);
32
- tcg_gen_exit_tb(NULL, 0);
33
- }
34
-}
35
-
36
-/* Wrapper around tcg_gen_lookup_and_goto_ptr that handles single stepping */
37
-static void lookup_and_goto_ptr(DisasContext *ctx)
38
-{
39
- if (ctx->base.singlestep_enabled) {
40
- gen_exception_debug();
41
- } else {
42
- tcg_gen_lookup_and_goto_ptr();
43
- }
44
-}
45
-
46
static void gen_exception_illegal(DisasContext *ctx)
47
{
48
generate_exception(ctx, RISCV_EXCP_ILLEGAL_INST);
49
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
50
tcg_gen_exit_tb(ctx->base.tb, n);
51
} else {
52
tcg_gen_movi_tl(cpu_pc, dest);
53
- lookup_and_goto_ptr(ctx);
54
+ tcg_gen_lookup_and_goto_ptr();
55
}
56
}
57
58
diff --git a/target/riscv/insn_trans/trans_privileged.c.inc b/target/riscv/insn_trans/trans_privileged.c.inc
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/riscv/insn_trans/trans_privileged.c.inc
61
+++ b/target/riscv/insn_trans/trans_privileged.c.inc
62
@@ -XXX,XX +XXX,XX @@ static bool trans_sret(DisasContext *ctx, arg_sret *a)
63
64
if (has_ext(ctx, RVS)) {
65
gen_helper_sret(cpu_pc, cpu_env, cpu_pc);
66
- exit_tb(ctx); /* no chaining */
67
+ tcg_gen_exit_tb(NULL, 0); /* no chaining */
68
ctx->base.is_jmp = DISAS_NORETURN;
69
} else {
70
return false;
71
@@ -XXX,XX +XXX,XX @@ static bool trans_mret(DisasContext *ctx, arg_mret *a)
72
#ifndef CONFIG_USER_ONLY
73
tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next);
74
gen_helper_mret(cpu_pc, cpu_env, cpu_pc);
75
- exit_tb(ctx); /* no chaining */
76
+ tcg_gen_exit_tb(NULL, 0); /* no chaining */
77
ctx->base.is_jmp = DISAS_NORETURN;
78
return true;
79
#else
80
diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc
81
index XXXXXXX..XXXXXXX 100644
82
--- a/target/riscv/insn_trans/trans_rvi.c.inc
83
+++ b/target/riscv/insn_trans/trans_rvi.c.inc
84
@@ -XXX,XX +XXX,XX @@ static bool trans_jalr(DisasContext *ctx, arg_jalr *a)
85
if (a->rd != 0) {
86
tcg_gen_movi_tl(cpu_gpr[a->rd], ctx->pc_succ_insn);
87
}
88
-
89
- /* No chaining with JALR. */
90
- lookup_and_goto_ptr(ctx);
91
+ tcg_gen_lookup_and_goto_ptr();
92
93
if (misaligned) {
94
gen_set_label(misaligned);
95
@@ -XXX,XX +XXX,XX @@ static bool trans_fence_i(DisasContext *ctx, arg_fence_i *a)
96
* however we need to end the translation block
97
*/
98
tcg_gen_movi_tl(cpu_pc, ctx->pc_succ_insn);
99
- exit_tb(ctx);
100
+ tcg_gen_exit_tb(NULL, 0);
101
ctx->base.is_jmp = DISAS_NORETURN;
102
return true;
103
}
104
@@ -XXX,XX +XXX,XX @@ static bool do_csr_post(DisasContext *ctx)
105
{
106
/* We may have changed important cpu state -- exit to main loop. */
107
tcg_gen_movi_tl(cpu_pc, ctx->pc_succ_insn);
108
- exit_tb(ctx);
109
+ tcg_gen_exit_tb(NULL, 0);
110
ctx->base.is_jmp = DISAS_NORETURN;
111
return true;
112
}
113
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
114
index XXXXXXX..XXXXXXX 100644
115
--- a/target/riscv/insn_trans/trans_rvv.c.inc
116
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
117
@@ -XXX,XX +XXX,XX @@ static bool trans_vsetvl(DisasContext *ctx, arg_vsetvl *a)
118
gen_set_gpr(ctx, a->rd, dst);
119
120
tcg_gen_movi_tl(cpu_pc, ctx->pc_succ_insn);
121
- lookup_and_goto_ptr(ctx);
122
+ tcg_gen_lookup_and_goto_ptr();
123
ctx->base.is_jmp = DISAS_NORETURN;
124
return true;
125
}
34
--
126
--
35
2.20.1
127
2.25.1
36
128
37
129
diff view generated by jsdifflib
1
There are no users of this function outside cputlb.c,
1
GDB single-stepping is now handled generically.
2
and its interface will change in the next patch.
3
2
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
5
---
9
include/exec/cpu_ldst.h | 5 -----
6
target/rx/helper.h | 1 -
10
accel/tcg/cputlb.c | 5 +++++
7
target/rx/op_helper.c | 8 --------
11
2 files changed, 5 insertions(+), 5 deletions(-)
8
target/rx/translate.c | 12 ++----------
9
3 files changed, 2 insertions(+), 19 deletions(-)
12
10
13
diff --git a/include/exec/cpu_ldst.h b/include/exec/cpu_ldst.h
11
diff --git a/target/rx/helper.h b/target/rx/helper.h
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/cpu_ldst.h
13
--- a/target/rx/helper.h
16
+++ b/include/exec/cpu_ldst.h
14
+++ b/target/rx/helper.h
17
@@ -XXX,XX +XXX,XX @@ static inline uintptr_t tlb_index(CPUArchState *env, uintptr_t mmu_idx,
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(raise_illegal_instruction, noreturn, env)
18
return (addr >> TARGET_PAGE_BITS) & size_mask;
16
DEF_HELPER_1(raise_access_fault, noreturn, env)
17
DEF_HELPER_1(raise_privilege_violation, noreturn, env)
18
DEF_HELPER_1(wait, noreturn, env)
19
-DEF_HELPER_1(debug, noreturn, env)
20
DEF_HELPER_2(rxint, noreturn, env, i32)
21
DEF_HELPER_1(rxbrk, noreturn, env)
22
DEF_HELPER_FLAGS_3(fadd, TCG_CALL_NO_WG, f32, env, f32, f32)
23
diff --git a/target/rx/op_helper.c b/target/rx/op_helper.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/target/rx/op_helper.c
26
+++ b/target/rx/op_helper.c
27
@@ -XXX,XX +XXX,XX @@ void QEMU_NORETURN helper_wait(CPURXState *env)
28
raise_exception(env, EXCP_HLT, 0);
19
}
29
}
20
30
21
-static inline size_t tlb_n_entries(CPUArchState *env, uintptr_t mmu_idx)
31
-void QEMU_NORETURN helper_debug(CPURXState *env)
22
-{
32
-{
23
- return (env_tlb(env)->f[mmu_idx].mask >> CPU_TLB_ENTRY_BITS) + 1;
33
- CPUState *cs = env_cpu(env);
34
-
35
- cs->exception_index = EXCP_DEBUG;
36
- cpu_loop_exit(cs);
24
-}
37
-}
25
-
38
-
26
/* Find the TLB entry corresponding to the mmu_idx + address pair. */
39
void QEMU_NORETURN helper_rxint(CPURXState *env, uint32_t vec)
27
static inline CPUTLBEntry *tlb_entry(CPUArchState *env, uintptr_t mmu_idx,
40
{
28
target_ulong addr)
41
raise_exception(env, 0x100 + vec, 0);
29
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
42
diff --git a/target/rx/translate.c b/target/rx/translate.c
30
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
31
--- a/accel/tcg/cputlb.c
44
--- a/target/rx/translate.c
32
+++ b/accel/tcg/cputlb.c
45
+++ b/target/rx/translate.c
33
@@ -XXX,XX +XXX,XX @@ QEMU_BUILD_BUG_ON(sizeof(target_ulong) > sizeof(run_on_cpu_data));
46
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest)
34
QEMU_BUILD_BUG_ON(NB_MMU_MODES > 16);
47
tcg_gen_exit_tb(dc->base.tb, n);
35
#define ALL_MMUIDX_BITS ((1 << NB_MMU_MODES) - 1)
48
} else {
36
49
tcg_gen_movi_i32(cpu_pc, dest);
37
+static inline size_t tlb_n_entries(CPUArchState *env, uintptr_t mmu_idx)
50
- if (dc->base.singlestep_enabled) {
38
+{
51
- gen_helper_debug(cpu_env);
39
+ return (env_tlb(env)->f[mmu_idx].mask >> CPU_TLB_ENTRY_BITS) + 1;
52
- } else {
40
+}
53
- tcg_gen_lookup_and_goto_ptr();
41
+
54
- }
42
static inline size_t sizeof_tlb(CPUArchState *env, uintptr_t mmu_idx)
55
+ tcg_gen_lookup_and_goto_ptr();
43
{
56
}
44
return env_tlb(env)->f[mmu_idx].mask + (1 << CPU_TLB_ENTRY_BITS);
57
dc->base.is_jmp = DISAS_NORETURN;
58
}
59
@@ -XXX,XX +XXX,XX @@ static void rx_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
60
gen_goto_tb(ctx, 0, dcbase->pc_next);
61
break;
62
case DISAS_JUMP:
63
- if (ctx->base.singlestep_enabled) {
64
- gen_helper_debug(cpu_env);
65
- } else {
66
- tcg_gen_lookup_and_goto_ptr();
67
- }
68
+ tcg_gen_lookup_and_goto_ptr();
69
break;
70
case DISAS_UPDATE:
71
tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
45
--
72
--
46
2.20.1
73
2.25.1
47
74
48
75
diff view generated by jsdifflib
1
No functional change, but the smaller expressions make
1
GDB single-stepping is now handled generically.
2
the code easier to read.
3
2
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
4
---
9
accel/tcg/cputlb.c | 19 ++++++++++---------
5
target/s390x/tcg/translate.c | 8 ++------
10
1 file changed, 10 insertions(+), 9 deletions(-)
6
1 file changed, 2 insertions(+), 6 deletions(-)
11
7
12
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
8
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
13
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
14
--- a/accel/tcg/cputlb.c
10
--- a/target/s390x/tcg/translate.c
15
+++ b/accel/tcg/cputlb.c
11
+++ b/target/s390x/tcg/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void tlb_mmu_resize_locked(CPUTLBDesc *desc, CPUTLBDescFast *fast)
12
@@ -XXX,XX +XXX,XX @@ struct DisasContext {
17
13
uint64_t pc_tmp;
18
static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
14
uint32_t ilen;
19
{
15
enum cc_op cc_op;
20
- tlb_mmu_resize_locked(&env_tlb(env)->d[mmu_idx], &env_tlb(env)->f[mmu_idx]);
16
- bool do_debug;
21
- env_tlb(env)->d[mmu_idx].n_used_entries = 0;
17
};
22
- env_tlb(env)->d[mmu_idx].large_page_addr = -1;
18
23
- env_tlb(env)->d[mmu_idx].large_page_mask = -1;
19
/* Information carried about a condition to be evaluated. */
24
- env_tlb(env)->d[mmu_idx].vindex = 0;
20
@@ -XXX,XX +XXX,XX @@ static void s390x_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
25
- memset(env_tlb(env)->f[mmu_idx].table, -1,
21
26
- sizeof_tlb(&env_tlb(env)->f[mmu_idx]));
22
dc->cc_op = CC_OP_DYNAMIC;
27
- memset(env_tlb(env)->d[mmu_idx].vtable, -1,
23
dc->ex_value = dc->base.tb->cs_base;
28
- sizeof(env_tlb(env)->d[0].vtable));
24
- dc->do_debug = dc->base.singlestep_enabled;
29
+ CPUTLBDesc *desc = &env_tlb(env)->d[mmu_idx];
30
+ CPUTLBDescFast *fast = &env_tlb(env)->f[mmu_idx];
31
+
32
+ tlb_mmu_resize_locked(desc, fast);
33
+ desc->n_used_entries = 0;
34
+ desc->large_page_addr = -1;
35
+ desc->large_page_mask = -1;
36
+ desc->vindex = 0;
37
+ memset(fast->table, -1, sizeof_tlb(fast));
38
+ memset(desc->vtable, -1, sizeof(desc->vtable));
39
}
25
}
40
26
41
static inline void tlb_n_used_entries_inc(CPUArchState *env, uintptr_t mmu_idx)
27
static void s390x_tr_tb_start(DisasContextBase *db, CPUState *cs)
28
@@ -XXX,XX +XXX,XX @@ static void s390x_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
29
/* FALLTHRU */
30
case DISAS_PC_CC_UPDATED:
31
/* Exit the TB, either by raising a debug exception or by return. */
32
- if (dc->do_debug) {
33
- gen_exception(EXCP_DEBUG);
34
- } else if ((dc->base.tb->flags & FLAG_MASK_PER) ||
35
- dc->base.is_jmp == DISAS_PC_STALE_NOCHAIN) {
36
+ if ((dc->base.tb->flags & FLAG_MASK_PER) ||
37
+ dc->base.is_jmp == DISAS_PC_STALE_NOCHAIN) {
38
tcg_gen_exit_tb(NULL, 0);
39
} else {
40
tcg_gen_lookup_and_goto_ptr();
42
--
41
--
43
2.20.1
42
2.25.1
44
43
45
44
diff view generated by jsdifflib
1
The accel_initialised variable no longer has any setters.
1
GDB single-stepping is now handled generically.
2
2
3
Fixes: 6f6e1698a68c
3
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed by: Aleksandar Markovic <amarkovic@wavecomp.com>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
---
5
---
10
vl.c | 3 +--
6
target/sh4/helper.h | 1 -
11
1 file changed, 1 insertion(+), 2 deletions(-)
7
target/sh4/op_helper.c | 5 -----
8
target/sh4/translate.c | 14 +++-----------
9
3 files changed, 3 insertions(+), 17 deletions(-)
12
10
13
diff --git a/vl.c b/vl.c
11
diff --git a/target/sh4/helper.h b/target/sh4/helper.h
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/vl.c
13
--- a/target/sh4/helper.h
16
+++ b/vl.c
14
+++ b/target/sh4/helper.h
17
@@ -XXX,XX +XXX,XX @@ static void configure_accelerators(const char *progname)
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(raise_illegal_instruction, noreturn, env)
16
DEF_HELPER_1(raise_slot_illegal_instruction, noreturn, env)
17
DEF_HELPER_1(raise_fpu_disable, noreturn, env)
18
DEF_HELPER_1(raise_slot_fpu_disable, noreturn, env)
19
-DEF_HELPER_1(debug, noreturn, env)
20
DEF_HELPER_1(sleep, noreturn, env)
21
DEF_HELPER_2(trapa, noreturn, env, i32)
22
DEF_HELPER_1(exclusive, noreturn, env)
23
diff --git a/target/sh4/op_helper.c b/target/sh4/op_helper.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/target/sh4/op_helper.c
26
+++ b/target/sh4/op_helper.c
27
@@ -XXX,XX +XXX,XX @@ void helper_raise_slot_fpu_disable(CPUSH4State *env)
28
raise_exception(env, 0x820, 0);
29
}
30
31
-void helper_debug(CPUSH4State *env)
32
-{
33
- raise_exception(env, EXCP_DEBUG, 0);
34
-}
35
-
36
void helper_sleep(CPUSH4State *env)
18
{
37
{
19
const char *accel;
38
CPUState *cs = env_cpu(env);
20
char **accel_list, **tmp;
39
diff --git a/target/sh4/translate.c b/target/sh4/translate.c
21
- bool accel_initialised = false;
40
index XXXXXXX..XXXXXXX 100644
22
bool init_failed = false;
41
--- a/target/sh4/translate.c
23
42
+++ b/target/sh4/translate.c
24
qemu_opts_foreach(qemu_find_opts("icount"),
43
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
25
@@ -XXX,XX +XXX,XX @@ static void configure_accelerators(const char *progname)
44
tcg_gen_exit_tb(ctx->base.tb, n);
26
45
} else {
27
accel_list = g_strsplit(accel, ":", 0);
46
tcg_gen_movi_i32(cpu_pc, dest);
28
47
- if (ctx->base.singlestep_enabled) {
29
- for (tmp = accel_list; !accel_initialised && tmp && *tmp; tmp++) {
48
- gen_helper_debug(cpu_env);
30
+ for (tmp = accel_list; tmp && *tmp; tmp++) {
49
- } else if (use_exit_tb(ctx)) {
31
/*
50
+ if (use_exit_tb(ctx)) {
32
* Filter invalid accelerators here, to prevent obscenities
51
tcg_gen_exit_tb(NULL, 0);
33
* such as "-machine accel=tcg,,thread=single".
52
} else {
53
tcg_gen_lookup_and_goto_ptr();
54
@@ -XXX,XX +XXX,XX @@ static void gen_jump(DisasContext * ctx)
55
     delayed jump as immediate jump are conditinal jumps */
56
    tcg_gen_mov_i32(cpu_pc, cpu_delayed_pc);
57
tcg_gen_discard_i32(cpu_delayed_pc);
58
- if (ctx->base.singlestep_enabled) {
59
- gen_helper_debug(cpu_env);
60
- } else if (use_exit_tb(ctx)) {
61
+ if (use_exit_tb(ctx)) {
62
tcg_gen_exit_tb(NULL, 0);
63
} else {
64
tcg_gen_lookup_and_goto_ptr();
65
@@ -XXX,XX +XXX,XX @@ static void sh4_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
66
switch (ctx->base.is_jmp) {
67
case DISAS_STOP:
68
gen_save_cpu_state(ctx, true);
69
- if (ctx->base.singlestep_enabled) {
70
- gen_helper_debug(cpu_env);
71
- } else {
72
- tcg_gen_exit_tb(NULL, 0);
73
- }
74
+ tcg_gen_exit_tb(NULL, 0);
75
break;
76
case DISAS_NEXT:
77
case DISAS_TOO_MANY:
34
--
78
--
35
2.20.1
79
2.25.1
36
80
37
81
diff view generated by jsdifflib
1
Merge into the only caller, but at the same time split
1
GDB single-stepping is now handled generically.
2
out tlb_mmu_init to initialize a single tlb entry.
3
2
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
5
---
9
accel/tcg/cputlb.c | 33 ++++++++++++++++-----------------
6
target/tricore/helper.h | 1 -
10
1 file changed, 16 insertions(+), 17 deletions(-)
7
target/tricore/op_helper.c | 7 -------
8
target/tricore/translate.c | 14 +-------------
9
3 files changed, 1 insertion(+), 21 deletions(-)
11
10
12
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
11
diff --git a/target/tricore/helper.h b/target/tricore/helper.h
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/accel/tcg/cputlb.c
13
--- a/target/tricore/helper.h
15
+++ b/accel/tcg/cputlb.c
14
+++ b/target/tricore/helper.h
16
@@ -XXX,XX +XXX,XX @@ static void tlb_window_reset(CPUTLBDesc *desc, int64_t ns,
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(psw_write, void, env, i32)
17
desc->window_max_entries = max_entries;
16
DEF_HELPER_1(psw_read, i32, env)
17
/* Exceptions */
18
DEF_HELPER_3(raise_exception_sync, noreturn, env, i32, i32)
19
-DEF_HELPER_2(qemu_excp, noreturn, env, i32)
20
diff --git a/target/tricore/op_helper.c b/target/tricore/op_helper.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/tricore/op_helper.c
23
+++ b/target/tricore/op_helper.c
24
@@ -XXX,XX +XXX,XX @@ static void raise_exception_sync_helper(CPUTriCoreState *env, uint32_t class,
25
raise_exception_sync_internal(env, class, tin, pc, 0);
18
}
26
}
19
27
20
-static void tlb_dyn_init(CPUArchState *env)
28
-void helper_qemu_excp(CPUTriCoreState *env, uint32_t excp)
21
-{
29
-{
22
- int i;
30
- CPUState *cs = env_cpu(env);
23
-
31
- cs->exception_index = excp;
24
- for (i = 0; i < NB_MMU_MODES; i++) {
32
- cpu_loop_exit(cs);
25
- CPUTLBDesc *desc = &env_tlb(env)->d[i];
26
- size_t n_entries = 1 << CPU_TLB_DYN_DEFAULT_BITS;
27
-
28
- tlb_window_reset(desc, get_clock_realtime(), 0);
29
- desc->n_used_entries = 0;
30
- env_tlb(env)->f[i].mask = (n_entries - 1) << CPU_TLB_ENTRY_BITS;
31
- env_tlb(env)->f[i].table = g_new(CPUTLBEntry, n_entries);
32
- env_tlb(env)->d[i].iotlb = g_new(CPUIOTLBEntry, n_entries);
33
- }
34
-}
33
-}
35
-
34
-
36
/**
35
/* Addressing mode helper */
37
* tlb_mmu_resize_locked() - perform TLB resize bookkeeping; resize if necessary
36
38
* @desc: The CPUTLBDesc portion of the TLB
37
static uint16_t reverse16(uint16_t val)
39
@@ -XXX,XX +XXX,XX @@ static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
38
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
40
tlb_mmu_flush_locked(desc, fast);
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/tricore/translate.c
41
+++ b/target/tricore/translate.c
42
@@ -XXX,XX +XXX,XX @@ static inline void gen_save_pc(target_ulong pc)
43
tcg_gen_movi_tl(cpu_PC, pc);
41
}
44
}
42
45
43
+static void tlb_mmu_init(CPUTLBDesc *desc, CPUTLBDescFast *fast, int64_t now)
46
-static void generate_qemu_excp(DisasContext *ctx, int excp)
44
+{
47
-{
45
+ size_t n_entries = 1 << CPU_TLB_DYN_DEFAULT_BITS;
48
- TCGv_i32 tmp = tcg_const_i32(excp);
46
+
49
- gen_helper_qemu_excp(cpu_env, tmp);
47
+ tlb_window_reset(desc, now, 0);
50
- ctx->base.is_jmp = DISAS_NORETURN;
48
+ desc->n_used_entries = 0;
51
- tcg_temp_free(tmp);
49
+ fast->mask = (n_entries - 1) << CPU_TLB_ENTRY_BITS;
52
-}
50
+ fast->table = g_new(CPUTLBEntry, n_entries);
53
-
51
+ desc->iotlb = g_new(CPUIOTLBEntry, n_entries);
54
static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
52
+}
53
+
54
static inline void tlb_n_used_entries_inc(CPUArchState *env, uintptr_t mmu_idx)
55
{
55
{
56
env_tlb(env)->d[mmu_idx].n_used_entries++;
56
if (translator_use_goto_tb(&ctx->base, dest)) {
57
@@ -XXX,XX +XXX,XX @@ static inline void tlb_n_used_entries_dec(CPUArchState *env, uintptr_t mmu_idx)
57
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
58
void tlb_init(CPUState *cpu)
58
tcg_gen_exit_tb(ctx->base.tb, n);
59
{
59
} else {
60
CPUArchState *env = cpu->env_ptr;
60
gen_save_pc(dest);
61
+ int64_t now = get_clock_realtime();
61
- if (ctx->base.singlestep_enabled) {
62
+ int i;
62
- generate_qemu_excp(ctx, EXCP_DEBUG);
63
63
- } else {
64
qemu_spin_init(&env_tlb(env)->c.lock);
64
- tcg_gen_lookup_and_goto_ptr();
65
65
- }
66
/* Ensure that cpu_reset performs a full flush. */
66
+ tcg_gen_lookup_and_goto_ptr();
67
env_tlb(env)->c.dirty = ALL_MMUIDX_BITS;
67
}
68
69
- tlb_dyn_init(env);
70
+ for (i = 0; i < NB_MMU_MODES; i++) {
71
+ tlb_mmu_init(&env_tlb(env)->d[i], &env_tlb(env)->f[i], now);
72
+ }
73
}
68
}
74
69
75
/* flush_all_helper: run fn across all cpus
76
--
70
--
77
2.20.1
71
2.25.1
78
72
79
73
diff view generated by jsdifflib
1
From: Carlos Santos <casantos@redhat.com>
1
GDB single-stepping is now handled generically.
2
2
3
uClibc defines _SC_LEVEL1_ICACHE_LINESIZE and _SC_LEVEL1_DCACHE_LINESIZE
4
but the corresponding sysconf calls returns -1, which is a valid result,
5
meaning that the limit is indeterminate.
6
7
Handle this situation using the fallback values instead of crashing due
8
to an assertion failure.
9
10
Signed-off-by: Carlos Santos <casantos@redhat.com>
11
Message-Id: <20191017123713.30192-1-casantos@redhat.com>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
---
4
---
14
util/cacheinfo.c | 10 ++++++++--
5
target/xtensa/translate.c | 25 ++++++++-----------------
15
1 file changed, 8 insertions(+), 2 deletions(-)
6
1 file changed, 8 insertions(+), 17 deletions(-)
16
7
17
diff --git a/util/cacheinfo.c b/util/cacheinfo.c
8
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
18
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
19
--- a/util/cacheinfo.c
10
--- a/target/xtensa/translate.c
20
+++ b/util/cacheinfo.c
11
+++ b/target/xtensa/translate.c
21
@@ -XXX,XX +XXX,XX @@ static void sys_cache_info(int *isize, int *dsize)
12
@@ -XXX,XX +XXX,XX @@ static void gen_jump_slot(DisasContext *dc, TCGv dest, int slot)
22
static void sys_cache_info(int *isize, int *dsize)
13
if (dc->icount) {
23
{
14
tcg_gen_mov_i32(cpu_SR[ICOUNT], dc->next_icount);
24
# ifdef _SC_LEVEL1_ICACHE_LINESIZE
15
}
25
- *isize = sysconf(_SC_LEVEL1_ICACHE_LINESIZE);
16
- if (dc->base.singlestep_enabled) {
26
+ int tmp_isize = (int) sysconf(_SC_LEVEL1_ICACHE_LINESIZE);
17
- gen_exception(dc, EXCP_DEBUG);
27
+ if (tmp_isize > 0) {
18
+ if (dc->op_flags & XTENSA_OP_POSTPROCESS) {
28
+ *isize = tmp_isize;
19
+ slot = gen_postprocess(dc, slot);
29
+ }
20
+ }
30
# endif
21
+ if (slot >= 0) {
31
# ifdef _SC_LEVEL1_DCACHE_LINESIZE
22
+ tcg_gen_goto_tb(slot);
32
- *dsize = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
23
+ tcg_gen_exit_tb(dc->base.tb, slot);
33
+ int tmp_dsize = (int) sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
24
} else {
34
+ if (tmp_dsize > 0) {
25
- if (dc->op_flags & XTENSA_OP_POSTPROCESS) {
35
+ *dsize = tmp_dsize;
26
- slot = gen_postprocess(dc, slot);
36
+ }
27
- }
37
# endif
28
- if (slot >= 0) {
29
- tcg_gen_goto_tb(slot);
30
- tcg_gen_exit_tb(dc->base.tb, slot);
31
- } else {
32
- tcg_gen_exit_tb(NULL, 0);
33
- }
34
+ tcg_gen_exit_tb(NULL, 0);
35
}
36
dc->base.is_jmp = DISAS_NORETURN;
38
}
37
}
39
#endif /* sys_cache_info */
38
@@ -XXX,XX +XXX,XX @@ static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
39
case DISAS_NORETURN:
40
break;
41
case DISAS_TOO_MANY:
42
- if (dc->base.singlestep_enabled) {
43
- tcg_gen_movi_i32(cpu_pc, dc->pc);
44
- gen_exception(dc, EXCP_DEBUG);
45
- } else {
46
- gen_jumpi(dc, dc->pc, 0);
47
- }
48
+ gen_jumpi(dc, dc->pc, 0);
49
break;
50
default:
51
g_assert_not_reached();
40
--
52
--
41
2.20.1
53
2.25.1
42
54
43
55
diff view generated by jsdifflib
1
We will want to be able to flush a tlb without resizing.
1
This reverts commit 1b36e4f5a5de585210ea95f2257839c2312be28f.
2
2
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
3
Despite a comment saying why cpu_common_props cannot be placed in
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
a file that is compiled once, it was moved anyway. Revert that.
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
5
6
Since then, Property is not defined in hw/core/cpu.h, so it is now
7
easier to declare a function to install the properties rather than
8
the Property array itself.
9
10
Cc: Eduardo Habkost <ehabkost@redhat.com>
11
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
13
---
8
accel/tcg/cputlb.c | 15 ++++++++++-----
14
include/hw/core/cpu.h | 1 +
9
1 file changed, 10 insertions(+), 5 deletions(-)
15
cpu.c | 21 +++++++++++++++++++++
16
hw/core/cpu-common.c | 17 +----------------
17
3 files changed, 23 insertions(+), 16 deletions(-)
10
18
11
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
19
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
12
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
13
--- a/accel/tcg/cputlb.c
21
--- a/include/hw/core/cpu.h
14
+++ b/accel/tcg/cputlb.c
22
+++ b/include/hw/core/cpu.h
15
@@ -XXX,XX +XXX,XX @@ static void tlb_mmu_resize_locked(CPUTLBDesc *desc, CPUTLBDescFast *fast)
23
@@ -XXX,XX +XXX,XX @@ void QEMU_NORETURN cpu_abort(CPUState *cpu, const char *fmt, ...)
16
}
24
GCC_FMT_ATTR(2, 3);
25
26
/* $(top_srcdir)/cpu.c */
27
+void cpu_class_init_props(DeviceClass *dc);
28
void cpu_exec_initfn(CPUState *cpu);
29
void cpu_exec_realizefn(CPUState *cpu, Error **errp);
30
void cpu_exec_unrealizefn(CPUState *cpu);
31
diff --git a/cpu.c b/cpu.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/cpu.c
34
+++ b/cpu.c
35
@@ -XXX,XX +XXX,XX @@ void cpu_exec_unrealizefn(CPUState *cpu)
36
cpu_list_remove(cpu);
17
}
37
}
18
38
19
-static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
39
+static Property cpu_common_props[] = {
20
+static void tlb_mmu_flush_locked(CPUTLBDesc *desc, CPUTLBDescFast *fast)
40
+#ifndef CONFIG_USER_ONLY
21
{
41
+ /*
22
- CPUTLBDesc *desc = &env_tlb(env)->d[mmu_idx];
42
+ * Create a memory property for softmmu CPU object,
23
- CPUTLBDescFast *fast = &env_tlb(env)->f[mmu_idx];
43
+ * so users can wire up its memory. (This can't go in hw/core/cpu.c
24
-
44
+ * because that file is compiled only once for both user-mode
25
- tlb_mmu_resize_locked(desc, fast);
45
+ * and system builds.) The default if no link is set up is to use
26
desc->n_used_entries = 0;
46
+ * the system address space.
27
desc->large_page_addr = -1;
47
+ */
28
desc->large_page_mask = -1;
48
+ DEFINE_PROP_LINK("memory", CPUState, memory, TYPE_MEMORY_REGION,
29
@@ -XXX,XX +XXX,XX @@ static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
49
+ MemoryRegion *),
30
memset(desc->vtable, -1, sizeof(desc->vtable));
50
+#endif
31
}
51
+ DEFINE_PROP_BOOL("start-powered-off", CPUState, start_powered_off, false),
32
52
+ DEFINE_PROP_END_OF_LIST(),
33
+static void tlb_flush_one_mmuidx_locked(CPUArchState *env, int mmu_idx)
53
+};
54
+
55
+void cpu_class_init_props(DeviceClass *dc)
34
+{
56
+{
35
+ CPUTLBDesc *desc = &env_tlb(env)->d[mmu_idx];
57
+ device_class_set_props(dc, cpu_common_props);
36
+ CPUTLBDescFast *fast = &env_tlb(env)->f[mmu_idx];
37
+
38
+ tlb_mmu_resize_locked(desc, fast);
39
+ tlb_mmu_flush_locked(desc, fast);
40
+}
58
+}
41
+
59
+
42
static inline void tlb_n_used_entries_inc(CPUArchState *env, uintptr_t mmu_idx)
60
void cpu_exec_initfn(CPUState *cpu)
43
{
61
{
44
env_tlb(env)->d[mmu_idx].n_used_entries++;
62
cpu->as = NULL;
63
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/core/cpu-common.c
66
+++ b/hw/core/cpu-common.c
67
@@ -XXX,XX +XXX,XX @@ static int64_t cpu_common_get_arch_id(CPUState *cpu)
68
return cpu->cpu_index;
69
}
70
71
-static Property cpu_common_props[] = {
72
-#ifndef CONFIG_USER_ONLY
73
- /* Create a memory property for softmmu CPU object,
74
- * so users can wire up its memory. (This can't go in hw/core/cpu.c
75
- * because that file is compiled only once for both user-mode
76
- * and system builds.) The default if no link is set up is to use
77
- * the system address space.
78
- */
79
- DEFINE_PROP_LINK("memory", CPUState, memory, TYPE_MEMORY_REGION,
80
- MemoryRegion *),
81
-#endif
82
- DEFINE_PROP_BOOL("start-powered-off", CPUState, start_powered_off, false),
83
- DEFINE_PROP_END_OF_LIST(),
84
-};
85
-
86
static void cpu_class_init(ObjectClass *klass, void *data)
87
{
88
DeviceClass *dc = DEVICE_CLASS(klass);
89
@@ -XXX,XX +XXX,XX @@ static void cpu_class_init(ObjectClass *klass, void *data)
90
dc->realize = cpu_common_realizefn;
91
dc->unrealize = cpu_common_unrealizefn;
92
dc->reset = cpu_common_reset;
93
- device_class_set_props(dc, cpu_common_props);
94
+ cpu_class_init_props(dc);
95
/*
96
* Reason: CPUs still need special care by board code: wiring up
97
* IRQs, adding reset handlers, halting non-first CPUs, ...
45
--
98
--
46
2.20.1
99
2.25.1
47
100
48
101
diff view generated by jsdifflib