1
ARM queue: nothing particularly exciting, but 18 patches
1
The following changes since commit 0d3e41d5efd638a0c5682f6813b26448c3c51624:
2
is enough to send out.
3
2
4
thanks
3
Merge remote-tracking branch 'remotes/vivier2/tags/trivial-branch-pull-request' into staging (2019-02-14 17:42:25 +0000)
5
-- PMM
6
4
7
The following changes since commit 3dabde1128b671f36ac6cb36b97b273139964420:
5
are available in the Git repository at:
8
6
9
Merge remote-tracking branch 'remotes/dgilbert/tags/pull-hmp-20170914' into staging (2017-09-14 16:33:02 +0100)
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190214
10
8
11
are available in the git repository at:
9
for you to fetch changes up to 497bc12b1b374ecd62903bf062229bd93f8924af:
12
10
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20170914
11
gdbstub: Send a reply to the vKill packet. (2019-02-14 18:45:49 +0000)
14
15
for you to fetch changes up to ce3bc112cdb1d462e2d52eaa17a7314e7f3af504:
16
17
mps2-an511: Fix wiring of UART overflow interrupt lines (2017-09-14 18:43:19 +0100)
18
12
19
----------------------------------------------------------------
13
----------------------------------------------------------------
20
target-arm queue:
14
target-arm queue:
21
* v7M: various code cleanups
15
* gdbstub: Send a reply to the vKill packet
22
* v7M: set correct BFSR bits on bus fault
16
* Improve codegen for neon min/max and saturating arithmetic
23
* v7M: clear exclusive monitor on reset and exception entry/exit
17
* Fix a bug in clearing FPSCR exception status bits
24
* v7M: don't apply priority mask to negative priorities
18
* hw/arm/armsse: Fix miswiring of expansion IRQs
25
* zcu102: support 'secure' and 'virtualization' machine properties
19
* hw/intc/armv7m_nvic: Allow byte accesses to SHPR1
26
* aarch64: fix ERET single stepping
20
* MAINTAINERS: Remove Peter Crosthwaite from various entries
27
* gpex: implement PCI INTx routing
21
* arm: Allow system registers for KVM guests to be changed by QEMU code
28
* mps2-an511: fix UART overflow interrupt line wiring
22
* linux-user: support HWCAP_CPUID which exposes ID registers to user code
23
* Fix bug in 128-bit cmpxchg for BE Arm guests
24
* Implement (no-op) HACR_EL2
25
* Fix CRn to be 14 for PMEVTYPER/PMEVCNTR
29
26
30
----------------------------------------------------------------
27
----------------------------------------------------------------
31
Alistair Francis (5):
28
Aaron Lindsay OS (1):
32
xlnx-ep108: Rename to ZCU102
29
target/arm: Fix CRn to be 14 for PMEVTYPER/PMEVCNTR
33
xlnx-zcu102: Manually create the machines
34
xlnx-zcu102: Add a machine level secure property
35
xlnx-zcu102: Add a machine level virtualization property
36
xlnx-zcu102: Mark the EP108 machine as deprecated
37
30
38
Jaroslaw Pelczar (1):
31
Alex Bennée (5):
39
AArch64: Fix single stepping of ERET instruction
32
target/arm: relax permission checks for HWCAP_CPUID registers
33
target/arm: expose CPUID registers to userspace
34
target/arm: expose MPIDR_EL1 to userspace
35
target/arm: expose remaining CPUID registers as RAZ
36
linux-user/elfload: enable HWCAP_CPUID for AArch64
40
37
41
Peter Maydell (8):
38
Catherine Ho (1):
42
target/arm: Use M_REG_NUM_BANKS rather than hardcoding 2
39
target/arm: Fix int128_make128 lo, hi order in paired_cmpxchg64_be
43
target/arm: Clear exclusive monitor on v7M reset, exception entry/exit
44
target/arm: Get PRECISERR and IBUSERR the right way round
45
nvic: Don't apply group priority mask to negative priorities
46
target/arm: Remove unnecessary '| 0xf0000000' from do_v7m_exception_exit()
47
target/arm: Add and use defines for EXCRET constants
48
target/arm: Rename 'type' to 'excret' in do_v7m_exception_exit()
49
mps2-an511: Fix wiring of UART overflow interrupt lines
50
40
51
Pranavkumar Sawargaonkar (3):
41
Peter Maydell (5):
52
hw/pci-host/gpex: Set INTx index/gsi mapping
42
target/arm: Implement HACR_EL2
53
hw/arm/virt: Set INTx/gsi mapping
43
arm: Allow system registers for KVM guests to be changed by QEMU code
54
hw/pci-host/gpex: Implement PCI INTx routing
44
MAINTAINERS: Remove Peter Crosthwaite from various entries
45
hw/intc/armv7m_nvic: Allow byte accesses to SHPR1
46
hw/arm/armsse: Fix miswiring of expansion IRQs
55
47
56
Richard Henderson (1):
48
Richard Henderson (14):
57
target/arm: Avoid an extra temporary for store_exclusive
49
target/arm: Force result size into dp after operation
50
target/arm: Restructure disas_fp_int_conv
51
target/arm: Rely on optimization within tcg_gen_gvec_or
52
target/arm: Use vector minmax expanders for aarch64
53
target/arm: Use vector minmax expanders for aarch32
54
target/arm: Use tcg integer min/max primitives for neon
55
target/arm: Remove neon min/max helpers
56
target/arm: Fix vfp_gdb_get/set_reg vs FPSCR
57
target/arm: Fix arm_cpu_dump_state vs FPSCR
58
target/arm: Split out flags setting from vfp compares
59
target/arm: Fix set of bits kept in xregs[ARM_VFP_FPSCR]
60
target/arm: Split out FPSCR.QC to a vector field
61
target/arm: Use vector operations for saturation
62
target/arm: Add missing clear_tail calls
58
63
59
hw/arm/Makefile.objs | 2 +-
64
Sandra Loosemore (1):
60
include/hw/arm/xlnx-zynqmp.h | 2 +
65
gdbstub: Send a reply to the vKill packet.
61
include/hw/pci-host/gpex.h | 3 +
62
target/arm/cpu.h | 35 +++---
63
target/arm/internals.h | 20 ++++
64
hw/arm/mps2.c | 4 +-
65
hw/arm/virt.c | 1 +
66
hw/arm/xlnx-ep108.c | 139 -----------------------
67
hw/arm/xlnx-zcu102.c | 259 +++++++++++++++++++++++++++++++++++++++++++
68
hw/arm/xlnx-zynqmp.c | 3 +-
69
hw/intc/armv7m_nvic.c | 11 +-
70
hw/pci-host/gpex.c | 22 ++++
71
target/arm/cpu.c | 6 +
72
target/arm/helper.c | 43 ++++---
73
target/arm/op_helper.c | 2 +-
74
target/arm/translate-a64.c | 27 ++---
75
16 files changed, 382 insertions(+), 197 deletions(-)
76
delete mode 100644 hw/arm/xlnx-ep108.c
77
create mode 100644 hw/arm/xlnx-zcu102.c
78
66
67
target/arm/cpu.h | 50 ++++++++-
68
target/arm/helper.h | 45 +++++---
69
target/arm/translate.h | 4 +
70
gdbstub.c | 1 +
71
hw/arm/armsse.c | 2 +-
72
hw/intc/armv7m_nvic.c | 4 +-
73
linux-user/elfload.c | 1 +
74
target/arm/helper-a64.c | 4 +-
75
target/arm/helper.c | 228 ++++++++++++++++++++++++++++++++--------
76
target/arm/kvm32.c | 20 +---
77
target/arm/kvm64.c | 2 +
78
target/arm/machine.c | 2 +-
79
target/arm/neon_helper.c | 14 +--
80
target/arm/translate-a64.c | 171 +++++++++++++++---------------
81
target/arm/translate-sve.c | 6 +-
82
target/arm/translate.c | 251 ++++++++++++++++++++++++++++++++++-----------
83
target/arm/vec_helper.c | 134 +++++++++++++++++++++++-
84
MAINTAINERS | 4 -
85
18 files changed, 687 insertions(+), 256 deletions(-)
86
diff view generated by jsdifflib
1
For a bus fault, the M profile BFSR bit PRECISERR means a bus
1
From: Aaron Lindsay OS <aaron@os.amperecomputing.com>
2
fault on a data access, and IBUSERR means a bus fault on an
3
instruction access. We had these the wrong way around; fix this.
4
2
3
This bug was introduced in:
4
commit 5ecdd3e47cadae83a62dc92b472f1fe163b56f59
5
target/arm: Finish implementation of PM[X]EVCNTR and PM[X]EVTYPER
6
7
Signed-off-by: Aaron Lindsay <aaron@os.amperecomputing.com>
8
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
9
Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com>
10
Message-id: 20190205135129.19338-1-aaron@os.amperecomputing.com
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 1505137930-13255-4-git-send-email-peter.maydell@linaro.org
9
---
12
---
10
target/arm/helper.c | 8 ++++----
13
target/arm/helper.c | 8 ++++----
11
1 file changed, 4 insertions(+), 4 deletions(-)
14
1 file changed, 4 insertions(+), 4 deletions(-)
12
15
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
18
--- a/target/arm/helper.c
16
+++ b/target/arm/helper.c
19
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
20
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
18
case 0x8: /* External Abort */
21
char *pmevtyper_name = g_strdup_printf("PMEVTYPER%d", i);
19
switch (cs->exception_index) {
22
char *pmevtyper_el0_name = g_strdup_printf("PMEVTYPER%d_EL0", i);
20
case EXCP_PREFETCH_ABORT:
23
ARMCPRegInfo pmev_regs[] = {
21
- env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_PRECISERR_MASK;
24
- { .name = pmevcntr_name, .cp = 15, .crn = 15,
22
- qemu_log_mask(CPU_LOG_INT, "...with CFSR.PRECISERR\n");
25
+ { .name = pmevcntr_name, .cp = 15, .crn = 14,
23
+ env->v7m.cfsr[M_REG_NS] |= R_V7M_CFSR_IBUSERR_MASK;
26
.crm = 8 | (3 & (i >> 3)), .opc1 = 0, .opc2 = i & 7,
24
+ qemu_log_mask(CPU_LOG_INT, "...with CFSR.IBUSERR\n");
27
.access = PL0_RW, .type = ARM_CP_IO | ARM_CP_ALIAS,
25
break;
28
.readfn = pmevcntr_readfn, .writefn = pmevcntr_writefn,
26
case EXCP_DATA_ABORT:
29
.accessfn = pmreg_access },
27
env->v7m.cfsr[M_REG_NS] |=
30
{ .name = pmevcntr_el0_name, .state = ARM_CP_STATE_AA64,
28
- (R_V7M_CFSR_IBUSERR_MASK | R_V7M_CFSR_BFARVALID_MASK);
31
- .opc0 = 3, .opc1 = 3, .crn = 15, .crm = 8 | (3 & (i >> 3)),
29
+ (R_V7M_CFSR_PRECISERR_MASK | R_V7M_CFSR_BFARVALID_MASK);
32
+ .opc0 = 3, .opc1 = 3, .crn = 14, .crm = 8 | (3 & (i >> 3)),
30
env->v7m.bfar = env->exception.vaddress;
33
.opc2 = i & 7, .access = PL0_RW, .accessfn = pmreg_access,
31
qemu_log_mask(CPU_LOG_INT,
34
.type = ARM_CP_IO,
32
- "...with CFSR.IBUSERR and BFAR 0x%x\n",
35
.readfn = pmevcntr_readfn, .writefn = pmevcntr_writefn,
33
+ "...with CFSR.PRECISERR and BFAR 0x%x\n",
36
.raw_readfn = pmevcntr_rawread,
34
env->v7m.bfar);
37
.raw_writefn = pmevcntr_rawwrite },
35
break;
38
- { .name = pmevtyper_name, .cp = 15, .crn = 15,
36
}
39
+ { .name = pmevtyper_name, .cp = 15, .crn = 14,
40
.crm = 12 | (3 & (i >> 3)), .opc1 = 0, .opc2 = i & 7,
41
.access = PL0_RW, .type = ARM_CP_IO | ARM_CP_ALIAS,
42
.readfn = pmevtyper_readfn, .writefn = pmevtyper_writefn,
43
.accessfn = pmreg_access },
44
{ .name = pmevtyper_el0_name, .state = ARM_CP_STATE_AA64,
45
- .opc0 = 3, .opc1 = 3, .crn = 15, .crm = 12 | (3 & (i >> 3)),
46
+ .opc0 = 3, .opc1 = 3, .crn = 14, .crm = 12 | (3 & (i >> 3)),
47
.opc2 = i & 7, .access = PL0_RW, .accessfn = pmreg_access,
48
.type = ARM_CP_IO,
49
.readfn = pmevtyper_readfn, .writefn = pmevtyper_writefn,
37
--
50
--
38
2.7.4
51
2.20.1
39
52
40
53
diff view generated by jsdifflib
New patch
1
HACR_EL2 is a register with IMPDEF behaviour, which allows
2
implementation specific trapping to EL2. Implement it as RAZ/WI,
3
since QEMU's implementation has no extra traps. This also
4
matches what h/w implementations like Cortex-A53 and A57 do.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20190205181218.8995-1-peter.maydell@linaro.org
9
---
10
target/arm/helper.c | 6 ++++++
11
1 file changed, 6 insertions(+)
12
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/helper.c
16
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el3_no_el2_cp_reginfo[] = {
18
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 0,
19
.access = PL2_RW,
20
.type = ARM_CP_CONST, .resetvalue = 0 },
21
+ { .name = "HACR_EL2", .state = ARM_CP_STATE_BOTH,
22
+ .opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 7,
23
+ .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
24
{ .name = "ESR_EL2", .state = ARM_CP_STATE_BOTH,
25
.opc0 = 3, .opc1 = 4, .crn = 5, .crm = 2, .opc2 = 0,
26
.access = PL2_RW,
27
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
28
.cp = 15, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 0,
29
.access = PL2_RW, .fieldoffset = offsetof(CPUARMState, cp15.hcr_el2),
30
.writefn = hcr_writelow },
31
+ { .name = "HACR_EL2", .state = ARM_CP_STATE_BOTH,
32
+ .opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 7,
33
+ .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
34
{ .name = "ELR_EL2", .state = ARM_CP_STATE_AA64,
35
.type = ARM_CP_ALIAS,
36
.opc0 = 3, .opc1 = 4, .crn = 4, .crm = 0, .opc2 = 1,
37
--
38
2.20.1
39
40
diff view generated by jsdifflib
1
Fix an error that meant we were wiring every UART's overflow
1
From: Catherine Ho <catherine.hecx@gmail.com>
2
interrupts into the same inputs 0 and 1 of the OR gate,
3
rather than giving each its own input.
4
2
5
Cc: qemu-stable@nongnu.org
3
The lo,hi order is different from the comments. And in commit
4
1ec182c33379 ("target/arm: Convert to HAVE_CMPXCHG128"), it changes
5
the original code logic. So just restore the old code logic before this
6
commit:
7
do_paired_cmpxchg64_be():
8
cmpv = int128_make128(env->exclusive_high, env->exclusive_val);
9
newv = int128_make128(new_hi, new_lo);
10
11
This fixes a bug that would only be visible for big-endian
12
AArch64 guest code.
13
14
Fixes: 1ec182c33379 ("target/arm: Convert to HAVE_CMPXCHG128")
15
Signed-off-by: Catherine Ho <catherine.hecx@gmail.com>
16
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Message-id: 1548985244-24523-1-git-send-email-catherine.hecx@gmail.com
18
[PMM: added note that bug only affects BE guests]
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
9
Message-id: 1505232834-20890-1-git-send-email-peter.maydell@linaro.org
10
---
20
---
11
hw/arm/mps2.c | 4 ++--
21
target/arm/helper-a64.c | 4 ++--
12
1 file changed, 2 insertions(+), 2 deletions(-)
22
1 file changed, 2 insertions(+), 2 deletions(-)
13
23
14
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
24
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
15
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/mps2.c
26
--- a/target/arm/helper-a64.c
17
+++ b/hw/arm/mps2.c
27
+++ b/target/arm/helper-a64.c
18
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
28
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(paired_cmpxchg64_be)(CPUARMState *env, uint64_t addr,
19
cmsdk_apb_uart_create(uartbase[i],
29
* High and low need to be switched here because this is not actually a
20
qdev_get_gpio_in(txrx_orgate_dev, 0),
30
* 128bit store but two doublewords stored consecutively
21
qdev_get_gpio_in(txrx_orgate_dev, 1),
31
*/
22
- qdev_get_gpio_in(orgate_dev, 0),
32
- Int128 cmpv = int128_make128(env->exclusive_val, env->exclusive_high);
23
- qdev_get_gpio_in(orgate_dev, 1),
33
- Int128 newv = int128_make128(new_lo, new_hi);
24
+ qdev_get_gpio_in(orgate_dev, i * 2),
34
+ Int128 cmpv = int128_make128(env->exclusive_high, env->exclusive_val);
25
+ qdev_get_gpio_in(orgate_dev, i * 2 + 1),
35
+ Int128 newv = int128_make128(new_hi, new_lo);
26
NULL,
36
Int128 oldv;
27
uartchr, SYSCLK_FRQ);
37
uintptr_t ra = GETPC();
28
}
38
uint64_t o0, o1;
29
--
39
--
30
2.7.4
40
2.20.1
31
41
32
42
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Rather than a complex set of cases testing for writeback,
4
adjust DP after performing the operation.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20190206052857.5077-2-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate.c | 32 ++++++++++++++++----------------
12
1 file changed, 16 insertions(+), 16 deletions(-)
13
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.c
17
+++ b/target/arm/translate.c
18
@@ -XXX,XX +XXX,XX @@ static int disas_vfp_insn(DisasContext *s, uint32_t insn)
19
tcg_gen_or_i32(tmp, tmp, tmp2);
20
tcg_temp_free_i32(tmp2);
21
gen_vfp_msr(tmp);
22
+ dp = 0; /* always a single precision result */
23
break;
24
}
25
case 7: /* vcvtt.f16.f32, vcvtt.f16.f64 */
26
@@ -XXX,XX +XXX,XX @@ static int disas_vfp_insn(DisasContext *s, uint32_t insn)
27
tcg_gen_or_i32(tmp, tmp, tmp2);
28
tcg_temp_free_i32(tmp2);
29
gen_vfp_msr(tmp);
30
+ dp = 0; /* always a single precision result */
31
break;
32
}
33
case 8: /* cmp */
34
gen_vfp_cmp(dp);
35
+ dp = -1; /* no write back */
36
break;
37
case 9: /* cmpe */
38
gen_vfp_cmpe(dp);
39
+ dp = -1; /* no write back */
40
break;
41
case 10: /* cmpz */
42
gen_vfp_cmp(dp);
43
+ dp = -1; /* no write back */
44
break;
45
case 11: /* cmpez */
46
gen_vfp_F1_ld0(dp);
47
gen_vfp_cmpe(dp);
48
+ dp = -1; /* no write back */
49
break;
50
case 12: /* vrintr */
51
{
52
@@ -XXX,XX +XXX,XX @@ static int disas_vfp_insn(DisasContext *s, uint32_t insn)
53
break;
54
}
55
case 15: /* single<->double conversion */
56
- if (dp)
57
+ if (dp) {
58
gen_helper_vfp_fcvtsd(cpu_F0s, cpu_F0d, cpu_env);
59
- else
60
+ } else {
61
gen_helper_vfp_fcvtds(cpu_F0d, cpu_F0s, cpu_env);
62
+ }
63
+ dp = !dp; /* result size is opposite */
64
break;
65
case 16: /* fuito */
66
gen_vfp_uito(dp, 0);
67
@@ -XXX,XX +XXX,XX @@ static int disas_vfp_insn(DisasContext *s, uint32_t insn)
68
break;
69
case 24: /* ftoui */
70
gen_vfp_toui(dp, 0);
71
+ dp = 0; /* always an integer result */
72
break;
73
case 25: /* ftouiz */
74
gen_vfp_touiz(dp, 0);
75
+ dp = 0; /* always an integer result */
76
break;
77
case 26: /* ftosi */
78
gen_vfp_tosi(dp, 0);
79
+ dp = 0; /* always an integer result */
80
break;
81
case 27: /* ftosiz */
82
gen_vfp_tosiz(dp, 0);
83
+ dp = 0; /* always an integer result */
84
break;
85
case 28: /* ftosh */
86
if (!arm_dc_feature(s, ARM_FEATURE_VFP3)) {
87
@@ -XXX,XX +XXX,XX @@ static int disas_vfp_insn(DisasContext *s, uint32_t insn)
88
return 1;
89
}
90
91
- /* Write back the result. */
92
- if (op == 15 && (rn >= 8 && rn <= 11)) {
93
- /* Comparison, do nothing. */
94
- } else if (op == 15 && dp && ((rn & 0x1c) == 0x18 ||
95
- (rn & 0x1e) == 0x6)) {
96
- /* VCVT double to int: always integer result.
97
- * VCVT double to half precision is always a single
98
- * precision result.
99
- */
100
- gen_mov_vreg_F0(0, rd);
101
- } else if (op == 15 && rn == 15) {
102
- /* conversion */
103
- gen_mov_vreg_F0(!dp, rd);
104
- } else {
105
+ /* Write back the result, if any. */
106
+ if (dp >= 0) {
107
gen_mov_vreg_F0(dp, rd);
108
}
109
110
--
111
2.20.1
112
113
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Instead of copying addr to a local temp, reuse the value (which we
3
For opcodes 0-5, move some if conditions into the structure
4
have just compared as equal) already saved in cpu_exclusive_addr.
4
of a switch statement. For opcodes 6 & 7, decode everything
5
at once with a second switch.
5
6
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
8
Message-id: 20190206052857.5077-3-richard.henderson@linaro.org
8
Message-id: 20170908163859.29820-1-richard.henderson@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 | 26 +++++++++-----------------
12
target/arm/translate-a64.c | 94 ++++++++++++++++++++------------------
12
1 file changed, 9 insertions(+), 17 deletions(-)
13
1 file changed, 49 insertions(+), 45 deletions(-)
13
14
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-a64.c
17
--- a/target/arm/translate-a64.c
17
+++ b/target/arm/translate-a64.c
18
+++ b/target/arm/translate-a64.c
18
@@ -XXX,XX +XXX,XX @@ static void gen_load_exclusive(DisasContext *s, int rt, int rt2,
19
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
20
int type = extract32(insn, 22, 2);
21
bool sbit = extract32(insn, 29, 1);
22
bool sf = extract32(insn, 31, 1);
23
+ bool itof = false;
24
25
if (sbit) {
26
- unallocated_encoding(s);
27
- return;
28
+ goto do_unallocated;
29
}
30
31
- if (opcode > 5) {
32
- /* FMOV */
33
- bool itof = opcode & 1;
34
-
35
- if (rmode >= 2) {
36
- unallocated_encoding(s);
37
- return;
38
- }
39
-
40
- switch (sf << 3 | type << 1 | rmode) {
41
- case 0x0: /* 32 bit */
42
- case 0xa: /* 64 bit */
43
- case 0xd: /* 64 bit to top half of quad */
44
- break;
45
- case 0x6: /* 16-bit float, 32-bit int */
46
- case 0xe: /* 16-bit float, 64-bit int */
47
- if (dc_isar_feature(aa64_fp16, s)) {
48
- break;
49
- }
50
- /* fallthru */
51
- default:
52
- /* all other sf/type/rmode combinations are invalid */
53
- unallocated_encoding(s);
54
- return;
55
- }
56
-
57
- if (!fp_access_check(s)) {
58
- return;
59
- }
60
- handle_fmov(s, rd, rn, type, itof);
61
- } else {
62
- /* actual FP conversions */
63
- bool itof = extract32(opcode, 1, 1);
64
-
65
- if (rmode != 0 && opcode > 1) {
66
- unallocated_encoding(s);
67
- return;
68
+ switch (opcode) {
69
+ case 2: /* SCVTF */
70
+ case 3: /* UCVTF */
71
+ itof = true;
72
+ /* fallthru */
73
+ case 4: /* FCVTAS */
74
+ case 5: /* FCVTAU */
75
+ if (rmode != 0) {
76
+ goto do_unallocated;
77
}
78
+ /* fallthru */
79
+ case 0: /* FCVT[NPMZ]S */
80
+ case 1: /* FCVT[NPMZ]U */
81
switch (type) {
82
case 0: /* float32 */
83
case 1: /* float64 */
84
break;
85
case 3: /* float16 */
86
- if (dc_isar_feature(aa64_fp16, s)) {
87
- break;
88
+ if (!dc_isar_feature(aa64_fp16, s)) {
89
+ goto do_unallocated;
90
}
91
- /* fallthru */
92
+ break;
93
default:
94
- unallocated_encoding(s);
95
- return;
96
+ goto do_unallocated;
97
}
98
-
99
if (!fp_access_check(s)) {
100
return;
101
}
102
handle_fpfpcvt(s, rd, rn, opcode, itof, rmode, 64, sf, type);
103
+ break;
104
+
105
+ default:
106
+ switch (sf << 7 | type << 5 | rmode << 3 | opcode) {
107
+ case 0b01100110: /* FMOV half <-> 32-bit int */
108
+ case 0b01100111:
109
+ case 0b11100110: /* FMOV half <-> 64-bit int */
110
+ case 0b11100111:
111
+ if (!dc_isar_feature(aa64_fp16, s)) {
112
+ goto do_unallocated;
113
+ }
114
+ /* fallthru */
115
+ case 0b00000110: /* FMOV 32-bit */
116
+ case 0b00000111:
117
+ case 0b10100110: /* FMOV 64-bit */
118
+ case 0b10100111:
119
+ case 0b11001110: /* FMOV top half of 128-bit */
120
+ case 0b11001111:
121
+ if (!fp_access_check(s)) {
122
+ return;
123
+ }
124
+ itof = opcode & 1;
125
+ handle_fmov(s, rd, rn, type, itof);
126
+ break;
127
+
128
+ default:
129
+ do_unallocated:
130
+ unallocated_encoding(s);
131
+ return;
132
+ }
133
+ break;
134
}
19
}
135
}
20
136
21
static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2,
22
- TCGv_i64 inaddr, int size, int is_pair)
23
+ TCGv_i64 addr, int size, int is_pair)
24
{
25
/* if (env->exclusive_addr == addr && env->exclusive_val == [addr]
26
* && (!is_pair || env->exclusive_high == [addr + datasize])) {
27
@@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2,
28
*/
29
TCGLabel *fail_label = gen_new_label();
30
TCGLabel *done_label = gen_new_label();
31
- TCGv_i64 addr = tcg_temp_local_new_i64();
32
TCGv_i64 tmp;
33
34
- /* Copy input into a local temp so it is not trashed when the
35
- * basic block ends at the branch insn.
36
- */
37
- tcg_gen_mov_i64(addr, inaddr);
38
tcg_gen_brcond_i64(TCG_COND_NE, addr, cpu_exclusive_addr, fail_label);
39
40
tmp = tcg_temp_new_i64();
41
@@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2,
42
} else {
43
tcg_gen_concat32_i64(tmp, cpu_reg(s, rt2), cpu_reg(s, rt));
44
}
45
- tcg_gen_atomic_cmpxchg_i64(tmp, addr, cpu_exclusive_val, tmp,
46
+ tcg_gen_atomic_cmpxchg_i64(tmp, cpu_exclusive_addr,
47
+ cpu_exclusive_val, tmp,
48
get_mem_index(s),
49
MO_64 | MO_ALIGN | s->be_data);
50
tcg_gen_setcond_i64(TCG_COND_NE, tmp, tmp, cpu_exclusive_val);
51
} else if (s->be_data == MO_LE) {
52
- gen_helper_paired_cmpxchg64_le(tmp, cpu_env, addr, cpu_reg(s, rt),
53
- cpu_reg(s, rt2));
54
+ gen_helper_paired_cmpxchg64_le(tmp, cpu_env, cpu_exclusive_addr,
55
+ cpu_reg(s, rt), cpu_reg(s, rt2));
56
} else {
57
- gen_helper_paired_cmpxchg64_be(tmp, cpu_env, addr, cpu_reg(s, rt),
58
- cpu_reg(s, rt2));
59
+ gen_helper_paired_cmpxchg64_be(tmp, cpu_env, cpu_exclusive_addr,
60
+ cpu_reg(s, rt), cpu_reg(s, rt2));
61
}
62
} else {
63
- TCGv_i64 val = cpu_reg(s, rt);
64
- tcg_gen_atomic_cmpxchg_i64(tmp, addr, cpu_exclusive_val, val,
65
- get_mem_index(s),
66
+ tcg_gen_atomic_cmpxchg_i64(tmp, cpu_exclusive_addr, cpu_exclusive_val,
67
+ cpu_reg(s, rt), get_mem_index(s),
68
size | MO_ALIGN | s->be_data);
69
tcg_gen_setcond_i64(TCG_COND_NE, tmp, tmp, cpu_exclusive_val);
70
}
71
-
72
- tcg_temp_free_i64(addr);
73
-
74
tcg_gen_mov_i64(cpu_reg(s, rd), tmp);
75
tcg_temp_free_i64(tmp);
76
tcg_gen_br(done_label);
77
--
137
--
78
2.7.4
138
2.20.1
79
139
80
140
diff view generated by jsdifflib
New patch
1
From: Alex Bennée <alex.bennee@linaro.org>
1
2
3
Although technically not visible to userspace the kernel does make
4
them visible via a trap and emulate ABI. We provide a new permission
5
mask (PL0U_R) which maps to PL0_R for CONFIG_USER builds and adjust
6
the minimum permission check accordingly.
7
8
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20190205190224.2198-2-alex.bennee@linaro.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/cpu.h | 12 ++++++++++++
14
target/arm/helper.c | 6 +++++-
15
2 files changed, 17 insertions(+), 1 deletion(-)
16
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ static inline bool cptype_valid(int cptype)
22
#define PL0_R (0x02 | PL1_R)
23
#define PL0_W (0x01 | PL1_W)
24
25
+/*
26
+ * For user-mode some registers are accessible to EL0 via a kernel
27
+ * trap-and-emulate ABI. In this case we define the read permissions
28
+ * as actually being PL0_R. However some bits of any given register
29
+ * may still be masked.
30
+ */
31
+#ifdef CONFIG_USER_ONLY
32
+#define PL0U_R PL0_R
33
+#else
34
+#define PL0U_R PL1_R
35
+#endif
36
+
37
#define PL3_RW (PL3_R | PL3_W)
38
#define PL2_RW (PL2_R | PL2_W)
39
#define PL1_RW (PL1_R | PL1_W)
40
diff --git a/target/arm/helper.c b/target/arm/helper.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/helper.c
43
+++ b/target/arm/helper.c
44
@@ -XXX,XX +XXX,XX @@ void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
45
if (r->state != ARM_CP_STATE_AA32) {
46
int mask = 0;
47
switch (r->opc1) {
48
- case 0: case 1: case 2:
49
+ case 0:
50
+ /* min_EL EL1, but some accessible to EL0 via kernel ABI */
51
+ mask = PL0U_R | PL1_RW;
52
+ break;
53
+ case 1: case 2:
54
/* min_EL EL1 */
55
mask = PL1_RW;
56
break;
57
--
58
2.20.1
59
60
diff view generated by jsdifflib
1
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
1
From: Alex Bennée <alex.bennee@linaro.org>
2
2
3
To implement INTx to gsi routing we need to pass the gpex host
3
A number of CPUID registers are exposed to userspace by modern Linux
4
bridge the gsi associated to each INTx index. Let's introduce
4
kernels thanks to the "ARM64 CPU Feature Registers" ABI. For QEMU's
5
irq_num array and gpex_set_irq_num setter function.
5
user-mode emulation we don't need to emulate the kernels trap but just
6
return the value the trap would have done. To avoid too much #ifdef
7
hackery we process ARMCPRegInfo with a new helper (modify_arm_cp_regs)
8
before defining the registers. The modify routine is driven by a
9
simple data structure which describes which bits are exported and
10
which are fixed.
6
11
7
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
12
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
13
Message-id: 20190205190224.2198-3-alex.bennee@linaro.org
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Tested-by: Feng Kan <fkan@apm.com>
11
Reviewed-by: Andrew Jones <drjones@redhat.com>
12
Message-id: 1505296004-6798-2-git-send-email-eric.auger@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
16
---
15
include/hw/pci-host/gpex.h | 3 +++
17
target/arm/cpu.h | 21 ++++++++++++++++
16
hw/pci-host/gpex.c | 10 ++++++++++
18
target/arm/helper.c | 59 +++++++++++++++++++++++++++++++++++++++++++++
17
2 files changed, 13 insertions(+)
19
2 files changed, 80 insertions(+)
18
20
19
diff --git a/include/hw/pci-host/gpex.h b/include/hw/pci-host/gpex.h
21
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
20
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/pci-host/gpex.h
23
--- a/target/arm/cpu.h
22
+++ b/include/hw/pci-host/gpex.h
24
+++ b/target/arm/cpu.h
23
@@ -XXX,XX +XXX,XX @@ typedef struct GPEXHost {
25
@@ -XXX,XX +XXX,XX @@ static inline void define_one_arm_cp_reg(ARMCPU *cpu, const ARMCPRegInfo *regs)
24
MemoryRegion io_ioport;
26
}
25
MemoryRegion io_mmio;
27
const ARMCPRegInfo *get_arm_cp_reginfo(GHashTable *cpregs, uint32_t encoded_cp);
26
qemu_irq irq[GPEX_NUM_IRQS];
28
27
+ int irq_num[GPEX_NUM_IRQS];
29
+/*
28
} GPEXHost;
30
+ * Definition of an ARM co-processor register as viewed from
29
31
+ * userspace. This is used for presenting sanitised versions of
30
+int gpex_set_irq_num(GPEXHost *s, int index, int gsi);
32
+ * registers to userspace when emulating the Linux AArch64 CPU
33
+ * ID/feature ABI (advertised as HWCAP_CPUID).
34
+ */
35
+typedef struct ARMCPRegUserSpaceInfo {
36
+ /* Name of register */
37
+ const char *name;
31
+
38
+
32
#endif /* HW_GPEX_H */
39
+ /* Only some bits are exported to user space */
33
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
40
+ uint64_t exported_bits;
41
+
42
+ /* Fixed bits are applied after the mask */
43
+ uint64_t fixed_bits;
44
+} ARMCPRegUserSpaceInfo;
45
+
46
+#define REGUSERINFO_SENTINEL { .name = NULL }
47
+
48
+void modify_arm_cp_regs(ARMCPRegInfo *regs, const ARMCPRegUserSpaceInfo *mods);
49
+
50
/* CPWriteFn that can be used to implement writes-ignored behaviour */
51
void arm_cp_write_ignore(CPUARMState *env, const ARMCPRegInfo *ri,
52
uint64_t value);
53
diff --git a/target/arm/helper.c b/target/arm/helper.c
34
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/pci-host/gpex.c
55
--- a/target/arm/helper.c
36
+++ b/hw/pci-host/gpex.c
56
+++ b/target/arm/helper.c
37
@@ -XXX,XX +XXX,XX @@ static void gpex_set_irq(void *opaque, int irq_num, int level)
57
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
38
qemu_set_irq(s->irq[irq_num], level);
58
.resetvalue = cpu->pmceid1 },
59
REGINFO_SENTINEL
60
};
61
+#ifdef CONFIG_USER_ONLY
62
+ ARMCPRegUserSpaceInfo v8_user_idregs[] = {
63
+ { .name = "ID_AA64PFR0_EL1",
64
+ .exported_bits = 0x000f000f00ff0000,
65
+ .fixed_bits = 0x0000000000000011 },
66
+ { .name = "ID_AA64PFR1_EL1",
67
+ .exported_bits = 0x00000000000000f0 },
68
+ { .name = "ID_AA64ZFR0_EL1" },
69
+ { .name = "ID_AA64MMFR0_EL1",
70
+ .fixed_bits = 0x00000000ff000000 },
71
+ { .name = "ID_AA64MMFR1_EL1" },
72
+ { .name = "ID_AA64DFR0_EL1",
73
+ .fixed_bits = 0x0000000000000006 },
74
+ { .name = "ID_AA64DFR1_EL1" },
75
+ { .name = "ID_AA64AFR0_EL1" },
76
+ { .name = "ID_AA64AFR1_EL1" },
77
+ { .name = "ID_AA64ISAR0_EL1",
78
+ .exported_bits = 0x00fffffff0fffff0 },
79
+ { .name = "ID_AA64ISAR1_EL1",
80
+ .exported_bits = 0x000000f0ffffffff },
81
+ REGUSERINFO_SENTINEL
82
+ };
83
+ modify_arm_cp_regs(v8_idregs, v8_user_idregs);
84
+#endif
85
/* RVBAR_EL1 is only implemented if EL1 is the highest EL */
86
if (!arm_feature(env, ARM_FEATURE_EL3) &&
87
!arm_feature(env, ARM_FEATURE_EL2)) {
88
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
89
.opc1 = CP_ANY, .opc2 = CP_ANY, .access = PL1_W,
90
.type = ARM_CP_NOP | ARM_CP_OVERRIDE
91
};
92
+#ifdef CONFIG_USER_ONLY
93
+ ARMCPRegUserSpaceInfo id_v8_user_midr_cp_reginfo[] = {
94
+ { .name = "MIDR_EL1",
95
+ .exported_bits = 0x00000000ffffffff },
96
+ { .name = "REVIDR_EL1" },
97
+ REGUSERINFO_SENTINEL
98
+ };
99
+ modify_arm_cp_regs(id_v8_midr_cp_reginfo, id_v8_user_midr_cp_reginfo);
100
+#endif
101
if (arm_feature(env, ARM_FEATURE_OMAPCP) ||
102
arm_feature(env, ARM_FEATURE_STRONGARM)) {
103
ARMCPRegInfo *r;
104
@@ -XXX,XX +XXX,XX @@ void define_arm_cp_regs_with_opaque(ARMCPU *cpu,
105
}
39
}
106
}
40
107
41
+int gpex_set_irq_num(GPEXHost *s, int index, int gsi)
108
+/*
109
+ * Modify ARMCPRegInfo for access from userspace.
110
+ *
111
+ * This is a data driven modification directed by
112
+ * ARMCPRegUserSpaceInfo. All registers become ARM_CP_CONST as
113
+ * user-space cannot alter any values and dynamic values pertaining to
114
+ * execution state are hidden from user space view anyway.
115
+ */
116
+void modify_arm_cp_regs(ARMCPRegInfo *regs, const ARMCPRegUserSpaceInfo *mods)
42
+{
117
+{
43
+ if (index >= GPEX_NUM_IRQS) {
118
+ const ARMCPRegUserSpaceInfo *m;
44
+ return -EINVAL;
119
+ ARMCPRegInfo *r;
120
+
121
+ for (m = mods; m->name; m++) {
122
+ for (r = regs; r->type != ARM_CP_SENTINEL; r++) {
123
+ if (strcmp(r->name, m->name) == 0) {
124
+ r->type = ARM_CP_CONST;
125
+ r->access = PL0U_R;
126
+ r->resetvalue &= m->exported_bits;
127
+ r->resetvalue |= m->fixed_bits;
128
+ break;
129
+ }
130
+ }
45
+ }
131
+ }
46
+
47
+ s->irq_num[index] = gsi;
48
+ return 0;
49
+}
132
+}
50
+
133
+
51
static void gpex_host_realize(DeviceState *dev, Error **errp)
134
const ARMCPRegInfo *get_arm_cp_reginfo(GHashTable *cpregs, uint32_t encoded_cp)
52
{
135
{
53
PCIHostState *pci = PCI_HOST_BRIDGE(dev);
136
return g_hash_table_lookup(cpregs, &encoded_cp);
54
--
137
--
55
2.7.4
138
2.20.1
56
139
57
140
diff view generated by jsdifflib
1
In the v7M and v8M ARM ARM, the magic exception return values are
1
From: Alex Bennée <alex.bennee@linaro.org>
2
referred to as EXC_RETURN values, and in QEMU we use V7M_EXCRET_*
3
constants to define bits within them. Rename the 'type' variable
4
which holds the exception return value in do_v7m_exception_exit()
5
to excret, making it clearer that it does hold an EXC_RETURN value.
6
2
3
As this is a single register we could expose it with a simple ifdef
4
but we use the existing modify_arm_cp_regs mechanism for consistency.
5
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
Message-id: 20190205190224.2198-4-alex.bennee@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 1505137930-13255-8-git-send-email-peter.maydell@linaro.org
12
---
10
---
13
target/arm/helper.c | 23 ++++++++++++-----------
11
target/arm/helper.c | 21 ++++++++++++++-------
14
1 file changed, 12 insertions(+), 11 deletions(-)
12
1 file changed, 14 insertions(+), 7 deletions(-)
15
13
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/helper.c
16
--- a/target/arm/helper.c
19
+++ b/target/arm/helper.c
17
+++ b/target/arm/helper.c
20
@@ -XXX,XX +XXX,XX @@ static void v7m_push_stack(ARMCPU *cpu)
18
@@ -XXX,XX +XXX,XX @@ static uint64_t mpidr_read(CPUARMState *env, const ARMCPRegInfo *ri)
21
static void do_v7m_exception_exit(ARMCPU *cpu)
19
return mpidr_read_val(env);
22
{
20
}
23
CPUARMState *env = &cpu->env;
21
24
- uint32_t type;
22
-static const ARMCPRegInfo mpidr_cp_reginfo[] = {
25
+ uint32_t excret;
23
- { .name = "MPIDR", .state = ARM_CP_STATE_BOTH,
26
uint32_t xpsr;
24
- .opc0 = 3, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 5,
27
bool ufault = false;
25
- .access = PL1_R, .readfn = mpidr_read, .type = ARM_CP_NO_RAW },
28
bool return_to_sp_process = false;
26
- REGINFO_SENTINEL
29
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
27
-};
30
* the target value up between env->regs[15] and env->thumb in
28
-
31
* gen_bx(). Reconstitute it.
29
static const ARMCPRegInfo lpae_cp_reginfo[] = {
32
*/
30
/* NOP AMAIR0/1 */
33
- type = env->regs[15];
31
{ .name = "AMAIR0", .state = ARM_CP_STATE_BOTH,
34
+ excret = env->regs[15];
32
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
35
if (env->thumb) {
36
- type |= 1;
37
+ excret |= 1;
38
}
33
}
39
34
40
qemu_log_mask(CPU_LOG_INT, "Exception return: magic PC %" PRIx32
35
if (arm_feature(env, ARM_FEATURE_MPIDR)) {
41
" previous exception %d\n",
36
+ ARMCPRegInfo mpidr_cp_reginfo[] = {
42
- type, env->v7m.exception);
37
+ { .name = "MPIDR_EL1", .state = ARM_CP_STATE_BOTH,
43
+ excret, env->v7m.exception);
38
+ .opc0 = 3, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 5,
44
39
+ .access = PL1_R, .readfn = mpidr_read, .type = ARM_CP_NO_RAW },
45
- if ((type & R_V7M_EXCRET_RES1_MASK) != R_V7M_EXCRET_RES1_MASK) {
40
+ REGINFO_SENTINEL
46
+ if ((excret & R_V7M_EXCRET_RES1_MASK) != R_V7M_EXCRET_RES1_MASK) {
41
+ };
47
qemu_log_mask(LOG_GUEST_ERROR, "M profile: zero high bits in exception "
42
+#ifdef CONFIG_USER_ONLY
48
- "exit PC value 0x%" PRIx32 " are UNPREDICTABLE\n", type);
43
+ ARMCPRegUserSpaceInfo mpidr_user_cp_reginfo[] = {
49
+ "exit PC value 0x%" PRIx32 " are UNPREDICTABLE\n",
44
+ { .name = "MPIDR_EL1",
50
+ excret);
45
+ .fixed_bits = 0x0000000080000000 },
46
+ REGUSERINFO_SENTINEL
47
+ };
48
+ modify_arm_cp_regs(mpidr_cp_reginfo, mpidr_user_cp_reginfo);
49
+#endif
50
define_arm_cp_regs(cpu, mpidr_cp_reginfo);
51
}
51
}
52
52
53
if (env->v7m.exception != ARMV7M_EXCP_NMI) {
54
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
55
* which security state's faultmask to clear. (v8M ARM ARM R_KBNF.)
56
*/
57
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
58
- int es = type & R_V7M_EXCRET_ES_MASK;
59
+ int es = excret & R_V7M_EXCRET_ES_MASK;
60
if (armv7m_nvic_raw_execution_priority(env->nvic) >= 0) {
61
env->v7m.faultmask[es] = 0;
62
}
63
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
64
g_assert_not_reached();
65
}
66
67
- switch (type & 0xf) {
68
+ switch (excret & 0xf) {
69
case 1: /* Return to Handler */
70
return_to_handler = true;
71
break;
72
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
73
*/
74
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
75
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
76
- v7m_exception_taken(cpu, type);
77
+ v7m_exception_taken(cpu, excret);
78
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
79
"stackframe: failed exception return integrity check\n");
80
return;
81
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
82
83
/* The restored xPSR exception field will be zero if we're
84
* resuming in Thread mode. If that doesn't match what the
85
- * exception return type specified then this is a UsageFault.
86
+ * exception return excret specified then this is a UsageFault.
87
*/
88
if (return_to_handler != arm_v7m_is_handler_mode(env)) {
89
/* Take an INVPC UsageFault by pushing the stack again. */
90
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
91
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
92
v7m_push_stack(cpu);
93
- v7m_exception_taken(cpu, type);
94
+ v7m_exception_taken(cpu, excret);
95
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on new stackframe: "
96
"failed exception return integrity check\n");
97
return;
98
--
53
--
99
2.7.4
54
2.20.1
100
55
101
56
diff view generated by jsdifflib
1
Use a symbolic constant M_REG_NUM_BANKS for the array size for
1
From: Alex Bennée <alex.bennee@linaro.org>
2
registers which are banked by M profile security state, rather
3
than hardcoding lots of 2s.
4
2
5
Suggested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
There are a whole bunch more registers in the CPUID space which are
4
currently not used but are exposed as RAZ. To avoid too much
5
duplication we expand ARMCPRegUserSpaceInfo to understand glob
6
patterns so we only need one entry to tweak whole ranges of registers.
7
8
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20190205190224.2198-5-alex.bennee@linaro.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
9
Message-id: 1505137930-13255-2-git-send-email-peter.maydell@linaro.org
10
---
12
---
11
target/arm/cpu.h | 35 +++++++++++++++++++----------------
13
target/arm/cpu.h | 3 +++
12
1 file changed, 19 insertions(+), 16 deletions(-)
14
target/arm/helper.c | 26 +++++++++++++++++++++++---
15
2 files changed, 26 insertions(+), 3 deletions(-)
13
16
14
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/cpu.h
19
--- a/target/arm/cpu.h
17
+++ b/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ typedef struct ARMCPRegUserSpaceInfo {
19
* accessed via env->registerfield[env->v7m.secure] (whether the security
22
/* Name of register */
20
* extension is implemented or not).
23
const char *name;
21
*/
24
22
-#define M_REG_NS 0
25
+ /* Is the name actually a glob pattern */
23
-#define M_REG_S 1
26
+ bool is_glob;
24
+enum {
27
+
25
+ M_REG_NS = 0,
28
/* Only some bits are exported to user space */
26
+ M_REG_S = 1,
29
uint64_t exported_bits;
27
+ M_REG_NUM_BANKS = 2,
30
28
+};
31
diff --git a/target/arm/helper.c b/target/arm/helper.c
29
32
index XXXXXXX..XXXXXXX 100644
30
/* ARM-specific interrupt pending bits. */
33
--- a/target/arm/helper.c
31
#define CPU_INTERRUPT_FIQ CPU_INTERRUPT_TGT_EXT_1
34
+++ b/target/arm/helper.c
32
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
35
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
33
uint32_t other_sp;
36
.fixed_bits = 0x0000000000000011 },
34
uint32_t other_ss_msp;
37
{ .name = "ID_AA64PFR1_EL1",
35
uint32_t other_ss_psp;
38
.exported_bits = 0x00000000000000f0 },
36
- uint32_t vecbase[2];
39
+ { .name = "ID_AA64PFR*_EL1_RESERVED",
37
- uint32_t basepri[2];
40
+ .is_glob = true },
38
- uint32_t control[2];
41
{ .name = "ID_AA64ZFR0_EL1" },
39
- uint32_t ccr[2]; /* Configuration and Control */
42
{ .name = "ID_AA64MMFR0_EL1",
40
- uint32_t cfsr[2]; /* Configurable Fault Status */
43
.fixed_bits = 0x00000000ff000000 },
41
+ uint32_t vecbase[M_REG_NUM_BANKS];
44
{ .name = "ID_AA64MMFR1_EL1" },
42
+ uint32_t basepri[M_REG_NUM_BANKS];
45
+ { .name = "ID_AA64MMFR*_EL1_RESERVED",
43
+ uint32_t control[M_REG_NUM_BANKS];
46
+ .is_glob = true },
44
+ uint32_t ccr[M_REG_NUM_BANKS]; /* Configuration and Control */
47
{ .name = "ID_AA64DFR0_EL1",
45
+ uint32_t cfsr[M_REG_NUM_BANKS]; /* Configurable Fault Status */
48
.fixed_bits = 0x0000000000000006 },
46
uint32_t hfsr; /* HardFault Status */
49
{ .name = "ID_AA64DFR1_EL1" },
47
uint32_t dfsr; /* Debug Fault Status Register */
50
- { .name = "ID_AA64AFR0_EL1" },
48
- uint32_t mmfar[2]; /* MemManage Fault Address */
51
- { .name = "ID_AA64AFR1_EL1" },
49
+ uint32_t mmfar[M_REG_NUM_BANKS]; /* MemManage Fault Address */
52
+ { .name = "ID_AA64DFR*_EL1_RESERVED",
50
uint32_t bfar; /* BusFault Address */
53
+ .is_glob = true },
51
- unsigned mpu_ctrl[2]; /* MPU_CTRL */
54
+ { .name = "ID_AA64AFR*",
52
+ unsigned mpu_ctrl[M_REG_NUM_BANKS]; /* MPU_CTRL */
55
+ .is_glob = true },
53
int exception;
56
{ .name = "ID_AA64ISAR0_EL1",
54
- uint32_t primask[2];
57
.exported_bits = 0x00fffffff0fffff0 },
55
- uint32_t faultmask[2];
58
{ .name = "ID_AA64ISAR1_EL1",
56
+ uint32_t primask[M_REG_NUM_BANKS];
59
.exported_bits = 0x000000f0ffffffff },
57
+ uint32_t faultmask[M_REG_NUM_BANKS];
60
+ { .name = "ID_AA64ISAR*_EL1_RESERVED",
58
uint32_t secure; /* Is CPU in Secure state? (not guest visible) */
61
+ .is_glob = true },
59
} v7m;
62
REGUSERINFO_SENTINEL
60
63
};
61
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
64
modify_arm_cp_regs(v8_idregs, v8_user_idregs);
62
uint32_t *drbar;
65
@@ -XXX,XX +XXX,XX @@ void modify_arm_cp_regs(ARMCPRegInfo *regs, const ARMCPRegUserSpaceInfo *mods)
63
uint32_t *drsr;
66
ARMCPRegInfo *r;
64
uint32_t *dracr;
67
65
- uint32_t rnr[2];
68
for (m = mods; m->name; m++) {
66
+ uint32_t rnr[M_REG_NUM_BANKS];
69
+ GPatternSpec *pat = NULL;
67
} pmsav7;
70
+ if (m->is_glob) {
68
71
+ pat = g_pattern_spec_new(m->name);
69
/* PMSAv8 MPU */
72
+ }
70
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
73
for (r = regs; r->type != ARM_CP_SENTINEL; r++) {
71
* pmsav7.rnr (region number register)
74
- if (strcmp(r->name, m->name) == 0) {
72
* pmsav7_dregion (number of configured regions)
75
+ if (pat && g_pattern_match_string(pat, r->name)) {
73
*/
76
+ r->type = ARM_CP_CONST;
74
- uint32_t *rbar[2];
77
+ r->access = PL0U_R;
75
- uint32_t *rlar[2];
78
+ r->resetvalue = 0;
76
- uint32_t mair0[2];
79
+ /* continue */
77
- uint32_t mair1[2];
80
+ } else if (strcmp(r->name, m->name) == 0) {
78
+ uint32_t *rbar[M_REG_NUM_BANKS];
81
r->type = ARM_CP_CONST;
79
+ uint32_t *rlar[M_REG_NUM_BANKS];
82
r->access = PL0U_R;
80
+ uint32_t mair0[M_REG_NUM_BANKS];
83
r->resetvalue &= m->exported_bits;
81
+ uint32_t mair1[M_REG_NUM_BANKS];
84
@@ -XXX,XX +XXX,XX @@ void modify_arm_cp_regs(ARMCPRegInfo *regs, const ARMCPRegUserSpaceInfo *mods)
82
} pmsav8;
85
break;
83
86
}
84
void *nvic;
87
}
88
+ if (pat) {
89
+ g_pattern_spec_free(pat);
90
+ }
91
}
92
}
93
85
--
94
--
86
2.7.4
95
2.20.1
87
96
88
97
diff view generated by jsdifflib
New patch
1
From: Alex Bennée <alex.bennee@linaro.org>
1
2
3
Userspace programs should (in theory) query the ELF HWCAP before
4
probing these registers. Now we have implemented them all make it
5
public.
6
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20190205190224.2198-6-alex.bennee@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
linux-user/elfload.c | 1 +
13
1 file changed, 1 insertion(+)
14
15
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/linux-user/elfload.c
18
+++ b/linux-user/elfload.c
19
@@ -XXX,XX +XXX,XX @@ static uint32_t get_elf_hwcap(void)
20
21
hwcaps |= ARM_HWCAP_A64_FP;
22
hwcaps |= ARM_HWCAP_A64_ASIMD;
23
+ hwcaps |= ARM_HWCAP_A64_CPUID;
24
25
/* probe for the extra features */
26
#define GET_FEATURE_ID(feat, hwcap) \
27
--
28
2.20.1
29
30
diff view generated by jsdifflib
1
The exception-return magic values get some new bits in v8M, which
1
At the moment the Arm implementations of kvm_arch_{get,put}_registers()
2
makes some bit definitions for them worthwhile.
2
don't support having QEMU change the values of system registers
3
(aka coprocessor registers for AArch32). This is because although
4
kvm_arch_get_registers() calls write_list_to_cpustate() to
5
update the CPU state struct fields (so QEMU code can read the
6
values in the usual way), kvm_arch_put_registers() does not
7
call write_cpustate_to_list(), meaning that any changes to
8
the CPU state struct fields will not be passed back to KVM.
3
9
4
We don't use the bit definitions for the switch on the low bits
10
The rationale for this design is documented in a comment in the
5
which checks the return type for v7M, because this is defined
11
AArch32 kvm_arch_put_registers() -- writing the values in the
6
in the v7M ARM ARM as a set of valid values rather than via
12
cpregs list into the CPU state struct is "lossy" because the
7
per-bit checks.
13
write of a register might not succeed, and so if we blindly
14
copy the CPU state values back again we will incorrectly
15
change register values for the guest. The assumption was that
16
no QEMU code would need to write to the registers.
17
18
However, when we implemented debug support for KVM guests, we
19
broke that assumption: the code to handle "set the guest up
20
to take a breakpoint exception" does so by updating various
21
guest registers including ESR_EL1.
22
23
Support this by making kvm_arch_put_registers() synchronize
24
CPU state back into the list. We sync only those registers
25
where the initial write succeeds, which should be sufficient.
8
26
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
28
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
11
Message-id: 1505137930-13255-7-git-send-email-peter.maydell@linaro.org
29
Tested-by: Alex Bennée <alex.bennee@linaro.org>
30
Tested-by: Dongjiu Geng <gengdongjiu@huawei.com>
12
---
31
---
13
target/arm/internals.h | 10 ++++++++++
32
target/arm/cpu.h | 9 ++++++++-
14
target/arm/helper.c | 14 +++++++++-----
33
target/arm/helper.c | 27 +++++++++++++++++++++++++--
15
2 files changed, 19 insertions(+), 5 deletions(-)
34
target/arm/kvm32.c | 20 ++------------------
35
target/arm/kvm64.c | 2 ++
36
target/arm/machine.c | 2 +-
37
5 files changed, 38 insertions(+), 22 deletions(-)
16
38
17
diff --git a/target/arm/internals.h b/target/arm/internals.h
39
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
40
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/internals.h
41
--- a/target/arm/cpu.h
20
+++ b/target/arm/internals.h
42
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ FIELD(V7M_CONTROL, NPRIV, 0, 1)
43
@@ -XXX,XX +XXX,XX @@ bool write_list_to_cpustate(ARMCPU *cpu);
22
FIELD(V7M_CONTROL, SPSEL, 1, 1)
44
/**
23
FIELD(V7M_CONTROL, FPCA, 2, 1)
45
* write_cpustate_to_list:
24
46
* @cpu: ARMCPU
25
+/* Bit definitions for v7M exception return payload */
47
+ * @kvm_sync: true if this is for syncing back to KVM
26
+FIELD(V7M_EXCRET, ES, 0, 1)
48
*
27
+FIELD(V7M_EXCRET, RES0, 1, 1)
49
* For each register listed in the ARMCPU cpreg_indexes list, write
28
+FIELD(V7M_EXCRET, SPSEL, 2, 1)
50
* its value from the ARMCPUState structure into the cpreg_values list.
29
+FIELD(V7M_EXCRET, MODE, 3, 1)
51
* This is used to copy info from TCG's working data structures into
30
+FIELD(V7M_EXCRET, FTYPE, 4, 1)
52
* KVM or for outbound migration.
31
+FIELD(V7M_EXCRET, DCRS, 5, 1)
53
*
32
+FIELD(V7M_EXCRET, S, 6, 1)
54
+ * @kvm_sync is true if we are doing this in order to sync the
33
+FIELD(V7M_EXCRET, RES1, 7, 25) /* including the must-be-1 prefix */
55
+ * register state back to KVM. In this case we will only update
34
+
56
+ * values in the list if the previous list->cpustate sync actually
35
/*
57
+ * successfully wrote the CPU state. Otherwise we will keep the value
36
* For AArch64, map a given EL to an index in the banked_spsr array.
58
+ * that is in the list.
37
* Note that this mapping and the AArch32 mapping defined in bank_number()
59
+ *
60
* Returns: true if all register values were read correctly,
61
* false if some register was unknown or could not be read.
62
* Note that we do not stop early on failure -- we will attempt
63
* reading all registers in the list.
64
*/
65
-bool write_cpustate_to_list(ARMCPU *cpu);
66
+bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
67
68
#define ARM_CPUID_TI915T 0x54029152
69
#define ARM_CPUID_TI925T 0x54029252
38
diff --git a/target/arm/helper.c b/target/arm/helper.c
70
diff --git a/target/arm/helper.c b/target/arm/helper.c
39
index XXXXXXX..XXXXXXX 100644
71
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/helper.c
72
--- a/target/arm/helper.c
41
+++ b/target/arm/helper.c
73
+++ b/target/arm/helper.c
42
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
74
@@ -XXX,XX +XXX,XX @@ static bool raw_accessors_invalid(const ARMCPRegInfo *ri)
43
" previous exception %d\n",
75
return true;
44
type, env->v7m.exception);
76
}
45
77
46
- if (extract32(type, 5, 23) != extract32(-1, 5, 23)) {
78
-bool write_cpustate_to_list(ARMCPU *cpu)
47
+ if ((type & R_V7M_EXCRET_RES1_MASK) != R_V7M_EXCRET_RES1_MASK) {
79
+bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync)
48
qemu_log_mask(LOG_GUEST_ERROR, "M profile: zero high bits in exception "
80
{
49
"exit PC value 0x%" PRIx32 " are UNPREDICTABLE\n", type);
81
/* Write the coprocessor state from cpu->env to the (index,value) list. */
82
int i;
83
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu)
84
for (i = 0; i < cpu->cpreg_array_len; i++) {
85
uint32_t regidx = kvm_to_cpreg_id(cpu->cpreg_indexes[i]);
86
const ARMCPRegInfo *ri;
87
+ uint64_t newval;
88
89
ri = get_arm_cp_reginfo(cpu->cp_regs, regidx);
90
if (!ri) {
91
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu)
92
if (ri->type & ARM_CP_NO_RAW) {
93
continue;
94
}
95
- cpu->cpreg_values[i] = read_raw_cp_reg(&cpu->env, ri);
96
+
97
+ newval = read_raw_cp_reg(&cpu->env, ri);
98
+ if (kvm_sync) {
99
+ /*
100
+ * Only sync if the previous list->cpustate sync succeeded.
101
+ * Rather than tracking the success/failure state for every
102
+ * item in the list, we just recheck "does the raw write we must
103
+ * have made in write_list_to_cpustate() read back OK" here.
104
+ */
105
+ uint64_t oldval = cpu->cpreg_values[i];
106
+
107
+ if (oldval == newval) {
108
+ continue;
109
+ }
110
+
111
+ write_raw_cp_reg(&cpu->env, ri, oldval);
112
+ if (read_raw_cp_reg(&cpu->env, ri) != oldval) {
113
+ continue;
114
+ }
115
+
116
+ write_raw_cp_reg(&cpu->env, ri, newval);
117
+ }
118
+ cpu->cpreg_values[i] = newval;
50
}
119
}
51
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
120
return ok;
52
* which security state's faultmask to clear. (v8M ARM ARM R_KBNF.)
121
}
53
*/
122
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
54
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
123
index XXXXXXX..XXXXXXX 100644
55
- int es = type & 1;
124
--- a/target/arm/kvm32.c
56
+ int es = type & R_V7M_EXCRET_ES_MASK;
125
+++ b/target/arm/kvm32.c
57
if (armv7m_nvic_raw_execution_priority(env->nvic) >= 0) {
126
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
58
env->v7m.faultmask[es] = 0;
127
return ret;
59
}
60
@@ -XXX,XX +XXX,XX @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
61
return; /* Never happens. Keep compiler happy. */
62
}
128
}
63
129
64
- lr = 0xfffffff1;
130
- /* Note that we do not call write_cpustate_to_list()
65
+ lr = R_V7M_EXCRET_RES1_MASK |
131
- * here, so we are only writing the tuple list back to
66
+ R_V7M_EXCRET_S_MASK |
132
- * KVM. This is safe because nothing can change the
67
+ R_V7M_EXCRET_DCRS_MASK |
133
- * CPUARMState cp15 fields (in particular gdb accesses cannot)
68
+ R_V7M_EXCRET_FTYPE_MASK |
134
- * and so there are no changes to sync. In fact syncing would
69
+ R_V7M_EXCRET_ES_MASK;
135
- * be wrong at this point: for a constant register where TCG and
70
if (env->v7m.control[env->v7m.secure] & R_V7M_CONTROL_SPSEL_MASK) {
136
- * KVM disagree about its value, the preceding write_list_to_cpustate()
71
- lr |= 4;
137
- * would not have had any effect on the CPUARMState value (since the
72
+ lr |= R_V7M_EXCRET_SPSEL_MASK;
138
- * register is read-only), and a write_cpustate_to_list() here would
139
- * then try to write the TCG value back into KVM -- this would either
140
- * fail or incorrectly change the value the guest sees.
141
- *
142
- * If we ever want to allow the user to modify cp15 registers via
143
- * the gdb stub, we would need to be more clever here (for instance
144
- * tracking the set of registers kvm_arch_get_registers() successfully
145
- * managed to update the CPUARMState with, and only allowing those
146
- * to be written back up into the kernel).
147
- */
148
+ write_cpustate_to_list(cpu, true);
149
+
150
if (!write_list_to_kvmstate(cpu, level)) {
151
return EINVAL;
73
}
152
}
74
if (!arm_v7m_is_handler_mode(env)) {
153
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
75
- lr |= 8;
154
index XXXXXXX..XXXXXXX 100644
76
+ lr |= R_V7M_EXCRET_MODE_MASK;
155
--- a/target/arm/kvm64.c
156
+++ b/target/arm/kvm64.c
157
@@ -XXX,XX +XXX,XX @@ int kvm_arch_put_registers(CPUState *cs, int level)
158
return ret;
77
}
159
}
78
160
79
v7m_push_stack(cpu);
161
+ write_cpustate_to_list(cpu, true);
162
+
163
if (!write_list_to_kvmstate(cpu, level)) {
164
return EINVAL;
165
}
166
diff --git a/target/arm/machine.c b/target/arm/machine.c
167
index XXXXXXX..XXXXXXX 100644
168
--- a/target/arm/machine.c
169
+++ b/target/arm/machine.c
170
@@ -XXX,XX +XXX,XX @@ static int cpu_pre_save(void *opaque)
171
abort();
172
}
173
} else {
174
- if (!write_cpustate_to_list(cpu)) {
175
+ if (!write_cpustate_to_list(cpu, false)) {
176
/* This should never fail. */
177
abort();
178
}
80
--
179
--
81
2.7.4
180
2.20.1
82
181
83
182
diff view generated by jsdifflib
New patch
1
Peter Crosthwaite hasn't had the bandwidth to do code review or
2
other QEMU work for some time now -- remove his email address
3
from MAINTAINERS file entries so we don't bombard him with
4
patch emails.
1
5
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20190207181422.4907-1-peter.maydell@linaro.org
8
---
9
MAINTAINERS | 4 ----
10
1 file changed, 4 deletions(-)
11
12
diff --git a/MAINTAINERS b/MAINTAINERS
13
index XXXXXXX..XXXXXXX 100644
14
--- a/MAINTAINERS
15
+++ b/MAINTAINERS
16
@@ -XXX,XX +XXX,XX @@ Guest CPU cores (TCG):
17
----------------------
18
Overall
19
L: qemu-devel@nongnu.org
20
-M: Peter Crosthwaite <crosthwaite.peter@gmail.com>
21
M: Richard Henderson <rth@twiddle.net>
22
R: Paolo Bonzini <pbonzini@redhat.com>
23
S: Maintained
24
@@ -XXX,XX +XXX,XX @@ F: tests/virtio-scsi-test.c
25
T: git https://github.com/bonzini/qemu.git scsi-next
26
27
SSI
28
-M: Peter Crosthwaite <crosthwaite.peter@gmail.com>
29
M: Alistair Francis <alistair@alistair23.me>
30
S: Maintained
31
F: hw/ssi/*
32
@@ -XXX,XX +XXX,XX @@ F: tests/m25p80-test.c
33
34
Xilinx SPI
35
M: Alistair Francis <alistair@alistair23.me>
36
-M: Peter Crosthwaite <crosthwaite.peter@gmail.com>
37
S: Maintained
38
F: hw/ssi/xilinx_*
39
40
@@ -XXX,XX +XXX,XX @@ F: qom/cpu.c
41
F: include/qom/cpu.h
42
43
Device Tree
44
-M: Peter Crosthwaite <crosthwaite.peter@gmail.com>
45
M: Alexander Graf <agraf@suse.de>
46
S: Maintained
47
F: device_tree.c
48
--
49
2.20.1
50
51
diff view generated by jsdifflib
1
In several places we were unconditionally applying the
1
The code for handling the NVIC SHPR1 register intends to permit
2
nvic_gprio_mask() to a priority value. This is incorrect
2
byte and halfword accesses (as the architecture requires). However
3
if the priority is one of the fixed negative priority
3
the 'case' line for it only lists the base address of the
4
values (for NMI and HardFault), so don't do it.
4
register, so attempts to access bytes other than the first one
5
end up in the "bad write" default logic. This bug was added
6
accidentally when we split out the SHPR1 logic from SHPR2 and
7
SHPR3 to support v6M.
5
8
6
This bug would have caused both NMI and HardFault to be
9
Fixes: 7c9140afd594 ("nvic: Handle ARMv6-M SCS reserved registers")
7
considered as the same priority and so NMI wouldn't
8
correctly preempt HardFault.
9
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 1505137930-13255-5-git-send-email-peter.maydell@linaro.org
13
---
12
---
14
hw/intc/armv7m_nvic.c | 11 +++++++++--
13
The Zephyr RTOS happens to access SHPR1 byte at a time,
15
1 file changed, 9 insertions(+), 2 deletions(-)
14
which is how I spotted this.
15
---
16
hw/intc/armv7m_nvic.c | 4 ++--
17
1 file changed, 2 insertions(+), 2 deletions(-)
16
18
17
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
19
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
18
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/armv7m_nvic.c
21
--- a/hw/intc/armv7m_nvic.c
20
+++ b/hw/intc/armv7m_nvic.c
22
+++ b/hw/intc/armv7m_nvic.c
21
@@ -XXX,XX +XXX,XX @@ static void nvic_recompute_state(NVICState *s)
23
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_read(void *opaque, hwaddr addr,
24
}
22
}
25
}
23
}
26
break;
24
27
- case 0xd18: /* System Handler Priority (SHPR1) */
25
+ if (active_prio > 0) {
28
+ case 0xd18 ... 0xd1b: /* System Handler Priority (SHPR1) */
26
+ active_prio &= nvic_gprio_mask(s);
29
if (!arm_feature(&s->cpu->env, ARM_FEATURE_M_MAIN)) {
27
+ }
30
val = 0;
28
+
31
break;
29
s->vectpending = pend_irq;
32
@@ -XXX,XX +XXX,XX @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
30
- s->exception_prio = active_prio & nvic_gprio_mask(s);
33
}
31
+ s->exception_prio = active_prio;
34
nvic_irq_update(s);
32
35
return MEMTX_OK;
33
trace_nvic_recompute_state(s->vectpending, s->exception_prio);
36
- case 0xd18: /* System Handler Priority (SHPR1) */
34
}
37
+ case 0xd18 ... 0xd1b: /* System Handler Priority (SHPR1) */
35
@@ -XXX,XX +XXX,XX @@ void armv7m_nvic_acknowledge_irq(void *opaque)
38
if (!arm_feature(&s->cpu->env, ARM_FEATURE_M_MAIN)) {
36
assert(vec->enabled);
39
return MEMTX_OK;
37
assert(vec->pending);
40
}
38
39
- pendgroupprio = vec->prio & nvic_gprio_mask(s);
40
+ pendgroupprio = vec->prio;
41
+ if (pendgroupprio > 0) {
42
+ pendgroupprio &= nvic_gprio_mask(s);
43
+ }
44
assert(pendgroupprio < running);
45
46
trace_nvic_acknowledge_irq(pending, vec->prio);
47
--
41
--
48
2.7.4
42
2.20.1
49
43
50
44
diff view generated by jsdifflib
New patch
1
In commit 91c1e9fcbd7548db368 where we added dual-CPU support to
2
the ARMSSE, we set up the wiring of the expansion IRQs via nested
3
loops: the outer loop on 'i' loops for each CPU, and the inner loop
4
on 'j' loops for each interrupt. Fix a typo which meant we were
5
wiring every expansion IRQ line to external IRQ 0 on CPU 0 and
6
to external IRQ 1 on CPU 1.
1
7
8
Fixes: 91c1e9fcbd7548db368 ("hw/arm/armsse: Support dual-CPU configuration")
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
---
12
hw/arm/armsse.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/armsse.c
18
+++ b/hw/arm/armsse.c
19
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
20
/* Connect EXP_IRQ/EXP_CPUn_IRQ GPIOs to the NVIC's lines 32 and up */
21
s->exp_irqs[i] = g_new(qemu_irq, s->exp_numirq);
22
for (j = 0; j < s->exp_numirq; j++) {
23
- s->exp_irqs[i][j] = qdev_get_gpio_in(cpudev, i + 32);
24
+ s->exp_irqs[i][j] = qdev_get_gpio_in(cpudev, j + 32);
25
}
26
if (i == 0) {
27
gpioname = g_strdup("EXP_IRQ");
28
--
29
2.20.1
30
31
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Since we're now handling a == b generically, we no longer need
4
to do it by hand within target/arm/.
5
6
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20190209033847.9014-2-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-a64.c | 6 +-----
12
target/arm/translate-sve.c | 6 +-----
13
target/arm/translate.c | 12 +++---------
14
3 files changed, 5 insertions(+), 19 deletions(-)
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 disas_simd_3same_logic(DisasContext *s, uint32_t insn)
21
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_andc, 0);
22
return;
23
case 2: /* ORR */
24
- if (rn == rm) { /* MOV */
25
- gen_gvec_fn2(s, is_q, rd, rn, tcg_gen_gvec_mov, 0);
26
- } else {
27
- gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_or, 0);
28
- }
29
+ gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_or, 0);
30
return;
31
case 3: /* ORN */
32
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_orc, 0);
33
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/translate-sve.c
36
+++ b/target/arm/translate-sve.c
37
@@ -XXX,XX +XXX,XX @@ static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
38
39
static bool trans_ORR_zzz(DisasContext *s, arg_rrr_esz *a)
40
{
41
- if (a->rn == a->rm) { /* MOV */
42
- return do_mov_z(s, a->rd, a->rn);
43
- } else {
44
- return do_vector3_z(s, tcg_gen_gvec_or, 0, a->rd, a->rn, a->rm);
45
- }
46
+ return do_vector3_z(s, tcg_gen_gvec_or, 0, a->rd, a->rn, a->rm);
47
}
48
49
static bool trans_EOR_zzz(DisasContext *s, arg_rrr_esz *a)
50
diff --git a/target/arm/translate.c b/target/arm/translate.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/arm/translate.c
53
+++ b/target/arm/translate.c
54
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
55
tcg_gen_gvec_andc(0, rd_ofs, rn_ofs, rm_ofs,
56
vec_size, vec_size);
57
break;
58
- case 2:
59
- if (rn == rm) {
60
- /* VMOV */
61
- tcg_gen_gvec_mov(0, rd_ofs, rn_ofs, vec_size, vec_size);
62
- } else {
63
- /* VORR */
64
- tcg_gen_gvec_or(0, rd_ofs, rn_ofs, rm_ofs,
65
- vec_size, vec_size);
66
- }
67
+ case 2: /* VORR */
68
+ tcg_gen_gvec_or(0, rd_ofs, rn_ofs, rm_ofs,
69
+ vec_size, vec_size);
70
break;
71
case 3: /* VORN */
72
tcg_gen_gvec_orc(0, rd_ofs, rn_ofs, rm_ofs,
73
--
74
2.20.1
75
76
diff view generated by jsdifflib
1
From: Jaroslaw Pelczar <j.pelczar@samsung.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Previously when single stepping through ERET instruction via GDB
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
would result in debugger entering the "next" PC after ERET instruction.
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
When debugging in kernel mode, this will also cause unintended behavior,
5
Message-id: 20190209033847.9014-3-richard.henderson@linaro.org
6
because debugger will try to access memory from EL0 point of view.
7
8
Signed-off-by: Jaroslaw Pelczar <j.pelczar@samsung.com>
9
Message-id: 001c01d32895$483027f0$d89077d0$@samsung.com
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
7
---
13
target/arm/translate-a64.c | 1 +
8
target/arm/translate-a64.c | 35 ++++++++++++++---------------------
14
1 file changed, 1 insertion(+)
9
1 file changed, 14 insertions(+), 21 deletions(-)
15
10
16
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
17
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-a64.c
13
--- a/target/arm/translate-a64.c
19
+++ b/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
20
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
15
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
21
default:
16
}
22
gen_a64_set_pc_im(dc->pc);
17
23
/* fall through */
18
switch (opcode) {
24
+ case DISAS_EXIT:
19
+ case 0x0c: /* SMAX, UMAX */
25
case DISAS_JUMP:
20
+ if (u) {
26
if (dc->base.singlestep_enabled) {
21
+ gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_umax, size);
27
gen_exception_internal(EXCP_DEBUG);
22
+ } else {
23
+ gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_smax, size);
24
+ }
25
+ return;
26
+ case 0x0d: /* SMIN, UMIN */
27
+ if (u) {
28
+ gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_umin, size);
29
+ } else {
30
+ gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_smin, size);
31
+ }
32
+ return;
33
case 0x10: /* ADD, SUB */
34
if (u) {
35
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_sub, size);
36
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
37
genenvfn = fns[size][u];
38
break;
39
}
40
- case 0xc: /* SMAX, UMAX */
41
- {
42
- static NeonGenTwoOpFn * const fns[3][2] = {
43
- { gen_helper_neon_max_s8, gen_helper_neon_max_u8 },
44
- { gen_helper_neon_max_s16, gen_helper_neon_max_u16 },
45
- { tcg_gen_smax_i32, tcg_gen_umax_i32 },
46
- };
47
- genfn = fns[size][u];
48
- break;
49
- }
50
-
51
- case 0xd: /* SMIN, UMIN */
52
- {
53
- static NeonGenTwoOpFn * const fns[3][2] = {
54
- { gen_helper_neon_min_s8, gen_helper_neon_min_u8 },
55
- { gen_helper_neon_min_s16, gen_helper_neon_min_u16 },
56
- { tcg_gen_smin_i32, tcg_gen_umin_i32 },
57
- };
58
- genfn = fns[size][u];
59
- break;
60
- }
61
case 0xe: /* SABD, UABD */
62
case 0xf: /* SABA, UABA */
63
{
28
--
64
--
29
2.7.4
65
2.20.1
30
66
31
67
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20190209033847.9014-4-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 25 +++++++++++++++++++------
9
1 file changed, 19 insertions(+), 6 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
16
tcg_gen_gvec_cmp(u ? TCG_COND_GEU : TCG_COND_GE, size,
17
rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
18
return 0;
19
+
20
+ case NEON_3R_VMAX:
21
+ if (u) {
22
+ tcg_gen_gvec_umax(size, rd_ofs, rn_ofs, rm_ofs,
23
+ vec_size, vec_size);
24
+ } else {
25
+ tcg_gen_gvec_smax(size, rd_ofs, rn_ofs, rm_ofs,
26
+ vec_size, vec_size);
27
+ }
28
+ return 0;
29
+ case NEON_3R_VMIN:
30
+ if (u) {
31
+ tcg_gen_gvec_umin(size, rd_ofs, rn_ofs, rm_ofs,
32
+ vec_size, vec_size);
33
+ } else {
34
+ tcg_gen_gvec_smin(size, rd_ofs, rn_ofs, rm_ofs,
35
+ vec_size, vec_size);
36
+ }
37
+ return 0;
38
}
39
40
if (size == 3) {
41
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
42
case NEON_3R_VQRSHL:
43
GEN_NEON_INTEGER_OP_ENV(qrshl);
44
break;
45
- case NEON_3R_VMAX:
46
- GEN_NEON_INTEGER_OP(max);
47
- break;
48
- case NEON_3R_VMIN:
49
- GEN_NEON_INTEGER_OP(min);
50
- break;
51
case NEON_3R_VABD:
52
GEN_NEON_INTEGER_OP(abd);
53
break;
54
--
55
2.20.1
56
57
diff view generated by jsdifflib
1
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Now we are able to retrieve the gsi from the INTx pin, let's
3
The 32-bit PMIN/PMAX has been decomposed to scalars,
4
enable intx_to_irq routing. From that point on, irqfd becomes
4
and so can be trivially expanded inline.
5
usable along with INTx when assigning a PCIe device.
6
5
7
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
7
Message-id: 20190209033847.9014-5-richard.henderson@linaro.org
9
Signed-off-by: Eric Auger <eric.auger@redhat.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Andrew Jones <drjones@redhat.com>
11
Tested-by: Feng Kan <fkan@apm.com>
12
Message-id: 1505296004-6798-4-git-send-email-eric.auger@redhat.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
10
---
15
hw/pci-host/gpex.c | 12 ++++++++++++
11
target/arm/translate.c | 8 ++++----
16
1 file changed, 12 insertions(+)
12
1 file changed, 4 insertions(+), 4 deletions(-)
17
13
18
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
14
diff --git a/target/arm/translate.c b/target/arm/translate.c
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/pci-host/gpex.c
16
--- a/target/arm/translate.c
21
+++ b/hw/pci-host/gpex.c
17
+++ b/target/arm/translate.c
22
@@ -XXX,XX +XXX,XX @@ int gpex_set_irq_num(GPEXHost *s, int index, int gsi)
18
@@ -XXX,XX +XXX,XX @@ static inline void gen_neon_rsb(int size, TCGv_i32 t0, TCGv_i32 t1)
23
return 0;
24
}
19
}
25
20
26
+static PCIINTxRoute gpex_route_intx_pin_to_irq(void *opaque, int pin)
21
/* 32-bit pairwise ops end up the same as the elementwise versions. */
27
+{
22
-#define gen_helper_neon_pmax_s32 gen_helper_neon_max_s32
28
+ PCIINTxRoute route;
23
-#define gen_helper_neon_pmax_u32 gen_helper_neon_max_u32
29
+ GPEXHost *s = opaque;
24
-#define gen_helper_neon_pmin_s32 gen_helper_neon_min_s32
30
+
25
-#define gen_helper_neon_pmin_u32 gen_helper_neon_min_u32
31
+ route.mode = PCI_INTX_ENABLED;
26
+#define gen_helper_neon_pmax_s32 tcg_gen_smax_i32
32
+ route.irq = s->irq_num[pin];
27
+#define gen_helper_neon_pmax_u32 tcg_gen_umax_i32
33
+
28
+#define gen_helper_neon_pmin_s32 tcg_gen_smin_i32
34
+ return route;
29
+#define gen_helper_neon_pmin_u32 tcg_gen_umin_i32
35
+}
30
36
+
31
#define GEN_NEON_INTEGER_OP_ENV(name) do { \
37
static void gpex_host_realize(DeviceState *dev, Error **errp)
32
switch ((size << 1) | u) { \
38
{
39
PCIHostState *pci = PCI_HOST_BRIDGE(dev);
40
@@ -XXX,XX +XXX,XX @@ static void gpex_host_realize(DeviceState *dev, Error **errp)
41
&s->io_ioport, 0, 4, TYPE_PCIE_BUS);
42
43
qdev_set_parent_bus(DEVICE(&s->gpex_root), BUS(pci->bus));
44
+ pci_bus_set_route_irq_fn(pci->bus, gpex_route_intx_pin_to_irq);
45
qdev_init_nofail(DEVICE(&s->gpex_root));
46
}
47
48
--
33
--
49
2.7.4
34
2.20.1
50
35
51
36
diff view generated by jsdifflib
New patch
1
From: Richard Henderson <richard.henderson@linaro.org>
1
2
3
These are now unused.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20190209033847.9014-6-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/helper.h | 12 ------------
11
target/arm/neon_helper.c | 12 ------------
12
2 files changed, 24 deletions(-)
13
14
diff --git a/target/arm/helper.h b/target/arm/helper.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/helper.h
17
+++ b/target/arm/helper.h
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(neon_cge_s16, i32, i32, i32)
19
DEF_HELPER_2(neon_cge_u32, i32, i32, i32)
20
DEF_HELPER_2(neon_cge_s32, i32, i32, i32)
21
22
-DEF_HELPER_2(neon_min_u8, i32, i32, i32)
23
-DEF_HELPER_2(neon_min_s8, i32, i32, i32)
24
-DEF_HELPER_2(neon_min_u16, i32, i32, i32)
25
-DEF_HELPER_2(neon_min_s16, i32, i32, i32)
26
-DEF_HELPER_2(neon_min_u32, i32, i32, i32)
27
-DEF_HELPER_2(neon_min_s32, i32, i32, i32)
28
-DEF_HELPER_2(neon_max_u8, i32, i32, i32)
29
-DEF_HELPER_2(neon_max_s8, i32, i32, i32)
30
-DEF_HELPER_2(neon_max_u16, i32, i32, i32)
31
-DEF_HELPER_2(neon_max_s16, i32, i32, i32)
32
-DEF_HELPER_2(neon_max_u32, i32, i32, i32)
33
-DEF_HELPER_2(neon_max_s32, i32, i32, i32)
34
DEF_HELPER_2(neon_pmin_u8, i32, i32, i32)
35
DEF_HELPER_2(neon_pmin_s8, i32, i32, i32)
36
DEF_HELPER_2(neon_pmin_u16, i32, i32, i32)
37
diff --git a/target/arm/neon_helper.c b/target/arm/neon_helper.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/neon_helper.c
40
+++ b/target/arm/neon_helper.c
41
@@ -XXX,XX +XXX,XX @@ NEON_VOP(cge_u32, neon_u32, 1)
42
#undef NEON_FN
43
44
#define NEON_FN(dest, src1, src2) dest = (src1 < src2) ? src1 : src2
45
-NEON_VOP(min_s8, neon_s8, 4)
46
-NEON_VOP(min_u8, neon_u8, 4)
47
-NEON_VOP(min_s16, neon_s16, 2)
48
-NEON_VOP(min_u16, neon_u16, 2)
49
-NEON_VOP(min_s32, neon_s32, 1)
50
-NEON_VOP(min_u32, neon_u32, 1)
51
NEON_POP(pmin_s8, neon_s8, 4)
52
NEON_POP(pmin_u8, neon_u8, 4)
53
NEON_POP(pmin_s16, neon_s16, 2)
54
@@ -XXX,XX +XXX,XX @@ NEON_POP(pmin_u16, neon_u16, 2)
55
#undef NEON_FN
56
57
#define NEON_FN(dest, src1, src2) dest = (src1 > src2) ? src1 : src2
58
-NEON_VOP(max_s8, neon_s8, 4)
59
-NEON_VOP(max_u8, neon_u8, 4)
60
-NEON_VOP(max_s16, neon_s16, 2)
61
-NEON_VOP(max_u16, neon_u16, 2)
62
-NEON_VOP(max_s32, neon_s32, 1)
63
-NEON_VOP(max_u32, neon_u32, 1)
64
NEON_POP(pmax_s8, neon_s8, 4)
65
NEON_POP(pmax_u8, neon_u8, 4)
66
NEON_POP(pmax_s16, neon_s16, 2)
67
--
68
2.20.1
69
70
diff view generated by jsdifflib
1
In do_v7m_exception_exit(), there's no need to force the high 4
1
From: Richard Henderson <richard.henderson@linaro.org>
2
bits of 'type' to 1 when calling v7m_exception_taken(), because
3
we know that they're always 1 or we could not have got to this
4
"handle return to magic exception return address" code. Remove
5
the unnecessary ORs.
6
2
3
The components of this register is stored in several
4
different locations.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20190209033847.9014-7-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Acked-by: Alistair Francis <alistair.francis@xilinx.com>
10
Message-id: 1505137930-13255-6-git-send-email-peter.maydell@linaro.org
11
---
10
---
12
target/arm/helper.c | 4 ++--
11
target/arm/helper.c | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
12
1 file changed, 2 insertions(+), 2 deletions(-)
14
13
15
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper.c
16
--- a/target/arm/helper.c
18
+++ b/target/arm/helper.c
17
+++ b/target/arm/helper.c
19
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
18
@@ -XXX,XX +XXX,XX @@ static int vfp_gdb_get_reg(CPUARMState *env, uint8_t *buf, int reg)
20
*/
19
}
21
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
20
switch (reg - nregs) {
22
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
21
case 0: stl_p(buf, env->vfp.xregs[ARM_VFP_FPSID]); return 4;
23
- v7m_exception_taken(cpu, type | 0xf0000000);
22
- case 1: stl_p(buf, env->vfp.xregs[ARM_VFP_FPSCR]); return 4;
24
+ v7m_exception_taken(cpu, type);
23
+ case 1: stl_p(buf, vfp_get_fpscr(env)); return 4;
25
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on existing "
24
case 2: stl_p(buf, env->vfp.xregs[ARM_VFP_FPEXC]); return 4;
26
"stackframe: failed exception return integrity check\n");
25
}
27
return;
26
return 0;
28
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
27
@@ -XXX,XX +XXX,XX @@ static int vfp_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg)
29
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE);
28
}
30
env->v7m.cfsr[env->v7m.secure] |= R_V7M_CFSR_INVPC_MASK;
29
switch (reg - nregs) {
31
v7m_push_stack(cpu);
30
case 0: env->vfp.xregs[ARM_VFP_FPSID] = ldl_p(buf); return 4;
32
- v7m_exception_taken(cpu, type | 0xf0000000);
31
- case 1: env->vfp.xregs[ARM_VFP_FPSCR] = ldl_p(buf); return 4;
33
+ v7m_exception_taken(cpu, type);
32
+ case 1: vfp_set_fpscr(env, ldl_p(buf)); return 4;
34
qemu_log_mask(CPU_LOG_INT, "...taking UsageFault on new stackframe: "
33
case 2: env->vfp.xregs[ARM_VFP_FPEXC] = ldl_p(buf) & (1 << 30); return 4;
35
"failed exception return integrity check\n");
34
}
36
return;
35
return 0;
37
--
36
--
38
2.7.4
37
2.20.1
39
38
40
39
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The EP108 is the same as the ZCU102, mark it as deprecated as we don't
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
need two machines.
4
Message-id: 20190209033847.9014-8-richard.henderson@linaro.org
5
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
7
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
7
---
10
hw/arm/xlnx-zcu102.c | 2 +-
8
target/arm/translate.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
9
1 file changed, 1 insertion(+), 1 deletion(-)
12
10
13
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/xlnx-zcu102.c
13
--- a/target/arm/translate.c
16
+++ b/hw/arm/xlnx-zcu102.c
14
+++ b/target/arm/translate.c
17
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
15
@@ -XXX,XX +XXX,XX @@ void arm_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
18
{
16
i * 2 + 1, (uint32_t)(v >> 32),
19
MachineClass *mc = MACHINE_CLASS(oc);
17
i, v);
20
18
}
21
- mc->desc = "Xilinx ZynqMP EP108 board";
19
- cpu_fprintf(f, "FPSCR: %08x\n", (int)env->vfp.xregs[ARM_VFP_FPSCR]);
22
+ mc->desc = "Xilinx ZynqMP EP108 board (Deprecated, please use xlnx-zcu102)";
20
+ cpu_fprintf(f, "FPSCR: %08x\n", vfp_get_fpscr(env));
23
mc->init = xlnx_ep108_init;
21
}
24
mc->block_default_type = IF_IDE;
22
}
25
mc->units_per_default_bus = 1;
23
26
--
24
--
27
2.7.4
25
2.20.1
28
26
29
27
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add a machine level virtualization property. This defaults to false and can be
3
Minimize the code within a macro by splitting out a helper function.
4
set to true using this machine command line argument:
4
Use deposit32 instead of manual bit manipulation.
5
-machine xlnx-zcu102,virtualization=on
6
5
7
This follows what the ARM virt machine does.
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
7
Message-id: 20190209033847.9014-9-richard.henderson@linaro.org
9
This property only applies to the ZCU102 machine. The EP108 machine does
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
not have this property.
11
12
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
13
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
10
---
16
include/hw/arm/xlnx-zynqmp.h | 2 ++
11
target/arm/helper.c | 45 +++++++++++++++++++++++++++------------------
17
hw/arm/xlnx-zcu102.c | 30 +++++++++++++++++++++++++++++-
12
1 file changed, 27 insertions(+), 18 deletions(-)
18
hw/arm/xlnx-zynqmp.c | 3 ++-
19
3 files changed, 33 insertions(+), 2 deletions(-)
20
13
21
diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
22
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/arm/xlnx-zynqmp.h
16
--- a/target/arm/helper.c
24
+++ b/include/hw/arm/xlnx-zynqmp.h
17
+++ b/target/arm/helper.c
25
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZynqMPState {
18
@@ -XXX,XX +XXX,XX @@ float64 VFP_HELPER(sqrt, d)(float64 a, CPUARMState *env)
26
19
return float64_sqrt(a, &env->vfp.fp_status);
27
/* Has the ARM Security extensions? */
28
bool secure;
29
+ /* Has the ARM Virtualization extensions? */
30
+ bool virt;
31
/* Has the RPU subsystem? */
32
bool has_rpu;
33
} XlnxZynqMPState;
34
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/arm/xlnx-zcu102.c
37
+++ b/hw/arm/xlnx-zcu102.c
38
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
39
MemoryRegion ddr_ram;
40
41
bool secure;
42
+ bool virt;
43
} XlnxZCU102;
44
45
#define TYPE_ZCU102_MACHINE MACHINE_TYPE_NAME("xlnx-zcu102")
46
@@ -XXX,XX +XXX,XX @@ static void zcu102_set_secure(Object *obj, bool value, Error **errp)
47
s->secure = value;
48
}
20
}
49
21
50
+static bool zcu102_get_virt(Object *obj, Error **errp)
22
+static void softfloat_to_vfp_compare(CPUARMState *env, int cmp)
51
+{
23
+{
52
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
24
+ uint32_t flags;
53
+
25
+ switch (cmp) {
54
+ return s->virt;
26
+ case float_relation_equal:
27
+ flags = 0x6;
28
+ break;
29
+ case float_relation_less:
30
+ flags = 0x8;
31
+ break;
32
+ case float_relation_greater:
33
+ flags = 0x2;
34
+ break;
35
+ case float_relation_unordered:
36
+ flags = 0x3;
37
+ break;
38
+ default:
39
+ g_assert_not_reached();
40
+ }
41
+ env->vfp.xregs[ARM_VFP_FPSCR] =
42
+ deposit32(env->vfp.xregs[ARM_VFP_FPSCR], 28, 4, flags);
55
+}
43
+}
56
+
44
+
57
+static void zcu102_set_virt(Object *obj, bool value, Error **errp)
45
/* XXX: check quiet/signaling case */
58
+{
46
#define DO_VFP_cmp(p, type) \
59
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
47
void VFP_HELPER(cmp, p)(type a, type b, CPUARMState *env) \
60
+
48
{ \
61
+ s->virt = value;
49
- uint32_t flags; \
62
+}
50
- switch(type ## _compare_quiet(a, b, &env->vfp.fp_status)) { \
63
+
51
- case 0: flags = 0x6; break; \
64
static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
52
- case -1: flags = 0x8; break; \
65
{
53
- case 1: flags = 0x2; break; \
66
int i;
54
- default: case 2: flags = 0x3; break; \
67
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
55
- } \
68
"ddr-ram", &error_abort);
56
- env->vfp.xregs[ARM_VFP_FPSCR] = (flags << 28) \
69
object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
57
- | (env->vfp.xregs[ARM_VFP_FPSCR] & 0x0fffffff); \
70
&error_fatal);
58
+ softfloat_to_vfp_compare(env, \
71
+ object_property_set_bool(OBJECT(&s->soc), s->virt, "virtualization",
59
+ type ## _compare_quiet(a, b, &env->vfp.fp_status)); \
72
+ &error_fatal);
60
} \
73
61
void VFP_HELPER(cmpe, p)(type a, type b, CPUARMState *env) \
74
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
62
{ \
75
63
- uint32_t flags; \
76
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_machine_instance_init(Object *obj)
64
- switch(type ## _compare(a, b, &env->vfp.fp_status)) { \
77
{
65
- case 0: flags = 0x6; break; \
78
XlnxZCU102 *s = EP108_MACHINE(obj);
66
- case -1: flags = 0x8; break; \
79
67
- case 1: flags = 0x2; break; \
80
- /* EP108, we don't support setting secure */
68
- default: case 2: flags = 0x3; break; \
81
+ /* EP108, we don't support setting secure or virt */
69
- } \
82
s->secure = false;
70
- env->vfp.xregs[ARM_VFP_FPSCR] = (flags << 28) \
83
+ s->virt = false;
71
- | (env->vfp.xregs[ARM_VFP_FPSCR] & 0x0fffffff); \
72
+ softfloat_to_vfp_compare(env, \
73
+ type ## _compare(a, b, &env->vfp.fp_status)); \
84
}
74
}
85
75
DO_VFP_cmp(s, float32)
86
static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
76
DO_VFP_cmp(d, float64)
87
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_instance_init(Object *obj)
88
"Set on/off to enable/disable the ARM "
89
"Security Extensions (TrustZone)",
90
NULL);
91
+
92
+ /* Default to virt (EL2) being disabled */
93
+ s->virt = false;
94
+ object_property_add_bool(obj, "virtualization", zcu102_get_virt,
95
+ zcu102_set_virt, NULL);
96
+ object_property_set_description(obj, "virtualization",
97
+ "Set on/off to enable/disable emulating a "
98
+ "guest CPU which implements the ARM "
99
+ "Virtualization Extensions",
100
+ NULL);
101
}
102
103
static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
104
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
105
index XXXXXXX..XXXXXXX 100644
106
--- a/hw/arm/xlnx-zynqmp.c
107
+++ b/hw/arm/xlnx-zynqmp.c
108
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
109
object_property_set_bool(OBJECT(&s->apu_cpu[i]),
110
s->secure, "has_el3", NULL);
111
object_property_set_bool(OBJECT(&s->apu_cpu[i]),
112
- false, "has_el2", NULL);
113
+ s->virt, "has_el2", NULL);
114
object_property_set_int(OBJECT(&s->apu_cpu[i]), GIC_BASE_ADDR,
115
"reset-cbar", &error_abort);
116
object_property_set_bool(OBJECT(&s->apu_cpu[i]), true, "realized",
117
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
118
static Property xlnx_zynqmp_props[] = {
119
DEFINE_PROP_STRING("boot-cpu", XlnxZynqMPState, boot_cpu),
120
DEFINE_PROP_BOOL("secure", XlnxZynqMPState, secure, false),
121
+ DEFINE_PROP_BOOL("virtualization", XlnxZynqMPState, virt, false),
122
DEFINE_PROP_BOOL("has_rpu", XlnxZynqMPState, has_rpu, false),
123
DEFINE_PROP_LINK("ddr-ram", XlnxZynqMPState, ddr_ram, TYPE_MEMORY_REGION,
124
MemoryRegion *),
125
--
77
--
126
2.7.4
78
2.20.1
127
79
128
80
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add a machine level secure property. This defaults to false and can be
3
Given that we mask bits properly on set, there is no reason
4
set to true using this machine command line argument:
4
to mask them again on get. We failed to clear the exception
5
-machine xlnx-zcu102,secure=on
5
status bits, 0x9f, which means that the wrong value would be
6
returned on get. Except in the (probably normal) case in which
7
the set clears all of the bits.
6
8
7
This follows what the ARM virt machine does.
9
Simplify the code in set to also clear the RES0 bits.
8
10
9
This property only applies to the ZCU102 machine. The EP108 machine does
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
not have this property.
12
Message-id: 20190209033847.9014-10-richard.henderson@linaro.org
11
13
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
13
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
15
---
16
hw/arm/xlnx-zcu102.c | 32 ++++++++++++++++++++++++++++++++
16
target/arm/helper.c | 15 ++++++++-------
17
1 file changed, 32 insertions(+)
17
1 file changed, 8 insertions(+), 7 deletions(-)
18
18
19
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
20
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/xlnx-zcu102.c
21
--- a/target/arm/helper.c
22
+++ b/hw/arm/xlnx-zcu102.c
22
+++ b/target/arm/helper.c
23
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
23
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(vfp_get_fpscr)(CPUARMState *env)
24
24
int i;
25
XlnxZynqMPState soc;
25
uint32_t fpscr;
26
MemoryRegion ddr_ram;
26
27
+
27
- fpscr = (env->vfp.xregs[ARM_VFP_FPSCR] & 0xffc8ffff)
28
+ bool secure;
28
+ fpscr = env->vfp.xregs[ARM_VFP_FPSCR]
29
} XlnxZCU102;
29
| (env->vfp.vec_len << 16)
30
30
| (env->vfp.vec_stride << 20);
31
#define TYPE_ZCU102_MACHINE MACHINE_TYPE_NAME("xlnx-zcu102")
31
32
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
32
@@ -XXX,XX +XXX,XX @@ static inline int vfp_exceptbits_to_host(int target_bits)
33
33
void HELPER(vfp_set_fpscr)(CPUARMState *env, uint32_t val)
34
static struct arm_boot_info xlnx_zcu102_binfo;
35
36
+static bool zcu102_get_secure(Object *obj, Error **errp)
37
+{
38
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
39
+
40
+ return s->secure;
41
+}
42
+
43
+static void zcu102_set_secure(Object *obj, bool value, Error **errp)
44
+{
45
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
46
+
47
+ s->secure = value;
48
+}
49
+
50
static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
51
{
34
{
52
int i;
35
int i;
53
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
36
- uint32_t changed;
54
37
+ uint32_t changed = env->vfp.xregs[ARM_VFP_FPSCR];
55
object_property_set_link(OBJECT(&s->soc), OBJECT(&s->ddr_ram),
38
56
"ddr-ram", &error_abort);
39
/* When ARMv8.2-FP16 is not supported, FZ16 is RES0. */
57
+ object_property_set_bool(OBJECT(&s->soc), s->secure, "secure",
40
if (!cpu_isar_feature(aa64_fp16, arm_env_get_cpu(env))) {
58
+ &error_fatal);
41
@@ -XXX,XX +XXX,XX @@ void HELPER(vfp_set_fpscr)(CPUARMState *env, uint32_t val)
59
42
60
object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_fatal);
43
/*
61
44
* We don't implement trapped exception handling, so the
62
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_init(MachineState *machine)
45
- * trap enable bits are all RAZ/WI (not RES0!)
63
46
+ * trap enable bits, IDE|IXE|UFE|OFE|DZE|IOE are all RAZ/WI (not RES0!)
64
static void xlnx_ep108_machine_instance_init(Object *obj)
47
+ *
65
{
48
+ * If we exclude the exception flags, IOC|DZC|OFC|UFC|IXC|IDC
66
+ XlnxZCU102 *s = EP108_MACHINE(obj);
49
+ * (which are stored in fp_status), and the other RES0 bits
67
+
50
+ * in between, then we clear all of the low 16 bits.
68
+ /* EP108, we don't support setting secure */
51
*/
69
+ s->secure = false;
52
- val &= ~(FPCR_IDE | FPCR_IXE | FPCR_UFE | FPCR_OFE | FPCR_DZE | FPCR_IOE);
70
}
53
-
71
54
- changed = env->vfp.xregs[ARM_VFP_FPSCR];
72
static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
55
- env->vfp.xregs[ARM_VFP_FPSCR] = (val & 0xffc8ffff);
73
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_init(MachineState *machine)
56
+ env->vfp.xregs[ARM_VFP_FPSCR] = val & 0xffc80000;
74
57
env->vfp.vec_len = (val >> 16) & 7;
75
static void xlnx_zcu102_machine_instance_init(Object *obj)
58
env->vfp.vec_stride = (val >> 20) & 3;
76
{
59
77
+ XlnxZCU102 *s = ZCU102_MACHINE(obj);
78
+
79
+ /* Default to secure mode being disabled */
80
+ s->secure = false;
81
+ object_property_add_bool(obj, "secure", zcu102_get_secure,
82
+ zcu102_set_secure, NULL);
83
+ object_property_set_description(obj, "secure",
84
+ "Set on/off to enable/disable the ARM "
85
+ "Security Extensions (TrustZone)",
86
+ NULL);
87
}
88
89
static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
90
--
60
--
91
2.7.4
61
2.20.1
92
62
93
63
diff view generated by jsdifflib
1
For M profile we must clear the exclusive monitor on reset, exception
1
From: Richard Henderson <richard.henderson@linaro.org>
2
entry and exception exit. We weren't doing any of these things; fix
3
this bug.
4
2
3
Change the representation of this field such that it is easy
4
to set from vector code.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20190209033847.9014-11-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 1505137930-13255-3-git-send-email-peter.maydell@linaro.org
9
---
10
---
10
target/arm/internals.h | 10 ++++++++++
11
target/arm/cpu.h | 5 ++++-
11
target/arm/cpu.c | 6 ++++++
12
target/arm/helper.c | 19 +++++++++++++++----
12
target/arm/helper.c | 2 ++
13
target/arm/neon_helper.c | 2 +-
13
target/arm/op_helper.c | 2 +-
14
target/arm/vec_helper.c | 2 +-
14
4 files changed, 19 insertions(+), 1 deletion(-)
15
4 files changed, 21 insertions(+), 7 deletions(-)
15
16
16
diff --git a/target/arm/internals.h b/target/arm/internals.h
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/internals.h
19
--- a/target/arm/cpu.h
19
+++ b/target/arm/internals.h
20
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ void arm_handle_psci_call(ARMCPU *cpu);
21
@@ -XXX,XX +XXX,XX @@ typedef struct CPUARMState {
22
ARMPredicateReg preg_tmp;
21
#endif
23
#endif
22
24
23
/**
25
- uint32_t xregs[16];
24
+ * arm_clear_exclusive: clear the exclusive monitor
26
/* We store these fpcsr fields separately for convenience. */
25
+ * @env: CPU env
27
+ uint32_t qc[4] QEMU_ALIGNED(16);
26
+ * Clear the CPU's exclusive monitor, like the guest CLREX instruction.
28
int vec_len;
27
+ */
29
int vec_stride;
28
+static inline void arm_clear_exclusive(CPUARMState *env)
30
29
+{
31
+ uint32_t xregs[16];
30
+ env->exclusive_addr = -1;
31
+}
32
+
32
+
33
+/**
33
/* Scratch space for aa32 neon expansion. */
34
* ARMMMUFaultInfo: Information describing an ARM MMU Fault
34
uint32_t scratch[8];
35
* @s2addr: Address that caused a fault at stage 2
35
36
* @stage2: True if we faulted at stage 2
36
@@ -XXX,XX +XXX,XX @@ void vfp_set_fpscr(CPUARMState *env, uint32_t val);
37
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
37
#define FPCR_FZ16 (1 << 19) /* ARMv8.2+, FP16 flush-to-zero */
38
index XXXXXXX..XXXXXXX 100644
38
#define FPCR_FZ (1 << 24) /* Flush-to-zero enable bit */
39
--- a/target/arm/cpu.c
39
#define FPCR_DN (1 << 25) /* Default NaN enable bit */
40
+++ b/target/arm/cpu.c
40
+#define FPCR_QC (1 << 27) /* Cumulative saturation bit */
41
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(CPUState *s)
41
42
env->regs[15] = 0xFFFF0000;
42
static inline uint32_t vfp_get_fpsr(CPUARMState *env)
43
}
43
{
44
45
+ /* M profile requires that reset clears the exclusive monitor;
46
+ * A profile does not, but clearing it makes more sense than having it
47
+ * set with an exclusive access on address zero.
48
+ */
49
+ arm_clear_exclusive(env);
50
+
51
env->vfp.xregs[ARM_VFP_FPEXC] = 0;
52
#endif
53
54
diff --git a/target/arm/helper.c b/target/arm/helper.c
44
diff --git a/target/arm/helper.c b/target/arm/helper.c
55
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
56
--- a/target/arm/helper.c
46
--- a/target/arm/helper.c
57
+++ b/target/arm/helper.c
47
+++ b/target/arm/helper.c
58
@@ -XXX,XX +XXX,XX @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr)
48
@@ -XXX,XX +XXX,XX @@ static inline int vfp_exceptbits_from_host(int host_bits)
59
49
60
armv7m_nvic_acknowledge_irq(env->nvic);
50
uint32_t HELPER(vfp_get_fpscr)(CPUARMState *env)
61
switch_v7m_sp(env, 0);
51
{
62
+ arm_clear_exclusive(env);
52
- int i;
63
/* Clear IT bits */
53
- uint32_t fpscr;
64
env->condexec_bits = 0;
54
+ uint32_t i, fpscr;
65
env->regs[14] = lr;
55
66
@@ -XXX,XX +XXX,XX @@ static void do_v7m_exception_exit(ARMCPU *cpu)
56
fpscr = env->vfp.xregs[ARM_VFP_FPSCR]
67
}
57
| (env->vfp.vec_len << 16)
68
58
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(vfp_get_fpscr)(CPUARMState *env)
69
/* Otherwise, we have a successful exception exit. */
59
/* FZ16 does not generate an input denormal exception. */
70
+ arm_clear_exclusive(env);
60
i |= (get_float_exception_flags(&env->vfp.fp_status_f16)
71
qemu_log_mask(CPU_LOG_INT, "...successful exception return\n");
61
& ~float_flag_input_denormal);
62
-
63
fpscr |= vfp_exceptbits_from_host(i);
64
+
65
+ i = env->vfp.qc[0] | env->vfp.qc[1] | env->vfp.qc[2] | env->vfp.qc[3];
66
+ fpscr |= i ? FPCR_QC : 0;
67
+
68
return fpscr;
72
}
69
}
73
70
74
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
71
@@ -XXX,XX +XXX,XX @@ void HELPER(vfp_set_fpscr)(CPUARMState *env, uint32_t val)
72
* (which are stored in fp_status), and the other RES0 bits
73
* in between, then we clear all of the low 16 bits.
74
*/
75
- env->vfp.xregs[ARM_VFP_FPSCR] = val & 0xffc80000;
76
+ env->vfp.xregs[ARM_VFP_FPSCR] = val & 0xf7c80000;
77
env->vfp.vec_len = (val >> 16) & 7;
78
env->vfp.vec_stride = (val >> 20) & 3;
79
80
+ /*
81
+ * The bit we set within fpscr_q is arbitrary; the register as a
82
+ * whole being zero/non-zero is what counts.
83
+ */
84
+ env->vfp.qc[0] = val & FPCR_QC;
85
+ env->vfp.qc[1] = 0;
86
+ env->vfp.qc[2] = 0;
87
+ env->vfp.qc[3] = 0;
88
+
89
changed ^= val;
90
if (changed & (3 << 22)) {
91
i = (val >> 22) & 3;
92
diff --git a/target/arm/neon_helper.c b/target/arm/neon_helper.c
75
index XXXXXXX..XXXXXXX 100644
93
index XXXXXXX..XXXXXXX 100644
76
--- a/target/arm/op_helper.c
94
--- a/target/arm/neon_helper.c
77
+++ b/target/arm/op_helper.c
95
+++ b/target/arm/neon_helper.c
78
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env)
96
@@ -XXX,XX +XXX,XX @@
79
97
#define SIGNBIT (uint32_t)0x80000000
80
aarch64_save_sp(env, cur_el);
98
#define SIGNBIT64 ((uint64_t)1 << 63)
81
99
82
- env->exclusive_addr = -1;
100
-#define SET_QC() env->vfp.xregs[ARM_VFP_FPSCR] |= CPSR_Q
83
+ arm_clear_exclusive(env);
101
+#define SET_QC() env->vfp.qc[0] = 1
84
102
85
/* We must squash the PSTATE.SS bit to zero unless both of the
103
#define NEON_TYPE1(name, type) \
86
* following hold:
104
typedef struct \
105
diff --git a/target/arm/vec_helper.c b/target/arm/vec_helper.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/target/arm/vec_helper.c
108
+++ b/target/arm/vec_helper.c
109
@@ -XXX,XX +XXX,XX @@
110
#define H4(x) (x)
111
#endif
112
113
-#define SET_QC() env->vfp.xregs[ARM_VFP_FPSCR] |= CPSR_Q
114
+#define SET_QC() env->vfp.qc[0] = 1
115
116
static void clear_tail(void *vd, uintptr_t opr_sz, uintptr_t max_sz)
117
{
87
--
118
--
88
2.7.4
119
2.20.1
89
120
90
121
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
The EP108 is a early access development board. Now that silicon is in
3
For same-sign saturation, we have tcg vector operations. We can
4
production people have access to the ZCU102. Let's rename the internal
4
compute the QC bit by comparing the saturated value against the
5
QEMU files and variables to use the ZCU102.
5
unsaturated value.
6
6
7
There is no functional change here as the EP108 is still a valid board
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
option.
8
Message-id: 20190209033847.9014-12-richard.henderson@linaro.org
9
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
11
---
14
hw/arm/Makefile.objs | 2 +-
12
target/arm/helper.h | 33 +++++++
15
hw/arm/{xlnx-ep108.c => xlnx-zcu102.c} | 30 +++++++++++++++---------------
13
target/arm/translate.h | 4 +
16
2 files changed, 16 insertions(+), 16 deletions(-)
14
target/arm/translate-a64.c | 36 ++++----
17
rename hw/arm/{xlnx-ep108.c => xlnx-zcu102.c} (85%)
15
target/arm/translate.c | 172 +++++++++++++++++++++++++++++++------
16
target/arm/vec_helper.c | 130 ++++++++++++++++++++++++++++
17
5 files changed, 331 insertions(+), 44 deletions(-)
18
18
19
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
19
diff --git a/target/arm/helper.h b/target/arm/helper.h
20
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/Makefile.objs
21
--- a/target/arm/helper.h
22
+++ b/hw/arm/Makefile.objs
22
+++ b/target/arm/helper.h
23
@@ -XXX,XX +XXX,XX @@ obj-y += omap1.o omap2.o strongarm.o
23
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_6(gvec_fmla_idx_s, TCG_CALL_NO_RWG,
24
obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o cubieboard.o
24
DEF_HELPER_FLAGS_6(gvec_fmla_idx_d, TCG_CALL_NO_RWG,
25
obj-$(CONFIG_RASPI) += bcm2835_peripherals.o bcm2836.o raspi.o
25
void, ptr, ptr, ptr, ptr, ptr, i32)
26
obj-$(CONFIG_STM32F205_SOC) += stm32f205_soc.o
26
27
-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp.o xlnx-ep108.o
27
+DEF_HELPER_FLAGS_5(gvec_uqadd_b, TCG_CALL_NO_RWG,
28
+obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp.o xlnx-zcu102.o
28
+ void, ptr, ptr, ptr, ptr, i32)
29
obj-$(CONFIG_FSL_IMX25) += fsl-imx25.o imx25_pdk.o
29
+DEF_HELPER_FLAGS_5(gvec_uqadd_h, TCG_CALL_NO_RWG,
30
obj-$(CONFIG_FSL_IMX31) += fsl-imx31.o kzm.o
30
+ void, ptr, ptr, ptr, ptr, i32)
31
obj-$(CONFIG_FSL_IMX6) += fsl-imx6.o sabrelite.o
31
+DEF_HELPER_FLAGS_5(gvec_uqadd_s, TCG_CALL_NO_RWG,
32
diff --git a/hw/arm/xlnx-ep108.c b/hw/arm/xlnx-zcu102.c
32
+ void, ptr, ptr, ptr, ptr, i32)
33
similarity index 85%
33
+DEF_HELPER_FLAGS_5(gvec_uqadd_d, TCG_CALL_NO_RWG,
34
rename from hw/arm/xlnx-ep108.c
34
+ void, ptr, ptr, ptr, ptr, i32)
35
rename to hw/arm/xlnx-zcu102.c
35
+DEF_HELPER_FLAGS_5(gvec_sqadd_b, TCG_CALL_NO_RWG,
36
+ void, ptr, ptr, ptr, ptr, i32)
37
+DEF_HELPER_FLAGS_5(gvec_sqadd_h, TCG_CALL_NO_RWG,
38
+ void, ptr, ptr, ptr, ptr, i32)
39
+DEF_HELPER_FLAGS_5(gvec_sqadd_s, TCG_CALL_NO_RWG,
40
+ void, ptr, ptr, ptr, ptr, i32)
41
+DEF_HELPER_FLAGS_5(gvec_sqadd_d, TCG_CALL_NO_RWG,
42
+ void, ptr, ptr, ptr, ptr, i32)
43
+DEF_HELPER_FLAGS_5(gvec_uqsub_b, TCG_CALL_NO_RWG,
44
+ void, ptr, ptr, ptr, ptr, i32)
45
+DEF_HELPER_FLAGS_5(gvec_uqsub_h, TCG_CALL_NO_RWG,
46
+ void, ptr, ptr, ptr, ptr, i32)
47
+DEF_HELPER_FLAGS_5(gvec_uqsub_s, TCG_CALL_NO_RWG,
48
+ void, ptr, ptr, ptr, ptr, i32)
49
+DEF_HELPER_FLAGS_5(gvec_uqsub_d, TCG_CALL_NO_RWG,
50
+ void, ptr, ptr, ptr, ptr, i32)
51
+DEF_HELPER_FLAGS_5(gvec_sqsub_b, TCG_CALL_NO_RWG,
52
+ void, ptr, ptr, ptr, ptr, i32)
53
+DEF_HELPER_FLAGS_5(gvec_sqsub_h, TCG_CALL_NO_RWG,
54
+ void, ptr, ptr, ptr, ptr, i32)
55
+DEF_HELPER_FLAGS_5(gvec_sqsub_s, TCG_CALL_NO_RWG,
56
+ void, ptr, ptr, ptr, ptr, i32)
57
+DEF_HELPER_FLAGS_5(gvec_sqsub_d, TCG_CALL_NO_RWG,
58
+ void, ptr, ptr, ptr, ptr, i32)
59
+
60
#ifdef TARGET_AARCH64
61
#include "helper-a64.h"
62
#include "helper-sve.h"
63
diff --git a/target/arm/translate.h b/target/arm/translate.h
36
index XXXXXXX..XXXXXXX 100644
64
index XXXXXXX..XXXXXXX 100644
37
--- a/hw/arm/xlnx-ep108.c
65
--- a/target/arm/translate.h
38
+++ b/hw/arm/xlnx-zcu102.c
66
+++ b/target/arm/translate.h
39
@@ -XXX,XX +XXX,XX @@
67
@@ -XXX,XX +XXX,XX @@ extern const GVecGen2i ssra_op[4];
68
extern const GVecGen2i usra_op[4];
69
extern const GVecGen2i sri_op[4];
70
extern const GVecGen2i sli_op[4];
71
+extern const GVecGen4 uqadd_op[4];
72
+extern const GVecGen4 sqadd_op[4];
73
+extern const GVecGen4 uqsub_op[4];
74
+extern const GVecGen4 sqsub_op[4];
75
void gen_cmtst_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b);
76
40
/*
77
/*
41
- * Xilinx ZynqMP EP108 board
78
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
42
+ * Xilinx ZynqMP ZCU102 board
79
index XXXXXXX..XXXXXXX 100644
43
*
80
--- a/target/arm/translate-a64.c
44
* Copyright (C) 2015 Xilinx Inc
81
+++ b/target/arm/translate-a64.c
45
* Written by Peter Crosthwaite <peter.crosthwaite@xilinx.com>
82
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
46
@@ -XXX,XX +XXX,XX @@
47
#include "exec/address-spaces.h"
48
#include "qemu/log.h"
49
50
-typedef struct XlnxEP108 {
51
+typedef struct XlnxZCU102 {
52
XlnxZynqMPState soc;
53
MemoryRegion ddr_ram;
54
-} XlnxEP108;
55
+} XlnxZCU102;
56
57
-static struct arm_boot_info xlnx_ep108_binfo;
58
+static struct arm_boot_info xlnx_zcu102_binfo;
59
60
-static void xlnx_ep108_init(MachineState *machine)
61
+static void xlnx_zcu102_init(MachineState *machine)
62
{
63
- XlnxEP108 *s = g_new0(XlnxEP108, 1);
64
+ XlnxZCU102 *s = g_new0(XlnxZCU102, 1);
65
int i;
66
uint64_t ram_size = machine->ram_size;
67
68
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_init(MachineState *machine)
69
}
83
}
70
84
71
if (ram_size < 0x08000000) {
85
switch (opcode) {
72
- qemu_log("WARNING: RAM size 0x%" PRIx64 " is small for EP108",
86
+ case 0x01: /* SQADD, UQADD */
73
+ qemu_log("WARNING: RAM size 0x%" PRIx64 " is small for ZCU102",
87
+ tcg_gen_gvec_4(vec_full_reg_offset(s, rd),
74
ram_size);
88
+ offsetof(CPUARMState, vfp.qc),
75
}
89
+ vec_full_reg_offset(s, rn),
76
90
+ vec_full_reg_offset(s, rm),
77
@@ -XXX,XX +XXX,XX @@ static void xlnx_ep108_init(MachineState *machine)
91
+ is_q ? 16 : 8, vec_full_reg_size(s),
78
92
+ (u ? uqadd_op : sqadd_op) + size);
79
/* TODO create and connect IDE devices for ide_drive_get() */
93
+ return;
80
94
+ case 0x05: /* SQSUB, UQSUB */
81
- xlnx_ep108_binfo.ram_size = ram_size;
95
+ tcg_gen_gvec_4(vec_full_reg_offset(s, rd),
82
- xlnx_ep108_binfo.kernel_filename = machine->kernel_filename;
96
+ offsetof(CPUARMState, vfp.qc),
83
- xlnx_ep108_binfo.kernel_cmdline = machine->kernel_cmdline;
97
+ vec_full_reg_offset(s, rn),
84
- xlnx_ep108_binfo.initrd_filename = machine->initrd_filename;
98
+ vec_full_reg_offset(s, rm),
85
- xlnx_ep108_binfo.loader_start = 0;
99
+ is_q ? 16 : 8, vec_full_reg_size(s),
86
- arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_ep108_binfo);
100
+ (u ? uqsub_op : sqsub_op) + size);
87
+ xlnx_zcu102_binfo.ram_size = ram_size;
101
+ return;
88
+ xlnx_zcu102_binfo.kernel_filename = machine->kernel_filename;
102
case 0x0c: /* SMAX, UMAX */
89
+ xlnx_zcu102_binfo.kernel_cmdline = machine->kernel_cmdline;
103
if (u) {
90
+ xlnx_zcu102_binfo.initrd_filename = machine->initrd_filename;
104
gen_gvec_fn3(s, is_q, rd, rn, rm, tcg_gen_gvec_umax, size);
91
+ xlnx_zcu102_binfo.loader_start = 0;
105
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
92
+ arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_zcu102_binfo);
106
genfn = fns[size][u];
93
}
107
break;
94
108
}
95
static void xlnx_ep108_machine_init(MachineClass *mc)
109
- case 0x1: /* SQADD, UQADD */
96
{
110
- {
97
mc->desc = "Xilinx ZynqMP EP108 board";
111
- static NeonGenTwoOpEnvFn * const fns[3][2] = {
98
- mc->init = xlnx_ep108_init;
112
- { gen_helper_neon_qadd_s8, gen_helper_neon_qadd_u8 },
99
+ mc->init = xlnx_zcu102_init;
113
- { gen_helper_neon_qadd_s16, gen_helper_neon_qadd_u16 },
100
mc->block_default_type = IF_IDE;
114
- { gen_helper_neon_qadd_s32, gen_helper_neon_qadd_u32 },
101
mc->units_per_default_bus = 1;
115
- };
102
mc->ignore_memory_transaction_failures = true;
116
- genenvfn = fns[size][u];
103
@@ -XXX,XX +XXX,XX @@ DEFINE_MACHINE("xlnx-ep108", xlnx_ep108_machine_init)
117
- break;
104
static void xlnx_zcu102_machine_init(MachineClass *mc)
118
- }
105
{
119
case 0x2: /* SRHADD, URHADD */
106
mc->desc = "Xilinx ZynqMP ZCU102 board";
120
{
107
- mc->init = xlnx_ep108_init;
121
static NeonGenTwoOpFn * const fns[3][2] = {
108
+ mc->init = xlnx_zcu102_init;
122
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
109
mc->block_default_type = IF_IDE;
123
genfn = fns[size][u];
110
mc->units_per_default_bus = 1;
124
break;
111
mc->ignore_memory_transaction_failures = true;
125
}
126
- case 0x5: /* SQSUB, UQSUB */
127
- {
128
- static NeonGenTwoOpEnvFn * const fns[3][2] = {
129
- { gen_helper_neon_qsub_s8, gen_helper_neon_qsub_u8 },
130
- { gen_helper_neon_qsub_s16, gen_helper_neon_qsub_u16 },
131
- { gen_helper_neon_qsub_s32, gen_helper_neon_qsub_u32 },
132
- };
133
- genenvfn = fns[size][u];
134
- break;
135
- }
136
case 0x8: /* SSHL, USHL */
137
{
138
static NeonGenTwoOpFn * const fns[3][2] = {
139
diff --git a/target/arm/translate.c b/target/arm/translate.c
140
index XXXXXXX..XXXXXXX 100644
141
--- a/target/arm/translate.c
142
+++ b/target/arm/translate.c
143
@@ -XXX,XX +XXX,XX @@ const GVecGen3 cmtst_op[4] = {
144
.vece = MO_64 },
145
};
146
147
+static void gen_uqadd_vec(unsigned vece, TCGv_vec t, TCGv_vec sat,
148
+ TCGv_vec a, TCGv_vec b)
149
+{
150
+ TCGv_vec x = tcg_temp_new_vec_matching(t);
151
+ tcg_gen_add_vec(vece, x, a, b);
152
+ tcg_gen_usadd_vec(vece, t, a, b);
153
+ tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t);
154
+ tcg_gen_or_vec(vece, sat, sat, x);
155
+ tcg_temp_free_vec(x);
156
+}
157
+
158
+const GVecGen4 uqadd_op[4] = {
159
+ { .fniv = gen_uqadd_vec,
160
+ .fno = gen_helper_gvec_uqadd_b,
161
+ .opc = INDEX_op_usadd_vec,
162
+ .write_aofs = true,
163
+ .vece = MO_8 },
164
+ { .fniv = gen_uqadd_vec,
165
+ .fno = gen_helper_gvec_uqadd_h,
166
+ .opc = INDEX_op_usadd_vec,
167
+ .write_aofs = true,
168
+ .vece = MO_16 },
169
+ { .fniv = gen_uqadd_vec,
170
+ .fno = gen_helper_gvec_uqadd_s,
171
+ .opc = INDEX_op_usadd_vec,
172
+ .write_aofs = true,
173
+ .vece = MO_32 },
174
+ { .fniv = gen_uqadd_vec,
175
+ .fno = gen_helper_gvec_uqadd_d,
176
+ .opc = INDEX_op_usadd_vec,
177
+ .write_aofs = true,
178
+ .vece = MO_64 },
179
+};
180
+
181
+static void gen_sqadd_vec(unsigned vece, TCGv_vec t, TCGv_vec sat,
182
+ TCGv_vec a, TCGv_vec b)
183
+{
184
+ TCGv_vec x = tcg_temp_new_vec_matching(t);
185
+ tcg_gen_add_vec(vece, x, a, b);
186
+ tcg_gen_ssadd_vec(vece, t, a, b);
187
+ tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t);
188
+ tcg_gen_or_vec(vece, sat, sat, x);
189
+ tcg_temp_free_vec(x);
190
+}
191
+
192
+const GVecGen4 sqadd_op[4] = {
193
+ { .fniv = gen_sqadd_vec,
194
+ .fno = gen_helper_gvec_sqadd_b,
195
+ .opc = INDEX_op_ssadd_vec,
196
+ .write_aofs = true,
197
+ .vece = MO_8 },
198
+ { .fniv = gen_sqadd_vec,
199
+ .fno = gen_helper_gvec_sqadd_h,
200
+ .opc = INDEX_op_ssadd_vec,
201
+ .write_aofs = true,
202
+ .vece = MO_16 },
203
+ { .fniv = gen_sqadd_vec,
204
+ .fno = gen_helper_gvec_sqadd_s,
205
+ .opc = INDEX_op_ssadd_vec,
206
+ .write_aofs = true,
207
+ .vece = MO_32 },
208
+ { .fniv = gen_sqadd_vec,
209
+ .fno = gen_helper_gvec_sqadd_d,
210
+ .opc = INDEX_op_ssadd_vec,
211
+ .write_aofs = true,
212
+ .vece = MO_64 },
213
+};
214
+
215
+static void gen_uqsub_vec(unsigned vece, TCGv_vec t, TCGv_vec sat,
216
+ TCGv_vec a, TCGv_vec b)
217
+{
218
+ TCGv_vec x = tcg_temp_new_vec_matching(t);
219
+ tcg_gen_sub_vec(vece, x, a, b);
220
+ tcg_gen_ussub_vec(vece, t, a, b);
221
+ tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t);
222
+ tcg_gen_or_vec(vece, sat, sat, x);
223
+ tcg_temp_free_vec(x);
224
+}
225
+
226
+const GVecGen4 uqsub_op[4] = {
227
+ { .fniv = gen_uqsub_vec,
228
+ .fno = gen_helper_gvec_uqsub_b,
229
+ .opc = INDEX_op_ussub_vec,
230
+ .write_aofs = true,
231
+ .vece = MO_8 },
232
+ { .fniv = gen_uqsub_vec,
233
+ .fno = gen_helper_gvec_uqsub_h,
234
+ .opc = INDEX_op_ussub_vec,
235
+ .write_aofs = true,
236
+ .vece = MO_16 },
237
+ { .fniv = gen_uqsub_vec,
238
+ .fno = gen_helper_gvec_uqsub_s,
239
+ .opc = INDEX_op_ussub_vec,
240
+ .write_aofs = true,
241
+ .vece = MO_32 },
242
+ { .fniv = gen_uqsub_vec,
243
+ .fno = gen_helper_gvec_uqsub_d,
244
+ .opc = INDEX_op_ussub_vec,
245
+ .write_aofs = true,
246
+ .vece = MO_64 },
247
+};
248
+
249
+static void gen_sqsub_vec(unsigned vece, TCGv_vec t, TCGv_vec sat,
250
+ TCGv_vec a, TCGv_vec b)
251
+{
252
+ TCGv_vec x = tcg_temp_new_vec_matching(t);
253
+ tcg_gen_sub_vec(vece, x, a, b);
254
+ tcg_gen_sssub_vec(vece, t, a, b);
255
+ tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t);
256
+ tcg_gen_or_vec(vece, sat, sat, x);
257
+ tcg_temp_free_vec(x);
258
+}
259
+
260
+const GVecGen4 sqsub_op[4] = {
261
+ { .fniv = gen_sqsub_vec,
262
+ .fno = gen_helper_gvec_sqsub_b,
263
+ .opc = INDEX_op_sssub_vec,
264
+ .write_aofs = true,
265
+ .vece = MO_8 },
266
+ { .fniv = gen_sqsub_vec,
267
+ .fno = gen_helper_gvec_sqsub_h,
268
+ .opc = INDEX_op_sssub_vec,
269
+ .write_aofs = true,
270
+ .vece = MO_16 },
271
+ { .fniv = gen_sqsub_vec,
272
+ .fno = gen_helper_gvec_sqsub_s,
273
+ .opc = INDEX_op_sssub_vec,
274
+ .write_aofs = true,
275
+ .vece = MO_32 },
276
+ { .fniv = gen_sqsub_vec,
277
+ .fno = gen_helper_gvec_sqsub_d,
278
+ .opc = INDEX_op_sssub_vec,
279
+ .write_aofs = true,
280
+ .vece = MO_64 },
281
+};
282
+
283
/* Translate a NEON data processing instruction. Return nonzero if the
284
instruction is invalid.
285
We process data in a mixture of 32-bit and 64-bit chunks.
286
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
287
}
288
return 0;
289
290
+ case NEON_3R_VQADD:
291
+ tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
292
+ rn_ofs, rm_ofs, vec_size, vec_size,
293
+ (u ? uqadd_op : sqadd_op) + size);
294
+ break;
295
+
296
+ case NEON_3R_VQSUB:
297
+ tcg_gen_gvec_4(rd_ofs, offsetof(CPUARMState, vfp.qc),
298
+ rn_ofs, rm_ofs, vec_size, vec_size,
299
+ (u ? uqsub_op : sqsub_op) + size);
300
+ break;
301
+
302
case NEON_3R_VMUL: /* VMUL */
303
if (u) {
304
/* Polynomial case allows only P8 and is handled below. */
305
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
306
neon_load_reg64(cpu_V0, rn + pass);
307
neon_load_reg64(cpu_V1, rm + pass);
308
switch (op) {
309
- case NEON_3R_VQADD:
310
- if (u) {
311
- gen_helper_neon_qadd_u64(cpu_V0, cpu_env,
312
- cpu_V0, cpu_V1);
313
- } else {
314
- gen_helper_neon_qadd_s64(cpu_V0, cpu_env,
315
- cpu_V0, cpu_V1);
316
- }
317
- break;
318
- case NEON_3R_VQSUB:
319
- if (u) {
320
- gen_helper_neon_qsub_u64(cpu_V0, cpu_env,
321
- cpu_V0, cpu_V1);
322
- } else {
323
- gen_helper_neon_qsub_s64(cpu_V0, cpu_env,
324
- cpu_V0, cpu_V1);
325
- }
326
- break;
327
case NEON_3R_VSHL:
328
if (u) {
329
gen_helper_neon_shl_u64(cpu_V0, cpu_V1, cpu_V0);
330
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
331
case NEON_3R_VHADD:
332
GEN_NEON_INTEGER_OP(hadd);
333
break;
334
- case NEON_3R_VQADD:
335
- GEN_NEON_INTEGER_OP_ENV(qadd);
336
- break;
337
case NEON_3R_VRHADD:
338
GEN_NEON_INTEGER_OP(rhadd);
339
break;
340
case NEON_3R_VHSUB:
341
GEN_NEON_INTEGER_OP(hsub);
342
break;
343
- case NEON_3R_VQSUB:
344
- GEN_NEON_INTEGER_OP_ENV(qsub);
345
- break;
346
case NEON_3R_VSHL:
347
GEN_NEON_INTEGER_OP(shl);
348
break;
349
diff --git a/target/arm/vec_helper.c b/target/arm/vec_helper.c
350
index XXXXXXX..XXXXXXX 100644
351
--- a/target/arm/vec_helper.c
352
+++ b/target/arm/vec_helper.c
353
@@ -XXX,XX +XXX,XX @@ DO_FMLA_IDX(gvec_fmla_idx_s, float32, H4)
354
DO_FMLA_IDX(gvec_fmla_idx_d, float64, )
355
356
#undef DO_FMLA_IDX
357
+
358
+#define DO_SAT(NAME, WTYPE, TYPEN, TYPEM, OP, MIN, MAX) \
359
+void HELPER(NAME)(void *vd, void *vq, void *vn, void *vm, uint32_t desc) \
360
+{ \
361
+ intptr_t i, oprsz = simd_oprsz(desc); \
362
+ TYPEN *d = vd, *n = vn; TYPEM *m = vm; \
363
+ bool q = false; \
364
+ for (i = 0; i < oprsz / sizeof(TYPEN); i++) { \
365
+ WTYPE dd = (WTYPE)n[i] OP m[i]; \
366
+ if (dd < MIN) { \
367
+ dd = MIN; \
368
+ q = true; \
369
+ } else if (dd > MAX) { \
370
+ dd = MAX; \
371
+ q = true; \
372
+ } \
373
+ d[i] = dd; \
374
+ } \
375
+ if (q) { \
376
+ uint32_t *qc = vq; \
377
+ qc[0] = 1; \
378
+ } \
379
+ clear_tail(d, oprsz, simd_maxsz(desc)); \
380
+}
381
+
382
+DO_SAT(gvec_uqadd_b, int, uint8_t, uint8_t, +, 0, UINT8_MAX)
383
+DO_SAT(gvec_uqadd_h, int, uint16_t, uint16_t, +, 0, UINT16_MAX)
384
+DO_SAT(gvec_uqadd_s, int64_t, uint32_t, uint32_t, +, 0, UINT32_MAX)
385
+
386
+DO_SAT(gvec_sqadd_b, int, int8_t, int8_t, +, INT8_MIN, INT8_MAX)
387
+DO_SAT(gvec_sqadd_h, int, int16_t, int16_t, +, INT16_MIN, INT16_MAX)
388
+DO_SAT(gvec_sqadd_s, int64_t, int32_t, int32_t, +, INT32_MIN, INT32_MAX)
389
+
390
+DO_SAT(gvec_uqsub_b, int, uint8_t, uint8_t, -, 0, UINT8_MAX)
391
+DO_SAT(gvec_uqsub_h, int, uint16_t, uint16_t, -, 0, UINT16_MAX)
392
+DO_SAT(gvec_uqsub_s, int64_t, uint32_t, uint32_t, -, 0, UINT32_MAX)
393
+
394
+DO_SAT(gvec_sqsub_b, int, int8_t, int8_t, -, INT8_MIN, INT8_MAX)
395
+DO_SAT(gvec_sqsub_h, int, int16_t, int16_t, -, INT16_MIN, INT16_MAX)
396
+DO_SAT(gvec_sqsub_s, int64_t, int32_t, int32_t, -, INT32_MIN, INT32_MAX)
397
+
398
+#undef DO_SAT
399
+
400
+void HELPER(gvec_uqadd_d)(void *vd, void *vq, void *vn,
401
+ void *vm, uint32_t desc)
402
+{
403
+ intptr_t i, oprsz = simd_oprsz(desc);
404
+ uint64_t *d = vd, *n = vn, *m = vm;
405
+ bool q = false;
406
+
407
+ for (i = 0; i < oprsz / 8; i++) {
408
+ uint64_t nn = n[i], mm = m[i], dd = nn + mm;
409
+ if (dd < nn) {
410
+ dd = UINT64_MAX;
411
+ q = true;
412
+ }
413
+ d[i] = dd;
414
+ }
415
+ if (q) {
416
+ uint32_t *qc = vq;
417
+ qc[0] = 1;
418
+ }
419
+ clear_tail(d, oprsz, simd_maxsz(desc));
420
+}
421
+
422
+void HELPER(gvec_uqsub_d)(void *vd, void *vq, void *vn,
423
+ void *vm, uint32_t desc)
424
+{
425
+ intptr_t i, oprsz = simd_oprsz(desc);
426
+ uint64_t *d = vd, *n = vn, *m = vm;
427
+ bool q = false;
428
+
429
+ for (i = 0; i < oprsz / 8; i++) {
430
+ uint64_t nn = n[i], mm = m[i], dd = nn - mm;
431
+ if (nn < mm) {
432
+ dd = 0;
433
+ q = true;
434
+ }
435
+ d[i] = dd;
436
+ }
437
+ if (q) {
438
+ uint32_t *qc = vq;
439
+ qc[0] = 1;
440
+ }
441
+ clear_tail(d, oprsz, simd_maxsz(desc));
442
+}
443
+
444
+void HELPER(gvec_sqadd_d)(void *vd, void *vq, void *vn,
445
+ void *vm, uint32_t desc)
446
+{
447
+ intptr_t i, oprsz = simd_oprsz(desc);
448
+ int64_t *d = vd, *n = vn, *m = vm;
449
+ bool q = false;
450
+
451
+ for (i = 0; i < oprsz / 8; i++) {
452
+ int64_t nn = n[i], mm = m[i], dd = nn + mm;
453
+ if (((dd ^ nn) & ~(nn ^ mm)) & INT64_MIN) {
454
+ dd = (nn >> 63) ^ ~INT64_MIN;
455
+ q = true;
456
+ }
457
+ d[i] = dd;
458
+ }
459
+ if (q) {
460
+ uint32_t *qc = vq;
461
+ qc[0] = 1;
462
+ }
463
+ clear_tail(d, oprsz, simd_maxsz(desc));
464
+}
465
+
466
+void HELPER(gvec_sqsub_d)(void *vd, void *vq, void *vn,
467
+ void *vm, uint32_t desc)
468
+{
469
+ intptr_t i, oprsz = simd_oprsz(desc);
470
+ int64_t *d = vd, *n = vn, *m = vm;
471
+ bool q = false;
472
+
473
+ for (i = 0; i < oprsz / 8; i++) {
474
+ int64_t nn = n[i], mm = m[i], dd = nn - mm;
475
+ if (((dd ^ nn) & (nn ^ mm)) & INT64_MIN) {
476
+ dd = (nn >> 63) ^ ~INT64_MIN;
477
+ q = true;
478
+ }
479
+ d[i] = dd;
480
+ }
481
+ if (q) {
482
+ uint32_t *qc = vq;
483
+ qc[0] = 1;
484
+ }
485
+ clear_tail(d, oprsz, simd_maxsz(desc));
486
+}
112
--
487
--
113
2.7.4
488
2.20.1
114
489
115
490
diff view generated by jsdifflib
1
From: Alistair Francis <alistair.francis@xilinx.com>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
In preperation for future work let's manually create the Xilnx machines.
3
Fortunately, the functions affected are so far only called from SVE,
4
This will allow us to set properties for the machines in the future.
4
so there is no tail to be cleared. But as we convert more of AdvSIMD
5
to gvec, this will matter.
5
6
6
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Message-id: 20190209033847.9014-13-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@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
hw/arm/xlnx-zcu102.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++-----
12
target/arm/vec_helper.c | 2 ++
11
1 file changed, 67 insertions(+), 7 deletions(-)
13
1 file changed, 2 insertions(+)
12
14
13
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
15
diff --git a/target/arm/vec_helper.c b/target/arm/vec_helper.c
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/xlnx-zcu102.c
17
--- a/target/arm/vec_helper.c
16
+++ b/hw/arm/xlnx-zcu102.c
18
+++ b/target/arm/vec_helper.c
17
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(void *vd, void *vn, void *stat, uint32_t desc) \
18
#include "qemu/log.h"
20
for (i = 0; i < oprsz / sizeof(TYPE); i++) { \
19
21
d[i] = FUNC(n[i], stat); \
20
typedef struct XlnxZCU102 {
22
} \
21
+ MachineState parent_obj;
23
+ clear_tail(d, oprsz, simd_maxsz(desc)); \
22
+
23
XlnxZynqMPState soc;
24
MemoryRegion ddr_ram;
25
} XlnxZCU102;
26
27
+#define TYPE_ZCU102_MACHINE MACHINE_TYPE_NAME("xlnx-zcu102")
28
+#define ZCU102_MACHINE(obj) \
29
+ OBJECT_CHECK(XlnxZCU102, (obj), TYPE_ZCU102_MACHINE)
30
+
31
+#define TYPE_EP108_MACHINE MACHINE_TYPE_NAME("xlnx-ep108")
32
+#define EP108_MACHINE(obj) \
33
+ OBJECT_CHECK(XlnxZCU102, (obj), TYPE_EP108_MACHINE)
34
+
35
static struct arm_boot_info xlnx_zcu102_binfo;
36
37
-static void xlnx_zcu102_init(MachineState *machine)
38
+static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
39
{
40
- XlnxZCU102 *s = g_new0(XlnxZCU102, 1);
41
int i;
42
uint64_t ram_size = machine->ram_size;
43
44
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_init(MachineState *machine)
45
arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_zcu102_binfo);
46
}
24
}
47
25
48
-static void xlnx_ep108_machine_init(MachineClass *mc)
26
DO_2OP(gvec_frecpe_h, helper_recpe_f16, float16)
49
+static void xlnx_ep108_init(MachineState *machine)
27
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(void *vd, void *vn, void *vm, void *stat, uint32_t desc) \
50
+{
28
for (i = 0; i < oprsz / sizeof(TYPE); i++) { \
51
+ XlnxZCU102 *s = EP108_MACHINE(machine);
29
d[i] = FUNC(n[i], m[i], stat); \
52
+
30
} \
53
+ xlnx_zynqmp_init(s, machine);
31
+ clear_tail(d, oprsz, simd_maxsz(desc)); \
54
+}
55
+
56
+static void xlnx_ep108_machine_instance_init(Object *obj)
57
{
58
+}
59
+
60
+static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
61
+{
62
+ MachineClass *mc = MACHINE_CLASS(oc);
63
+
64
mc->desc = "Xilinx ZynqMP EP108 board";
65
- mc->init = xlnx_zcu102_init;
66
+ mc->init = xlnx_ep108_init;
67
mc->block_default_type = IF_IDE;
68
mc->units_per_default_bus = 1;
69
mc->ignore_memory_transaction_failures = true;
70
}
32
}
71
33
72
-DEFINE_MACHINE("xlnx-ep108", xlnx_ep108_machine_init)
34
DO_3OP(gvec_fadd_h, float16_add, float16)
73
+static const TypeInfo xlnx_ep108_machine_init_typeinfo = {
74
+ .name = MACHINE_TYPE_NAME("xlnx-ep108"),
75
+ .parent = TYPE_MACHINE,
76
+ .class_init = xlnx_ep108_machine_class_init,
77
+ .instance_init = xlnx_ep108_machine_instance_init,
78
+ .instance_size = sizeof(XlnxZCU102),
79
+};
80
81
-static void xlnx_zcu102_machine_init(MachineClass *mc)
82
+static void xlnx_ep108_machine_init_register_types(void)
83
{
84
+ type_register_static(&xlnx_ep108_machine_init_typeinfo);
85
+}
86
+
87
+static void xlnx_zcu102_init(MachineState *machine)
88
+{
89
+ XlnxZCU102 *s = ZCU102_MACHINE(machine);
90
+
91
+ xlnx_zynqmp_init(s, machine);
92
+}
93
+
94
+static void xlnx_zcu102_machine_instance_init(Object *obj)
95
+{
96
+}
97
+
98
+static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data)
99
+{
100
+ MachineClass *mc = MACHINE_CLASS(oc);
101
+
102
mc->desc = "Xilinx ZynqMP ZCU102 board";
103
mc->init = xlnx_zcu102_init;
104
mc->block_default_type = IF_IDE;
105
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_init(MachineClass *mc)
106
mc->ignore_memory_transaction_failures = true;
107
}
108
109
-DEFINE_MACHINE("xlnx-zcu102", xlnx_zcu102_machine_init)
110
+static const TypeInfo xlnx_zcu102_machine_init_typeinfo = {
111
+ .name = MACHINE_TYPE_NAME("xlnx-zcu102"),
112
+ .parent = TYPE_MACHINE,
113
+ .class_init = xlnx_zcu102_machine_class_init,
114
+ .instance_init = xlnx_zcu102_machine_instance_init,
115
+ .instance_size = sizeof(XlnxZCU102),
116
+};
117
+
118
+static void xlnx_zcu102_machine_init_register_types(void)
119
+{
120
+ type_register_static(&xlnx_zcu102_machine_init_typeinfo);
121
+}
122
+
123
+type_init(xlnx_zcu102_machine_init_register_types)
124
+type_init(xlnx_ep108_machine_init_register_types)
125
--
35
--
126
2.7.4
36
2.20.1
127
37
128
38
diff view generated by jsdifflib
1
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
1
From: Sandra Loosemore <sandra@codesourcery.com>
2
2
3
Let's provide the GPEX host bridge with the INTx/gsi mapping. This is
3
Per the GDB remote protocol documentation
4
needed for INTx/gsi routing.
5
4
6
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
5
https://sourceware.org/gdb/current/onlinedocs/gdb/Packets.html#index-vKill-packet
7
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
6
8
Signed-off-by: Eric Auger <eric.auger@redhat.com>
7
the debug stub is expected to send a reply to the 'vKill' packet. At
9
Reviewed-by: Andrew Jones <drjones@redhat.com>
8
least some versions of GDB crash if the gdb stub simply exits without
10
Tested-by: Feng Kan <fkan@apm.com>
9
sending a reply. This patch fixes QEMU's gdb stub to conform to the
11
Message-id: 1505296004-6798-3-git-send-email-eric.auger@redhat.com
10
expected behavior.
11
12
Note that QEMU's existing handling of the legacy 'k' packet is
13
correct: in that case GDB does not expect a reply, and QEMU does not
14
send one.
15
16
Signed-off-by: Sandra Loosemore <sandra@codesourcery.com>
17
Message-id: 1550008033-26540-1-git-send-email-sandra@codesourcery.com
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
20
---
14
hw/arm/virt.c | 1 +
21
gdbstub.c | 1 +
15
1 file changed, 1 insertion(+)
22
1 file changed, 1 insertion(+)
16
23
17
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
24
diff --git a/gdbstub.c b/gdbstub.c
18
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/virt.c
26
--- a/gdbstub.c
20
+++ b/hw/arm/virt.c
27
+++ b/gdbstub.c
21
@@ -XXX,XX +XXX,XX @@ static void create_pcie(const VirtMachineState *vms, qemu_irq *pic)
28
@@ -XXX,XX +XXX,XX @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
22
29
break;
23
for (i = 0; i < GPEX_NUM_IRQS; i++) {
30
} else if (strncmp(p, "Kill;", 5) == 0) {
24
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
31
/* Kill the target */
25
+ gpex_set_irq_num(GPEX_HOST(dev), i, irq + i);
32
+ put_packet(s, "OK");
26
}
33
error_report("QEMU: Terminated via GDBstub");
27
34
exit(0);
28
pci = PCI_HOST_BRIDGE(dev);
35
} else {
29
--
36
--
30
2.7.4
37
2.20.1
31
38
32
39
diff view generated by jsdifflib