1
Arm queue; bugfixes only.
1
arm pullreq for rc1. All minor bugfixes, except for the sve-default-vector-length
2
patches, which are somewhere between a bugfix and a new feature.
2
3
3
thanks
4
thanks
4
-- PMM
5
-- PMM
5
6
6
The following changes since commit 48aa8f0ac536db3550a35c295ff7de94e4c33739:
7
The following changes since commit c08ccd1b53f488ac86c1f65cf7623dc91acc249a:
7
8
8
Merge remote-tracking branch 'remotes/ericb/tags/pull-nbd-2020-11-16' into staging (2020-11-17 11:07:00 +0000)
9
Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-tcg-20210726' into staging (2021-07-27 08:35:01 +0100)
9
10
10
are available in the Git repository at:
11
are available in the Git repository at:
11
12
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20201117
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210727
13
14
14
for you to fetch changes up to ab135622cf478585bdfcb68b85e4a817d74a0c42:
15
for you to fetch changes up to e229a179a503f2aee43a76888cf12fbdfe8a3749:
15
16
16
tmp105: Correct handling of temperature limit checks (2020-11-17 12:56:33 +0000)
17
hw: aspeed_gpio: Fix memory size (2021-07-27 11:00:00 +0100)
17
18
18
----------------------------------------------------------------
19
----------------------------------------------------------------
19
target-arm queue:
20
target-arm queue:
20
* hw/arm/virt: ARM_VIRT must select ARM_GIC
21
* hw/arm/smmuv3: Check 31st bit to see if CD is valid
21
* exynos: Fix bad printf format specifiers
22
* qemu-options.hx: Fix formatting of -machine memory-backend option
22
* hw/input/ps2.c: Remove remnants of printf debug
23
* hw: aspeed_gpio: Fix memory size
23
* target/openrisc: Remove dead code attempting to check "is timer disabled"
24
* hw/arm/nseries: Display hexadecimal value with '0x' prefix
24
* register: Remove unnecessary NULL check
25
* Add sve-default-vector-length cpu property
25
* util/cutils: Fix Coverity array overrun in freq_to_str()
26
* docs: Update path that mentions deprecated.rst
26
* configure: Make "does libgio work" test pull in some actual functions
27
* hw/intc/armv7m_nvic: for v8.1M VECTPENDING hides S exceptions from NS
27
* tmp105: reset the T_low and T_High registers
28
* hw/intc/armv7m_nvic: Correct size of ICSR.VECTPENDING
28
* tmp105: Correct handling of temperature limit checks
29
* hw/intc/armv7m_nvic: ISCR.ISRPENDING is set for non-enabled pending interrupts
30
* target/arm: Report M-profile alignment faults correctly to the guest
31
* target/arm: Add missing 'return's after calling v7m_exception_taken()
32
* target/arm: Enforce that M-profile SP low 2 bits are always zero
29
33
30
----------------------------------------------------------------
34
----------------------------------------------------------------
31
Alex Chen (1):
35
Joe Komlodi (1):
32
exynos: Fix bad printf format specifiers
36
hw/arm/smmuv3: Check 31st bit to see if CD is valid
33
37
34
Alistair Francis (1):
38
Joel Stanley (1):
35
register: Remove unnecessary NULL check
39
hw: aspeed_gpio: Fix memory size
36
40
37
Andrew Jones (1):
41
Mao Zhongyi (1):
38
hw/arm/virt: ARM_VIRT must select ARM_GIC
42
docs: Update path that mentions deprecated.rst
39
43
40
Peter Maydell (5):
44
Peter Maydell (7):
41
hw/input/ps2.c: Remove remnants of printf debug
45
qemu-options.hx: Fix formatting of -machine memory-backend option
42
target/openrisc: Remove dead code attempting to check "is timer disabled"
46
target/arm: Enforce that M-profile SP low 2 bits are always zero
43
configure: Make "does libgio work" test pull in some actual functions
47
target/arm: Add missing 'return's after calling v7m_exception_taken()
44
hw/misc/tmp105: reset the T_low and T_High registers
48
target/arm: Report M-profile alignment faults correctly to the guest
45
tmp105: Correct handling of temperature limit checks
49
hw/intc/armv7m_nvic: ISCR.ISRPENDING is set for non-enabled pending interrupts
50
hw/intc/armv7m_nvic: Correct size of ICSR.VECTPENDING
51
hw/intc/armv7m_nvic: for v8.1M VECTPENDING hides S exceptions from NS
46
52
47
Philippe Mathieu-Daudé (1):
53
Philippe Mathieu-Daudé (1):
48
util/cutils: Fix Coverity array overrun in freq_to_str()
54
hw/arm/nseries: Display hexadecimal value with '0x' prefix
49
55
50
configure | 11 +++++--
56
Richard Henderson (3):
51
hw/misc/tmp105.h | 7 +++++
57
target/arm: Correctly bound length in sve_zcr_get_valid_len
52
hw/core/register.c | 4 ---
58
target/arm: Export aarch64_sve_zcr_get_valid_len
53
hw/input/ps2.c | 9 ------
59
target/arm: Add sve-default-vector-length cpu property
54
hw/misc/tmp105.c | 73 ++++++++++++++++++++++++++++++++++++++------
55
hw/timer/exynos4210_mct.c | 4 +--
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(-)
61
60
61
docs/system/arm/cpu-features.rst | 15 ++++++++++
62
configure | 2 +-
63
hw/arm/smmuv3-internal.h | 2 +-
64
target/arm/cpu.h | 5 ++++
65
target/arm/internals.h | 10 +++++++
66
hw/arm/nseries.c | 2 +-
67
hw/gpio/aspeed_gpio.c | 3 +-
68
hw/intc/armv7m_nvic.c | 40 +++++++++++++++++++--------
69
target/arm/cpu.c | 14 ++++++++--
70
target/arm/cpu64.c | 60 ++++++++++++++++++++++++++++++++++++++++
71
target/arm/gdbstub.c | 4 +++
72
target/arm/helper.c | 8 ++++--
73
target/arm/m_helper.c | 24 ++++++++++++----
74
target/arm/translate.c | 3 ++
75
target/i386/cpu.c | 2 +-
76
MAINTAINERS | 2 +-
77
qemu-options.hx | 30 +++++++++++---------
78
17 files changed, 183 insertions(+), 43 deletions(-)
79
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@wdc.com>
1
From: Joe Komlodi <joe.komlodi@xilinx.com>
2
2
3
This patch fixes CID 1432800 by removing an unnecessary check.
3
The bit to see if a CD is valid is the last bit of the first word of the CD.
4
4
5
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
5
Signed-off-by: Joe Komlodi <joe.komlodi@xilinx.com>
6
Message-id: 1626728232-134665-2-git-send-email-joe.komlodi@xilinx.com
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
---
9
hw/core/register.c | 4 ----
10
hw/arm/smmuv3-internal.h | 2 +-
10
1 file changed, 4 deletions(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
11
12
12
diff --git a/hw/core/register.c b/hw/core/register.c
13
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/core/register.c
15
--- a/hw/arm/smmuv3-internal.h
15
+++ b/hw/core/register.c
16
+++ b/hw/arm/smmuv3-internal.h
16
@@ -XXX,XX +XXX,XX @@ static RegisterInfoArray *register_init_block(DeviceState *owner,
17
@@ -XXX,XX +XXX,XX @@ static inline int pa_range(STE *ste)
17
int index = rae[i].addr / data_size;
18
18
RegisterInfo *r = &ri[index];
19
/* CD fields */
19
20
20
- if (data + data_size * index == 0 || !&rae[i]) {
21
-#define CD_VALID(x) extract32((x)->word[0], 30, 1)
21
- continue;
22
+#define CD_VALID(x) extract32((x)->word[0], 31, 1)
22
- }
23
#define CD_ASID(x) extract32((x)->word[1], 16, 16)
23
-
24
#define CD_TTB(x, sel) \
24
/* Init the register, this will zero it. */
25
({ \
25
object_initialize((void *)r, sizeof(*r), TYPE_REGISTER);
26
27
--
26
--
28
2.20.1
27
2.20.1
29
28
30
29
diff view generated by jsdifflib
New patch
1
The documentation of the -machine memory-backend has some minor
2
formatting errors:
3
* Misindentation of the initial line meant that the whole option
4
section is incorrectly indented in the HTML output compared to
5
the other -machine options
6
* The examples weren't indented, which meant that they were formatted
7
as plain run-on text including outputting the "::" as text.
8
* The a) b) list has no rst-format markup so it is rendered as
9
a single run-on paragraph
1
10
11
Fix the formatting.
12
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
15
Message-id: 20210719105257.3599-1-peter.maydell@linaro.org
16
---
17
qemu-options.hx | 30 +++++++++++++++++-------------
18
1 file changed, 17 insertions(+), 13 deletions(-)
19
20
diff --git a/qemu-options.hx b/qemu-options.hx
21
index XXXXXXX..XXXXXXX 100644
22
--- a/qemu-options.hx
23
+++ b/qemu-options.hx
24
@@ -XXX,XX +XXX,XX @@ SRST
25
Enables or disables ACPI Heterogeneous Memory Attribute Table
26
(HMAT) support. The default is off.
27
28
- ``memory-backend='id'``
29
+ ``memory-backend='id'``
30
An alternative to legacy ``-mem-path`` and ``mem-prealloc`` options.
31
Allows to use a memory backend as main RAM.
32
33
For example:
34
::
35
- -object memory-backend-file,id=pc.ram,size=512M,mem-path=/hugetlbfs,prealloc=on,share=on
36
- -machine memory-backend=pc.ram
37
- -m 512M
38
+
39
+ -object memory-backend-file,id=pc.ram,size=512M,mem-path=/hugetlbfs,prealloc=on,share=on
40
+ -machine memory-backend=pc.ram
41
+ -m 512M
42
43
Migration compatibility note:
44
- a) as backend id one shall use value of 'default-ram-id', advertised by
45
- machine type (available via ``query-machines`` QMP command), if migration
46
- to/from old QEMU (<5.0) is expected.
47
- b) for machine types 4.0 and older, user shall
48
- use ``x-use-canonical-path-for-ramblock-id=off`` backend option
49
- if migration to/from old QEMU (<5.0) is expected.
50
+
51
+ * as backend id one shall use value of 'default-ram-id', advertised by
52
+ machine type (available via ``query-machines`` QMP command), if migration
53
+ to/from old QEMU (<5.0) is expected.
54
+ * for machine types 4.0 and older, user shall
55
+ use ``x-use-canonical-path-for-ramblock-id=off`` backend option
56
+ if migration to/from old QEMU (<5.0) is expected.
57
+
58
For example:
59
::
60
- -object memory-backend-ram,id=pc.ram,size=512M,x-use-canonical-path-for-ramblock-id=off
61
- -machine memory-backend=pc.ram
62
- -m 512M
63
+
64
+ -object memory-backend-ram,id=pc.ram,size=512M,x-use-canonical-path-for-ramblock-id=off
65
+ -machine memory-backend=pc.ram
66
+ -m 512M
67
ERST
68
69
HXCOMM Deprecated by -machine
70
--
71
2.20.1
72
73
diff view generated by jsdifflib
New patch
1
For M-profile, unlike A-profile, the low 2 bits of SP are defined to be
2
RES0H, which is to say that they must be hardwired to zero so that
3
guest attempts to write non-zero values to them are ignored.
1
4
5
Implement this behaviour by masking out the low bits:
6
* for writes to r13 by the gdbstub
7
* for writes to any of the various flavours of SP via MSR
8
* for writes to r13 via store_reg() in generated code
9
10
Note that all the direct uses of cpu_R[] in translate.c are in places
11
where the register is definitely not r13 (usually because that has
12
been checked for as an UNDEFINED or UNPREDICTABLE case and handled as
13
UNDEF).
14
15
All the other writes to regs[13] in C code are either:
16
* A-profile only code
17
* writes of values we can guarantee to be aligned, such as
18
- writes of previous-SP-value plus or minus a 4-aligned constant
19
- writes of the value in an SP limit register (which we already
20
enforce to be aligned)
21
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
24
Message-id: 20210723162146.5167-2-peter.maydell@linaro.org
25
---
26
target/arm/gdbstub.c | 4 ++++
27
target/arm/m_helper.c | 14 ++++++++------
28
target/arm/translate.c | 3 +++
29
3 files changed, 15 insertions(+), 6 deletions(-)
30
31
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/gdbstub.c
34
+++ b/target/arm/gdbstub.c
35
@@ -XXX,XX +XXX,XX @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
36
37
if (n < 16) {
38
/* Core integer register. */
39
+ if (n == 13 && arm_feature(env, ARM_FEATURE_M)) {
40
+ /* M profile SP low bits are always 0 */
41
+ tmp &= ~3;
42
+ }
43
env->regs[n] = tmp;
44
return 4;
45
}
46
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/m_helper.c
49
+++ b/target/arm/m_helper.c
50
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
51
if (!env->v7m.secure) {
52
return;
53
}
54
- env->v7m.other_ss_msp = val;
55
+ env->v7m.other_ss_msp = val & ~3;
56
return;
57
case 0x89: /* PSP_NS */
58
if (!env->v7m.secure) {
59
return;
60
}
61
- env->v7m.other_ss_psp = val;
62
+ env->v7m.other_ss_psp = val & ~3;
63
return;
64
case 0x8a: /* MSPLIM_NS */
65
if (!env->v7m.secure) {
66
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
67
68
limit = is_psp ? env->v7m.psplim[false] : env->v7m.msplim[false];
69
70
+ val &= ~0x3;
71
+
72
if (val < limit) {
73
raise_exception_ra(env, EXCP_STKOF, 0, 1, GETPC());
74
}
75
@@ -XXX,XX +XXX,XX @@ void HELPER(v7m_msr)(CPUARMState *env, uint32_t maskreg, uint32_t val)
76
break;
77
case 8: /* MSP */
78
if (v7m_using_psp(env)) {
79
- env->v7m.other_sp = val;
80
+ env->v7m.other_sp = val & ~3;
81
} else {
82
- env->regs[13] = val;
83
+ env->regs[13] = val & ~3;
84
}
85
break;
86
case 9: /* PSP */
87
if (v7m_using_psp(env)) {
88
- env->regs[13] = val;
89
+ env->regs[13] = val & ~3;
90
} else {
91
- env->v7m.other_sp = val;
92
+ env->v7m.other_sp = val & ~3;
93
}
94
break;
95
case 10: /* MSPLIM */
96
diff --git a/target/arm/translate.c b/target/arm/translate.c
97
index XXXXXXX..XXXXXXX 100644
98
--- a/target/arm/translate.c
99
+++ b/target/arm/translate.c
100
@@ -XXX,XX +XXX,XX @@ void store_reg(DisasContext *s, int reg, TCGv_i32 var)
101
*/
102
tcg_gen_andi_i32(var, var, s->thumb ? ~1 : ~3);
103
s->base.is_jmp = DISAS_JUMP;
104
+ } else if (reg == 13 && arm_dc_feature(s, ARM_FEATURE_M)) {
105
+ /* For M-profile SP bits [1:0] are always zero */
106
+ tcg_gen_andi_i32(var, var, ~3);
107
}
108
tcg_gen_mov_i32(cpu_R[reg], var);
109
tcg_temp_free_i32(var);
110
--
111
2.20.1
112
113
diff view generated by jsdifflib
New patch
1
In do_v7m_exception_exit(), we perform various checks as part of
2
performing the exception return. If one of these checks fails, the
3
architecture requires that we take an appropriate exception on the
4
existing stackframe. We implement this by calling
5
v7m_exception_taken() to set up to take the new exception, and then
6
immediately returning from do_v7m_exception_exit() without proceeding
7
any further with the unstack-and-exception-return process.
1
8
9
In a couple of checks that are new in v8.1M, we forgot the "return"
10
statement, with the effect that if bad code in the guest tripped over
11
these checks we would set up to take a UsageFault exception but then
12
blunder on trying to also unstack and return from the original
13
exception, with the probable result that the guest would crash.
14
15
Add the missing return statements.
16
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20210723162146.5167-3-peter.maydell@linaro.org
20
---
21
target/arm/m_helper.c | 2 ++
22
1 file changed, 2 insertions(+)
23
24
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/arm/m_helper.c
27
+++ b/target/arm/m_helper.c
28
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
29
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
30
"stackframe: NSACR prevents clearing FPU registers\n");
31
v7m_exception_taken(cpu, excret, true, false);
32
+ return;
33
} else if (!cpacr_pass) {
34
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE,
35
exc_secure);
36
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
37
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
38
"stackframe: CPACR prevents clearing FPU registers\n");
39
v7m_exception_taken(cpu, excret, true, false);
40
+ return;
41
}
42
}
43
/* Clear s0..s15, FPSCR and VPR */
44
--
45
2.20.1
46
47
diff view generated by jsdifflib
New patch
1
For M-profile, we weren't reporting alignment faults triggered by the
2
generic TCG code correctly to the guest. These get passed into
3
arm_v7m_cpu_do_interrupt() as an EXCP_DATA_ABORT with an A-profile
4
style exception.fsr value of 1. We didn't check for this, and so
5
they fell through into the default of "assume this is an MPU fault"
6
and were reported to the guest as a data access violation MPU fault.
1
7
8
Report these alignment faults as UsageFaults which set the UNALIGNED
9
bit in the UFSR.
10
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20210723162146.5167-4-peter.maydell@linaro.org
14
---
15
target/arm/m_helper.c | 8 ++++++++
16
1 file changed, 8 insertions(+)
17
18
diff --git a/target/arm/m_helper.c b/target/arm/m_helper.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/m_helper.c
21
+++ b/target/arm/m_helper.c
22
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
23
env->v7m.sfsr |= R_V7M_SFSR_LSERR_MASK;
24
break;
25
case EXCP_UNALIGNED:
26
+ /* Unaligned faults reported by M-profile aware code */
27
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE, env->v7m.secure);
28
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_UNALIGNED_MASK;
29
break;
30
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
31
}
32
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_BUS, false);
33
break;
34
+ case 0x1: /* Alignment fault reported by generic code */
35
+ qemu_log_mask(CPU_LOG_INT,
36
+ "...really UsageFault with UFSR.UNALIGNED\n");
37
+ env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_UNALIGNED_MASK;
38
+ armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE,
39
+ env->v7m.secure);
40
+ break;
41
default:
42
/*
43
* All other FSR values are either MPU faults or "can't happen
44
--
45
2.20.1
46
47
diff view generated by jsdifflib
New patch
1
The ISCR.ISRPENDING bit is set when an external interrupt is pending.
2
This is true whether that external interrupt is enabled or not.
3
This means that we can't use 's->vectpending == 0' as a shortcut to
4
"ISRPENDING is zero", because s->vectpending indicates only the
5
highest priority pending enabled interrupt.
1
6
7
Remove the incorrect optimization so that if there is no pending
8
enabled interrupt we fall through to scanning through the whole
9
interrupt array.
10
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20210723162146.5167-5-peter.maydell@linaro.org
14
---
15
hw/intc/armv7m_nvic.c | 9 ++++-----
16
1 file changed, 4 insertions(+), 5 deletions(-)
17
18
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/armv7m_nvic.c
21
+++ b/hw/intc/armv7m_nvic.c
22
@@ -XXX,XX +XXX,XX @@ static bool nvic_isrpending(NVICState *s)
23
{
24
int irq;
25
26
- /* We can shortcut if the highest priority pending interrupt
27
- * happens to be external or if there is nothing pending.
28
+ /*
29
+ * We can shortcut if the highest priority pending interrupt
30
+ * happens to be external; if not we need to check the whole
31
+ * vectors[] array.
32
*/
33
if (s->vectpending > NVIC_FIRST_IRQ) {
34
return true;
35
}
36
- if (s->vectpending == 0) {
37
- return false;
38
- }
39
40
for (irq = NVIC_FIRST_IRQ; irq < s->num_irq; irq++) {
41
if (s->vectors[irq].pending) {
42
--
43
2.20.1
44
45
diff view generated by jsdifflib
1
In commit 5edab03d4040 we added tracepoints to the ps2 keyboard
1
The VECTPENDING field in the ICSR is 9 bits wide, in bits [20:12] of
2
and mouse emulation. However we didn't remove all the debug-by-printf
2
the register. We were incorrectly masking it to 8 bits, so it would
3
support. In fact there is only one printf() remaining, and it is
3
report the wrong value if the pending exception was greater than 256.
4
redundant with the trace_ps2_write_mouse() event next to it.
4
Fix the bug.
5
Remove the printf() and the now-unused DEBUG* macros.
6
5
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
8
Message-id: 20210723162146.5167-6-peter.maydell@linaro.org
10
Message-id: 20201101133258.4240-1-peter.maydell@linaro.org
11
---
9
---
12
hw/input/ps2.c | 9 ---------
10
hw/intc/armv7m_nvic.c | 2 +-
13
1 file changed, 9 deletions(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
14
12
15
diff --git a/hw/input/ps2.c b/hw/input/ps2.c
13
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/input/ps2.c
15
--- a/hw/intc/armv7m_nvic.c
18
+++ b/hw/input/ps2.c
16
+++ b/hw/intc/armv7m_nvic.c
19
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
20
18
/* VECTACTIVE */
21
#include "trace.h"
19
val = cpu->env.v7m.exception;
22
20
/* VECTPENDING */
23
-/* debug PC keyboard */
21
- val |= (s->vectpending & 0xff) << 12;
24
-//#define DEBUG_KBD
22
+ val |= (s->vectpending & 0x1ff) << 12;
25
-
23
/* ISRPENDING - set if any external IRQ is pending */
26
-/* debug PC keyboard : only mouse */
24
if (nvic_isrpending(s)) {
27
-//#define DEBUG_MOUSE
25
val |= (1 << 22);
28
-
29
/* Keyboard Commands */
30
#define KBD_CMD_SET_LEDS    0xED    /* Set keyboard leds */
31
#define KBD_CMD_ECHO     0xEE
32
@@ -XXX,XX +XXX,XX @@ void ps2_write_mouse(void *opaque, int val)
33
PS2MouseState *s = (PS2MouseState *)opaque;
34
35
trace_ps2_write_mouse(opaque, val);
36
-#ifdef DEBUG_MOUSE
37
- printf("kbd: write mouse 0x%02x\n", val);
38
-#endif
39
switch(s->common.write_cmd) {
40
default:
41
case -1:
42
--
26
--
43
2.20.1
27
2.20.1
44
28
45
29
diff view generated by jsdifflib
1
The TMP105 datasheet says that in Interrupt Mode (when TM==1) the device
1
In Arm v8.1M the VECTPENDING field in the ICSR has new behaviour: if
2
signals an alert when the temperature equals or exceeds the T_high value and
2
the register is accessed NonSecure and the highest priority pending
3
then remains high until a device register is read or the device responds to
3
enabled exception (that would be returned in the VECTPENDING field)
4
the SMBUS Alert Response address, or the device is put into Shutdown Mode.
4
targets Secure, then the VECTPENDING field must read 1 rather than
5
Thereafter the Alert pin will only be re-signalled when temperature falls
5
the exception number of the pending exception. Implement this.
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 .)
10
11
We were misimplementing this as a simple "always alert if temperature is
12
above T_high or below T_low" condition, which gives a spurious alert on
13
startup if using the "T_high = 80 degrees C, T_low = 75 degrees C" reset
14
limit values.
15
16
Implement the correct (hysteresis) behaviour by tracking whether we
17
are currently looking for the temperature to rise over T_high or
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
6
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
24
Message-id: 20201110150023.25533-3-peter.maydell@linaro.org
9
Message-id: 20210723162146.5167-7-peter.maydell@linaro.org
25
---
10
---
26
hw/misc/tmp105.h | 7 +++++
11
hw/intc/armv7m_nvic.c | 31 ++++++++++++++++++++++++-------
27
hw/misc/tmp105.c | 70 +++++++++++++++++++++++++++++++++++++++++-------
12
1 file changed, 24 insertions(+), 7 deletions(-)
28
2 files changed, 68 insertions(+), 9 deletions(-)
29
13
30
diff --git a/hw/misc/tmp105.h b/hw/misc/tmp105.h
14
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
31
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/misc/tmp105.h
16
--- a/hw/intc/armv7m_nvic.c
33
+++ b/hw/misc/tmp105.h
17
+++ b/hw/intc/armv7m_nvic.c
34
@@ -XXX,XX +XXX,XX @@ struct TMP105State {
18
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_acknowledge_irq(void *opaque)
35
int16_t limit[2];
19
nvic_irq_update(s);
36
int faults;
37
uint8_t alarm;
38
+ /*
39
+ * The TMP105 initially looks for a temperature rising above T_high;
40
+ * once this is detected, the condition it looks for next is the
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;
54
}
55
56
- if ((s->config >> 1) & 1) {                    /* TM */
57
- if (s->temperature >= s->limit[1])
58
- s->alarm = 1;
59
- else if (s->temperature < s->limit[0])
60
- s->alarm = 1;
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;
104
}
20
}
105
21
106
+static bool detect_falling_needed(void *opaque)
22
+static bool vectpending_targets_secure(NVICState *s)
107
+{
23
+{
108
+ TMP105State *s = opaque;
24
+ /* Return true if s->vectpending targets Secure state */
109
+
25
+ if (s->vectpending_is_s_banked) {
110
+ /*
26
+ return true;
111
+ * We only need to migrate the detect_falling bool if it's set;
27
+ }
112
+ * for migration from older machines we assume that it is false
28
+ return !exc_is_banked(s->vectpending) &&
113
+ * (ie temperature is not out of range).
29
+ exc_targets_secure(s, s->vectpending);
114
+ */
115
+ return s->detect_falling;
116
+}
30
+}
117
+
31
+
118
+static const VMStateDescription vmstate_tmp105_detect_falling = {
32
void armv7m_nvic_get_pending_irq_info(void *opaque,
119
+ .name = "TMP105/detect-falling",
33
int *pirq, bool *ptargets_secure)
120
+ .version_id = 1,
34
{
121
+ .minimum_version_id = 1,
35
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_get_pending_irq_info(void *opaque,
122
+ .needed = detect_falling_needed,
36
123
+ .fields = (VMStateField[]) {
37
assert(pending > ARMV7M_EXCP_RESET && pending < s->num_irq);
124
+ VMSTATE_BOOL(detect_falling, TMP105State),
38
125
+ VMSTATE_END_OF_LIST()
39
- if (s->vectpending_is_s_banked) {
126
+ }
40
- targets_secure = true;
127
+};
41
- } else {
128
+
42
- targets_secure = !exc_is_banked(pending) &&
129
static const VMStateDescription vmstate_tmp105 = {
43
- exc_targets_secure(s, pending);
130
.name = "TMP105",
44
- }
131
.version_id = 0,
45
+ targets_secure = vectpending_targets_secure(s);
132
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_tmp105 = {
46
133
VMSTATE_UINT8(alarm, TMP105State),
47
trace_nvic_get_pending_irq_info(pending, targets_secure);
134
VMSTATE_I2C_SLAVE(i2c, TMP105State),
48
135
VMSTATE_END_OF_LIST()
49
@@ -XXX,XX +XXX,XX @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
136
+ },
50
/* VECTACTIVE */
137
+ .subsections = (const VMStateDescription*[]) {
51
val = cpu->env.v7m.exception;
138
+ &vmstate_tmp105_detect_falling,
52
/* VECTPENDING */
139
+ NULL
53
- val |= (s->vectpending & 0x1ff) << 12;
140
}
54
+ if (s->vectpending) {
141
};
55
+ /*
142
56
+ * From v8.1M VECTPENDING must read as 1 if accessed as
143
@@ -XXX,XX +XXX,XX @@ static void tmp105_reset(I2CSlave *i2c)
57
+ * NonSecure and the highest priority pending and enabled
144
s->config = 0;
58
+ * exception targets Secure.
145
s->faults = tmp105_faultq[(s->config >> 3) & 3];
59
+ */
146
s->alarm = 0;
60
+ int vp = s->vectpending;
147
+ s->detect_falling = false;
61
+ if (!attrs.secure && arm_feature(&cpu->env, ARM_FEATURE_V8_1M) &&
148
62
+ vectpending_targets_secure(s)) {
149
s->limit[0] = 0x4b00; /* T_LOW, 75 degrees C */
63
+ vp = 1;
150
s->limit[1] = 0x5000; /* T_HIGH, 80 degrees C */
64
+ }
65
+ val |= (vp & 0x1ff) << 12;
66
+ }
67
/* ISRPENDING - set if any external IRQ is pending */
68
if (nvic_isrpending(s)) {
69
val |= (1 << 22);
151
--
70
--
152
2.20.1
71
2.20.1
153
72
154
73
diff view generated by jsdifflib
1
In commit 76346b6264a9b01979 we tried to add a configure check that
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
the libgio pkg-config data was correct, which builds an executable
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.
8
2
9
(The ineffective test went unnoticed because of a typo that
3
Missed in commit f3478392 "docs: Move deprecation, build
10
effectively disabled libgio unconditionally, but after commit
4
and license info out of system/"
11
3569a5dfc11f2 fixed that, a static link of the system emulator on
12
Ubuntu stopped working again.)
13
5
14
Improve the gio test by having the test source fragment reference a
6
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
15
g_dbus function (which is what is indirectly causing us to end up
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
wanting functions from libmount).
8
Message-id: 20210723065828.1336760-1-maozhongyi@cmss.chinamobile.com
17
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
20
Message-id: 20201116104617.18333-1-peter.maydell@linaro.org
21
---
10
---
22
configure | 11 +++++++++--
11
configure | 2 +-
23
1 file changed, 9 insertions(+), 2 deletions(-)
12
target/i386/cpu.c | 2 +-
13
MAINTAINERS | 2 +-
14
3 files changed, 3 insertions(+), 3 deletions(-)
24
15
25
diff --git a/configure b/configure
16
diff --git a/configure b/configure
26
index XXXXXXX..XXXXXXX 100755
17
index XXXXXXX..XXXXXXX 100755
27
--- a/configure
18
--- a/configure
28
+++ b/configure
19
+++ b/configure
29
@@ -XXX,XX +XXX,XX @@ if $pkg_config --atleast-version=$glib_req_ver gio-2.0; then
20
@@ -XXX,XX +XXX,XX @@ fi
30
# Check that the libraries actually work -- Ubuntu 18.04 ships
21
31
# with pkg-config --static --libs data for gio-2.0 that is missing
22
if test -n "${deprecated_features}"; then
32
# -lblkid and will give a link error.
23
echo "Warning, deprecated features enabled."
33
- write_c_skeleton
24
- echo "Please see docs/system/deprecated.rst"
34
- if compile_prog "" "$gio_libs" ; then
25
+ echo "Please see docs/about/deprecated.rst"
35
+ cat > $TMPC <<EOF
26
echo " features: ${deprecated_features}"
36
+#include <gio/gio.h>
27
fi
37
+int main(void)
28
38
+{
29
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
39
+ g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
30
index XXXXXXX..XXXXXXX 100644
40
+ return 0;
31
--- a/target/i386/cpu.c
41
+}
32
+++ b/target/i386/cpu.c
42
+EOF
33
@@ -XXX,XX +XXX,XX @@ static const X86CPUDefinition builtin_x86_defs[] = {
43
+ if compile_prog "$gio_cflags" "$gio_libs" ; then
34
* none", but this is just for compatibility while libvirt isn't
44
gio=yes
35
* adapted to resolve CPU model versions before creating VMs.
45
else
36
* See "Runnability guarantee of CPU models" at
46
gio=no
37
- * docs/system/deprecated.rst.
38
+ * docs/about/deprecated.rst.
39
*/
40
X86CPUVersion default_cpu_version = 1;
41
42
diff --git a/MAINTAINERS b/MAINTAINERS
43
index XXXXXXX..XXXXXXX 100644
44
--- a/MAINTAINERS
45
+++ b/MAINTAINERS
46
@@ -XXX,XX +XXX,XX @@ F: contrib/gitdm/*
47
48
Incompatible changes
49
R: libvir-list@redhat.com
50
-F: docs/system/deprecated.rst
51
+F: docs/about/deprecated.rst
52
53
Build System
54
------------
47
--
55
--
48
2.20.1
56
2.20.1
49
57
50
58
diff view generated by jsdifflib
1
In the mtspr helper we attempt to check for "is the timer disabled"
1
From: Richard Henderson <richard.henderson@linaro.org>
2
with "if (env->ttmr & TIMER_NONE)". This is wrong because TIMER_NONE
3
is zero and the condition is always false (Coverity complains about
4
the dead code.)
5
2
6
The correct check would be to test whether the TTMR_M field in the
3
Currently, our only caller is sve_zcr_len_for_el, which has
7
register is equal to TIMER_NONE instead. However, the
4
already masked the length extracted from ZCR_ELx, so the
8
cpu_openrisc_timer_update() function checks whether the timer is
5
masking done here is a nop. But we will shortly have uses
9
enabled (it looks at cpu->env.is_counting, which is set to 0 via
6
from other locations, where the length will be unmasked.
10
cpu_openrisc_count_stop() when the TTMR_M field is set to
11
TIMER_NONE), so there's no need to check for "timer disabled" in the
12
target/openrisc code. Instead, simply remove the dead code.
13
7
14
Fixes: Coverity CID 1005812
8
Saturate the length to ARM_MAX_VQ instead of truncating to
9
the low 4 bits.
10
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Message-id: 20210723203344.968563-2-richard.henderson@linaro.org
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Acked-by: Stafford Horne <shorne@gmail.com>
17
Message-id: 20201103114654.18540-1-peter.maydell@linaro.org
18
---
15
---
19
target/openrisc/sys_helper.c | 3 ---
16
target/arm/helper.c | 4 +++-
20
1 file changed, 3 deletions(-)
17
1 file changed, 3 insertions(+), 1 deletion(-)
21
18
22
diff --git a/target/openrisc/sys_helper.c b/target/openrisc/sys_helper.c
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
23
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
24
--- a/target/openrisc/sys_helper.c
21
--- a/target/arm/helper.c
25
+++ b/target/openrisc/sys_helper.c
22
+++ b/target/arm/helper.c
26
@@ -XXX,XX +XXX,XX @@ void HELPER(mtspr)(CPUOpenRISCState *env, target_ulong spr, target_ulong rb)
23
@@ -XXX,XX +XXX,XX @@ static uint32_t sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
27
24
{
28
case TO_SPR(10, 1): /* TTCR */
25
uint32_t end_len;
29
cpu_openrisc_count_set(cpu, rb);
26
30
- if (env->ttmr & TIMER_NONE) {
27
- end_len = start_len &= 0xf;
31
- return;
28
+ start_len = MIN(start_len, ARM_MAX_VQ - 1);
32
- }
29
+ end_len = start_len;
33
cpu_openrisc_timer_update(cpu);
30
+
34
break;
31
if (!test_bit(start_len, cpu->sve_vq_map)) {
35
#endif
32
end_len = find_last_bit(cpu->sve_vq_map, start_len);
33
assert(end_len < start_len);
36
--
34
--
37
2.20.1
35
2.20.1
38
36
39
37
diff view generated by jsdifflib
1
The TMP105 datasheet (https://www.ti.com/lit/gpn/tmp105) says that the
1
From: Richard Henderson <richard.henderson@linaro.org>
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.
7
2
8
We were resetting these registers to zero, which is problematic for Linux
3
Rename from sve_zcr_get_valid_len and make accessible
9
guests which enable the alert interrupt and then immediately take an
4
from outside of helper.c.
10
unexpected overtemperature alert because the current temperature is above
11
freezing...
12
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20210723203344.968563-3-richard.henderson@linaro.org
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
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
16
---
10
---
17
hw/misc/tmp105.c | 3 +++
11
target/arm/internals.h | 10 ++++++++++
18
1 file changed, 3 insertions(+)
12
target/arm/helper.c | 4 ++--
13
2 files changed, 12 insertions(+), 2 deletions(-)
19
14
20
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
15
diff --git a/target/arm/internals.h b/target/arm/internals.h
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/misc/tmp105.c
17
--- a/target/arm/internals.h
23
+++ b/hw/misc/tmp105.c
18
+++ b/target/arm/internals.h
24
@@ -XXX,XX +XXX,XX @@ static void tmp105_reset(I2CSlave *i2c)
19
@@ -XXX,XX +XXX,XX @@ void arm_translate_init(void);
25
s->faults = tmp105_faultq[(s->config >> 3) & 3];
20
void arm_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb);
26
s->alarm = 0;
21
#endif /* CONFIG_TCG */
27
22
28
+ s->limit[0] = 0x4b00; /* T_LOW, 75 degrees C */
23
+/**
29
+ s->limit[1] = 0x5000; /* T_HIGH, 80 degrees C */
24
+ * aarch64_sve_zcr_get_valid_len:
30
+
25
+ * @cpu: cpu context
31
tmp105_interrupt_update(s);
26
+ * @start_len: maximum len to consider
27
+ *
28
+ * Return the maximum supported sve vector length <= @start_len.
29
+ * Note that both @start_len and the return value are in units
30
+ * of ZCR_ELx.LEN, so the vector bit length is (x + 1) * 128.
31
+ */
32
+uint32_t aarch64_sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len);
33
34
enum arm_fprounding {
35
FPROUNDING_TIEEVEN,
36
diff --git a/target/arm/helper.c b/target/arm/helper.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/helper.c
39
+++ b/target/arm/helper.c
40
@@ -XXX,XX +XXX,XX @@ int sve_exception_el(CPUARMState *env, int el)
41
return 0;
32
}
42
}
33
43
44
-static uint32_t sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
45
+uint32_t aarch64_sve_zcr_get_valid_len(ARMCPU *cpu, uint32_t start_len)
46
{
47
uint32_t end_len;
48
49
@@ -XXX,XX +XXX,XX @@ uint32_t sve_zcr_len_for_el(CPUARMState *env, int el)
50
zcr_len = MIN(zcr_len, 0xf & (uint32_t)env->vfp.zcr_el[3]);
51
}
52
53
- return sve_zcr_get_valid_len(cpu, zcr_len);
54
+ return aarch64_sve_zcr_get_valid_len(cpu, zcr_len);
55
}
56
57
static void zcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
34
--
58
--
35
2.20.1
59
2.20.1
36
60
37
61
diff view generated by jsdifflib
1
From: Alex Chen <alex.chen@huawei.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We should use printf format specifier "%u" instead of "%d" for
3
Mirror the behavour of /proc/sys/abi/sve_default_vector_length
4
argument of type "unsigned int".
4
under the real linux kernel. We have no way of passing along
5
a real default across exec like the kernel can, but this is a
6
decent way of adjusting the startup vector length of a process.
5
7
6
Reported-by: Euler Robot <euler.robot@huawei.com>
8
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/482
7
Signed-off-by: Alex Chen <alex.chen@huawei.com>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20201111073651.72804-1-alex.chen@huawei.com
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 20210723203344.968563-4-richard.henderson@linaro.org
12
[PMM: tweaked docs formatting, document -1 special-case,
13
added fixup patch from RTH mentioning QEMU's maximum veclen.]
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
15
---
12
hw/timer/exynos4210_mct.c | 4 ++--
16
docs/system/arm/cpu-features.rst | 15 ++++++++
13
hw/timer/exynos4210_pwm.c | 8 ++++----
17
target/arm/cpu.h | 5 +++
14
2 files changed, 6 insertions(+), 6 deletions(-)
18
target/arm/cpu.c | 14 ++++++--
19
target/arm/cpu64.c | 60 ++++++++++++++++++++++++++++++++
20
4 files changed, 92 insertions(+), 2 deletions(-)
15
21
16
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
22
diff --git a/docs/system/arm/cpu-features.rst b/docs/system/arm/cpu-features.rst
17
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/timer/exynos4210_mct.c
24
--- a/docs/system/arm/cpu-features.rst
19
+++ b/hw/timer/exynos4210_mct.c
25
+++ b/docs/system/arm/cpu-features.rst
20
@@ -XXX,XX +XXX,XX @@ static void exynos4210_gcomp_raise_irq(void *opaque, uint32_t id)
26
@@ -XXX,XX +XXX,XX @@ verbose command lines. However, the recommended way to select vector
21
/* If CSTAT is pending and IRQ is enabled */
27
lengths is to explicitly enable each desired length. Therefore only
22
if ((s->reg.int_cstat & G_INT_CSTAT_COMP(id)) &&
28
example's (1), (4), and (6) exhibit recommended uses of the properties.
23
(s->reg.int_enb & G_INT_ENABLE(id))) {
29
24
- DPRINTF("gcmp timer[%d] IRQ\n", id);
30
+SVE User-mode Default Vector Length Property
25
+ DPRINTF("gcmp timer[%u] IRQ\n", id);
31
+--------------------------------------------
26
qemu_irq_raise(s->irq[id]);
32
+
33
+For qemu-aarch64, the cpu property ``sve-default-vector-length=N`` is
34
+defined to mirror the Linux kernel parameter file
35
+``/proc/sys/abi/sve_default_vector_length``. The default length, ``N``,
36
+is in units of bytes and must be between 16 and 8192.
37
+If not specified, the default vector length is 64.
38
+
39
+If the default length is larger than the maximum vector length enabled,
40
+the actual vector length will be reduced. Note that the maximum vector
41
+length supported by QEMU is 256.
42
+
43
+If this property is set to ``-1`` then the default vector length
44
+is set to the maximum possible length.
45
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/cpu.h
48
+++ b/target/arm/cpu.h
49
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
50
/* Used to set the maximum vector length the cpu will support. */
51
uint32_t sve_max_vq;
52
53
+#ifdef CONFIG_USER_ONLY
54
+ /* Used to set the default vector length at process start. */
55
+ uint32_t sve_default_vq;
56
+#endif
57
+
58
/*
59
* In sve_vq_map each set bit is a supported vector length of
60
* (bit-number + 1) * 16 bytes, i.e. each bit number + 1 is the vector
61
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/arm/cpu.c
64
+++ b/target/arm/cpu.c
65
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
66
env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 16, 2, 3);
67
/* with reasonable vector length */
68
if (cpu_isar_feature(aa64_sve, cpu)) {
69
- env->vfp.zcr_el[1] = MIN(cpu->sve_max_vq - 1, 3);
70
+ env->vfp.zcr_el[1] =
71
+ aarch64_sve_zcr_get_valid_len(cpu, cpu->sve_default_vq - 1);
72
}
73
/*
74
* Enable TBI0 but not TBI1.
75
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_initfn(Object *obj)
76
QLIST_INIT(&cpu->pre_el_change_hooks);
77
QLIST_INIT(&cpu->el_change_hooks);
78
79
-#ifndef CONFIG_USER_ONLY
80
+#ifdef CONFIG_USER_ONLY
81
+# ifdef TARGET_AARCH64
82
+ /*
83
+ * The linux kernel defaults to 512-bit vectors, when sve is supported.
84
+ * See documentation for /proc/sys/abi/sve_default_vector_length, and
85
+ * our corresponding sve-default-vector-length cpu property.
86
+ */
87
+ cpu->sve_default_vq = 4;
88
+# endif
89
+#else
90
/* Our inbound IRQ and FIQ lines */
91
if (kvm_enabled()) {
92
/* VIRQ and VFIQ are unused with KVM but we add them to maintain
93
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/arm/cpu64.c
96
+++ b/target/arm/cpu64.c
97
@@ -XXX,XX +XXX,XX @@ static void cpu_arm_set_sve(Object *obj, bool value, Error **errp)
98
cpu->isar.id_aa64pfr0 = t;
99
}
100
101
+#ifdef CONFIG_USER_ONLY
102
+/* Mirror linux /proc/sys/abi/sve_default_vector_length. */
103
+static void cpu_arm_set_sve_default_vec_len(Object *obj, Visitor *v,
104
+ const char *name, void *opaque,
105
+ Error **errp)
106
+{
107
+ ARMCPU *cpu = ARM_CPU(obj);
108
+ int32_t default_len, default_vq, remainder;
109
+
110
+ if (!visit_type_int32(v, name, &default_len, errp)) {
111
+ return;
112
+ }
113
+
114
+ /* Undocumented, but the kernel allows -1 to indicate "maximum". */
115
+ if (default_len == -1) {
116
+ cpu->sve_default_vq = ARM_MAX_VQ;
117
+ return;
118
+ }
119
+
120
+ default_vq = default_len / 16;
121
+ remainder = default_len % 16;
122
+
123
+ /*
124
+ * Note that the 512 max comes from include/uapi/asm/sve_context.h
125
+ * and is the maximum architectural width of ZCR_ELx.LEN.
126
+ */
127
+ if (remainder || default_vq < 1 || default_vq > 512) {
128
+ error_setg(errp, "cannot set sve-default-vector-length");
129
+ if (remainder) {
130
+ error_append_hint(errp, "Vector length not a multiple of 16\n");
131
+ } else if (default_vq < 1) {
132
+ error_append_hint(errp, "Vector length smaller than 16\n");
133
+ } else {
134
+ error_append_hint(errp, "Vector length larger than %d\n",
135
+ 512 * 16);
136
+ }
137
+ return;
138
+ }
139
+
140
+ cpu->sve_default_vq = default_vq;
141
+}
142
+
143
+static void cpu_arm_get_sve_default_vec_len(Object *obj, Visitor *v,
144
+ const char *name, void *opaque,
145
+ Error **errp)
146
+{
147
+ ARMCPU *cpu = ARM_CPU(obj);
148
+ int32_t value = cpu->sve_default_vq * 16;
149
+
150
+ visit_type_int32(v, name, &value, errp);
151
+}
152
+#endif
153
+
154
void aarch64_add_sve_properties(Object *obj)
155
{
156
uint32_t vq;
157
@@ -XXX,XX +XXX,XX @@ void aarch64_add_sve_properties(Object *obj)
158
object_property_add(obj, name, "bool", cpu_arm_get_sve_vq,
159
cpu_arm_set_sve_vq, NULL, NULL);
27
}
160
}
161
+
162
+#ifdef CONFIG_USER_ONLY
163
+ /* Mirror linux /proc/sys/abi/sve_default_vector_length. */
164
+ object_property_add(obj, "sve-default-vector-length", "int32",
165
+ cpu_arm_get_sve_default_vec_len,
166
+ cpu_arm_set_sve_default_vec_len, NULL, NULL);
167
+#endif
28
}
168
}
29
@@ -XXX,XX +XXX,XX @@ static void exynos4210_mct_update_freq(Exynos4210MCTState *s)
169
30
MCT_CFG_GET_DIVIDER(s->reg_mct_cfg));
170
void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp)
31
32
if (freq != s->freq) {
33
- DPRINTF("freq=%dHz\n", s->freq);
34
+ DPRINTF("freq=%uHz\n", s->freq);
35
36
/* global timer */
37
tx_ptimer_set_freq(s->g_timer.ptimer_frc, s->freq);
38
diff --git a/hw/timer/exynos4210_pwm.c b/hw/timer/exynos4210_pwm.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/timer/exynos4210_pwm.c
41
+++ b/hw/timer/exynos4210_pwm.c
42
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_update_freq(Exynos4210PWMState *s, uint32_t id)
43
44
if (freq != s->timer[id].freq) {
45
ptimer_set_freq(s->timer[id].ptimer, s->timer[id].freq);
46
- DPRINTF("freq=%dHz\n", s->timer[id].freq);
47
+ DPRINTF("freq=%uHz\n", s->timer[id].freq);
48
}
49
}
50
51
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_tick(void *opaque)
52
uint32_t id = s->id;
53
bool cmp;
54
55
- DPRINTF("timer %d tick\n", id);
56
+ DPRINTF("timer %u tick\n", id);
57
58
/* set irq status */
59
p->reg_tint_cstat |= TINT_CSTAT_STATUS(id);
60
61
/* raise IRQ */
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);
66
}
67
68
@@ -XXX,XX +XXX,XX @@ static void exynos4210_pwm_tick(void *opaque)
69
}
70
71
if (cmp) {
72
- DPRINTF("auto reload timer %d count to %x\n", id,
73
+ DPRINTF("auto reload timer %u count to %x\n", id,
74
p->timer[id].reg_tcntb);
75
ptimer_set_count(p->timer[id].ptimer, p->timer[id].reg_tcntb);
76
ptimer_run(p->timer[id].ptimer, 1);
77
--
171
--
78
2.20.1
172
2.20.1
79
173
80
174
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Fix Coverity CID 1435957: Memory - illegal accesses (OVERRUN):
4
5
>>> Overrunning array "suffixes" of 7 8-byte elements at element
6
index 7 (byte offset 63) using index "idx" (which evaluates to 7).
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>
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
5
Message-id: 20210726150953.1218690-1-f4bug@amsat.org
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>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
7
---
21
util/cutils.c | 3 ++-
8
hw/arm/nseries.c | 2 +-
22
1 file changed, 2 insertions(+), 1 deletion(-)
9
1 file changed, 1 insertion(+), 1 deletion(-)
23
10
24
diff --git a/util/cutils.c b/util/cutils.c
11
diff --git a/hw/arm/nseries.c b/hw/arm/nseries.c
25
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
26
--- a/util/cutils.c
13
--- a/hw/arm/nseries.c
27
+++ b/util/cutils.c
14
+++ b/hw/arm/nseries.c
28
@@ -XXX,XX +XXX,XX @@ char *freq_to_str(uint64_t freq_hz)
15
@@ -XXX,XX +XXX,XX @@ static uint32_t mipid_txrx(void *opaque, uint32_t cmd, int len)
29
double freq = freq_hz;
16
default:
30
size_t idx = 0;
17
bad_cmd:
31
18
qemu_log_mask(LOG_GUEST_ERROR,
32
- while (freq >= 1000.0 && idx < ARRAY_SIZE(suffixes)) {
19
- "%s: unknown command %02x\n", __func__, s->cmd);
33
+ while (freq >= 1000.0) {
20
+ "%s: unknown command 0x%02x\n", __func__, s->cmd);
34
freq /= 1000.0;
21
break;
35
idx++;
36
}
22
}
37
+ assert(idx < ARRAY_SIZE(suffixes));
23
38
39
return g_strdup_printf("%0.3g %sHz", freq, suffixes[idx]);
40
}
41
--
24
--
42
2.20.1
25
2.20.1
43
26
44
27
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Joel Stanley <joel@jms.id.au>
2
2
3
The removal of the selection of A15MPCORE from ARM_VIRT also
3
The macro used to calculate the maximum memory size of the MMIO region
4
removed what A15MPCORE selects, ARM_GIC. We still need ARM_GIC.
4
had a mistake, causing all GPIO models to create a mapping of 0x9D8.
5
The intent was to have it be 0x9D8 - 0x800.
5
6
6
Fixes: bec3c97e0cf9 ("hw/arm/virt: Remove dependency on Cortex-A15 MPCore peripherals")
7
This extra size doesn't matter on ast2400 and ast2500, which have a 4KB
7
Reported-by: Miroslav Rezanina <mrezanin@redhat.com>
8
region set aside for the GPIO controller.
8
Signed-off-by: Andrew Jones <drjones@redhat.com>
9
9
Reviewed-by: Miroslav Rezanina <mrezanin@redhat.com>
10
On the ast2600 the 3.3V and 1.8V GPIO controllers are 2KB apart, so the
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
regions would overlap. Worse was the 1.8V controller would map over the
11
Message-id: 20201111143440.112763-1-drjones@redhat.com
12
top of the following peripheral, which happens to be the RTC.
13
14
The mmio region used by each device is a maximum of 2KB, so avoid the
15
calculations and hard code this as the maximum.
16
17
Fixes: 36d737ee82b2 ("hw/gpio: Add in AST2600 specific implementation")
18
Signed-off-by: Joel Stanley <joel@jms.id.au>
19
Reviewed-by: Rashmica Gupta <rashmica.g@gmail.com>
20
Reviewed-by: Cédric Le Goater <clg@kaod.org>
21
Message-id: 20210713065854.134634-2-joel@jms.id.au
22
[PMM: fix autocorrect error in commit message]
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
24
---
14
hw/arm/Kconfig | 1 +
25
hw/gpio/aspeed_gpio.c | 3 +--
15
1 file changed, 1 insertion(+)
26
1 file changed, 1 insertion(+), 2 deletions(-)
16
27
17
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
28
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
18
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/Kconfig
30
--- a/hw/gpio/aspeed_gpio.c
20
+++ b/hw/arm/Kconfig
31
+++ b/hw/gpio/aspeed_gpio.c
21
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
32
@@ -XXX,XX +XXX,XX @@
22
imply VFIO_PLATFORM
33
#define GPIO_1_8V_MEM_SIZE 0x9D8
23
imply VFIO_XGMAC
34
#define GPIO_1_8V_REG_ARRAY_SIZE ((GPIO_1_8V_MEM_SIZE - \
24
imply TPM_TIS_SYSBUS
35
GPIO_1_8V_REG_OFFSET) >> 2)
25
+ select ARM_GIC
36
-#define GPIO_MAX_MEM_SIZE MAX(GPIO_3_6V_MEM_SIZE, GPIO_1_8V_MEM_SIZE)
26
select ACPI
37
27
select ARM_SMMUV3
38
static int aspeed_evaluate_irq(GPIOSets *regs, int gpio_prev_high, int gpio)
28
select GPIO_KEY
39
{
40
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_realize(DeviceState *dev, Error **errp)
41
}
42
43
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_gpio_ops, s,
44
- TYPE_ASPEED_GPIO, GPIO_MAX_MEM_SIZE);
45
+ TYPE_ASPEED_GPIO, 0x800);
46
47
sysbus_init_mmio(sbd, &s->iomem);
48
}
29
--
49
--
30
2.20.1
50
2.20.1
31
51
32
52
diff view generated by jsdifflib