1
The following changes since commit ad1b4ec39caa5b3f17cbd8160283a03a3dcfe2ae:
1
Some Arm bugfixes for rc2...
2
2
3
Merge remote-tracking branch 'remotes/kraxel/tags/input-20180515-pull-request' into staging (2018-05-15 12:50:06 +0100)
3
thanks
4
-- PMM
5
6
The following changes since commit e6ebbd46b6e539f3613136111977721d212c2812:
7
8
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging (2018-11-19 14:31:48 +0000)
4
9
5
are available in the Git repository at:
10
are available in the Git repository at:
6
11
7
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180515
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20181119
8
13
9
for you to fetch changes up to ae7651804748c6b479d5ae09aeac4edb9c44f76e:
14
for you to fetch changes up to a00d7f2048c2a1a6a4487ac195c804c78adcf60e:
10
15
11
tcg: Optionally log FPU state in TCG -d cpu logging (2018-05-15 14:58:44 +0100)
16
MAINTAINERS: list myself as maintainer for various Arm boards (2018-11-19 15:55:11 +0000)
12
17
13
----------------------------------------------------------------
18
----------------------------------------------------------------
14
target-arm queue:
19
target-arm queue:
15
* Fix coverity nit in int_to_float code
20
* various MAINTAINERS file updates
16
* Don't set Invalid for float-to-int(MAXINT)
21
* hw/block/onenand: use qemu_log_mask() for reporting
17
* Fix fp_status_f16 tininess before rounding
22
* hw/block/onenand: Fix off-by-one error allowing out-of-bounds read
18
* Add various missing insns from the v8.2-FP16 extension
23
on the n800 and n810 machine models
19
* Fix sqrt_f16 exception raising
24
* target/arm: fix smc incorrectly trapping to EL3 when secure is off
20
* sdcard: Correct CRC16 offset in sd_function_switch()
25
* hw/arm/stm32f205: Fix the UART and Timer region size
21
* tcg: Optionally log FPU state in TCG -d cpu logging
26
* target/arm: read ID registers for KVM guests so they can be
27
used to gate "is feature X present" checks
22
28
23
----------------------------------------------------------------
29
----------------------------------------------------------------
24
Alex Bennée (5):
30
Luc Michel (1):
25
fpu/softfloat: int_to_float ensure r fully initialised
31
target/arm: fix smc incorrectly trapping to EL3 when secure is off
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
30
32
31
Peter Maydell (3):
33
Peter Maydell (3):
32
fpu/softfloat: Don't set Invalid for float-to-int(MAXINT)
34
hw/block/onenand: Fix off-by-one error allowing out-of-bounds read
33
target/arm: Fix fp_status_f16 tininess before rounding
35
hw/block/onenand: use qemu_log_mask() for reporting
34
tcg: Optionally log FPU state in TCG -d cpu logging
36
MAINTAINERS: list myself as maintainer for various Arm boards
35
37
36
Philippe Mathieu-Daudé (1):
38
Richard Henderson (4):
37
sdcard: Correct CRC16 offset in sd_function_switch()
39
target/arm: Install ARMISARegisters from kvm host
40
target/arm: Fill in ARMISARegisters for kvm64
41
target/arm: Introduce read_sys_reg32 for kvm32
42
target/arm: Fill in ARMISARegisters for kvm32
38
43
39
Richard Henderson (7):
44
Seth Kintigh (1):
40
target/arm: Implement FMOV (general) for fp16
45
hw/arm/stm32f205: Fix the UART and Timer region size
41
target/arm: Early exit after unallocated_encoding in disas_fp_int_conv
42
target/arm: Implement FCVT (scalar, integer) for fp16
43
target/arm: Implement FCVT (scalar, fixed-point) for fp16
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
47
46
48
include/qemu/log.h | 1 +
47
Thomas Huth (1):
49
target/arm/helper-a64.h | 2 +
48
MAINTAINERS: Add entries for missing ARM boards
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(-)
60
49
50
target/arm/kvm_arm.h | 1 +
51
hw/block/onenand.c | 24 +++++-----
52
hw/char/stm32f2xx_usart.c | 2 +-
53
hw/timer/stm32f2xx_timer.c | 2 +-
54
target/arm/kvm.c | 1 +
55
target/arm/kvm32.c | 77 ++++++++++++++++++++------------
56
target/arm/kvm64.c | 90 +++++++++++++++++++++++++++++++++++++-
57
target/arm/op_helper.c | 54 +++++++++++++++++++----
58
MAINTAINERS | 106 +++++++++++++++++++++++++++++++++++++++------
59
9 files changed, 293 insertions(+), 64 deletions(-)
60
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
No sense in emitting code after the exception.
3
The ID registers are replacing (some of) the feature bits.
4
We need (some of) these values to determine the set of data
5
to be handled during migration.
4
6
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
8
Message-id: 20181113180154.17903-2-richard.henderson@linaro.org
7
Message-id: 20180512003217.9105-3-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
target/arm/translate-a64.c | 2 +-
12
target/arm/kvm_arm.h | 1 +
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
target/arm/kvm.c | 1 +
14
2 files changed, 2 insertions(+)
13
15
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
18
--- a/target/arm/kvm_arm.h
17
+++ b/target/arm/translate-a64.c
19
+++ b/target/arm/kvm_arm.h
18
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
20
@@ -XXX,XX +XXX,XX @@ void kvm_arm_destroy_scratch_host_vcpu(int *fdarray);
19
default:
21
* by asking the host kernel)
20
/* all other sf/type/rmode combinations are invalid */
22
*/
21
unallocated_encoding(s);
23
typedef struct ARMHostCPUFeatures {
22
- break;
24
+ ARMISARegisters isar;
23
+ return;
25
uint64_t features;
24
}
26
uint32_t target;
25
27
const char *dtb_compatible;
26
if (!fp_access_check(s)) {
28
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/kvm.c
31
+++ b/target/arm/kvm.c
32
@@ -XXX,XX +XXX,XX @@ void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
33
34
cpu->kvm_target = arm_host_cpu_features.target;
35
cpu->dtb_compatible = arm_host_cpu_features.dtb_compatible;
36
+ cpu->isar = arm_host_cpu_features.isar;
37
env->features = arm_host_cpu_features.features;
38
}
39
27
--
40
--
28
2.17.0
41
2.19.1
29
42
30
43
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
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>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
4
Message-id: 20181113180154.17903-3-richard.henderson@linaro.org
7
Message-id: 20180512003217.9105-4-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
7
---
10
target/arm/helper.h | 6 +++
8
target/arm/kvm64.c | 90 ++++++++++++++++++++++++++++++++++++++++++++--
11
target/arm/helper.c | 38 ++++++++++++++-
9
1 file changed, 88 insertions(+), 2 deletions(-)
12
target/arm/translate-a64.c | 96 +++++++++++++++++++++++++++++++-------
13
3 files changed, 122 insertions(+), 18 deletions(-)
14
10
15
diff --git a/target/arm/helper.h b/target/arm/helper.h
11
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
16
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.h
13
--- a/target/arm/kvm64.c
18
+++ b/target/arm/helper.h
14
+++ b/target/arm/kvm64.c
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, ptr)
15
@@ -XXX,XX +XXX,XX @@ static inline void unset_feature(uint64_t *features, int feature)
20
DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, ptr)
16
*features &= ~(1ULL << feature);
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
}
17
}
61
18
62
+float16 HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
19
+static int read_sys_reg32(int fd, uint32_t *pret, uint64_t id)
63
+{
20
+{
64
+ return do_postscale_fp16(int64_to_float64(x, fpst), shift, fpst);
21
+ uint64_t ret;
22
+ struct kvm_one_reg idreg = { .id = id, .addr = (uintptr_t)&ret };
23
+ int err;
24
+
25
+ assert((id & KVM_REG_SIZE_MASK) == KVM_REG_SIZE_U64);
26
+ err = ioctl(fd, KVM_GET_ONE_REG, &idreg);
27
+ if (err < 0) {
28
+ return -1;
29
+ }
30
+ *pret = ret;
31
+ return 0;
65
+}
32
+}
66
+
33
+
67
+float16 HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
34
+static int read_sys_reg64(int fd, uint64_t *pret, uint64_t id)
68
+{
35
+{
69
+ return do_postscale_fp16(uint64_to_float64(x, fpst), shift, fpst);
36
+ struct kvm_one_reg idreg = { .id = id, .addr = (uintptr_t)pret };
37
+
38
+ assert((id & KVM_REG_SIZE_MASK) == KVM_REG_SIZE_U64);
39
+ return ioctl(fd, KVM_GET_ONE_REG, &idreg);
70
+}
40
+}
71
+
41
+
72
static float64 do_prescale_fp16(float16 f, int shift, float_status *fpst)
42
bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
73
{
43
{
74
if (unlikely(float16_is_any_nan(f))) {
44
/* Identify the feature bits corresponding to the host CPU, and
75
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(vfp_touhh)(float16 x, uint32_t shift, void *fpst)
45
* fill out the ARMHostCPUClass fields accordingly. To do this
76
return float64_to_uint16(do_prescale_fp16(x, shift, fpst), fpst);
46
* we have to create a scratch VM, create a single CPU inside it,
77
}
47
* and then query that CPU for the relevant ID registers.
78
48
- * For AArch64 we currently don't care about ID registers at
79
+uint32_t HELPER(vfp_toslh)(float16 x, uint32_t shift, void *fpst)
49
- * all; we just want to know the CPU type.
80
+{
50
*/
81
+ return float64_to_int32(do_prescale_fp16(x, shift, fpst), fpst);
51
int fdarray[3];
82
+}
52
uint64_t features = 0;
53
+ int err;
83
+
54
+
84
+uint32_t HELPER(vfp_toulh)(float16 x, uint32_t shift, void *fpst)
55
/* Old kernels may not know about the PREFERRED_TARGET ioctl: however
85
+{
56
* we know these will only support creating one kind of guest CPU,
86
+ return float64_to_uint32(do_prescale_fp16(x, shift, fpst), fpst);
57
* which is its preferred CPU type. Fortunately these old kernels
87
+}
58
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
59
ahcf->target = init.target;
60
ahcf->dtb_compatible = "arm,arm-v8";
61
62
+ err = read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64pfr0,
63
+ ARM64_SYS_REG(3, 0, 0, 4, 0));
64
+ if (unlikely(err < 0)) {
65
+ /*
66
+ * Before v4.15, the kernel only exposed a limited number of system
67
+ * registers, not including any of the interesting AArch64 ID regs.
68
+ * For the most part we could leave these fields as zero with minimal
69
+ * effect, since this does not affect the values seen by the guest.
70
+ *
71
+ * However, it could cause problems down the line for QEMU,
72
+ * so provide a minimal v8.0 default.
73
+ *
74
+ * ??? Could read MIDR and use knowledge from cpu64.c.
75
+ * ??? Could map a page of memory into our temp guest and
76
+ * run the tiniest of hand-crafted kernels to extract
77
+ * the values seen by the guest.
78
+ * ??? Either of these sounds like too much effort just
79
+ * to work around running a modern host kernel.
80
+ */
81
+ ahcf->isar.id_aa64pfr0 = 0x00000011; /* EL1&0, AArch64 only */
82
+ err = 0;
83
+ } else {
84
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64pfr1,
85
+ ARM64_SYS_REG(3, 0, 0, 4, 1));
86
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64isar0,
87
+ ARM64_SYS_REG(3, 0, 0, 6, 0));
88
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64isar1,
89
+ ARM64_SYS_REG(3, 0, 0, 6, 1));
88
+
90
+
89
+uint64_t HELPER(vfp_tosqh)(float16 x, uint32_t shift, void *fpst)
91
+ /*
90
+{
92
+ * Note that if AArch32 support is not present in the host,
91
+ return float64_to_int64(do_prescale_fp16(x, shift, fpst), fpst);
93
+ * the AArch32 sysregs are present to be read, but will
92
+}
94
+ * return UNKNOWN values. This is neither better nor worse
95
+ * than skipping the reads and leaving 0, as we must avoid
96
+ * considering the values in every case.
97
+ */
98
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar0,
99
+ ARM64_SYS_REG(3, 0, 0, 2, 0));
100
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar1,
101
+ ARM64_SYS_REG(3, 0, 0, 2, 1));
102
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar2,
103
+ ARM64_SYS_REG(3, 0, 0, 2, 2));
104
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar3,
105
+ ARM64_SYS_REG(3, 0, 0, 2, 3));
106
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar4,
107
+ ARM64_SYS_REG(3, 0, 0, 2, 4));
108
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar5,
109
+ ARM64_SYS_REG(3, 0, 0, 2, 5));
110
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar6,
111
+ ARM64_SYS_REG(3, 0, 0, 2, 7));
93
+
112
+
94
+uint64_t HELPER(vfp_touqh)(float16 x, uint32_t shift, void *fpst)
113
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.mvfr0,
95
+{
114
+ ARM64_SYS_REG(3, 0, 0, 3, 0));
96
+ return float64_to_uint64(do_prescale_fp16(x, shift, fpst), fpst);
115
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.mvfr1,
97
+}
116
+ ARM64_SYS_REG(3, 0, 0, 3, 1));
117
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.mvfr2,
118
+ ARM64_SYS_REG(3, 0, 0, 3, 2));
119
+ }
98
+
120
+
99
/* Set the current fp rounding mode and return the old one.
121
kvm_arm_destroy_scratch_host_vcpu(fdarray);
100
* The argument is a softfloat float_round_ value.
122
101
*/
123
+ if (err < 0) {
102
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
124
+ return false;
103
index XXXXXXX..XXXXXXX 100644
125
+ }
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
+
126
+
141
+ case 0: /* float32 */
127
/* We can assume any KVM supporting CPU is at least a v8
142
+ tcg_single = tcg_temp_new_i32();
128
* with VFPv4+Neon; this in turn implies most of the other
143
if (is_signed) {
129
* feature bits.
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
--
130
--
266
2.17.0
131
2.19.1
267
132
268
133
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Cc: qemu-stable@nongnu.org
3
Assert that the value to be written is the correct size.
4
No change in functionality here, just mirroring the same
5
function from kvm64.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20181113180154.17903-4-richard.henderson@linaro.org
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
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
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
11
---
10
target/arm/translate-a64.c | 30 ++++++++++++++----------------
12
target/arm/kvm32.c | 41 ++++++++++++++++-------------------------
11
1 file changed, 14 insertions(+), 16 deletions(-)
13
1 file changed, 16 insertions(+), 25 deletions(-)
12
14
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
17
--- a/target/arm/kvm32.c
16
+++ b/target/arm/translate-a64.c
18
+++ b/target/arm/kvm32.c
17
@@ -XXX,XX +XXX,XX @@ static TCGv_i32 read_fp_sreg(DisasContext *s, int reg)
19
@@ -XXX,XX +XXX,XX @@ static inline void set_feature(uint64_t *features, int feature)
18
return v;
20
*features |= 1ULL << feature;
19
}
21
}
20
22
21
+static TCGv_i32 read_fp_hreg(DisasContext *s, int reg)
23
+static int read_sys_reg32(int fd, uint32_t *pret, uint64_t id)
22
+{
24
+{
23
+ TCGv_i32 v = tcg_temp_new_i32();
25
+ struct kvm_one_reg idreg = { .id = id, .addr = (uintptr_t)pret };
24
+
26
+
25
+ tcg_gen_ld16u_i32(v, cpu_env, fp_reg_offset(s, reg, MO_16));
27
+ assert((id & KVM_REG_SIZE_MASK) == KVM_REG_SIZE_U32);
26
+ return v;
28
+ return ioctl(fd, KVM_GET_ONE_REG, &idreg);
27
+}
29
+}
28
+
30
+
29
/* Clear the bits above an N-bit vector, for N = (is_q ? 128 : 64).
31
bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
30
* If SVE is not enabled, then there are only 128 bits in the vector.
31
*/
32
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
33
static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
34
{
32
{
35
TCGv_ptr fpst = NULL;
33
/* Identify the feature bits corresponding to the host CPU, and
36
- TCGv_i32 tcg_op = tcg_temp_new_i32();
34
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
37
+ TCGv_i32 tcg_op = read_fp_hreg(s, rn);
35
* we have to create a scratch VM, create a single CPU inside it,
38
TCGv_i32 tcg_res = tcg_temp_new_i32();
36
* and then query that CPU for the relevant ID registers.
39
37
*/
40
- read_vec_element_i32(s, tcg_op, rn, 0, MO_16);
38
- int i, ret, fdarray[3];
41
-
39
+ int err = 0, fdarray[3];
42
switch (opcode) {
40
uint32_t midr, id_pfr0, mvfr1;
43
case 0x0: /* FMOV */
41
uint64_t features = 0;
44
tcg_gen_mov_i32(tcg_res, tcg_op);
42
+
45
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_diff(DisasContext *s, uint32_t insn)
43
/* Old kernels may not know about the PREFERRED_TARGET ioctl: however
46
tcg_temp_free_i64(tcg_op2);
44
* we know these will only support creating one kind of guest CPU,
47
tcg_temp_free_i64(tcg_res);
45
* which is its preferred CPU type.
48
} else {
46
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
49
- TCGv_i32 tcg_op1 = tcg_temp_new_i32();
47
QEMU_KVM_ARM_TARGET_NONE
50
- TCGv_i32 tcg_op2 = tcg_temp_new_i32();
48
};
51
+ TCGv_i32 tcg_op1 = read_fp_hreg(s, rn);
49
struct kvm_vcpu_init init;
52
+ TCGv_i32 tcg_op2 = read_fp_hreg(s, rm);
50
- struct kvm_one_reg idregs[] = {
53
TCGv_i64 tcg_res = tcg_temp_new_i64();
51
- {
54
52
- .id = KVM_REG_ARM | KVM_REG_SIZE_U32
55
- read_vec_element_i32(s, tcg_op1, rn, 0, MO_16);
53
- | ENCODE_CP_REG(15, 0, 0, 0, 0, 0, 0),
56
- read_vec_element_i32(s, tcg_op2, rm, 0, MO_16);
54
- .addr = (uintptr_t)&midr,
57
-
55
- },
58
gen_helper_neon_mull_s16(tcg_res, tcg_op1, tcg_op2);
56
- {
59
gen_helper_neon_addl_saturate_s32(tcg_res, cpu_env, tcg_res, tcg_res);
57
- .id = KVM_REG_ARM | KVM_REG_SIZE_U32
60
58
- | ENCODE_CP_REG(15, 0, 0, 0, 1, 0, 0),
61
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_same_fp16(DisasContext *s,
59
- .addr = (uintptr_t)&id_pfr0,
62
60
- },
63
fpst = get_fpstatus_ptr(true);
61
- {
64
62
- .id = KVM_REG_ARM | KVM_REG_SIZE_U32
65
- tcg_op1 = tcg_temp_new_i32();
63
- | KVM_REG_ARM_VFP | KVM_REG_ARM_VFP_MVFR1,
66
- tcg_op2 = tcg_temp_new_i32();
64
- .addr = (uintptr_t)&mvfr1,
67
+ tcg_op1 = read_fp_hreg(s, rn);
65
- },
68
+ tcg_op2 = read_fp_hreg(s, rm);
66
- };
69
tcg_res = tcg_temp_new_i32();
67
70
68
if (!kvm_arm_create_scratch_host_vcpu(cpus_to_try, fdarray, &init)) {
71
- read_vec_element_i32(s, tcg_op1, rn, 0, MO_16);
69
return false;
72
- read_vec_element_i32(s, tcg_op2, rm, 0, MO_16);
70
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
73
-
71
*/
74
switch (fpopcode) {
72
ahcf->dtb_compatible = "arm,arm-v7";
75
case 0x03: /* FMULX */
73
76
gen_helper_advsimd_mulxh(tcg_res, tcg_op1, tcg_op2, fpst);
74
- for (i = 0; i < ARRAY_SIZE(idregs); i++) {
77
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
75
- ret = ioctl(fdarray[2], KVM_GET_ONE_REG, &idregs[i]);
76
- if (ret) {
77
- break;
78
- }
79
- }
80
+ err |= read_sys_reg32(fdarray[2], &midr, ARM_CP15_REG32(0, 0, 0, 0));
81
+ err |= read_sys_reg32(fdarray[2], &id_pfr0, ARM_CP15_REG32(0, 0, 1, 0));
82
+ err |= read_sys_reg32(fdarray[2], &mvfr1,
83
+ KVM_REG_ARM | KVM_REG_SIZE_U32 |
84
+ KVM_REG_ARM_VFP | KVM_REG_ARM_VFP_MVFR1);
85
86
kvm_arm_destroy_scratch_host_vcpu(fdarray);
87
88
- if (ret) {
89
+ if (err < 0) {
90
return false;
78
}
91
}
79
92
80
if (is_scalar) {
81
- TCGv_i32 tcg_op = tcg_temp_new_i32();
82
+ TCGv_i32 tcg_op = read_fp_hreg(s, rn);
83
TCGv_i32 tcg_res = tcg_temp_new_i32();
84
85
- read_vec_element_i32(s, tcg_op, rn, 0, MO_16);
86
-
87
switch (fpop) {
88
case 0x1a: /* FCVTNS */
89
case 0x1b: /* FCVTMS */
90
--
93
--
91
2.17.0
94
2.19.1
92
95
93
96
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We missed all of the scalar fp16 fma operations.
4
5
Cc: qemu-stable@nongnu.org
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
4
Message-id: 20181113180154.17903-5-richard.henderson@linaro.org
9
Message-id: 20180512003217.9105-8-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
7
---
12
target/arm/translate-a64.c | 48 ++++++++++++++++++++++++++++++++++++++
8
target/arm/kvm32.c | 40 +++++++++++++++++++++++++++++++++++-----
13
1 file changed, 48 insertions(+)
9
1 file changed, 35 insertions(+), 5 deletions(-)
14
10
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
16
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
13
--- a/target/arm/kvm32.c
18
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/kvm32.c
19
@@ -XXX,XX +XXX,XX @@ static void handle_fp_3src_double(DisasContext *s, bool o0, bool o1,
15
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
20
tcg_temp_free_i64(tcg_res);
16
* and then query that CPU for the relevant ID registers.
21
}
17
*/
22
18
int err = 0, fdarray[3];
23
+/* Floating-point data-processing (3 source) - half precision */
19
- uint32_t midr, id_pfr0, mvfr1;
24
+static void handle_fp_3src_half(DisasContext *s, bool o0, bool o1,
20
+ uint32_t midr, id_pfr0;
25
+ int rd, int rn, int rm, int ra)
21
uint64_t features = 0;
26
+{
22
27
+ TCGv_i32 tcg_op1, tcg_op2, tcg_op3;
23
/* Old kernels may not know about the PREFERRED_TARGET ioctl: however
28
+ TCGv_i32 tcg_res = tcg_temp_new_i32();
24
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
29
+ TCGv_ptr fpst = get_fpstatus_ptr(true);
25
26
err |= read_sys_reg32(fdarray[2], &midr, ARM_CP15_REG32(0, 0, 0, 0));
27
err |= read_sys_reg32(fdarray[2], &id_pfr0, ARM_CP15_REG32(0, 0, 1, 0));
28
- err |= read_sys_reg32(fdarray[2], &mvfr1,
30
+
29
+
31
+ tcg_op1 = read_fp_hreg(s, rn);
30
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar0,
32
+ tcg_op2 = read_fp_hreg(s, rm);
31
+ ARM_CP15_REG32(0, 0, 2, 0));
33
+ tcg_op3 = read_fp_hreg(s, ra);
32
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar1,
34
+
33
+ ARM_CP15_REG32(0, 0, 2, 1));
35
+ /* These are fused multiply-add, and must be done as one
34
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar2,
36
+ * floating point operation with no rounding between the
35
+ ARM_CP15_REG32(0, 0, 2, 2));
37
+ * multiplication and addition steps.
36
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar3,
38
+ * NB that doing the negations here as separate steps is
37
+ ARM_CP15_REG32(0, 0, 2, 3));
39
+ * correct : an input NaN should come out with its sign bit
38
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar4,
40
+ * flipped if it is a negated-input.
39
+ ARM_CP15_REG32(0, 0, 2, 4));
41
+ */
40
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_isar5,
42
+ if (o1 == true) {
41
+ ARM_CP15_REG32(0, 0, 2, 5));
43
+ tcg_gen_xori_i32(tcg_op3, tcg_op3, 0x8000);
42
+ if (read_sys_reg32(fdarray[2], &ahcf->isar.id_isar6,
43
+ ARM_CP15_REG32(0, 0, 2, 7))) {
44
+ /*
45
+ * Older kernels don't support reading ID_ISAR6. This register was
46
+ * only introduced in ARMv8, so we can assume that it is zero on a
47
+ * CPU that a kernel this old is running on.
48
+ */
49
+ ahcf->isar.id_isar6 = 0;
44
+ }
50
+ }
45
+
51
+
46
+ if (o0 != o1) {
52
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.mvfr0,
47
+ tcg_gen_xori_i32(tcg_op1, tcg_op1, 0x8000);
53
+ KVM_REG_ARM | KVM_REG_SIZE_U32 |
48
+ }
54
+ KVM_REG_ARM_VFP | KVM_REG_ARM_VFP_MVFR0);
49
+
55
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.mvfr1,
50
+ gen_helper_advsimd_muladdh(tcg_res, tcg_op1, tcg_op2, tcg_op3, fpst);
56
KVM_REG_ARM | KVM_REG_SIZE_U32 |
51
+
57
KVM_REG_ARM_VFP | KVM_REG_ARM_VFP_MVFR1);
52
+ write_fp_sreg(s, rd, tcg_res);
58
+ /*
53
+
59
+ * FIXME: There is not yet a way to read MVFR2.
54
+ tcg_temp_free_ptr(fpst);
60
+ * Fortunately there is not yet anything in there that affects migration.
55
+ tcg_temp_free_i32(tcg_op1);
61
+ */
56
+ tcg_temp_free_i32(tcg_op2);
62
57
+ tcg_temp_free_i32(tcg_op3);
63
kvm_arm_destroy_scratch_host_vcpu(fdarray);
58
+ tcg_temp_free_i32(tcg_res);
64
59
+}
65
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
60
+
66
if (extract32(id_pfr0, 12, 4) == 1) {
61
/* Floating point data-processing (3 source)
67
set_feature(&features, ARM_FEATURE_THUMB2EE);
62
* 31 30 29 28 24 23 22 21 20 16 15 14 10 9 5 4 0
68
}
63
* +---+---+---+-----------+------+----+------+----+------+------+------+
69
- if (extract32(mvfr1, 20, 4) == 1) {
64
@@ -XXX,XX +XXX,XX @@ static void disas_fp_3src(DisasContext *s, uint32_t insn)
70
+ if (extract32(ahcf->isar.mvfr1, 20, 4) == 1) {
65
}
71
set_feature(&features, ARM_FEATURE_VFP_FP16);
66
handle_fp_3src_double(s, o0, o1, rd, rn, rm, ra);
72
}
67
break;
73
- if (extract32(mvfr1, 12, 4) == 1) {
68
+ case 3:
74
+ if (extract32(ahcf->isar.mvfr1, 12, 4) == 1) {
69
+ if (!arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
75
set_feature(&features, ARM_FEATURE_NEON);
70
+ unallocated_encoding(s);
76
}
71
+ return;
77
- if (extract32(mvfr1, 28, 4) == 1) {
72
+ }
78
+ if (extract32(ahcf->isar.mvfr1, 28, 4) == 1) {
73
+ if (!fp_access_check(s)) {
79
/* FMAC support implies VFPv4 */
74
+ return;
80
set_feature(&features, ARM_FEATURE_VFP4);
75
+ }
76
+ handle_fp_3src_half(s, o0, o1, rd, rn, rm, ra);
77
+ break;
78
default:
79
unallocated_encoding(s);
80
}
81
}
81
--
82
--
82
2.17.0
83
2.19.1
83
84
84
85
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Thomas Huth <thuth@redhat.com>
2
2
3
Per the Physical Layer Simplified Spec. "4.3.10.4 Switch Function Status":
3
Add entries for the boards "mcimx6ul-evk", "mcimx7d-sabre", "raspi2",
4
"raspi3", "sabrelite", "vexpress-a15", "vexpress-a9" and "virt".
5
While we're at it, also adjust the "i.MX31" section a little bit,
6
so that the wildcards there do not match anymore for unrelated files
7
(e.g. the new hw/misc/imx6ul_ccm.c file).
4
8
5
The block length is predefined to 512 bits
9
Signed-off-by: Thomas Huth <thuth@redhat.com>
6
10
Message-id: 1542184999-11145-1-git-send-email-thuth@redhat.com
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
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
---
12
---
21
hw/sd/sd.c | 2 +-
13
MAINTAINERS | 70 +++++++++++++++++++++++++++++++++++++++++++++++++----
22
1 file changed, 1 insertion(+), 1 deletion(-)
14
1 file changed, 65 insertions(+), 5 deletions(-)
23
15
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
16
diff --git a/MAINTAINERS b/MAINTAINERS
25
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
26
--- a/hw/sd/sd.c
18
--- a/MAINTAINERS
27
+++ b/hw/sd/sd.c
19
+++ b/MAINTAINERS
28
@@ -XXX,XX +XXX,XX @@ static void sd_function_switch(SDState *sd, uint32_t arg)
20
@@ -XXX,XX +XXX,XX @@ L: qemu-arm@nongnu.org
29
sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
21
S: Odd Fixes
30
}
22
F: hw/arm/gumstix.c
31
memset(&sd->data[17], 0, 47);
23
32
- stw_be_p(sd->data + 65, sd_crc16(sd->data, 64));
24
-i.MX31
33
+ stw_be_p(sd->data + 64, sd_crc16(sd->data, 64));
25
+i.MX31 (kzm)
34
}
26
M: Peter Chubb <peter.chubb@nicta.com.au>
35
27
L: qemu-arm@nongnu.org
36
static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
28
-S: Odd fixes
29
-F: hw/*/imx*
30
-F: include/hw/*/imx*
31
+S: Odd Fixes
32
F: hw/arm/kzm.c
33
-F: include/hw/arm/fsl-imx31.h
34
+F: hw/*/imx_*
35
+F: hw/*/*imx31*
36
+F: include/hw/*/imx_*
37
+F: include/hw/*/*imx31*
38
39
Integrator CP
40
M: Peter Maydell <peter.maydell@linaro.org>
41
@@ -XXX,XX +XXX,XX @@ S: Maintained
42
F: hw/arm/integratorcp.c
43
F: hw/misc/arm_integrator_debug.c
44
45
+MCIMX6UL EVK / i.MX6ul
46
+M: Peter Maydell <peter.maydell@linaro.org>
47
+R: Jean-Christophe Dubois <jcd@tribudubois.net>
48
+L: qemu-arm@nongnu.org
49
+S: Odd Fixes
50
+F: hw/arm/mcimx6ul-evk.c
51
+F: hw/arm/fsl-imx6ul.c
52
+F: hw/misc/imx6ul_ccm.c
53
+F: include/hw/arm/fsl-imx6ul.h
54
+F: include/hw/misc/imx6ul_ccm.h
55
+
56
+MCIMX7D SABRE / i.MX7
57
+M: Peter Maydell <peter.maydell@linaro.org>
58
+R: Andrey Smirnov <andrew.smirnov@gmail.com>
59
+L: qemu-arm@nongnu.org
60
+S: Odd Fixes
61
+F: hw/arm/mcimx7d-sabre.c
62
+F: hw/arm/fsl-imx7.c
63
+F: include/hw/arm/fsl-imx7.h
64
+F: hw/pci-host/designware.c
65
+F: include/hw/pci-host/designware.h
66
+
67
MPS2
68
M: Peter Maydell <peter.maydell@linaro.org>
69
L: qemu-arm@nongnu.org
70
@@ -XXX,XX +XXX,XX @@ L: qemu-arm@nongnu.org
71
S: Maintained
72
F: hw/arm/palm.c
73
74
+Raspberry Pi
75
+M: Peter Maydell <peter.maydell@linaro.org>
76
+R: Andrew Baumann <Andrew.Baumann@microsoft.com>
77
+R: Philippe Mathieu-Daudé <f4bug@amsat.org>
78
+L: qemu-arm@nongnu.org
79
+S: Odd Fixes
80
+F: hw/arm/raspi_platform.h
81
+F: hw/*/bcm283*
82
+F: include/hw/arm/raspi*
83
+F: include/hw/*/bcm283*
84
+
85
Real View
86
M: Peter Maydell <peter.maydell@linaro.org>
87
L: qemu-arm@nongnu.org
88
@@ -XXX,XX +XXX,XX @@ F: hw/*/pxa2xx*
89
F: hw/misc/mst_fpga.c
90
F: include/hw/arm/pxa.h
91
92
+SABRELITE / i.MX6
93
+M: Peter Maydell <peter.maydell@linaro.org>
94
+R: Jean-Christophe Dubois <jcd@tribudubois.net>
95
+L: qemu-arm@nongnu.org
96
+S: Odd Fixes
97
+F: hw/arm/sabrelite.c
98
+F: hw/arm/fsl-imx6.c
99
+F: hw/misc/imx6_src.c
100
+F: hw/ssi/imx_spi.c
101
+F: include/hw/arm/fsl-imx6.h
102
+F: include/hw/misc/imx6_src.h
103
+F: include/hw/ssi/imx_spi.h
104
+
105
Sharp SL-5500 (Collie) PDA
106
M: Peter Maydell <peter.maydell@linaro.org>
107
L: qemu-arm@nongnu.org
108
@@ -XXX,XX +XXX,XX @@ L: qemu-arm@nongnu.org
109
S: Maintained
110
F: hw/*/stellaris*
111
112
+Versatile Express
113
+M: Peter Maydell <peter.maydell@linaro.org>
114
+L: qemu-arm@nongnu.org
115
+S: Maintained
116
+F: hw/arm/vexpress.c
117
+
118
Versatile PB
119
M: Peter Maydell <peter.maydell@linaro.org>
120
L: qemu-arm@nongnu.org
121
@@ -XXX,XX +XXX,XX @@ S: Maintained
122
F: hw/*/versatile*
123
F: hw/misc/arm_sysctl.c
124
125
+Virt
126
+M: Peter Maydell <peter.maydell@linaro.org>
127
+L: qemu-arm@nongnu.org
128
+S: Maintained
129
+F: hw/arm/virt*
130
+F: include/hw/arm/virt.h
131
+
132
Xilinx Zynq
133
M: Edgar E. Iglesias <edgar.iglesias@gmail.com>
134
M: Alistair Francis <alistair@alistair23.me>
37
--
135
--
38
2.17.0
136
2.19.1
39
137
40
138
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Seth Kintigh <skintigh@gmail.com>
2
2
3
We missed all of the scalar fp16 binary operations.
3
The UART and timer devices for the stm32f205 were being created
4
with memory regions that were too large. Use the size specified
5
in the chip datasheet.
4
6
5
Cc: qemu-stable@nongnu.org
7
The old sizes were so large that the devices would overlap with
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
each other in the SoC memory map, so this fixes a bug that
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
caused odd behavior and/or crashes when trying to set up multiple
8
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
UARTs.
9
Message-id: 20180512003217.9105-7-richard.henderson@linaro.org
11
12
Signed-off-by: Seth Kintigh <skintigh@gmail.com>
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
14
[PMM: rephrased commit message to follow our usual standard]
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
18
---
12
target/arm/translate-a64.c | 65 ++++++++++++++++++++++++++++++++++++++
19
hw/char/stm32f2xx_usart.c | 2 +-
13
1 file changed, 65 insertions(+)
20
hw/timer/stm32f2xx_timer.c | 2 +-
21
2 files changed, 2 insertions(+), 2 deletions(-)
14
22
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
23
diff --git a/hw/char/stm32f2xx_usart.c b/hw/char/stm32f2xx_usart.c
16
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
25
--- a/hw/char/stm32f2xx_usart.c
18
+++ b/target/arm/translate-a64.c
26
+++ b/hw/char/stm32f2xx_usart.c
19
@@ -XXX,XX +XXX,XX @@ static void handle_fp_2src_double(DisasContext *s, int opcode,
27
@@ -XXX,XX +XXX,XX @@ static void stm32f2xx_usart_init(Object *obj)
20
tcg_temp_free_i64(tcg_res);
28
sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
29
30
memory_region_init_io(&s->mmio, obj, &stm32f2xx_usart_ops, s,
31
- TYPE_STM32F2XX_USART, 0x2000);
32
+ TYPE_STM32F2XX_USART, 0x400);
33
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
21
}
34
}
22
35
23
+/* Floating-point data-processing (2 source) - half precision */
36
diff --git a/hw/timer/stm32f2xx_timer.c b/hw/timer/stm32f2xx_timer.c
24
+static void handle_fp_2src_half(DisasContext *s, int opcode,
37
index XXXXXXX..XXXXXXX 100644
25
+ int rd, int rn, int rm)
38
--- a/hw/timer/stm32f2xx_timer.c
26
+{
39
+++ b/hw/timer/stm32f2xx_timer.c
27
+ TCGv_i32 tcg_op1;
40
@@ -XXX,XX +XXX,XX @@ static void stm32f2xx_timer_init(Object *obj)
28
+ TCGv_i32 tcg_op2;
41
sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
29
+ TCGv_i32 tcg_res;
42
30
+ TCGv_ptr fpst;
43
memory_region_init_io(&s->iomem, obj, &stm32f2xx_timer_ops, s,
31
+
44
- "stm32f2xx_timer", 0x4000);
32
+ tcg_res = tcg_temp_new_i32();
45
+ "stm32f2xx_timer", 0x400);
33
+ fpst = get_fpstatus_ptr(true);
46
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
34
+ tcg_op1 = read_fp_hreg(s, rn);
47
35
+ tcg_op2 = read_fp_hreg(s, rm);
48
s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, stm32f2xx_timer_interrupt, s);
36
+
37
+ switch (opcode) {
38
+ case 0x0: /* FMUL */
39
+ gen_helper_advsimd_mulh(tcg_res, tcg_op1, tcg_op2, fpst);
40
+ break;
41
+ case 0x1: /* FDIV */
42
+ gen_helper_advsimd_divh(tcg_res, tcg_op1, tcg_op2, fpst);
43
+ break;
44
+ case 0x2: /* FADD */
45
+ gen_helper_advsimd_addh(tcg_res, tcg_op1, tcg_op2, fpst);
46
+ break;
47
+ case 0x3: /* FSUB */
48
+ gen_helper_advsimd_subh(tcg_res, tcg_op1, tcg_op2, fpst);
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();
68
+ }
69
+
70
+ write_fp_sreg(s, rd, tcg_res);
71
+
72
+ tcg_temp_free_ptr(fpst);
73
+ tcg_temp_free_i32(tcg_op1);
74
+ tcg_temp_free_i32(tcg_op2);
75
+ tcg_temp_free_i32(tcg_res);
76
+}
77
+
78
/* Floating point data-processing (2 source)
79
* 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 0
80
* +---+---+---+-----------+------+---+------+--------+-----+------+------+
81
@@ -XXX,XX +XXX,XX @@ static void disas_fp_2src(DisasContext *s, uint32_t insn)
82
}
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);
97
}
98
--
49
--
99
2.17.0
50
2.19.1
100
51
101
52
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Luc Michel <luc.michel@greensocs.com>
2
2
3
Cc: qemu-stable@nongnu.org
3
This commit fixes a case where the CPU would try to go to EL3 when
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
executing an smc instruction, even though ARM_FEATURE_EL3 is false. This
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
case is raised when the PSCI conduit is set to smc, but the smc
6
Tested-by: Alex Bennée <alex.bennee@linaro.org>
6
instruction does not lead to a valid PSCI call.
7
Message-id: 20180512003217.9105-5-richard.henderson@linaro.org
7
8
QEMU crashes with an assertion failure latter on because of incoherent
9
mmu_idx.
10
11
This commit refactors the pre_smc helper by enumerating all the possible
12
way of handling an scm instruction, and covering the previously missing
13
case leading to the crash.
14
15
The following minimal test would crash before this commit:
16
17
.global _start
18
.text
19
_start:
20
ldr x0, =0xdeadbeef ; invalid PSCI call
21
smc #0
22
23
run with the following command line:
24
25
aarch64-linux-gnu-gcc -nostdinc -nostdlib -Wl,-Ttext=40000000 \
26
-o test test.s
27
28
qemu-system-aarch64 -M virt,virtualization=on,secure=off \
29
-cpu cortex-a57 -kernel test
30
31
Signed-off-by: Luc Michel <luc.michel@greensocs.com>
32
Message-id: 20181117160213.18995-1-luc.michel@greensocs.com
33
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
34
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
35
---
10
target/arm/translate-a64.c | 17 +++++++++++++++--
36
target/arm/op_helper.c | 54 +++++++++++++++++++++++++++++++++++-------
11
1 file changed, 15 insertions(+), 2 deletions(-)
37
1 file changed, 46 insertions(+), 8 deletions(-)
12
38
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
39
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
14
index XXXXXXX..XXXXXXX 100644
40
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
41
--- a/target/arm/op_helper.c
16
+++ b/target/arm/translate-a64.c
42
+++ b/target/arm/op_helper.c
17
@@ -XXX,XX +XXX,XX @@ static void disas_fp_fixed_conv(DisasContext *s, uint32_t insn)
43
@@ -XXX,XX +XXX,XX @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome)
18
bool sf = extract32(insn, 31, 1);
44
ARMCPU *cpu = arm_env_get_cpu(env);
19
bool itof;
45
int cur_el = arm_current_el(env);
20
46
bool secure = arm_is_secure(env);
21
- if (sbit || (type > 1)
47
- bool smd = env->cp15.scr_el3 & SCR_SMD;
22
- || (!sf && scale < 32)) {
48
+ bool smd_flag = env->cp15.scr_el3 & SCR_SMD;
23
+ if (sbit || (!sf && scale < 32)) {
49
+
24
+ unallocated_encoding(s);
50
+ /*
25
+ return;
51
+ * SMC behaviour is summarized in the following table.
52
+ * This helper handles the "Trap to EL2" and "Undef insn" cases.
53
+ * The "Trap to EL3" and "PSCI call" cases are handled in the exception
54
+ * helper.
55
+ *
56
+ * -> ARM_FEATURE_EL3 and !SMD
57
+ * HCR_TSC && NS EL1 !HCR_TSC || !NS EL1
58
+ *
59
+ * Conduit SMC, valid call Trap to EL2 PSCI Call
60
+ * Conduit SMC, inval call Trap to EL2 Trap to EL3
61
+ * Conduit not SMC Trap to EL2 Trap to EL3
62
+ *
63
+ *
64
+ * -> ARM_FEATURE_EL3 and SMD
65
+ * HCR_TSC && NS EL1 !HCR_TSC || !NS EL1
66
+ *
67
+ * Conduit SMC, valid call Trap to EL2 PSCI Call
68
+ * Conduit SMC, inval call Trap to EL2 Undef insn
69
+ * Conduit not SMC Trap to EL2 Undef insn
70
+ *
71
+ *
72
+ * -> !ARM_FEATURE_EL3
73
+ * HCR_TSC && NS EL1 !HCR_TSC || !NS EL1
74
+ *
75
+ * Conduit SMC, valid call Trap to EL2 PSCI Call
76
+ * Conduit SMC, inval call Trap to EL2 Undef insn
77
+ * Conduit not SMC Undef insn Undef insn
78
+ */
79
+
80
/* On ARMv8 with EL3 AArch64, SMD applies to both S and NS state.
81
* On ARMv8 with EL3 AArch32, or ARMv7 with the Virtualization
82
* extensions, SMD only applies to NS state.
83
@@ -XXX,XX +XXX,XX @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome)
84
* doesn't exist, but we forbid the guest to set it to 1 in scr_write(),
85
* so we need not special case this here.
86
*/
87
- bool undef = arm_feature(env, ARM_FEATURE_AARCH64) ? smd : smd && !secure;
88
+ bool smd = arm_feature(env, ARM_FEATURE_AARCH64) ? smd_flag
89
+ : smd_flag && !secure;
90
91
if (!arm_feature(env, ARM_FEATURE_EL3) &&
92
cpu->psci_conduit != QEMU_PSCI_CONDUIT_SMC) {
93
@@ -XXX,XX +XXX,XX @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome)
94
* to forbid its EL1 from making PSCI calls into QEMU's
95
* "firmware" via HCR.TSC, so for these purposes treat
96
* PSCI-via-SMC as implying an EL3.
97
+ * This handles the very last line of the previous table.
98
*/
99
- undef = true;
100
- } else if (!secure && cur_el == 1 && (env->cp15.hcr_el2 & HCR_TSC)) {
101
+ raise_exception(env, EXCP_UDEF, syn_uncategorized(),
102
+ exception_target_el(env));
26
+ }
103
+ }
27
+
104
+
28
+ switch (type) {
105
+ if (!secure && cur_el == 1 && (env->cp15.hcr_el2 & HCR_TSC)) {
29
+ case 0: /* float32 */
106
/* In NS EL1, HCR controlled routing to EL2 has priority over SMD.
30
+ case 1: /* float64 */
107
* We also want an EL2 guest to be able to forbid its EL1 from
31
+ break;
108
* making PSCI calls into QEMU's "firmware" via HCR.TSC.
32
+ case 3: /* float16 */
109
+ * This handles all the "Trap to EL2" cases of the previous table.
33
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
110
*/
34
+ break;
111
raise_exception(env, EXCP_HYP_TRAP, syndrome, 2);
35
+ }
112
}
36
+ /* fallthru */
113
37
+ default:
114
- /* If PSCI is enabled and this looks like a valid PSCI call then
38
unallocated_encoding(s);
115
- * suppress the UNDEF -- we'll catch the SMC exception and
39
return;
116
- * implement the PSCI call behaviour there.
117
+ /* Catch the two remaining "Undef insn" cases of the previous table:
118
+ * - PSCI conduit is SMC but we don't have a valid PCSI call,
119
+ * - We don't have EL3 or SMD is set.
120
*/
121
- if (undef && !arm_is_psci_call(cpu, EXCP_SMC)) {
122
+ if (!arm_is_psci_call(cpu, EXCP_SMC) &&
123
+ (smd || !arm_feature(env, ARM_FEATURE_EL3))) {
124
raise_exception(env, EXCP_UDEF, syn_uncategorized(),
125
exception_target_el(env));
40
}
126
}
41
--
127
--
42
2.17.0
128
2.19.1
43
129
44
130
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
An off-by-one error in a switch case in onenand_read() allowed
2
a misbehaving guest to read off the end of a block of memory.
2
3
3
Reported by Coverity (CID1390635). We ensure this for uint_to_float
4
NB: the onenand device is used only by the "n800" and "n810"
4
later on so we might as well mirror that.
5
machines, which are usable only with TCG, not KVM, so this is
6
not a security issue.
5
7
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
8
Reported-by: Thomas Huth <thuth@redhat.com>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Message-id: 20181115143535.5885-2-peter.maydell@linaro.org
13
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
15
---
11
fpu/softfloat.c | 2 +-
16
hw/block/onenand.c | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
17
1 file changed, 1 insertion(+), 1 deletion(-)
13
18
14
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
19
diff --git a/hw/block/onenand.c b/hw/block/onenand.c
15
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
16
--- a/fpu/softfloat.c
21
--- a/hw/block/onenand.c
17
+++ b/fpu/softfloat.c
22
+++ b/hw/block/onenand.c
18
@@ -XXX,XX +XXX,XX @@ FLOAT_TO_UINT(64, 64)
23
@@ -XXX,XX +XXX,XX @@ static uint64_t onenand_read(void *opaque, hwaddr addr,
19
24
int offset = addr >> s->shift;
20
static FloatParts int_to_float(int64_t a, float_status *status)
25
21
{
26
switch (offset) {
22
- FloatParts r;
27
- case 0x0000 ... 0xc000:
23
+ FloatParts r = {};
28
+ case 0x0000 ... 0xbffe:
24
if (a == 0) {
29
return lduw_le_p(s->boot[0] + addr);
25
r.cls = float_class_zero;
30
26
r.sign = false;
31
case 0xf000:    /* Manufacturer ID */
27
--
32
--
28
2.17.0
33
2.19.1
29
34
30
35
diff view generated by jsdifflib
Deleted 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.
8
1
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
Deleted patch
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.
8
1
9
Add the missing initialization.
10
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(+)
20
21
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/target/arm/cpu.c
24
+++ b/target/arm/cpu.c
25
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
26
&env->vfp.fp_status);
27
set_float_detect_tininess(float_tininess_before_rounding,
28
&env->vfp.standard_fp_status);
29
+ set_float_detect_tininess(float_tininess_before_rounding,
30
+ &env->vfp.fp_status_f16);
31
#ifndef CONFIG_USER_ONLY
32
if (kvm_enabled()) {
33
kvm_arm_reset_vcpu(cpu);
34
--
35
2.17.0
36
37
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
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>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-a64.c | 21 +++++++++++++++++++++
13
1 file changed, 21 insertions(+)
14
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
18
+++ b/target/arm/translate-a64.c
19
@@ -XXX,XX +XXX,XX @@ static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
20
tcg_gen_st_i64(tcg_rn, cpu_env, fp_reg_hi_offset(s, rd));
21
clear_vec_high(s, true, rd);
22
break;
23
+ case 3:
24
+ /* 16 bit */
25
+ tmp = tcg_temp_new_i64();
26
+ tcg_gen_ext16u_i64(tmp, tcg_rn);
27
+ write_fp_dreg(s, rd, tmp);
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();
45
}
46
}
47
}
48
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
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);
61
--
62
2.17.0
63
64
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
Update the onenand device to use qemu_log_mask() for reporting
2
guest errors and unimplemented features, rather than plain
3
fprintf() and hw_error().
2
4
3
These where missed out from the rest of the half-precision work.
5
(We leave the hw_error() in onenand_reset(), as that is
6
triggered by a failure to read the underlying block device
7
for the bootRAM, not by guest action.)
4
8
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-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>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Thomas Huth <thuth@redhat.com>
13
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
14
Message-id: 20181115143535.5885-3-peter.maydell@linaro.org
14
---
15
---
15
target/arm/helper-a64.h | 2 +
16
hw/block/onenand.c | 22 +++++++++++++---------
16
target/arm/helper-a64.c | 10 +++++
17
1 file changed, 13 insertions(+), 9 deletions(-)
17
target/arm/translate-a64.c | 88 ++++++++++++++++++++++++++++++--------
18
3 files changed, 83 insertions(+), 17 deletions(-)
19
18
20
diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h
19
diff --git a/hw/block/onenand.c b/hw/block/onenand.c
21
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/helper-a64.h
21
--- a/hw/block/onenand.c
23
+++ b/target/arm/helper-a64.h
22
+++ b/hw/block/onenand.c
24
@@ -XXX,XX +XXX,XX @@
23
@@ -XXX,XX +XXX,XX @@
25
DEF_HELPER_FLAGS_2(udiv64, TCG_CALL_NO_RWG_SE, i64, i64, i64)
24
#include "exec/memory.h"
26
DEF_HELPER_FLAGS_2(sdiv64, TCG_CALL_NO_RWG_SE, s64, s64, s64)
25
#include "hw/sysbus.h"
27
DEF_HELPER_FLAGS_1(rbit64, TCG_CALL_NO_RWG_SE, i64, i64)
26
#include "qemu/error-report.h"
28
+DEF_HELPER_3(vfp_cmph_a64, i64, f16, f16, ptr)
27
+#include "qemu/log.h"
29
+DEF_HELPER_3(vfp_cmpeh_a64, i64, f16, f16, ptr)
28
30
DEF_HELPER_3(vfp_cmps_a64, i64, f32, f32, ptr)
29
/* 11 for 2kB-page OneNAND ("2nd generation") and 10 for 1kB-page chips */
31
DEF_HELPER_3(vfp_cmpes_a64, i64, f32, f32, ptr)
30
#define PAGE_SHIFT    11
32
DEF_HELPER_3(vfp_cmpd_a64, i64, f64, f64, ptr)
31
@@ -XXX,XX +XXX,XX @@ static void onenand_command(OneNANDState *s)
33
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
32
default:
34
index XXXXXXX..XXXXXXX 100644
33
s->status |= ONEN_ERR_CMD;
35
--- a/target/arm/helper-a64.c
34
s->intstatus |= ONEN_INT;
36
+++ b/target/arm/helper-a64.c
35
- fprintf(stderr, "%s: unknown OneNAND command %x\n",
37
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
36
- __func__, s->command);
38
return flags;
37
+ qemu_log_mask(LOG_GUEST_ERROR, "unknown OneNAND command %x\n",
38
+ s->command);
39
}
40
41
onenand_intr_update(s);
42
@@ -XXX,XX +XXX,XX @@ static uint64_t onenand_read(void *opaque, hwaddr addr,
43
case 0xff02:    /* ECC Result of spare area data */
44
case 0xff03:    /* ECC Result of main area data */
45
case 0xff04:    /* ECC Result of spare area data */
46
- hw_error("%s: implement ECC\n", __func__);
47
+ qemu_log_mask(LOG_UNIMP,
48
+ "onenand: ECC result registers unimplemented\n");
49
return 0x0000;
50
}
51
52
- fprintf(stderr, "%s: unknown OneNAND register %x\n",
53
- __func__, offset);
54
+ qemu_log_mask(LOG_GUEST_ERROR, "read of unknown OneNAND register 0x%x\n",
55
+ offset);
56
return 0;
39
}
57
}
40
58
41
+uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
59
@@ -XXX,XX +XXX,XX @@ static void onenand_write(void *opaque, hwaddr addr,
42
+{
60
break;
43
+ return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
61
44
+}
62
default:
45
+
63
- fprintf(stderr, "%s: unknown OneNAND boot command %"PRIx64"\n",
46
+uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
64
- __func__, value);
47
+{
65
+ qemu_log_mask(LOG_GUEST_ERROR,
48
+ return float_rel_to_flags(float16_compare(x, y, fp_status));
66
+ "unknown OneNAND boot command %" PRIx64 "\n",
49
+}
67
+ value);
50
+
68
}
51
uint64_t HELPER(vfp_cmps_a64)(float32 x, float32 y, void *fp_status)
69
break;
52
{
70
53
return float_rel_to_flags(float32_compare_quiet(x, y, fp_status));
71
@@ -XXX,XX +XXX,XX @@ static void onenand_write(void *opaque, hwaddr addr,
54
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
72
break;
55
index XXXXXXX..XXXXXXX 100644
73
56
--- a/target/arm/translate-a64.c
74
default:
57
+++ b/target/arm/translate-a64.c
75
- fprintf(stderr, "%s: unknown OneNAND register %x\n",
58
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
76
- __func__, offset);
77
+ qemu_log_mask(LOG_GUEST_ERROR,
78
+ "write to unknown OneNAND register 0x%x\n",
79
+ offset);
59
}
80
}
60
}
81
}
61
82
62
-static void handle_fp_compare(DisasContext *s, bool is_double,
63
+static void handle_fp_compare(DisasContext *s, int size,
64
unsigned int rn, unsigned int rm,
65
bool cmp_with_zero, bool signal_all_nans)
66
{
67
TCGv_i64 tcg_flags = tcg_temp_new_i64();
68
- TCGv_ptr fpst = get_fpstatus_ptr(false);
69
+ TCGv_ptr fpst = get_fpstatus_ptr(size == MO_16);
70
71
- if (is_double) {
72
+ if (size == MO_64) {
73
TCGv_i64 tcg_vn, tcg_vm;
74
75
tcg_vn = read_fp_dreg(s, rn);
76
@@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, bool is_double,
77
tcg_temp_free_i64(tcg_vn);
78
tcg_temp_free_i64(tcg_vm);
79
} else {
80
- TCGv_i32 tcg_vn, tcg_vm;
81
+ TCGv_i32 tcg_vn = tcg_temp_new_i32();
82
+ TCGv_i32 tcg_vm = tcg_temp_new_i32();
83
84
- tcg_vn = read_fp_sreg(s, rn);
85
+ read_vec_element_i32(s, tcg_vn, rn, 0, size);
86
if (cmp_with_zero) {
87
- tcg_vm = tcg_const_i32(0);
88
+ tcg_gen_movi_i32(tcg_vm, 0);
89
} else {
90
- tcg_vm = read_fp_sreg(s, rm);
91
+ read_vec_element_i32(s, tcg_vm, rm, 0, size);
92
}
93
- if (signal_all_nans) {
94
- gen_helper_vfp_cmpes_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
95
- } else {
96
- gen_helper_vfp_cmps_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
97
+
98
+ switch (size) {
99
+ case MO_32:
100
+ if (signal_all_nans) {
101
+ gen_helper_vfp_cmpes_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
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);
138
+ return;
139
+ }
140
+
141
+ switch (type) {
142
+ case 0:
143
+ size = MO_32;
144
+ break;
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);
185
+ return;
186
+ }
187
+
188
+ switch (type) {
189
+ case 0:
190
+ size = MO_32;
191
+ break;
192
+ case 1:
193
+ size = MO_64;
194
+ break;
195
+ case 3:
196
+ size = MO_16;
197
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
198
+ break;
199
+ }
200
+ /* fallthru */
201
+ default:
202
unallocated_encoding(s);
203
return;
204
}
205
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
206
gen_set_label(label_match);
207
}
208
209
- handle_fp_compare(s, type, rn, rm, false, op);
210
+ handle_fp_compare(s, size, rn, rm, false, op);
211
212
if (cond < 0x0e) {
213
gen_set_label(label_continue);
214
--
83
--
215
2.17.0
84
2.19.1
216
85
217
86
diff view generated by jsdifflib
Deleted patch
1
From: Alex Bennée <alex.bennee@linaro.org>
2
1
3
These were missed out from the rest of the half-precision work.
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>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
target/arm/translate-a64.c | 31 +++++++++++++++++++++++++------
16
1 file changed, 25 insertions(+), 6 deletions(-)
17
18
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/translate-a64.c
21
+++ b/target/arm/translate-a64.c
22
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
23
unsigned int mos, type, rm, cond, rn, rd;
24
TCGv_i64 t_true, t_false, t_zero;
25
DisasCompare64 c;
26
+ TCGMemOp sz;
27
28
mos = extract32(insn, 29, 3);
29
- type = extract32(insn, 22, 2); /* 0 = single, 1 = double */
30
+ type = extract32(insn, 22, 2);
31
rm = extract32(insn, 16, 5);
32
cond = extract32(insn, 12, 4);
33
rn = extract32(insn, 5, 5);
34
rd = extract32(insn, 0, 5);
35
36
- if (mos || type > 1) {
37
+ if (mos) {
38
+ unallocated_encoding(s);
39
+ return;
40
+ }
41
+
42
+ switch (type) {
43
+ case 0:
44
+ sz = MO_32;
45
+ break;
46
+ case 1:
47
+ sz = MO_64;
48
+ break;
49
+ case 3:
50
+ sz = MO_16;
51
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
52
+ break;
53
+ }
54
+ /* fallthru */
55
+ default:
56
unallocated_encoding(s);
57
return;
58
}
59
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
60
return;
61
}
62
63
- /* Zero extend sreg inputs to 64 bits now. */
64
+ /* Zero extend sreg & hreg inputs to 64 bits now. */
65
t_true = tcg_temp_new_i64();
66
t_false = tcg_temp_new_i64();
67
- read_vec_element(s, t_true, rn, 0, type ? MO_64 : MO_32);
68
- read_vec_element(s, t_false, rm, 0, type ? MO_64 : MO_32);
69
+ read_vec_element(s, t_true, rn, 0, sz);
70
+ read_vec_element(s, t_false, rm, 0, sz);
71
72
a64_test_cc(&c, cond);
73
t_zero = tcg_const_i64(0);
74
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
75
tcg_temp_free_i64(t_false);
76
a64_free_cc(&c);
77
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);
83
--
84
2.17.0
85
86
diff view generated by jsdifflib
Deleted patch
1
From: Alex Bennée <alex.bennee@linaro.org>
2
1
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.
5
6
Cc: qemu-stable@nongnu.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.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>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
target/arm/translate-a64.c | 20 +++++++++++++++++---
17
1 file changed, 17 insertions(+), 3 deletions(-)
18
19
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/translate-a64.c
22
+++ b/target/arm/translate-a64.c
23
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
24
{
25
int rd = extract32(insn, 0, 5);
26
int imm8 = extract32(insn, 13, 8);
27
- int is_double = extract32(insn, 22, 2);
28
+ int type = extract32(insn, 22, 2);
29
uint64_t imm;
30
TCGv_i64 tcg_res;
31
+ TCGMemOp sz;
32
33
- if (is_double > 1) {
34
+ switch (type) {
35
+ case 0:
36
+ sz = MO_32;
37
+ break;
38
+ case 1:
39
+ sz = MO_64;
40
+ break;
41
+ case 3:
42
+ sz = MO_16;
43
+ if (arm_dc_feature(s, ARM_FEATURE_V8_FP16)) {
44
+ break;
45
+ }
46
+ /* fallthru */
47
+ default:
48
unallocated_encoding(s);
49
return;
50
}
51
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
52
return;
53
}
54
55
- imm = vfp_expand_imm(MO_32 + is_double, imm8);
56
+ imm = vfp_expand_imm(sz, imm8);
57
58
tcg_res = tcg_const_i64(imm);
59
write_fp_dreg(s, rd, tcg_res);
60
--
61
2.17.0
62
63
diff view generated by jsdifflib
Deleted patch
1
From: Alex Bennée <alex.bennee@linaro.org>
2
1
3
We are meant to explicitly pass fpst, not cpu_env.
4
5
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Tested-by: Alex Bennée <alex.bennee@linaro.org>
10
Message-id: 20180512003217.9105-12-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/translate-a64.c | 3 ++-
14
1 file changed, 2 insertions(+), 1 deletion(-)
15
16
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-a64.c
19
+++ b/target/arm/translate-a64.c
20
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
21
tcg_gen_xori_i32(tcg_res, tcg_op, 0x8000);
22
break;
23
case 0x3: /* FSQRT */
24
- gen_helper_sqrt_f16(tcg_res, tcg_op, cpu_env);
25
+ fpst = get_fpstatus_ptr(true);
26
+ gen_helper_sqrt_f16(tcg_res, tcg_op, fpst);
27
break;
28
case 0x8: /* FRINTN */
29
case 0x9: /* FRINTP */
30
--
31
2.17.0
32
33
diff view generated by jsdifflib
1
Usually the logging of the CPU state produced by -d cpu is sufficient
1
In practice for most of the more-or-less orphan Arm board models,
2
to diagnose problems, but sometimes you want to see the state of
2
I will review patches and put them in via the target-arm tree.
3
the floating point registers as well. We don't want to enable that
3
So list myself as an "Odd Fixes" status maintainer for them.
4
by default as it adds a lot of extra data to the log; instead,
4
5
allow it to be optionally enabled via -d fpu.
5
This commit downgrades these boards to "Odd Fixes":
6
* Allwinner-A10
7
* Exynos
8
* Calxeda Highbank
9
* Canon DIGIC
10
* Musicpal
11
* nSeries
12
* Palm
13
* PXA2xx
14
15
These boards were already "Odd Fixes":
16
* Gumstix
17
* i.MX31 (kzm)
18
19
Philippe Mathieu-Daudé has requested to be moved to R:
20
status for Gumstix now that I am listed as the M: contact.
21
22
Some boards are maintained, but their patches still go
23
via the target-arm tree, so add myself as a secondary
24
maintainer contact for those:
25
* Xilinx Zynq
26
* Xilinx ZynqMP
27
* STM32F205
28
* Netduino 2
29
* SmartFusion2
30
* Mecraft M2S-FG484
31
* ASPEED BMCs
32
* NRF51
6
33
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
34
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
35
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 20180510130024.31678-1-peter.maydell@linaro.org
36
Reviewed-by: Thomas Huth <thuth@redhat.com>
37
Message-id: 20181108134139.31666-1-peter.maydell@linaro.org
10
---
38
---
11
include/qemu/log.h | 1 +
39
MAINTAINERS | 36 +++++++++++++++++++++++++++---------
12
accel/tcg/cpu-exec.c | 9 ++++++---
40
1 file changed, 27 insertions(+), 9 deletions(-)
13
util/log.c | 2 ++
41
14
3 files changed, 9 insertions(+), 3 deletions(-)
42
diff --git a/MAINTAINERS b/MAINTAINERS
15
16
diff --git a/include/qemu/log.h b/include/qemu/log.h
17
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
18
--- a/include/qemu/log.h
44
--- a/MAINTAINERS
19
+++ b/include/qemu/log.h
45
+++ b/MAINTAINERS
20
@@ -XXX,XX +XXX,XX @@ static inline bool qemu_log_separate(void)
46
@@ -XXX,XX +XXX,XX @@ ARM Machines
21
#define CPU_LOG_PAGE (1 << 14)
47
------------
22
/* LOG_TRACE (1 << 15) is defined in log-for-trace.h */
48
Allwinner-a10
23
#define CPU_LOG_TB_OP_IND (1 << 16)
49
M: Beniamino Galvani <b.galvani@gmail.com>
24
+#define CPU_LOG_TB_FPU (1 << 17)
50
+M: Peter Maydell <peter.maydell@linaro.org>
25
51
L: qemu-arm@nongnu.org
26
/* Lock output for a series of related logs. Since this is not needed
52
-S: Maintained
27
* for a single qemu_log / qemu_log_mask / qemu_log_mask_and_addr, we
53
+S: Odd Fixes
28
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
54
F: hw/*/allwinner*
29
index XXXXXXX..XXXXXXX 100644
55
F: include/hw/*/allwinner*
30
--- a/accel/tcg/cpu-exec.c
56
F: hw/arm/cubieboard.c
31
+++ b/accel/tcg/cpu-exec.c
57
@@ -XXX,XX +XXX,XX @@ F: tests/test-arm-mptimer.c
32
@@ -XXX,XX +XXX,XX @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock *itb)
58
33
if (qemu_loglevel_mask(CPU_LOG_TB_CPU)
59
Exynos
34
&& qemu_log_in_addr_range(itb->pc)) {
60
M: Igor Mitsyanko <i.mitsyanko@gmail.com>
35
qemu_log_lock();
61
+M: Peter Maydell <peter.maydell@linaro.org>
36
+ int flags = 0;
62
L: qemu-arm@nongnu.org
37
+ if (qemu_loglevel_mask(CPU_LOG_TB_FPU)) {
63
-S: Maintained
38
+ flags |= CPU_DUMP_FPU;
64
+S: Odd Fixes
39
+ }
65
F: hw/*/exynos*
40
#if defined(TARGET_I386)
66
F: include/hw/arm/exynos4210.h
41
- log_cpu_state(cpu, CPU_DUMP_CCOP);
67
42
-#else
68
Calxeda Highbank
43
- log_cpu_state(cpu, 0);
69
M: Rob Herring <robh@kernel.org>
44
+ flags |= CPU_DUMP_CCOP;
70
+M: Peter Maydell <peter.maydell@linaro.org>
45
#endif
71
L: qemu-arm@nongnu.org
46
+ log_cpu_state(cpu, flags);
72
-S: Maintained
47
qemu_log_unlock();
73
+S: Odd Fixes
48
}
74
F: hw/arm/highbank.c
49
#endif /* DEBUG_DISAS */
75
F: hw/net/xgmac.c
50
diff --git a/util/log.c b/util/log.c
76
51
index XXXXXXX..XXXXXXX 100644
77
Canon DIGIC
52
--- a/util/log.c
78
M: Antony Pavlov <antonynpavlov@gmail.com>
53
+++ b/util/log.c
79
+M: Peter Maydell <peter.maydell@linaro.org>
54
@@ -XXX,XX +XXX,XX @@ const QEMULogItem qemu_log_items[] = {
80
L: qemu-arm@nongnu.org
55
"show trace before each executed TB (lots of logs)" },
81
-S: Maintained
56
{ CPU_LOG_TB_CPU, "cpu",
82
+S: Odd Fixes
57
"show CPU registers before entering a TB (lots of logs)" },
83
F: include/hw/arm/digic.h
58
+ { CPU_LOG_TB_FPU, "fpu",
84
F: hw/*/digic*
59
+ "include FPU registers in the 'cpu' logging" },
85
60
{ CPU_LOG_MMU, "mmu",
86
Gumstix
61
"log MMU-related activities" },
87
-M: Philippe Mathieu-Daudé <f4bug@amsat.org>
62
{ CPU_LOG_PCALL, "pcall",
88
+M: Peter Maydell <peter.maydell@linaro.org>
89
+R: Philippe Mathieu-Daudé <f4bug@amsat.org>
90
L: qemu-devel@nongnu.org
91
L: qemu-arm@nongnu.org
92
S: Odd Fixes
93
@@ -XXX,XX +XXX,XX @@ F: hw/arm/gumstix.c
94
95
i.MX31 (kzm)
96
M: Peter Chubb <peter.chubb@nicta.com.au>
97
+M: Peter Maydell <peter.maydell@linaro.org>
98
L: qemu-arm@nongnu.org
99
S: Odd Fixes
100
F: hw/arm/kzm.c
101
@@ -XXX,XX +XXX,XX @@ F: include/hw/misc/iotkit-sysinfo.h
102
103
Musicpal
104
M: Jan Kiszka <jan.kiszka@web.de>
105
+M: Peter Maydell <peter.maydell@linaro.org>
106
L: qemu-arm@nongnu.org
107
-S: Maintained
108
+S: Odd Fixes
109
F: hw/arm/musicpal.c
110
111
nSeries
112
M: Andrzej Zaborowski <balrogg@gmail.com>
113
+M: Peter Maydell <peter.maydell@linaro.org>
114
L: qemu-arm@nongnu.org
115
-S: Maintained
116
+S: Odd Fixes
117
F: hw/arm/nseries.c
118
119
Palm
120
M: Andrzej Zaborowski <balrogg@gmail.com>
121
+M: Peter Maydell <peter.maydell@linaro.org>
122
L: qemu-arm@nongnu.org
123
-S: Maintained
124
+S: Odd Fixes
125
F: hw/arm/palm.c
126
127
Raspberry Pi
128
@@ -XXX,XX +XXX,XX @@ F: include/hw/intc/realview_gic.h
129
130
PXA2XX
131
M: Andrzej Zaborowski <balrogg@gmail.com>
132
+M: Peter Maydell <peter.maydell@linaro.org>
133
L: qemu-arm@nongnu.org
134
-S: Maintained
135
+S: Odd Fixes
136
F: hw/arm/mainstone.c
137
F: hw/arm/spitz.c
138
F: hw/arm/tosa.c
139
@@ -XXX,XX +XXX,XX @@ F: include/hw/arm/virt.h
140
Xilinx Zynq
141
M: Edgar E. Iglesias <edgar.iglesias@gmail.com>
142
M: Alistair Francis <alistair@alistair23.me>
143
+M: Peter Maydell <peter.maydell@linaro.org>
144
L: qemu-arm@nongnu.org
145
S: Maintained
146
F: hw/*/xilinx_*
147
@@ -XXX,XX +XXX,XX @@ X: hw/ssi/xilinx_*
148
Xilinx ZynqMP
149
M: Alistair Francis <alistair@alistair23.me>
150
M: Edgar E. Iglesias <edgar.iglesias@gmail.com>
151
+M: Peter Maydell <peter.maydell@linaro.org>
152
L: qemu-arm@nongnu.org
153
S: Maintained
154
F: hw/*/xlnx*.c
155
@@ -XXX,XX +XXX,XX @@ F: hw/arm/virt-acpi-build.c
156
157
STM32F205
158
M: Alistair Francis <alistair@alistair23.me>
159
+M: Peter Maydell <peter.maydell@linaro.org>
160
S: Maintained
161
F: hw/arm/stm32f205_soc.c
162
F: hw/misc/stm32f2xx_syscfg.c
163
@@ -XXX,XX +XXX,XX @@ F: include/hw/*/stm32*.h
164
165
Netduino 2
166
M: Alistair Francis <alistair@alistair23.me>
167
+M: Peter Maydell <peter.maydell@linaro.org>
168
S: Maintained
169
F: hw/arm/netduino2.c
170
171
SmartFusion2
172
M: Subbaraya Sundeep <sundeep.lkml@gmail.com>
173
+M: Peter Maydell <peter.maydell@linaro.org>
174
S: Maintained
175
F: hw/arm/msf2-soc.c
176
F: hw/misc/msf2-sysreg.c
177
@@ -XXX,XX +XXX,XX @@ F: include/hw/ssi/mss-spi.h
178
179
Emcraft M2S-FG484
180
M: Subbaraya Sundeep <sundeep.lkml@gmail.com>
181
+M: Peter Maydell <peter.maydell@linaro.org>
182
S: Maintained
183
F: hw/arm/msf2-som.c
184
185
ASPEED BMCs
186
M: Cédric Le Goater <clg@kaod.org>
187
+M: Peter Maydell <peter.maydell@linaro.org>
188
R: Andrew Jeffery <andrew@aj.id.au>
189
R: Joel Stanley <joel@jms.id.au>
190
L: qemu-arm@nongnu.org
191
@@ -XXX,XX +XXX,XX @@ F: include/hw/net/ftgmac100.h
192
193
NRF51
194
M: Joel Stanley <joel@jms.id.au>
195
+M: Peter Maydell <peter.maydell@linaro.org>
196
L: qemu-arm@nongnu.org
197
S: Maintained
198
F: hw/arm/nrf51_soc.c
63
--
199
--
64
2.17.0
200
2.19.1
65
201
66
202
diff view generated by jsdifflib