1
A random mix of items here, nothing very major.
1
The following changes since commit ad1b4ec39caa5b3f17cbd8160283a03a3dcfe2ae:
2
2
3
thanks
3
Merge remote-tracking branch 'remotes/kraxel/tags/input-20180515-pull-request' into staging (2018-05-15 12:50:06 +0100)
4
-- PMM
5
4
5
are available in the Git repository at:
6
6
7
The following changes since commit d0dff238a87fa81393ed72754d4dc8b09e50b08b:
7
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180515
8
8
9
Merge remote-tracking branch 'remotes/juanquintela/tags/migration/20170206' into staging (2017-02-07 15:29:26 +0000)
9
for you to fetch changes up to ae7651804748c6b479d5ae09aeac4edb9c44f76e:
10
10
11
are available in the git repository at:
11
tcg: Optionally log FPU state in TCG -d cpu logging (2018-05-15 14:58:44 +0100)
12
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20170207
14
15
for you to fetch changes up to 7727b832886fafbdec7299eb7773dc9071bf4cdd:
16
17
stellaris: Use the 'unimplemented' device for parts we don't implement (2017-02-07 18:30:00 +0000)
18
12
19
----------------------------------------------------------------
13
----------------------------------------------------------------
20
target-arm:
14
target-arm queue:
21
* new "unimplemented" device for stubbing out devices in a
15
* Fix coverity nit in int_to_float code
22
system model so accesses can be logged
16
* Don't set Invalid for float-to-int(MAXINT)
23
* stellaris: document the SoC memory map
17
* Fix fp_status_f16 tininess before rounding
24
* arm: create instruction syndromes for AArch32 data aborts
18
* Add various missing insns from the v8.2-FP16 extension
25
* arm: Correctly handle watchpoints for BE32 CPUs
19
* Fix sqrt_f16 exception raising
26
* Fix Thumb-1 BE32 execution and disassembly
20
* sdcard: Correct CRC16 offset in sd_function_switch()
27
* arm: Add cfgend parameter for ARM CPU selection
21
* tcg: Optionally log FPU state in TCG -d cpu logging
28
* sd: sdhci: check data length during dma_memory_read
29
* aspeed: add a watchdog controller
30
* integratorcp: adding vmstate for save/restore
31
22
32
----------------------------------------------------------------
23
----------------------------------------------------------------
33
Cédric Le Goater (2):
24
Alex Bennée (5):
34
wdt: Add Aspeed watchdog device model
25
fpu/softfloat: int_to_float ensure r fully initialised
35
aspeed: add a watchdog controller
26
target/arm: Implement FCMP for fp16
27
target/arm: Implement FCSEL for fp16
28
target/arm: Implement FMOV (immediate) for fp16
29
target/arm: Fix sqrt_f16 exception raising
36
30
37
Julian Brown (4):
31
Peter Maydell (3):
38
hw/arm/integratorcp: Support specifying features via -cpu
32
fpu/softfloat: Don't set Invalid for float-to-int(MAXINT)
39
target/arm: Add cfgend parameter for ARM CPU selection.
33
target/arm: Fix fp_status_f16 tininess before rounding
40
Fix Thumb-1 BE32 execution and disassembly.
34
tcg: Optionally log FPU state in TCG -d cpu logging
41
arm: Correctly handle watchpoints for BE32 CPUs
42
35
43
Pavel Dovgalyuk (1):
36
Philippe Mathieu-Daudé (1):
44
integratorcp: adding vmstate for save/restore
37
sdcard: Correct CRC16 offset in sd_function_switch()
45
38
46
Peter Maydell (5):
39
Richard Henderson (7):
47
target/arm: Abstract out pbit/wbit tests in ARM ldr/str decode
40
target/arm: Implement FMOV (general) for fp16
48
target/arm: A32, T32: Create Instruction Syndromes for Data Aborts
41
target/arm: Early exit after unallocated_encoding in disas_fp_int_conv
49
stellaris: Document memory map and which SoC devices are unimplemented
42
target/arm: Implement FCVT (scalar, integer) for fp16
50
hw/misc: New "unimplemented" sysbus device
43
target/arm: Implement FCVT (scalar, fixed-point) for fp16
51
stellaris: Use the 'unimplemented' device for parts we don't implement
44
target/arm: Introduce and use read_fp_hreg
45
target/arm: Implement FP data-processing (2 source) for fp16
46
target/arm: Implement FP data-processing (3 source) for fp16
52
47
53
Prasad J Pandit (1):
48
include/qemu/log.h | 1 +
54
sd: sdhci: check data length during dma_memory_read
49
target/arm/helper-a64.h | 2 +
50
target/arm/helper.h | 6 +
51
accel/tcg/cpu-exec.c | 9 +-
52
fpu/softfloat.c | 6 +-
53
hw/sd/sd.c | 2 +-
54
target/arm/cpu.c | 2 +
55
target/arm/helper-a64.c | 10 ++
56
target/arm/helper.c | 38 +++-
57
target/arm/translate-a64.c | 421 ++++++++++++++++++++++++++++++++++++++-------
58
util/log.c | 2 +
59
11 files changed, 428 insertions(+), 71 deletions(-)
55
60
56
hw/misc/Makefile.objs | 2 +
57
hw/watchdog/Makefile.objs | 1 +
58
include/disas/bfd.h | 7 ++
59
include/hw/arm/aspeed_soc.h | 2 +
60
include/hw/misc/unimp.h | 39 +++++++
61
include/hw/watchdog/wdt_aspeed.h | 32 ++++++
62
include/qom/cpu.h | 3 +
63
target/arm/arm_ldst.h | 10 +-
64
target/arm/cpu.h | 7 ++
65
target/arm/internals.h | 5 +
66
target/arm/translate.h | 14 +++
67
disas.c | 1 +
68
exec.c | 1 +
69
hw/arm/aspeed_soc.c | 13 +++
70
hw/arm/integratorcp.c | 78 +++++++++++++-
71
hw/arm/stellaris.c | 48 +++++++++
72
hw/misc/unimp.c | 107 +++++++++++++++++++
73
hw/sd/sdhci.c | 2 +-
74
hw/watchdog/wdt_aspeed.c | 225 +++++++++++++++++++++++++++++++++++++++
75
qom/cpu.c | 6 ++
76
target/arm/cpu.c | 39 +++++++
77
target/arm/op_helper.c | 22 ++++
78
target/arm/translate-a64.c | 14 ---
79
target/arm/translate.c | 193 ++++++++++++++++++++++++---------
80
24 files changed, 801 insertions(+), 70 deletions(-)
81
create mode 100644 include/hw/misc/unimp.h
82
create mode 100644 include/hw/watchdog/wdt_aspeed.h
83
create mode 100644 hw/misc/unimp.c
84
create mode 100644 hw/watchdog/wdt_aspeed.c
85
diff view generated by jsdifflib
New patch
1
From: Alex Bennée <alex.bennee@linaro.org>
1
2
3
Reported by Coverity (CID1390635). We ensure this for uint_to_float
4
later on so we might as well mirror that.
5
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
fpu/softfloat.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
14
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/fpu/softfloat.c
17
+++ b/fpu/softfloat.c
18
@@ -XXX,XX +XXX,XX @@ FLOAT_TO_UINT(64, 64)
19
20
static FloatParts int_to_float(int64_t a, float_status *status)
21
{
22
- FloatParts r;
23
+ FloatParts r = {};
24
if (a == 0) {
25
r.cls = float_class_zero;
26
r.sign = false;
27
--
28
2.17.0
29
30
diff view generated by jsdifflib
New patch
1
In float-to-integer conversion, if the floating point input
2
converts exactly to the largest or smallest integer that
3
fits in to the result type, this is not an overflow.
4
In this situation we were producing the correct result value,
5
but were incorrectly setting the Invalid flag.
6
For example for Arm A64, "FCVTAS w0, d0" on an input of
7
0x41dfffffffc00000 should produce 0x7fffffff and set no flags.
1
8
9
Fix the boundary case to take the right half of the if()
10
statements.
11
12
This fixes a regression from 2.11 introduced by the softfloat
13
refactoring.
14
15
Cc: qemu-stable@nongnu.org
16
Fixes: ab52f973a50
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20180510140141.12120-1-peter.maydell@linaro.org
20
---
21
fpu/softfloat.c | 4 ++--
22
1 file changed, 2 insertions(+), 2 deletions(-)
23
24
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/fpu/softfloat.c
27
+++ b/fpu/softfloat.c
28
@@ -XXX,XX +XXX,XX @@ static int64_t round_to_int_and_pack(FloatParts in, int rmode,
29
r = UINT64_MAX;
30
}
31
if (p.sign) {
32
- if (r < -(uint64_t) min) {
33
+ if (r <= -(uint64_t) min) {
34
return -r;
35
} else {
36
s->float_exception_flags = orig_flags | float_flag_invalid;
37
return min;
38
}
39
} else {
40
- if (r < max) {
41
+ if (r <= max) {
42
return r;
43
} else {
44
s->float_exception_flags = orig_flags | float_flag_invalid;
45
--
46
2.17.0
47
48
diff view generated by jsdifflib
1
From: Julian Brown <julian@codesourcery.com>
1
In commit d81ce0ef2c4f105 we added an extra float_status field
2
fp_status_fp16 for Arm, but forgot to initialize it correctly
3
by setting it to float_tininess_before_rounding. This currently
4
will only cause problems for the new V8_FP16 feature, since the
5
float-to-float conversion code doesn't use it yet. The effect
6
would be that we failed to set the Underflow IEEE exception flag
7
in all the cases where we should.
2
8
3
In BE32 mode, sub-word size watchpoints can fail to trigger because the
9
Add the missing initialization.
4
address of the access is adjusted in the opcode helpers before being
5
compared with the watchpoint registers. This patch reverses the address
6
adjustment before performing the comparison with the help of a new CPUClass
7
hook.
8
10
9
This version of the patch augments and tidies up comments a little.
11
Fixes: d81ce0ef2c4f105
12
Cc: qemu-stable@nongnu.org
13
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Message-id: 20180512004311.9299-16-richard.henderson@linaro.org
17
---
18
target/arm/cpu.c | 2 ++
19
1 file changed, 2 insertions(+)
10
20
11
Signed-off-by: Julian Brown <julian@codesourcery.com>
12
Message-id: caaf64ffc72f6ae183015337b7afdbd4b8989cb6.1484929304.git.julian@codesourcery.com
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
include/qom/cpu.h | 3 +++
17
target/arm/internals.h | 5 +++++
18
exec.c | 1 +
19
qom/cpu.c | 6 ++++++
20
target/arm/cpu.c | 3 +++
21
target/arm/op_helper.c | 22 ++++++++++++++++++++++
22
6 files changed, 40 insertions(+)
23
24
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
25
index XXXXXXX..XXXXXXX 100644
26
--- a/include/qom/cpu.h
27
+++ b/include/qom/cpu.h
28
@@ -XXX,XX +XXX,XX @@ struct TranslationBlock;
29
* @cpu_exec_exit: Callback for cpu_exec cleanup.
30
* @cpu_exec_interrupt: Callback for processing interrupts in cpu_exec.
31
* @disas_set_info: Setup architecture specific components of disassembly info
32
+ * @adjust_watchpoint_address: Perform a target-specific adjustment to an
33
+ * address before attempting to match it against watchpoints.
34
*
35
* Represents a CPU family or model.
36
*/
37
@@ -XXX,XX +XXX,XX @@ typedef struct CPUClass {
38
bool (*cpu_exec_interrupt)(CPUState *cpu, int interrupt_request);
39
40
void (*disas_set_info)(CPUState *cpu, disassemble_info *info);
41
+ vaddr (*adjust_watchpoint_address)(CPUState *cpu, vaddr addr, int len);
42
} CPUClass;
43
44
#ifdef HOST_WORDS_BIGENDIAN
45
diff --git a/target/arm/internals.h b/target/arm/internals.h
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/internals.h
48
+++ b/target/arm/internals.h
49
@@ -XXX,XX +XXX,XX @@ void hw_breakpoint_update_all(ARMCPU *cpu);
50
/* Callback function for checking if a watchpoint should trigger. */
51
bool arm_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp);
52
53
+/* Adjust addresses (in BE32 mode) before testing against watchpoint
54
+ * addresses.
55
+ */
56
+vaddr arm_adjust_watchpoint_address(CPUState *cs, vaddr addr, int len);
57
+
58
/* Callback function for when a watchpoint or breakpoint triggers. */
59
void arm_debug_excp_handler(CPUState *cs);
60
61
diff --git a/exec.c b/exec.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/exec.c
64
+++ b/exec.c
65
@@ -XXX,XX +XXX,XX @@ static void check_watchpoint(int offset, int len, MemTxAttrs attrs, int flags)
66
return;
67
}
68
vaddr = (cpu->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
69
+ vaddr = cc->adjust_watchpoint_address(cpu, vaddr, len);
70
QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
71
if (cpu_watchpoint_address_matches(wp, vaddr, len)
72
&& (wp->flags & flags)) {
73
diff --git a/qom/cpu.c b/qom/cpu.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/qom/cpu.c
76
+++ b/qom/cpu.c
77
@@ -XXX,XX +XXX,XX @@ static int64_t cpu_common_get_arch_id(CPUState *cpu)
78
return cpu->cpu_index;
79
}
80
81
+static vaddr cpu_adjust_watchpoint_address(CPUState *cpu, vaddr addr, int len)
82
+{
83
+ return addr;
84
+}
85
+
86
static void cpu_class_init(ObjectClass *klass, void *data)
87
{
88
DeviceClass *dc = DEVICE_CLASS(klass);
89
@@ -XXX,XX +XXX,XX @@ static void cpu_class_init(ObjectClass *klass, void *data)
90
k->cpu_exec_enter = cpu_common_noop;
91
k->cpu_exec_exit = cpu_common_noop;
92
k->cpu_exec_interrupt = cpu_common_exec_interrupt;
93
+ k->adjust_watchpoint_address = cpu_adjust_watchpoint_address;
94
set_bit(DEVICE_CATEGORY_CPU, dc->categories);
95
dc->realize = cpu_common_realizefn;
96
dc->unrealize = cpu_common_unrealizefn;
97
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
21
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
98
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
99
--- a/target/arm/cpu.c
23
--- a/target/arm/cpu.c
100
+++ b/target/arm/cpu.c
24
+++ b/target/arm/cpu.c
101
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
25
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
102
cc->gdb_stop_before_watchpoint = true;
26
&env->vfp.fp_status);
103
cc->debug_excp_handler = arm_debug_excp_handler;
27
set_float_detect_tininess(float_tininess_before_rounding,
104
cc->debug_check_watchpoint = arm_debug_check_watchpoint;
28
&env->vfp.standard_fp_status);
105
+#if !defined(CONFIG_USER_ONLY)
29
+ set_float_detect_tininess(float_tininess_before_rounding,
106
+ cc->adjust_watchpoint_address = arm_adjust_watchpoint_address;
30
+ &env->vfp.fp_status_f16);
107
+#endif
31
#ifndef CONFIG_USER_ONLY
108
32
if (kvm_enabled()) {
109
cc->disas_set_info = arm_disas_set_info;
33
kvm_arm_reset_vcpu(cpu);
110
}
111
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
112
index XXXXXXX..XXXXXXX 100644
113
--- a/target/arm/op_helper.c
114
+++ b/target/arm/op_helper.c
115
@@ -XXX,XX +XXX,XX @@ bool arm_debug_check_watchpoint(CPUState *cs, CPUWatchpoint *wp)
116
return check_watchpoints(cpu);
117
}
118
119
+vaddr arm_adjust_watchpoint_address(CPUState *cs, vaddr addr, int len)
120
+{
121
+ ARMCPU *cpu = ARM_CPU(cs);
122
+ CPUARMState *env = &cpu->env;
123
+
124
+ /* In BE32 system mode, target memory is stored byteswapped (on a
125
+ * little-endian host system), and by the time we reach here (via an
126
+ * opcode helper) the addresses of subword accesses have been adjusted
127
+ * to account for that, which means that watchpoints will not match.
128
+ * Undo the adjustment here.
129
+ */
130
+ if (arm_sctlr_b(env)) {
131
+ if (len == 1) {
132
+ addr ^= 3;
133
+ } else if (len == 2) {
134
+ addr ^= 2;
135
+ }
136
+ }
137
+
138
+ return addr;
139
+}
140
+
141
void arm_debug_excp_handler(CPUState *cs)
142
{
143
/* Called by core code when a watchpoint or breakpoint fires;
144
--
34
--
145
2.7.4
35
2.17.0
146
36
147
37
diff view generated by jsdifflib
1
Use the 'unimplemented' dummy device to cover regions of the
1
From: Richard Henderson <richard.henderson@linaro.org>
2
SoC device memory map which we don't have proper device
3
implementations for yet.
4
2
3
Adding the fp16 moves to/from general registers.
4
5
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Tested-by: Alex Bennée <alex.bennee@linaro.org>
8
Message-id: 20180512003217.9105-2-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 1484247815-15279-4-git-send-email-peter.maydell@linaro.org
8
---
11
---
9
hw/arm/stellaris.c | 14 ++++++++++++++
12
target/arm/translate-a64.c | 21 +++++++++++++++++++++
10
1 file changed, 14 insertions(+)
13
1 file changed, 21 insertions(+)
11
14
12
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/stellaris.c
17
--- a/target/arm/translate-a64.c
15
+++ b/hw/arm/stellaris.c
18
+++ b/target/arm/translate-a64.c
16
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
17
#include "exec/address-spaces.h"
20
tcg_gen_st_i64(tcg_rn, cpu_env, fp_reg_hi_offset(s, rd));
18
#include "sysemu/sysemu.h"
21
clear_vec_high(s, true, rd);
19
#include "hw/char/pl011.h"
22
break;
20
+#include "hw/misc/unimp.h"
23
+ case 3:
21
24
+ /* 16 bit */
22
#define GPIO_A 0
25
+ tmp = tcg_temp_new_i64();
23
#define GPIO_B 1
26
+ tcg_gen_ext16u_i64(tmp, tcg_rn);
24
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
27
+ write_fp_dreg(s, rd, tmp);
25
}
28
+ tcg_temp_free_i64(tmp);
29
+ break;
30
+ default:
31
+ g_assert_not_reached();
32
}
33
} else {
34
TCGv_i64 tcg_rd = cpu_reg(s, rd);
35
@@ -XXX,XX +XXX,XX @@ static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
36
/* 64 bits from top half */
37
tcg_gen_ld_i64(tcg_rd, cpu_env, fp_reg_hi_offset(s, rn));
38
break;
39
+ case 3:
40
+ /* 16 bit */
41
+ tcg_gen_ld16u_i64(tcg_rd, cpu_env, fp_reg_offset(s, rn, MO_16));
42
+ break;
43
+ default:
44
+ g_assert_not_reached();
26
}
45
}
27
}
46
}
28
+
29
+ /* Add dummy regions for the devices we don't implement yet,
30
+ * so guest accesses don't cause unlogged crashes.
31
+ */
32
+ create_unimplemented_device("wdtimer", 0x40000000, 0x1000);
33
+ create_unimplemented_device("i2c-0", 0x40002000, 0x1000);
34
+ create_unimplemented_device("i2c-2", 0x40021000, 0x1000);
35
+ create_unimplemented_device("PWM", 0x40028000, 0x1000);
36
+ create_unimplemented_device("QEI-0", 0x4002c000, 0x1000);
37
+ create_unimplemented_device("QEI-1", 0x4002d000, 0x1000);
38
+ create_unimplemented_device("analogue-comparator", 0x4003c000, 0x1000);
39
+ create_unimplemented_device("hibernation", 0x400fc000, 0x1000);
40
+ create_unimplemented_device("flash-control", 0x400fd000, 0x1000);
41
}
47
}
42
48
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
43
/* FIXME: Figure out how to generate these from stellaris_boards. */
49
case 0xa: /* 64 bit */
50
case 0xd: /* 64 bit to top half of quad */
51
break;
52
+ case 0x6: /* 16-bit float, 32-bit int */
53
+ case 0xe: /* 16-bit float, 64-bit int */
54
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
55
+ break;
56
+ }
57
+ /* fallthru */
58
default:
59
/* all other sf/type/rmode combinations are invalid */
60
unallocated_encoding(s);
44
--
61
--
45
2.7.4
62
2.17.0
46
63
47
64
diff view generated by jsdifflib
1
Add a comment documenting the memory map of the SoC devices and which
1
From: Richard Henderson <richard.henderson@linaro.org>
2
are not implemented.
3
2
3
No sense in emitting code after the exception.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 20180512003217.9105-3-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 1484247815-15279-2-git-send-email-peter.maydell@linaro.org
6
---
10
---
7
hw/arm/stellaris.c | 34 ++++++++++++++++++++++++++++++++++
11
target/arm/translate-a64.c | 2 +-
8
1 file changed, 34 insertions(+)
12
1 file changed, 1 insertion(+), 1 deletion(-)
9
13
10
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/arm/stellaris.c
16
--- a/target/arm/translate-a64.c
13
+++ b/hw/arm/stellaris.c
17
+++ b/target/arm/translate-a64.c
14
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
18
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
15
0x40024000, 0x40025000, 0x40026000};
19
default:
16
static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31};
20
/* all other sf/type/rmode combinations are invalid */
17
21
unallocated_encoding(s);
18
+ /* Memory map of SoC devices, from
22
- break;
19
+ * Stellaris LM3S6965 Microcontroller Data Sheet (rev I)
23
+ return;
20
+ * http://www.ti.com/lit/ds/symlink/lm3s6965.pdf
24
}
21
+ *
25
22
+ * 40000000 wdtimer (unimplemented)
26
if (!fp_access_check(s)) {
23
+ * 40002000 i2c (unimplemented)
24
+ * 40004000 GPIO
25
+ * 40005000 GPIO
26
+ * 40006000 GPIO
27
+ * 40007000 GPIO
28
+ * 40008000 SSI
29
+ * 4000c000 UART
30
+ * 4000d000 UART
31
+ * 4000e000 UART
32
+ * 40020000 i2c
33
+ * 40021000 i2c (unimplemented)
34
+ * 40024000 GPIO
35
+ * 40025000 GPIO
36
+ * 40026000 GPIO
37
+ * 40028000 PWM (unimplemented)
38
+ * 4002c000 QEI (unimplemented)
39
+ * 4002d000 QEI (unimplemented)
40
+ * 40030000 gptimer
41
+ * 40031000 gptimer
42
+ * 40032000 gptimer
43
+ * 40033000 gptimer
44
+ * 40038000 ADC
45
+ * 4003c000 analogue comparator (unimplemented)
46
+ * 40048000 ethernet
47
+ * 400fc000 hibernation module (unimplemented)
48
+ * 400fd000 flash memory control (unimplemented)
49
+ * 400fe000 system control
50
+ */
51
+
52
DeviceState *gpio_dev[7], *nvic;
53
qemu_irq gpio_in[7][8];
54
qemu_irq gpio_out[7][8];
55
--
27
--
56
2.7.4
28
2.17.0
57
29
58
30
diff view generated by jsdifflib
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
Cc: qemu-stable@nongnu.org
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 20180512003217.9105-4-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/helper.h | 6 +++
11
target/arm/helper.c | 38 ++++++++++++++-
12
target/arm/translate-a64.c | 96 +++++++++++++++++++++++++++++++-------
13
3 files changed, 122 insertions(+), 18 deletions(-)
14
15
diff --git a/target/arm/helper.h b/target/arm/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.h
18
+++ b/target/arm/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, ptr)
20
DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, ptr)
21
DEF_HELPER_3(vfp_touhh, i32, f16, i32, ptr)
22
DEF_HELPER_3(vfp_toshh, i32, f16, i32, ptr)
23
+DEF_HELPER_3(vfp_toulh, i32, f16, i32, ptr)
24
+DEF_HELPER_3(vfp_toslh, i32, f16, i32, ptr)
25
+DEF_HELPER_3(vfp_touqh, i64, f16, i32, ptr)
26
+DEF_HELPER_3(vfp_tosqh, i64, f16, i32, ptr)
27
DEF_HELPER_3(vfp_toshs, i32, f32, i32, ptr)
28
DEF_HELPER_3(vfp_tosls, i32, f32, i32, ptr)
29
DEF_HELPER_3(vfp_tosqs, i64, f32, i32, ptr)
30
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_ultod, f64, i64, i32, ptr)
31
DEF_HELPER_3(vfp_uqtod, f64, i64, i32, ptr)
32
DEF_HELPER_3(vfp_sltoh, f16, i32, i32, ptr)
33
DEF_HELPER_3(vfp_ultoh, f16, i32, i32, ptr)
34
+DEF_HELPER_3(vfp_sqtoh, f16, i64, i32, ptr)
35
+DEF_HELPER_3(vfp_uqtoh, f16, i64, i32, ptr)
36
37
DEF_HELPER_FLAGS_2(set_rmode, TCG_CALL_NO_RWG, i32, i32, ptr)
38
DEF_HELPER_FLAGS_2(set_neon_rmode, TCG_CALL_NO_RWG, i32, i32, env)
39
diff --git a/target/arm/helper.c b/target/arm/helper.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/helper.c
42
+++ b/target/arm/helper.c
43
@@ -XXX,XX +XXX,XX @@ VFP_CONV_FIX_A64(uq, s, 32, 64, uint64)
44
#undef VFP_CONV_FIX_A64
45
46
/* Conversion to/from f16 can overflow to infinity before/after scaling.
47
- * Therefore we convert to f64 (which does not round), scale,
48
- * and then convert f64 to f16 (which may round).
49
+ * Therefore we convert to f64, scale, and then convert f64 to f16; or
50
+ * vice versa for conversion to integer.
51
+ *
52
+ * For 16- and 32-bit integers, the conversion to f64 never rounds.
53
+ * For 64-bit integers, any integer that would cause rounding will also
54
+ * overflow to f16 infinity, so there is no double rounding problem.
55
*/
56
57
static float16 do_postscale_fp16(float64 f, int shift, float_status *fpst)
58
@@ -XXX,XX +XXX,XX @@ float16 HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
59
return do_postscale_fp16(uint32_to_float64(x, fpst), shift, fpst);
60
}
61
62
+float16 HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
63
+{
64
+ return do_postscale_fp16(int64_to_float64(x, fpst), shift, fpst);
65
+}
66
+
67
+float16 HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
68
+{
69
+ return do_postscale_fp16(uint64_to_float64(x, fpst), shift, fpst);
70
+}
71
+
72
static float64 do_prescale_fp16(float16 f, int shift, float_status *fpst)
73
{
74
if (unlikely(float16_is_any_nan(f))) {
75
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(vfp_touhh)(float16 x, uint32_t shift, void *fpst)
76
return float64_to_uint16(do_prescale_fp16(x, shift, fpst), fpst);
77
}
78
79
+uint32_t HELPER(vfp_toslh)(float16 x, uint32_t shift, void *fpst)
80
+{
81
+ return float64_to_int32(do_prescale_fp16(x, shift, fpst), fpst);
82
+}
83
+
84
+uint32_t HELPER(vfp_toulh)(float16 x, uint32_t shift, void *fpst)
85
+{
86
+ return float64_to_uint32(do_prescale_fp16(x, shift, fpst), fpst);
87
+}
88
+
89
+uint64_t HELPER(vfp_tosqh)(float16 x, uint32_t shift, void *fpst)
90
+{
91
+ return float64_to_int64(do_prescale_fp16(x, shift, fpst), fpst);
92
+}
93
+
94
+uint64_t HELPER(vfp_touqh)(float16 x, uint32_t shift, void *fpst)
95
+{
96
+ return float64_to_uint64(do_prescale_fp16(x, shift, fpst), fpst);
97
+}
98
+
99
/* Set the current fp rounding mode and return the old one.
100
* The argument is a softfloat float_round_ value.
101
*/
102
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/target/arm/translate-a64.c
105
+++ b/target/arm/translate-a64.c
106
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
107
bool itof, int rmode, int scale, int sf, int type)
108
{
109
bool is_signed = !(opcode & 1);
110
- bool is_double = type;
111
TCGv_ptr tcg_fpstatus;
112
- TCGv_i32 tcg_shift;
113
+ TCGv_i32 tcg_shift, tcg_single;
114
+ TCGv_i64 tcg_double;
115
116
- tcg_fpstatus = get_fpstatus_ptr(false);
117
+ tcg_fpstatus = get_fpstatus_ptr(type == 3);
118
119
tcg_shift = tcg_const_i32(64 - scale);
120
121
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
122
tcg_int = tcg_extend;
123
}
124
125
- if (is_double) {
126
- TCGv_i64 tcg_double = tcg_temp_new_i64();
127
+ switch (type) {
128
+ case 1: /* float64 */
129
+ tcg_double = tcg_temp_new_i64();
130
if (is_signed) {
131
gen_helper_vfp_sqtod(tcg_double, tcg_int,
132
tcg_shift, tcg_fpstatus);
133
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
134
}
135
write_fp_dreg(s, rd, tcg_double);
136
tcg_temp_free_i64(tcg_double);
137
- } else {
138
- TCGv_i32 tcg_single = tcg_temp_new_i32();
139
+ break;
140
+
141
+ case 0: /* float32 */
142
+ tcg_single = tcg_temp_new_i32();
143
if (is_signed) {
144
gen_helper_vfp_sqtos(tcg_single, tcg_int,
145
tcg_shift, tcg_fpstatus);
146
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
147
}
148
write_fp_sreg(s, rd, tcg_single);
149
tcg_temp_free_i32(tcg_single);
150
+ break;
151
+
152
+ case 3: /* float16 */
153
+ tcg_single = tcg_temp_new_i32();
154
+ if (is_signed) {
155
+ gen_helper_vfp_sqtoh(tcg_single, tcg_int,
156
+ tcg_shift, tcg_fpstatus);
157
+ } else {
158
+ gen_helper_vfp_uqtoh(tcg_single, tcg_int,
159
+ tcg_shift, tcg_fpstatus);
160
+ }
161
+ write_fp_sreg(s, rd, tcg_single);
162
+ tcg_temp_free_i32(tcg_single);
163
+ break;
164
+
165
+ default:
166
+ g_assert_not_reached();
167
}
168
} else {
169
TCGv_i64 tcg_int = cpu_reg(s, rd);
170
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
171
172
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
173
174
- if (is_double) {
175
- TCGv_i64 tcg_double = read_fp_dreg(s, rn);
176
+ switch (type) {
177
+ case 1: /* float64 */
178
+ tcg_double = read_fp_dreg(s, rn);
179
if (is_signed) {
180
if (!sf) {
181
gen_helper_vfp_tosld(tcg_int, tcg_double,
182
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
183
tcg_shift, tcg_fpstatus);
184
}
185
}
186
+ if (!sf) {
187
+ tcg_gen_ext32u_i64(tcg_int, tcg_int);
188
+ }
189
tcg_temp_free_i64(tcg_double);
190
- } else {
191
- TCGv_i32 tcg_single = read_fp_sreg(s, rn);
192
+ break;
193
+
194
+ case 0: /* float32 */
195
+ tcg_single = read_fp_sreg(s, rn);
196
if (sf) {
197
if (is_signed) {
198
gen_helper_vfp_tosqs(tcg_int, tcg_single,
199
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
200
tcg_temp_free_i32(tcg_dest);
201
}
202
tcg_temp_free_i32(tcg_single);
203
+ break;
204
+
205
+ case 3: /* float16 */
206
+ tcg_single = read_fp_sreg(s, rn);
207
+ if (sf) {
208
+ if (is_signed) {
209
+ gen_helper_vfp_tosqh(tcg_int, tcg_single,
210
+ tcg_shift, tcg_fpstatus);
211
+ } else {
212
+ gen_helper_vfp_touqh(tcg_int, tcg_single,
213
+ tcg_shift, tcg_fpstatus);
214
+ }
215
+ } else {
216
+ TCGv_i32 tcg_dest = tcg_temp_new_i32();
217
+ if (is_signed) {
218
+ gen_helper_vfp_toslh(tcg_dest, tcg_single,
219
+ tcg_shift, tcg_fpstatus);
220
+ } else {
221
+ gen_helper_vfp_toulh(tcg_dest, tcg_single,
222
+ tcg_shift, tcg_fpstatus);
223
+ }
224
+ tcg_gen_extu_i32_i64(tcg_int, tcg_dest);
225
+ tcg_temp_free_i32(tcg_dest);
226
+ }
227
+ tcg_temp_free_i32(tcg_single);
228
+ break;
229
+
230
+ default:
231
+ g_assert_not_reached();
232
}
233
234
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
235
tcg_temp_free_i32(tcg_rmode);
236
-
237
- if (!sf) {
238
- tcg_gen_ext32u_i64(tcg_int, tcg_int);
239
- }
240
}
241
242
tcg_temp_free_ptr(tcg_fpstatus);
243
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
244
/* actual FP conversions */
245
bool itof = extract32(opcode, 1, 1);
246
247
- if (type > 1 || (rmode != 0 && opcode > 1)) {
248
+ if (rmode != 0 && opcode > 1) {
249
+ unallocated_encoding(s);
250
+ return;
251
+ }
252
+ switch (type) {
253
+ case 0: /* float32 */
254
+ case 1: /* float64 */
255
+ break;
256
+ case 3: /* float16 */
257
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
258
+ break;
259
+ }
260
+ /* fallthru */
261
+ default:
262
unallocated_encoding(s);
263
return;
264
}
265
--
266
2.17.0
267
268
diff view generated by jsdifflib
1
From: Julian Brown <julian@codesourcery.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add a new "cfgend" property which selects whether the CPU resets into
3
Cc: qemu-stable@nongnu.org
4
big-endian mode or not. This setting affects whether we reset with
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
SCTLR_B (ARMv6 and earlier) or SCTLR_EE (ARMv7 and later) set.
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Julian Brown <julian@codesourcery.com>
7
Message-id: 20180512003217.9105-5-richard.henderson@linaro.org
8
Message-id: 11420d1c49636c1790e60578ee996e51f0f0b835.1484929304.git.julian@codesourcery.com
9
[PMM: use error_report_err() rather than error_report();
10
move the integratorcp changes to their own patch;
11
drop an unnecessary extra #include;
12
rephrase commit message accordingly;
13
move setting of reset_sctlr above registration of cpregs
14
so it actually has an effect]
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
9
---
18
target/arm/cpu.h | 7 +++++++
10
target/arm/translate-a64.c | 17 +++++++++++++++--
19
target/arm/cpu.c | 13 +++++++++++++
11
1 file changed, 15 insertions(+), 2 deletions(-)
20
2 files changed, 20 insertions(+)
21
12
22
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
23
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
24
--- a/target/arm/cpu.h
15
--- a/target/arm/translate-a64.c
25
+++ b/target/arm/cpu.h
16
+++ b/target/arm/translate-a64.c
26
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
17
@@ -XXX,XX +XXX,XX @@ static void disas_fp_fixed_conv(DisasContext *s, uint32_t insn)
27
int gic_vpribits; /* number of virtual priority bits */
18
bool sf = extract32(insn, 31, 1);
28
int gic_vprebits; /* number of virtual preemption bits */
19
bool itof;
29
20
30
+ /* Whether the cfgend input is high (i.e. this CPU should reset into
21
- if (sbit || (type > 1)
31
+ * big-endian mode). This setting isn't used directly: instead it modifies
22
- || (!sf && scale < 32)) {
32
+ * the reset_sctlr value to have SCTLR_B or SCTLR_EE set, depending on the
23
+ if (sbit || (!sf && scale < 32)) {
33
+ * architecture version.
24
+ unallocated_encoding(s);
34
+ */
25
+ return;
35
+ bool cfgend;
36
+
37
ARMELChangeHook *el_change_hook;
38
void *el_change_hook_opaque;
39
};
40
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/cpu.c
43
+++ b/target/arm/cpu.c
44
@@ -XXX,XX +XXX,XX @@ static Property arm_cpu_has_el2_property =
45
static Property arm_cpu_has_el3_property =
46
DEFINE_PROP_BOOL("has_el3", ARMCPU, has_el3, true);
47
48
+static Property arm_cpu_cfgend_property =
49
+ DEFINE_PROP_BOOL("cfgend", ARMCPU, cfgend, false);
50
+
51
/* use property name "pmu" to match other archs and virt tools */
52
static Property arm_cpu_has_pmu_property =
53
DEFINE_PROP_BOOL("pmu", ARMCPU, has_pmu, true);
54
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_post_init(Object *obj)
55
}
56
}
57
58
+ qdev_property_add_static(DEVICE(obj), &arm_cpu_cfgend_property,
59
+ &error_abort);
60
}
61
62
static void arm_cpu_finalizefn(Object *obj)
63
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
64
cpu->reset_sctlr |= (1 << 13);
65
}
66
67
+ if (cpu->cfgend) {
68
+ if (arm_feature(&cpu->env, ARM_FEATURE_V7)) {
69
+ cpu->reset_sctlr |= SCTLR_EE;
70
+ } else {
71
+ cpu->reset_sctlr |= SCTLR_B;
72
+ }
73
+ }
26
+ }
74
+
27
+
75
if (!cpu->has_el3) {
28
+ switch (type) {
76
/* If the has_el3 CPU property is disabled then we need to disable the
29
+ case 0: /* float32 */
77
* feature.
30
+ case 1: /* float64 */
31
+ break;
32
+ case 3: /* float16 */
33
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
34
+ break;
35
+ }
36
+ /* fallthru */
37
+ default:
38
unallocated_encoding(s);
39
return;
40
}
78
--
41
--
79
2.7.4
42
2.17.0
80
43
81
44
diff view generated by jsdifflib
1
From: Julian Brown <julian@codesourcery.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Since the integratorcp board creates the CPU object directly
3
Cc: qemu-stable@nongnu.org
4
rather than via cpu_arm_init(), we have to call the CPU
5
class parse_features() method ourselves if we want to
6
support the user passing features via the -cpu command
7
line argument as well as just the cpu name. Do so.
8
9
Signed-off-by: Julian Brown <julian@codesourcery.com>
10
[PMM: split out into its own patch]
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 20180512003217.9105-6-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
9
---
14
hw/arm/integratorcp.c | 19 +++++++++++++++++--
10
target/arm/translate-a64.c | 30 ++++++++++++++----------------
15
1 file changed, 17 insertions(+), 2 deletions(-)
11
1 file changed, 14 insertions(+), 16 deletions(-)
16
12
17
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/integratorcp.c
15
--- a/target/arm/translate-a64.c
20
+++ b/hw/arm/integratorcp.c
16
+++ b/target/arm/translate-a64.c
21
@@ -XXX,XX +XXX,XX @@ static void integratorcp_init(MachineState *machine)
17
@@ -XXX,XX +XXX,XX @@ static TCGv_i32 read_fp_sreg(DisasContext *s, int reg)
22
const char *kernel_filename = machine->kernel_filename;
18
return v;
23
const char *kernel_cmdline = machine->kernel_cmdline;
19
}
24
const char *initrd_filename = machine->initrd_filename;
20
25
+ char **cpustr;
21
+static TCGv_i32 read_fp_hreg(DisasContext *s, int reg)
26
ObjectClass *cpu_oc;
22
+{
27
+ CPUClass *cc;
23
+ TCGv_i32 v = tcg_temp_new_i32();
28
Object *cpuobj;
24
+
29
ARMCPU *cpu;
25
+ tcg_gen_ld16u_i32(v, cpu_env, fp_reg_offset(s, reg, MO_16));
30
+ const char *typename;
26
+ return v;
31
MemoryRegion *address_space_mem = get_system_memory();
27
+}
32
MemoryRegion *ram = g_new(MemoryRegion, 1);
28
+
33
MemoryRegion *ram_alias = g_new(MemoryRegion, 1);
29
/* Clear the bits above an N-bit vector, for N = (is_q ? 128 : 64).
34
qemu_irq pic[32];
30
* If SVE is not enabled, then there are only 128 bits in the vector.
35
DeviceState *dev, *sic, *icp;
31
*/
36
int i;
32
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
37
+ Error *err = NULL;
33
static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
38
34
{
39
if (!cpu_model) {
35
TCGv_ptr fpst = NULL;
40
cpu_model = "arm926";
36
- TCGv_i32 tcg_op = tcg_temp_new_i32();
37
+ TCGv_i32 tcg_op = read_fp_hreg(s, rn);
38
TCGv_i32 tcg_res = tcg_temp_new_i32();
39
40
- read_vec_element_i32(s, tcg_op, rn, 0, MO_16);
41
-
42
switch (opcode) {
43
case 0x0: /* FMOV */
44
tcg_gen_mov_i32(tcg_res, tcg_op);
45
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_diff(DisasContext *s, uint32_t insn)
46
tcg_temp_free_i64(tcg_op2);
47
tcg_temp_free_i64(tcg_res);
48
} else {
49
- TCGv_i32 tcg_op1 = tcg_temp_new_i32();
50
- TCGv_i32 tcg_op2 = tcg_temp_new_i32();
51
+ TCGv_i32 tcg_op1 = read_fp_hreg(s, rn);
52
+ TCGv_i32 tcg_op2 = read_fp_hreg(s, rm);
53
TCGv_i64 tcg_res = tcg_temp_new_i64();
54
55
- read_vec_element_i32(s, tcg_op1, rn, 0, MO_16);
56
- read_vec_element_i32(s, tcg_op2, rm, 0, MO_16);
57
-
58
gen_helper_neon_mull_s16(tcg_res, tcg_op1, tcg_op2);
59
gen_helper_neon_addl_saturate_s32(tcg_res, cpu_env, tcg_res, tcg_res);
60
61
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_same_fp16(DisasContext *s,
62
63
fpst = get_fpstatus_ptr(true);
64
65
- tcg_op1 = tcg_temp_new_i32();
66
- tcg_op2 = tcg_temp_new_i32();
67
+ tcg_op1 = read_fp_hreg(s, rn);
68
+ tcg_op2 = read_fp_hreg(s, rm);
69
tcg_res = tcg_temp_new_i32();
70
71
- read_vec_element_i32(s, tcg_op1, rn, 0, MO_16);
72
- read_vec_element_i32(s, tcg_op2, rm, 0, MO_16);
73
-
74
switch (fpopcode) {
75
case 0x03: /* FMULX */
76
gen_helper_advsimd_mulxh(tcg_res, tcg_op1, tcg_op2, fpst);
77
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
41
}
78
}
42
79
43
- cpu_oc = cpu_class_by_name(TYPE_ARM_CPU, cpu_model);
80
if (is_scalar) {
44
+ cpustr = g_strsplit(cpu_model, ",", 2);
81
- TCGv_i32 tcg_op = tcg_temp_new_i32();
45
+
82
+ TCGv_i32 tcg_op = read_fp_hreg(s, rn);
46
+ cpu_oc = cpu_class_by_name(TYPE_ARM_CPU, cpustr[0]);
83
TCGv_i32 tcg_res = tcg_temp_new_i32();
47
if (!cpu_oc) {
84
48
fprintf(stderr, "Unable to find CPU definition\n");
85
- read_vec_element_i32(s, tcg_op, rn, 0, MO_16);
49
exit(1);
86
-
50
}
87
switch (fpop) {
51
+ typename = object_class_get_name(cpu_oc);
88
case 0x1a: /* FCVTNS */
52
+
89
case 0x1b: /* FCVTMS */
53
+ cc = CPU_CLASS(cpu_oc);
54
+ cc->parse_features(typename, cpustr[1], &err);
55
+ g_strfreev(cpustr);
56
+ if (err) {
57
+ error_report_err(err);
58
+ exit(1);
59
+ }
60
61
- cpuobj = object_new(object_class_get_name(cpu_oc));
62
+ cpuobj = object_new(typename);
63
64
/* By default ARM1176 CPUs have EL3 enabled. This board does not
65
* currently support EL3 so the CPU EL3 property is disabled before
66
--
90
--
67
2.7.4
91
2.17.0
68
92
69
93
diff view generated by jsdifflib
1
From: Julian Brown <julian@codesourcery.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Thumb-1 code has some issues in BE32 mode (as currently implemented). In
3
We missed all of the scalar fp16 binary operations.
4
short, since bytes are swapped within words at load time for BE32
5
executables, this also swaps pairs of adjacent Thumb-1 instructions.
6
4
7
This patch un-swaps those pairs of instructions again, both for execution,
5
Cc: qemu-stable@nongnu.org
8
and for disassembly. (The previous version of the patch always read four
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
bytes in arm_read_memory_func and then extracted the proper two bytes,
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
in a probably misguided attempt to match the behaviour of actual hardware
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
11
as described by e.g. the ARM9TDMI TRM, section 3.3 "Endian effects for
9
Message-id: 20180512003217.9105-7-richard.henderson@linaro.org
12
instruction fetches". It's less complicated to just read the correct
13
two bytes though.)
14
15
Signed-off-by: Julian Brown <julian@codesourcery.com>
16
Message-id: ca20462a044848000370318a8bd41dd0a4ed273f.1484929304.git.julian@codesourcery.com
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
---
11
---
20
include/disas/bfd.h | 7 +++++++
12
target/arm/translate-a64.c | 65 ++++++++++++++++++++++++++++++++++++++
21
target/arm/arm_ldst.h | 10 +++++++++-
13
1 file changed, 65 insertions(+)
22
disas.c | 1 +
23
target/arm/cpu.c | 23 +++++++++++++++++++++++
24
4 files changed, 40 insertions(+), 1 deletion(-)
25
14
26
diff --git a/include/disas/bfd.h b/include/disas/bfd.h
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
27
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
28
--- a/include/disas/bfd.h
17
--- a/target/arm/translate-a64.c
29
+++ b/include/disas/bfd.h
18
+++ b/target/arm/translate-a64.c
30
@@ -XXX,XX +XXX,XX @@ typedef struct disassemble_info {
19
@@ -XXX,XX +XXX,XX @@ static void handle_fp_2src_double(DisasContext *s, int opcode,
31
The bottom 16 bits are for the internal use of the disassembler. */
20
tcg_temp_free_i64(tcg_res);
32
unsigned long flags;
21
}
33
#define INSN_HAS_RELOC    0x80000000
22
34
+#define INSN_ARM_BE32    0x00010000
23
+/* Floating-point data-processing (2 source) - half precision */
35
PTR private_data;
24
+static void handle_fp_2src_half(DisasContext *s, int opcode,
36
25
+ int rd, int rn, int rm)
37
/* Function used to get bytes to disassemble. MEMADDR is the
26
+{
38
@@ -XXX,XX +XXX,XX @@ typedef struct disassemble_info {
27
+ TCGv_i32 tcg_op1;
39
(bfd_vma memaddr, bfd_byte *myaddr, int length,
28
+ TCGv_i32 tcg_op2;
40
     struct disassemble_info *info);
29
+ TCGv_i32 tcg_res;
41
30
+ TCGv_ptr fpst;
42
+ /* A place to stash the real read_memory_func if read_memory_func wants to
43
+ do some funky address arithmetic or similar (e.g. for ARM BE32 mode). */
44
+ int (*read_memory_inner_func)
45
+ (bfd_vma memaddr, bfd_byte *myaddr, int length,
46
+ struct disassemble_info *info);
47
+
31
+
48
/* Function which should be called if we get an error that we can't
32
+ tcg_res = tcg_temp_new_i32();
49
recover from. STATUS is the errno value from read_memory_func and
33
+ fpst = get_fpstatus_ptr(true);
50
MEMADDR is the address that we were trying to read. INFO is a
34
+ tcg_op1 = read_fp_hreg(s, rn);
51
diff --git a/target/arm/arm_ldst.h b/target/arm/arm_ldst.h
35
+ tcg_op2 = read_fp_hreg(s, rm);
52
index XXXXXXX..XXXXXXX 100644
36
+
53
--- a/target/arm/arm_ldst.h
37
+ switch (opcode) {
54
+++ b/target/arm/arm_ldst.h
38
+ case 0x0: /* FMUL */
55
@@ -XXX,XX +XXX,XX @@ static inline uint32_t arm_ldl_code(CPUARMState *env, target_ulong addr,
39
+ gen_helper_advsimd_mulh(tcg_res, tcg_op1, tcg_op2, fpst);
56
static inline uint16_t arm_lduw_code(CPUARMState *env, target_ulong addr,
40
+ break;
57
bool sctlr_b)
41
+ case 0x1: /* FDIV */
58
{
42
+ gen_helper_advsimd_divh(tcg_res, tcg_op1, tcg_op2, fpst);
59
- uint16_t insn = cpu_lduw_code(env, addr);
43
+ break;
60
+ uint16_t insn;
44
+ case 0x2: /* FADD */
61
+#ifndef CONFIG_USER_ONLY
45
+ gen_helper_advsimd_addh(tcg_res, tcg_op1, tcg_op2, fpst);
62
+ /* In big-endian (BE32) mode, adjacent Thumb instructions have been swapped
46
+ break;
63
+ within each word. Undo that now. */
47
+ case 0x3: /* FSUB */
64
+ if (sctlr_b) {
48
+ gen_helper_advsimd_subh(tcg_res, tcg_op1, tcg_op2, fpst);
65
+ addr ^= 2;
49
+ break;
50
+ case 0x4: /* FMAX */
51
+ gen_helper_advsimd_maxh(tcg_res, tcg_op1, tcg_op2, fpst);
52
+ break;
53
+ case 0x5: /* FMIN */
54
+ gen_helper_advsimd_minh(tcg_res, tcg_op1, tcg_op2, fpst);
55
+ break;
56
+ case 0x6: /* FMAXNM */
57
+ gen_helper_advsimd_maxnumh(tcg_res, tcg_op1, tcg_op2, fpst);
58
+ break;
59
+ case 0x7: /* FMINNM */
60
+ gen_helper_advsimd_minnumh(tcg_res, tcg_op1, tcg_op2, fpst);
61
+ break;
62
+ case 0x8: /* FNMUL */
63
+ gen_helper_advsimd_mulh(tcg_res, tcg_op1, tcg_op2, fpst);
64
+ tcg_gen_xori_i32(tcg_res, tcg_res, 0x8000);
65
+ break;
66
+ default:
67
+ g_assert_not_reached();
66
+ }
68
+ }
67
+#endif
68
+ insn = cpu_lduw_code(env, addr);
69
if (bswap_code(sctlr_b)) {
70
return bswap16(insn);
71
}
72
diff --git a/disas.c b/disas.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/disas.c
75
+++ b/disas.c
76
@@ -XXX,XX +XXX,XX @@ void target_disas(FILE *out, CPUState *cpu, target_ulong code,
77
78
s.cpu = cpu;
79
s.info.read_memory_func = target_read_memory;
80
+ s.info.read_memory_inner_func = NULL;
81
s.info.buffer_vma = code;
82
s.info.buffer_length = size;
83
s.info.print_address_func = generic_print_address;
84
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
85
index XXXXXXX..XXXXXXX 100644
86
--- a/target/arm/cpu.c
87
+++ b/target/arm/cpu.c
88
@@ -XXX,XX +XXX,XX @@ print_insn_thumb1(bfd_vma pc, disassemble_info *info)
89
return print_insn_arm(pc | 1, info);
90
}
91
92
+static int arm_read_memory_func(bfd_vma memaddr, bfd_byte *b,
93
+ int length, struct disassemble_info *info)
94
+{
95
+ assert(info->read_memory_inner_func);
96
+ assert((info->flags & INSN_ARM_BE32) == 0 || length == 2 || length == 4);
97
+
69
+
98
+ if ((info->flags & INSN_ARM_BE32) != 0 && length == 2) {
70
+ write_fp_sreg(s, rd, tcg_res);
99
+ assert(info->endian == BFD_ENDIAN_LITTLE);
71
+
100
+ return info->read_memory_inner_func(memaddr ^ 2, (bfd_byte *)b, 2,
72
+ tcg_temp_free_ptr(fpst);
101
+ info);
73
+ tcg_temp_free_i32(tcg_op1);
102
+ } else {
74
+ tcg_temp_free_i32(tcg_op2);
103
+ return info->read_memory_inner_func(memaddr, b, length, info);
75
+ tcg_temp_free_i32(tcg_res);
104
+ }
105
+}
76
+}
106
+
77
+
107
static void arm_disas_set_info(CPUState *cpu, disassemble_info *info)
78
/* Floating point data-processing (2 source)
108
{
79
* 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 0
109
ARMCPU *ac = ARM_CPU(cpu);
80
* +---+---+---+-----------+------+---+------+--------+-----+------+------+
110
@@ -XXX,XX +XXX,XX @@ static void arm_disas_set_info(CPUState *cpu, disassemble_info *info)
81
@@ -XXX,XX +XXX,XX @@ static void disas_fp_2src(DisasContext *s, uint32_t insn)
111
info->endian = BFD_ENDIAN_BIG;
82
}
112
#endif
83
handle_fp_2src_double(s, opcode, rd, rn, rm);
84
break;
85
+ case 3:
86
+ if (!arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
87
+ unallocated_encoding(s);
88
+ return;
89
+ }
90
+ if (!fp_access_check(s)) {
91
+ return;
92
+ }
93
+ handle_fp_2src_half(s, opcode, rd, rn, rm);
94
+ break;
95
default:
96
unallocated_encoding(s);
113
}
97
}
114
+ if (info->read_memory_inner_func == NULL) {
115
+ info->read_memory_inner_func = info->read_memory_func;
116
+ info->read_memory_func = arm_read_memory_func;
117
+ }
118
+ info->flags &= ~INSN_ARM_BE32;
119
+ if (arm_sctlr_b(env)) {
120
+ info->flags |= INSN_ARM_BE32;
121
+ }
122
}
123
124
static void arm_cpu_initfn(Object *obj)
125
--
98
--
126
2.7.4
99
2.17.0
127
100
128
101
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The Aspeed SoC includes a set of watchdog timers using 32-bit
3
We missed all of the scalar fp16 fma operations.
4
decrement counters, which can be based either on the APB clock or
5
a 1 MHz clock.
6
4
7
The watchdog timer is designed to prevent system deadlock and, in
5
Cc: qemu-stable@nongnu.org
8
general, it should be restarted before timeout. When a timeout occurs,
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
different types of signals can be generated, ARM reset, SOC reset,
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
System reset, CPU Interrupt, external signal or boot from alternate
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
11
block. The current model only performs the system reset function as
9
Message-id: 20180512003217.9105-8-richard.henderson@linaro.org
12
this is used by U-Boot and Linux.
13
14
Signed-off-by: Joel Stanley <joel@jms.id.au>
15
Message-id: 1485452251-1593-2-git-send-email-clg@kaod.org
16
[clg: - fixed compile breakage
17
- fixed io region size
18
- added watchdog_perform_action() on timer expiry
19
- wrote a commit log
20
- merged fixes from Andrew Jeffery to scale the reload value ]
21
Signed-off-by: Cédric Le Goater <clg@kaod.org>
22
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
24
---
11
---
25
hw/watchdog/Makefile.objs | 1 +
12
target/arm/translate-a64.c | 48 ++++++++++++++++++++++++++++++++++++++
26
include/hw/watchdog/wdt_aspeed.h | 32 ++++++
13
1 file changed, 48 insertions(+)
27
hw/watchdog/wdt_aspeed.c | 225 +++++++++++++++++++++++++++++++++++++++
28
3 files changed, 258 insertions(+)
29
create mode 100644 include/hw/watchdog/wdt_aspeed.h
30
create mode 100644 hw/watchdog/wdt_aspeed.c
31
14
32
diff --git a/hw/watchdog/Makefile.objs b/hw/watchdog/Makefile.objs
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
33
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/watchdog/Makefile.objs
17
--- a/target/arm/translate-a64.c
35
+++ b/hw/watchdog/Makefile.objs
18
+++ b/target/arm/translate-a64.c
36
@@ -XXX,XX +XXX,XX @@ common-obj-y += watchdog.o
19
@@ -XXX,XX +XXX,XX @@ static void handle_fp_3src_double(DisasContext *s, bool o0, bool o1,
37
common-obj-$(CONFIG_WDT_IB6300ESB) += wdt_i6300esb.o
20
tcg_temp_free_i64(tcg_res);
38
common-obj-$(CONFIG_WDT_IB700) += wdt_ib700.o
21
}
39
common-obj-$(CONFIG_WDT_DIAG288) += wdt_diag288.o
22
40
+common-obj-$(CONFIG_ASPEED_SOC) += wdt_aspeed.o
23
+/* Floating-point data-processing (3 source) - half precision */
41
diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_aspeed.h
24
+static void handle_fp_3src_half(DisasContext *s, bool o0, bool o1,
42
new file mode 100644
25
+ int rd, int rn, int rm, int ra)
43
index XXXXXXX..XXXXXXX
26
+{
44
--- /dev/null
27
+ TCGv_i32 tcg_op1, tcg_op2, tcg_op3;
45
+++ b/include/hw/watchdog/wdt_aspeed.h
28
+ TCGv_i32 tcg_res = tcg_temp_new_i32();
46
@@ -XXX,XX +XXX,XX @@
29
+ TCGv_ptr fpst = get_fpstatus_ptr(true);
47
+/*
48
+ * ASPEED Watchdog Controller
49
+ *
50
+ * Copyright (C) 2016-2017 IBM Corp.
51
+ *
52
+ * This code is licensed under the GPL version 2 or later. See the
53
+ * COPYING file in the top-level directory.
54
+ */
55
+#ifndef ASPEED_WDT_H
56
+#define ASPEED_WDT_H
57
+
30
+
58
+#include "hw/sysbus.h"
31
+ tcg_op1 = read_fp_hreg(s, rn);
32
+ tcg_op2 = read_fp_hreg(s, rm);
33
+ tcg_op3 = read_fp_hreg(s, ra);
59
+
34
+
60
+#define TYPE_ASPEED_WDT "aspeed.wdt"
35
+ /* These are fused multiply-add, and must be done as one
61
+#define ASPEED_WDT(obj) \
36
+ * floating point operation with no rounding between the
62
+ OBJECT_CHECK(AspeedWDTState, (obj), TYPE_ASPEED_WDT)
37
+ * multiplication and addition steps.
38
+ * NB that doing the negations here as separate steps is
39
+ * correct : an input NaN should come out with its sign bit
40
+ * flipped if it is a negated-input.
41
+ */
42
+ if (o1 == true) {
43
+ tcg_gen_xori_i32(tcg_op3, tcg_op3, 0x8000);
44
+ }
63
+
45
+
64
+#define ASPEED_WDT_REGS_MAX (0x20 / 4)
46
+ if (o0 != o1) {
47
+ tcg_gen_xori_i32(tcg_op1, tcg_op1, 0x8000);
48
+ }
65
+
49
+
66
+typedef struct AspeedWDTState {
50
+ gen_helper_advsimd_muladdh(tcg_res, tcg_op1, tcg_op2, tcg_op3, fpst);
67
+ /*< private >*/
68
+ SysBusDevice parent_obj;
69
+ QEMUTimer *timer;
70
+
51
+
71
+ /*< public >*/
52
+ write_fp_sreg(s, rd, tcg_res);
72
+ MemoryRegion iomem;
73
+ uint32_t regs[ASPEED_WDT_REGS_MAX];
74
+
53
+
75
+ uint32_t pclk_freq;
54
+ tcg_temp_free_ptr(fpst);
76
+} AspeedWDTState;
55
+ tcg_temp_free_i32(tcg_op1);
77
+
56
+ tcg_temp_free_i32(tcg_op2);
78
+#endif /* ASPEED_WDT_H */
57
+ tcg_temp_free_i32(tcg_op3);
79
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
58
+ tcg_temp_free_i32(tcg_res);
80
new file mode 100644
81
index XXXXXXX..XXXXXXX
82
--- /dev/null
83
+++ b/hw/watchdog/wdt_aspeed.c
84
@@ -XXX,XX +XXX,XX @@
85
+/*
86
+ * ASPEED Watchdog Controller
87
+ *
88
+ * Copyright (C) 2016-2017 IBM Corp.
89
+ *
90
+ * This code is licensed under the GPL version 2 or later. See the
91
+ * COPYING file in the top-level directory.
92
+ */
93
+
94
+#include "qemu/osdep.h"
95
+#include "qemu/log.h"
96
+#include "sysemu/watchdog.h"
97
+#include "hw/sysbus.h"
98
+#include "qemu/timer.h"
99
+#include "hw/watchdog/wdt_aspeed.h"
100
+
101
+#define WDT_STATUS (0x00 / 4)
102
+#define WDT_RELOAD_VALUE (0x04 / 4)
103
+#define WDT_RESTART (0x08 / 4)
104
+#define WDT_CTRL (0x0C / 4)
105
+#define WDT_CTRL_RESET_MODE_SOC (0x00 << 5)
106
+#define WDT_CTRL_RESET_MODE_FULL_CHIP (0x01 << 5)
107
+#define WDT_CTRL_1MHZ_CLK BIT(4)
108
+#define WDT_CTRL_WDT_EXT BIT(3)
109
+#define WDT_CTRL_WDT_INTR BIT(2)
110
+#define WDT_CTRL_RESET_SYSTEM BIT(1)
111
+#define WDT_CTRL_ENABLE BIT(0)
112
+
113
+#define WDT_TIMEOUT_STATUS (0x10 / 4)
114
+#define WDT_TIMEOUT_CLEAR (0x14 / 4)
115
+#define WDT_RESET_WDITH (0x18 / 4)
116
+
117
+#define WDT_RESTART_MAGIC 0x4755
118
+
119
+static bool aspeed_wdt_is_enabled(const AspeedWDTState *s)
120
+{
121
+ return s->regs[WDT_CTRL] & WDT_CTRL_ENABLE;
122
+}
59
+}
123
+
60
+
124
+static uint64_t aspeed_wdt_read(void *opaque, hwaddr offset, unsigned size)
61
/* Floating point data-processing (3 source)
125
+{
62
* 31 30 29 28 24 23 22 21 20 16 15 14 10 9 5 4 0
126
+ AspeedWDTState *s = ASPEED_WDT(opaque);
63
* +---+---+---+-----------+------+----+------+----+------+------+------+
127
+
64
@@ -XXX,XX +XXX,XX @@ static void disas_fp_3src(DisasContext *s, uint32_t insn)
128
+ offset >>= 2;
65
}
129
+
66
handle_fp_3src_double(s, o0, o1, rd, rn, rm, ra);
130
+ switch (offset) {
67
break;
131
+ case WDT_STATUS:
68
+ case 3:
132
+ return s->regs[WDT_STATUS];
69
+ if (!arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
133
+ case WDT_RELOAD_VALUE:
70
+ unallocated_encoding(s);
134
+ return s->regs[WDT_RELOAD_VALUE];
71
+ return;
135
+ case WDT_RESTART:
72
+ }
136
+ qemu_log_mask(LOG_GUEST_ERROR,
73
+ if (!fp_access_check(s)) {
137
+ "%s: read from write-only reg at offset 0x%"
74
+ return;
138
+ HWADDR_PRIx "\n", __func__, offset);
75
+ }
139
+ return 0;
76
+ handle_fp_3src_half(s, o0, o1, rd, rn, rm, ra);
140
+ case WDT_CTRL:
141
+ return s->regs[WDT_CTRL];
142
+ case WDT_TIMEOUT_STATUS:
143
+ case WDT_TIMEOUT_CLEAR:
144
+ case WDT_RESET_WDITH:
145
+ qemu_log_mask(LOG_UNIMP,
146
+ "%s: uninmplemented read at offset 0x%" HWADDR_PRIx "\n",
147
+ __func__, offset);
148
+ return 0;
149
+ default:
150
+ qemu_log_mask(LOG_GUEST_ERROR,
151
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
152
+ __func__, offset);
153
+ return 0;
154
+ }
155
+
156
+}
157
+
158
+static void aspeed_wdt_reload(AspeedWDTState *s, bool pclk)
159
+{
160
+ uint32_t reload;
161
+
162
+ if (pclk) {
163
+ reload = muldiv64(s->regs[WDT_RELOAD_VALUE], NANOSECONDS_PER_SECOND,
164
+ s->pclk_freq);
165
+ } else {
166
+ reload = s->regs[WDT_RELOAD_VALUE] * 1000;
167
+ }
168
+
169
+ if (aspeed_wdt_is_enabled(s)) {
170
+ timer_mod(s->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + reload);
171
+ }
172
+}
173
+
174
+static void aspeed_wdt_write(void *opaque, hwaddr offset, uint64_t data,
175
+ unsigned size)
176
+{
177
+ AspeedWDTState *s = ASPEED_WDT(opaque);
178
+ bool enable = data & WDT_CTRL_ENABLE;
179
+
180
+ offset >>= 2;
181
+
182
+ switch (offset) {
183
+ case WDT_STATUS:
184
+ qemu_log_mask(LOG_GUEST_ERROR,
185
+ "%s: write to read-only reg at offset 0x%"
186
+ HWADDR_PRIx "\n", __func__, offset);
187
+ break;
77
+ break;
188
+ case WDT_RELOAD_VALUE:
78
default:
189
+ s->regs[WDT_RELOAD_VALUE] = data;
79
unallocated_encoding(s);
190
+ break;
80
}
191
+ case WDT_RESTART:
192
+ if ((data & 0xFFFF) == WDT_RESTART_MAGIC) {
193
+ s->regs[WDT_STATUS] = s->regs[WDT_RELOAD_VALUE];
194
+ aspeed_wdt_reload(s, !(data & WDT_CTRL_1MHZ_CLK));
195
+ }
196
+ break;
197
+ case WDT_CTRL:
198
+ if (enable && !aspeed_wdt_is_enabled(s)) {
199
+ s->regs[WDT_CTRL] = data;
200
+ aspeed_wdt_reload(s, !(data & WDT_CTRL_1MHZ_CLK));
201
+ } else if (!enable && aspeed_wdt_is_enabled(s)) {
202
+ s->regs[WDT_CTRL] = data;
203
+ timer_del(s->timer);
204
+ }
205
+ break;
206
+ case WDT_TIMEOUT_STATUS:
207
+ case WDT_TIMEOUT_CLEAR:
208
+ case WDT_RESET_WDITH:
209
+ qemu_log_mask(LOG_UNIMP,
210
+ "%s: uninmplemented write at offset 0x%" HWADDR_PRIx "\n",
211
+ __func__, offset);
212
+ break;
213
+ default:
214
+ qemu_log_mask(LOG_GUEST_ERROR,
215
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
216
+ __func__, offset);
217
+ }
218
+ return;
219
+}
220
+
221
+static WatchdogTimerModel model = {
222
+ .wdt_name = TYPE_ASPEED_WDT,
223
+ .wdt_description = "Aspeed watchdog device",
224
+};
225
+
226
+static const VMStateDescription vmstate_aspeed_wdt = {
227
+ .name = "vmstate_aspeed_wdt",
228
+ .version_id = 0,
229
+ .minimum_version_id = 0,
230
+ .fields = (VMStateField[]) {
231
+ VMSTATE_TIMER_PTR(timer, AspeedWDTState),
232
+ VMSTATE_UINT32_ARRAY(regs, AspeedWDTState, ASPEED_WDT_REGS_MAX),
233
+ VMSTATE_END_OF_LIST()
234
+ }
235
+};
236
+
237
+static const MemoryRegionOps aspeed_wdt_ops = {
238
+ .read = aspeed_wdt_read,
239
+ .write = aspeed_wdt_write,
240
+ .endianness = DEVICE_LITTLE_ENDIAN,
241
+ .valid.min_access_size = 4,
242
+ .valid.max_access_size = 4,
243
+ .valid.unaligned = false,
244
+};
245
+
246
+static void aspeed_wdt_reset(DeviceState *dev)
247
+{
248
+ AspeedWDTState *s = ASPEED_WDT(dev);
249
+
250
+ s->regs[WDT_STATUS] = 0x3EF1480;
251
+ s->regs[WDT_RELOAD_VALUE] = 0x03EF1480;
252
+ s->regs[WDT_RESTART] = 0;
253
+ s->regs[WDT_CTRL] = 0;
254
+
255
+ timer_del(s->timer);
256
+}
257
+
258
+static void aspeed_wdt_timer_expired(void *dev)
259
+{
260
+ AspeedWDTState *s = ASPEED_WDT(dev);
261
+
262
+ qemu_log_mask(CPU_LOG_RESET, "Watchdog timer expired.\n");
263
+ watchdog_perform_action();
264
+ timer_del(s->timer);
265
+}
266
+
267
+#define PCLK_HZ 24000000
268
+
269
+static void aspeed_wdt_realize(DeviceState *dev, Error **errp)
270
+{
271
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
272
+ AspeedWDTState *s = ASPEED_WDT(dev);
273
+
274
+ s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, aspeed_wdt_timer_expired, dev);
275
+
276
+ /* FIXME: This setting should be derived from the SCU hw strapping
277
+ * register SCU70
278
+ */
279
+ s->pclk_freq = PCLK_HZ;
280
+
281
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_wdt_ops, s,
282
+ TYPE_ASPEED_WDT, ASPEED_WDT_REGS_MAX * 4);
283
+ sysbus_init_mmio(sbd, &s->iomem);
284
+}
285
+
286
+static void aspeed_wdt_class_init(ObjectClass *klass, void *data)
287
+{
288
+ DeviceClass *dc = DEVICE_CLASS(klass);
289
+
290
+ dc->realize = aspeed_wdt_realize;
291
+ dc->reset = aspeed_wdt_reset;
292
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
293
+ dc->vmsd = &vmstate_aspeed_wdt;
294
+}
295
+
296
+static const TypeInfo aspeed_wdt_info = {
297
+ .parent = TYPE_SYS_BUS_DEVICE,
298
+ .name = TYPE_ASPEED_WDT,
299
+ .instance_size = sizeof(AspeedWDTState),
300
+ .class_init = aspeed_wdt_class_init,
301
+};
302
+
303
+static void wdt_aspeed_register_types(void)
304
+{
305
+ watchdog_add_model(&model);
306
+ type_register_static(&aspeed_wdt_info);
307
+}
308
+
309
+type_init(wdt_aspeed_register_types)
310
--
81
--
311
2.7.4
82
2.17.0
312
83
313
84
diff view generated by jsdifflib
1
Add support for generating the ISS (Instruction Specific Syndrome)
1
From: Alex Bennée <alex.bennee@linaro.org>
2
for Data Abort exceptions taken from AArch32. These syndromes are
2
3
used by hypervisors for example to trap and emulate memory accesses.
3
These where missed out from the rest of the half-precision work.
4
4
5
This is the equivalent for AArch32 guests of the work done for AArch64
5
Cc: qemu-stable@nongnu.org
6
guests in commit aaa1f954d4cab243.
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180512003217.9105-9-richard.henderson@linaro.org
11
[rth: Diagnose lack of FP16 before fp_access_check]
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
10
---
14
---
11
target/arm/translate.h | 14 ++++
15
target/arm/helper-a64.h | 2 +
12
target/arm/translate-a64.c | 14 ----
16
target/arm/helper-a64.c | 10 +++++
13
target/arm/translate.c | 184 +++++++++++++++++++++++++++++++++------------
17
target/arm/translate-a64.c | 88 ++++++++++++++++++++++++++++++--------
14
3 files changed, 149 insertions(+), 63 deletions(-)
18
3 files changed, 83 insertions(+), 17 deletions(-)
15
19
16
diff --git a/target/arm/translate.h b/target/arm/translate.h
20
diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h
17
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate.h
22
--- a/target/arm/helper-a64.h
19
+++ b/target/arm/translate.h
23
+++ b/target/arm/helper-a64.h
20
@@ -XXX,XX +XXX,XX @@ static inline int default_exception_el(DisasContext *s)
24
@@ -XXX,XX +XXX,XX @@
21
? 3 : MAX(1, s->current_el);
25
DEF_HELPER_FLAGS_2(udiv64, TCG_CALL_NO_RWG_SE, i64, i64, i64)
26
DEF_HELPER_FLAGS_2(sdiv64, TCG_CALL_NO_RWG_SE, s64, s64, s64)
27
DEF_HELPER_FLAGS_1(rbit64, TCG_CALL_NO_RWG_SE, i64, i64)
28
+DEF_HELPER_3(vfp_cmph_a64, i64, f16, f16, ptr)
29
+DEF_HELPER_3(vfp_cmpeh_a64, i64, f16, f16, ptr)
30
DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, ptr)
31
DEF_HELPER_3(vfp_cmpes_a64, i64, f32, f32, ptr)
32
DEF_HELPER_3(vfp_cmpd_a64, i64, f64, f64, ptr)
33
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/helper-a64.c
36
+++ b/target/arm/helper-a64.c
37
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
38
return flags;
22
}
39
}
23
40
24
+static void disas_set_insn_syndrome(DisasContext *s, uint32_t syn)
41
+uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
25
+{
42
+{
26
+ /* We don't need to save all of the syndrome so we mask and shift
43
+ return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
27
+ * out unneeded bits to help the sleb128 encoder do a better job.
28
+ */
29
+ syn &= ARM_INSN_START_WORD2_MASK;
30
+ syn >>= ARM_INSN_START_WORD2_SHIFT;
31
+
32
+ /* We check and clear insn_start_idx to catch multiple updates. */
33
+ assert(s->insn_start_idx != 0);
34
+ tcg_set_insn_param(s->insn_start_idx, 2, syn);
35
+ s->insn_start_idx = 0;
36
+}
44
+}
37
+
45
+
38
/* target-specific extra values for is_jmp */
46
+uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
39
/* These instructions trap after executing, so the A32/T32 decoder must
47
+{
40
* defer them until after the conditional execution state has been updated.
48
+ return float_rel_to_flags(float16_compare(x, y, fp_status));
49
+}
50
+
51
uint64_t HELPER(vfp_cmps_a64)(float32 x, float32 y, void *fp_status)
52
{
53
return float_rel_to_flags(float32_compare_quiet(x, y, fp_status));
41
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
54
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
42
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/translate-a64.c
56
--- a/target/arm/translate-a64.c
44
+++ b/target/arm/translate-a64.c
57
+++ b/target/arm/translate-a64.c
45
@@ -XXX,XX +XXX,XX @@ static inline void gen_goto_tb(DisasContext *s, int n, uint64_t dest)
58
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
46
}
59
}
47
}
60
}
48
61
49
-static void disas_set_insn_syndrome(DisasContext *s, uint32_t syn)
62
-static void handle_fp_compare(DisasContext *s, bool is_double,
50
-{
63
+static void handle_fp_compare(DisasContext *s, int size,
51
- /* We don't need to save all of the syndrome so we mask and shift
64
unsigned int rn, unsigned int rm,
52
- * out uneeded bits to help the sleb128 encoder do a better job.
65
bool cmp_with_zero, bool signal_all_nans)
53
- */
54
- syn &= ARM_INSN_START_WORD2_MASK;
55
- syn >>= ARM_INSN_START_WORD2_SHIFT;
56
-
57
- /* We check and clear insn_start_idx to catch multiple updates. */
58
- assert(s->insn_start_idx != 0);
59
- tcg_set_insn_param(s->insn_start_idx, 2, syn);
60
- s->insn_start_idx = 0;
61
-}
62
-
63
static void unallocated_encoding(DisasContext *s)
64
{
66
{
65
/* Unallocated and reserved encodings are uncategorized */
67
TCGv_i64 tcg_flags = tcg_temp_new_i64();
66
diff --git a/target/arm/translate.c b/target/arm/translate.c
68
- TCGv_ptr fpst = get_fpstatus_ptr(false);
67
index XXXXXXX..XXXXXXX 100644
69
+ TCGv_ptr fpst = get_fpstatus_ptr(size == MO_16);
68
--- a/target/arm/translate.c
70
69
+++ b/target/arm/translate.c
71
- if (is_double) {
70
@@ -XXX,XX +XXX,XX @@ void arm_translate_init(void)
72
+ if (size == MO_64) {
71
a64_translate_init();
73
TCGv_i64 tcg_vn, tcg_vm;
72
}
74
73
75
tcg_vn = read_fp_dreg(s, rn);
74
+/* Flags for the disas_set_da_iss info argument:
76
@@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, bool is_double,
75
+ * lower bits hold the Rt register number, higher bits are flags.
77
tcg_temp_free_i64(tcg_vn);
76
+ */
78
tcg_temp_free_i64(tcg_vm);
77
+typedef enum ISSInfo {
79
} else {
78
+ ISSNone = 0,
80
- TCGv_i32 tcg_vn, tcg_vm;
79
+ ISSRegMask = 0x1f,
81
+ TCGv_i32 tcg_vn = tcg_temp_new_i32();
80
+ ISSInvalid = (1 << 5),
82
+ TCGv_i32 tcg_vm = tcg_temp_new_i32();
81
+ ISSIsAcqRel = (1 << 6),
83
82
+ ISSIsWrite = (1 << 7),
84
- tcg_vn = read_fp_sreg(s, rn);
83
+ ISSIs16Bit = (1 << 8),
85
+ read_vec_element_i32(s, tcg_vn, rn, 0, size);
84
+} ISSInfo;
86
if (cmp_with_zero) {
85
+
87
- tcg_vm = tcg_const_i32(0);
86
+/* Save the syndrome information for a Data Abort */
88
+ tcg_gen_movi_i32(tcg_vm, 0);
87
+static void disas_set_da_iss(DisasContext *s, TCGMemOp memop, ISSInfo issinfo)
89
} else {
88
+{
90
- tcg_vm = read_fp_sreg(s, rm);
89
+ uint32_t syn;
91
+ read_vec_element_i32(s, tcg_vm, rm, 0, size);
90
+ int sas = memop & MO_SIZE;
92
}
91
+ bool sse = memop & MO_SIGN;
93
- if (signal_all_nans) {
92
+ bool is_acqrel = issinfo & ISSIsAcqRel;
94
- gen_helper_vfp_cmpes_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
93
+ bool is_write = issinfo & ISSIsWrite;
95
- } else {
94
+ bool is_16bit = issinfo & ISSIs16Bit;
96
- gen_helper_vfp_cmps_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
95
+ int srt = issinfo & ISSRegMask;
97
+
96
+
98
+ switch (size) {
97
+ if (issinfo & ISSInvalid) {
99
+ case MO_32:
98
+ /* Some callsites want to conditionally provide ISS info,
100
+ if (signal_all_nans) {
99
+ * eg "only if this was not a writeback"
101
+ gen_helper_vfp_cmpes_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
100
+ */
102
+ } else {
103
+ gen_helper_vfp_cmps_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
104
+ }
105
+ break;
106
+ case MO_16:
107
+ if (signal_all_nans) {
108
+ gen_helper_vfp_cmpeh_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
109
+ } else {
110
+ gen_helper_vfp_cmph_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
111
+ }
112
+ break;
113
+ default:
114
+ g_assert_not_reached();
115
}
116
+
117
tcg_temp_free_i32(tcg_vn);
118
tcg_temp_free_i32(tcg_vm);
119
}
120
@@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, bool is_double,
121
static void disas_fp_compare(DisasContext *s, uint32_t insn)
122
{
123
unsigned int mos, type, rm, op, rn, opc, op2r;
124
+ int size;
125
126
mos = extract32(insn, 29, 3);
127
- type = extract32(insn, 22, 2); /* 0 = single, 1 = double */
128
+ type = extract32(insn, 22, 2);
129
rm = extract32(insn, 16, 5);
130
op = extract32(insn, 14, 2);
131
rn = extract32(insn, 5, 5);
132
opc = extract32(insn, 3, 2);
133
op2r = extract32(insn, 0, 3);
134
135
- if (mos || op || op2r || type > 1) {
136
+ if (mos || op || op2r) {
137
+ unallocated_encoding(s);
101
+ return;
138
+ return;
102
+ }
139
+ }
103
+
140
+
104
+ if (srt == 15) {
141
+ switch (type) {
105
+ /* For AArch32, insns where the src/dest is R15 never generate
142
+ case 0:
106
+ * ISS information. Catching that here saves checking at all
143
+ size = MO_32;
107
+ * the call sites.
144
+ break;
108
+ */
145
+ case 1:
146
+ size = MO_64;
147
+ break;
148
+ case 3:
149
+ size = MO_16;
150
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
151
+ break;
152
+ }
153
+ /* fallthru */
154
+ default:
155
unallocated_encoding(s);
156
return;
157
}
158
@@ -XXX,XX +XXX,XX @@ static void disas_fp_compare(DisasContext *s, uint32_t insn)
159
return;
160
}
161
162
- handle_fp_compare(s, type, rn, rm, opc & 1, opc & 2);
163
+ handle_fp_compare(s, size, rn, rm, opc & 1, opc & 2);
164
}
165
166
/* Floating point conditional compare
167
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
168
unsigned int mos, type, rm, cond, rn, op, nzcv;
169
TCGv_i64 tcg_flags;
170
TCGLabel *label_continue = NULL;
171
+ int size;
172
173
mos = extract32(insn, 29, 3);
174
- type = extract32(insn, 22, 2); /* 0 = single, 1 = double */
175
+ type = extract32(insn, 22, 2);
176
rm = extract32(insn, 16, 5);
177
cond = extract32(insn, 12, 4);
178
rn = extract32(insn, 5, 5);
179
op = extract32(insn, 4, 1);
180
nzcv = extract32(insn, 0, 4);
181
182
- if (mos || type > 1) {
183
+ if (mos) {
184
+ unallocated_encoding(s);
109
+ return;
185
+ return;
110
+ }
186
+ }
111
+
187
+
112
+ syn = syn_data_abort_with_iss(0, sas, sse, srt, 0, is_acqrel,
188
+ switch (type) {
113
+ 0, 0, 0, is_write, 0, is_16bit);
189
+ case 0:
114
+ disas_set_insn_syndrome(s, syn);
190
+ size = MO_32;
115
+}
191
+ break;
116
+
192
+ case 1:
117
static inline ARMMMUIdx get_a32_user_mem_index(DisasContext *s)
193
+ size = MO_64;
118
{
194
+ break;
119
/* Return the mmu_idx to use for A32/T32 "unprivileged load/store"
195
+ case 3:
120
@@ -XXX,XX +XXX,XX @@ static inline void gen_aa32_ld##SUFF(DisasContext *s, TCGv_i32 val, \
196
+ size = MO_16;
121
TCGv_i32 a32, int index) \
197
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
122
{ \
198
+ break;
123
gen_aa32_ld_i32(s, val, a32, index, OPC | s->be_data); \
199
+ }
124
+} \
200
+ /* fallthru */
125
+static inline void gen_aa32_ld##SUFF##_iss(DisasContext *s, \
201
+ default:
126
+ TCGv_i32 val, \
202
unallocated_encoding(s);
127
+ TCGv_i32 a32, int index, \
203
return;
128
+ ISSInfo issinfo) \
204
}
129
+{ \
205
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
130
+ gen_aa32_ld_i32(s, val, a32, index, OPC | s->be_data); \
206
gen_set_label(label_match);
131
+ disas_set_da_iss(s, OPC, issinfo); \
207
}
132
}
208
133
209
- handle_fp_compare(s, type, rn, rm, false, op);
134
#define DO_GEN_ST(SUFF, OPC) \
210
+ handle_fp_compare(s, size, rn, rm, false, op);
135
@@ -XXX,XX +XXX,XX @@ static inline void gen_aa32_st##SUFF(DisasContext *s, TCGv_i32 val, \
211
136
TCGv_i32 a32, int index) \
212
if (cond < 0x0e) {
137
{ \
213
gen_set_label(label_continue);
138
gen_aa32_st_i32(s, val, a32, index, OPC | s->be_data); \
139
+} \
140
+static inline void gen_aa32_st##SUFF##_iss(DisasContext *s, \
141
+ TCGv_i32 val, \
142
+ TCGv_i32 a32, int index, \
143
+ ISSInfo issinfo) \
144
+{ \
145
+ gen_aa32_st_i32(s, val, a32, index, OPC | s->be_data); \
146
+ disas_set_da_iss(s, OPC, issinfo | ISSIsWrite); \
147
}
148
149
static inline void gen_aa32_frob64(DisasContext *s, TCGv_i64 val)
150
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
151
tmp = tcg_temp_new_i32();
152
switch (op1) {
153
case 0: /* lda */
154
- gen_aa32_ld32u(s, tmp, addr,
155
- get_mem_index(s));
156
+ gen_aa32_ld32u_iss(s, tmp, addr,
157
+ get_mem_index(s),
158
+ rd | ISSIsAcqRel);
159
break;
160
case 2: /* ldab */
161
- gen_aa32_ld8u(s, tmp, addr,
162
- get_mem_index(s));
163
+ gen_aa32_ld8u_iss(s, tmp, addr,
164
+ get_mem_index(s),
165
+ rd | ISSIsAcqRel);
166
break;
167
case 3: /* ldah */
168
- gen_aa32_ld16u(s, tmp, addr,
169
- get_mem_index(s));
170
+ gen_aa32_ld16u_iss(s, tmp, addr,
171
+ get_mem_index(s),
172
+ rd | ISSIsAcqRel);
173
break;
174
default:
175
abort();
176
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
177
tmp = load_reg(s, rm);
178
switch (op1) {
179
case 0: /* stl */
180
- gen_aa32_st32(s, tmp, addr,
181
- get_mem_index(s));
182
+ gen_aa32_st32_iss(s, tmp, addr,
183
+ get_mem_index(s),
184
+ rm | ISSIsAcqRel);
185
break;
186
case 2: /* stlb */
187
- gen_aa32_st8(s, tmp, addr,
188
- get_mem_index(s));
189
+ gen_aa32_st8_iss(s, tmp, addr,
190
+ get_mem_index(s),
191
+ rm | ISSIsAcqRel);
192
break;
193
case 3: /* stlh */
194
- gen_aa32_st16(s, tmp, addr,
195
- get_mem_index(s));
196
+ gen_aa32_st16_iss(s, tmp, addr,
197
+ get_mem_index(s),
198
+ rm | ISSIsAcqRel);
199
break;
200
default:
201
abort();
202
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
203
bool wbit = insn & (1 << 21);
204
bool pbit = insn & (1 << 24);
205
bool doubleword = false;
206
+ ISSInfo issinfo;
207
+
208
/* Misc load/store */
209
rn = (insn >> 16) & 0xf;
210
rd = (insn >> 12) & 0xf;
211
212
+ /* ISS not valid if writeback */
213
+ issinfo = (pbit & !wbit) ? rd : ISSInvalid;
214
+
215
if (!load && (sh & 2)) {
216
/* doubleword */
217
ARCH(5TE);
218
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
219
tmp = tcg_temp_new_i32();
220
switch (sh) {
221
case 1:
222
- gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
223
+ gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s),
224
+ issinfo);
225
break;
226
case 2:
227
- gen_aa32_ld8s(s, tmp, addr, get_mem_index(s));
228
+ gen_aa32_ld8s_iss(s, tmp, addr, get_mem_index(s),
229
+ issinfo);
230
break;
231
default:
232
case 3:
233
- gen_aa32_ld16s(s, tmp, addr, get_mem_index(s));
234
+ gen_aa32_ld16s_iss(s, tmp, addr, get_mem_index(s),
235
+ issinfo);
236
break;
237
}
238
} else {
239
/* store */
240
tmp = load_reg(s, rd);
241
- gen_aa32_st16(s, tmp, addr, get_mem_index(s));
242
+ gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), issinfo);
243
tcg_temp_free_i32(tmp);
244
}
245
/* Perform base writeback before the loaded value to
246
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
247
/* load */
248
tmp = tcg_temp_new_i32();
249
if (insn & (1 << 22)) {
250
- gen_aa32_ld8u(s, tmp, tmp2, i);
251
+ gen_aa32_ld8u_iss(s, tmp, tmp2, i, rd);
252
} else {
253
- gen_aa32_ld32u(s, tmp, tmp2, i);
254
+ gen_aa32_ld32u_iss(s, tmp, tmp2, i, rd);
255
}
256
} else {
257
/* store */
258
tmp = load_reg(s, rd);
259
if (insn & (1 << 22)) {
260
- gen_aa32_st8(s, tmp, tmp2, i);
261
+ gen_aa32_st8_iss(s, tmp, tmp2, i, rd);
262
} else {
263
- gen_aa32_st32(s, tmp, tmp2, i);
264
+ gen_aa32_st32_iss(s, tmp, tmp2, i, rd);
265
}
266
tcg_temp_free_i32(tmp);
267
}
268
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
269
tmp = tcg_temp_new_i32();
270
switch (op) {
271
case 0: /* ldab */
272
- gen_aa32_ld8u(s, tmp, addr, get_mem_index(s));
273
+ gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s),
274
+ rs | ISSIsAcqRel);
275
break;
276
case 1: /* ldah */
277
- gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
278
+ gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s),
279
+ rs | ISSIsAcqRel);
280
break;
281
case 2: /* lda */
282
- gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
283
+ gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s),
284
+ rs | ISSIsAcqRel);
285
break;
286
default:
287
abort();
288
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
289
tmp = load_reg(s, rs);
290
switch (op) {
291
case 0: /* stlb */
292
- gen_aa32_st8(s, tmp, addr, get_mem_index(s));
293
+ gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s),
294
+ rs | ISSIsAcqRel);
295
break;
296
case 1: /* stlh */
297
- gen_aa32_st16(s, tmp, addr, get_mem_index(s));
298
+ gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s),
299
+ rs | ISSIsAcqRel);
300
break;
301
case 2: /* stl */
302
- gen_aa32_st32(s, tmp, addr, get_mem_index(s));
303
+ gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s),
304
+ rs | ISSIsAcqRel);
305
break;
306
default:
307
abort();
308
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
309
int postinc = 0;
310
int writeback = 0;
311
int memidx;
312
+ ISSInfo issinfo;
313
+
314
if ((insn & 0x01100000) == 0x01000000) {
315
if (disas_neon_ls_insn(s, insn)) {
316
goto illegal_op;
317
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
318
}
319
}
320
}
321
+
322
+ issinfo = writeback ? ISSInvalid : rs;
323
+
324
if (insn & (1 << 20)) {
325
/* Load. */
326
tmp = tcg_temp_new_i32();
327
switch (op) {
328
case 0:
329
- gen_aa32_ld8u(s, tmp, addr, memidx);
330
+ gen_aa32_ld8u_iss(s, tmp, addr, memidx, issinfo);
331
break;
332
case 4:
333
- gen_aa32_ld8s(s, tmp, addr, memidx);
334
+ gen_aa32_ld8s_iss(s, tmp, addr, memidx, issinfo);
335
break;
336
case 1:
337
- gen_aa32_ld16u(s, tmp, addr, memidx);
338
+ gen_aa32_ld16u_iss(s, tmp, addr, memidx, issinfo);
339
break;
340
case 5:
341
- gen_aa32_ld16s(s, tmp, addr, memidx);
342
+ gen_aa32_ld16s_iss(s, tmp, addr, memidx, issinfo);
343
break;
344
case 2:
345
- gen_aa32_ld32u(s, tmp, addr, memidx);
346
+ gen_aa32_ld32u_iss(s, tmp, addr, memidx, issinfo);
347
break;
348
default:
349
tcg_temp_free_i32(tmp);
350
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
351
tmp = load_reg(s, rs);
352
switch (op) {
353
case 0:
354
- gen_aa32_st8(s, tmp, addr, memidx);
355
+ gen_aa32_st8_iss(s, tmp, addr, memidx, issinfo);
356
break;
357
case 1:
358
- gen_aa32_st16(s, tmp, addr, memidx);
359
+ gen_aa32_st16_iss(s, tmp, addr, memidx, issinfo);
360
break;
361
case 2:
362
- gen_aa32_st32(s, tmp, addr, memidx);
363
+ gen_aa32_st32_iss(s, tmp, addr, memidx, issinfo);
364
break;
365
default:
366
tcg_temp_free_i32(tmp);
367
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
368
addr = tcg_temp_new_i32();
369
tcg_gen_movi_i32(addr, val);
370
tmp = tcg_temp_new_i32();
371
- gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
372
+ gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s),
373
+ rd | ISSIs16Bit);
374
tcg_temp_free_i32(addr);
375
store_reg(s, rd, tmp);
376
break;
377
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
378
379
switch (op) {
380
case 0: /* str */
381
- gen_aa32_st32(s, tmp, addr, get_mem_index(s));
382
+ gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
383
break;
384
case 1: /* strh */
385
- gen_aa32_st16(s, tmp, addr, get_mem_index(s));
386
+ gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
387
break;
388
case 2: /* strb */
389
- gen_aa32_st8(s, tmp, addr, get_mem_index(s));
390
+ gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
391
break;
392
case 3: /* ldrsb */
393
- gen_aa32_ld8s(s, tmp, addr, get_mem_index(s));
394
+ gen_aa32_ld8s_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
395
break;
396
case 4: /* ldr */
397
- gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
398
+ gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
399
break;
400
case 5: /* ldrh */
401
- gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
402
+ gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
403
break;
404
case 6: /* ldrb */
405
- gen_aa32_ld8u(s, tmp, addr, get_mem_index(s));
406
+ gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
407
break;
408
case 7: /* ldrsh */
409
- gen_aa32_ld16s(s, tmp, addr, get_mem_index(s));
410
+ gen_aa32_ld16s_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
411
break;
412
}
413
if (op >= 3) { /* load */
414
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
415
if (insn & (1 << 11)) {
416
/* load */
417
tmp = tcg_temp_new_i32();
418
- gen_aa32_ld8u(s, tmp, addr, get_mem_index(s));
419
+ gen_aa32_ld8u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
420
store_reg(s, rd, tmp);
421
} else {
422
/* store */
423
tmp = load_reg(s, rd);
424
- gen_aa32_st8(s, tmp, addr, get_mem_index(s));
425
+ gen_aa32_st8_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
426
tcg_temp_free_i32(tmp);
427
}
428
tcg_temp_free_i32(addr);
429
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
430
if (insn & (1 << 11)) {
431
/* load */
432
tmp = tcg_temp_new_i32();
433
- gen_aa32_ld16u(s, tmp, addr, get_mem_index(s));
434
+ gen_aa32_ld16u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
435
store_reg(s, rd, tmp);
436
} else {
437
/* store */
438
tmp = load_reg(s, rd);
439
- gen_aa32_st16(s, tmp, addr, get_mem_index(s));
440
+ gen_aa32_st16_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
441
tcg_temp_free_i32(tmp);
442
}
443
tcg_temp_free_i32(addr);
444
@@ -XXX,XX +XXX,XX @@ static void disas_thumb_insn(CPUARMState *env, DisasContext *s)
445
if (insn & (1 << 11)) {
446
/* load */
447
tmp = tcg_temp_new_i32();
448
- gen_aa32_ld32u(s, tmp, addr, get_mem_index(s));
449
+ gen_aa32_ld32u_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
450
store_reg(s, rd, tmp);
451
} else {
452
/* store */
453
tmp = load_reg(s, rd);
454
- gen_aa32_st32(s, tmp, addr, get_mem_index(s));
455
+ gen_aa32_st32_iss(s, tmp, addr, get_mem_index(s), rd | ISSIs16Bit);
456
tcg_temp_free_i32(tmp);
457
}
458
tcg_temp_free_i32(addr);
459
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code(CPUARMState *env, TranslationBlock *tb)
460
store_cpu_field(tmp, condexec_bits);
461
}
462
do {
463
+ dc->insn_start_idx = tcg_op_buf_count();
464
tcg_gen_insn_start(dc->pc,
465
(dc->condexec_cond << 4) | (dc->condexec_mask >> 1),
466
0);
467
--
214
--
468
2.7.4
215
2.17.0
469
216
470
217
diff view generated by jsdifflib
1
Create a new "unimplemented" sysbus device, which simply accepts
1
From: Alex Bennée <alex.bennee@linaro.org>
2
all read and write accesses, and implements them as read-as-zero,
3
write-ignored, with logging of the access as LOG_UNIMP.
4
2
5
This is useful for stubbing out bits of an SoC or board model
3
These were missed out from the rest of the half-precision work.
6
which haven't been written yet.
7
4
5
Cc: qemu-stable@nongnu.org
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180512003217.9105-10-richard.henderson@linaro.org
11
[rth: Fix erroneous check vs type]
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 1484247815-15279-3-git-send-email-peter.maydell@linaro.org
11
---
14
---
12
hw/misc/Makefile.objs | 2 +
15
target/arm/translate-a64.c | 31 +++++++++++++++++++++++++------
13
include/hw/misc/unimp.h | 39 ++++++++++++++++++
16
1 file changed, 25 insertions(+), 6 deletions(-)
14
hw/misc/unimp.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++
15
3 files changed, 148 insertions(+)
16
create mode 100644 include/hw/misc/unimp.h
17
create mode 100644 hw/misc/unimp.c
18
17
19
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
18
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
20
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/misc/Makefile.objs
20
--- a/target/arm/translate-a64.c
22
+++ b/hw/misc/Makefile.objs
21
+++ b/target/arm/translate-a64.c
23
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_SGA) += sga.o
22
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
24
common-obj-$(CONFIG_ISA_TESTDEV) += pc-testdev.o
23
unsigned int mos, type, rm, cond, rn, rd;
25
common-obj-$(CONFIG_PCI_TESTDEV) += pci-testdev.o
24
TCGv_i64 t_true, t_false, t_zero;
26
25
DisasCompare64 c;
27
+common-obj-y += unimp.o
26
+ TCGMemOp sz;
28
+
27
29
obj-$(CONFIG_VMPORT) += vmport.o
28
mos = extract32(insn, 29, 3);
30
29
- type = extract32(insn, 22, 2); /* 0 = single, 1 = double */
31
# ARM devices
30
+ type = extract32(insn, 22, 2);
32
diff --git a/include/hw/misc/unimp.h b/include/hw/misc/unimp.h
31
rm = extract32(insn, 16, 5);
33
new file mode 100644
32
cond = extract32(insn, 12, 4);
34
index XXXXXXX..XXXXXXX
33
rn = extract32(insn, 5, 5);
35
--- /dev/null
34
rd = extract32(insn, 0, 5);
36
+++ b/include/hw/misc/unimp.h
35
37
@@ -XXX,XX +XXX,XX @@
36
- if (mos || type > 1) {
38
+/*
37
+ if (mos) {
39
+ * "Unimplemented" device
38
+ unallocated_encoding(s);
40
+ *
41
+ * Copyright Linaro Limited, 2017
42
+ * Written by Peter Maydell
43
+ */
44
+
45
+#ifndef HW_MISC_UNIMP_H
46
+#define HW_MISC_UNIMP_H
47
+
48
+#define TYPE_UNIMPLEMENTED_DEVICE "unimplemented-device"
49
+
50
+/**
51
+ * create_unimplemented_device: create and map a dummy device
52
+ * @name: name of the device for debug logging
53
+ * @base: base address of the device's MMIO region
54
+ * @size: size of the device's MMIO region
55
+ *
56
+ * This utility function creates and maps an instance of unimplemented-device,
57
+ * which is a dummy device which simply logs all guest accesses to
58
+ * it via the qemu_log LOG_UNIMP debug log.
59
+ * The device is mapped at priority -1000, which means that you can
60
+ * use it to cover a large region and then map other devices on top of it
61
+ * if necessary.
62
+ */
63
+static inline void create_unimplemented_device(const char *name,
64
+ hwaddr base,
65
+ hwaddr size)
66
+{
67
+ DeviceState *dev = qdev_create(NULL, TYPE_UNIMPLEMENTED_DEVICE);
68
+
69
+ qdev_prop_set_string(dev, "name", name);
70
+ qdev_prop_set_uint64(dev, "size", size);
71
+ qdev_init_nofail(dev);
72
+
73
+ sysbus_mmio_map_overlap(SYS_BUS_DEVICE(dev), 0, base, -1000);
74
+}
75
+
76
+#endif
77
diff --git a/hw/misc/unimp.c b/hw/misc/unimp.c
78
new file mode 100644
79
index XXXXXXX..XXXXXXX
80
--- /dev/null
81
+++ b/hw/misc/unimp.c
82
@@ -XXX,XX +XXX,XX @@
83
+/* "Unimplemented" device
84
+ *
85
+ * This is a dummy device which accepts and logs all accesses.
86
+ * It's useful for stubbing out regions of an SoC or board
87
+ * map which correspond to devices that have not yet been
88
+ * implemented. This is often sufficient to placate initial
89
+ * guest device driver probing such that the system will
90
+ * come up.
91
+ *
92
+ * Copyright Linaro Limited, 2017
93
+ * Written by Peter Maydell
94
+ */
95
+
96
+#include "qemu/osdep.h"
97
+#include "hw/hw.h"
98
+#include "hw/sysbus.h"
99
+#include "hw/misc/unimp.h"
100
+#include "qemu/log.h"
101
+#include "qapi/error.h"
102
+
103
+#define UNIMPLEMENTED_DEVICE(obj) \
104
+ OBJECT_CHECK(UnimplementedDeviceState, (obj), TYPE_UNIMPLEMENTED_DEVICE)
105
+
106
+typedef struct {
107
+ SysBusDevice parent_obj;
108
+ MemoryRegion iomem;
109
+ char *name;
110
+ uint64_t size;
111
+} UnimplementedDeviceState;
112
+
113
+static uint64_t unimp_read(void *opaque, hwaddr offset, unsigned size)
114
+{
115
+ UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(opaque);
116
+
117
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read "
118
+ "(size %d, offset 0x%" HWADDR_PRIx ")\n",
119
+ s->name, size, offset);
120
+ return 0;
121
+}
122
+
123
+static void unimp_write(void *opaque, hwaddr offset,
124
+ uint64_t value, unsigned size)
125
+{
126
+ UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(opaque);
127
+
128
+ qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write "
129
+ "(size %d, value 0x%" PRIx64
130
+ ", offset 0x%" HWADDR_PRIx ")\n",
131
+ s->name, size, value, offset);
132
+}
133
+
134
+static const MemoryRegionOps unimp_ops = {
135
+ .read = unimp_read,
136
+ .write = unimp_write,
137
+ .impl.min_access_size = 1,
138
+ .impl.max_access_size = 8,
139
+ .valid.min_access_size = 1,
140
+ .valid.max_access_size = 8,
141
+ .endianness = DEVICE_NATIVE_ENDIAN,
142
+};
143
+
144
+static void unimp_realize(DeviceState *dev, Error **errp)
145
+{
146
+ UnimplementedDeviceState *s = UNIMPLEMENTED_DEVICE(dev);
147
+
148
+ if (s->size == 0) {
149
+ error_setg(errp, "property 'size' not specified or zero");
150
+ return;
39
+ return;
151
+ }
40
+ }
152
+
41
+
153
+ if (s->name == NULL) {
42
+ switch (type) {
154
+ error_setg(errp, "property 'name' not specified");
43
+ case 0:
155
+ return;
44
+ sz = MO_32;
156
+ }
45
+ break;
157
+
46
+ case 1:
158
+ memory_region_init_io(&s->iomem, OBJECT(s), &unimp_ops, s,
47
+ sz = MO_64;
159
+ s->name, s->size);
48
+ break;
160
+ sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem);
49
+ case 3:
161
+}
50
+ sz = MO_16;
162
+
51
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
163
+static Property unimp_properties[] = {
52
+ break;
164
+ DEFINE_PROP_UINT64("size", UnimplementedDeviceState, size, 0),
53
+ }
165
+ DEFINE_PROP_STRING("name", UnimplementedDeviceState, name),
54
+ /* fallthru */
166
+ DEFINE_PROP_END_OF_LIST(),
55
+ default:
167
+};
56
unallocated_encoding(s);
168
+
57
return;
169
+static void unimp_class_init(ObjectClass *klass, void *data)
58
}
170
+{
59
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
171
+ DeviceClass *dc = DEVICE_CLASS(klass);
60
return;
172
+
61
}
173
+ dc->realize = unimp_realize;
62
174
+ dc->props = unimp_properties;
63
- /* Zero extend sreg inputs to 64 bits now. */
175
+}
64
+ /* Zero extend sreg & hreg inputs to 64 bits now. */
176
+
65
t_true = tcg_temp_new_i64();
177
+static const TypeInfo unimp_info = {
66
t_false = tcg_temp_new_i64();
178
+ .name = TYPE_UNIMPLEMENTED_DEVICE,
67
- read_vec_element(s, t_true, rn, 0, type ? MO_64 : MO_32);
179
+ .parent = TYPE_SYS_BUS_DEVICE,
68
- read_vec_element(s, t_false, rm, 0, type ? MO_64 : MO_32);
180
+ .instance_size = sizeof(UnimplementedDeviceState),
69
+ read_vec_element(s, t_true, rn, 0, sz);
181
+ .class_init = unimp_class_init,
70
+ read_vec_element(s, t_false, rm, 0, sz);
182
+};
71
183
+
72
a64_test_cc(&c, cond);
184
+static void unimp_register_types(void)
73
t_zero = tcg_const_i64(0);
185
+{
74
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
186
+ type_register_static(&unimp_info);
75
tcg_temp_free_i64(t_false);
187
+}
76
a64_free_cc(&c);
188
+
77
189
+type_init(unimp_register_types)
78
- /* Note that sregs write back zeros to the high bits,
79
+ /* Note that sregs & hregs write back zeros to the high bits,
80
and we've already done the zero-extension. */
81
write_fp_dreg(s, rd, t_true);
82
tcg_temp_free_i64(t_true);
190
--
83
--
191
2.7.4
84
2.17.0
192
85
193
86
diff view generated by jsdifflib
1
From: Cédric Le Goater <clg@kaod.org>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
This enables reboot of a guest from U-Boot and Linux.
3
All the hard work is already done by vfp_expand_imm, we just need to
4
make sure we pick up the correct size.
4
5
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Cc: qemu-stable@nongnu.org
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 1485452251-1593-3-git-send-email-clg@kaod.org
8
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20180512003217.9105-11-richard.henderson@linaro.org
12
[rth: Merge unallocated_encoding check with TCGMemOp conversion.]
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
15
---
10
include/hw/arm/aspeed_soc.h | 2 ++
16
target/arm/translate-a64.c | 20 +++++++++++++++++---
11
hw/arm/aspeed_soc.c | 13 +++++++++++++
17
1 file changed, 17 insertions(+), 3 deletions(-)
12
2 files changed, 15 insertions(+)
13
18
14
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
19
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/arm/aspeed_soc.h
21
--- a/target/arm/translate-a64.c
17
+++ b/include/hw/arm/aspeed_soc.h
22
+++ b/target/arm/translate-a64.c
18
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
19
#include "hw/timer/aspeed_timer.h"
24
{
20
#include "hw/i2c/aspeed_i2c.h"
25
int rd = extract32(insn, 0, 5);
21
#include "hw/ssi/aspeed_smc.h"
26
int imm8 = extract32(insn, 13, 8);
22
+#include "hw/watchdog/wdt_aspeed.h"
27
- int is_double = extract32(insn, 22, 2);
23
28
+ int type = extract32(insn, 22, 2);
24
#define ASPEED_SPIS_NUM 2
29
uint64_t imm;
25
30
TCGv_i64 tcg_res;
26
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCState {
31
+ TCGMemOp sz;
27
AspeedSMCState fmc;
32
28
AspeedSMCState spi[ASPEED_SPIS_NUM];
33
- if (is_double > 1) {
29
AspeedSDMCState sdmc;
34
+ switch (type) {
30
+ AspeedWDTState wdt;
35
+ case 0:
31
} AspeedSoCState;
36
+ sz = MO_32;
32
37
+ break;
33
#define TYPE_ASPEED_SOC "aspeed-soc"
38
+ case 1:
34
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
39
+ sz = MO_64;
35
index XXXXXXX..XXXXXXX 100644
40
+ break;
36
--- a/hw/arm/aspeed_soc.c
41
+ case 3:
37
+++ b/hw/arm/aspeed_soc.c
42
+ sz = MO_16;
38
@@ -XXX,XX +XXX,XX @@
43
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
39
#define ASPEED_SOC_SCU_BASE 0x1E6E2000
44
+ break;
40
#define ASPEED_SOC_SRAM_BASE 0x1E720000
45
+ }
41
#define ASPEED_SOC_TIMER_BASE 0x1E782000
46
+ /* fallthru */
42
+#define ASPEED_SOC_WDT_BASE 0x1E785000
47
+ default:
43
#define ASPEED_SOC_I2C_BASE 0x1E78A000
48
unallocated_encoding(s);
44
45
static const int uart_irqs[] = { 9, 32, 33, 34, 10 };
46
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
47
sc->info->silicon_rev);
48
object_property_add_alias(obj, "ram-size", OBJECT(&s->sdmc),
49
"ram-size", &error_abort);
50
+
51
+ object_initialize(&s->wdt, sizeof(s->wdt), TYPE_ASPEED_WDT);
52
+ object_property_add_child(obj, "wdt", OBJECT(&s->wdt), NULL);
53
+ qdev_set_parent_bus(DEVICE(&s->wdt), sysbus_get_default());
54
}
55
56
static void aspeed_soc_realize(DeviceState *dev, Error **errp)
57
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
58
return;
49
return;
59
}
50
}
60
sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdmc), 0, ASPEED_SOC_SDMC_BASE);
51
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
61
+
52
return;
62
+ /* Watch dog */
53
}
63
+ object_property_set_bool(OBJECT(&s->wdt), true, "realized", &err);
54
64
+ if (err) {
55
- imm = vfp_expand_imm(MO_32 + is_double, imm8);
65
+ error_propagate(errp, err);
56
+ imm = vfp_expand_imm(sz, imm8);
66
+ return;
57
67
+ }
58
tcg_res = tcg_const_i64(imm);
68
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt), 0, ASPEED_SOC_WDT_BASE);
59
write_fp_dreg(s, rd, tcg_res);
69
}
70
71
static void aspeed_soc_class_init(ObjectClass *oc, void *data)
72
--
60
--
73
2.7.4
61
2.17.0
74
62
75
63
diff view generated by jsdifflib
1
From: Prasad J Pandit <pjp@fedoraproject.org>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
While doing multi block SDMA transfer in routine
3
We are meant to explicitly pass fpst, not cpu_env.
4
'sdhci_sdma_transfer_multi_blocks', the 's->fifo_buffer' starting
5
index 'begin' and data length 's->data_count' could end up to be same.
6
This could lead to an OOB access issue. Correct transfer data length
7
to avoid it.
8
4
9
Cc: qemu-stable@nongnu.org
5
Cc: qemu-stable@nongnu.org
10
Reported-by: Jiang Xin <jiangxin1@huawei.com>
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
11
Signed-off-by: Prasad J Pandit <pjp@fedoraproject.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20170130064736.9236-1-ppandit@redhat.com
9
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 20180512003217.9105-12-richard.henderson@linaro.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
12
---
16
hw/sd/sdhci.c | 2 +-
13
target/arm/translate-a64.c | 3 ++-
17
1 file changed, 1 insertion(+), 1 deletion(-)
14
1 file changed, 2 insertions(+), 1 deletion(-)
18
15
19
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
16
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
20
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/sd/sdhci.c
18
--- a/target/arm/translate-a64.c
22
+++ b/hw/sd/sdhci.c
19
+++ b/target/arm/translate-a64.c
23
@@ -XXX,XX +XXX,XX @@ static void sdhci_sdma_transfer_multi_blocks(SDHCIState *s)
20
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
24
boundary_count -= block_size - begin;
21
tcg_gen_xori_i32(tcg_res, tcg_op, 0x8000);
25
}
22
break;
26
dma_memory_read(&address_space_memory, s->sdmasysad,
23
case 0x3: /* FSQRT */
27
- &s->fifo_buffer[begin], s->data_count);
24
- gen_helper_sqrt_f16(tcg_res, tcg_op, cpu_env);
28
+ &s->fifo_buffer[begin], s->data_count - begin);
25
+ fpst = get_fpstatus_ptr(true);
29
s->sdmasysad += s->data_count - begin;
26
+ gen_helper_sqrt_f16(tcg_res, tcg_op, fpst);
30
if (s->data_count == block_size) {
27
break;
31
for (n = 0; n < block_size; n++) {
28
case 0x8: /* FRINTN */
29
case 0x9: /* FRINTP */
32
--
30
--
33
2.7.4
31
2.17.0
34
32
35
33
diff view generated by jsdifflib
1
From: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
VMState added by this patch preserves correct
3
Per the Physical Layer Simplified Spec. "4.3.10.4 Switch Function Status":
4
loading of the integratorcp device state.
5
4
6
Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
5
The block length is predefined to 512 bits
7
Message-id: 20170131114310.6768.79416.stgit@PASHA-ISP
6
8
[PMM: removed unnecessary minimum_version_id_old lines]
7
and "4.10.2 SD Status":
8
9
The SD Status contains status bits that are related to the SD Memory Card
10
proprietary features and may be used for future application-specific usage.
11
The size of the SD Status is one data block of 512 bit. The content of this
12
register is transmitted to the Host over the DAT bus along with a 16-bit CRC.
13
14
Thus the 16-bit CRC goes at offset 64.
15
16
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20180509060104.4458-3-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
20
---
12
hw/arm/integratorcp.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++
21
hw/sd/sd.c | 2 +-
13
1 file changed, 59 insertions(+)
22
1 file changed, 1 insertion(+), 1 deletion(-)
14
23
15
diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
16
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/integratorcp.c
26
--- a/hw/sd/sd.c
18
+++ b/hw/arm/integratorcp.c
27
+++ b/hw/sd/sd.c
19
@@ -XXX,XX +XXX,XX @@ static uint8_t integrator_spd[128] = {
28
@@ -XXX,XX +XXX,XX @@ static void sd_function_switch(SDState *sd, uint32_t arg)
20
0xe, 4, 0x1c, 1, 2, 0x20, 0xc0, 0, 0, 0, 0, 0x30, 0x28, 0x30, 0x28, 0x40
29
sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
21
};
30
}
22
31
memset(&sd->data[17], 0, 47);
23
+static const VMStateDescription vmstate_integratorcm = {
32
- stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
24
+ .name = "integratorcm",
33
+ stw_be_p(sd->data + 64, sd_crc16(sd->data, 64));
25
+ .version_id = 1,
26
+ .minimum_version_id = 1,
27
+ .fields = (VMStateField[]) {
28
+ VMSTATE_UINT32(cm_osc, IntegratorCMState),
29
+ VMSTATE_UINT32(cm_ctrl, IntegratorCMState),
30
+ VMSTATE_UINT32(cm_lock, IntegratorCMState),
31
+ VMSTATE_UINT32(cm_auxosc, IntegratorCMState),
32
+ VMSTATE_UINT32(cm_sdram, IntegratorCMState),
33
+ VMSTATE_UINT32(cm_init, IntegratorCMState),
34
+ VMSTATE_UINT32(cm_flags, IntegratorCMState),
35
+ VMSTATE_UINT32(cm_nvflags, IntegratorCMState),
36
+ VMSTATE_UINT32(int_level, IntegratorCMState),
37
+ VMSTATE_UINT32(irq_enabled, IntegratorCMState),
38
+ VMSTATE_UINT32(fiq_enabled, IntegratorCMState),
39
+ VMSTATE_END_OF_LIST()
40
+ }
41
+};
42
+
43
static uint64_t integratorcm_read(void *opaque, hwaddr offset,
44
unsigned size)
45
{
46
@@ -XXX,XX +XXX,XX @@ typedef struct icp_pic_state {
47
qemu_irq parent_fiq;
48
} icp_pic_state;
49
50
+static const VMStateDescription vmstate_icp_pic = {
51
+ .name = "icp_pic",
52
+ .version_id = 1,
53
+ .minimum_version_id = 1,
54
+ .fields = (VMStateField[]) {
55
+ VMSTATE_UINT32(level, icp_pic_state),
56
+ VMSTATE_UINT32(irq_enabled, icp_pic_state),
57
+ VMSTATE_UINT32(fiq_enabled, icp_pic_state),
58
+ VMSTATE_END_OF_LIST()
59
+ }
60
+};
61
+
62
static void icp_pic_update(icp_pic_state *s)
63
{
64
uint32_t flags;
65
@@ -XXX,XX +XXX,XX @@ typedef struct ICPCtrlRegsState {
66
#define ICP_INTREG_WPROT (1 << 0)
67
#define ICP_INTREG_CARDIN (1 << 3)
68
69
+static const VMStateDescription vmstate_icp_control = {
70
+ .name = "icp_control",
71
+ .version_id = 1,
72
+ .minimum_version_id = 1,
73
+ .fields = (VMStateField[]) {
74
+ VMSTATE_UINT32(intreg_state, ICPCtrlRegsState),
75
+ VMSTATE_END_OF_LIST()
76
+ }
77
+};
78
+
79
static uint64_t icp_control_read(void *opaque, hwaddr offset,
80
unsigned size)
81
{
82
@@ -XXX,XX +XXX,XX @@ static void core_class_init(ObjectClass *klass, void *data)
83
84
dc->props = core_properties;
85
dc->realize = integratorcm_realize;
86
+ dc->vmsd = &vmstate_integratorcm;
87
+}
88
+
89
+static void icp_pic_class_init(ObjectClass *klass, void *data)
90
+{
91
+ DeviceClass *dc = DEVICE_CLASS(klass);
92
+
93
+ dc->vmsd = &vmstate_icp_pic;
94
+}
95
+
96
+static void icp_control_class_init(ObjectClass *klass, void *data)
97
+{
98
+ DeviceClass *dc = DEVICE_CLASS(klass);
99
+
100
+ dc->vmsd = &vmstate_icp_control;
101
}
34
}
102
35
103
static const TypeInfo core_info = {
36
static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
104
@@ -XXX,XX +XXX,XX @@ static const TypeInfo icp_pic_info = {
105
.parent = TYPE_SYS_BUS_DEVICE,
106
.instance_size = sizeof(icp_pic_state),
107
.instance_init = icp_pic_init,
108
+ .class_init = icp_pic_class_init,
109
};
110
111
static const TypeInfo icp_ctrl_regs_info = {
112
@@ -XXX,XX +XXX,XX @@ static const TypeInfo icp_ctrl_regs_info = {
113
.parent = TYPE_SYS_BUS_DEVICE,
114
.instance_size = sizeof(ICPCtrlRegsState),
115
.instance_init = icp_control_init,
116
+ .class_init = icp_control_class_init,
117
};
118
119
static void integratorcp_register_types(void)
120
--
37
--
121
2.7.4
38
2.17.0
122
39
123
40
diff view generated by jsdifflib
1
In the ARM ldr/str decode path, rather than directly testing
1
Usually the logging of the CPU state produced by -d cpu is sufficient
2
"insn & (1 << 21)" and "insn & (1 << 24)", abstract these
2
to diagnose problems, but sometimes you want to see the state of
3
bits out into wbit and pbit local flags. (We will want to
3
the floating point registers as well. We don't want to enable that
4
do more tests against them to determine whether we need to
4
by default as it adds a lot of extra data to the log; instead,
5
provide syndrome information.)
5
allow it to be optionally enabled via -d fpu.
6
6
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180510130024.31678-1-peter.maydell@linaro.org
9
---
10
---
10
target/arm/translate.c | 9 ++++++---
11
include/qemu/log.h | 1 +
11
1 file changed, 6 insertions(+), 3 deletions(-)
12
accel/tcg/cpu-exec.c | 9 ++++++---
13
util/log.c | 2 ++
14
3 files changed, 9 insertions(+), 3 deletions(-)
12
15
13
diff --git a/target/arm/translate.c b/target/arm/translate.c
16
diff --git a/include/qemu/log.h b/include/qemu/log.h
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.c
18
--- a/include/qemu/log.h
16
+++ b/target/arm/translate.c
19
+++ b/include/qemu/log.h
17
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
20
@@ -XXX,XX +XXX,XX @@ static inline bool qemu_log_separate(void)
18
} else {
21
#define CPU_LOG_PAGE (1 << 14)
19
int address_offset;
22
/* LOG_TRACE (1 << 15) is defined in log-for-trace.h */
20
bool load = insn & (1 << 20);
23
#define CPU_LOG_TB_OP_IND (1 << 16)
21
+ bool wbit = insn & (1 << 21);
24
+#define CPU_LOG_TB_FPU (1 << 17)
22
+ bool pbit = insn & (1 << 24);
25
23
bool doubleword = false;
26
/* Lock output for a series of related logs. Since this is not needed
24
/* Misc load/store */
27
* for a single qemu_log / qemu_log_mask / qemu_log_mask_and_addr, we
25
rn = (insn >> 16) & 0xf;
28
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
26
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
29
index XXXXXXX..XXXXXXX 100644
27
}
30
--- a/accel/tcg/cpu-exec.c
28
31
+++ b/accel/tcg/cpu-exec.c
29
addr = load_reg(s, rn);
32
@@ -XXX,XX +XXX,XX @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb)
30
- if (insn & (1 << 24))
33
if (qemu_loglevel_mask(CPU_LOG_TB_CPU)
31
+ if (pbit) {
34
&& qemu_log_in_addr_range(itb->pc)) {
32
gen_add_datah_offset(s, insn, 0, addr);
35
qemu_log_lock();
33
+ }
36
+ int flags = 0;
34
address_offset = 0;
37
+ if (qemu_loglevel_mask(CPU_LOG_TB_FPU)) {
35
38
+ flags |= CPU_DUMP_FPU;
36
if (doubleword) {
39
+ }
37
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
40
#if defined(TARGET_I386)
38
ensure correct behavior with overlapping index registers.
41
- log_cpu_state(cpu, CPU_DUMP_CCOP);
39
ldrd with base writeback is undefined if the
42
-#else
40
destination and index registers overlap. */
43
- log_cpu_state(cpu, 0);
41
- if (!(insn & (1 << 24))) {
44
+ flags |= CPU_DUMP_CCOP;
42
+ if (!pbit) {
45
#endif
43
gen_add_datah_offset(s, insn, address_offset, addr);
46
+ log_cpu_state(cpu, flags);
44
store_reg(s, rn, addr);
47
qemu_log_unlock();
45
- } else if (insn & (1 << 21)) {
48
}
46
+ } else if (wbit) {
49
#endif /* DEBUG_DISAS */
47
if (address_offset)
50
diff --git a/util/log.c b/util/log.c
48
tcg_gen_addi_i32(addr, addr, address_offset);
51
index XXXXXXX..XXXXXXX 100644
49
store_reg(s, rn, addr);
52
--- a/util/log.c
53
+++ b/util/log.c
54
@@ -XXX,XX +XXX,XX @@ const QEMULogItem qemu_log_items[] = {
55
"show trace before each executed TB (lots of logs)" },
56
{ CPU_LOG_TB_CPU, "cpu",
57
"show CPU registers before entering a TB (lots of logs)" },
58
+ { CPU_LOG_TB_FPU, "fpu",
59
+ "include FPU registers in the 'cpu' logging" },
60
{ CPU_LOG_MMU, "mmu",
61
"log MMU-related activities" },
62
{ CPU_LOG_PCALL, "pcall",
50
--
63
--
51
2.7.4
64
2.17.0
52
65
53
66
diff view generated by jsdifflib