1
target-arm queue: this time around is all small fixes
1
Arm queue; bugfixes only.
2
and changes.
3
2
4
thanks
3
thanks
5
-- PMM
4
-- PMM
6
5
7
The following changes since commit fec105c2abda8567ec15230429c41429b5ee307c:
6
The following changes since commit 48aa8f0ac536db3550a35c295ff7de94e4c33739:
8
7
9
Merge remote-tracking branch 'remotes/kraxel/tags/audio-20190828-pull-request' into staging (2019-09-03 14:03:15 +0100)
8
Merge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2020-11-16' into staging (2020-11-17 11:07:00 +0000)
10
9
11
are available in the Git repository at:
10
are available in the Git repository at:
12
11
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190903
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201117
14
13
15
for you to fetch changes up to 5e5584c89f36b302c666bc6db535fd3f7ff35ad2:
14
for you to fetch changes up to ab135622cf478585bdfcb68b85e4a817d74a0c42:
16
15
17
target/arm: Don't abort on M-profile exception return in linux-user mode (2019-09-03 16:20:35 +0100)
16
tmp105: Correct handling of temperature limit checks (2020-11-17 12:56:33 +0000)
18
17
19
----------------------------------------------------------------
18
----------------------------------------------------------------
20
target-arm queue:
19
target-arm queue:
21
* Revert and correctly fix refactoring of unallocated_encoding()
20
* hw/arm/virt: ARM_VIRT must select ARM_GIC
22
* Take exceptions on ATS instructions when needed
21
* exynos: Fix bad printf format specifiers
23
* aspeed/timer: Provide back-pressure information for short periods
22
* hw/input/ps2.c: Remove remnants of printf debug
24
* memory: Remove unused memory_region_iommu_replay_all()
23
* target/openrisc: Remove dead code attempting to check "is timer disabled"
25
* hw/arm/smmuv3: Log a guest error when decoding an invalid STE
24
* register: Remove unnecessary NULL check
26
* hw/arm/smmuv3: Remove spurious error messages on IOVA invalidations
25
* util/cutils: Fix Coverity array overrun in freq_to_str()
27
* target/arm: Fix SMMLS argument order
26
* configure: Make "does libgio work" test pull in some actual functions
28
* hw/arm: Use ARM_CPU_TYPE_NAME() macro when appropriate
27
* tmp105: reset the T_low and T_High registers
29
* hw/arm: Correct reference counting for creation of various objects
28
* tmp105: Correct handling of temperature limit checks
30
* includes: remove stale [smp|max]_cpus externs
31
* tcg/README: fix typo
32
* atomic_template: fix indentation in GEN_ATOMIC_HELPER
33
* include/exec/cpu-defs.h: fix typo
34
* target/arm: Free TCG temps in trans_VMOV_64_sp()
35
* target/arm: Don't abort on M-profile exception return in linux-user mode
36
29
37
----------------------------------------------------------------
30
----------------------------------------------------------------
38
Alex Bennée (2):
31
Alex Chen (1):
39
includes: remove stale [smp|max]_cpus externs
32
exynos: Fix bad printf format specifiers
40
include/exec/cpu-defs.h: fix typo
41
33
42
Andrew Jeffery (1):
34
Alistair Francis (1):
43
aspeed/timer: Provide back-pressure information for short periods
35
register: Remove unnecessary NULL check
44
36
45
Emilio G. Cota (2):
37
Andrew Jones (1):
46
tcg/README: fix typo s/afterwise/afterwards/
38
hw/arm/virt: ARM_VIRT must select ARM_GIC
47
atomic_template: fix indentation in GEN_ATOMIC_HELPER
48
39
49
Eric Auger (3):
40
Peter Maydell (5):
50
memory: Remove unused memory_region_iommu_replay_all()
41
hw/input/ps2.c: Remove remnants of printf debug
51
hw/arm/smmuv3: Log a guest error when decoding an invalid STE
42
target/openrisc: Remove dead code attempting to check "is timer disabled"
52
hw/arm/smmuv3: Remove spurious error messages on IOVA invalidations
43
configure: Make "does libgio work" test pull in some actual functions
44
hw/misc/tmp105: reset the T_low and T_High registers
45
tmp105: Correct handling of temperature limit checks
53
46
54
Peter Maydell (4):
47
Philippe Mathieu-Daudé (1):
55
target/arm: Allow ARMCPRegInfo read/write functions to throw exceptions
48
util/cutils: Fix Coverity array overrun in freq_to_str()
56
target/arm: Take exceptions on ATS instructions when needed
57
target/arm: Free TCG temps in trans_VMOV_64_sp()
58
target/arm: Don't abort on M-profile exception return in linux-user mode
59
49
60
Philippe Mathieu-Daudé (6):
50
configure | 11 +++++--
61
hw/arm: Use ARM_CPU_TYPE_NAME() macro when appropriate
51
hw/misc/tmp105.h | 7 +++++
62
hw/arm: Use object_initialize_child for correct reference counting
52
hw/core/register.c | 4 ---
63
hw/arm: Use sysbus_init_child_obj for correct reference counting
53
hw/input/ps2.c | 9 ------
64
hw/arm/fsl-imx: Add the cpu as child of the SoC object
54
hw/misc/tmp105.c | 73 ++++++++++++++++++++++++++++++++++++++------
65
hw/dma/xilinx_axi: Use object_initialize_child for correct ref. counting
55
hw/timer/exynos4210_mct.c | 4 +--
66
hw/net/xilinx_axi: Use object_initialize_child for correct ref. counting
56
hw/timer/exynos4210_pwm.c | 8 ++---
57
target/openrisc/sys_helper.c | 3 --
58
util/cutils.c | 3 +-
59
hw/arm/Kconfig | 1 +
60
10 files changed, 89 insertions(+), 34 deletions(-)
67
61
68
Richard Henderson (3):
69
Revert "target/arm: Use unallocated_encoding for aarch32"
70
target/arm: Factor out unallocated_encoding for aarch32
71
target/arm: Fix SMMLS argument order
72
73
accel/tcg/atomic_template.h | 2 +-
74
hw/arm/smmuv3-internal.h | 1 +
75
include/exec/cpu-defs.h | 2 +-
76
include/exec/memory.h | 10 ----
77
include/sysemu/sysemu.h | 2 -
78
target/arm/cpu.h | 6 ++-
79
target/arm/translate-a64.h | 2 +
80
target/arm/translate.h | 2 -
81
hw/arm/allwinner-a10.c | 3 +-
82
hw/arm/cubieboard.c | 3 +-
83
hw/arm/digic.c | 3 +-
84
hw/arm/exynos4_boards.c | 4 +-
85
hw/arm/fsl-imx25.c | 4 +-
86
hw/arm/fsl-imx31.c | 4 +-
87
hw/arm/fsl-imx6.c | 3 +-
88
hw/arm/fsl-imx6ul.c | 2 +-
89
hw/arm/mcimx7d-sabre.c | 9 ++--
90
hw/arm/mps2-tz.c | 15 +++---
91
hw/arm/musca.c | 9 ++--
92
hw/arm/smmuv3.c | 18 ++++---
93
hw/arm/xlnx-zynqmp.c | 8 +--
94
hw/dma/xilinx_axidma.c | 16 +++---
95
hw/net/xilinx_axienet.c | 17 +++----
96
hw/timer/aspeed_timer.c | 17 ++++++-
97
memory.c | 9 ----
98
target/arm/helper.c | 107 +++++++++++++++++++++++++++++++++++------
99
target/arm/translate-a64.c | 13 +++++
100
target/arm/translate-vfp.inc.c | 2 +
101
target/arm/translate.c | 50 +++++++++++++++++--
102
tcg/README | 2 +-
103
30 files changed, 244 insertions(+), 101 deletions(-)
104
diff view generated by jsdifflib
1
From: Eric Auger <eric.auger@redhat.com>
1
From: Andrew Jones <drjones@redhat.com>
2
2
3
Log a guest error when encountering an invalid STE.
3
The removal of the selection of A15MPCORE from ARM_VIRT also
4
removed what A15MPCORE selects, ARM_GIC. We still need ARM_GIC.
4
5
5
Signed-off-by: Eric Auger <eric.auger@redhat.com>
6
Fixes: bec3c97e0cf9 ("hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals")
7
Reported-by: Miroslav Rezanina <mrezanin@redhat.com>
8
Signed-off-by: Andrew Jones <drjones@redhat.com>
9
Reviewed-by: Miroslav Rezanina <mrezanin@redhat.com>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Message-id: 20190822172350.12008-5-eric.auger@redhat.com
11
Message-id: 20201111143440.112763-1-drjones@redhat.com
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
13
---
10
hw/arm/smmuv3.c | 1 +
14
hw/arm/Kconfig | 1 +
11
1 file changed, 1 insertion(+)
15
1 file changed, 1 insertion(+)
12
16
13
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
17
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/smmuv3.c
19
--- a/hw/arm/Kconfig
16
+++ b/hw/arm/smmuv3.c
20
+++ b/hw/arm/Kconfig
17
@@ -XXX,XX +XXX,XX @@ static int decode_ste(SMMUv3State *s, SMMUTransCfg *cfg,
21
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
18
uint32_t config;
22
imply VFIO_PLATFORM
19
23
imply VFIO_XGMAC
20
if (!STE_VALID(ste)) {
24
imply TPM_TIS_SYSBUS
21
+ qemu_log_mask(LOG_GUEST_ERROR, "invalid STE\n");
25
+ select ARM_GIC
22
goto bad_ste;
26
select ACPI
23
}
27
select ARM_SMMUV3
24
28
select GPIO_KEY
25
--
29
--
26
2.20.1
30
2.20.1
27
31
28
32
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Alex Chen <alex.chen@huawei.com>
2
2
3
This reverts commit 3cb36637157088892e9e33ddb1034bffd1251d3b.
3
We should use printf format specifier "%u" instead of "%d" for
4
argument of type "unsigned int".
4
5
5
Despite the fact that the text for the call to gen_exception_insn
6
Reported-by: Euler Robot <euler.robot@huawei.com>
6
is identical for aarch64 and aarch32, the implementation inside
7
Signed-off-by: Alex Chen <alex.chen@huawei.com>
7
gen_exception_insn is totally different.
8
Message-id: 20201111073651.72804-1-alex.chen@huawei.com
8
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
This fixes exceptions raised from aarch64.
10
11
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
14
Message-id: 20190826151536.6771-2-richard.henderson@linaro.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
11
---
17
target/arm/translate-a64.h | 2 ++
12
hw/timer/exynos4210_mct.c | 4 ++--
18
target/arm/translate.h | 2 --
13
hw/timer/exynos4210_pwm.c | 8 ++++----
19
target/arm/translate-a64.c | 7 +++++++
14
2 files changed, 6 insertions(+), 6 deletions(-)
20
target/arm/translate-vfp.inc.c | 3 ++-
21
target/arm/translate.c | 22 ++++++++++------------
22
5 files changed, 21 insertions(+), 15 deletions(-)
23
15
24
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
16
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/target/arm/translate-a64.h
18
--- a/hw/timer/exynos4210_mct.c
27
+++ b/target/arm/translate-a64.h
19
+++ b/hw/timer/exynos4210_mct.c
28
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@ static void exynos4210_gcomp_raise_irq(void *opaque, uint32_t id)
29
#ifndef TARGET_ARM_TRANSLATE_A64_H
21
/* If CSTAT is pending and IRQ is enabled */
30
#define TARGET_ARM_TRANSLATE_A64_H
22
if ((s->reg.int_cstat & G_INT_CSTAT_COMP(id)) &&
31
23
(s->reg.int_enb & G_INT_ENABLE(id))) {
32
+void unallocated_encoding(DisasContext *s);
24
- DPRINTF("gcmp timer[%d] IRQ\n", id);
33
+
25
+ DPRINTF("gcmp timer[%u] IRQ\n", id);
34
#define unsupported_encoding(s, insn) \
26
qemu_irq_raise(s->irq[id]);
35
do { \
36
qemu_log_mask(LOG_UNIMP, \
37
diff --git a/target/arm/translate.h b/target/arm/translate.h
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/translate.h
40
+++ b/target/arm/translate.h
41
@@ -XXX,XX +XXX,XX @@ typedef struct DisasCompare {
42
bool value_global;
43
} DisasCompare;
44
45
-void unallocated_encoding(DisasContext *s);
46
-
47
/* Share the TCG temporaries common between 32 and 64 bit modes. */
48
extern TCGv_i32 cpu_NF, cpu_ZF, cpu_CF, cpu_VF;
49
extern TCGv_i64 cpu_exclusive_addr;
50
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/arm/translate-a64.c
53
+++ b/target/arm/translate-a64.c
54
@@ -XXX,XX +XXX,XX @@ static inline void gen_goto_tb(DisasContext *s, int n, uint64_t dest)
55
}
27
}
56
}
28
}
57
29
@@ -XXX,XX +XXX,XX @@ static void exynos4210_mct_update_freq(Exynos4210MCTState *s)
58
+void unallocated_encoding(DisasContext *s)
30
MCT_CFG_GET_DIVIDER(s->reg_mct_cfg));
59
+{
31
60
+ /* Unallocated and reserved encodings are uncategorized */
32
if (freq != s->freq) {
61
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
33
- DPRINTF("freq=%dHz\n", s->freq);
62
+ default_exception_el(s));
34
+ DPRINTF("freq=%uHz\n", s->freq);
63
+}
35
64
+
36
/* global timer */
65
static void init_tmp_a64_array(DisasContext *s)
37
tx_ptimer_set_freq(s->g_timer.ptimer_frc, s->freq);
66
{
38
diff --git a/hw/timer/exynos4210_pwm.c b/hw/timer/exynos4210_pwm.c
67
#ifdef CONFIG_DEBUG_TCG
68
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
69
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
70
--- a/target/arm/translate-vfp.inc.c
40
--- a/hw/timer/exynos4210_pwm.c
71
+++ b/target/arm/translate-vfp.inc.c
41
+++ b/hw/timer/exynos4210_pwm.c
72
@@ -XXX,XX +XXX,XX @@ static bool full_vfp_access_check(DisasContext *s, bool ignore_vfp_enabled)
42
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_update_freq(Exynos4210PWMState *s, uint32_t id)
73
43
74
if (!s->vfp_enabled && !ignore_vfp_enabled) {
44
if (freq != s->timer[id].freq) {
75
assert(!arm_dc_feature(s, ARM_FEATURE_M));
45
ptimer_set_freq(s->timer[id].ptimer, s->timer[id].freq);
76
- unallocated_encoding(s);
46
- DPRINTF("freq=%dHz\n", s->timer[id].freq);
77
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
47
+ DPRINTF("freq=%uHz\n", s->timer[id].freq);
78
+ default_exception_el(s));
79
return false;
80
}
48
}
81
82
diff --git a/target/arm/translate.c b/target/arm/translate.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/target/arm/translate.c
85
+++ b/target/arm/translate.c
86
@@ -XXX,XX +XXX,XX @@ static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
87
s->base.is_jmp = DISAS_NORETURN;
88
}
49
}
89
50
90
-void unallocated_encoding(DisasContext *s)
51
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_tick(void *opaque)
91
-{
52
uint32_t id = s->id;
92
- /* Unallocated and reserved encodings are uncategorized */
53
bool cmp;
93
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
54
94
- default_exception_el(s));
55
- DPRINTF("timer %d tick\n", id);
95
-}
56
+ DPRINTF("timer %u tick\n", id);
96
-
57
97
/* Force a TB lookup after an instruction that changes the CPU state. */
58
/* set irq status */
98
static inline void gen_lookup_tb(DisasContext *s)
59
p->reg_tint_cstat |= TINT_CSTAT_STATUS(id);
99
{
60
100
@@ -XXX,XX +XXX,XX @@ static inline void gen_hlt(DisasContext *s, int imm)
61
/* raise IRQ */
101
return;
62
if (p->reg_tint_cstat & TINT_CSTAT_ENABLE(id)) {
63
- DPRINTF("timer %d IRQ\n", id);
64
+ DPRINTF("timer %u IRQ\n", id);
65
qemu_irq_raise(p->timer[id].irq);
102
}
66
}
103
67
104
- unallocated_encoding(s);
68
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_tick(void *opaque)
105
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
106
+ default_exception_el(s));
107
}
108
109
static inline void gen_add_data_offset(DisasContext *s, unsigned int insn,
110
@@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s,
111
}
69
}
112
70
113
if (undef) {
71
if (cmp) {
114
- unallocated_encoding(s);
72
- DPRINTF("auto reload timer %d count to %x\n", id,
115
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
73
+ DPRINTF("auto reload timer %u count to %x\n", id,
116
+ default_exception_el(s));
74
p->timer[id].reg_tcntb);
117
return;
75
ptimer_set_count(p->timer[id].ptimer, p->timer[id].reg_tcntb);
118
}
76
ptimer_run(p->timer[id].ptimer, 1);
119
120
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
121
break;
122
default:
123
illegal_op:
124
- unallocated_encoding(s);
125
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
126
+ default_exception_el(s));
127
break;
128
}
129
}
130
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
131
}
132
return;
133
illegal_op:
134
- unallocated_encoding(s);
135
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
136
+ default_exception_el(s));
137
}
138
139
static void disas_thumb_insn(DisasContext *s, uint32_t insn)
140
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
141
return;
142
illegal_op:
143
undef:
144
- unallocated_encoding(s);
145
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
146
+ default_exception_el(s));
147
}
148
149
static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
150
--
77
--
151
2.20.1
78
2.20.1
152
79
153
80
diff view generated by jsdifflib
1
The translation table walk for an ATS instruction can result in
1
In commit 5edab03d4040 we added tracepoints to the ps2 keyboard
2
various faults. In general these are just reported back via the
2
and mouse emulation. However we didn't remove all the debug-by-printf
3
PAR_EL1 fault status fields, but in some cases the architecture
3
support. In fact there is only one printf() remaining, and it is
4
requires that the fault is turned into an exception:
4
redundant with the trace_ps2_write_mouse() event next to it.
5
* synchronous stage 2 faults of any kind during AT S1E0* and
5
Remove the printf() and the now-unused DEBUG* macros.
6
AT S1E1* instructions executed from NS EL1 fault to EL2 or EL3
7
* synchronous external aborts are taken as Data Abort exceptions
8
9
(This is documented in the v8A Arm ARM DDI0487A.e D5.2.11 and
10
G5.13.4.)
11
6
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
14
Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
9
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
15
Message-id: 20190816125802.25877-3-peter.maydell@linaro.org
10
Message-id: 20201101133258.4240-1-peter.maydell@linaro.org
16
---
11
---
17
target/arm/helper.c | 107 +++++++++++++++++++++++++++++++++++++-------
12
hw/input/ps2.c | 9 ---------
18
1 file changed, 92 insertions(+), 15 deletions(-)
13
1 file changed, 9 deletions(-)
19
14
20
diff --git a/target/arm/helper.c b/target/arm/helper.c
15
diff --git a/hw/input/ps2.c b/hw/input/ps2.c
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/helper.c
17
--- a/hw/input/ps2.c
23
+++ b/target/arm/helper.c
18
+++ b/hw/input/ps2.c
24
@@ -XXX,XX +XXX,XX @@ static uint64_t do_ats_write(CPUARMState *env, uint64_t value,
19
@@ -XXX,XX +XXX,XX @@
25
ret = get_phys_addr(env, value, access_type, mmu_idx, &phys_addr, &attrs,
20
26
&prot, &page_size, &fi, &cacheattrs);
21
#include "trace.h"
27
22
28
+ if (ret) {
23
-/* debug PC keyboard */
29
+ /*
24
-//#define DEBUG_KBD
30
+ * Some kinds of translation fault must cause exceptions rather
25
-
31
+ * than being reported in the PAR.
26
-/* debug PC keyboard : only mouse */
32
+ */
27
-//#define DEBUG_MOUSE
33
+ int current_el = arm_current_el(env);
28
-
34
+ int target_el;
29
/* Keyboard Commands */
35
+ uint32_t syn, fsr, fsc;
30
#define KBD_CMD_SET_LEDS    0xED    /* Set keyboard leds */
36
+ bool take_exc = false;
31
#define KBD_CMD_ECHO     0xEE
37
+
32
@@ -XXX,XX +XXX,XX @@ void ps2_write_mouse(void *opaque, int val)
38
+ if (fi.s1ptw && current_el == 1 && !arm_is_secure(env)
33
PS2MouseState *s = (PS2MouseState *)opaque;
39
+ && (mmu_idx == ARMMMUIdx_S1NSE1 || mmu_idx == ARMMMUIdx_S1NSE0)) {
34
40
+ /*
35
trace_ps2_write_mouse(opaque, val);
41
+ * Synchronous stage 2 fault on an access made as part of the
36
-#ifdef DEBUG_MOUSE
42
+ * translation table walk for AT S1E0* or AT S1E1* insn
37
- printf("kbd: write mouse 0x%02x\n", val);
43
+ * executed from NS EL1. If this is a synchronous external abort
38
-#endif
44
+ * and SCR_EL3.EA == 1, then we take a synchronous external abort
39
switch(s->common.write_cmd) {
45
+ * to EL3. Otherwise the fault is taken as an exception to EL2,
40
default:
46
+ * and HPFAR_EL2 holds the faulting IPA.
41
case -1:
47
+ */
48
+ if (fi.type == ARMFault_SyncExternalOnWalk &&
49
+ (env->cp15.scr_el3 & SCR_EA)) {
50
+ target_el = 3;
51
+ } else {
52
+ env->cp15.hpfar_el2 = extract64(fi.s2addr, 12, 47) << 4;
53
+ target_el = 2;
54
+ }
55
+ take_exc = true;
56
+ } else if (fi.type == ARMFault_SyncExternalOnWalk) {
57
+ /*
58
+ * Synchronous external aborts during a translation table walk
59
+ * are taken as Data Abort exceptions.
60
+ */
61
+ if (fi.stage2) {
62
+ if (current_el == 3) {
63
+ target_el = 3;
64
+ } else {
65
+ target_el = 2;
66
+ }
67
+ } else {
68
+ target_el = exception_target_el(env);
69
+ }
70
+ take_exc = true;
71
+ }
72
+
73
+ if (take_exc) {
74
+ /* Construct FSR and FSC using same logic as arm_deliver_fault() */
75
+ if (target_el == 2 || arm_el_is_aa64(env, target_el) ||
76
+ arm_s1_regime_using_lpae_format(env, mmu_idx)) {
77
+ fsr = arm_fi_to_lfsc(&fi);
78
+ fsc = extract32(fsr, 0, 6);
79
+ } else {
80
+ fsr = arm_fi_to_sfsc(&fi);
81
+ fsc = 0x3f;
82
+ }
83
+ /*
84
+ * Report exception with ESR indicating a fault due to a
85
+ * translation table walk for a cache maintenance instruction.
86
+ */
87
+ syn = syn_data_abort_no_iss(current_el == target_el,
88
+ fi.ea, 1, fi.s1ptw, 1, fsc);
89
+ env->exception.vaddress = value;
90
+ env->exception.fsr = fsr;
91
+ raise_exception(env, EXCP_DATA_ABORT, syn, target_el);
92
+ }
93
+ }
94
+
95
if (is_a64(env)) {
96
format64 = true;
97
} else if (arm_feature(env, ARM_FEATURE_LPAE)) {
98
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vapa_cp_reginfo[] = {
99
/* This underdecoding is safe because the reginfo is NO_RAW. */
100
{ .name = "ATS", .cp = 15, .crn = 7, .crm = 8, .opc1 = 0, .opc2 = CP_ANY,
101
.access = PL1_W, .accessfn = ats_access,
102
- .writefn = ats_write, .type = ARM_CP_NO_RAW },
103
+ .writefn = ats_write, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC },
104
#endif
105
REGINFO_SENTINEL
106
};
107
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
108
/* 64 bit address translation operations */
109
{ .name = "AT_S1E1R", .state = ARM_CP_STATE_AA64,
110
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 0,
111
- .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
112
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
113
+ .writefn = ats_write64 },
114
{ .name = "AT_S1E1W", .state = ARM_CP_STATE_AA64,
115
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 1,
116
- .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
117
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
118
+ .writefn = ats_write64 },
119
{ .name = "AT_S1E0R", .state = ARM_CP_STATE_AA64,
120
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 2,
121
- .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
122
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
123
+ .writefn = ats_write64 },
124
{ .name = "AT_S1E0W", .state = ARM_CP_STATE_AA64,
125
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 3,
126
- .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
127
+ .access = PL1_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
128
+ .writefn = ats_write64 },
129
{ .name = "AT_S12E1R", .state = ARM_CP_STATE_AA64,
130
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 4,
131
- .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
132
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
133
+ .writefn = ats_write64 },
134
{ .name = "AT_S12E1W", .state = ARM_CP_STATE_AA64,
135
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 5,
136
- .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
137
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
138
+ .writefn = ats_write64 },
139
{ .name = "AT_S12E0R", .state = ARM_CP_STATE_AA64,
140
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 6,
141
- .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
142
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
143
+ .writefn = ats_write64 },
144
{ .name = "AT_S12E0W", .state = ARM_CP_STATE_AA64,
145
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 7,
146
- .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
147
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
148
+ .writefn = ats_write64 },
149
/* AT S1E2* are elsewhere as they UNDEF from EL3 if EL2 is not present */
150
{ .name = "AT_S1E3R", .state = ARM_CP_STATE_AA64,
151
.opc0 = 1, .opc1 = 6, .crn = 7, .crm = 8, .opc2 = 0,
152
- .access = PL3_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
153
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
154
+ .writefn = ats_write64 },
155
{ .name = "AT_S1E3W", .state = ARM_CP_STATE_AA64,
156
.opc0 = 1, .opc1 = 6, .crn = 7, .crm = 8, .opc2 = 1,
157
- .access = PL3_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
158
+ .access = PL3_W, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC,
159
+ .writefn = ats_write64 },
160
{ .name = "PAR_EL1", .state = ARM_CP_STATE_AA64,
161
.type = ARM_CP_ALIAS,
162
.opc0 = 3, .opc1 = 0, .crn = 7, .crm = 4, .opc2 = 0,
163
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
164
{ .name = "AT_S1E2R", .state = ARM_CP_STATE_AA64,
165
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 0,
166
.access = PL2_W, .accessfn = at_s1e2_access,
167
- .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
168
+ .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC, .writefn = ats_write64 },
169
{ .name = "AT_S1E2W", .state = ARM_CP_STATE_AA64,
170
.opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
171
.access = PL2_W, .accessfn = at_s1e2_access,
172
- .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
173
+ .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC, .writefn = ats_write64 },
174
/* The AArch32 ATS1H* operations are CONSTRAINED UNPREDICTABLE
175
* if EL2 is not implemented; we choose to UNDEF. Behaviour at EL3
176
* with SCR.NS == 0 outside Monitor mode is UNPREDICTABLE; we choose
177
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
178
*/
179
{ .name = "ATS1HR", .cp = 15, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 0,
180
.access = PL2_W,
181
- .writefn = ats1h_write, .type = ARM_CP_NO_RAW },
182
+ .writefn = ats1h_write, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC },
183
{ .name = "ATS1HW", .cp = 15, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
184
.access = PL2_W,
185
- .writefn = ats1h_write, .type = ARM_CP_NO_RAW },
186
+ .writefn = ats1h_write, .type = ARM_CP_NO_RAW | ARM_CP_RAISES_EXC },
187
{ .name = "CNTHCTL_EL2", .state = ARM_CP_STATE_BOTH,
188
.opc0 = 3, .opc1 = 4, .crn = 14, .crm = 1, .opc2 = 0,
189
/* ARMv7 requires bit 0 and 1 to reset to 1. ARMv8 defines the
190
--
42
--
191
2.20.1
43
2.20.1
192
44
193
45
diff view generated by jsdifflib
1
An attempt to do an exception-return (branch to one of the magic
1
In the mtspr helper we attempt to check for "is the timer disabled"
2
addresses) in linux-user mode for M-profile should behave like
2
with "if (env->ttmr & TIMER_NONE)". This is wrong because TIMER_NONE
3
a normal branch, because linux-user mode is always going to be
3
is zero and the condition is always false (Coverity complains about
4
in 'handler' mode. This used to work, but we broke it when we added
4
the dead code.)
5
support for the M-profile security extension in commit d02a8698d7ae2bfed.
6
5
7
In that commit we allowed even handler-mode calls to magic return
6
The correct check would be to test whether the TTMR_M field in the
8
values to be checked for and dealt with by causing an
7
register is equal to TIMER_NONE instead. However, the
9
EXCP_EXCEPTION_EXIT exception to be taken, because this is
8
cpu_openrisc_timer_update() function checks whether the timer is
10
needed for the FNC_RETURN return-from-non-secure-function-call
9
enabled (it looks at cpu->env.is_counting, which is set to 0 via
11
handling. For system mode we added a check in do_v7m_exception_exit()
10
cpu_openrisc_count_stop() when the TTMR_M field is set to
12
to make any spurious calls from Handler mode behave correctly, but
11
TIMER_NONE), so there's no need to check for "timer disabled" in the
13
forgot that linux-user mode would also be affected.
12
target/openrisc code. Instead, simply remove the dead code.
14
13
15
How an attempted return-from-non-secure-function-call in linux-user
14
Fixes: Coverity CID 1005812
16
mode should be handled is not clear -- on real hardware it would
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
result in return to secure code (not to the Linux kernel) which
16
Acked-by: Stafford Horne <shorne@gmail.com>
18
could then handle the error in any way it chose. For QEMU we take
17
Message-id: 20201103114654.18540-1-peter.maydell@linaro.org
19
the simple approach of treating this erroneous return the same way
18
---
20
it would be handled on a CPU without the security extensions --
19
target/openrisc/sys_helper.c | 3 ---
21
treat it as a normal branch.
20
1 file changed, 3 deletions(-)
22
21
23
The upshot of all this is that for linux-user mode we should never
22
diff --git a/target/openrisc/sys_helper.c b/target/openrisc/sys_helper.c
24
do any of the bx_excret magic, so the code change is simple.
25
26
This ought to be a weird corner case that only affects broken guest
27
code (because Linux user processes should never be attempting to do
28
exception returns or NS function returns), except that the code that
29
assigns addresses in RAM for the process and stack in our linux-user
30
code does not attempt to avoid this magic address range, so
31
legitimate code attempting to return to a trampoline routine on the
32
stack can fall into this case. This change fixes those programs,
33
but we should also look at restricting the range of memory we
34
use for M-profile linux-user guests to the area that would be
35
real RAM in hardware.
36
37
Cc: qemu-stable@nongnu.org
38
Reported-by: Christophe Lyon <christophe.lyon@linaro.org>
39
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
40
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
41
Message-id: 20190822131534.16602-1-peter.maydell@linaro.org
42
Fixes: https://bugs.launchpad.net/qemu/+bug/1840922
43
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
44
---
45
target/arm/translate.c | 21 ++++++++++++++++++++-
46
1 file changed, 20 insertions(+), 1 deletion(-)
47
48
diff --git a/target/arm/translate.c b/target/arm/translate.c
49
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
50
--- a/target/arm/translate.c
24
--- a/target/openrisc/sys_helper.c
51
+++ b/target/arm/translate.c
25
+++ b/target/openrisc/sys_helper.c
52
@@ -XXX,XX +XXX,XX @@ static inline void gen_bx(DisasContext *s, TCGv_i32 var)
26
@@ -XXX,XX +XXX,XX @@ void HELPER(mtspr)(CPUOpenRISCState *env, target_ulong spr, target_ulong rb)
53
store_cpu_field(var, thumb);
27
54
}
28
case TO_SPR(10, 1): /* TTCR */
55
29
cpu_openrisc_count_set(cpu, rb);
56
-/* Set PC and Thumb state from var. var is marked as dead.
30
- if (env->ttmr & TIMER_NONE) {
57
+/*
31
- return;
58
+ * Set PC and Thumb state from var. var is marked as dead.
32
- }
59
* For M-profile CPUs, include logic to detect exception-return
33
cpu_openrisc_timer_update(cpu);
60
* branches and handle them. This is needed for Thumb POP/LDM to PC, LDR to PC,
34
break;
61
* and BX reg, and no others, and happens only for code in Handler mode.
35
#endif
62
+ * The Security Extension also requires us to check for the FNC_RETURN
63
+ * which signals a function return from non-secure state; this can happen
64
+ * in both Handler and Thread mode.
65
+ * To avoid having to do multiple comparisons in inline generated code,
66
+ * we make the check we do here loose, so it will match for EXC_RETURN
67
+ * in Thread mode. For system emulation do_v7m_exception_exit() checks
68
+ * for these spurious cases and returns without doing anything (giving
69
+ * the same behaviour as for a branch to a non-magic address).
70
+ *
71
+ * In linux-user mode it is unclear what the right behaviour for an
72
+ * attempted FNC_RETURN should be, because in real hardware this will go
73
+ * directly to Secure code (ie not the Linux kernel) which will then treat
74
+ * the error in any way it chooses. For QEMU we opt to make the FNC_RETURN
75
+ * attempt behave the way it would on a CPU without the security extension,
76
+ * which is to say "like a normal branch". That means we can simply treat
77
+ * all branches as normal with no magic address behaviour.
78
*/
79
static inline void gen_bx_excret(DisasContext *s, TCGv_i32 var)
80
{
81
@@ -XXX,XX +XXX,XX @@ static inline void gen_bx_excret(DisasContext *s, TCGv_i32 var)
82
* s->base.is_jmp that we need to do the rest of the work later.
83
*/
84
gen_bx(s, var);
85
+#ifndef CONFIG_USER_ONLY
86
if (arm_dc_feature(s, ARM_FEATURE_M_SECURITY) ||
87
(s->v7m_handler_mode && arm_dc_feature(s, ARM_FEATURE_M))) {
88
s->base.is_jmp = DISAS_BX_EXCRET;
89
}
90
+#endif
91
}
92
93
static inline void gen_bx_excret_final_code(DisasContext *s)
94
--
36
--
95
2.20.1
37
2.20.1
96
38
97
39
diff view generated by jsdifflib
1
From: Eric Auger <eric.auger@redhat.com>
1
From: Alistair Francis <alistair.francis@wdc.com>
2
2
3
An IOVA/ASID invalidation is notified to all IOMMU Memory Regions
3
This patch fixes CID 1432800 by removing an unnecessary check.
4
through smmuv3_inv_notifiers_iova/smmuv3_notify_iova.
5
4
6
When the notification occurs it is possible that some of the
5
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
PCIe devices associated to the notified regions do not have a
8
valid stream table entry. In that case we output a LOG_GUEST_ERROR
9
message, for example:
10
11
invalid sid=<SID> (L1STD span=0)
12
"smmuv3_notify_iova error decoding the configuration for iommu mr=<MR>
13
14
This is unfortunate as the user gets the impression that there
15
are some translation decoding errors whereas there are not.
16
17
This patch adds a new field in SMMUEventInfo that tells whether
18
the detection of an invalid STE must lead to an error report.
19
invalid_ste_allowed is set before doing the invalidations and
20
kept unset on actual translation.
21
22
The other configuration decoding error messages are kept since if the
23
STE is valid then the rest of the config must be correct.
24
25
Signed-off-by: Eric Auger <eric.auger@redhat.com>
26
Message-id: 20190822172350.12008-6-eric.auger@redhat.com
27
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
28
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
29
---
8
---
30
hw/arm/smmuv3-internal.h | 1 +
9
hw/core/register.c | 4 ----
31
hw/arm/smmuv3.c | 19 +++++++++++--------
10
1 file changed, 4 deletions(-)
32
2 files changed, 12 insertions(+), 8 deletions(-)
33
11
34
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
12
diff --git a/hw/core/register.c b/hw/core/register.c
35
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/arm/smmuv3-internal.h
14
--- a/hw/core/register.c
37
+++ b/hw/arm/smmuv3-internal.h
15
+++ b/hw/core/register.c
38
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUEventInfo {
16
@@ -XXX,XX +XXX,XX @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
39
uint32_t sid;
17
int index = rae[i].addr / data_size;
40
bool recorded;
18
RegisterInfo *r = &ri[index];
41
bool record_trans_faults;
19
42
+ bool inval_ste_allowed;
20
- if (data + data_size * index == 0 || !&rae[i]) {
43
union {
21
- continue;
44
struct {
22
- }
45
uint32_t ssid;
23
-
46
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
24
/* Init the register, this will zero it. */
47
index XXXXXXX..XXXXXXX 100644
25
object_initialize((void *)r, sizeof(*r), TYPE_REGISTER);
48
--- a/hw/arm/smmuv3.c
49
+++ b/hw/arm/smmuv3.c
50
@@ -XXX,XX +XXX,XX @@ static int decode_ste(SMMUv3State *s, SMMUTransCfg *cfg,
51
uint32_t config;
52
53
if (!STE_VALID(ste)) {
54
- qemu_log_mask(LOG_GUEST_ERROR, "invalid STE\n");
55
+ if (!event->inval_ste_allowed) {
56
+ qemu_log_mask(LOG_GUEST_ERROR, "invalid STE\n");
57
+ }
58
goto bad_ste;
59
}
60
61
@@ -XXX,XX +XXX,XX @@ static int smmu_find_ste(SMMUv3State *s, uint32_t sid, STE *ste,
62
63
if (!span) {
64
/* l2ptr is not valid */
65
- qemu_log_mask(LOG_GUEST_ERROR,
66
- "invalid sid=%d (L1STD span=0)\n", sid);
67
+ if (!event->inval_ste_allowed) {
68
+ qemu_log_mask(LOG_GUEST_ERROR,
69
+ "invalid sid=%d (L1STD span=0)\n", sid);
70
+ }
71
event->type = SMMU_EVT_C_BAD_STREAMID;
72
return -EINVAL;
73
}
74
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
75
SMMUDevice *sdev = container_of(mr, SMMUDevice, iommu);
76
SMMUv3State *s = sdev->smmu;
77
uint32_t sid = smmu_get_sid(sdev);
78
- SMMUEventInfo event = {.type = SMMU_EVT_NONE, .sid = sid};
79
+ SMMUEventInfo event = {.type = SMMU_EVT_NONE,
80
+ .sid = sid,
81
+ .inval_ste_allowed = false};
82
SMMUPTWEventInfo ptw_info = {};
83
SMMUTranslationStatus status;
84
SMMUState *bs = ARM_SMMU(s);
85
@@ -XXX,XX +XXX,XX @@ static void smmuv3_notify_iova(IOMMUMemoryRegion *mr,
86
dma_addr_t iova)
87
{
88
SMMUDevice *sdev = container_of(mr, SMMUDevice, iommu);
89
- SMMUEventInfo event = {};
90
+ SMMUEventInfo event = {.inval_ste_allowed = true};
91
SMMUTransTableInfo *tt;
92
SMMUTransCfg *cfg;
93
IOMMUTLBEntry entry;
94
95
cfg = smmuv3_get_config(sdev, &event);
96
if (!cfg) {
97
- qemu_log_mask(LOG_GUEST_ERROR,
98
- "%s error decoding the configuration for iommu mr=%s\n",
99
- __func__, mr->parent_obj.name);
100
return;
101
}
102
26
103
--
27
--
104
2.20.1
28
2.20.1
105
29
106
30
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
3
Fix Coverity CID 1435957: Memory - illegal accesses (OVERRUN):
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
>>> Overrunning array "suffixes" of 7 8-byte elements at element
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
6
index 7 (byte offset 63) using index "idx" (which evaluates to 7).
7
Message-id: 20190828165307.18321-10-alex.bennee@linaro.org
7
8
Note, the biggest input value freq_to_str() can accept is UINT64_MAX,
9
which is ~18.446 EHz, less than 1000 EHz.
10
11
Reported-by: Eduardo Habkost <ehabkost@redhat.com>
12
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
15
Reviewed-by: Luc Michel <luc@lmichel.fr>
16
Message-id: 20201101215755.2021421-1-f4bug@amsat.org
17
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
20
---
10
include/exec/cpu-defs.h | 2 +-
21
util/cutils.c | 3 ++-
11
1 file changed, 1 insertion(+), 1 deletion(-)
22
1 file changed, 2 insertions(+), 1 deletion(-)
12
23
13
diff --git a/include/exec/cpu-defs.h b/include/exec/cpu-defs.h
24
diff --git a/util/cutils.c b/util/cutils.c
14
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/cpu-defs.h
26
--- a/util/cutils.c
16
+++ b/include/exec/cpu-defs.h
27
+++ b/util/cutils.c
17
@@ -XXX,XX +XXX,XX @@ typedef struct CPUTLB { } CPUTLB;
28
@@ -XXX,XX +XXX,XX @@ char *freq_to_str(uint64_t freq_hz)
18
#endif /* !CONFIG_USER_ONLY && CONFIG_TCG */
29
double freq = freq_hz;
19
30
size_t idx = 0;
20
/*
31
21
- * This structure must be placed in ArchCPU immedately
32
- while (freq >= 1000.0 && idx < ARRAY_SIZE(suffixes)) {
22
+ * This structure must be placed in ArchCPU immediately
33
+ while (freq >= 1000.0) {
23
* before CPUArchState, as a field named "neg".
34
freq /= 1000.0;
24
*/
35
idx++;
25
typedef struct CPUNegativeOffsetState {
36
}
37
+ assert(idx < ARRAY_SIZE(suffixes));
38
39
return g_strdup_printf("%0.3g %sHz", freq, suffixes[idx]);
40
}
26
--
41
--
27
2.20.1
42
2.20.1
28
43
29
44
diff view generated by jsdifflib
1
Currently the only part of an ARMCPRegInfo which is allowed to cause
1
In commit 76346b6264a9b01979 we tried to add a configure check that
2
a CPU exception is the access function, which returns a value indicating
2
the libgio pkg-config data was correct, which builds an executable
3
that some flavour of UNDEF should be generated.
3
linked against it. Unfortunately this doesn't catch the problem
4
(missing static library dependency info), because a "do nothing" test
5
source file doesn't have any symbol references that cause the linker
6
to pull in .o files from libgio.a, and so we don't see the "missing
7
symbols from libmount" error that a full QEMU link triggers.
4
8
5
For the ATS system instructions, we would like to conditionally
9
(The ineffective test went unnoticed because of a typo that
6
generate exceptions as part of the writefn, because some faults
10
effectively disabled libgio unconditionally, but after commit
7
during the page table walk (like external aborts) should cause
11
3569a5dfc11f2 fixed that, a static link of the system emulator on
8
an exception to be raised rather than returning a value.
12
Ubuntu stopped working again.)
9
13
10
There are several ways we could do this:
14
Improve the gio test by having the test source fragment reference a
11
* plumb the GETPC() value from the top level set_cp_reg/get_cp_reg
15
g_dbus function (which is what is indirectly causing us to end up
12
helper functions through into the readfn and writefn hooks
16
wanting functions from libmount).
13
* add extra readfn_with_ra/writefn_with_ra hooks that take the GETPC()
14
value
15
* require the ATS instructions to provide a dummy accessfn,
16
which serves no purpose except to cause the code generation
17
to emit TCG ops to sync the CPU state
18
* add an ARM_CP_ flag to mark the ARMCPRegInfo as possibly
19
throwing an exception in its read/write hooks, and make the
20
codegen sync the CPU state before calling the hooks if the
21
flag is set
22
23
This patch opts for the last of these, as it is fairly simple
24
to implement and doesn't require invasive changes like updating
25
the readfn/writefn hook function prototype signature.
26
17
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
28
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
29
Tested-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
20
Message-id: 20201116104617.18333-1-peter.maydell@linaro.org
30
Message-id: 20190816125802.25877-2-peter.maydell@linaro.org
31
---
21
---
32
target/arm/cpu.h | 6 +++++-
22
configure | 11 +++++++++--
33
target/arm/translate-a64.c | 6 ++++++
23
1 file changed, 9 insertions(+), 2 deletions(-)
34
target/arm/translate.c | 7 +++++++
35
3 files changed, 18 insertions(+), 1 deletion(-)
36
24
37
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
25
diff --git a/configure b/configure
38
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100755
39
--- a/target/arm/cpu.h
27
--- a/configure
40
+++ b/target/arm/cpu.h
28
+++ b/configure
41
@@ -XXX,XX +XXX,XX @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
29
@@ -XXX,XX +XXX,XX @@ if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
42
* IO indicates that this register does I/O and therefore its accesses
30
# Check that the libraries actually work -- Ubuntu 18.04 ships
43
* need to be surrounded by gen_io_start()/gen_io_end(). In particular,
31
# with pkg-config --static --libs data for gio-2.0 that is missing
44
* registers which implement clocks or timers require this.
32
# -lblkid and will give a link error.
45
+ * RAISES_EXC is for when the read or write hook might raise an exception;
33
- write_c_skeleton
46
+ * the generated code will synchronize the CPU state before calling the hook
34
- if compile_prog "" "$gio_libs" ; then
47
+ * so that it is safe for the hook to call raise_exception().
35
+ cat > $TMPC <<EOF
48
*/
36
+#include <gio/gio.h>
49
#define ARM_CP_SPECIAL 0x0001
37
+int main(void)
50
#define ARM_CP_CONST 0x0002
38
+{
51
@@ -XXX,XX +XXX,XX @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
39
+ g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
52
#define ARM_CP_FPU 0x1000
40
+ return 0;
53
#define ARM_CP_SVE 0x2000
41
+}
54
#define ARM_CP_NO_GDB 0x4000
42
+EOF
55
+#define ARM_CP_RAISES_EXC 0x8000
43
+ if compile_prog "$gio_cflags" "$gio_libs" ; then
56
/* Used only as a terminator for ARMCPRegInfo lists */
44
gio=yes
57
#define ARM_CP_SENTINEL 0xffff
45
else
58
/* Mask of only the flag bits in a type field */
46
gio=no
59
-#define ARM_CP_FLAG_MASK 0x70ff
60
+#define ARM_CP_FLAG_MASK 0xf0ff
61
62
/* Valid values for ARMCPRegInfo state field, indicating which of
63
* the AArch32 and AArch64 execution states this register is visible in.
64
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/arm/translate-a64.c
67
+++ b/target/arm/translate-a64.c
68
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
69
tcg_temp_free_ptr(tmpptr);
70
tcg_temp_free_i32(tcg_syn);
71
tcg_temp_free_i32(tcg_isread);
72
+ } else if (ri->type & ARM_CP_RAISES_EXC) {
73
+ /*
74
+ * The readfn or writefn might raise an exception;
75
+ * synchronize the CPU state in case it does.
76
+ */
77
+ gen_a64_set_pc_im(s->pc_curr);
78
}
79
80
/* Handle special cases first */
81
diff --git a/target/arm/translate.c b/target/arm/translate.c
82
index XXXXXXX..XXXXXXX 100644
83
--- a/target/arm/translate.c
84
+++ b/target/arm/translate.c
85
@@ -XXX,XX +XXX,XX @@ static int disas_coproc_insn(DisasContext *s, uint32_t insn)
86
tcg_temp_free_ptr(tmpptr);
87
tcg_temp_free_i32(tcg_syn);
88
tcg_temp_free_i32(tcg_isread);
89
+ } else if (ri->type & ARM_CP_RAISES_EXC) {
90
+ /*
91
+ * The readfn or writefn might raise an exception;
92
+ * synchronize the CPU state in case it does.
93
+ */
94
+ gen_set_condexec(s);
95
+ gen_set_pc_im(s, s->pc_curr);
96
}
97
98
/* Handle special cases first */
99
--
47
--
100
2.20.1
48
2.20.1
101
49
102
50
diff view generated by jsdifflib
1
From: "Emilio G. Cota" <cota@braap.org>
1
The TMP105 datasheet (https://www.ti.com/lit/gpn/tmp105) says that the
2
power-up reset values for the T_low and T_high registers are 80 degrees C
3
and 75 degrees C, which are 0x500 and 0x4B0 hex according to table 5. These
4
values are then shifted right by four bits to give the register reset
5
values, since both registers store the 12 bits of temperature data in bits
6
[15..4] of a 16 bit register.
2
7
3
Afterwise is "wise after the fact", as in "hindsight".
8
We were resetting these registers to zero, which is problematic for Linux
4
Here we meant "afterwards" (as in "subsequently"). Fix it.
9
guests which enable the alert interrupt and then immediately take an
10
unexpected overtemperature alert because the current temperature is above
11
freezing...
5
12
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Emilio G. Cota <cota@braap.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20190828165307.18321-7-alex.bennee@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
15
Message-id: 20201110150023.25533-2-peter.maydell@linaro.org
13
---
16
---
14
tcg/README | 2 +-
17
hw/misc/tmp105.c | 3 +++
15
1 file changed, 1 insertion(+), 1 deletion(-)
18
1 file changed, 3 insertions(+)
16
19
17
diff --git a/tcg/README b/tcg/README
20
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/tcg/README
22
--- a/hw/misc/tmp105.c
20
+++ b/tcg/README
23
+++ b/hw/misc/tmp105.c
21
@@ -XXX,XX +XXX,XX @@ This can be overridden using the following function modifiers:
24
@@ -XXX,XX +XXX,XX @@ static void tmp105_reset(I2CSlave *i2c)
22
canonical locations before calling the helper.
25
s->faults = tmp105_faultq[(s->config >> 3) & 3];
23
- TCG_CALL_NO_WRITE_GLOBALS means that the helper does not modify any globals.
26
s->alarm = 0;
24
They will only be saved to their canonical location before calling helpers,
27
25
- but they won't be reloaded afterwise.
28
+ s->limit[0] = 0x4b00; /* T_LOW, 75 degrees C */
26
+ but they won't be reloaded afterwards.
29
+ s->limit[1] = 0x5000; /* T_HIGH, 80 degrees C */
27
- TCG_CALL_NO_SIDE_EFFECTS means that the call to the function is removed if
30
+
28
the return value is not used.
31
tmp105_interrupt_update(s);
32
}
29
33
30
--
34
--
31
2.20.1
35
2.20.1
32
36
33
37
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The TMP105 datasheet says that in Interrupt Mode (when TM==1) the device
2
signals an alert when the temperature equals or exceeds the T_high value and
3
then remains high until a device register is read or the device responds to
4
the SMBUS Alert Response address, or the device is put into Shutdown Mode.
5
Thereafter the Alert pin will only be re-signalled when temperature falls
6
below T_low; alert can then be cleared in the same set of ways, and the
7
device returns to its initial "alert when temperature goes above T_high"
8
mode. (If this textual description is confusing, see figure 3 in the
9
TI datasheet at https://www.ti.com/lit/gpn/tmp105 .)
2
10
3
Make this a static function private to translate.c.
11
We were misimplementing this as a simple "always alert if temperature is
4
Thus we can use the same idiom between aarch64 and aarch32
12
above T_high or below T_low" condition, which gives a spurious alert on
5
without actually sharing function implementations.
13
startup if using the "T_high = 80 degrees C, T_low = 75 degrees C" reset
14
limit values.
6
15
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
16
Implement the correct (hysteresis) behaviour by tracking whether we
8
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
17
are currently looking for the temperature to rise over T_high or
9
Message-id: 20190826151536.6771-3-richard.henderson@linaro.org
18
for it to fall below T_low. Our implementation of the comparator
19
mode (TM==0) wasn't wrong, but rephrase it to match the way that
20
interrupt mode is now handled for clarity.
21
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Reviewed-by: Cédric Le Goater <clg@kaod.org>
24
Message-id: 20201110150023.25533-3-peter.maydell@linaro.org
11
---
25
---
12
target/arm/translate-vfp.inc.c | 3 +--
26
hw/misc/tmp105.h | 7 +++++
13
target/arm/translate.c | 22 ++++++++++++----------
27
hw/misc/tmp105.c | 70 +++++++++++++++++++++++++++++++++++++++++-------
14
2 files changed, 13 insertions(+), 12 deletions(-)
28
2 files changed, 68 insertions(+), 9 deletions(-)
15
29
16
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
30
diff --git a/hw/misc/tmp105.h b/hw/misc/tmp105.h
17
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-vfp.inc.c
32
--- a/hw/misc/tmp105.h
19
+++ b/target/arm/translate-vfp.inc.c
33
+++ b/hw/misc/tmp105.h
20
@@ -XXX,XX +XXX,XX @@ static bool full_vfp_access_check(DisasContext *s, bool ignore_vfp_enabled)
34
@@ -XXX,XX +XXX,XX @@ struct TMP105State {
21
35
int16_t limit[2];
22
if (!s->vfp_enabled && !ignore_vfp_enabled) {
36
int faults;
23
assert(!arm_dc_feature(s, ARM_FEATURE_M));
37
uint8_t alarm;
24
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
38
+ /*
25
- default_exception_el(s));
39
+ * The TMP105 initially looks for a temperature rising above T_high;
26
+ unallocated_encoding(s);
40
+ * once this is detected, the condition it looks for next is the
27
return false;
41
+ * temperature falling below T_low. This flag is false when initially
42
+ * looking for T_high, true when looking for T_low.
43
+ */
44
+ bool detect_falling;
45
};
46
47
#endif
48
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/misc/tmp105.c
51
+++ b/hw/misc/tmp105.c
52
@@ -XXX,XX +XXX,XX @@ static void tmp105_alarm_update(TMP105State *s)
53
return;
28
}
54
}
29
55
30
diff --git a/target/arm/translate.c b/target/arm/translate.c
56
- if ((s->config >> 1) & 1) {                    /* TM */
31
index XXXXXXX..XXXXXXX 100644
57
- if (s->temperature >= s->limit[1])
32
--- a/target/arm/translate.c
58
- s->alarm = 1;
33
+++ b/target/arm/translate.c
59
- else if (s->temperature < s->limit[0])
34
@@ -XXX,XX +XXX,XX @@ static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
60
- s->alarm = 1;
35
s->base.is_jmp = DISAS_NORETURN;
61
+ if (s->config >> 1 & 1) {
62
+ /*
63
+ * TM == 1 : Interrupt mode. We signal Alert when the
64
+ * temperature rises above T_high, and expect the guest to clear
65
+ * it (eg by reading a device register).
66
+ */
67
+ if (s->detect_falling) {
68
+ if (s->temperature < s->limit[0]) {
69
+ s->alarm = 1;
70
+ s->detect_falling = false;
71
+ }
72
+ } else {
73
+ if (s->temperature >= s->limit[1]) {
74
+ s->alarm = 1;
75
+ s->detect_falling = true;
76
+ }
77
+ }
78
} else {
79
- if (s->temperature >= s->limit[1])
80
- s->alarm = 1;
81
- else if (s->temperature < s->limit[0])
82
- s->alarm = 0;
83
+ /*
84
+ * TM == 0 : Comparator mode. We signal Alert when the temperature
85
+ * rises above T_high, and stop signalling it when the temperature
86
+ * falls below T_low.
87
+ */
88
+ if (s->detect_falling) {
89
+ if (s->temperature < s->limit[0]) {
90
+ s->alarm = 0;
91
+ s->detect_falling = false;
92
+ }
93
+ } else {
94
+ if (s->temperature >= s->limit[1]) {
95
+ s->alarm = 1;
96
+ s->detect_falling = true;
97
+ }
98
+ }
99
}
100
101
tmp105_interrupt_update(s);
102
@@ -XXX,XX +XXX,XX @@ static int tmp105_post_load(void *opaque, int version_id)
103
return 0;
36
}
104
}
37
105
38
+static void unallocated_encoding(DisasContext *s)
106
+static bool detect_falling_needed(void *opaque)
39
+{
107
+{
40
+ /* Unallocated and reserved encodings are uncategorized */
108
+ TMP105State *s = opaque;
41
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
109
+
42
+ default_exception_el(s));
110
+ /*
111
+ * We only need to migrate the detect_falling bool if it's set;
112
+ * for migration from older machines we assume that it is false
113
+ * (ie temperature is not out of range).
114
+ */
115
+ return s->detect_falling;
43
+}
116
+}
44
+
117
+
45
/* Force a TB lookup after an instruction that changes the CPU state. */
118
+static const VMStateDescription vmstate_tmp105_detect_falling = {
46
static inline void gen_lookup_tb(DisasContext *s)
119
+ .name = "TMP105/detect-falling",
47
{
120
+ .version_id = 1,
48
@@ -XXX,XX +XXX,XX @@ static inline void gen_hlt(DisasContext *s, int imm)
121
+ .minimum_version_id = 1,
49
return;
122
+ .needed = detect_falling_needed,
123
+ .fields = (VMStateField[]) {
124
+ VMSTATE_BOOL(detect_falling, TMP105State),
125
+ VMSTATE_END_OF_LIST()
126
+ }
127
+};
128
+
129
static const VMStateDescription vmstate_tmp105 = {
130
.name = "TMP105",
131
.version_id = 0,
132
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_tmp105 = {
133
VMSTATE_UINT8(alarm, TMP105State),
134
VMSTATE_I2C_SLAVE(i2c, TMP105State),
135
VMSTATE_END_OF_LIST()
136
+ },
137
+ .subsections = (const VMStateDescription*[]) {
138
+ &vmstate_tmp105_detect_falling,
139
+ NULL
50
}
140
}
51
141
};
52
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
142
53
- default_exception_el(s));
143
@@ -XXX,XX +XXX,XX @@ static void tmp105_reset(I2CSlave *i2c)
54
+ unallocated_encoding(s);
144
s->config = 0;
55
}
145
s->faults = tmp105_faultq[(s->config >> 3) & 3];
56
146
s->alarm = 0;
57
static inline void gen_add_data_offset(DisasContext *s, unsigned int insn,
147
+ s->detect_falling = false;
58
@@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s,
148
59
}
149
s->limit[0] = 0x4b00; /* T_LOW, 75 degrees C */
60
150
s->limit[1] = 0x5000; /* T_HIGH, 80 degrees C */
61
if (undef) {
62
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
63
- default_exception_el(s));
64
+ unallocated_encoding(s);
65
return;
66
}
67
68
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
69
break;
70
default:
71
illegal_op:
72
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
73
- default_exception_el(s));
74
+ unallocated_encoding(s);
75
break;
76
}
77
}
78
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
79
}
80
return;
81
illegal_op:
82
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
83
- default_exception_el(s));
84
+ unallocated_encoding(s);
85
}
86
87
static void disas_thumb_insn(DisasContext *s, uint32_t insn)
88
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn)
89
return;
90
illegal_op:
91
undef:
92
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF, syn_uncategorized(),
93
- default_exception_el(s));
94
+ unallocated_encoding(s);
95
}
96
97
static bool insn_crosses_page(CPUARMState *env, DisasContext *s)
98
--
151
--
99
2.20.1
152
2.20.1
100
153
101
154
diff view generated by jsdifflib
Deleted patch
1
From: Andrew Jeffery <andrew@aj.id.au>
2
1
3
First up: This is not the way the hardware behaves.
4
5
However, it helps resolve real-world problems with short periods being
6
used under Linux. Commit 4451d3f59f2a ("clocksource/drivers/fttmr010:
7
Fix set_next_event handler") in Linux fixed the timer driver to
8
correctly schedule the next event for the Aspeed controller, and in
9
combination with 5daa8212c08e ("ARM: dts: aspeed: Describe random number
10
device") Linux will now set a timer with a period as low as 1us.
11
12
Configuring a qemu timer with such a short period results in spending
13
time handling the interrupt in the model rather than executing guest
14
code, leading to noticeable "sticky" behaviour in the guest.
15
16
The behaviour of Linux is correct with respect to the hardware, so we
17
need to improve our handling under emulation. The approach chosen is to
18
provide back-pressure information by calculating an acceptable minimum
19
number of ticks to be set on the model. Under Linux an additional read
20
is added in the timer configuration path to detect back-pressure, which
21
will never occur on hardware. However if back-pressure is observed, the
22
driver alerts the clock event subsystem, which then performs its own
23
next event dilation via a config option - d1748302f70b ("clockevents:
24
Make minimum delay adjustments configurable")
25
26
A minimum period of 5us was experimentally determined on a Lenovo
27
T480s, which I've increased to 20us for "safety".
28
29
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
30
Reviewed-by: Joel Stanley <joel@jms.id.au>
31
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
32
Tested-by: Joel Stanley <joel@jms.id.au>
33
Signed-off-by: Cédric Le Goater <clg@kaod.org>
34
Message-id: 20190704055150.4899-1-clg@kaod.org
35
[clg: - changed the computation of min_ticks to be done each time the
36
timer value is reloaded. It removes the ordering issue of the
37
timer and scu reset handlers but is slightly slower ]
38
- introduced TIMER_MIN_NS
39
- introduced calculate_min_ticks() ]
40
Signed-off-by: Cédric Le Goater <clg@kaod.org>
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
---
43
hw/timer/aspeed_timer.c | 17 ++++++++++++++++-
44
1 file changed, 16 insertions(+), 1 deletion(-)
45
46
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/timer/aspeed_timer.c
49
+++ b/hw/timer/aspeed_timer.c
50
@@ -XXX,XX +XXX,XX @@ enum timer_ctrl_op {
51
op_pulse_enable
52
};
53
54
+/*
55
+ * Minimum value of the reload register to filter out short period
56
+ * timers which have a noticeable impact in emulation. 5us should be
57
+ * enough, use 20us for "safety".
58
+ */
59
+#define TIMER_MIN_NS (20 * SCALE_US)
60
+
61
/**
62
* Avoid mutual references between AspeedTimerCtrlState and AspeedTimer
63
* structs, as it's a waste of memory. The ptimer BH callback needs to know
64
@@ -XXX,XX +XXX,XX @@ static inline uint32_t calculate_ticks(struct AspeedTimer *t, uint64_t now_ns)
65
return t->reload - MIN(t->reload, ticks);
66
}
67
68
+static uint32_t calculate_min_ticks(AspeedTimer *t, uint32_t value)
69
+{
70
+ uint32_t rate = calculate_rate(t);
71
+ uint32_t min_ticks = muldiv64(TIMER_MIN_NS, rate, NANOSECONDS_PER_SECOND);
72
+
73
+ return value < min_ticks ? min_ticks : value;
74
+}
75
+
76
static inline uint64_t calculate_time(struct AspeedTimer *t, uint32_t ticks)
77
{
78
uint64_t delta_ns;
79
@@ -XXX,XX +XXX,XX @@ static void aspeed_timer_set_value(AspeedTimerCtrlState *s, int timer, int reg,
80
switch (reg) {
81
case TIMER_REG_RELOAD:
82
old_reload = t->reload;
83
- t->reload = value;
84
+ t->reload = calculate_min_ticks(t, value);
85
86
/* If the reload value was not previously set, or zero, and
87
* the current value is valid, try to start the timer if it is
88
--
89
2.20.1
90
91
diff view generated by jsdifflib
Deleted patch
1
From: Eric Auger <eric.auger@redhat.com>
2
1
3
memory_region_iommu_replay_all is not used. Remove it.
4
5
Signed-off-by: Eric Auger <eric.auger@redhat.com>
6
Reported-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Peter Xu <peterx@redhat.com>
9
Message-id: 20190822172350.12008-2-eric.auger@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
include/exec/memory.h | 10 ----------
13
memory.c | 9 ---------
14
2 files changed, 19 deletions(-)
15
16
diff --git a/include/exec/memory.h b/include/exec/memory.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/exec/memory.h
19
+++ b/include/exec/memory.h
20
@@ -XXX,XX +XXX,XX @@ void memory_region_register_iommu_notifier(MemoryRegion *mr,
21
*/
22
void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n);
23
24
-/**
25
- * memory_region_iommu_replay_all: replay existing IOMMU translations
26
- * to all the notifiers registered.
27
- *
28
- * Note: this is not related to record-and-replay functionality.
29
- *
30
- * @iommu_mr: the memory region to observe
31
- */
32
-void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr);
33
-
34
/**
35
* memory_region_unregister_iommu_notifier: unregister a notifier for
36
* changes to IOMMU translation entries.
37
diff --git a/memory.c b/memory.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/memory.c
40
+++ b/memory.c
41
@@ -XXX,XX +XXX,XX @@ void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n)
42
}
43
}
44
45
-void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr)
46
-{
47
- IOMMUNotifier *notifier;
48
-
49
- IOMMU_NOTIFIER_FOREACH(notifier, iommu_mr) {
50
- memory_region_iommu_replay(iommu_mr, notifier);
51
- }
52
-}
53
-
54
void memory_region_unregister_iommu_notifier(MemoryRegion *mr,
55
IOMMUNotifier *n)
56
{
57
--
58
2.20.1
59
60
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
The previous simplification got the order of operands to the
4
subtraction wrong. Since the 64-bit product is the subtrahend,
5
we must use a 64-bit subtract to properly compute the borrow
6
from the low-part of the product.
7
8
Fixes: 5f8cd06ebcf5 ("target/arm: Simplify SMMLA, SMMLAR, SMMLS, SMMLSR")
9
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
12
Message-id: 20190829013258.16102-1-richard.henderson@linaro.org
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
target/arm/translate.c | 20 ++++++++++++++++++--
17
1 file changed, 18 insertions(+), 2 deletions(-)
18
19
diff --git a/target/arm/translate.c b/target/arm/translate.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/translate.c
22
+++ b/target/arm/translate.c
23
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
24
if (rd != 15) {
25
tmp3 = load_reg(s, rd);
26
if (insn & (1 << 6)) {
27
- tcg_gen_sub_i32(tmp, tmp, tmp3);
28
+ /*
29
+ * For SMMLS, we need a 64-bit subtract.
30
+ * Borrow caused by a non-zero multiplicand
31
+ * lowpart, and the correct result lowpart
32
+ * for rounding.
33
+ */
34
+ TCGv_i32 zero = tcg_const_i32(0);
35
+ tcg_gen_sub2_i32(tmp2, tmp, zero, tmp3,
36
+ tmp2, tmp);
37
+ tcg_temp_free_i32(zero);
38
} else {
39
tcg_gen_add_i32(tmp, tmp, tmp3);
40
}
41
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
42
if (insn & (1 << 20)) {
43
tcg_gen_add_i32(tmp, tmp, tmp3);
44
} else {
45
- tcg_gen_sub_i32(tmp, tmp, tmp3);
46
+ /*
47
+ * For SMMLS, we need a 64-bit subtract.
48
+ * Borrow caused by a non-zero multiplicand lowpart,
49
+ * and the correct result lowpart for rounding.
50
+ */
51
+ TCGv_i32 zero = tcg_const_i32(0);
52
+ tcg_gen_sub2_i32(tmp2, tmp, zero, tmp3, tmp2, tmp);
53
+ tcg_temp_free_i32(zero);
54
}
55
tcg_temp_free_i32(tmp3);
56
}
57
--
58
2.20.1
59
60
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
Commit ba1ba5cca introduce the ARM_CPU_TYPE_NAME() macro.
4
Unify the code base by use it in all places.
5
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20190823143249.8096-2-philmd@redhat.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/allwinner-a10.c | 3 ++-
13
hw/arm/cubieboard.c | 3 ++-
14
hw/arm/digic.c | 3 ++-
15
hw/arm/fsl-imx25.c | 2 +-
16
hw/arm/fsl-imx31.c | 2 +-
17
hw/arm/fsl-imx6.c | 3 ++-
18
hw/arm/fsl-imx6ul.c | 2 +-
19
hw/arm/xlnx-zynqmp.c | 8 ++++----
20
8 files changed, 15 insertions(+), 11 deletions(-)
21
22
diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/hw/arm/allwinner-a10.c
25
+++ b/hw/arm/allwinner-a10.c
26
@@ -XXX,XX +XXX,XX @@ static void aw_a10_init(Object *obj)
27
AwA10State *s = AW_A10(obj);
28
29
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
30
- "cortex-a8-" TYPE_ARM_CPU, &error_abort, NULL);
31
+ ARM_CPU_TYPE_NAME("cortex-a8"),
32
+ &error_abort, NULL);
33
34
sysbus_init_child_obj(obj, "intc", &s->intc, sizeof(s->intc),
35
TYPE_AW_A10_PIC);
36
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/arm/cubieboard.c
39
+++ b/hw/arm/cubieboard.c
40
@@ -XXX,XX +XXX,XX @@ static void cubieboard_init(MachineState *machine)
41
42
static void cubieboard_machine_init(MachineClass *mc)
43
{
44
- mc->desc = "cubietech cubieboard";
45
+ mc->desc = "cubietech cubieboard (Cortex-A9)";
46
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9");
47
mc->init = cubieboard_init;
48
mc->block_default_type = IF_IDE;
49
mc->units_per_default_bus = 1;
50
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/digic.c
53
+++ b/hw/arm/digic.c
54
@@ -XXX,XX +XXX,XX @@ static void digic_init(Object *obj)
55
int i;
56
57
object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
58
- "arm946-" TYPE_ARM_CPU, &error_abort, NULL);
59
+ ARM_CPU_TYPE_NAME("arm946"),
60
+ &error_abort, NULL);
61
62
for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
63
#define DIGIC_TIMER_NAME_MLEN 11
64
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/hw/arm/fsl-imx25.c
67
+++ b/hw/arm/fsl-imx25.c
68
@@ -XXX,XX +XXX,XX @@ static void fsl_imx25_init(Object *obj)
69
FslIMX25State *s = FSL_IMX25(obj);
70
int i;
71
72
- object_initialize(&s->cpu, sizeof(s->cpu), "arm926-" TYPE_ARM_CPU);
73
+ object_initialize(&s->cpu, sizeof(s->cpu), ARM_CPU_TYPE_NAME("arm926"));
74
75
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
76
TYPE_IMX_AVIC);
77
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/arm/fsl-imx31.c
80
+++ b/hw/arm/fsl-imx31.c
81
@@ -XXX,XX +XXX,XX @@ static void fsl_imx31_init(Object *obj)
82
FslIMX31State *s = FSL_IMX31(obj);
83
int i;
84
85
- object_initialize(&s->cpu, sizeof(s->cpu), "arm1136-" TYPE_ARM_CPU);
86
+ object_initialize(&s->cpu, sizeof(s->cpu), ARM_CPU_TYPE_NAME("arm1136"));
87
88
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
89
TYPE_IMX_AVIC);
90
diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/hw/arm/fsl-imx6.c
93
+++ b/hw/arm/fsl-imx6.c
94
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6_init(Object *obj)
95
for (i = 0; i < MIN(ms->smp.cpus, FSL_IMX6_NUM_CPUS); i++) {
96
snprintf(name, NAME_SIZE, "cpu%d", i);
97
object_initialize_child(obj, name, &s->cpu[i], sizeof(s->cpu[i]),
98
- "cortex-a9-" TYPE_ARM_CPU, &error_abort, NULL);
99
+ ARM_CPU_TYPE_NAME("cortex-a9"),
100
+ &error_abort, NULL);
101
}
102
103
sysbus_init_child_obj(obj, "a9mpcore", &s->a9mpcore, sizeof(s->a9mpcore),
104
diff --git a/hw/arm/fsl-imx6ul.c b/hw/arm/fsl-imx6ul.c
105
index XXXXXXX..XXXXXXX 100644
106
--- a/hw/arm/fsl-imx6ul.c
107
+++ b/hw/arm/fsl-imx6ul.c
108
@@ -XXX,XX +XXX,XX @@ static void fsl_imx6ul_init(Object *obj)
109
int i;
110
111
object_initialize_child(obj, "cpu0", &s->cpu, sizeof(s->cpu),
112
- "cortex-a7-" TYPE_ARM_CPU, &error_abort, NULL);
113
+ ARM_CPU_TYPE_NAME("cortex-a7"), &error_abort, NULL);
114
115
/*
116
* A7MPCORE
117
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
118
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/arm/xlnx-zynqmp.c
120
+++ b/hw/arm/xlnx-zynqmp.c
121
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
122
123
object_initialize_child(OBJECT(&s->rpu_cluster), "rpu-cpu[*]",
124
&s->rpu_cpu[i], sizeof(s->rpu_cpu[i]),
125
- "cortex-r5f-" TYPE_ARM_CPU, &error_abort,
126
- NULL);
127
+ ARM_CPU_TYPE_NAME("cortex-r5f"),
128
+ &error_abort, NULL);
129
130
name = object_get_canonical_path_component(OBJECT(&s->rpu_cpu[i]));
131
if (strcmp(name, boot_cpu)) {
132
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(Object *obj)
133
for (i = 0; i < num_apus; i++) {
134
object_initialize_child(OBJECT(&s->apu_cluster), "apu-cpu[*]",
135
&s->apu_cpu[i], sizeof(s->apu_cpu[i]),
136
- "cortex-a53-" TYPE_ARM_CPU, &error_abort,
137
- NULL);
138
+ ARM_CPU_TYPE_NAME("cortex-a53"),
139
+ &error_abort, NULL);
140
}
141
142
sysbus_init_child_obj(obj, "gic", &s->gic, sizeof(s->gic),
143
--
144
2.20.1
145
146
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
As explained in commit aff39be0ed97:
4
5
Both functions, object_initialize() and object_property_add_child()
6
increase the reference counter of the new object, so one of the
7
references has to be dropped afterwards to get the reference
8
counting right. Otherwise the child object will not be properly
9
cleaned up when the parent gets destroyed.
10
Thus let's use now object_initialize_child() instead to get the
11
reference counting here right.
12
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Reviewed-by: Thomas Huth <thuth@redhat.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20190823143249.8096-3-philmd@redhat.com
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
20
hw/arm/mcimx7d-sabre.c | 9 ++++-----
21
hw/arm/mps2-tz.c | 15 +++++++--------
22
hw/arm/musca.c | 9 +++++----
23
3 files changed, 16 insertions(+), 17 deletions(-)
24
25
diff --git a/hw/arm/mcimx7d-sabre.c b/hw/arm/mcimx7d-sabre.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/mcimx7d-sabre.c
28
+++ b/hw/arm/mcimx7d-sabre.c
29
@@ -XXX,XX +XXX,XX @@ static void mcimx7d_sabre_init(MachineState *machine)
30
{
31
static struct arm_boot_info boot_info;
32
MCIMX7Sabre *s = g_new0(MCIMX7Sabre, 1);
33
- Object *soc;
34
int i;
35
36
if (machine->ram_size > FSL_IMX7_MMDC_SIZE) {
37
@@ -XXX,XX +XXX,XX @@ static void mcimx7d_sabre_init(MachineState *machine)
38
.nb_cpus = machine->smp.cpus,
39
};
40
41
- object_initialize(&s->soc, sizeof(s->soc), TYPE_FSL_IMX7);
42
- soc = OBJECT(&s->soc);
43
- object_property_add_child(OBJECT(machine), "soc", soc, &error_fatal);
44
- object_property_set_bool(soc, true, "realized", &error_fatal);
45
+ object_initialize_child(OBJECT(machine), "soc",
46
+ &s->soc, sizeof(s->soc),
47
+ TYPE_FSL_IMX7, &error_fatal, NULL);
48
+ object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
49
50
memory_region_allocate_system_memory(&s->ram, NULL, "mcimx7d-sabre.ram",
51
machine->ram_size);
52
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/hw/arm/mps2-tz.c
55
+++ b/hw/arm/mps2-tz.c
56
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
57
/* The sec_resp_cfg output from the IoTKit must be split into multiple
58
* lines, one for each of the PPCs we create here, plus one per MSC.
59
*/
60
- object_initialize(&mms->sec_resp_splitter, sizeof(mms->sec_resp_splitter),
61
- TYPE_SPLIT_IRQ);
62
- object_property_add_child(OBJECT(machine), "sec-resp-splitter",
63
- OBJECT(&mms->sec_resp_splitter), &error_abort);
64
+ object_initialize_child(OBJECT(machine), "sec-resp-splitter",
65
+ &mms->sec_resp_splitter,
66
+ sizeof(mms->sec_resp_splitter),
67
+ TYPE_SPLIT_IRQ, &error_abort, NULL);
68
object_property_set_int(OBJECT(&mms->sec_resp_splitter),
69
ARRAY_SIZE(mms->ppc) + ARRAY_SIZE(mms->msc),
70
"num-lines", &error_fatal);
71
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
72
* Tx, Rx and "combined" IRQs are sent to the NVIC separately.
73
* Create the OR gate for this.
74
*/
75
- object_initialize(&mms->uart_irq_orgate, sizeof(mms->uart_irq_orgate),
76
- TYPE_OR_IRQ);
77
- object_property_add_child(OBJECT(mms), "uart-irq-orgate",
78
- OBJECT(&mms->uart_irq_orgate), &error_abort);
79
+ object_initialize_child(OBJECT(mms), "uart-irq-orgate",
80
+ &mms->uart_irq_orgate, sizeof(mms->uart_irq_orgate),
81
+ TYPE_OR_IRQ, &error_abort, NULL);
82
object_property_set_int(OBJECT(&mms->uart_irq_orgate), 10, "num-lines",
83
&error_fatal);
84
object_property_set_bool(OBJECT(&mms->uart_irq_orgate), true,
85
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/hw/arm/musca.c
88
+++ b/hw/arm/musca.c
89
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
90
* The sec_resp_cfg output from the SSE-200 must be split into multiple
91
* lines, one for each of the PPCs we create here.
92
*/
93
- object_initialize(&mms->sec_resp_splitter, sizeof(mms->sec_resp_splitter),
94
- TYPE_SPLIT_IRQ);
95
- object_property_add_child(OBJECT(machine), "sec-resp-splitter",
96
- OBJECT(&mms->sec_resp_splitter), &error_fatal);
97
+ object_initialize_child(OBJECT(machine), "sec-resp-splitter",
98
+ &mms->sec_resp_splitter,
99
+ sizeof(mms->sec_resp_splitter),
100
+ TYPE_SPLIT_IRQ, &error_fatal, NULL);
101
+
102
object_property_set_int(OBJECT(&mms->sec_resp_splitter),
103
ARRAY_SIZE(mms->ppc), "num-lines", &error_fatal);
104
object_property_set_bool(OBJECT(&mms->sec_resp_splitter), true,
105
--
106
2.20.1
107
108
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
Both object_initialize() and qdev_set_parent_bus() increase the
4
reference counter of the new object, so one of the references has
5
to be dropped afterwards to get the reference counting right.
6
In machine model code this refcount leak is not particularly
7
problematic because (unlike devices) machines will never be
8
created on demand via QMP, and they are never destroyed.
9
But in any case let's use the new sysbus_init_child_obj() instead
10
to get the reference counting here right.
11
12
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Message-id: 20190823143249.8096-4-philmd@redhat.com
15
[PMM: rewrote commit message]
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/arm/exynos4_boards.c | 4 ++--
19
1 file changed, 2 insertions(+), 2 deletions(-)
20
21
diff --git a/hw/arm/exynos4_boards.c b/hw/arm/exynos4_boards.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/exynos4_boards.c
24
+++ b/hw/arm/exynos4_boards.c
25
@@ -XXX,XX +XXX,XX @@ exynos4_boards_init_common(MachineState *machine,
26
exynos4_boards_init_ram(s, get_system_memory(),
27
exynos4_board_ram_size[board_type]);
28
29
- object_initialize(&s->soc, sizeof(s->soc), TYPE_EXYNOS4210_SOC);
30
- qdev_set_parent_bus(DEVICE(&s->soc), sysbus_get_default());
31
+ sysbus_init_child_obj(OBJECT(machine), "soc",
32
+ &s->soc, sizeof(s->soc), TYPE_EXYNOS4210_SOC);
33
object_property_set_bool(OBJECT(&s->soc), true, "realized",
34
&error_fatal);
35
36
--
37
2.20.1
38
39
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
Child properties form the composition tree. All objects need to be
4
a child of another object. Objects can only be a child of one object.
5
6
Respect this with the i.MX SoC, to get a cleaner composition tree.
7
8
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20190823143249.8096-5-philmd@redhat.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/fsl-imx25.c | 4 +++-
14
hw/arm/fsl-imx31.c | 4 +++-
15
2 files changed, 6 insertions(+), 2 deletions(-)
16
17
diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/fsl-imx25.c
20
+++ b/hw/arm/fsl-imx25.c
21
@@ -XXX,XX +XXX,XX @@ static void fsl_imx25_init(Object *obj)
22
FslIMX25State *s = FSL_IMX25(obj);
23
int i;
24
25
- object_initialize(&s->cpu, sizeof(s->cpu), ARM_CPU_TYPE_NAME("arm926"));
26
+ object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
27
+ ARM_CPU_TYPE_NAME("arm926"),
28
+ &error_abort, NULL);
29
30
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
31
TYPE_IMX_AVIC);
32
diff --git a/hw/arm/fsl-imx31.c b/hw/arm/fsl-imx31.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/arm/fsl-imx31.c
35
+++ b/hw/arm/fsl-imx31.c
36
@@ -XXX,XX +XXX,XX @@ static void fsl_imx31_init(Object *obj)
37
FslIMX31State *s = FSL_IMX31(obj);
38
int i;
39
40
- object_initialize(&s->cpu, sizeof(s->cpu), ARM_CPU_TYPE_NAME("arm1136"));
41
+ object_initialize_child(obj, "cpu", &s->cpu, sizeof(s->cpu),
42
+ ARM_CPU_TYPE_NAME("arm1136"),
43
+ &error_abort, NULL);
44
45
sysbus_init_child_obj(obj, "avic", &s->avic, sizeof(s->avic),
46
TYPE_IMX_AVIC);
47
--
48
2.20.1
49
50
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
As explained in commit aff39be0ed97:
4
5
Both functions, object_initialize() and object_property_add_child()
6
increase the reference counter of the new object, so one of the
7
references has to be dropped afterwards to get the reference
8
counting right. Otherwise the child object will not be properly
9
cleaned up when the parent gets destroyed.
10
Thus let's use now object_initialize_child() instead to get the
11
reference counting here right.
12
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Reviewed-by: Thomas Huth <thuth@redhat.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20190823143249.8096-6-philmd@redhat.com
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
20
hw/dma/xilinx_axidma.c | 16 ++++++++--------
21
1 file changed, 8 insertions(+), 8 deletions(-)
22
23
diff --git a/hw/dma/xilinx_axidma.c b/hw/dma/xilinx_axidma.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/dma/xilinx_axidma.c
26
+++ b/hw/dma/xilinx_axidma.c
27
@@ -XXX,XX +XXX,XX @@ static void xilinx_axidma_init(Object *obj)
28
XilinxAXIDMA *s = XILINX_AXI_DMA(obj);
29
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
30
31
- object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
32
- TYPE_XILINX_AXI_DMA_DATA_STREAM);
33
- object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
34
- TYPE_XILINX_AXI_DMA_CONTROL_STREAM);
35
- object_property_add_child(OBJECT(s), "axistream-connected-target",
36
- (Object *)&s->rx_data_dev, &error_abort);
37
- object_property_add_child(OBJECT(s), "axistream-control-connected-target",
38
- (Object *)&s->rx_control_dev, &error_abort);
39
+ object_initialize_child(OBJECT(s), "axistream-connected-target",
40
+ &s->rx_data_dev, sizeof(s->rx_data_dev),
41
+ TYPE_XILINX_AXI_DMA_DATA_STREAM, &error_abort,
42
+ NULL);
43
+ object_initialize_child(OBJECT(s), "axistream-control-connected-target",
44
+ &s->rx_control_dev, sizeof(s->rx_control_dev),
45
+ TYPE_XILINX_AXI_DMA_CONTROL_STREAM, &error_abort,
46
+ NULL);
47
48
sysbus_init_irq(sbd, &s->streams[0].irq);
49
sysbus_init_irq(sbd, &s->streams[1].irq);
50
--
51
2.20.1
52
53
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
2
1
3
As explained in commit aff39be0ed97:
4
5
Both functions, object_initialize() and object_property_add_child()
6
increase the reference counter of the new object, so one of the
7
references has to be dropped afterwards to get the reference
8
counting right. Otherwise the child object will not be properly
9
cleaned up when the parent gets destroyed.
10
Thus let's use now object_initialize_child() instead to get the
11
reference counting here right.
12
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Reviewed-by: Thomas Huth <thuth@redhat.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 20190823143249.8096-7-philmd@redhat.com
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
20
hw/net/xilinx_axienet.c | 17 ++++++++---------
21
1 file changed, 8 insertions(+), 9 deletions(-)
22
23
diff --git a/hw/net/xilinx_axienet.c b/hw/net/xilinx_axienet.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/net/xilinx_axienet.c
26
+++ b/hw/net/xilinx_axienet.c
27
@@ -XXX,XX +XXX,XX @@ static void xilinx_enet_init(Object *obj)
28
XilinxAXIEnet *s = XILINX_AXI_ENET(obj);
29
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
30
31
- object_initialize(&s->rx_data_dev, sizeof(s->rx_data_dev),
32
- TYPE_XILINX_AXI_ENET_DATA_STREAM);
33
- object_initialize(&s->rx_control_dev, sizeof(s->rx_control_dev),
34
- TYPE_XILINX_AXI_ENET_CONTROL_STREAM);
35
- object_property_add_child(OBJECT(s), "axistream-connected-target",
36
- (Object *)&s->rx_data_dev, &error_abort);
37
- object_property_add_child(OBJECT(s), "axistream-control-connected-target",
38
- (Object *)&s->rx_control_dev, &error_abort);
39
-
40
+ object_initialize_child(OBJECT(s), "axistream-connected-target",
41
+ &s->rx_data_dev, sizeof(s->rx_data_dev),
42
+ TYPE_XILINX_AXI_ENET_DATA_STREAM, &error_abort,
43
+ NULL);
44
+ object_initialize_child(OBJECT(s), "axistream-control-connected-target",
45
+ &s->rx_control_dev, sizeof(s->rx_control_dev),
46
+ TYPE_XILINX_AXI_ENET_CONTROL_STREAM, &error_abort,
47
+ NULL);
48
sysbus_init_irq(sbd, &s->irq);
49
50
memory_region_init_io(&s->iomem, OBJECT(s), &enet_ops, s, "enet", 0x40000);
51
--
52
2.20.1
53
54
diff view generated by jsdifflib
Deleted patch
1
From: Alex Bennée <alex.bennee@linaro.org>
2
1
3
Commit a5e0b3311 removed these in favour of querying machine
4
properties. Remove the extern declarations as well.
5
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20190828165307.18321-6-alex.bennee@linaro.org
10
Cc: Like Xu <like.xu@linux.intel.com>
11
Message-Id: <20190711130546.18578-1-alex.bennee@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
include/sysemu/sysemu.h | 2 --
15
1 file changed, 2 deletions(-)
16
17
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/sysemu/sysemu.h
20
+++ b/include/sysemu/sysemu.h
21
@@ -XXX,XX +XXX,XX @@ extern const char *keyboard_layout;
22
extern int win2k_install_hack;
23
extern int alt_grab;
24
extern int ctrl_grab;
25
-extern int smp_cpus;
26
-extern unsigned int max_cpus;
27
extern int cursor_hide;
28
extern int graphic_rotate;
29
extern int no_quit;
30
--
31
2.20.1
32
33
diff view generated by jsdifflib
Deleted patch
1
From: "Emilio G. Cota" <cota@braap.org>
2
1
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Signed-off-by: Emilio G. Cota <cota@braap.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
8
Message-id: 20190828165307.18321-8-alex.bennee@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
accel/tcg/atomic_template.h | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/accel/tcg/atomic_template.h b/accel/tcg/atomic_template.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/accel/tcg/atomic_template.h
17
+++ b/accel/tcg/atomic_template.h
18
@@ -XXX,XX +XXX,XX @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr,
19
20
#define GEN_ATOMIC_HELPER(X) \
21
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
22
- ABI_TYPE val EXTRA_ARGS) \
23
+ ABI_TYPE val EXTRA_ARGS) \
24
{ \
25
ATOMIC_MMU_DECLS; \
26
DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; \
27
--
28
2.20.1
29
30
diff view generated by jsdifflib
Deleted patch
1
The function neon_store_reg32() doesn't free the TCG temp that it
2
is passed, so the caller must do that. We got this right in most
3
places but forgot to free the TCG temps in trans_VMOV_64_sp().
4
1
5
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20190827121931.26836-1-peter.maydell@linaro.org
10
---
11
target/arm/translate-vfp.inc.c | 2 ++
12
1 file changed, 2 insertions(+)
13
14
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-vfp.inc.c
17
+++ b/target/arm/translate-vfp.inc.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_64_sp(DisasContext *s, arg_VMOV_64_sp *a)
19
/* gpreg to fpreg */
20
tmp = load_reg(s, a->rt);
21
neon_store_reg32(tmp, a->vm);
22
+ tcg_temp_free_i32(tmp);
23
tmp = load_reg(s, a->rt2);
24
neon_store_reg32(tmp, a->vm + 1);
25
+ tcg_temp_free_i32(tmp);
26
}
27
28
return true;
29
--
30
2.20.1
31
32
diff view generated by jsdifflib