1
The following changes since commit 61fee7f45955cd0bf9b79be9fa9c7ebabb5e6a85:
1
The following changes since commit 7e7eb9f852a46b51a71ae9d82590b2e4d28827ee:
2
2
3
Merge remote-tracking branch 'remotes/philmd-gitlab/tags/acceptance-testing-20200622' into staging (2020-06-22 20:50:10 +0100)
3
Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2021-01-28' into staging (2021-01-28 22:43:18 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20200623
7
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20210129
8
8
9
for you to fetch changes up to 539533b85fbd269f777bed931de8ccae1dd837e9:
9
for you to fetch changes up to 11749122e1a86866591306d43603d2795a3dea1a:
10
10
11
arm/virt: Add memory hot remove support (2020-06-23 11:39:48 +0100)
11
hw/arm/stellaris: Remove board-creation reset of STELLARIS_SYS (2021-01-29 10:47:29 +0000)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
target-arm queue:
14
target-arm queue:
15
* util/oslib-posix : qemu_init_exec_dir implementation for Mac
15
* Implement ID_PFR2
16
* target/arm: Last parts of neon decodetree conversion
16
* Conditionalize DBGDIDR
17
* hw/arm/virt: Add 5.0 HW compat props
17
* rename xlnx-zcu102.canbusN properties
18
* hw/watchdog/cmsdk-apb-watchdog: Add trace event for lock status
18
* provide powerdown/reset mechanism for secure firmware on 'virt' board
19
* mps2: Add CMSDK APB watchdog, FPGAIO block, S2I devices and I2C devices
19
* hw/misc: Fix arith overflow in NPCM7XX PWM module
20
* mps2: Add some unimplemented-device stubs for audio and GPIO
20
* target/arm: Replace magic value by MMU_DATA_LOAD definition
21
* mps2-tz: Use the ARM SBCon two-wire serial bus interface
21
* configure: fix preadv errors on Catalina macOS with new XCode
22
* target/arm: Check supported KVM features globally (not per vCPU)
22
* Various configure and other cleanups in preparation for iOS support
23
* tests/qtest/arm-cpu-features: Add feature setting tests
23
* hvf: Add hypervisor entitlement to output binaries (needed for Big Sur)
24
* arm/virt: Add memory hot remove support
24
* Implement pvpanic-pci device
25
* Convert the CMSDK timer devices to the Clock framework
25
26
26
----------------------------------------------------------------
27
----------------------------------------------------------------
27
Andrew Jones (2):
28
Alexander Graf (1):
28
hw/arm/virt: Add 5.0 HW compat props
29
hvf: Add hypervisor entitlement to output binaries
29
tests/qtest/arm-cpu-features: Add feature setting tests
30
30
31
David CARLIER (1):
31
Hao Wu (1):
32
util/oslib-posix : qemu_init_exec_dir implementation for Mac
32
hw/misc: Fix arith overflow in NPCM7XX PWM module
33
33
34
Peter Maydell (23):
34
Joelle van Dyne (7):
35
target/arm: Convert Neon 2-reg-misc VREV64 to decodetree
35
configure: cross-compiling with empty cross_prefix
36
target/arm: Convert Neon 2-reg-misc pairwise ops to decodetree
36
osdep: build with non-working system() function
37
target/arm: Convert VZIP, VUZP to decodetree
37
darwin: remove redundant dependency declaration
38
target/arm: Convert Neon narrowing moves to decodetree
38
darwin: fix cross-compiling for Darwin
39
target/arm: Convert Neon 2-reg-misc VSHLL to decodetree
39
configure: cross compile should use x86_64 cpu_family
40
target/arm: Convert Neon VCVT f16/f32 insns to decodetree
40
darwin: detect CoreAudio for build
41
target/arm: Convert vectorised 2-reg-misc Neon ops to decodetree
41
darwin: remove 64-bit build detection on 32-bit OS
42
target/arm: Convert Neon 2-reg-misc crypto operations to decodetree
43
target/arm: Rename NeonGenOneOpFn to NeonGenOne64OpFn
44
target/arm: Fix capitalization in NeonGenTwo{Single, Double}OPFn typedefs
45
target/arm: Make gen_swap_half() take separate src and dest
46
target/arm: Convert Neon 2-reg-misc VREV32 and VREV16 to decodetree
47
target/arm: Convert remaining simple 2-reg-misc Neon ops
48
target/arm: Convert Neon VQABS, VQNEG to decodetree
49
target/arm: Convert simple fp Neon 2-reg-misc insns
50
target/arm: Convert Neon 2-reg-misc fp-compare-with-zero insns to decodetree
51
target/arm: Convert Neon 2-reg-misc VRINT insns to decodetree
52
target/arm: Convert Neon 2-reg-misc VCVT insns to decodetree
53
target/arm: Convert Neon VSWP to decodetree
54
target/arm: Convert Neon VTRN to decodetree
55
target/arm: Move some functions used only in translate-neon.inc.c to that file
56
target/arm: Remove unnecessary gen_io_end() calls
57
target/arm: Remove dead code relating to SABA and UABA
58
42
59
Philippe Mathieu-Daudé (15):
43
Maxim Uvarov (3):
60
hw/watchdog/cmsdk-apb-watchdog: Add trace event for lock status
44
hw: gpio: implement gpio-pwr driver for qemu reset/poweroff
61
hw/i2c/versatile_i2c: Add definitions for register addresses
45
arm-virt: refactor gpios creation
62
hw/i2c/versatile_i2c: Add SCL/SDA definitions
46
arm-virt: add secure pl061 for reset/power down
63
hw/i2c: Add header for ARM SBCon two-wire serial bus interface
64
hw/arm: Use TYPE_VERSATILE_I2C instead of hardcoded string
65
hw/arm/mps2: Document CMSDK/FPGA APB subsystem sections
66
hw/arm/mps2: Rename CMSDK AHB peripheral region
67
hw/arm/mps2: Add CMSDK APB watchdog device
68
hw/arm/mps2: Add CMSDK AHB GPIO peripherals as unimplemented devices
69
hw/arm/mps2: Map the FPGA I/O block
70
hw/arm/mps2: Add SPI devices
71
hw/arm/mps2: Add I2C devices
72
hw/arm/mps2: Add audio I2S interface as unimplemented device
73
hw/arm/mps2-tz: Use the ARM SBCon two-wire serial bus interface
74
target/arm: Check supported KVM features globally (not per vCPU)
75
47
76
Shameer Kolothum (1):
48
Mihai Carabas (4):
77
arm/virt: Add memory hot remove support
49
hw/misc/pvpanic: split-out generic and bus dependent code
50
hw/misc/pvpanic: add PCI interface support
51
pvpanic : update pvpanic spec document
52
tests/qtest: add a test case for pvpanic-pci
78
53
79
include/hw/i2c/arm_sbcon_i2c.h | 35 ++
54
Paolo Bonzini (1):
80
target/arm/cpu.h | 2 +-
55
arm: rename xlnx-zcu102.canbusN properties
81
target/arm/kvm_arm.h | 21 +-
82
target/arm/translate.h | 8 +-
83
target/arm/neon-dp.decode | 106 ++++
84
hw/acpi/generic_event_device.c | 29 +
85
hw/arm/mps2-tz.c | 23 +-
86
hw/arm/mps2.c | 65 ++-
87
hw/arm/realview.c | 3 +-
88
hw/arm/versatilepb.c | 3 +-
89
hw/arm/vexpress.c | 3 +-
90
hw/arm/virt.c | 63 +-
91
hw/i2c/versatile_i2c.c | 38 +-
92
hw/watchdog/cmsdk-apb-watchdog.c | 1 +
93
target/arm/cpu.c | 2 +-
94
target/arm/cpu64.c | 10 +-
95
target/arm/kvm.c | 4 +-
96
target/arm/kvm64.c | 14 +-
97
target/arm/translate-a64.c | 20 +-
98
target/arm/translate-neon.inc.c | 1191 +++++++++++++++++++++++++++++++++++++-
99
target/arm/translate-vfp.inc.c | 7 +-
100
target/arm/translate.c | 1064 +---------------------------------
101
tests/qtest/arm-cpu-features.c | 38 +-
102
util/oslib-posix.c | 15 +
103
MAINTAINERS | 1 +
104
hw/arm/Kconfig | 8 +-
105
hw/watchdog/trace-events | 1 +
106
27 files changed, 1624 insertions(+), 1151 deletions(-)
107
create mode 100644 include/hw/i2c/arm_sbcon_i2c.h
108
56
57
Peter Maydell (26):
58
configure: Move preadv check to meson.build
59
ptimer: Add new ptimer_set_period_from_clock() function
60
clock: Add new clock_has_source() function
61
tests: Add a simple test of the CMSDK APB timer
62
tests: Add a simple test of the CMSDK APB watchdog
63
tests: Add a simple test of the CMSDK APB dual timer
64
hw/timer/cmsdk-apb-timer: Rename CMSDKAPBTIMER struct to CMSDKAPBTimer
65
hw/timer/cmsdk-apb-timer: Add Clock input
66
hw/timer/cmsdk-apb-dualtimer: Add Clock input
67
hw/watchdog/cmsdk-apb-watchdog: Add Clock input
68
hw/arm/armsse: Rename "MAINCLK" property to "MAINCLK_FRQ"
69
hw/arm/armsse: Wire up clocks
70
hw/arm/mps2: Inline CMSDK_APB_TIMER creation
71
hw/arm/mps2: Create and connect SYSCLK Clock
72
hw/arm/mps2-tz: Create and connect ARMSSE Clocks
73
hw/arm/musca: Create and connect ARMSSE Clocks
74
hw/arm/stellaris: Convert SSYS to QOM device
75
hw/arm/stellaris: Create Clock input for watchdog
76
hw/timer/cmsdk-apb-timer: Convert to use Clock input
77
hw/timer/cmsdk-apb-dualtimer: Convert to use Clock input
78
hw/watchdog/cmsdk-apb-watchdog: Convert to use Clock input
79
tests/qtest/cmsdk-apb-watchdog-test: Test clock changes
80
hw/arm/armsse: Use Clock to set system_clock_scale
81
arm: Don't set freq properties on CMSDK timer, dualtimer, watchdog, ARMSSE
82
arm: Remove frq properties on CMSDK timer, dualtimer, watchdog, ARMSSE
83
hw/arm/stellaris: Remove board-creation reset of STELLARIS_SYS
84
85
Philippe Mathieu-Daudé (1):
86
target/arm: Replace magic value by MMU_DATA_LOAD definition
87
88
Richard Henderson (2):
89
target/arm: Implement ID_PFR2
90
target/arm: Conditionalize DBGDIDR
91
92
docs/devel/clocks.rst | 16 +++
93
docs/specs/pci-ids.txt | 1 +
94
docs/specs/pvpanic.txt | 13 ++-
95
docs/system/arm/virt.rst | 2 +
96
configure | 78 ++++++++------
97
meson.build | 34 ++++++-
98
include/hw/arm/armsse.h | 14 ++-
99
include/hw/arm/virt.h | 2 +
100
include/hw/clock.h | 15 +++
101
include/hw/misc/pvpanic.h | 24 ++++-
102
include/hw/pci/pci.h | 1 +
103
include/hw/ptimer.h | 22 ++++
104
include/hw/timer/cmsdk-apb-dualtimer.h | 5 +-
105
include/hw/timer/cmsdk-apb-timer.h | 34 ++-----
106
include/hw/watchdog/cmsdk-apb-watchdog.h | 5 +-
107
include/qemu/osdep.h | 12 +++
108
include/qemu/typedefs.h | 1 +
109
target/arm/cpu.h | 1 +
110
hw/arm/armsse.c | 48 ++++++---
111
hw/arm/mps2-tz.c | 14 ++-
112
hw/arm/mps2.c | 28 ++++-
113
hw/arm/musca.c | 13 ++-
114
hw/arm/stellaris.c | 170 +++++++++++++++++++++++--------
115
hw/arm/virt.c | 111 ++++++++++++++++----
116
hw/arm/xlnx-zcu102.c | 4 +-
117
hw/core/ptimer.c | 34 +++++++
118
hw/gpio/gpio_pwr.c | 70 +++++++++++++
119
hw/misc/npcm7xx_pwm.c | 23 ++++-
120
hw/misc/pvpanic-isa.c | 94 +++++++++++++++++
121
hw/misc/pvpanic-pci.c | 94 +++++++++++++++++
122
hw/misc/pvpanic.c | 85 ++--------------
123
hw/timer/cmsdk-apb-dualtimer.c | 53 +++++++---
124
hw/timer/cmsdk-apb-timer.c | 55 +++++-----
125
hw/watchdog/cmsdk-apb-watchdog.c | 29 ++++--
126
target/arm/helper.c | 27 +++--
127
target/arm/kvm64.c | 2 +
128
tests/qtest/cmsdk-apb-dualtimer-test.c | 130 +++++++++++++++++++++++
129
tests/qtest/cmsdk-apb-timer-test.c | 75 ++++++++++++++
130
tests/qtest/cmsdk-apb-watchdog-test.c | 131 ++++++++++++++++++++++++
131
tests/qtest/npcm7xx_pwm-test.c | 4 +-
132
tests/qtest/pvpanic-pci-test.c | 94 +++++++++++++++++
133
tests/qtest/xlnx-can-test.c | 30 +++---
134
MAINTAINERS | 3 +
135
accel/hvf/entitlements.plist | 8 ++
136
hw/arm/Kconfig | 1 +
137
hw/gpio/Kconfig | 3 +
138
hw/gpio/meson.build | 1 +
139
hw/i386/Kconfig | 2 +-
140
hw/misc/Kconfig | 12 ++-
141
hw/misc/meson.build | 4 +-
142
scripts/entitlement.sh | 13 +++
143
tests/qtest/meson.build | 6 +-
144
52 files changed, 1432 insertions(+), 319 deletions(-)
145
create mode 100644 hw/gpio/gpio_pwr.c
146
create mode 100644 hw/misc/pvpanic-isa.c
147
create mode 100644 hw/misc/pvpanic-pci.c
148
create mode 100644 tests/qtest/cmsdk-apb-dualtimer-test.c
149
create mode 100644 tests/qtest/cmsdk-apb-timer-test.c
150
create mode 100644 tests/qtest/cmsdk-apb-watchdog-test.c
151
create mode 100644 tests/qtest/pvpanic-pci-test.c
152
create mode 100644 accel/hvf/entitlements.plist
153
create mode 100755 scripts/entitlement.sh
154
diff view generated by jsdifflib
1
Since commit ba3e7926691ed3 it has been unnecessary for target code
1
From: Richard Henderson <richard.henderson@linaro.org>
2
to call gen_io_end() after an IO instruction in icount mode; it is
3
sufficient to call gen_io_start() before it and to force the end of
4
the TB.
5
2
6
Many now-unnecessary calls to gen_io_end() were removed in commit
3
This was defined at some point before ARMv8.4, and will
7
9e9b10c6491153b, but some were missed or accidentally added later.
4
shortly be used by new processor descriptions.
8
Remove unneeded calls from the arm target:
9
5
10
* the call in the handling of exception-return-via-LDM is
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
unnecessary, and the code is already forcing end-of-TB
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
* the call in the VFP access check code is more complicated:
8
Message-id: 20210120204400.1056582-1-richard.henderson@linaro.org
13
we weren't ending the TB, so we need to add the code to
14
force that by setting DISAS_UPDATE
15
* the doc comment for ARM_CP_IO doesn't need to mention
16
gen_io_end() any more
17
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
Reviewed-by: Pavel Dovgalyuk <Pavel.Dovgaluk@ispras.ru>
22
Message-id: 20200619170324.12093-1-peter.maydell@linaro.org
23
---
10
---
24
target/arm/cpu.h | 2 +-
11
target/arm/cpu.h | 1 +
25
target/arm/translate-vfp.inc.c | 7 +++----
12
target/arm/helper.c | 4 ++--
26
target/arm/translate.c | 3 ---
13
target/arm/kvm64.c | 2 ++
27
3 files changed, 4 insertions(+), 8 deletions(-)
14
3 files changed, 5 insertions(+), 2 deletions(-)
28
15
29
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
16
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
30
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/cpu.h
18
--- a/target/arm/cpu.h
32
+++ b/target/arm/cpu.h
19
+++ b/target/arm/cpu.h
33
@@ -XXX,XX +XXX,XX @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
20
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
34
* migration or KVM state synchronization. (Typically this is for "registers"
21
uint32_t id_mmfr4;
35
* which are actually used as instructions for cache maintenance and so on.)
22
uint32_t id_pfr0;
36
* IO indicates that this register does I/O and therefore its accesses
23
uint32_t id_pfr1;
37
- * need to be surrounded by gen_io_start()/gen_io_end(). In particular,
24
+ uint32_t id_pfr2;
38
+ * need to be marked with gen_io_start() and also end the TB. In particular,
25
uint32_t mvfr0;
39
* registers which implement clocks or timers require this.
26
uint32_t mvfr1;
40
* RAISES_EXC is for when the read or write hook might raise an exception;
27
uint32_t mvfr2;
41
* the generated code will synchronize the CPU state before calling the hook
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
42
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
43
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/translate-vfp.inc.c
30
--- a/target/arm/helper.c
45
+++ b/target/arm/translate-vfp.inc.c
31
+++ b/target/arm/helper.c
46
@@ -XXX,XX +XXX,XX @@ static bool full_vfp_access_check(DisasContext *s, bool ignore_vfp_enabled)
32
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
47
if (s->v7m_lspact) {
33
.access = PL1_R, .type = ARM_CP_CONST,
48
/*
34
.accessfn = access_aa64_tid3,
49
* Lazy state saving affects external memory and also the NVIC,
35
.resetvalue = 0 },
50
- * so we must mark it as an IO operation for icount.
36
- { .name = "MVFR4_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
51
+ * so we must mark it as an IO operation for icount (and cause
37
+ { .name = "ID_PFR2", .state = ARM_CP_STATE_BOTH,
52
+ * this to be the last insn in the TB).
38
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 4,
53
*/
39
.access = PL1_R, .type = ARM_CP_CONST,
54
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
40
.accessfn = access_aa64_tid3,
55
+ s->base.is_jmp = DISAS_UPDATE;
41
- .resetvalue = 0 },
56
gen_io_start();
42
+ .resetvalue = cpu->isar.id_pfr2 },
57
}
43
{ .name = "MVFR5_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
58
gen_helper_v7m_preserve_fp_state(cpu_env);
44
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 3, .opc2 = 5,
59
- if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
45
.access = PL1_R, .type = ARM_CP_CONST,
60
- gen_io_end();
46
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
61
- }
62
/*
63
* If the preserve_fp_state helper doesn't throw an exception
64
* then it will clear LSPACT; we don't need to repeat this for
65
diff --git a/target/arm/translate.c b/target/arm/translate.c
66
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
67
--- a/target/arm/translate.c
48
--- a/target/arm/kvm64.c
68
+++ b/target/arm/translate.c
49
+++ b/target/arm/kvm64.c
69
@@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
50
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
70
gen_io_start();
51
ARM64_SYS_REG(3, 0, 0, 1, 0));
71
}
52
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr1,
72
gen_helper_cpsr_write_eret(cpu_env, tmp);
53
ARM64_SYS_REG(3, 0, 0, 1, 1));
73
- if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
54
+ err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_pfr2,
74
- gen_io_end();
55
+ ARM64_SYS_REG(3, 0, 0, 3, 4));
75
- }
56
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_dfr0,
76
tcg_temp_free_i32(tmp);
57
ARM64_SYS_REG(3, 0, 0, 1, 2));
77
/* Must exit loop to check un-masked IRQs */
58
err |= read_sys_reg32(fdarray[2], &ahcf->isar.id_mmfr0,
78
s->base.is_jmp = DISAS_EXIT;
79
--
59
--
80
2.20.1
60
2.20.1
81
61
82
62
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
From 'Application Note AN385', chapter 3.14:
3
Only define the register if it exists for the cpu.
4
4
5
The SMM implements a simple SBCon interface based on I2C.
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
6
Message-id: 20210120031656.737646-1-richard.henderson@linaro.org
7
There are 4 SBCon interfaces on the FPGA APB subsystem.
8
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20200617072539.32686-13-f4bug@amsat.org
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
9
---
14
hw/arm/mps2.c | 8 ++++++++
10
target/arm/helper.c | 21 +++++++++++++++------
15
hw/arm/Kconfig | 1 +
11
1 file changed, 15 insertions(+), 6 deletions(-)
16
2 files changed, 9 insertions(+)
17
12
18
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/mps2.c
15
--- a/target/arm/helper.c
21
+++ b/hw/arm/mps2.c
16
+++ b/target/arm/helper.c
22
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ static void define_debug_regs(ARMCPU *cpu)
23
#include "hw/misc/mps2-scc.h"
18
*/
24
#include "hw/misc/mps2-fpgaio.h"
19
int i;
25
#include "hw/ssi/pl022.h"
20
int wrps, brps, ctx_cmps;
26
+#include "hw/i2c/arm_sbcon_i2c.h"
21
- ARMCPRegInfo dbgdidr = {
27
#include "hw/net/lan9118.h"
22
- .name = "DBGDIDR", .cp = 14, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 0,
28
#include "net/net.h"
23
- .access = PL0_R, .accessfn = access_tda,
29
#include "hw/watchdog/cmsdk-apb-watchdog.h"
24
- .type = ARM_CP_CONST, .resetvalue = cpu->isar.dbgdidr,
30
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
25
- };
31
qdev_get_gpio_in(orgate_dev, j));
26
+
32
}
27
+ /*
33
}
28
+ * The Arm ARM says DBGDIDR is optional and deprecated if EL1 cannot
34
+ for (i = 0; i < 4; i++) {
29
+ * use AArch32. Given that bit 15 is RES1, if the value is 0 then
35
+ static const hwaddr i2cbase[] = {0x40022000, /* Touch */
30
+ * the register must not exist for this cpu.
36
+ 0x40023000, /* Audio */
31
+ */
37
+ 0x40029000, /* Shield0 */
32
+ if (cpu->isar.dbgdidr != 0) {
38
+ 0x4002a000}; /* Shield1 */
33
+ ARMCPRegInfo dbgdidr = {
39
+ sysbus_create_simple(TYPE_ARM_SBCON_I2C, i2cbase[i], NULL);
34
+ .name = "DBGDIDR", .cp = 14, .crn = 0, .crm = 0,
35
+ .opc1 = 0, .opc2 = 0,
36
+ .access = PL0_R, .accessfn = access_tda,
37
+ .type = ARM_CP_CONST, .resetvalue = cpu->isar.dbgdidr,
38
+ };
39
+ define_one_arm_cp_reg(cpu, &dbgdidr);
40
+ }
40
+ }
41
41
42
/* In hardware this is a LAN9220; the LAN9118 is software compatible
42
/* Note that all these register fields hold "number of Xs minus 1". */
43
* except that it doesn't support the checksum-offload feature.
43
brps = arm_num_brps(cpu);
44
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
44
@@ -XXX,XX +XXX,XX @@ static void define_debug_regs(ARMCPU *cpu)
45
index XXXXXXX..XXXXXXX 100644
45
46
--- a/hw/arm/Kconfig
46
assert(ctx_cmps <= brps);
47
+++ b/hw/arm/Kconfig
47
48
@@ -XXX,XX +XXX,XX @@ config MPS2
48
- define_one_arm_cp_reg(cpu, &dbgdidr);
49
select SPLIT_IRQ
49
define_arm_cp_regs(cpu, debug_cp_reginfo);
50
select UNIMP
50
51
select CMSDK_APB_WATCHDOG
51
if (arm_feature(&cpu->env, ARM_FEATURE_LPAE)) {
52
+ select VERSATILE_I2C
53
54
config FSL_IMX7
55
bool
56
--
52
--
57
2.20.1
53
2.20.1
58
54
59
55
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Paolo Bonzini <pbonzini@redhat.com>
2
2
3
Use self-explicit definitions instead of magic values.
3
The properties to attach a CANBUS object to the xlnx-zcu102 machine have
4
a period in them. We want to use periods in properties for compound QAPI types,
5
and besides the "xlnx-zcu102." prefix is both unnecessary and different
6
from any other machine property name. Remove it.
4
7
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
6
Message-id: 20200617072539.32686-4-f4bug@amsat.org
9
Message-id: 20210118162537.779542-1-pbonzini@redhat.com
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Vikram Garhwal <fnu.vikram@xilinx.com>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
12
---
10
hw/i2c/versatile_i2c.c | 7 +++++--
13
hw/arm/xlnx-zcu102.c | 4 ++--
11
1 file changed, 5 insertions(+), 2 deletions(-)
14
tests/qtest/xlnx-can-test.c | 30 +++++++++++++++---------------
15
2 files changed, 17 insertions(+), 17 deletions(-)
12
16
13
diff --git a/hw/i2c/versatile_i2c.c b/hw/i2c/versatile_i2c.c
17
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/i2c/versatile_i2c.c
19
--- a/hw/arm/xlnx-zcu102.c
16
+++ b/hw/i2c/versatile_i2c.c
20
+++ b/hw/arm/xlnx-zcu102.c
17
@@ -XXX,XX +XXX,XX @@ REG32(CONTROL_GET, 0)
21
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_instance_init(Object *obj)
18
REG32(CONTROL_SET, 0)
22
s->secure = false;
19
REG32(CONTROL_CLR, 4)
23
/* Default to virt (EL2) being disabled */
20
24
s->virt = false;
21
+#define SCL BIT(0)
25
- object_property_add_link(obj, "xlnx-zcu102.canbus0", TYPE_CAN_BUS,
22
+#define SDA BIT(1)
26
+ object_property_add_link(obj, "canbus0", TYPE_CAN_BUS,
23
+
27
(Object **)&s->canbus[0],
24
static uint64_t versatile_i2c_read(void *opaque, hwaddr offset,
28
object_property_allow_set_link,
25
unsigned size)
29
0);
26
{
30
27
@@ -XXX,XX +XXX,XX @@ static void versatile_i2c_write(void *opaque, hwaddr offset,
31
- object_property_add_link(obj, "xlnx-zcu102.canbus1", TYPE_CAN_BUS,
28
qemu_log_mask(LOG_GUEST_ERROR,
32
+ object_property_add_link(obj, "canbus1", TYPE_CAN_BUS,
29
"%s: Bad offset 0x%x\n", __func__, (int)offset);
33
(Object **)&s->canbus[1],
30
}
34
object_property_allow_set_link,
31
- bitbang_i2c_set(&s->bitbang, BITBANG_I2C_SCL, (s->out & 1) != 0);
35
0);
32
- s->in = bitbang_i2c_set(&s->bitbang, BITBANG_I2C_SDA, (s->out & 2) != 0);
36
diff --git a/tests/qtest/xlnx-can-test.c b/tests/qtest/xlnx-can-test.c
33
+ bitbang_i2c_set(&s->bitbang, BITBANG_I2C_SCL, (s->out & SCL) != 0);
37
index XXXXXXX..XXXXXXX 100644
34
+ s->in = bitbang_i2c_set(&s->bitbang, BITBANG_I2C_SDA, (s->out & SDA) != 0);
38
--- a/tests/qtest/xlnx-can-test.c
35
}
39
+++ b/tests/qtest/xlnx-can-test.c
36
40
@@ -XXX,XX +XXX,XX @@ static void test_can_bus(void)
37
static const MemoryRegionOps versatile_i2c_ops = {
41
uint8_t can_timestamp = 1;
42
43
QTestState *qts = qtest_init("-machine xlnx-zcu102"
44
- " -object can-bus,id=canbus0"
45
- " -machine xlnx-zcu102.canbus0=canbus0"
46
- " -machine xlnx-zcu102.canbus1=canbus0"
47
+ " -object can-bus,id=canbus"
48
+ " -machine canbus0=canbus"
49
+ " -machine canbus1=canbus"
50
);
51
52
/* Configure the CAN0 and CAN1. */
53
@@ -XXX,XX +XXX,XX @@ static void test_can_loopback(void)
54
uint32_t status = 0;
55
56
QTestState *qts = qtest_init("-machine xlnx-zcu102"
57
- " -object can-bus,id=canbus0"
58
- " -machine xlnx-zcu102.canbus0=canbus0"
59
- " -machine xlnx-zcu102.canbus1=canbus0"
60
+ " -object can-bus,id=canbus"
61
+ " -machine canbus0=canbus"
62
+ " -machine canbus1=canbus"
63
);
64
65
/* Configure the CAN0 in loopback mode. */
66
@@ -XXX,XX +XXX,XX @@ static void test_can_filter(void)
67
uint8_t can_timestamp = 1;
68
69
QTestState *qts = qtest_init("-machine xlnx-zcu102"
70
- " -object can-bus,id=canbus0"
71
- " -machine xlnx-zcu102.canbus0=canbus0"
72
- " -machine xlnx-zcu102.canbus1=canbus0"
73
+ " -object can-bus,id=canbus"
74
+ " -machine canbus0=canbus"
75
+ " -machine canbus1=canbus"
76
);
77
78
/* Configure the CAN0 and CAN1. */
79
@@ -XXX,XX +XXX,XX @@ static void test_can_sleepmode(void)
80
uint8_t can_timestamp = 1;
81
82
QTestState *qts = qtest_init("-machine xlnx-zcu102"
83
- " -object can-bus,id=canbus0"
84
- " -machine xlnx-zcu102.canbus0=canbus0"
85
- " -machine xlnx-zcu102.canbus1=canbus0"
86
+ " -object can-bus,id=canbus"
87
+ " -machine canbus0=canbus"
88
+ " -machine canbus1=canbus"
89
);
90
91
/* Configure the CAN0. */
92
@@ -XXX,XX +XXX,XX @@ static void test_can_snoopmode(void)
93
uint8_t can_timestamp = 1;
94
95
QTestState *qts = qtest_init("-machine xlnx-zcu102"
96
- " -object can-bus,id=canbus0"
97
- " -machine xlnx-zcu102.canbus0=canbus0"
98
- " -machine xlnx-zcu102.canbus1=canbus0"
99
+ " -object can-bus,id=canbus"
100
+ " -machine canbus0=canbus"
101
+ " -machine canbus1=canbus"
102
);
103
104
/* Configure the CAN0. */
38
--
105
--
39
2.20.1
106
2.20.1
40
107
41
108
diff view generated by jsdifflib
1
From: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
1
From: Maxim Uvarov <maxim.uvarov@linaro.org>
2
2
3
This adds support for memory(pc-dimm) hot remove on arm/virt that
3
Implement gpio-pwr driver to allow reboot and poweroff machine.
4
uses acpi ged device.
4
This is simple driver with just 2 gpios lines. Current use case
5
is to reboot and poweroff virt machine in secure mode. Secure
6
pl066 gpio chip is needed for that.
5
7
6
NVDIMM hot removal is not yet supported.
8
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
7
9
Reviewed-by: Hao Wu <wuhaotsh@google.com>
8
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20200622124157.20360-1-shameerali.kolothum.thodi@huawei.com
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
11
Tested-by: Eric Auger <eric.auger@redhat.com>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
12
---
14
hw/acpi/generic_event_device.c | 29 ++++++++++++++++
13
hw/gpio/gpio_pwr.c | 70 +++++++++++++++++++++++++++++++++++++++++++++
15
hw/arm/virt.c | 62 ++++++++++++++++++++++++++++++++--
14
hw/gpio/Kconfig | 3 ++
16
2 files changed, 89 insertions(+), 2 deletions(-)
15
hw/gpio/meson.build | 1 +
16
3 files changed, 74 insertions(+)
17
create mode 100644 hw/gpio/gpio_pwr.c
17
18
18
diff --git a/hw/acpi/generic_event_device.c b/hw/acpi/generic_event_device.c
19
diff --git a/hw/gpio/gpio_pwr.c b/hw/gpio/gpio_pwr.c
19
index XXXXXXX..XXXXXXX 100644
20
new file mode 100644
20
--- a/hw/acpi/generic_event_device.c
21
index XXXXXXX..XXXXXXX
21
+++ b/hw/acpi/generic_event_device.c
22
--- /dev/null
22
@@ -XXX,XX +XXX,XX @@ static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev,
23
+++ b/hw/gpio/gpio_pwr.c
23
}
24
@@ -XXX,XX +XXX,XX @@
24
}
25
+/*
25
26
+ * GPIO qemu power controller
26
+static void acpi_ged_unplug_request_cb(HotplugHandler *hotplug_dev,
27
+ *
27
+ DeviceState *dev, Error **errp)
28
+ * Copyright (c) 2020 Linaro Limited
29
+ *
30
+ * Author: Maxim Uvarov <maxim.uvarov@linaro.org>
31
+ *
32
+ * Virtual gpio driver which can be used on top of pl061
33
+ * to reboot and shutdown qemu virtual machine. One of use
34
+ * case is gpio driver for secure world application (ARM
35
+ * Trusted Firmware.).
36
+ *
37
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
38
+ * See the COPYING file in the top-level directory.
39
+ * SPDX-License-Identifier: GPL-2.0-or-later
40
+ */
41
+
42
+/*
43
+ * QEMU interface:
44
+ * two named input GPIO lines:
45
+ * 'reset' : when asserted, trigger system reset
46
+ * 'shutdown' : when asserted, trigger system shutdown
47
+ */
48
+
49
+#include "qemu/osdep.h"
50
+#include "hw/sysbus.h"
51
+#include "sysemu/runstate.h"
52
+
53
+#define TYPE_GPIOPWR "gpio-pwr"
54
+OBJECT_DECLARE_SIMPLE_TYPE(GPIO_PWR_State, GPIOPWR)
55
+
56
+struct GPIO_PWR_State {
57
+ SysBusDevice parent_obj;
58
+};
59
+
60
+static void gpio_pwr_reset(void *opaque, int n, int level)
28
+{
61
+{
29
+ AcpiGedState *s = ACPI_GED(hotplug_dev);
62
+ if (level) {
30
+
63
+ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
31
+ if ((object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) &&
32
+ !(object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)))) {
33
+ acpi_memory_unplug_request_cb(hotplug_dev, &s->memhp_state, dev, errp);
34
+ } else {
35
+ error_setg(errp, "acpi: device unplug request for unsupported device"
36
+ " type: %s", object_get_typename(OBJECT(dev)));
37
+ }
64
+ }
38
+}
65
+}
39
+
66
+
40
+static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev,
67
+static void gpio_pwr_shutdown(void *opaque, int n, int level)
41
+ DeviceState *dev, Error **errp)
42
+{
68
+{
43
+ AcpiGedState *s = ACPI_GED(hotplug_dev);
69
+ if (level) {
44
+
70
+ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
45
+ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
46
+ acpi_memory_unplug_cb(&s->memhp_state, dev, errp);
47
+ } else {
48
+ error_setg(errp, "acpi: device unplug for unsupported device"
49
+ " type: %s", object_get_typename(OBJECT(dev)));
50
+ }
71
+ }
51
+}
72
+}
52
+
73
+
53
static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
74
+static void gpio_pwr_init(Object *obj)
54
{
55
AcpiGedState *s = ACPI_GED(adev);
56
@@ -XXX,XX +XXX,XX @@ static void acpi_ged_class_init(ObjectClass *class, void *data)
57
dc->vmsd = &vmstate_acpi_ged;
58
59
hc->plug = acpi_ged_device_plug_cb;
60
+ hc->unplug_request = acpi_ged_unplug_request_cb;
61
+ hc->unplug = acpi_ged_unplug_cb;
62
63
adevc->send_event = acpi_ged_send_event;
64
}
65
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/hw/arm/virt.c
68
+++ b/hw/arm/virt.c
69
@@ -XXX,XX +XXX,XX @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
70
}
71
}
72
73
+static void virt_dimm_unplug_request(HotplugHandler *hotplug_dev,
74
+ DeviceState *dev, Error **errp)
75
+{
75
+{
76
+ VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
76
+ DeviceState *dev = DEVICE(obj);
77
+ Error *local_err = NULL;
78
+
77
+
79
+ if (!vms->acpi_dev) {
78
+ qdev_init_gpio_in_named(dev, gpio_pwr_reset, "reset", 1);
80
+ error_setg(&local_err,
79
+ qdev_init_gpio_in_named(dev, gpio_pwr_shutdown, "shutdown", 1);
81
+ "memory hotplug is not enabled: missing acpi-ged device");
82
+ goto out;
83
+ }
84
+
85
+ if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
86
+ error_setg(&local_err,
87
+ "nvdimm device hot unplug is not supported yet.");
88
+ goto out;
89
+ }
90
+
91
+ hotplug_handler_unplug_request(HOTPLUG_HANDLER(vms->acpi_dev), dev,
92
+ &local_err);
93
+out:
94
+ error_propagate(errp, local_err);
95
+}
80
+}
96
+
81
+
97
+static void virt_dimm_unplug(HotplugHandler *hotplug_dev,
82
+static const TypeInfo gpio_pwr_info = {
98
+ DeviceState *dev, Error **errp)
83
+ .name = TYPE_GPIOPWR,
84
+ .parent = TYPE_SYS_BUS_DEVICE,
85
+ .instance_size = sizeof(GPIO_PWR_State),
86
+ .instance_init = gpio_pwr_init,
87
+};
88
+
89
+static void gpio_pwr_register_types(void)
99
+{
90
+{
100
+ VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
91
+ type_register_static(&gpio_pwr_info);
101
+ Error *local_err = NULL;
102
+
103
+ hotplug_handler_unplug(HOTPLUG_HANDLER(vms->acpi_dev), dev, &local_err);
104
+ if (local_err) {
105
+ goto out;
106
+ }
107
+
108
+ pc_dimm_unplug(PC_DIMM(dev), MACHINE(vms));
109
+ qdev_unrealize(dev);
110
+
111
+out:
112
+ error_propagate(errp, local_err);
113
+}
92
+}
114
+
93
+
115
static void virt_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
94
+type_init(gpio_pwr_register_types)
116
DeviceState *dev, Error **errp)
95
diff --git a/hw/gpio/Kconfig b/hw/gpio/Kconfig
117
{
96
index XXXXXXX..XXXXXXX 100644
118
- error_setg(errp, "device unplug request for unsupported device"
97
--- a/hw/gpio/Kconfig
119
- " type: %s", object_get_typename(OBJECT(dev)));
98
+++ b/hw/gpio/Kconfig
120
+ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
99
@@ -XXX,XX +XXX,XX @@ config PL061
121
+ virt_dimm_unplug_request(hotplug_dev, dev, errp);
100
config GPIO_KEY
122
+ } else {
101
bool
123
+ error_setg(errp, "device unplug request for unsupported device"
102
124
+ " type: %s", object_get_typename(OBJECT(dev)));
103
+config GPIO_PWR
125
+ }
104
+ bool
126
+}
127
+
105
+
128
+static void virt_machine_device_unplug_cb(HotplugHandler *hotplug_dev,
106
config SIFIVE_GPIO
129
+ DeviceState *dev, Error **errp)
107
bool
130
+{
108
diff --git a/hw/gpio/meson.build b/hw/gpio/meson.build
131
+ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
109
index XXXXXXX..XXXXXXX 100644
132
+ virt_dimm_unplug(hotplug_dev, dev, errp);
110
--- a/hw/gpio/meson.build
133
+ } else {
111
+++ b/hw/gpio/meson.build
134
+ error_setg(errp, "virt: device unplug for unsupported device"
112
@@ -XXX,XX +XXX,XX @@
135
+ " type: %s", object_get_typename(OBJECT(dev)));
113
softmmu_ss.add(when: 'CONFIG_E500', if_true: files('mpc8xxx.c'))
136
+ }
114
softmmu_ss.add(when: 'CONFIG_GPIO_KEY', if_true: files('gpio_key.c'))
137
}
115
+softmmu_ss.add(when: 'CONFIG_GPIO_PWR', if_true: files('gpio_pwr.c'))
138
116
softmmu_ss.add(when: 'CONFIG_MAX7310', if_true: files('max7310.c'))
139
static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
117
softmmu_ss.add(when: 'CONFIG_PL061', if_true: files('pl061.c'))
140
@@ -XXX,XX +XXX,XX @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
118
softmmu_ss.add(when: 'CONFIG_PUV3', if_true: files('puv3_gpio.c'))
141
hc->pre_plug = virt_machine_device_pre_plug_cb;
142
hc->plug = virt_machine_device_plug_cb;
143
hc->unplug_request = virt_machine_device_unplug_request_cb;
144
+ hc->unplug = virt_machine_device_unplug_cb;
145
mc->numa_mem_supported = true;
146
mc->nvdimm_supported = true;
147
mc->auto_enable_numa_with_memhp = true;
148
--
119
--
149
2.20.1
120
2.20.1
150
121
151
122
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Maxim Uvarov <maxim.uvarov@linaro.org>
2
2
3
Cc: Cornelia Huck <cohuck@redhat.com>
3
No functional change. Just refactor code to better
4
Signed-off-by: Andrew Jones <drjones@redhat.com>
4
support secure and normal world gpios.
5
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
5
6
Message-id: 20200616140803.25515-1-drjones@redhat.com
6
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
7
Reviewed-by: Andrew Jones <drjones@redhat.com>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
---
9
hw/arm/virt.c | 1 +
10
hw/arm/virt.c | 57 ++++++++++++++++++++++++++++++++-------------------
10
1 file changed, 1 insertion(+)
11
1 file changed, 36 insertions(+), 21 deletions(-)
11
12
12
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
13
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
13
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/virt.c
15
--- a/hw/arm/virt.c
15
+++ b/hw/arm/virt.c
16
+++ b/hw/arm/virt.c
16
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(5, 1)
17
@@ -XXX,XX +XXX,XX @@ static void virt_powerdown_req(Notifier *n, void *opaque)
17
static void virt_machine_5_0_options(MachineClass *mc)
18
}
19
}
20
21
-static void create_gpio(const VirtMachineState *vms)
22
+static void create_gpio_keys(const VirtMachineState *vms,
23
+ DeviceState *pl061_dev,
24
+ uint32_t phandle)
25
+{
26
+ gpio_key_dev = sysbus_create_simple("gpio-key", -1,
27
+ qdev_get_gpio_in(pl061_dev, 3));
28
+
29
+ qemu_fdt_add_subnode(vms->fdt, "/gpio-keys");
30
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-keys", "compatible", "gpio-keys");
31
+ qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#size-cells", 0);
32
+ qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#address-cells", 1);
33
+
34
+ qemu_fdt_add_subnode(vms->fdt, "/gpio-keys/poweroff");
35
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-keys/poweroff",
36
+ "label", "GPIO Key Poweroff");
37
+ qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys/poweroff", "linux,code",
38
+ KEY_POWER);
39
+ qemu_fdt_setprop_cells(vms->fdt, "/gpio-keys/poweroff",
40
+ "gpios", phandle, 3, 0);
41
+}
42
+
43
+static void create_gpio_devices(const VirtMachineState *vms, int gpio,
44
+ MemoryRegion *mem)
18
{
45
{
19
virt_machine_5_1_options(mc);
46
char *nodename;
20
+ compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
47
DeviceState *pl061_dev;
48
- hwaddr base = vms->memmap[VIRT_GPIO].base;
49
- hwaddr size = vms->memmap[VIRT_GPIO].size;
50
- int irq = vms->irqmap[VIRT_GPIO];
51
+ hwaddr base = vms->memmap[gpio].base;
52
+ hwaddr size = vms->memmap[gpio].size;
53
+ int irq = vms->irqmap[gpio];
54
const char compat[] = "arm,pl061\0arm,primecell";
55
+ SysBusDevice *s;
56
57
- pl061_dev = sysbus_create_simple("pl061", base,
58
- qdev_get_gpio_in(vms->gic, irq));
59
+ pl061_dev = qdev_new("pl061");
60
+ s = SYS_BUS_DEVICE(pl061_dev);
61
+ sysbus_realize_and_unref(s, &error_fatal);
62
+ memory_region_add_subregion(mem, base, sysbus_mmio_get_region(s, 0));
63
+ sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->gic, irq));
64
65
uint32_t phandle = qemu_fdt_alloc_phandle(vms->fdt);
66
nodename = g_strdup_printf("/pl061@%" PRIx64, base);
67
@@ -XXX,XX +XXX,XX @@ static void create_gpio(const VirtMachineState *vms)
68
qemu_fdt_setprop_string(vms->fdt, nodename, "clock-names", "apb_pclk");
69
qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", phandle);
70
71
- gpio_key_dev = sysbus_create_simple("gpio-key", -1,
72
- qdev_get_gpio_in(pl061_dev, 3));
73
- qemu_fdt_add_subnode(vms->fdt, "/gpio-keys");
74
- qemu_fdt_setprop_string(vms->fdt, "/gpio-keys", "compatible", "gpio-keys");
75
- qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#size-cells", 0);
76
- qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys", "#address-cells", 1);
77
-
78
- qemu_fdt_add_subnode(vms->fdt, "/gpio-keys/poweroff");
79
- qemu_fdt_setprop_string(vms->fdt, "/gpio-keys/poweroff",
80
- "label", "GPIO Key Poweroff");
81
- qemu_fdt_setprop_cell(vms->fdt, "/gpio-keys/poweroff", "linux,code",
82
- KEY_POWER);
83
- qemu_fdt_setprop_cells(vms->fdt, "/gpio-keys/poweroff",
84
- "gpios", phandle, 3, 0);
85
g_free(nodename);
86
+
87
+ /* Child gpio devices */
88
+ create_gpio_keys(vms, pl061_dev, phandle);
21
}
89
}
22
DEFINE_VIRT_MACHINE(5, 0)
90
23
91
static void create_virtio_devices(const VirtMachineState *vms)
92
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
93
if (has_ged && aarch64 && firmware_loaded && virt_is_acpi_enabled(vms)) {
94
vms->acpi_dev = create_acpi_ged(vms);
95
} else {
96
- create_gpio(vms);
97
+ create_gpio_devices(vms, VIRT_GPIO, sysmem);
98
}
99
100
/* connect powerdown request */
24
--
101
--
25
2.20.1
102
2.20.1
26
103
27
104
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Maxim Uvarov <maxim.uvarov@linaro.org>
2
2
3
From 'Application Note AN385', chapter 3.9, SPI:
3
Add secure pl061 for reset/power down machine from
4
the secure world (Arm Trusted Firmware). Connect it
5
with gpio-pwr driver.
4
6
5
The SMM implements five PL022 SPI modules.
7
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
6
8
Reviewed-by: Andrew Jones <drjones@redhat.com>
7
Two pairs of modules share the same OR-gated IRQ.
9
[PMM: Added mention of the new device to the documentation]
8
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20200617072539.32686-12-f4bug@amsat.org
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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/mps2.c | 24 ++++++++++++++++++++++++
12
docs/system/arm/virt.rst | 2 ++
15
hw/arm/Kconfig | 6 +++---
13
include/hw/arm/virt.h | 2 ++
16
2 files changed, 27 insertions(+), 3 deletions(-)
14
hw/arm/virt.c | 56 +++++++++++++++++++++++++++++++++++++++-
15
hw/arm/Kconfig | 1 +
16
4 files changed, 60 insertions(+), 1 deletion(-)
17
17
18
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
18
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
19
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/arm/mps2.c
20
--- a/docs/system/arm/virt.rst
21
+++ b/hw/arm/mps2.c
21
+++ b/docs/system/arm/virt.rst
22
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ The virt board supports:
23
#include "hw/timer/cmsdk-apb-dualtimer.h"
23
- Secure-World-only devices if the CPU has TrustZone:
24
#include "hw/misc/mps2-scc.h"
24
25
#include "hw/misc/mps2-fpgaio.h"
25
- A second PL011 UART
26
+#include "hw/ssi/pl022.h"
26
+ - A second PL061 GPIO controller, with GPIO lines for triggering
27
#include "hw/net/lan9118.h"
27
+ a system reset or system poweroff
28
#include "net/net.h"
28
- A secure flash memory
29
#include "hw/watchdog/cmsdk-apb-watchdog.h"
29
- 16MB of secure RAM
30
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
30
31
qdev_prop_set_uint32(DEVICE(&mms->fpgaio), "prescale-clk", 25000000);
31
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
32
sysbus_realize(SYS_BUS_DEVICE(&mms->fpgaio), &error_fatal);
32
index XXXXXXX..XXXXXXX 100644
33
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->fpgaio), 0, 0x40028000);
33
--- a/include/hw/arm/virt.h
34
+ sysbus_create_simple(TYPE_PL022, 0x40025000, /* External ADC */
34
+++ b/include/hw/arm/virt.h
35
+ qdev_get_gpio_in(armv7m, 22));
35
@@ -XXX,XX +XXX,XX @@ enum {
36
+ for (i = 0; i < 2; i++) {
36
VIRT_GPIO,
37
+ static const int spi_irqno[] = {11, 24};
37
VIRT_SECURE_UART,
38
+ static const hwaddr spibase[] = {0x40020000, /* APB */
38
VIRT_SECURE_MEM,
39
+ 0x40021000, /* LCD */
39
+ VIRT_SECURE_GPIO,
40
+ 0x40026000, /* Shield0 */
40
VIRT_PCDIMM_ACPI,
41
+ 0x40027000}; /* Shield1 */
41
VIRT_ACPI_GED,
42
+ DeviceState *orgate_dev;
42
VIRT_NVDIMM_ACPI,
43
+ Object *orgate;
43
@@ -XXX,XX +XXX,XX @@ struct VirtMachineClass {
44
+ int j;
44
bool kvm_no_adjvtime;
45
bool no_kvm_steal_time;
46
bool acpi_expose_flash;
47
+ bool no_secure_gpio;
48
};
49
50
struct VirtMachineState {
51
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/arm/virt.c
54
+++ b/hw/arm/virt.c
55
@@ -XXX,XX +XXX,XX @@ static const MemMapEntry base_memmap[] = {
56
[VIRT_ACPI_GED] = { 0x09080000, ACPI_GED_EVT_SEL_LEN },
57
[VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
58
[VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
59
+ [VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
60
[VIRT_MMIO] = { 0x0a000000, 0x00000200 },
61
/* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
62
[VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
63
@@ -XXX,XX +XXX,XX @@ static void create_gpio_keys(const VirtMachineState *vms,
64
"gpios", phandle, 3, 0);
65
}
66
67
+#define SECURE_GPIO_POWEROFF 0
68
+#define SECURE_GPIO_RESET 1
45
+
69
+
46
+ orgate = object_new(TYPE_OR_IRQ);
70
+static void create_secure_gpio_pwr(const VirtMachineState *vms,
47
+ object_property_set_int(orgate, 2, "num-lines", &error_fatal);
71
+ DeviceState *pl061_dev,
48
+ orgate_dev = DEVICE(orgate);
72
+ uint32_t phandle)
49
+ qdev_realize(orgate_dev, NULL, &error_fatal);
73
+{
50
+ qdev_connect_gpio_out(orgate_dev, 0,
74
+ DeviceState *gpio_pwr_dev;
51
+ qdev_get_gpio_in(armv7m, spi_irqno[i]));
75
+
52
+ for (j = 0; j < 2; j++) {
76
+ /* gpio-pwr */
53
+ sysbus_create_simple(TYPE_PL022, spibase[2 * i + j],
77
+ gpio_pwr_dev = sysbus_create_simple("gpio-pwr", -1, NULL);
54
+ qdev_get_gpio_in(orgate_dev, j));
78
+
55
+ }
79
+ /* connect secure pl061 to gpio-pwr */
80
+ qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_RESET,
81
+ qdev_get_gpio_in_named(gpio_pwr_dev, "reset", 0));
82
+ qdev_connect_gpio_out(pl061_dev, SECURE_GPIO_POWEROFF,
83
+ qdev_get_gpio_in_named(gpio_pwr_dev, "shutdown", 0));
84
+
85
+ qemu_fdt_add_subnode(vms->fdt, "/gpio-poweroff");
86
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "compatible",
87
+ "gpio-poweroff");
88
+ qemu_fdt_setprop_cells(vms->fdt, "/gpio-poweroff",
89
+ "gpios", phandle, SECURE_GPIO_POWEROFF, 0);
90
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "status", "disabled");
91
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-poweroff", "secure-status",
92
+ "okay");
93
+
94
+ qemu_fdt_add_subnode(vms->fdt, "/gpio-restart");
95
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "compatible",
96
+ "gpio-restart");
97
+ qemu_fdt_setprop_cells(vms->fdt, "/gpio-restart",
98
+ "gpios", phandle, SECURE_GPIO_RESET, 0);
99
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "status", "disabled");
100
+ qemu_fdt_setprop_string(vms->fdt, "/gpio-restart", "secure-status",
101
+ "okay");
102
+}
103
+
104
static void create_gpio_devices(const VirtMachineState *vms, int gpio,
105
MemoryRegion *mem)
106
{
107
@@ -XXX,XX +XXX,XX @@ static void create_gpio_devices(const VirtMachineState *vms, int gpio,
108
qemu_fdt_setprop_string(vms->fdt, nodename, "clock-names", "apb_pclk");
109
qemu_fdt_setprop_cell(vms->fdt, nodename, "phandle", phandle);
110
111
+ if (gpio != VIRT_GPIO) {
112
+ /* Mark as not usable by the normal world */
113
+ qemu_fdt_setprop_string(vms->fdt, nodename, "status", "disabled");
114
+ qemu_fdt_setprop_string(vms->fdt, nodename, "secure-status", "okay");
56
+ }
115
+ }
57
116
g_free(nodename);
58
/* In hardware this is a LAN9220; the LAN9118 is software compatible
117
59
* except that it doesn't support the checksum-offload feature.
118
/* Child gpio devices */
119
- create_gpio_keys(vms, pl061_dev, phandle);
120
+ if (gpio == VIRT_GPIO) {
121
+ create_gpio_keys(vms, pl061_dev, phandle);
122
+ } else {
123
+ create_secure_gpio_pwr(vms, pl061_dev, phandle);
124
+ }
125
}
126
127
static void create_virtio_devices(const VirtMachineState *vms)
128
@@ -XXX,XX +XXX,XX @@ static void machvirt_init(MachineState *machine)
129
create_gpio_devices(vms, VIRT_GPIO, sysmem);
130
}
131
132
+ if (vms->secure && !vmc->no_secure_gpio) {
133
+ create_gpio_devices(vms, VIRT_SECURE_GPIO, secure_sysmem);
134
+ }
135
+
136
/* connect powerdown request */
137
vms->powerdown_notifier.notify = virt_powerdown_req;
138
qemu_register_powerdown_notifier(&vms->powerdown_notifier);
139
@@ -XXX,XX +XXX,XX @@ DEFINE_VIRT_MACHINE_AS_LATEST(6, 0)
140
141
static void virt_machine_5_2_options(MachineClass *mc)
142
{
143
+ VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
144
+
145
virt_machine_6_0_options(mc);
146
compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
147
+ vmc->no_secure_gpio = true;
148
}
149
DEFINE_VIRT_MACHINE(5, 2)
150
60
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
151
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
61
index XXXXXXX..XXXXXXX 100644
152
index XXXXXXX..XXXXXXX 100644
62
--- a/hw/arm/Kconfig
153
--- a/hw/arm/Kconfig
63
+++ b/hw/arm/Kconfig
154
+++ b/hw/arm/Kconfig
64
@@ -XXX,XX +XXX,XX @@ config HIGHBANK
155
@@ -XXX,XX +XXX,XX @@ config ARM_VIRT
65
select ARM_TIMER # sp804
66
select ARM_V7M
67
select PL011 # UART
156
select PL011 # UART
68
- select PL022 # Serial port
69
+ select PL022 # SPI
70
select PL031 # RTC
157
select PL031 # RTC
71
select PL061 # GPIO
158
select PL061 # GPIO
72
select PL310 # cache controller
159
+ select GPIO_PWR
73
@@ -XXX,XX +XXX,XX @@ config STELLARIS
160
select PLATFORM_BUS
74
select CMSDK_APB_WATCHDOG
161
select SMBIOS
75
select I2C
162
select VIRTIO_MMIO
76
select PL011 # UART
77
- select PL022 # Serial port
78
+ select PL022 # SPI
79
select PL061 # GPIO
80
select SSD0303 # OLED display
81
select SSD0323 # OLED display
82
@@ -XXX,XX +XXX,XX @@ config MPS2
83
select MPS2_FPGAIO
84
select MPS2_SCC
85
select OR_IRQ
86
- select PL022 # Serial port
87
+ select PL022 # SPI
88
select PL080 # DMA controller
89
select SPLIT_IRQ
90
select UNIMP
91
--
163
--
92
2.20.1
164
2.20.1
93
165
94
166
diff view generated by jsdifflib
1
From: Andrew Jones <drjones@redhat.com>
1
From: Hao Wu <wuhaotsh@google.com>
2
2
3
Some cpu features may be enabled and disabled for all configurations
3
Fix potential overflow problem when calculating pwm_duty.
4
that support the feature. Let's test that.
4
1. Ensure p->cmr and p->cnr to be from [0,65535], according to the
5
hardware specification.
6
2. Changed duty to uint32_t. However, since MAX_DUTY * (p->cmr+1)
7
can excceed UINT32_MAX, we convert them to uint64_t in computation
8
and converted them back to uint32_t.
9
(duty is guaranteed to be <= MAX_DUTY so it won't overflow.)
5
10
6
A recent regression[*] inspired adding these tests.
11
Fixes: CID 1442342
7
12
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
8
[*] '-cpu host,pmu=on' caused a segfault
13
Reviewed-by: Doug Evans <dje@google.com>
9
14
Signed-off-by: Hao Wu <wuhaotsh@google.com>
10
Signed-off-by: Andrew Jones <drjones@redhat.com>
15
Message-id: 20210127011142.2122790-1-wuhaotsh@google.com
11
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20200623090622.30365-2-philmd@redhat.com
13
Message-Id: <20200623082310.17577-1-drjones@redhat.com>
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
18
---
17
tests/qtest/arm-cpu-features.c | 38 ++++++++++++++++++++++++++++++----
19
hw/misc/npcm7xx_pwm.c | 23 +++++++++++++++++++----
18
1 file changed, 34 insertions(+), 4 deletions(-)
20
tests/qtest/npcm7xx_pwm-test.c | 4 ++--
21
2 files changed, 21 insertions(+), 6 deletions(-)
19
22
20
diff --git a/tests/qtest/arm-cpu-features.c b/tests/qtest/arm-cpu-features.c
23
diff --git a/hw/misc/npcm7xx_pwm.c b/hw/misc/npcm7xx_pwm.c
21
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
22
--- a/tests/qtest/arm-cpu-features.c
25
--- a/hw/misc/npcm7xx_pwm.c
23
+++ b/tests/qtest/arm-cpu-features.c
26
+++ b/hw/misc/npcm7xx_pwm.c
24
@@ -XXX,XX +XXX,XX @@ static bool resp_get_feature(QDict *resp, const char *feature)
27
@@ -XXX,XX +XXX,XX @@ REG32(NPCM7XX_PWM_PWDR3, 0x50);
25
qobject_unref(_resp); \
28
#define NPCM7XX_CH_INV BIT(2)
26
})
29
#define NPCM7XX_CH_MOD BIT(3)
27
30
28
-#define assert_feature(qts, cpu_type, feature, expected_value) \
31
+#define NPCM7XX_MAX_CMR 65535
29
+#define resp_assert_feature(resp, feature, expected_value) \
32
+#define NPCM7XX_MAX_CNR 65535
30
({ \
31
- QDict *_resp, *_props; \
32
+ QDict *_props; \
33
\
34
- _resp = do_query_no_props(qts, cpu_type); \
35
g_assert(_resp); \
36
g_assert(resp_has_props(_resp)); \
37
_props = resp_get_props(_resp); \
38
g_assert(qdict_get(_props, feature)); \
39
g_assert(qdict_get_bool(_props, feature) == (expected_value)); \
40
+})
41
+
33
+
42
+#define assert_feature(qts, cpu_type, feature, expected_value) \
34
/* Offset of each PWM channel's prescaler in the PPR register. */
43
+({ \
35
static const int npcm7xx_ppr_base[] = { 0, 0, 8, 8 };
44
+ QDict *_resp; \
36
/* Offset of each PWM channel's clock selector in the CSR register. */
45
+ \
37
@@ -XXX,XX +XXX,XX @@ static uint32_t npcm7xx_pwm_calculate_freq(NPCM7xxPWM *p)
46
+ _resp = do_query_no_props(qts, cpu_type); \
38
47
+ g_assert(_resp); \
39
static uint32_t npcm7xx_pwm_calculate_duty(NPCM7xxPWM *p)
48
+ resp_assert_feature(_resp, feature, expected_value); \
40
{
49
+ qobject_unref(_resp); \
41
- uint64_t duty;
50
+})
42
+ uint32_t duty;
51
+
43
52
+#define assert_set_feature(qts, cpu_type, feature, value) \
44
if (p->running) {
53
+({ \
45
if (p->cnr == 0) {
54
+ const char *_fmt = (value) ? "{ %s: true }" : "{ %s: false }"; \
46
@@ -XXX,XX +XXX,XX @@ static uint32_t npcm7xx_pwm_calculate_duty(NPCM7xxPWM *p)
55
+ QDict *_resp; \
47
} else if (p->cmr >= p->cnr) {
56
+ \
48
duty = NPCM7XX_PWM_MAX_DUTY;
57
+ _resp = do_query(qts, cpu_type, _fmt, feature); \
49
} else {
58
+ g_assert(_resp); \
50
- duty = NPCM7XX_PWM_MAX_DUTY * (p->cmr + 1) / (p->cnr + 1);
59
+ resp_assert_feature(_resp, feature, value); \
51
+ duty = (uint64_t)NPCM7XX_PWM_MAX_DUTY * (p->cmr + 1) / (p->cnr + 1);
60
qobject_unref(_resp); \
52
}
61
})
53
} else {
62
54
duty = 0;
63
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion(const void *data)
55
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_pwm_write(void *opaque, hwaddr offset,
64
assert_error(qts, "host", "The CPU type 'host' requires KVM", NULL);
56
case A_NPCM7XX_PWM_CNR2:
65
57
case A_NPCM7XX_PWM_CNR3:
66
/* Test expected feature presence/absence for some cpu types */
58
p = &s->pwm[npcm7xx_cnr_index(offset)];
67
- assert_has_feature_enabled(qts, "max", "pmu");
59
- p->cnr = value;
68
assert_has_feature_enabled(qts, "cortex-a15", "pmu");
60
+ if (value > NPCM7XX_MAX_CNR) {
69
assert_has_not_feature(qts, "cortex-a15", "aarch64");
61
+ qemu_log_mask(LOG_GUEST_ERROR,
70
62
+ "%s: invalid cnr value: %u", __func__, value);
71
+ /* Enabling and disabling pmu should always work. */
63
+ p->cnr = NPCM7XX_MAX_CNR;
72
+ assert_has_feature_enabled(qts, "max", "pmu");
64
+ } else {
73
+ assert_set_feature(qts, "max", "pmu", false);
65
+ p->cnr = value;
74
+ assert_set_feature(qts, "max", "pmu", true);
66
+ }
75
+
67
npcm7xx_pwm_update_output(p);
76
assert_has_not_feature(qts, "max", "kvm-no-adjvtime");
68
break;
77
69
78
if (g_str_equal(qtest_get_arch(), "aarch64")) {
70
@@ -XXX,XX +XXX,XX @@ static void npcm7xx_pwm_write(void *opaque, hwaddr offset,
79
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion_kvm(const void *data)
71
case A_NPCM7XX_PWM_CMR2:
80
return;
72
case A_NPCM7XX_PWM_CMR3:
73
p = &s->pwm[npcm7xx_cmr_index(offset)];
74
- p->cmr = value;
75
+ if (value > NPCM7XX_MAX_CMR) {
76
+ qemu_log_mask(LOG_GUEST_ERROR,
77
+ "%s: invalid cmr value: %u", __func__, value);
78
+ p->cmr = NPCM7XX_MAX_CMR;
79
+ } else {
80
+ p->cmr = value;
81
+ }
82
npcm7xx_pwm_update_output(p);
83
break;
84
85
diff --git a/tests/qtest/npcm7xx_pwm-test.c b/tests/qtest/npcm7xx_pwm-test.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/tests/qtest/npcm7xx_pwm-test.c
88
+++ b/tests/qtest/npcm7xx_pwm-test.c
89
@@ -XXX,XX +XXX,XX @@ static uint64_t pwm_compute_freq(QTestState *qts, uint32_t ppr, uint32_t csr,
90
91
static uint64_t pwm_compute_duty(uint32_t cnr, uint32_t cmr, bool inverted)
92
{
93
- uint64_t duty;
94
+ uint32_t duty;
95
96
if (cnr == 0) {
97
/* PWM is stopped. */
98
@@ -XXX,XX +XXX,XX @@ static uint64_t pwm_compute_duty(uint32_t cnr, uint32_t cmr, bool inverted)
99
} else if (cmr >= cnr) {
100
duty = MAX_DUTY;
101
} else {
102
- duty = MAX_DUTY * (cmr + 1) / (cnr + 1);
103
+ duty = (uint64_t)MAX_DUTY * (cmr + 1) / (cnr + 1);
81
}
104
}
82
105
83
+ /* Enabling and disabling kvm-no-adjvtime should always work. */
106
if (inverted) {
84
assert_has_feature_disabled(qts, "host", "kvm-no-adjvtime");
85
+ assert_set_feature(qts, "host", "kvm-no-adjvtime", true);
86
+ assert_set_feature(qts, "host", "kvm-no-adjvtime", false);
87
88
if (g_str_equal(qtest_get_arch(), "aarch64")) {
89
bool kvm_supports_sve;
90
@@ -XXX,XX +XXX,XX @@ static void test_query_cpu_model_expansion_kvm(const void *data)
91
char *error;
92
93
assert_has_feature_enabled(qts, "host", "aarch64");
94
+
95
+ /* Enabling and disabling pmu should always work. */
96
assert_has_feature_enabled(qts, "host", "pmu");
97
+ assert_set_feature(qts, "host", "pmu", false);
98
+ assert_set_feature(qts, "host", "pmu", true);
99
100
assert_error(qts, "cortex-a15",
101
"We cannot guarantee the CPU type 'cortex-a15' works "
102
--
107
--
103
2.20.1
108
2.20.1
104
109
105
110
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Use self-explicit definitions instead of magic values.
3
cpu_get_phys_page_debug() uses 'DATA LOAD' MMU access type.
4
4
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200617072539.32686-3-f4bug@amsat.org
6
Message-id: 20210127232822.3530782-1-f4bug@amsat.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
9
---
10
hw/i2c/versatile_i2c.c | 14 ++++++++++----
10
target/arm/helper.c | 2 +-
11
1 file changed, 10 insertions(+), 4 deletions(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
12
13
diff --git a/hw/i2c/versatile_i2c.c b/hw/i2c/versatile_i2c.c
13
diff --git a/target/arm/helper.c b/target/arm/helper.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/i2c/versatile_i2c.c
15
--- a/target/arm/helper.c
16
+++ b/hw/i2c/versatile_i2c.c
16
+++ b/target/arm/helper.c
17
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
18
#include "qemu/osdep.h"
18
19
#include "hw/sysbus.h"
19
*attrs = (MemTxAttrs) {};
20
#include "hw/i2c/bitbang_i2c.h"
20
21
+#include "hw/registerfields.h"
21
- ret = get_phys_addr(env, addr, 0, mmu_idx, &phys_addr,
22
#include "qemu/log.h"
22
+ ret = get_phys_addr(env, addr, MMU_DATA_LOAD, mmu_idx, &phys_addr,
23
#include "qemu/module.h"
23
attrs, &prot, &page_size, &fi, &cacheattrs);
24
24
25
@@ -XXX,XX +XXX,XX @@ typedef struct VersatileI2CState {
25
if (ret) {
26
int in;
27
} VersatileI2CState;
28
29
+REG32(CONTROL_GET, 0)
30
+REG32(CONTROL_SET, 0)
31
+REG32(CONTROL_CLR, 4)
32
+
33
static uint64_t versatile_i2c_read(void *opaque, hwaddr offset,
34
unsigned size)
35
{
36
VersatileI2CState *s = (VersatileI2CState *)opaque;
37
38
- if (offset == 0) {
39
+ switch (offset) {
40
+ case A_CONTROL_SET:
41
return (s->out & 1) | (s->in << 1);
42
- } else {
43
+ default:
44
qemu_log_mask(LOG_GUEST_ERROR,
45
"%s: Bad offset 0x%x\n", __func__, (int)offset);
46
return -1;
47
@@ -XXX,XX +XXX,XX @@ static void versatile_i2c_write(void *opaque, hwaddr offset,
48
VersatileI2CState *s = (VersatileI2CState *)opaque;
49
50
switch (offset) {
51
- case 0:
52
+ case A_CONTROL_SET:
53
s->out |= value & 3;
54
break;
55
- case 4:
56
+ case A_CONTROL_CLR:
57
s->out &= ~value;
58
break;
59
default:
60
--
26
--
61
2.20.1
27
2.20.1
62
28
63
29
diff view generated by jsdifflib
1
Convert the Neon VSWP insn to decodetree. Since the new implementation
1
Move the preadv availability check to meson.build. This is what we
2
doesn't have to share a pass-loop with the other 2-reg-misc operations
2
want to be doing for host-OS-feature-checks anyway, but it also fixes
3
we can implement the swap with 64-bit accesses rather than 32-bits
3
a problem with building for macOS with the most recent XCode SDK on a
4
(which brings us into line with the pseudocode and is more efficient).
4
Catalina host.
5
6
On that configuration, 'preadv()' is provided as a weak symbol, so
7
that programs can be built with optional support for it and make a
8
runtime availability check to see whether the preadv() they have is a
9
working one or one which they must not call because it will
10
runtime-assert. QEMU's configure test passes (unless you're building
11
with --enable-werror) because the test program using preadv()
12
compiles, but then QEMU crashes at runtime when preadv() is called,
13
with errors like:
14
15
dyld: lazy symbol binding failed: Symbol not found: _preadv
16
Referenced from: /Users/pm215/src/qemu/./build/x86/tests/test-replication
17
Expected in: /usr/lib/libSystem.B.dylib
18
19
dyld: Symbol not found: _preadv
20
Referenced from: /Users/pm215/src/qemu/./build/x86/tests/test-replication
21
Expected in: /usr/lib/libSystem.B.dylib
22
23
Meson's own function availability check has a special case for macOS
24
which adds '-Wl,-no_weak_imports' to the compiler flags, which forces
25
the test to require the real function, not the macOS-version-too-old
26
stub.
27
28
So this commit fixes the bug where macOS builds on Catalina currently
29
require --disable-werror.
5
30
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
32
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
8
Message-id: 20200616170844.13318-20-peter.maydell@linaro.org
33
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
34
Message-id: 20210126155846.17109-1-peter.maydell@linaro.org
9
---
35
---
10
target/arm/neon-dp.decode | 2 ++
36
configure | 16 ----------------
11
target/arm/translate-neon.inc.c | 41 +++++++++++++++++++++++++++++++++
37
meson.build | 4 +++-
12
target/arm/translate.c | 5 +---
38
2 files changed, 3 insertions(+), 17 deletions(-)
13
3 files changed, 44 insertions(+), 4 deletions(-)
14
39
15
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
40
diff --git a/configure b/configure
41
index XXXXXXX..XXXXXXX 100755
42
--- a/configure
43
+++ b/configure
44
@@ -XXX,XX +XXX,XX @@ if compile_prog "" "" ; then
45
iovec=yes
46
fi
47
48
-##########################################
49
-# preadv probe
50
-cat > $TMPC <<EOF
51
-#include <sys/types.h>
52
-#include <sys/uio.h>
53
-#include <unistd.h>
54
-int main(void) { return preadv(0, 0, 0, 0); }
55
-EOF
56
-preadv=no
57
-if compile_prog "" "" ; then
58
- preadv=yes
59
-fi
60
-
61
##########################################
62
# fdt probe
63
64
@@ -XXX,XX +XXX,XX @@ fi
65
if test "$iovec" = "yes" ; then
66
echo "CONFIG_IOVEC=y" >> $config_host_mak
67
fi
68
-if test "$preadv" = "yes" ; then
69
- echo "CONFIG_PREADV=y" >> $config_host_mak
70
-fi
71
if test "$membarrier" = "yes" ; then
72
echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
73
fi
74
diff --git a/meson.build b/meson.build
16
index XXXXXXX..XXXXXXX 100644
75
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/neon-dp.decode
76
--- a/meson.build
18
+++ b/target/arm/neon-dp.decode
77
+++ b/meson.build
19
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
78
@@ -XXX,XX +XXX,XX @@ config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
20
VABS_F 1111 001 11 . 11 .. 01 .... 0 1110 . . 0 .... @2misc
79
config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
21
VNEG_F 1111 001 11 . 11 .. 01 .... 0 1111 . . 0 .... @2misc
80
config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
22
81
23
+ VSWP 1111 001 11 . 11 .. 10 .... 0 0000 . . 0 .... @2misc
82
+config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
24
+
83
+
25
VUZP 1111 001 11 . 11 .. 10 .... 0 0010 . . 0 .... @2misc
84
ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
26
VZIP 1111 001 11 . 11 .. 10 .... 0 0011 . . 0 .... @2misc
85
arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
27
86
strings = ['HOST_DSOSUF', 'CONFIG_IASL']
28
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
87
@@ -XXX,XX +XXX,XX @@ summary_info += {'PIE': get_option('b_pie')}
29
index XXXXXXX..XXXXXXX 100644
88
summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
30
--- a/target/arm/translate-neon.inc.c
89
summary_info += {'malloc trim support': has_malloc_trim}
31
+++ b/target/arm/translate-neon.inc.c
90
summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
32
@@ -XXX,XX +XXX,XX @@ DO_VCVT(VCVTPU, FPROUNDING_POSINF, false)
91
-summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
33
DO_VCVT(VCVTPS, FPROUNDING_POSINF, true)
92
+summary_info += {'preadv support': config_host_data.get('CONFIG_PREADV')}
34
DO_VCVT(VCVTMU, FPROUNDING_NEGINF, false)
93
summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
35
DO_VCVT(VCVTMS, FPROUNDING_NEGINF, true)
94
summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
36
+
95
summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
37
+static bool trans_VSWP(DisasContext *s, arg_2misc *a)
38
+{
39
+ TCGv_i64 rm, rd;
40
+ int pass;
41
+
42
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
43
+ return false;
44
+ }
45
+
46
+ /* UNDEF accesses to D16-D31 if they don't exist. */
47
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
48
+ ((a->vd | a->vm) & 0x10)) {
49
+ return false;
50
+ }
51
+
52
+ if (a->size != 0) {
53
+ return false;
54
+ }
55
+
56
+ if ((a->vd | a->vm) & a->q) {
57
+ return false;
58
+ }
59
+
60
+ if (!vfp_access_check(s)) {
61
+ return true;
62
+ }
63
+
64
+ rm = tcg_temp_new_i64();
65
+ rd = tcg_temp_new_i64();
66
+ for (pass = 0; pass < (a->q ? 2 : 1); pass++) {
67
+ neon_load_reg64(rm, a->vm + pass);
68
+ neon_load_reg64(rd, a->vd + pass);
69
+ neon_store_reg64(rm, a->vd + pass);
70
+ neon_store_reg64(rd, a->vm + pass);
71
+ }
72
+ tcg_temp_free_i64(rm);
73
+ tcg_temp_free_i64(rd);
74
+
75
+ return true;
76
+}
77
diff --git a/target/arm/translate.c b/target/arm/translate.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/arm/translate.c
80
+++ b/target/arm/translate.c
81
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
82
case NEON_2RM_VCVTPS:
83
case NEON_2RM_VCVTMU:
84
case NEON_2RM_VCVTMS:
85
+ case NEON_2RM_VSWP:
86
/* handled by decodetree */
87
return 1;
88
case NEON_2RM_VTRN:
89
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
90
for (pass = 0; pass < (q ? 4 : 2); pass++) {
91
tmp = neon_load_reg(rm, pass);
92
switch (op) {
93
- case NEON_2RM_VSWP:
94
- tmp2 = neon_load_reg(rd, pass);
95
- neon_store_reg(rm, pass, tmp2);
96
- break;
97
case NEON_2RM_VTRN:
98
tmp2 = neon_load_reg(rd, pass);
99
switch (size) {
100
--
96
--
101
2.20.1
97
2.20.1
102
98
103
99
diff view generated by jsdifflib
New patch
1
From: Joelle van Dyne <j@getutm.app>
1
2
3
The iOS toolchain does not use the host prefix naming convention. So we
4
need to enable cross-compile options while allowing the PREFIX to be
5
blank.
6
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Signed-off-by: Joelle van Dyne <j@getutm.app>
9
Message-id: 20210126012457.39046-3-j@getutm.app
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
configure | 6 ++++--
13
1 file changed, 4 insertions(+), 2 deletions(-)
14
15
diff --git a/configure b/configure
16
index XXXXXXX..XXXXXXX 100755
17
--- a/configure
18
+++ b/configure
19
@@ -XXX,XX +XXX,XX @@ cpu=""
20
iasl="iasl"
21
interp_prefix="/usr/gnemul/qemu-%M"
22
static="no"
23
+cross_compile="no"
24
cross_prefix=""
25
audio_drv_list=""
26
block_drv_rw_whitelist=""
27
@@ -XXX,XX +XXX,XX @@ for opt do
28
optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
29
case "$opt" in
30
--cross-prefix=*) cross_prefix="$optarg"
31
+ cross_compile="yes"
32
;;
33
--cc=*) CC="$optarg"
34
;;
35
@@ -XXX,XX +XXX,XX @@ $(echo Deprecated targets: $deprecated_targets_list | \
36
--target-list-exclude=LIST exclude a set of targets from the default target-list
37
38
Advanced options (experts only):
39
- --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]
40
+ --cross-prefix=PREFIX use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
41
--cc=CC use C compiler CC [$cc]
42
--iasl=IASL use ACPI compiler IASL [$iasl]
43
--host-cc=CC use C compiler CC [$host_cc] for code run at
44
@@ -XXX,XX +XXX,XX @@ if has $sdl2_config; then
45
fi
46
echo "strip = [$(meson_quote $strip)]" >> $cross
47
echo "windres = [$(meson_quote $windres)]" >> $cross
48
-if test -n "$cross_prefix"; then
49
+if test "$cross_compile" = "yes"; then
50
cross_arg="--cross-file config-meson.cross"
51
echo "[host_machine]" >> $cross
52
if test "$mingw32" = "yes" ; then
53
--
54
2.20.1
55
56
diff view generated by jsdifflib
1
From: David CARLIER <devnexen@gmail.com>
1
From: Joelle van Dyne <j@getutm.app>
2
2
3
From 3025a0ce3fdf7d3559fc35a52c659f635f5c750c Mon Sep 17 00:00:00 2001
3
Build without error on hosts without a working system(). If system()
4
From: David Carlier <devnexen@gmail.com>
4
is called, return -1 with ENOSYS.
5
Date: Tue, 26 May 2020 21:35:27 +0100
6
Subject: [PATCH] util/oslib-posix : qemu_init_exec_dir implementation for Mac
7
5
8
Using dyld API to get the full path of the current process.
6
Signed-off-by: Joelle van Dyne <j@getutm.app>
9
7
Message-id: 20210126012457.39046-6-j@getutm.app
10
Signed-off-by: David Carlier <devnexen@gmail.com>
11
Message-id: CA+XhMqxwC10XHVs4Z-JfE0-WLAU3ztDuU9QKVi31mjr59HWCxg@mail.gmail.com
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
10
---
15
util/oslib-posix.c | 15 +++++++++++++++
11
meson.build | 1 +
16
1 file changed, 15 insertions(+)
12
include/qemu/osdep.h | 12 ++++++++++++
13
2 files changed, 13 insertions(+)
17
14
18
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
15
diff --git a/meson.build b/meson.build
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/util/oslib-posix.c
17
--- a/meson.build
21
+++ b/util/oslib-posix.c
18
+++ b/meson.build
22
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
23
#include <lwp.h>
20
config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
21
config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
22
config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
23
+config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
24
25
config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
26
27
diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
28
index XXXXXXX..XXXXXXX 100644
29
--- a/include/qemu/osdep.h
30
+++ b/include/qemu/osdep.h
31
@@ -XXX,XX +XXX,XX @@ static inline void qemu_thread_jit_write(void) {}
32
static inline void qemu_thread_jit_execute(void) {}
24
#endif
33
#endif
25
34
26
+#ifdef __APPLE__
35
+/**
27
+#include <mach-o/dyld.h>
36
+ * Platforms which do not support system() return ENOSYS
28
+#endif
37
+ */
38
+#ifndef HAVE_SYSTEM_FUNCTION
39
+#define system platform_does_not_support_system
40
+static inline int platform_does_not_support_system(const char *command)
41
+{
42
+ errno = ENOSYS;
43
+ return -1;
44
+}
45
+#endif /* !HAVE_SYSTEM_FUNCTION */
29
+
46
+
30
#include "qemu/mmap-alloc.h"
31
32
#ifdef CONFIG_DEBUG_STACK_USAGE
33
@@ -XXX,XX +XXX,XX @@ void qemu_init_exec_dir(const char *argv0)
34
p = buf;
35
}
36
}
37
+#elif defined(__APPLE__)
38
+ {
39
+ char fpath[PATH_MAX];
40
+ uint32_t len = sizeof(fpath);
41
+ if (_NSGetExecutablePath(fpath, &len) == 0) {
42
+ p = realpath(fpath, buf);
43
+ if (!p) {
44
+ return;
45
+ }
46
+ }
47
+ }
48
#endif
47
#endif
49
/* If we don't have any way of figuring out the actual executable
50
location then try argv[0]. */
51
--
48
--
52
2.20.1
49
2.20.1
53
50
54
51
diff view generated by jsdifflib
New patch
1
From: Joelle van Dyne <j@getutm.app>
1
2
3
Meson will find CoreFoundation, IOKit, and Cocoa as needed.
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Joelle van Dyne <j@getutm.app>
7
Message-id: 20210126012457.39046-7-j@getutm.app
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
configure | 1 -
11
1 file changed, 1 deletion(-)
12
13
diff --git a/configure b/configure
14
index XXXXXXX..XXXXXXX 100755
15
--- a/configure
16
+++ b/configure
17
@@ -XXX,XX +XXX,XX @@ Darwin)
18
fi
19
audio_drv_list="coreaudio try-sdl"
20
audio_possible_drivers="coreaudio sdl"
21
- QEMU_LDFLAGS="-framework CoreFoundation -framework IOKit $QEMU_LDFLAGS"
22
# Disable attempts to use ObjectiveC features in os/object.h since they
23
# won't work when we're compiling with gcc as a C compiler.
24
QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS"
25
--
26
2.20.1
27
28
diff view generated by jsdifflib
New patch
1
From: Joelle van Dyne <j@getutm.app>
1
2
3
Add objc to the Meson cross file as well as detection of Darwin.
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Joelle van Dyne <j@getutm.app>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210126012457.39046-8-j@getutm.app
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
configure | 4 ++++
12
1 file changed, 4 insertions(+)
13
14
diff --git a/configure b/configure
15
index XXXXXXX..XXXXXXX 100755
16
--- a/configure
17
+++ b/configure
18
@@ -XXX,XX +XXX,XX @@ echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
19
echo "[binaries]" >> $cross
20
echo "c = [$(meson_quote $cc)]" >> $cross
21
test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
22
+test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
23
echo "ar = [$(meson_quote $ar)]" >> $cross
24
echo "nm = [$(meson_quote $nm)]" >> $cross
25
echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
26
@@ -XXX,XX +XXX,XX @@ if test "$cross_compile" = "yes"; then
27
if test "$linux" = "yes" ; then
28
echo "system = 'linux'" >> $cross
29
fi
30
+ if test "$darwin" = "yes" ; then
31
+ echo "system = 'darwin'" >> $cross
32
+ fi
33
case "$ARCH" in
34
i386|x86_64)
35
echo "cpu_family = 'x86'" >> $cross
36
--
37
2.20.1
38
39
diff view generated by jsdifflib
New patch
1
From: Joelle van Dyne <j@getutm.app>
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
4
Signed-off-by: Joelle van Dyne <j@getutm.app>
5
Message-id: 20210126012457.39046-9-j@getutm.app
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
configure | 5 ++++-
9
1 file changed, 4 insertions(+), 1 deletion(-)
10
11
diff --git a/configure b/configure
12
index XXXXXXX..XXXXXXX 100755
13
--- a/configure
14
+++ b/configure
15
@@ -XXX,XX +XXX,XX @@ if test "$cross_compile" = "yes"; then
16
echo "system = 'darwin'" >> $cross
17
fi
18
case "$ARCH" in
19
- i386|x86_64)
20
+ i386)
21
echo "cpu_family = 'x86'" >> $cross
22
;;
23
+ x86_64)
24
+ echo "cpu_family = 'x86_64'" >> $cross
25
+ ;;
26
ppc64le)
27
echo "cpu_family = 'ppc64'" >> $cross
28
;;
29
--
30
2.20.1
31
32
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Joelle van Dyne <j@getutm.app>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
3
On iOS there is no CoreAudio, so we should not assume Darwin always
4
Message-id: 20200617072539.32686-14-f4bug@amsat.org
4
has it.
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
6
Signed-off-by: Joelle van Dyne <j@getutm.app>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210126012457.39046-11-j@getutm.app
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
hw/arm/mps2.c | 1 +
11
configure | 35 +++++++++++++++++++++++++++++++++--
9
1 file changed, 1 insertion(+)
12
1 file changed, 33 insertions(+), 2 deletions(-)
10
13
11
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
14
diff --git a/configure b/configure
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100755
13
--- a/hw/arm/mps2.c
16
--- a/configure
14
+++ b/hw/arm/mps2.c
17
+++ b/configure
15
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
18
@@ -XXX,XX +XXX,XX @@ fdt="auto"
16
0x4002a000}; /* Shield1 */
19
netmap="no"
17
sysbus_create_simple(TYPE_ARM_SBCON_I2C, i2cbase[i], NULL);
20
sdl="auto"
18
}
21
sdl_image="auto"
19
+ create_unimplemented_device("i2s", 0x40024000, 0x400);
22
+coreaudio="auto"
20
23
virtiofsd="auto"
21
/* In hardware this is a LAN9220; the LAN9118 is software compatible
24
virtfs="auto"
22
* except that it doesn't support the checksum-offload feature.
25
libudev="auto"
26
@@ -XXX,XX +XXX,XX @@ Darwin)
27
QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
28
QEMU_LDFLAGS="-arch x86_64 $QEMU_LDFLAGS"
29
fi
30
- audio_drv_list="coreaudio try-sdl"
31
+ audio_drv_list="try-coreaudio try-sdl"
32
audio_possible_drivers="coreaudio sdl"
33
# Disable attempts to use ObjectiveC features in os/object.h since they
34
# won't work when we're compiling with gcc as a C compiler.
35
@@ -XXX,XX +XXX,XX @@ EOF
36
fi
37
fi
38
39
+##########################################
40
+# detect CoreAudio
41
+if test "$coreaudio" != "no" ; then
42
+ coreaudio_libs="-framework CoreAudio"
43
+ cat > $TMPC << EOF
44
+#include <CoreAudio/CoreAudio.h>
45
+int main(void)
46
+{
47
+ return (int)AudioGetCurrentHostTime();
48
+}
49
+EOF
50
+ if compile_prog "" "$coreaudio_libs" ; then
51
+ coreaudio=yes
52
+ else
53
+ coreaudio=no
54
+ fi
55
+fi
56
+
57
##########################################
58
# Sound support libraries probe
59
60
@@ -XXX,XX +XXX,XX @@ for drv in $audio_drv_list; do
61
fi
62
;;
63
64
- coreaudio)
65
+ coreaudio | try-coreaudio)
66
+ if test "$coreaudio" = "no"; then
67
+ if test "$drv" = "try-coreaudio"; then
68
+ audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio//')
69
+ else
70
+ error_exit "$drv check failed" \
71
+ "Make sure to have the $drv is available."
72
+ fi
73
+ else
74
coreaudio_libs="-framework CoreAudio"
75
+ if test "$drv" = "try-coreaudio"; then
76
+ audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-coreaudio/coreaudio/')
77
+ fi
78
+ fi
79
;;
80
81
dsound)
23
--
82
--
24
2.20.1
83
2.20.1
25
84
26
85
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Joelle van Dyne <j@getutm.app>
2
2
3
Register the GPIO peripherals as unimplemented to better
3
A workaround added in early days of 64-bit OSX forced x86_64 if the
4
follow their accesses, for example booting Zephyr:
4
host machine had 64-bit support. This creates issues when cross-
5
5
compiling for ARM64. Additionally, the user can always use --cpu=* to
6
----------------
6
manually set the host CPU and therefore this workaround should be
7
IN: arm_mps2_pinmux_init
7
removed.
8
0x00001160: f64f 0231 movw r2, #0xf831
9
0x00001164: 4b06 ldr r3, [pc, #0x18]
10
0x00001166: 2000 movs r0, #0
11
0x00001168: 619a str r2, [r3, #0x18]
12
0x0000116a: f24c 426f movw r2, #0xc46f
13
0x0000116e: f503 5380 add.w r3, r3, #0x1000
14
0x00001172: 619a str r2, [r3, #0x18]
15
0x00001174: f44f 529e mov.w r2, #0x13c0
16
0x00001178: f503 5380 add.w r3, r3, #0x1000
17
0x0000117c: 619a str r2, [r3, #0x18]
18
0x0000117e: 4770 bx lr
19
cmsdk-ahb-gpio: unimplemented device write (size 4, value 0xf831, offset 0x18)
20
cmsdk-ahb-gpio: unimplemented device write (size 4, value 0xc46f, offset 0x18)
21
cmsdk-ahb-gpio: unimplemented device write (size 4, value 0x13c0, offset 0x18)
22
8
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Signed-off-by: Joelle van Dyne <j@getutm.app>
25
Message-id: 20200617072539.32686-10-f4bug@amsat.org
11
Message-id: 20210126012457.39046-12-j@getutm.app
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
---
13
---
28
hw/arm/mps2.c | 8 ++++++--
14
configure | 11 -----------
29
1 file changed, 6 insertions(+), 2 deletions(-)
15
1 file changed, 11 deletions(-)
30
16
31
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
17
diff --git a/configure b/configure
32
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100755
33
--- a/hw/arm/mps2.c
19
--- a/configure
34
+++ b/hw/arm/mps2.c
20
+++ b/configure
35
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
21
@@ -XXX,XX +XXX,XX @@ fi
36
MemoryRegion *system_memory = get_system_memory();
22
# the correct CPU with the --cpu option.
37
MachineClass *mc = MACHINE_GET_CLASS(machine);
23
case $targetos in
38
DeviceState *armv7m, *sccdev;
24
Darwin)
39
+ int i;
25
- # on Leopard most of the system is 32-bit, so we have to ask the kernel if we can
40
26
- # run 64-bit userspace code.
41
if (strcmp(machine->cpu_type, mc->default_cpu_type) != 0) {
27
- # If the user didn't specify a CPU explicitly and the kernel says this is
42
error_report("This board can only be used with CPU %s",
28
- # 64 bit hw, then assume x86_64. Otherwise fall through to the usual detection code.
43
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
29
- if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
44
*/
30
- cpu="x86_64"
45
Object *orgate;
31
- fi
46
DeviceState *orgate_dev;
32
HOST_DSOSUF=".dylib"
47
- int i;
33
;;
48
34
SunOS)
49
orgate = object_new(TYPE_OR_IRQ);
35
@@ -XXX,XX +XXX,XX @@ OpenBSD)
50
object_property_set_int(orgate, 6, "num-lines", &error_fatal);
36
Darwin)
51
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
37
bsd="yes"
52
*/
38
darwin="yes"
53
Object *orgate;
39
- if [ "$cpu" = "x86_64" ] ; then
54
DeviceState *orgate_dev;
40
- QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
55
- int i;
41
- QEMU_LDFLAGS="-arch x86_64 $QEMU_LDFLAGS"
56
42
- fi
57
orgate = object_new(TYPE_OR_IRQ);
43
audio_drv_list="try-coreaudio try-sdl"
58
object_property_set_int(orgate, 10, "num-lines", &error_fatal);
44
audio_possible_drivers="coreaudio sdl"
59
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
45
# Disable attempts to use ObjectiveC features in os/object.h since they
60
default:
61
g_assert_not_reached();
62
}
63
+ for (i = 0; i < 4; i++) {
64
+ static const hwaddr gpiobase[] = {0x40010000, 0x40011000,
65
+ 0x40012000, 0x40013000};
66
+ create_unimplemented_device("cmsdk-ahb-gpio", gpiobase[i], 0x1000);
67
+ }
68
69
/* CMSDK APB subsystem */
70
cmsdk_apb_timer_create(0x40000000, qdev_get_gpio_in(armv7m, 8), SYSCLK_FRQ);
71
--
46
--
72
2.20.1
47
2.20.1
73
48
74
49
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Alexander Graf <agraf@csgraf.de>
2
2
3
We already model the CMSDK APB watchdog device, let's use it!
3
In macOS 11, QEMU only gets access to Hypervisor.framework if it has the
4
respective entitlement. Add an entitlement template and automatically self
5
sign and apply the entitlement in the build.
4
6
5
Suggested-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Alexander Graf <agraf@csgraf.de>
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com>
7
Message-id: 20200617072539.32686-9-f4bug@amsat.org
9
Tested-by: Roman Bolshakov <r.bolshakov@yadro.com>
8
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
hw/arm/mps2.c | 7 +++++++
12
meson.build | 29 +++++++++++++++++++++++++----
12
hw/arm/Kconfig | 1 +
13
accel/hvf/entitlements.plist | 8 ++++++++
13
2 files changed, 8 insertions(+)
14
scripts/entitlement.sh | 13 +++++++++++++
15
3 files changed, 46 insertions(+), 4 deletions(-)
16
create mode 100644 accel/hvf/entitlements.plist
17
create mode 100755 scripts/entitlement.sh
14
18
15
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
19
diff --git a/meson.build b/meson.build
16
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/mps2.c
21
--- a/meson.build
18
+++ b/hw/arm/mps2.c
22
+++ b/meson.build
19
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
23
@@ -XXX,XX +XXX,XX @@ foreach target : target_dirs
20
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->dualtimer), 0,
24
}]
21
qdev_get_gpio_in(armv7m, 10));
25
endif
22
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->dualtimer), 0, 0x40002000);
26
foreach exe: execs
23
+ object_initialize_child(OBJECT(mms), "watchdog", &mms->watchdog,
27
- emulators += {exe['name']:
24
+ TYPE_CMSDK_APB_WATCHDOG);
28
- executable(exe['name'], exe['sources'],
25
+ qdev_prop_set_uint32(DEVICE(&mms->watchdog), "wdogclk-frq", SYSCLK_FRQ);
29
- install: true,
26
+ sysbus_realize(SYS_BUS_DEVICE(&mms->watchdog), &error_fatal);
30
+ exe_name = exe['name']
27
+ sysbus_connect_irq(SYS_BUS_DEVICE(&mms->watchdog), 0,
31
+ exe_sign = 'CONFIG_HVF' in config_target
28
+ qdev_get_gpio_in_named(armv7m, "NMI", 0));
32
+ if exe_sign
29
+ sysbus_mmio_map(SYS_BUS_DEVICE(&mms->watchdog), 0, 0x40008000);
33
+ exe_name += '-unsigned'
30
34
+ endif
31
/* FPGA APB subsystem */
35
+
32
object_initialize_child(OBJECT(mms), "scc", &mms->scc, TYPE_MPS2_SCC);
36
+ emulator = executable(exe_name, exe['sources'],
33
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
37
+ install: not exe_sign,
34
index XXXXXXX..XXXXXXX 100644
38
c_args: c_args,
35
--- a/hw/arm/Kconfig
39
dependencies: arch_deps + deps + exe['dependencies'],
36
+++ b/hw/arm/Kconfig
40
objects: lib.extract_all_objects(recursive: true),
37
@@ -XXX,XX +XXX,XX @@ config MPS2
41
@@ -XXX,XX +XXX,XX @@ foreach target : target_dirs
38
select PL080 # DMA controller
42
link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
39
select SPLIT_IRQ
43
link_args: link_args,
40
select UNIMP
44
gui_app: exe['gui'])
41
+ select CMSDK_APB_WATCHDOG
45
- }
42
46
+
43
config FSL_IMX7
47
+ if exe_sign
44
bool
48
+ emulators += {exe['name'] : custom_target(exe['name'],
49
+ install: true,
50
+ install_dir: get_option('bindir'),
51
+ depends: emulator,
52
+ output: exe['name'],
53
+ command: [
54
+ meson.current_source_dir() / 'scripts/entitlement.sh',
55
+ meson.current_build_dir() / exe_name,
56
+ meson.current_build_dir() / exe['name'],
57
+ meson.current_source_dir() / 'accel/hvf/entitlements.plist'
58
+ ])
59
+ }
60
+ else
61
+ emulators += {exe['name']: emulator}
62
+ endif
63
64
if 'CONFIG_TRACE_SYSTEMTAP' in config_host
65
foreach stp: [
66
diff --git a/accel/hvf/entitlements.plist b/accel/hvf/entitlements.plist
67
new file mode 100644
68
index XXXXXXX..XXXXXXX
69
--- /dev/null
70
+++ b/accel/hvf/entitlements.plist
71
@@ -XXX,XX +XXX,XX @@
72
+<?xml version="1.0" encoding="UTF-8"?>
73
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
74
+<plist version="1.0">
75
+<dict>
76
+ <key>com.apple.security.hypervisor</key>
77
+ <true/>
78
+</dict>
79
+</plist>
80
diff --git a/scripts/entitlement.sh b/scripts/entitlement.sh
81
new file mode 100755
82
index XXXXXXX..XXXXXXX
83
--- /dev/null
84
+++ b/scripts/entitlement.sh
85
@@ -XXX,XX +XXX,XX @@
86
+#!/bin/sh -e
87
+#
88
+# Helper script for the build process to apply entitlements
89
+
90
+SRC="$1"
91
+DST="$2"
92
+ENTITLEMENT="$3"
93
+
94
+trap 'rm "$DST.tmp"' exit
95
+cp -af "$SRC" "$DST.tmp"
96
+codesign --entitlements "$ENTITLEMENT" --force -s - "$DST.tmp"
97
+mv "$DST.tmp" "$DST"
98
+trap '' exit
45
--
99
--
46
2.20.1
100
2.20.1
47
101
48
102
diff view generated by jsdifflib
1
Convert the Neon VTRN insn to decodetree. This is the last insn in the
1
From: Mihai Carabas <mihai.carabas@oracle.com>
2
Neon data-processing group, so we can remove all the now-unused old
2
3
decoder framework.
3
To ease the PCI device addition in next patches, split the code as follows:
4
4
- generic code (read/write/setup) is being kept in pvpanic.c
5
It's possible that there's a more efficient implementation of
5
- ISA dependent code moved to pvpanic-isa.c
6
VTRN, but for this conversion we just copy the existing approach.
6
7
7
Also, rename:
8
- ISA_PVPANIC_DEVICE -> PVPANIC_ISA_DEVICE.
9
- TYPE_PVPANIC -> TYPE_PVPANIC_ISA.
10
- MemoryRegion io -> mr.
11
- pvpanic_ioport_* in pvpanic_*.
12
13
Update the build system with the new files and config structure.
14
15
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20200616170844.13318-21-peter.maydell@linaro.org
11
---
18
---
12
target/arm/neon-dp.decode | 2 +-
19
include/hw/misc/pvpanic.h | 23 +++++++++-
13
target/arm/translate-neon.inc.c | 90 ++++++++
20
hw/misc/pvpanic-isa.c | 94 +++++++++++++++++++++++++++++++++++++++
14
target/arm/translate.c | 363 +-------------------------------
21
hw/misc/pvpanic.c | 85 +++--------------------------------
15
3 files changed, 93 insertions(+), 362 deletions(-)
22
hw/i386/Kconfig | 2 +-
16
23
hw/misc/Kconfig | 6 ++-
17
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
24
hw/misc/meson.build | 3 +-
18
index XXXXXXX..XXXXXXX 100644
25
tests/qtest/meson.build | 2 +-
19
--- a/target/arm/neon-dp.decode
26
7 files changed, 130 insertions(+), 85 deletions(-)
20
+++ b/target/arm/neon-dp.decode
27
create mode 100644 hw/misc/pvpanic-isa.c
21
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
28
22
VNEG_F 1111 001 11 . 11 .. 01 .... 0 1111 . . 0 .... @2misc
29
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
23
30
index XXXXXXX..XXXXXXX 100644
24
VSWP 1111 001 11 . 11 .. 10 .... 0 0000 . . 0 .... @2misc
31
--- a/include/hw/misc/pvpanic.h
25
-
32
+++ b/include/hw/misc/pvpanic.h
26
+ VTRN 1111 001 11 . 11 .. 10 .... 0 0001 . . 0 .... @2misc
33
@@ -XXX,XX +XXX,XX @@
27
VUZP 1111 001 11 . 11 .. 10 .... 0 0010 . . 0 .... @2misc
34
28
VZIP 1111 001 11 . 11 .. 10 .... 0 0011 . . 0 .... @2misc
35
#include "qom/object.h"
29
36
30
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
37
-#define TYPE_PVPANIC "pvpanic"
31
index XXXXXXX..XXXXXXX 100644
38
+#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
32
--- a/target/arm/translate-neon.inc.c
39
33
+++ b/target/arm/translate-neon.inc.c
40
#define PVPANIC_IOPORT_PROP "ioport"
34
@@ -XXX,XX +XXX,XX @@ static bool trans_VSWP(DisasContext *s, arg_2misc *a)
41
35
42
+/* The bit of supported pv event, TODO: include uapi header and remove this */
36
return true;
43
+#define PVPANIC_F_PANICKED 0
44
+#define PVPANIC_F_CRASHLOADED 1
45
+
46
+/* The pv event value */
47
+#define PVPANIC_PANICKED (1 << PVPANIC_F_PANICKED)
48
+#define PVPANIC_CRASHLOADED (1 << PVPANIC_F_CRASHLOADED)
49
+
50
+/*
51
+ * PVPanicState for any device type
52
+ */
53
+typedef struct PVPanicState PVPanicState;
54
+struct PVPanicState {
55
+ MemoryRegion mr;
56
+ uint8_t events;
57
+};
58
+
59
+void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size);
60
+
61
static inline uint16_t pvpanic_port(void)
62
{
63
- Object *o = object_resolve_path_type("", TYPE_PVPANIC, NULL);
64
+ Object *o = object_resolve_path_type("", TYPE_PVPANIC_ISA_DEVICE, NULL);
65
if (!o) {
66
return 0;
67
}
68
diff --git a/hw/misc/pvpanic-isa.c b/hw/misc/pvpanic-isa.c
69
new file mode 100644
70
index XXXXXXX..XXXXXXX
71
--- /dev/null
72
+++ b/hw/misc/pvpanic-isa.c
73
@@ -XXX,XX +XXX,XX @@
74
+/*
75
+ * QEMU simulated pvpanic device.
76
+ *
77
+ * Copyright Fujitsu, Corp. 2013
78
+ *
79
+ * Authors:
80
+ * Wen Congyang <wency@cn.fujitsu.com>
81
+ * Hu Tao <hutao@cn.fujitsu.com>
82
+ *
83
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
84
+ * See the COPYING file in the top-level directory.
85
+ *
86
+ */
87
+
88
+#include "qemu/osdep.h"
89
+#include "qemu/log.h"
90
+#include "qemu/module.h"
91
+#include "sysemu/runstate.h"
92
+
93
+#include "hw/nvram/fw_cfg.h"
94
+#include "hw/qdev-properties.h"
95
+#include "hw/misc/pvpanic.h"
96
+#include "qom/object.h"
97
+#include "hw/isa/isa.h"
98
+
99
+OBJECT_DECLARE_SIMPLE_TYPE(PVPanicISAState, PVPANIC_ISA_DEVICE)
100
+
101
+/*
102
+ * PVPanicISAState for ISA device and
103
+ * use ioport.
104
+ */
105
+struct PVPanicISAState {
106
+ ISADevice parent_obj;
107
+
108
+ uint16_t ioport;
109
+ PVPanicState pvpanic;
110
+};
111
+
112
+static void pvpanic_isa_initfn(Object *obj)
113
+{
114
+ PVPanicISAState *s = PVPANIC_ISA_DEVICE(obj);
115
+
116
+ pvpanic_setup_io(&s->pvpanic, DEVICE(s), 1);
117
+}
118
+
119
+static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
120
+{
121
+ ISADevice *d = ISA_DEVICE(dev);
122
+ PVPanicISAState *s = PVPANIC_ISA_DEVICE(dev);
123
+ PVPanicState *ps = &s->pvpanic;
124
+ FWCfgState *fw_cfg = fw_cfg_find();
125
+ uint16_t *pvpanic_port;
126
+
127
+ if (!fw_cfg) {
128
+ return;
129
+ }
130
+
131
+ pvpanic_port = g_malloc(sizeof(*pvpanic_port));
132
+ *pvpanic_port = cpu_to_le16(s->ioport);
133
+ fw_cfg_add_file(fw_cfg, "etc/pvpanic-port", pvpanic_port,
134
+ sizeof(*pvpanic_port));
135
+
136
+ isa_register_ioport(d, &ps->mr, s->ioport);
137
+}
138
+
139
+static Property pvpanic_isa_properties[] = {
140
+ DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicISAState, ioport, 0x505),
141
+ DEFINE_PROP_UINT8("events", PVPanicISAState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
142
+ DEFINE_PROP_END_OF_LIST(),
143
+};
144
+
145
+static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
146
+{
147
+ DeviceClass *dc = DEVICE_CLASS(klass);
148
+
149
+ dc->realize = pvpanic_isa_realizefn;
150
+ device_class_set_props(dc, pvpanic_isa_properties);
151
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
152
+}
153
+
154
+static TypeInfo pvpanic_isa_info = {
155
+ .name = TYPE_PVPANIC_ISA_DEVICE,
156
+ .parent = TYPE_ISA_DEVICE,
157
+ .instance_size = sizeof(PVPanicISAState),
158
+ .instance_init = pvpanic_isa_initfn,
159
+ .class_init = pvpanic_isa_class_init,
160
+};
161
+
162
+static void pvpanic_register_types(void)
163
+{
164
+ type_register_static(&pvpanic_isa_info);
165
+}
166
+
167
+type_init(pvpanic_register_types)
168
diff --git a/hw/misc/pvpanic.c b/hw/misc/pvpanic.c
169
index XXXXXXX..XXXXXXX 100644
170
--- a/hw/misc/pvpanic.c
171
+++ b/hw/misc/pvpanic.c
172
@@ -XXX,XX +XXX,XX @@
173
#include "hw/misc/pvpanic.h"
174
#include "qom/object.h"
175
176
-/* The bit of supported pv event, TODO: include uapi header and remove this */
177
-#define PVPANIC_F_PANICKED 0
178
-#define PVPANIC_F_CRASHLOADED 1
179
-
180
-/* The pv event value */
181
-#define PVPANIC_PANICKED (1 << PVPANIC_F_PANICKED)
182
-#define PVPANIC_CRASHLOADED (1 << PVPANIC_F_CRASHLOADED)
183
-
184
-typedef struct PVPanicState PVPanicState;
185
-DECLARE_INSTANCE_CHECKER(PVPanicState, ISA_PVPANIC_DEVICE,
186
- TYPE_PVPANIC)
187
-
188
static void handle_event(int event)
189
{
190
static bool logged;
191
@@ -XXX,XX +XXX,XX @@ static void handle_event(int event)
192
}
37
}
193
}
38
+static void gen_neon_trn_u8(TCGv_i32 t0, TCGv_i32 t1)
194
39
+{
195
-#include "hw/isa/isa.h"
40
+ TCGv_i32 rd, tmp;
196
-
41
+
197
-struct PVPanicState {
42
+ rd = tcg_temp_new_i32();
198
- ISADevice parent_obj;
43
+ tmp = tcg_temp_new_i32();
199
-
44
+
200
- MemoryRegion io;
45
+ tcg_gen_shli_i32(rd, t0, 8);
201
- uint16_t ioport;
46
+ tcg_gen_andi_i32(rd, rd, 0xff00ff00);
202
- uint8_t events;
47
+ tcg_gen_andi_i32(tmp, t1, 0x00ff00ff);
203
-};
48
+ tcg_gen_or_i32(rd, rd, tmp);
204
-
49
+
205
/* return supported events on read */
50
+ tcg_gen_shri_i32(t1, t1, 8);
206
-static uint64_t pvpanic_ioport_read(void *opaque, hwaddr addr, unsigned size)
51
+ tcg_gen_andi_i32(t1, t1, 0x00ff00ff);
207
+static uint64_t pvpanic_read(void *opaque, hwaddr addr, unsigned size)
52
+ tcg_gen_andi_i32(tmp, t0, 0xff00ff00);
208
{
53
+ tcg_gen_or_i32(t1, t1, tmp);
209
PVPanicState *pvp = opaque;
54
+ tcg_gen_mov_i32(t0, rd);
210
return pvp->events;
55
+
56
+ tcg_temp_free_i32(tmp);
57
+ tcg_temp_free_i32(rd);
58
+}
59
+
60
+static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
61
+{
62
+ TCGv_i32 rd, tmp;
63
+
64
+ rd = tcg_temp_new_i32();
65
+ tmp = tcg_temp_new_i32();
66
+
67
+ tcg_gen_shli_i32(rd, t0, 16);
68
+ tcg_gen_andi_i32(tmp, t1, 0xffff);
69
+ tcg_gen_or_i32(rd, rd, tmp);
70
+ tcg_gen_shri_i32(t1, t1, 16);
71
+ tcg_gen_andi_i32(tmp, t0, 0xffff0000);
72
+ tcg_gen_or_i32(t1, t1, tmp);
73
+ tcg_gen_mov_i32(t0, rd);
74
+
75
+ tcg_temp_free_i32(tmp);
76
+ tcg_temp_free_i32(rd);
77
+}
78
+
79
+static bool trans_VTRN(DisasContext *s, arg_2misc *a)
80
+{
81
+ TCGv_i32 tmp, tmp2;
82
+ int pass;
83
+
84
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
85
+ return false;
86
+ }
87
+
88
+ /* UNDEF accesses to D16-D31 if they don't exist. */
89
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
90
+ ((a->vd | a->vm) & 0x10)) {
91
+ return false;
92
+ }
93
+
94
+ if ((a->vd | a->vm) & a->q) {
95
+ return false;
96
+ }
97
+
98
+ if (a->size == 3) {
99
+ return false;
100
+ }
101
+
102
+ if (!vfp_access_check(s)) {
103
+ return true;
104
+ }
105
+
106
+ if (a->size == 2) {
107
+ for (pass = 0; pass < (a->q ? 4 : 2); pass += 2) {
108
+ tmp = neon_load_reg(a->vm, pass);
109
+ tmp2 = neon_load_reg(a->vd, pass + 1);
110
+ neon_store_reg(a->vm, pass, tmp2);
111
+ neon_store_reg(a->vd, pass + 1, tmp);
112
+ }
113
+ } else {
114
+ for (pass = 0; pass < (a->q ? 4 : 2); pass++) {
115
+ tmp = neon_load_reg(a->vm, pass);
116
+ tmp2 = neon_load_reg(a->vd, pass);
117
+ if (a->size == 0) {
118
+ gen_neon_trn_u8(tmp, tmp2);
119
+ } else {
120
+ gen_neon_trn_u16(tmp, tmp2);
121
+ }
122
+ neon_store_reg(a->vm, pass, tmp2);
123
+ neon_store_reg(a->vd, pass, tmp);
124
+ }
125
+ }
126
+ return true;
127
+}
128
diff --git a/target/arm/translate.c b/target/arm/translate.c
129
index XXXXXXX..XXXXXXX 100644
130
--- a/target/arm/translate.c
131
+++ b/target/arm/translate.c
132
@@ -XXX,XX +XXX,XX @@ static void gen_exception_return(DisasContext *s, TCGv_i32 pc)
133
gen_rfe(s, pc, load_cpu_field(spsr));
134
}
211
}
135
212
136
-static void gen_neon_trn_u8(TCGv_i32 t0, TCGv_i32 t1)
213
-static void pvpanic_ioport_write(void *opaque, hwaddr addr, uint64_t val,
214
+static void pvpanic_write(void *opaque, hwaddr addr, uint64_t val,
215
unsigned size)
216
{
217
handle_event(val);
218
}
219
220
static const MemoryRegionOps pvpanic_ops = {
221
- .read = pvpanic_ioport_read,
222
- .write = pvpanic_ioport_write,
223
+ .read = pvpanic_read,
224
+ .write = pvpanic_write,
225
.impl = {
226
.min_access_size = 1,
227
.max_access_size = 1,
228
},
229
};
230
231
-static void pvpanic_isa_initfn(Object *obj)
232
+void pvpanic_setup_io(PVPanicState *s, DeviceState *dev, unsigned size)
233
{
234
- PVPanicState *s = ISA_PVPANIC_DEVICE(obj);
235
-
236
- memory_region_init_io(&s->io, OBJECT(s), &pvpanic_ops, s, "pvpanic", 1);
237
+ memory_region_init_io(&s->mr, OBJECT(dev), &pvpanic_ops, s, "pvpanic", size);
238
}
239
-
240
-static void pvpanic_isa_realizefn(DeviceState *dev, Error **errp)
137
-{
241
-{
138
- TCGv_i32 rd, tmp;
242
- ISADevice *d = ISA_DEVICE(dev);
139
-
243
- PVPanicState *s = ISA_PVPANIC_DEVICE(dev);
140
- rd = tcg_temp_new_i32();
244
- FWCfgState *fw_cfg = fw_cfg_find();
141
- tmp = tcg_temp_new_i32();
245
- uint16_t *pvpanic_port;
142
-
246
-
143
- tcg_gen_shli_i32(rd, t0, 8);
247
- if (!fw_cfg) {
144
- tcg_gen_andi_i32(rd, rd, 0xff00ff00);
248
- return;
145
- tcg_gen_andi_i32(tmp, t1, 0x00ff00ff);
249
- }
146
- tcg_gen_or_i32(rd, rd, tmp);
250
-
147
-
251
- pvpanic_port = g_malloc(sizeof(*pvpanic_port));
148
- tcg_gen_shri_i32(t1, t1, 8);
252
- *pvpanic_port = cpu_to_le16(s->ioport);
149
- tcg_gen_andi_i32(t1, t1, 0x00ff00ff);
253
- fw_cfg_add_file(fw_cfg, "etc/pvpanic-port", pvpanic_port,
150
- tcg_gen_andi_i32(tmp, t0, 0xff00ff00);
254
- sizeof(*pvpanic_port));
151
- tcg_gen_or_i32(t1, t1, tmp);
255
-
152
- tcg_gen_mov_i32(t0, rd);
256
- isa_register_ioport(d, &s->io, s->ioport);
153
-
154
- tcg_temp_free_i32(tmp);
155
- tcg_temp_free_i32(rd);
156
-}
257
-}
157
-
258
-
158
-static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
259
-static Property pvpanic_isa_properties[] = {
260
- DEFINE_PROP_UINT16(PVPANIC_IOPORT_PROP, PVPanicState, ioport, 0x505),
261
- DEFINE_PROP_UINT8("events", PVPanicState, events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
262
- DEFINE_PROP_END_OF_LIST(),
263
-};
264
-
265
-static void pvpanic_isa_class_init(ObjectClass *klass, void *data)
159
-{
266
-{
160
- TCGv_i32 rd, tmp;
267
- DeviceClass *dc = DEVICE_CLASS(klass);
161
-
268
-
162
- rd = tcg_temp_new_i32();
269
- dc->realize = pvpanic_isa_realizefn;
163
- tmp = tcg_temp_new_i32();
270
- device_class_set_props(dc, pvpanic_isa_properties);
164
-
271
- set_bit(DEVICE_CATEGORY_MISC, dc->categories);
165
- tcg_gen_shli_i32(rd, t0, 16);
166
- tcg_gen_andi_i32(tmp, t1, 0xffff);
167
- tcg_gen_or_i32(rd, rd, tmp);
168
- tcg_gen_shri_i32(t1, t1, 16);
169
- tcg_gen_andi_i32(tmp, t0, 0xffff0000);
170
- tcg_gen_or_i32(t1, t1, tmp);
171
- tcg_gen_mov_i32(t0, rd);
172
-
173
- tcg_temp_free_i32(tmp);
174
- tcg_temp_free_i32(rd);
175
-}
272
-}
176
-
273
-
177
-/* Symbolic constants for op fields for Neon 2-register miscellaneous.
274
-static TypeInfo pvpanic_isa_info = {
178
- * The values correspond to bits [17:16,10:7]; see the ARM ARM DDI0406B
275
- .name = TYPE_PVPANIC,
179
- * table A7-13.
276
- .parent = TYPE_ISA_DEVICE,
180
- */
277
- .instance_size = sizeof(PVPanicState),
181
-#define NEON_2RM_VREV64 0
278
- .instance_init = pvpanic_isa_initfn,
182
-#define NEON_2RM_VREV32 1
279
- .class_init = pvpanic_isa_class_init,
183
-#define NEON_2RM_VREV16 2
184
-#define NEON_2RM_VPADDL 4
185
-#define NEON_2RM_VPADDL_U 5
186
-#define NEON_2RM_AESE 6 /* Includes AESD */
187
-#define NEON_2RM_AESMC 7 /* Includes AESIMC */
188
-#define NEON_2RM_VCLS 8
189
-#define NEON_2RM_VCLZ 9
190
-#define NEON_2RM_VCNT 10
191
-#define NEON_2RM_VMVN 11
192
-#define NEON_2RM_VPADAL 12
193
-#define NEON_2RM_VPADAL_U 13
194
-#define NEON_2RM_VQABS 14
195
-#define NEON_2RM_VQNEG 15
196
-#define NEON_2RM_VCGT0 16
197
-#define NEON_2RM_VCGE0 17
198
-#define NEON_2RM_VCEQ0 18
199
-#define NEON_2RM_VCLE0 19
200
-#define NEON_2RM_VCLT0 20
201
-#define NEON_2RM_SHA1H 21
202
-#define NEON_2RM_VABS 22
203
-#define NEON_2RM_VNEG 23
204
-#define NEON_2RM_VCGT0_F 24
205
-#define NEON_2RM_VCGE0_F 25
206
-#define NEON_2RM_VCEQ0_F 26
207
-#define NEON_2RM_VCLE0_F 27
208
-#define NEON_2RM_VCLT0_F 28
209
-#define NEON_2RM_VABS_F 30
210
-#define NEON_2RM_VNEG_F 31
211
-#define NEON_2RM_VSWP 32
212
-#define NEON_2RM_VTRN 33
213
-#define NEON_2RM_VUZP 34
214
-#define NEON_2RM_VZIP 35
215
-#define NEON_2RM_VMOVN 36 /* Includes VQMOVN, VQMOVUN */
216
-#define NEON_2RM_VQMOVN 37 /* Includes VQMOVUN */
217
-#define NEON_2RM_VSHLL 38
218
-#define NEON_2RM_SHA1SU1 39 /* Includes SHA256SU0 */
219
-#define NEON_2RM_VRINTN 40
220
-#define NEON_2RM_VRINTX 41
221
-#define NEON_2RM_VRINTA 42
222
-#define NEON_2RM_VRINTZ 43
223
-#define NEON_2RM_VCVT_F16_F32 44
224
-#define NEON_2RM_VRINTM 45
225
-#define NEON_2RM_VCVT_F32_F16 46
226
-#define NEON_2RM_VRINTP 47
227
-#define NEON_2RM_VCVTAU 48
228
-#define NEON_2RM_VCVTAS 49
229
-#define NEON_2RM_VCVTNU 50
230
-#define NEON_2RM_VCVTNS 51
231
-#define NEON_2RM_VCVTPU 52
232
-#define NEON_2RM_VCVTPS 53
233
-#define NEON_2RM_VCVTMU 54
234
-#define NEON_2RM_VCVTMS 55
235
-#define NEON_2RM_VRECPE 56
236
-#define NEON_2RM_VRSQRTE 57
237
-#define NEON_2RM_VRECPE_F 58
238
-#define NEON_2RM_VRSQRTE_F 59
239
-#define NEON_2RM_VCVT_FS 60
240
-#define NEON_2RM_VCVT_FU 61
241
-#define NEON_2RM_VCVT_SF 62
242
-#define NEON_2RM_VCVT_UF 63
243
-
244
-/* Each entry in this array has bit n set if the insn allows
245
- * size value n (otherwise it will UNDEF). Since unallocated
246
- * op values will have no bits set they always UNDEF.
247
- */
248
-static const uint8_t neon_2rm_sizes[] = {
249
- [NEON_2RM_VREV64] = 0x7,
250
- [NEON_2RM_VREV32] = 0x3,
251
- [NEON_2RM_VREV16] = 0x1,
252
- [NEON_2RM_VPADDL] = 0x7,
253
- [NEON_2RM_VPADDL_U] = 0x7,
254
- [NEON_2RM_AESE] = 0x1,
255
- [NEON_2RM_AESMC] = 0x1,
256
- [NEON_2RM_VCLS] = 0x7,
257
- [NEON_2RM_VCLZ] = 0x7,
258
- [NEON_2RM_VCNT] = 0x1,
259
- [NEON_2RM_VMVN] = 0x1,
260
- [NEON_2RM_VPADAL] = 0x7,
261
- [NEON_2RM_VPADAL_U] = 0x7,
262
- [NEON_2RM_VQABS] = 0x7,
263
- [NEON_2RM_VQNEG] = 0x7,
264
- [NEON_2RM_VCGT0] = 0x7,
265
- [NEON_2RM_VCGE0] = 0x7,
266
- [NEON_2RM_VCEQ0] = 0x7,
267
- [NEON_2RM_VCLE0] = 0x7,
268
- [NEON_2RM_VCLT0] = 0x7,
269
- [NEON_2RM_SHA1H] = 0x4,
270
- [NEON_2RM_VABS] = 0x7,
271
- [NEON_2RM_VNEG] = 0x7,
272
- [NEON_2RM_VCGT0_F] = 0x4,
273
- [NEON_2RM_VCGE0_F] = 0x4,
274
- [NEON_2RM_VCEQ0_F] = 0x4,
275
- [NEON_2RM_VCLE0_F] = 0x4,
276
- [NEON_2RM_VCLT0_F] = 0x4,
277
- [NEON_2RM_VABS_F] = 0x4,
278
- [NEON_2RM_VNEG_F] = 0x4,
279
- [NEON_2RM_VSWP] = 0x1,
280
- [NEON_2RM_VTRN] = 0x7,
281
- [NEON_2RM_VUZP] = 0x7,
282
- [NEON_2RM_VZIP] = 0x7,
283
- [NEON_2RM_VMOVN] = 0x7,
284
- [NEON_2RM_VQMOVN] = 0x7,
285
- [NEON_2RM_VSHLL] = 0x7,
286
- [NEON_2RM_SHA1SU1] = 0x4,
287
- [NEON_2RM_VRINTN] = 0x4,
288
- [NEON_2RM_VRINTX] = 0x4,
289
- [NEON_2RM_VRINTA] = 0x4,
290
- [NEON_2RM_VRINTZ] = 0x4,
291
- [NEON_2RM_VCVT_F16_F32] = 0x2,
292
- [NEON_2RM_VRINTM] = 0x4,
293
- [NEON_2RM_VCVT_F32_F16] = 0x2,
294
- [NEON_2RM_VRINTP] = 0x4,
295
- [NEON_2RM_VCVTAU] = 0x4,
296
- [NEON_2RM_VCVTAS] = 0x4,
297
- [NEON_2RM_VCVTNU] = 0x4,
298
- [NEON_2RM_VCVTNS] = 0x4,
299
- [NEON_2RM_VCVTPU] = 0x4,
300
- [NEON_2RM_VCVTPS] = 0x4,
301
- [NEON_2RM_VCVTMU] = 0x4,
302
- [NEON_2RM_VCVTMS] = 0x4,
303
- [NEON_2RM_VRECPE] = 0x4,
304
- [NEON_2RM_VRSQRTE] = 0x4,
305
- [NEON_2RM_VRECPE_F] = 0x4,
306
- [NEON_2RM_VRSQRTE_F] = 0x4,
307
- [NEON_2RM_VCVT_FS] = 0x4,
308
- [NEON_2RM_VCVT_FU] = 0x4,
309
- [NEON_2RM_VCVT_SF] = 0x4,
310
- [NEON_2RM_VCVT_UF] = 0x4,
311
-};
280
-};
312
-
281
-
313
static void gen_gvec_fn3_qc(uint32_t rd_ofs, uint32_t rn_ofs, uint32_t rm_ofs,
282
-static void pvpanic_register_types(void)
314
uint32_t opr_sz, uint32_t max_sz,
315
gen_helper_gvec_3_ptr *fn)
316
@@ -XXX,XX +XXX,XX @@ void gen_gvec_uaba(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
317
tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, opr_sz, max_sz, &ops[vece]);
318
}
319
320
-/* Translate a NEON data processing instruction. Return nonzero if the
321
- instruction is invalid.
322
- We process data in a mixture of 32-bit and 64-bit chunks.
323
- Mostly we use 32-bit chunks so we can use normal scalar instructions. */
324
-
325
-static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
326
-{
283
-{
327
- int op;
284
- type_register_static(&pvpanic_isa_info);
328
- int q;
329
- int rd, rm;
330
- int size;
331
- int pass;
332
- int u;
333
- TCGv_i32 tmp, tmp2;
334
-
335
- if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
336
- return 1;
337
- }
338
-
339
- /* FIXME: this access check should not take precedence over UNDEF
340
- * for invalid encodings; we will generate incorrect syndrome information
341
- * for attempts to execute invalid vfp/neon encodings with FP disabled.
342
- */
343
- if (s->fp_excp_el) {
344
- gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
345
- syn_simd_access_trap(1, 0xe, false), s->fp_excp_el);
346
- return 0;
347
- }
348
-
349
- if (!s->vfp_enabled)
350
- return 1;
351
- q = (insn & (1 << 6)) != 0;
352
- u = (insn >> 24) & 1;
353
- VFP_DREG_D(rd, insn);
354
- VFP_DREG_M(rm, insn);
355
- size = (insn >> 20) & 3;
356
-
357
- if ((insn & (1 << 23)) == 0) {
358
- /* Three register same length: handled by decodetree */
359
- return 1;
360
- } else if (insn & (1 << 4)) {
361
- /* Two registers and shift or reg and imm: handled by decodetree */
362
- return 1;
363
- } else { /* (insn & 0x00800010 == 0x00800000) */
364
- if (size != 3) {
365
- /*
366
- * Three registers of different lengths, or two registers and
367
- * a scalar: handled by decodetree
368
- */
369
- return 1;
370
- } else { /* size == 3 */
371
- if (!u) {
372
- /* Extract: handled by decodetree */
373
- return 1;
374
- } else if ((insn & (1 << 11)) == 0) {
375
- /* Two register misc. */
376
- op = ((insn >> 12) & 0x30) | ((insn >> 7) & 0xf);
377
- size = (insn >> 18) & 3;
378
- /* UNDEF for unknown op values and bad op-size combinations */
379
- if ((neon_2rm_sizes[op] & (1 << size)) == 0) {
380
- return 1;
381
- }
382
- if (q && ((rm | rd) & 1)) {
383
- return 1;
384
- }
385
- switch (op) {
386
- case NEON_2RM_VREV64:
387
- case NEON_2RM_VPADDL: case NEON_2RM_VPADDL_U:
388
- case NEON_2RM_VPADAL: case NEON_2RM_VPADAL_U:
389
- case NEON_2RM_VUZP:
390
- case NEON_2RM_VZIP:
391
- case NEON_2RM_VMOVN: case NEON_2RM_VQMOVN:
392
- case NEON_2RM_VSHLL:
393
- case NEON_2RM_VCVT_F16_F32:
394
- case NEON_2RM_VCVT_F32_F16:
395
- case NEON_2RM_VMVN:
396
- case NEON_2RM_VNEG:
397
- case NEON_2RM_VABS:
398
- case NEON_2RM_VCEQ0:
399
- case NEON_2RM_VCGT0:
400
- case NEON_2RM_VCLE0:
401
- case NEON_2RM_VCGE0:
402
- case NEON_2RM_VCLT0:
403
- case NEON_2RM_AESE: case NEON_2RM_AESMC:
404
- case NEON_2RM_SHA1H:
405
- case NEON_2RM_SHA1SU1:
406
- case NEON_2RM_VREV32:
407
- case NEON_2RM_VREV16:
408
- case NEON_2RM_VCLS:
409
- case NEON_2RM_VCLZ:
410
- case NEON_2RM_VCNT:
411
- case NEON_2RM_VABS_F:
412
- case NEON_2RM_VNEG_F:
413
- case NEON_2RM_VRECPE:
414
- case NEON_2RM_VRSQRTE:
415
- case NEON_2RM_VQABS:
416
- case NEON_2RM_VQNEG:
417
- case NEON_2RM_VRECPE_F:
418
- case NEON_2RM_VRSQRTE_F:
419
- case NEON_2RM_VCVT_FS:
420
- case NEON_2RM_VCVT_FU:
421
- case NEON_2RM_VCVT_SF:
422
- case NEON_2RM_VCVT_UF:
423
- case NEON_2RM_VRINTX:
424
- case NEON_2RM_VCGT0_F:
425
- case NEON_2RM_VCGE0_F:
426
- case NEON_2RM_VCEQ0_F:
427
- case NEON_2RM_VCLE0_F:
428
- case NEON_2RM_VCLT0_F:
429
- case NEON_2RM_VRINTN:
430
- case NEON_2RM_VRINTA:
431
- case NEON_2RM_VRINTM:
432
- case NEON_2RM_VRINTP:
433
- case NEON_2RM_VRINTZ:
434
- case NEON_2RM_VCVTAU:
435
- case NEON_2RM_VCVTAS:
436
- case NEON_2RM_VCVTNU:
437
- case NEON_2RM_VCVTNS:
438
- case NEON_2RM_VCVTPU:
439
- case NEON_2RM_VCVTPS:
440
- case NEON_2RM_VCVTMU:
441
- case NEON_2RM_VCVTMS:
442
- case NEON_2RM_VSWP:
443
- /* handled by decodetree */
444
- return 1;
445
- case NEON_2RM_VTRN:
446
- if (size == 2) {
447
- int n;
448
- for (n = 0; n < (q ? 4 : 2); n += 2) {
449
- tmp = neon_load_reg(rm, n);
450
- tmp2 = neon_load_reg(rd, n + 1);
451
- neon_store_reg(rm, n, tmp2);
452
- neon_store_reg(rd, n + 1, tmp);
453
- }
454
- } else {
455
- goto elementwise;
456
- }
457
- break;
458
-
459
- default:
460
- elementwise:
461
- for (pass = 0; pass < (q ? 4 : 2); pass++) {
462
- tmp = neon_load_reg(rm, pass);
463
- switch (op) {
464
- case NEON_2RM_VTRN:
465
- tmp2 = neon_load_reg(rd, pass);
466
- switch (size) {
467
- case 0: gen_neon_trn_u8(tmp, tmp2); break;
468
- case 1: gen_neon_trn_u16(tmp, tmp2); break;
469
- default: abort();
470
- }
471
- neon_store_reg(rm, pass, tmp2);
472
- break;
473
- default:
474
- /* Reserved op values were caught by the
475
- * neon_2rm_sizes[] check earlier.
476
- */
477
- abort();
478
- }
479
- neon_store_reg(rd, pass, tmp);
480
- }
481
- break;
482
- }
483
- } else {
484
- /* VTBL, VTBX, VDUP: handled by decodetree */
485
- return 1;
486
- }
487
- }
488
- }
489
- return 0;
490
-}
285
-}
491
-
286
-
492
static int disas_coproc_insn(DisasContext *s, uint32_t insn)
287
-type_init(pvpanic_register_types)
493
{
288
diff --git a/hw/i386/Kconfig b/hw/i386/Kconfig
494
int cpnum, is64, crn, crm, opc1, opc2, isread, rt, rt2;
289
index XXXXXXX..XXXXXXX 100644
495
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
290
--- a/hw/i386/Kconfig
496
}
291
+++ b/hw/i386/Kconfig
497
/* fall back to legacy decoder */
292
@@ -XXX,XX +XXX,XX @@ config PC
498
293
imply ISA_DEBUG
499
- if (((insn >> 25) & 7) == 1) {
294
imply PARALLEL
500
- /* NEON Data processing. */
295
imply PCI_DEVICES
501
- if (disas_neon_data_insn(s, insn)) {
296
- imply PVPANIC
502
- goto illegal_op;
297
+ imply PVPANIC_ISA
503
- }
298
imply QXL
504
- return;
299
imply SEV
505
- }
300
imply SGA
506
if ((insn & 0x0e000f00) == 0x0c000100) {
301
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
507
if (arm_dc_feature(s, ARM_FEATURE_IWMMXT)) {
302
index XXXXXXX..XXXXXXX 100644
508
/* iWMMXt register transfer. */
303
--- a/hw/misc/Kconfig
509
@@ -XXX,XX +XXX,XX @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
304
+++ b/hw/misc/Kconfig
510
break;
305
@@ -XXX,XX +XXX,XX @@ config IOTKIT_SYSCTL
511
}
306
config IOTKIT_SYSINFO
512
if (((insn >> 24) & 3) == 3) {
307
bool
513
- /* Translate into the equivalent ARM encoding. */
308
514
- insn = (insn & 0xe2ffffff) | ((insn & (1 << 28)) >> 4) | (1 << 28);
309
-config PVPANIC
515
- if (disas_neon_data_insn(s, insn)) {
310
+config PVPANIC_COMMON
516
- goto illegal_op;
311
+ bool
517
- }
312
+
518
+ /* Neon DP, but failed disas_neon_dp() */
313
+config PVPANIC_ISA
519
+ goto illegal_op;
314
bool
520
} else if (((insn >> 8) & 0xe) == 10) {
315
depends on ISA_BUS
521
/* VFP, but failed disas_vfp. */
316
+ select PVPANIC_COMMON
522
goto illegal_op;
317
318
config AUX
319
bool
320
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
321
index XXXXXXX..XXXXXXX 100644
322
--- a/hw/misc/meson.build
323
+++ b/hw/misc/meson.build
324
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_EMC141X', if_true: files('emc141x.c'))
325
softmmu_ss.add(when: 'CONFIG_UNIMP', if_true: files('unimp.c'))
326
softmmu_ss.add(when: 'CONFIG_EMPTY_SLOT', if_true: files('empty_slot.c'))
327
softmmu_ss.add(when: 'CONFIG_LED', if_true: files('led.c'))
328
+softmmu_ss.add(when: 'CONFIG_PVPANIC_COMMON', if_true: files('pvpanic.c'))
329
330
# ARM devices
331
softmmu_ss.add(when: 'CONFIG_PL310', if_true: files('arm_l2x0.c'))
332
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_IOTKIT_SYSINFO', if_true: files('iotkit-sysinfo.c')
333
softmmu_ss.add(when: 'CONFIG_ARMSSE_CPUID', if_true: files('armsse-cpuid.c'))
334
softmmu_ss.add(when: 'CONFIG_ARMSSE_MHU', if_true: files('armsse-mhu.c'))
335
336
-softmmu_ss.add(when: 'CONFIG_PVPANIC', if_true: files('pvpanic.c'))
337
+softmmu_ss.add(when: 'CONFIG_PVPANIC_ISA', if_true: files('pvpanic-isa.c'))
338
softmmu_ss.add(when: 'CONFIG_AUX', if_true: files('auxbus.c'))
339
softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_scu.c', 'aspeed_sdmc.c', 'aspeed_xdma.c'))
340
softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-sysreg.c'))
341
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
342
index XXXXXXX..XXXXXXX 100644
343
--- a/tests/qtest/meson.build
344
+++ b/tests/qtest/meson.build
345
@@ -XXX,XX +XXX,XX @@ qtests_i386 = \
346
(config_host.has_key('CONFIG_LINUX') and \
347
config_all_devices.has_key('CONFIG_ISA_IPMI_BT') ? ['ipmi-bt-test'] : []) + \
348
(config_all_devices.has_key('CONFIG_WDT_IB700') ? ['wdt_ib700-test'] : []) + \
349
- (config_all_devices.has_key('CONFIG_PVPANIC') ? ['pvpanic-test'] : []) + \
350
+ (config_all_devices.has_key('CONFIG_PVPANIC_ISA') ? ['pvpanic-test'] : []) + \
351
(config_all_devices.has_key('CONFIG_HDA') ? ['intel-hda-test'] : []) + \
352
(config_all_devices.has_key('CONFIG_I82801B11') ? ['i82801b11-test'] : []) + \
353
(config_all_devices.has_key('CONFIG_IOH3420') ? ['ioh3420-test'] : []) + \
523
--
354
--
524
2.20.1
355
2.20.1
525
356
526
357
diff view generated by jsdifflib
1
Convert the remaining ops in the Neon 2-reg-misc group which
1
From: Mihai Carabas <mihai.carabas@oracle.com>
2
can be implemented simply with our do_2misc() helper.
3
2
3
Add PCI interface support for PVPANIC device. Create a new file pvpanic-pci.c
4
where the PCI specific routines reside and update the build system with the new
5
files and config structure.
6
7
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
8
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20200616170844.13318-14-peter.maydell@linaro.org
7
---
12
---
8
target/arm/neon-dp.decode | 10 +++++
13
docs/specs/pci-ids.txt | 1 +
9
target/arm/translate-neon.inc.c | 69 +++++++++++++++++++++++++++++++++
14
include/hw/misc/pvpanic.h | 1 +
10
target/arm/translate.c | 38 ++++--------------
15
include/hw/pci/pci.h | 1 +
11
3 files changed, 86 insertions(+), 31 deletions(-)
16
hw/misc/pvpanic-pci.c | 94 +++++++++++++++++++++++++++++++++++++++
17
hw/misc/Kconfig | 6 +++
18
hw/misc/meson.build | 1 +
19
6 files changed, 104 insertions(+)
20
create mode 100644 hw/misc/pvpanic-pci.c
12
21
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
22
diff --git a/docs/specs/pci-ids.txt b/docs/specs/pci-ids.txt
14
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
24
--- a/docs/specs/pci-ids.txt
16
+++ b/target/arm/neon-dp.decode
25
+++ b/docs/specs/pci-ids.txt
17
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
26
@@ -XXX,XX +XXX,XX @@ PCI devices (other than virtio):
18
AESMC 1111 001 11 . 11 .. 00 .... 0 0111 0 . 0 .... @2misc_q1
27
1b36:000d PCI xhci usb host adapter
19
AESIMC 1111 001 11 . 11 .. 00 .... 0 0111 1 . 0 .... @2misc_q1
28
1b36:000f mdpy (mdev sample device), linux/samples/vfio-mdev/mdpy.c
20
29
1b36:0010 PCIe NVMe device (-device nvme)
21
+ VCLS 1111 001 11 . 11 .. 00 .... 0 1000 . . 0 .... @2misc
30
+1b36:0011 PCI PVPanic device (-device pvpanic-pci)
22
+ VCLZ 1111 001 11 . 11 .. 00 .... 0 1001 . . 0 .... @2misc
31
23
+ VCNT 1111 001 11 . 11 .. 00 .... 0 1010 . . 0 .... @2misc
32
All these devices are documented in docs/specs.
33
34
diff --git a/include/hw/misc/pvpanic.h b/include/hw/misc/pvpanic.h
35
index XXXXXXX..XXXXXXX 100644
36
--- a/include/hw/misc/pvpanic.h
37
+++ b/include/hw/misc/pvpanic.h
38
@@ -XXX,XX +XXX,XX @@
39
#include "qom/object.h"
40
41
#define TYPE_PVPANIC_ISA_DEVICE "pvpanic"
42
+#define TYPE_PVPANIC_PCI_DEVICE "pvpanic-pci"
43
44
#define PVPANIC_IOPORT_PROP "ioport"
45
46
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
47
index XXXXXXX..XXXXXXX 100644
48
--- a/include/hw/pci/pci.h
49
+++ b/include/hw/pci/pci.h
50
@@ -XXX,XX +XXX,XX @@ extern bool pci_available;
51
#define PCI_DEVICE_ID_REDHAT_PCIE_BRIDGE 0x000e
52
#define PCI_DEVICE_ID_REDHAT_MDPY 0x000f
53
#define PCI_DEVICE_ID_REDHAT_NVME 0x0010
54
+#define PCI_DEVICE_ID_REDHAT_PVPANIC 0x0011
55
#define PCI_DEVICE_ID_REDHAT_QXL 0x0100
56
57
#define FMT_PCIBUS PRIx64
58
diff --git a/hw/misc/pvpanic-pci.c b/hw/misc/pvpanic-pci.c
59
new file mode 100644
60
index XXXXXXX..XXXXXXX
61
--- /dev/null
62
+++ b/hw/misc/pvpanic-pci.c
63
@@ -XXX,XX +XXX,XX @@
64
+/*
65
+ * QEMU simulated PCI pvpanic device.
66
+ *
67
+ * Copyright (C) 2020 Oracle
68
+ *
69
+ * Authors:
70
+ * Mihai Carabas <mihai.carabas@oracle.com>
71
+ *
72
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
73
+ * See the COPYING file in the top-level directory.
74
+ *
75
+ */
24
+
76
+
25
VMVN 1111 001 11 . 11 .. 00 .... 0 1011 . . 0 .... @2misc
77
+#include "qemu/osdep.h"
26
78
+#include "qemu/log.h"
27
VPADAL_S 1111 001 11 . 11 .. 00 .... 0 1100 . . 0 .... @2misc
79
+#include "qemu/module.h"
28
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
80
+#include "sysemu/runstate.h"
29
VABS 1111 001 11 . 11 .. 01 .... 0 0110 . . 0 .... @2misc
30
VNEG 1111 001 11 . 11 .. 01 .... 0 0111 . . 0 .... @2misc
31
32
+ VABS_F 1111 001 11 . 11 .. 01 .... 0 1110 . . 0 .... @2misc
33
+ VNEG_F 1111 001 11 . 11 .. 01 .... 0 1111 . . 0 .... @2misc
34
+
81
+
35
VUZP 1111 001 11 . 11 .. 10 .... 0 0010 . . 0 .... @2misc
82
+#include "hw/nvram/fw_cfg.h"
36
VZIP 1111 001 11 . 11 .. 10 .... 0 0011 . . 0 .... @2misc
83
+#include "hw/qdev-properties.h"
37
84
+#include "migration/vmstate.h"
38
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
85
+#include "hw/misc/pvpanic.h"
39
86
+#include "qom/object.h"
40
VCVT_F16_F32 1111 001 11 . 11 .. 10 .... 0 1100 0 . 0 .... @2misc_q0
87
+#include "hw/pci/pci.h"
41
VCVT_F32_F16 1111 001 11 . 11 .. 10 .... 0 1110 0 . 0 .... @2misc_q0
42
+
88
+
43
+ VRECPE 1111 001 11 . 11 .. 11 .... 0 1000 . . 0 .... @2misc
89
+OBJECT_DECLARE_SIMPLE_TYPE(PVPanicPCIState, PVPANIC_PCI_DEVICE)
44
+ VRSQRTE 1111 001 11 . 11 .. 11 .... 0 1001 . . 0 .... @2misc
45
]
46
47
# Subgroup for size != 0b11
48
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/arm/translate-neon.inc.c
51
+++ b/target/arm/translate-neon.inc.c
52
@@ -XXX,XX +XXX,XX @@ static bool trans_VREV16(DisasContext *s, arg_2misc *a)
53
}
54
return do_2misc(s, a, gen_rev16);
55
}
56
+
90
+
57
+static bool trans_VCLS(DisasContext *s, arg_2misc *a)
91
+/*
92
+ * PVPanicPCIState for PCI device
93
+ */
94
+typedef struct PVPanicPCIState {
95
+ PCIDevice dev;
96
+ PVPanicState pvpanic;
97
+} PVPanicPCIState;
98
+
99
+static const VMStateDescription vmstate_pvpanic_pci = {
100
+ .name = "pvpanic-pci",
101
+ .version_id = 1,
102
+ .minimum_version_id = 1,
103
+ .fields = (VMStateField[]) {
104
+ VMSTATE_PCI_DEVICE(dev, PVPanicPCIState),
105
+ VMSTATE_END_OF_LIST()
106
+ }
107
+};
108
+
109
+static void pvpanic_pci_realizefn(PCIDevice *dev, Error **errp)
58
+{
110
+{
59
+ static NeonGenOneOpFn * const fn[] = {
111
+ PVPanicPCIState *s = PVPANIC_PCI_DEVICE(dev);
60
+ gen_helper_neon_cls_s8,
112
+ PVPanicState *ps = &s->pvpanic;
61
+ gen_helper_neon_cls_s16,
113
+
62
+ gen_helper_neon_cls_s32,
114
+ pvpanic_setup_io(&s->pvpanic, DEVICE(s), 2);
63
+ NULL,
115
+
64
+ };
116
+ pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &ps->mr);
65
+ return do_2misc(s, a, fn[a->size]);
66
+}
117
+}
67
+
118
+
68
+static void do_VCLZ_32(TCGv_i32 rd, TCGv_i32 rm)
119
+static Property pvpanic_pci_properties[] = {
120
+ DEFINE_PROP_UINT8("events", PVPanicPCIState, pvpanic.events, PVPANIC_PANICKED | PVPANIC_CRASHLOADED),
121
+ DEFINE_PROP_END_OF_LIST(),
122
+};
123
+
124
+static void pvpanic_pci_class_init(ObjectClass *klass, void *data)
69
+{
125
+{
70
+ tcg_gen_clzi_i32(rd, rm, 32);
126
+ DeviceClass *dc = DEVICE_CLASS(klass);
127
+ PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
128
+
129
+ device_class_set_props(dc, pvpanic_pci_properties);
130
+
131
+ pc->realize = pvpanic_pci_realizefn;
132
+ pc->vendor_id = PCI_VENDOR_ID_REDHAT;
133
+ pc->device_id = PCI_DEVICE_ID_REDHAT_PVPANIC;
134
+ pc->revision = 1;
135
+ pc->class_id = PCI_CLASS_SYSTEM_OTHER;
136
+ dc->vmsd = &vmstate_pvpanic_pci;
137
+
138
+ set_bit(DEVICE_CATEGORY_MISC, dc->categories);
71
+}
139
+}
72
+
140
+
73
+static bool trans_VCLZ(DisasContext *s, arg_2misc *a)
141
+static TypeInfo pvpanic_pci_info = {
142
+ .name = TYPE_PVPANIC_PCI_DEVICE,
143
+ .parent = TYPE_PCI_DEVICE,
144
+ .instance_size = sizeof(PVPanicPCIState),
145
+ .class_init = pvpanic_pci_class_init,
146
+ .interfaces = (InterfaceInfo[]) {
147
+ { INTERFACE_CONVENTIONAL_PCI_DEVICE },
148
+ { }
149
+ }
150
+};
151
+
152
+static void pvpanic_register_types(void)
74
+{
153
+{
75
+ static NeonGenOneOpFn * const fn[] = {
154
+ type_register_static(&pvpanic_pci_info);
76
+ gen_helper_neon_clz_u8,
77
+ gen_helper_neon_clz_u16,
78
+ do_VCLZ_32,
79
+ NULL,
80
+ };
81
+ return do_2misc(s, a, fn[a->size]);
82
+}
155
+}
83
+
156
+
84
+static bool trans_VCNT(DisasContext *s, arg_2misc *a)
157
+type_init(pvpanic_register_types);
85
+{
158
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
86
+ if (a->size != 0) {
159
index XXXXXXX..XXXXXXX 100644
87
+ return false;
160
--- a/hw/misc/Kconfig
88
+ }
161
+++ b/hw/misc/Kconfig
89
+ return do_2misc(s, a, gen_helper_neon_cnt_u8);
162
@@ -XXX,XX +XXX,XX @@ config IOTKIT_SYSINFO
90
+}
163
config PVPANIC_COMMON
164
bool
165
166
+config PVPANIC_PCI
167
+ bool
168
+ default y if PCI_DEVICES
169
+ depends on PCI
170
+ select PVPANIC_COMMON
91
+
171
+
92
+static bool trans_VABS_F(DisasContext *s, arg_2misc *a)
172
config PVPANIC_ISA
93
+{
173
bool
94
+ if (a->size != 2) {
174
depends on ISA_BUS
95
+ return false;
175
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
96
+ }
97
+ /* TODO: FP16 : size == 1 */
98
+ return do_2misc(s, a, gen_helper_vfp_abss);
99
+}
100
+
101
+static bool trans_VNEG_F(DisasContext *s, arg_2misc *a)
102
+{
103
+ if (a->size != 2) {
104
+ return false;
105
+ }
106
+ /* TODO: FP16 : size == 1 */
107
+ return do_2misc(s, a, gen_helper_vfp_negs);
108
+}
109
+
110
+static bool trans_VRECPE(DisasContext *s, arg_2misc *a)
111
+{
112
+ if (a->size != 2) {
113
+ return false;
114
+ }
115
+ return do_2misc(s, a, gen_helper_recpe_u32);
116
+}
117
+
118
+static bool trans_VRSQRTE(DisasContext *s, arg_2misc *a)
119
+{
120
+ if (a->size != 2) {
121
+ return false;
122
+ }
123
+ return do_2misc(s, a, gen_helper_rsqrte_u32);
124
+}
125
diff --git a/target/arm/translate.c b/target/arm/translate.c
126
index XXXXXXX..XXXXXXX 100644
176
index XXXXXXX..XXXXXXX 100644
127
--- a/target/arm/translate.c
177
--- a/hw/misc/meson.build
128
+++ b/target/arm/translate.c
178
+++ b/hw/misc/meson.build
129
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
179
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ARMSSE_CPUID', if_true: files('armsse-cpuid.c'))
130
case NEON_2RM_SHA1SU1:
180
softmmu_ss.add(when: 'CONFIG_ARMSSE_MHU', if_true: files('armsse-mhu.c'))
131
case NEON_2RM_VREV32:
181
132
case NEON_2RM_VREV16:
182
softmmu_ss.add(when: 'CONFIG_PVPANIC_ISA', if_true: files('pvpanic-isa.c'))
133
+ case NEON_2RM_VCLS:
183
+softmmu_ss.add(when: 'CONFIG_PVPANIC_PCI', if_true: files('pvpanic-pci.c'))
134
+ case NEON_2RM_VCLZ:
184
softmmu_ss.add(when: 'CONFIG_AUX', if_true: files('auxbus.c'))
135
+ case NEON_2RM_VCNT:
185
softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_scu.c', 'aspeed_sdmc.c', 'aspeed_xdma.c'))
136
+ case NEON_2RM_VABS_F:
186
softmmu_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-sysreg.c'))
137
+ case NEON_2RM_VNEG_F:
138
+ case NEON_2RM_VRECPE:
139
+ case NEON_2RM_VRSQRTE:
140
/* handled by decodetree */
141
return 1;
142
case NEON_2RM_VTRN:
143
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
144
for (pass = 0; pass < (q ? 4 : 2); pass++) {
145
tmp = neon_load_reg(rm, pass);
146
switch (op) {
147
- case NEON_2RM_VCLS:
148
- switch (size) {
149
- case 0: gen_helper_neon_cls_s8(tmp, tmp); break;
150
- case 1: gen_helper_neon_cls_s16(tmp, tmp); break;
151
- case 2: gen_helper_neon_cls_s32(tmp, tmp); break;
152
- default: abort();
153
- }
154
- break;
155
- case NEON_2RM_VCLZ:
156
- switch (size) {
157
- case 0: gen_helper_neon_clz_u8(tmp, tmp); break;
158
- case 1: gen_helper_neon_clz_u16(tmp, tmp); break;
159
- case 2: tcg_gen_clzi_i32(tmp, tmp, 32); break;
160
- default: abort();
161
- }
162
- break;
163
- case NEON_2RM_VCNT:
164
- gen_helper_neon_cnt_u8(tmp, tmp);
165
- break;
166
case NEON_2RM_VQABS:
167
switch (size) {
168
case 0:
169
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
170
tcg_temp_free_ptr(fpstatus);
171
break;
172
}
173
- case NEON_2RM_VABS_F:
174
- gen_helper_vfp_abss(tmp, tmp);
175
- break;
176
- case NEON_2RM_VNEG_F:
177
- gen_helper_vfp_negs(tmp, tmp);
178
- break;
179
case NEON_2RM_VSWP:
180
tmp2 = neon_load_reg(rd, pass);
181
neon_store_reg(rm, pass, tmp2);
182
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
183
tcg_temp_free_ptr(fpst);
184
break;
185
}
186
- case NEON_2RM_VRECPE:
187
- gen_helper_recpe_u32(tmp, tmp);
188
- break;
189
- case NEON_2RM_VRSQRTE:
190
- gen_helper_rsqrte_u32(tmp, tmp);
191
- break;
192
case NEON_2RM_VRECPE_F:
193
{
194
TCGv_ptr fpstatus = get_fpstatus_ptr(1);
195
--
187
--
196
2.20.1
188
2.20.1
197
189
198
190
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Mihai Carabas <mihai.carabas@oracle.com>
2
2
3
By using the TYPE_* definitions for devices, we can:
3
Add pvpanic PCI device support details in docs/specs/pvpanic.txt.
4
- quickly find where devices are used with 'git-grep'
5
- easily rename a device (one-line change).
6
4
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
8
Message-id: 20200617072539.32686-6-f4bug@amsat.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
8
---
12
hw/arm/realview.c | 3 ++-
9
docs/specs/pvpanic.txt | 13 ++++++++++++-
13
hw/arm/versatilepb.c | 3 ++-
10
1 file changed, 12 insertions(+), 1 deletion(-)
14
hw/arm/vexpress.c | 3 ++-
15
3 files changed, 6 insertions(+), 3 deletions(-)
16
11
17
diff --git a/hw/arm/realview.c b/hw/arm/realview.c
12
diff --git a/docs/specs/pvpanic.txt b/docs/specs/pvpanic.txt
18
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/realview.c
14
--- a/docs/specs/pvpanic.txt
20
+++ b/hw/arm/realview.c
15
+++ b/docs/specs/pvpanic.txt
21
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@
22
#include "hw/cpu/a9mpcore.h"
17
PVPANIC DEVICE
23
#include "hw/intc/realview_gic.h"
18
==============
24
#include "hw/irq.h"
19
25
+#include "hw/i2c/arm_sbcon_i2c.h"
20
-pvpanic device is a simulated ISA device, through which a guest panic
26
21
+pvpanic device is a simulated device, through which a guest panic
27
#define SMP_BOOT_ADDR 0xe0000000
22
event is sent to qemu, and a QMP event is generated. This allows
28
#define SMP_BOOTREG_ADDR 0x10000030
23
management apps (e.g. libvirt) to be notified and respond to the event.
29
@@ -XXX,XX +XXX,XX @@ static void realview_init(MachineState *machine,
24
30
}
25
@@ -XXX,XX +XXX,XX @@ The management app has the option of waiting for GUEST_PANICKED events,
31
}
26
and/or polling for guest-panicked RunState, to learn when the pvpanic
32
27
device has fired a panic event.
33
- dev = sysbus_create_simple("versatile_i2c", 0x10002000, NULL);
28
34
+ dev = sysbus_create_simple(TYPE_VERSATILE_I2C, 0x10002000, NULL);
29
+The pvpanic device can be implemented as an ISA device (using IOPORT) or as a
35
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
30
+PCI device.
36
i2c_create_slave(i2c, "ds1338", 0x68);
31
+
37
32
ISA Interface
38
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
33
-------------
39
index XXXXXXX..XXXXXXX 100644
34
40
--- a/hw/arm/versatilepb.c
35
@@ -XXX,XX +XXX,XX @@ bit 1: a guest panic has happened and will be handled by the guest;
41
+++ b/hw/arm/versatilepb.c
36
the host should record it or report it, but should not affect
42
@@ -XXX,XX +XXX,XX @@
37
the execution of the guest.
43
#include "sysemu/sysemu.h"
38
44
#include "hw/pci/pci.h"
39
+PCI Interface
45
#include "hw/i2c/i2c.h"
40
+-------------
46
+#include "hw/i2c/arm_sbcon_i2c.h"
41
+
47
#include "hw/irq.h"
42
+The PCI interface is similar to the ISA interface except that it uses an MMIO
48
#include "hw/boards.h"
43
+address space provided by its BAR0, 1 byte long. Any machine with a PCI bus
49
#include "exec/address-spaces.h"
44
+can enable a pvpanic device by adding '-device pvpanic-pci' to the command
50
@@ -XXX,XX +XXX,XX @@ static void versatile_init(MachineState *machine, int board_id)
45
+line.
51
/* Add PL031 Real Time Clock. */
46
+
52
sysbus_create_simple("pl031", 0x101e8000, pic[10]);
47
ACPI Interface
53
48
--------------
54
- dev = sysbus_create_simple("versatile_i2c", 0x10002000, NULL);
55
+ dev = sysbus_create_simple(TYPE_VERSATILE_I2C, 0x10002000, NULL);
56
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
57
i2c_create_slave(i2c, "ds1338", 0x68);
58
59
diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/arm/vexpress.c
62
+++ b/hw/arm/vexpress.c
63
@@ -XXX,XX +XXX,XX @@
64
#include "hw/char/pl011.h"
65
#include "hw/cpu/a9mpcore.h"
66
#include "hw/cpu/a15mpcore.h"
67
+#include "hw/i2c/arm_sbcon_i2c.h"
68
69
#define VEXPRESS_BOARD_ID 0x8e0
70
#define VEXPRESS_FLASH_SIZE (64 * 1024 * 1024)
71
@@ -XXX,XX +XXX,XX @@ static void vexpress_common_init(MachineState *machine)
72
sysbus_create_simple("sp804", map[VE_TIMER01], pic[2]);
73
sysbus_create_simple("sp804", map[VE_TIMER23], pic[3]);
74
75
- dev = sysbus_create_simple("versatile_i2c", map[VE_SERIALDVI], NULL);
76
+ dev = sysbus_create_simple(TYPE_VERSATILE_I2C, map[VE_SERIALDVI], NULL);
77
i2c = (I2CBus *)qdev_get_child_bus(dev, "i2c");
78
i2c_create_slave(i2c, "sii9022", 0x39);
79
49
80
--
50
--
81
2.20.1
51
2.20.1
82
52
83
53
diff view generated by jsdifflib
1
Convert the VCVT instructions in the 2-reg-misc grouping to
1
From: Mihai Carabas <mihai.carabas@oracle.com>
2
decodetree.
3
2
3
Add a test case for pvpanic-pci device. The scenario is the same as pvpanic
4
ISA device, but is using the PCI bus.
5
6
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
7
Acked-by: Thomas Huth <thuth@redhat.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20200616170844.13318-19-peter.maydell@linaro.org
7
---
11
---
8
target/arm/neon-dp.decode | 9 +++++
12
tests/qtest/pvpanic-pci-test.c | 94 ++++++++++++++++++++++++++++++++++
9
target/arm/translate-neon.inc.c | 70 +++++++++++++++++++++++++++++++++
13
tests/qtest/meson.build | 1 +
10
target/arm/translate.c | 70 ++++-----------------------------
14
2 files changed, 95 insertions(+)
11
3 files changed, 87 insertions(+), 62 deletions(-)
15
create mode 100644 tests/qtest/pvpanic-pci-test.c
12
16
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
17
diff --git a/tests/qtest/pvpanic-pci-test.c b/tests/qtest/pvpanic-pci-test.c
14
index XXXXXXX..XXXXXXX 100644
18
new file mode 100644
15
--- a/target/arm/neon-dp.decode
19
index XXXXXXX..XXXXXXX
16
+++ b/target/arm/neon-dp.decode
20
--- /dev/null
17
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
21
+++ b/tests/qtest/pvpanic-pci-test.c
18
22
@@ -XXX,XX +XXX,XX @@
19
VRINTP 1111 001 11 . 11 .. 10 .... 0 1111 . . 0 .... @2misc
23
+/*
20
24
+ * QTest testcase for PV Panic PCI device
21
+ VCVTAS 1111 001 11 . 11 .. 11 .... 0 0000 . . 0 .... @2misc
25
+ *
22
+ VCVTAU 1111 001 11 . 11 .. 11 .... 0 0001 . . 0 .... @2misc
26
+ * Copyright (C) 2020 Oracle
23
+ VCVTNS 1111 001 11 . 11 .. 11 .... 0 0010 . . 0 .... @2misc
27
+ *
24
+ VCVTNU 1111 001 11 . 11 .. 11 .... 0 0011 . . 0 .... @2misc
28
+ * Authors:
25
+ VCVTPS 1111 001 11 . 11 .. 11 .... 0 0100 . . 0 .... @2misc
29
+ * Mihai Carabas <mihai.carabas@oracle.com>
26
+ VCVTPU 1111 001 11 . 11 .. 11 .... 0 0101 . . 0 .... @2misc
30
+ *
27
+ VCVTMS 1111 001 11 . 11 .. 11 .... 0 0110 . . 0 .... @2misc
31
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
28
+ VCVTMU 1111 001 11 . 11 .. 11 .... 0 0111 . . 0 .... @2misc
32
+ * See the COPYING file in the top-level directory.
33
+ *
34
+ */
29
+
35
+
30
VRECPE 1111 001 11 . 11 .. 11 .... 0 1000 . . 0 .... @2misc
36
+#include "qemu/osdep.h"
31
VRSQRTE 1111 001 11 . 11 .. 11 .... 0 1001 . . 0 .... @2misc
37
+#include "libqos/libqtest.h"
32
VRECPE_F 1111 001 11 . 11 .. 11 .... 0 1010 . . 0 .... @2misc
38
+#include "qapi/qmp/qdict.h"
33
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
39
+#include "libqos/pci.h"
34
index XXXXXXX..XXXXXXX 100644
40
+#include "libqos/pci-pc.h"
35
--- a/target/arm/translate-neon.inc.c
41
+#include "hw/pci/pci_regs.h"
36
+++ b/target/arm/translate-neon.inc.c
37
@@ -XXX,XX +XXX,XX @@ DO_VRINT(VRINTA, FPROUNDING_TIEAWAY)
38
DO_VRINT(VRINTZ, FPROUNDING_ZERO)
39
DO_VRINT(VRINTM, FPROUNDING_NEGINF)
40
DO_VRINT(VRINTP, FPROUNDING_POSINF)
41
+
42
+
42
+static bool do_vcvt(DisasContext *s, arg_2misc *a, int rmode, bool is_signed)
43
+static void test_panic_nopause(void)
43
+{
44
+{
44
+ /*
45
+ uint8_t val;
45
+ * Handle a VCVT* operation by iterating 32 bits at a time,
46
+ QDict *response, *data;
46
+ * with a specified rounding mode in operation.
47
+ QTestState *qts;
47
+ */
48
+ QPCIBus *pcibus;
48
+ int pass;
49
+ QPCIDevice *dev;
49
+ TCGv_ptr fpst;
50
+ QPCIBar bar;
50
+ TCGv_i32 tcg_rmode, tcg_shift;
51
+
51
+
52
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON) ||
52
+ qts = qtest_init("-device pvpanic-pci,addr=04.0 -action panic=none");
53
+ !arm_dc_feature(s, ARM_FEATURE_V8)) {
53
+ pcibus = qpci_new_pc(qts, NULL);
54
+ return false;
54
+ dev = qpci_device_find(pcibus, QPCI_DEVFN(0x4, 0x0));
55
+ }
55
+ qpci_device_enable(dev);
56
+ bar = qpci_iomap(dev, 0, NULL);
56
+
57
+
57
+ /* UNDEF accesses to D16-D31 if they don't exist. */
58
+ qpci_memread(dev, bar, 0, &val, sizeof(val));
58
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
59
+ g_assert_cmpuint(val, ==, 3);
59
+ ((a->vd | a->vm) & 0x10)) {
60
+ return false;
61
+ }
62
+
60
+
63
+ if (a->size != 2) {
61
+ val = 1;
64
+ /* TODO: FP16 will be the size == 1 case */
62
+ qpci_memwrite(dev, bar, 0, &val, sizeof(val));
65
+ return false;
66
+ }
67
+
63
+
68
+ if ((a->vd | a->vm) & a->q) {
64
+ response = qtest_qmp_eventwait_ref(qts, "GUEST_PANICKED");
69
+ return false;
65
+ g_assert(qdict_haskey(response, "data"));
70
+ }
66
+ data = qdict_get_qdict(response, "data");
67
+ g_assert(qdict_haskey(data, "action"));
68
+ g_assert_cmpstr(qdict_get_str(data, "action"), ==, "run");
69
+ qobject_unref(response);
71
+
70
+
72
+ if (!vfp_access_check(s)) {
71
+ qtest_quit(qts);
73
+ return true;
74
+ }
75
+
76
+ fpst = get_fpstatus_ptr(1);
77
+ tcg_shift = tcg_const_i32(0);
78
+ tcg_rmode = tcg_const_i32(arm_rmode_to_sf(rmode));
79
+ gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode, cpu_env);
80
+ for (pass = 0; pass < (a->q ? 4 : 2); pass++) {
81
+ TCGv_i32 tmp = neon_load_reg(a->vm, pass);
82
+ if (is_signed) {
83
+ gen_helper_vfp_tosls(tmp, tmp, tcg_shift, fpst);
84
+ } else {
85
+ gen_helper_vfp_touls(tmp, tmp, tcg_shift, fpst);
86
+ }
87
+ neon_store_reg(a->vd, pass, tmp);
88
+ }
89
+ gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode, cpu_env);
90
+ tcg_temp_free_i32(tcg_rmode);
91
+ tcg_temp_free_i32(tcg_shift);
92
+ tcg_temp_free_ptr(fpst);
93
+
94
+ return true;
95
+}
72
+}
96
+
73
+
97
+#define DO_VCVT(INSN, RMODE, SIGNED) \
74
+static void test_panic(void)
98
+ static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
75
+{
99
+ { \
76
+ uint8_t val;
100
+ return do_vcvt(s, a, RMODE, SIGNED); \
77
+ QDict *response, *data;
101
+ }
78
+ QTestState *qts;
79
+ QPCIBus *pcibus;
80
+ QPCIDevice *dev;
81
+ QPCIBar bar;
102
+
82
+
103
+DO_VCVT(VCVTAU, FPROUNDING_TIEAWAY, false)
83
+ qts = qtest_init("-device pvpanic-pci,addr=04.0 -action panic=pause");
104
+DO_VCVT(VCVTAS, FPROUNDING_TIEAWAY, true)
84
+ pcibus = qpci_new_pc(qts, NULL);
105
+DO_VCVT(VCVTNU, FPROUNDING_TIEEVEN, false)
85
+ dev = qpci_device_find(pcibus, QPCI_DEVFN(0x4, 0x0));
106
+DO_VCVT(VCVTNS, FPROUNDING_TIEEVEN, true)
86
+ qpci_device_enable(dev);
107
+DO_VCVT(VCVTPU, FPROUNDING_POSINF, false)
87
+ bar = qpci_iomap(dev, 0, NULL);
108
+DO_VCVT(VCVTPS, FPROUNDING_POSINF, true)
88
+
109
+DO_VCVT(VCVTMU, FPROUNDING_NEGINF, false)
89
+ qpci_memread(dev, bar, 0, &val, sizeof(val));
110
+DO_VCVT(VCVTMS, FPROUNDING_NEGINF, true)
90
+ g_assert_cmpuint(val, ==, 3);
111
diff --git a/target/arm/translate.c b/target/arm/translate.c
91
+
92
+ val = 1;
93
+ qpci_memwrite(dev, bar, 0, &val, sizeof(val));
94
+
95
+ response = qtest_qmp_eventwait_ref(qts, "GUEST_PANICKED");
96
+ g_assert(qdict_haskey(response, "data"));
97
+ data = qdict_get_qdict(response, "data");
98
+ g_assert(qdict_haskey(data, "action"));
99
+ g_assert_cmpstr(qdict_get_str(data, "action"), ==, "pause");
100
+ qobject_unref(response);
101
+
102
+ qtest_quit(qts);
103
+}
104
+
105
+int main(int argc, char **argv)
106
+{
107
+ int ret;
108
+
109
+ g_test_init(&argc, &argv, NULL);
110
+ qtest_add_func("/pvpanic-pci/panic", test_panic);
111
+ qtest_add_func("/pvpanic-pci/panic-nopause", test_panic_nopause);
112
+
113
+ ret = g_test_run();
114
+
115
+ return ret;
116
+}
117
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
112
index XXXXXXX..XXXXXXX 100644
118
index XXXXXXX..XXXXXXX 100644
113
--- a/target/arm/translate.c
119
--- a/tests/qtest/meson.build
114
+++ b/target/arm/translate.c
120
+++ b/tests/qtest/meson.build
115
@@ -XXX,XX +XXX,XX @@ static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
121
@@ -XXX,XX +XXX,XX @@ qtests_i386 = \
116
#define NEON_2RM_VCVT_SF 62
122
config_all_devices.has_key('CONFIG_ISA_IPMI_BT') ? ['ipmi-bt-test'] : []) + \
117
#define NEON_2RM_VCVT_UF 63
123
(config_all_devices.has_key('CONFIG_WDT_IB700') ? ['wdt_ib700-test'] : []) + \
118
124
(config_all_devices.has_key('CONFIG_PVPANIC_ISA') ? ['pvpanic-test'] : []) + \
119
-static bool neon_2rm_is_v8_op(int op)
125
+ (config_all_devices.has_key('CONFIG_PVPANIC_PCI') ? ['pvpanic-pci-test'] : []) + \
120
-{
126
(config_all_devices.has_key('CONFIG_HDA') ? ['intel-hda-test'] : []) + \
121
- /* Return true if this neon 2reg-misc op is ARMv8 and up */
127
(config_all_devices.has_key('CONFIG_I82801B11') ? ['i82801b11-test'] : []) + \
122
- switch (op) {
128
(config_all_devices.has_key('CONFIG_IOH3420') ? ['ioh3420-test'] : []) + \
123
- case NEON_2RM_VRINTN:
124
- case NEON_2RM_VRINTA:
125
- case NEON_2RM_VRINTM:
126
- case NEON_2RM_VRINTP:
127
- case NEON_2RM_VRINTZ:
128
- case NEON_2RM_VRINTX:
129
- case NEON_2RM_VCVTAU:
130
- case NEON_2RM_VCVTAS:
131
- case NEON_2RM_VCVTNU:
132
- case NEON_2RM_VCVTNS:
133
- case NEON_2RM_VCVTPU:
134
- case NEON_2RM_VCVTPS:
135
- case NEON_2RM_VCVTMU:
136
- case NEON_2RM_VCVTMS:
137
- return true;
138
- default:
139
- return false;
140
- }
141
-}
142
-
143
/* Each entry in this array has bit n set if the insn allows
144
* size value n (otherwise it will UNDEF). Since unallocated
145
* op values will have no bits set they always UNDEF.
146
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
147
if ((neon_2rm_sizes[op] & (1 << size)) == 0) {
148
return 1;
149
}
150
- if (neon_2rm_is_v8_op(op) &&
151
- !arm_dc_feature(s, ARM_FEATURE_V8)) {
152
- return 1;
153
- }
154
if (q && ((rm | rd) & 1)) {
155
return 1;
156
}
157
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
158
case NEON_2RM_VRINTM:
159
case NEON_2RM_VRINTP:
160
case NEON_2RM_VRINTZ:
161
+ case NEON_2RM_VCVTAU:
162
+ case NEON_2RM_VCVTAS:
163
+ case NEON_2RM_VCVTNU:
164
+ case NEON_2RM_VCVTNS:
165
+ case NEON_2RM_VCVTPU:
166
+ case NEON_2RM_VCVTPS:
167
+ case NEON_2RM_VCVTMU:
168
+ case NEON_2RM_VCVTMS:
169
/* handled by decodetree */
170
return 1;
171
case NEON_2RM_VTRN:
172
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
173
}
174
neon_store_reg(rm, pass, tmp2);
175
break;
176
- case NEON_2RM_VCVTAU:
177
- case NEON_2RM_VCVTAS:
178
- case NEON_2RM_VCVTNU:
179
- case NEON_2RM_VCVTNS:
180
- case NEON_2RM_VCVTPU:
181
- case NEON_2RM_VCVTPS:
182
- case NEON_2RM_VCVTMU:
183
- case NEON_2RM_VCVTMS:
184
- {
185
- bool is_signed = !extract32(insn, 7, 1);
186
- TCGv_ptr fpst = get_fpstatus_ptr(1);
187
- TCGv_i32 tcg_rmode, tcg_shift;
188
- int rmode = fp_decode_rm[extract32(insn, 8, 2)];
189
-
190
- tcg_shift = tcg_const_i32(0);
191
- tcg_rmode = tcg_const_i32(arm_rmode_to_sf(rmode));
192
- gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
193
- cpu_env);
194
-
195
- if (is_signed) {
196
- gen_helper_vfp_tosls(tmp, tmp,
197
- tcg_shift, fpst);
198
- } else {
199
- gen_helper_vfp_touls(tmp, tmp,
200
- tcg_shift, fpst);
201
- }
202
-
203
- gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
204
- cpu_env);
205
- tcg_temp_free_i32(tcg_rmode);
206
- tcg_temp_free_i32(tcg_shift);
207
- tcg_temp_free_ptr(fpst);
208
- break;
209
- }
210
default:
211
/* Reserved op values were caught by the
212
* neon_2rm_sizes[] check earlier.
213
--
129
--
214
2.20.1
130
2.20.1
215
131
216
132
diff view generated by jsdifflib
1
Convert the Neon 2-reg-misc VRINT insns to decodetree.
1
The ptimer API currently provides two methods for setting the period:
2
Giving these insns their own do_vrint() function allows us
2
ptimer_set_period(), which takes a period in nanoseconds, and
3
to change the rounding mode just once at the start and end
3
ptimer_set_freq(), which takes a frequency in Hz. Neither of these
4
rather than doing it for every element in the vector.
4
lines up nicely with the Clock API, because although both the Clock
5
and the ptimer track the frequency using a representation of whole
6
and fractional nanoseconds, conversion via either period-in-ns or
7
frequency-in-Hz will introduce a rounding error.
8
9
Add a new function ptimer_set_period_from_clock() which takes the
10
Clock object directly to avoid the rounding issues. This includes a
11
facility for the user to specify that there is a frequency divider
12
between the Clock proper and the timer, as some timer devices like
13
the CMSDK APB dualtimer need this.
14
15
To avoid having to drag in clock.h from ptimer.h we add the Clock
16
type to typedefs.h.
5
17
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Message-id: 20200616170844.13318-18-peter.maydell@linaro.org
20
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
22
Message-id: 20210128114145.20536-2-peter.maydell@linaro.org
23
Message-id: 20210121190622.22000-2-peter.maydell@linaro.org
9
---
24
---
10
target/arm/neon-dp.decode | 8 +++++
25
include/hw/ptimer.h | 22 ++++++++++++++++++++++
11
target/arm/translate-neon.inc.c | 61 +++++++++++++++++++++++++++++++++
26
include/qemu/typedefs.h | 1 +
12
target/arm/translate.c | 31 +++--------------
27
hw/core/ptimer.c | 34 ++++++++++++++++++++++++++++++++++
13
3 files changed, 74 insertions(+), 26 deletions(-)
28
3 files changed, 57 insertions(+)
14
29
15
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
30
diff --git a/include/hw/ptimer.h b/include/hw/ptimer.h
16
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/neon-dp.decode
32
--- a/include/hw/ptimer.h
18
+++ b/target/arm/neon-dp.decode
33
+++ b/include/hw/ptimer.h
19
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
34
@@ -XXX,XX +XXX,XX @@ void ptimer_transaction_commit(ptimer_state *s);
20
SHA1SU1 1111 001 11 . 11 .. 10 .... 0 0111 0 . 0 .... @2misc_q1
35
*/
21
SHA256SU0 1111 001 11 . 11 .. 10 .... 0 0111 1 . 0 .... @2misc_q1
36
void ptimer_set_period(ptimer_state *s, int64_t period);
22
37
23
+ VRINTN 1111 001 11 . 11 .. 10 .... 0 1000 . . 0 .... @2misc
38
+/**
24
VRINTX 1111 001 11 . 11 .. 10 .... 0 1001 . . 0 .... @2misc
39
+ * ptimer_set_period_from_clock - Set counter increment from a Clock
25
+ VRINTA 1111 001 11 . 11 .. 10 .... 0 1010 . . 0 .... @2misc
40
+ * @s: ptimer to configure
26
+ VRINTZ 1111 001 11 . 11 .. 10 .... 0 1011 . . 0 .... @2misc
41
+ * @clk: pointer to Clock object to take period from
27
42
+ * @divisor: value to scale the clock frequency down by
28
VCVT_F16_F32 1111 001 11 . 11 .. 10 .... 0 1100 0 . 0 .... @2misc_q0
43
+ *
44
+ * If the ptimer is being driven from a Clock, this is the preferred
45
+ * way to tell the ptimer about the period, because it avoids any
46
+ * possible rounding errors that might happen if the internal
47
+ * representation of the Clock period was converted to either a period
48
+ * in ns or a frequency in Hz.
49
+ *
50
+ * If the ptimer should run at the same frequency as the clock,
51
+ * pass 1 as the @divisor; if the ptimer should run at half the
52
+ * frequency, pass 2, and so on.
53
+ *
54
+ * This function will assert if it is called outside a
55
+ * ptimer_transaction_begin/commit block.
56
+ */
57
+void ptimer_set_period_from_clock(ptimer_state *s, const Clock *clock,
58
+ unsigned int divisor);
29
+
59
+
30
+ VRINTM 1111 001 11 . 11 .. 10 .... 0 1101 . . 0 .... @2misc
60
/**
31
+
61
* ptimer_set_freq - Set counter frequency in Hz
32
VCVT_F32_F16 1111 001 11 . 11 .. 10 .... 0 1110 0 . 0 .... @2misc_q0
62
* @s: ptimer to configure
33
63
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
34
+ VRINTP 1111 001 11 . 11 .. 10 .... 0 1111 . . 0 .... @2misc
35
+
36
VRECPE 1111 001 11 . 11 .. 11 .... 0 1000 . . 0 .... @2misc
37
VRSQRTE 1111 001 11 . 11 .. 11 .... 0 1001 . . 0 .... @2misc
38
VRECPE_F 1111 001 11 . 11 .. 11 .... 0 1010 . . 0 .... @2misc
39
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
40
index XXXXXXX..XXXXXXX 100644
64
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/translate-neon.inc.c
65
--- a/include/qemu/typedefs.h
42
+++ b/target/arm/translate-neon.inc.c
66
+++ b/include/qemu/typedefs.h
43
@@ -XXX,XX +XXX,XX @@ DO_FP_CMP0(VCGE0_F, gen_helper_neon_cge_f32, FWD)
67
@@ -XXX,XX +XXX,XX @@ typedef struct BlockDriverState BlockDriverState;
44
DO_FP_CMP0(VCEQ0_F, gen_helper_neon_ceq_f32, FWD)
68
typedef struct BusClass BusClass;
45
DO_FP_CMP0(VCLE0_F, gen_helper_neon_cge_f32, REV)
69
typedef struct BusState BusState;
46
DO_FP_CMP0(VCLT0_F, gen_helper_neon_cgt_f32, REV)
70
typedef struct Chardev Chardev;
47
+
71
+typedef struct Clock Clock;
48
+static bool do_vrint(DisasContext *s, arg_2misc *a, int rmode)
72
typedef struct CompatProperty CompatProperty;
73
typedef struct CoMutex CoMutex;
74
typedef struct CPUAddressSpace CPUAddressSpace;
75
diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/hw/core/ptimer.c
78
+++ b/hw/core/ptimer.c
79
@@ -XXX,XX +XXX,XX @@
80
#include "sysemu/qtest.h"
81
#include "block/aio.h"
82
#include "sysemu/cpus.h"
83
+#include "hw/clock.h"
84
85
#define DELTA_ADJUST 1
86
#define DELTA_NO_ADJUST -1
87
@@ -XXX,XX +XXX,XX @@ void ptimer_set_period(ptimer_state *s, int64_t period)
88
}
89
}
90
91
+/* Set counter increment interval from a Clock */
92
+void ptimer_set_period_from_clock(ptimer_state *s, const Clock *clk,
93
+ unsigned int divisor)
49
+{
94
+{
50
+ /*
95
+ /*
51
+ * Handle a VRINT* operation by iterating 32 bits at a time,
96
+ * The raw clock period is a 64-bit value in units of 2^-32 ns;
52
+ * with a specified rounding mode in operation.
97
+ * put another way it's a 32.32 fixed-point ns value. Our internal
98
+ * representation of the period is 64.32 fixed point ns, so
99
+ * the conversion is simple.
53
+ */
100
+ */
54
+ int pass;
101
+ uint64_t raw_period = clock_get(clk);
55
+ TCGv_ptr fpst;
102
+ uint64_t period_frac;
56
+ TCGv_i32 tcg_rmode;
57
+
103
+
58
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON) ||
104
+ assert(s->in_transaction);
59
+ !arm_dc_feature(s, ARM_FEATURE_V8)) {
105
+ s->delta = ptimer_get_count(s);
60
+ return false;
106
+ s->period = extract64(raw_period, 32, 32);
107
+ period_frac = extract64(raw_period, 0, 32);
108
+ /*
109
+ * divisor specifies a possible frequency divisor between the
110
+ * clock and the timer, so it is a multiplier on the period.
111
+ * We do the multiply after splitting the raw period out into
112
+ * period and frac to avoid having to do a 32*64->96 multiply.
113
+ */
114
+ s->period *= divisor;
115
+ period_frac *= divisor;
116
+ s->period += extract64(period_frac, 32, 32);
117
+ s->period_frac = (uint32_t)period_frac;
118
+
119
+ if (s->enabled) {
120
+ s->need_reload = true;
61
+ }
121
+ }
62
+
63
+ /* UNDEF accesses to D16-D31 if they don't exist. */
64
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
65
+ ((a->vd | a->vm) & 0x10)) {
66
+ return false;
67
+ }
68
+
69
+ if (a->size != 2) {
70
+ /* TODO: FP16 will be the size == 1 case */
71
+ return false;
72
+ }
73
+
74
+ if ((a->vd | a->vm) & a->q) {
75
+ return false;
76
+ }
77
+
78
+ if (!vfp_access_check(s)) {
79
+ return true;
80
+ }
81
+
82
+ fpst = get_fpstatus_ptr(1);
83
+ tcg_rmode = tcg_const_i32(arm_rmode_to_sf(rmode));
84
+ gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode, cpu_env);
85
+ for (pass = 0; pass < (a->q ? 4 : 2); pass++) {
86
+ TCGv_i32 tmp = neon_load_reg(a->vm, pass);
87
+ gen_helper_rints(tmp, tmp, fpst);
88
+ neon_store_reg(a->vd, pass, tmp);
89
+ }
90
+ gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode, cpu_env);
91
+ tcg_temp_free_i32(tcg_rmode);
92
+ tcg_temp_free_ptr(fpst);
93
+
94
+ return true;
95
+}
122
+}
96
+
123
+
97
+#define DO_VRINT(INSN, RMODE) \
124
/* Set counter frequency in Hz. */
98
+ static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
125
void ptimer_set_freq(ptimer_state *s, uint32_t freq)
99
+ { \
126
{
100
+ return do_vrint(s, a, RMODE); \
101
+ }
102
+
103
+DO_VRINT(VRINTN, FPROUNDING_TIEEVEN)
104
+DO_VRINT(VRINTA, FPROUNDING_TIEAWAY)
105
+DO_VRINT(VRINTZ, FPROUNDING_ZERO)
106
+DO_VRINT(VRINTM, FPROUNDING_NEGINF)
107
+DO_VRINT(VRINTP, FPROUNDING_POSINF)
108
diff --git a/target/arm/translate.c b/target/arm/translate.c
109
index XXXXXXX..XXXXXXX 100644
110
--- a/target/arm/translate.c
111
+++ b/target/arm/translate.c
112
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
113
case NEON_2RM_VCEQ0_F:
114
case NEON_2RM_VCLE0_F:
115
case NEON_2RM_VCLT0_F:
116
+ case NEON_2RM_VRINTN:
117
+ case NEON_2RM_VRINTA:
118
+ case NEON_2RM_VRINTM:
119
+ case NEON_2RM_VRINTP:
120
+ case NEON_2RM_VRINTZ:
121
/* handled by decodetree */
122
return 1;
123
case NEON_2RM_VTRN:
124
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
125
}
126
neon_store_reg(rm, pass, tmp2);
127
break;
128
- case NEON_2RM_VRINTN:
129
- case NEON_2RM_VRINTA:
130
- case NEON_2RM_VRINTM:
131
- case NEON_2RM_VRINTP:
132
- case NEON_2RM_VRINTZ:
133
- {
134
- TCGv_i32 tcg_rmode;
135
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
136
- int rmode;
137
-
138
- if (op == NEON_2RM_VRINTZ) {
139
- rmode = FPROUNDING_ZERO;
140
- } else {
141
- rmode = fp_decode_rm[((op & 0x6) >> 1) ^ 1];
142
- }
143
-
144
- tcg_rmode = tcg_const_i32(arm_rmode_to_sf(rmode));
145
- gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
146
- cpu_env);
147
- gen_helper_rints(tmp, tmp, fpstatus);
148
- gen_helper_set_neon_rmode(tcg_rmode, tcg_rmode,
149
- cpu_env);
150
- tcg_temp_free_ptr(fpstatus);
151
- tcg_temp_free_i32(tcg_rmode);
152
- break;
153
- }
154
case NEON_2RM_VCVTAU:
155
case NEON_2RM_VCVTAS:
156
case NEON_2RM_VCVTNU:
157
--
127
--
158
2.20.1
128
2.20.1
159
129
160
130
diff view generated by jsdifflib
1
Convert the Neon 2-reg-misc insns which are implemented with
1
Add a function for checking whether a clock has a source. This is
2
simple calls to functions that take the input, output and
2
useful for devices which have input clocks that must be wired up by
3
fpstatus pointer.
3
the board as it allows them to fail in realize rather than ploughing
4
on with a zero-period clock.
4
5
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
7
Message-id: 20200616170844.13318-16-peter.maydell@linaro.org
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20210128114145.20536-3-peter.maydell@linaro.org
11
Message-id: 20210121190622.22000-3-peter.maydell@linaro.org
8
---
12
---
9
target/arm/translate.h | 1 +
13
docs/devel/clocks.rst | 16 ++++++++++++++++
10
target/arm/neon-dp.decode | 8 +++++
14
include/hw/clock.h | 15 +++++++++++++++
11
target/arm/translate-neon.inc.c | 62 +++++++++++++++++++++++++++++++++
15
2 files changed, 31 insertions(+)
12
target/arm/translate.c | 56 ++++-------------------------
13
4 files changed, 78 insertions(+), 49 deletions(-)
14
16
15
diff --git a/target/arm/translate.h b/target/arm/translate.h
17
diff --git a/docs/devel/clocks.rst b/docs/devel/clocks.rst
16
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate.h
19
--- a/docs/devel/clocks.rst
18
+++ b/target/arm/translate.h
20
+++ b/docs/devel/clocks.rst
19
@@ -XXX,XX +XXX,XX @@ typedef void NeonGenNarrowFn(TCGv_i32, TCGv_i64);
21
@@ -XXX,XX +XXX,XX @@ object during device instance init. For example:
20
typedef void NeonGenNarrowEnvFn(TCGv_i32, TCGv_ptr, TCGv_i64);
22
/* set initial value to 10ns / 100MHz */
21
typedef void NeonGenWidenFn(TCGv_i64, TCGv_i32);
23
clock_set_ns(clk, 10);
22
typedef void NeonGenTwoOpWidenFn(TCGv_i64, TCGv_i32, TCGv_i32);
24
23
+typedef void NeonGenOneSingleOpFn(TCGv_i32, TCGv_i32, TCGv_ptr);
25
+To enforce that the clock is wired up by the board code, you can
24
typedef void NeonGenTwoSingleOpFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
26
+call ``clock_has_source()`` in your device's realize method:
25
typedef void NeonGenTwoDoubleOpFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr);
27
+
26
typedef void NeonGenOne64OpFn(TCGv_i64, TCGv_i64);
28
+.. code-block:: c
27
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
29
+
30
+ if (!clock_has_source(s->clk)) {
31
+ error_setg(errp, "MyDevice: clk input must be connected");
32
+ return;
33
+ }
34
+
35
+Note that this only checks that the clock has been wired up; it is
36
+still possible that the output clock connected to it is disabled
37
+or has not yet been configured, in which case the period will be
38
+zero. You should use the clock callback to find out when the clock
39
+period changes.
40
+
41
Fetching clock frequency/period
42
-------------------------------
43
44
diff --git a/include/hw/clock.h b/include/hw/clock.h
28
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/neon-dp.decode
46
--- a/include/hw/clock.h
30
+++ b/target/arm/neon-dp.decode
47
+++ b/include/hw/clock.h
31
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
48
@@ -XXX,XX +XXX,XX @@ void clock_clear_callback(Clock *clk);
32
SHA1SU1 1111 001 11 . 11 .. 10 .... 0 0111 0 . 0 .... @2misc_q1
49
*/
33
SHA256SU0 1111 001 11 . 11 .. 10 .... 0 0111 1 . 0 .... @2misc_q1
50
void clock_set_source(Clock *clk, Clock *src);
34
51
35
+ VRINTX 1111 001 11 . 11 .. 10 .... 0 1001 . . 0 .... @2misc
52
+/**
36
+
53
+ * clock_has_source:
37
VCVT_F16_F32 1111 001 11 . 11 .. 10 .... 0 1100 0 . 0 .... @2misc_q0
54
+ * @clk: the clock
38
VCVT_F32_F16 1111 001 11 . 11 .. 10 .... 0 1110 0 . 0 .... @2misc_q0
55
+ *
39
56
+ * Returns true if the clock has a source clock connected to it.
40
VRECPE 1111 001 11 . 11 .. 11 .... 0 1000 . . 0 .... @2misc
57
+ * This is useful for devices which have input clocks which must
41
VRSQRTE 1111 001 11 . 11 .. 11 .... 0 1001 . . 0 .... @2misc
58
+ * be connected by the board/SoC code which creates them. The
42
+ VRECPE_F 1111 001 11 . 11 .. 11 .... 0 1010 . . 0 .... @2misc
59
+ * device code can use this to check in its realize method that
43
+ VRSQRTE_F 1111 001 11 . 11 .. 11 .... 0 1011 . . 0 .... @2misc
60
+ * the clock has been connected.
44
+ VCVT_FS 1111 001 11 . 11 .. 11 .... 0 1100 . . 0 .... @2misc
61
+ */
45
+ VCVT_FU 1111 001 11 . 11 .. 11 .... 0 1101 . . 0 .... @2misc
62
+static inline bool clock_has_source(const Clock *clk)
46
+ VCVT_SF 1111 001 11 . 11 .. 11 .... 0 1110 . . 0 .... @2misc
47
+ VCVT_UF 1111 001 11 . 11 .. 11 .... 0 1111 . . 0 .... @2misc
48
]
49
50
# Subgroup for size != 0b11
51
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/target/arm/translate-neon.inc.c
54
+++ b/target/arm/translate-neon.inc.c
55
@@ -XXX,XX +XXX,XX @@ static bool trans_VQNEG(DisasContext *s, arg_2misc *a)
56
};
57
return do_2misc(s, a, fn[a->size]);
58
}
59
+
60
+static bool do_2misc_fp(DisasContext *s, arg_2misc *a,
61
+ NeonGenOneSingleOpFn *fn)
62
+{
63
+{
63
+ int pass;
64
+ return clk->source != NULL;
64
+ TCGv_ptr fpst;
65
+
66
+ /* Handle a 2-reg-misc operation by iterating 32 bits at a time */
67
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
68
+ return false;
69
+ }
70
+
71
+ /* UNDEF accesses to D16-D31 if they don't exist. */
72
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
73
+ ((a->vd | a->vm) & 0x10)) {
74
+ return false;
75
+ }
76
+
77
+ if (a->size != 2) {
78
+ /* TODO: FP16 will be the size == 1 case */
79
+ return false;
80
+ }
81
+
82
+ if ((a->vd | a->vm) & a->q) {
83
+ return false;
84
+ }
85
+
86
+ if (!vfp_access_check(s)) {
87
+ return true;
88
+ }
89
+
90
+ fpst = get_fpstatus_ptr(1);
91
+ for (pass = 0; pass < (a->q ? 4 : 2); pass++) {
92
+ TCGv_i32 tmp = neon_load_reg(a->vm, pass);
93
+ fn(tmp, tmp, fpst);
94
+ neon_store_reg(a->vd, pass, tmp);
95
+ }
96
+ tcg_temp_free_ptr(fpst);
97
+
98
+ return true;
99
+}
65
+}
100
+
66
+
101
+#define DO_2MISC_FP(INSN, FUNC) \
67
/**
102
+ static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
68
* clock_set:
103
+ { \
69
* @clk: the clock to initialize.
104
+ return do_2misc_fp(s, a, FUNC); \
105
+ }
106
+
107
+DO_2MISC_FP(VRECPE_F, gen_helper_recpe_f32)
108
+DO_2MISC_FP(VRSQRTE_F, gen_helper_rsqrte_f32)
109
+DO_2MISC_FP(VCVT_FS, gen_helper_vfp_sitos)
110
+DO_2MISC_FP(VCVT_FU, gen_helper_vfp_uitos)
111
+DO_2MISC_FP(VCVT_SF, gen_helper_vfp_tosizs)
112
+DO_2MISC_FP(VCVT_UF, gen_helper_vfp_touizs)
113
+
114
+static bool trans_VRINTX(DisasContext *s, arg_2misc *a)
115
+{
116
+ if (!arm_dc_feature(s, ARM_FEATURE_V8)) {
117
+ return false;
118
+ }
119
+ return do_2misc_fp(s, a, gen_helper_rints_exact);
120
+}
121
diff --git a/target/arm/translate.c b/target/arm/translate.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/target/arm/translate.c
124
+++ b/target/arm/translate.c
125
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
126
case NEON_2RM_VRSQRTE:
127
case NEON_2RM_VQABS:
128
case NEON_2RM_VQNEG:
129
+ case NEON_2RM_VRECPE_F:
130
+ case NEON_2RM_VRSQRTE_F:
131
+ case NEON_2RM_VCVT_FS:
132
+ case NEON_2RM_VCVT_FU:
133
+ case NEON_2RM_VCVT_SF:
134
+ case NEON_2RM_VCVT_UF:
135
+ case NEON_2RM_VRINTX:
136
/* handled by decodetree */
137
return 1;
138
case NEON_2RM_VTRN:
139
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
140
tcg_temp_free_i32(tcg_rmode);
141
break;
142
}
143
- case NEON_2RM_VRINTX:
144
- {
145
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
146
- gen_helper_rints_exact(tmp, tmp, fpstatus);
147
- tcg_temp_free_ptr(fpstatus);
148
- break;
149
- }
150
case NEON_2RM_VCVTAU:
151
case NEON_2RM_VCVTAS:
152
case NEON_2RM_VCVTNU:
153
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
154
tcg_temp_free_ptr(fpst);
155
break;
156
}
157
- case NEON_2RM_VRECPE_F:
158
- {
159
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
160
- gen_helper_recpe_f32(tmp, tmp, fpstatus);
161
- tcg_temp_free_ptr(fpstatus);
162
- break;
163
- }
164
- case NEON_2RM_VRSQRTE_F:
165
- {
166
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
167
- gen_helper_rsqrte_f32(tmp, tmp, fpstatus);
168
- tcg_temp_free_ptr(fpstatus);
169
- break;
170
- }
171
- case NEON_2RM_VCVT_FS: /* VCVT.F32.S32 */
172
- {
173
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
174
- gen_helper_vfp_sitos(tmp, tmp, fpstatus);
175
- tcg_temp_free_ptr(fpstatus);
176
- break;
177
- }
178
- case NEON_2RM_VCVT_FU: /* VCVT.F32.U32 */
179
- {
180
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
181
- gen_helper_vfp_uitos(tmp, tmp, fpstatus);
182
- tcg_temp_free_ptr(fpstatus);
183
- break;
184
- }
185
- case NEON_2RM_VCVT_SF: /* VCVT.S32.F32 */
186
- {
187
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
188
- gen_helper_vfp_tosizs(tmp, tmp, fpstatus);
189
- tcg_temp_free_ptr(fpstatus);
190
- break;
191
- }
192
- case NEON_2RM_VCVT_UF: /* VCVT.U32.F32 */
193
- {
194
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
195
- gen_helper_vfp_touizs(tmp, tmp, fpstatus);
196
- tcg_temp_free_ptr(fpstatus);
197
- break;
198
- }
199
default:
200
/* Reserved op values were caught by the
201
* neon_2rm_sizes[] check earlier.
202
--
70
--
203
2.20.1
71
2.20.1
204
72
205
73
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Add a simple test of the CMSDK APB timer, since we're about to do
2
some refactoring of how it is clocked.
2
3
3
'ARM SBCon two-wire serial bus interface' is the official
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
name describing the pair of registers used to bitbanging
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
I2C in the Versatile boards.
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
7
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-4-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-4-peter.maydell@linaro.org
10
---
11
tests/qtest/cmsdk-apb-timer-test.c | 75 ++++++++++++++++++++++++++++++
12
MAINTAINERS | 1 +
13
tests/qtest/meson.build | 1 +
14
3 files changed, 77 insertions(+)
15
create mode 100644 tests/qtest/cmsdk-apb-timer-test.c
6
16
7
Make the private VersatileI2CState structure as public
17
diff --git a/tests/qtest/cmsdk-apb-timer-test.c b/tests/qtest/cmsdk-apb-timer-test.c
8
ArmSbconI2CState.
9
Add the TYPE_ARM_SBCON_I2C, alias to our current
10
TYPE_VERSATILE_I2C model.
11
Rename the memory region description as 'arm_sbcon_i2c'.
12
13
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20200617072539.32686-5-f4bug@amsat.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
include/hw/i2c/arm_sbcon_i2c.h | 35 ++++++++++++++++++++++++++++++++++
19
hw/i2c/versatile_i2c.c | 17 +++++------------
20
MAINTAINERS | 1 +
21
3 files changed, 41 insertions(+), 12 deletions(-)
22
create mode 100644 include/hw/i2c/arm_sbcon_i2c.h
23
24
diff --git a/include/hw/i2c/arm_sbcon_i2c.h b/include/hw/i2c/arm_sbcon_i2c.h
25
new file mode 100644
18
new file mode 100644
26
index XXXXXXX..XXXXXXX
19
index XXXXXXX..XXXXXXX
27
--- /dev/null
20
--- /dev/null
28
+++ b/include/hw/i2c/arm_sbcon_i2c.h
21
+++ b/tests/qtest/cmsdk-apb-timer-test.c
29
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@
30
+/*
23
+/*
31
+ * ARM SBCon two-wire serial bus interface (I2C bitbang)
24
+ * QTest testcase for the CMSDK APB timer device
32
+ * a.k.a.
33
+ * ARM Versatile I2C controller
34
+ *
25
+ *
35
+ * Copyright (c) 2006-2007 CodeSourcery.
26
+ * Copyright (c) 2021 Linaro Limited
36
+ * Copyright (c) 2012 Oskar Andero <oskar.andero@gmail.com>
37
+ * Copyright (C) 2020 Philippe Mathieu-Daudé <f4bug@amsat.org>
38
+ *
27
+ *
39
+ * SPDX-License-Identifier: GPL-2.0-or-later
28
+ * This program is free software; you can redistribute it and/or modify it
29
+ * under the terms of the GNU General Public License as published by the
30
+ * Free Software Foundation; either version 2 of the License, or
31
+ * (at your option) any later version.
32
+ *
33
+ * This program is distributed in the hope that it will be useful, but WITHOUT
34
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
35
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
36
+ * for more details.
40
+ */
37
+ */
41
+#ifndef HW_I2C_ARM_SBCON_H
42
+#define HW_I2C_ARM_SBCON_H
43
+
38
+
44
+#include "hw/sysbus.h"
39
+#include "qemu/osdep.h"
45
+#include "hw/i2c/bitbang_i2c.h"
40
+#include "libqtest-single.h"
46
+
41
+
47
+#define TYPE_VERSATILE_I2C "versatile_i2c"
42
+/* IoTKit/ARMSSE-200 timer0; driven at 25MHz in mps2-an385, so 40ns per tick */
48
+#define TYPE_ARM_SBCON_I2C TYPE_VERSATILE_I2C
43
+#define TIMER_BASE 0x40000000
49
+
44
+
50
+#define ARM_SBCON_I2C(obj) \
45
+#define CTRL 0
51
+ OBJECT_CHECK(ArmSbconI2CState, (obj), TYPE_ARM_SBCON_I2C)
46
+#define VALUE 4
47
+#define RELOAD 8
48
+#define INTSTATUS 0xc
52
+
49
+
53
+typedef struct ArmSbconI2CState {
50
+static void test_timer(void)
54
+ /*< private >*/
51
+{
55
+ SysBusDevice parent_obj;
52
+ g_assert_true(readl(TIMER_BASE + INTSTATUS) == 0);
56
+ /*< public >*/
57
+
53
+
58
+ MemoryRegion iomem;
54
+ /* Start timer: will fire after 40 * 1000 == 40000 ns */
59
+ bitbang_i2c_interface bitbang;
55
+ writel(TIMER_BASE + RELOAD, 1000);
60
+ int out;
56
+ writel(TIMER_BASE + CTRL, 9);
61
+ int in;
62
+} ArmSbconI2CState;
63
+
57
+
64
+#endif /* HW_I2C_ARM_SBCON_H */
58
+ /* Step to just past the 500th tick and check VALUE */
65
diff --git a/hw/i2c/versatile_i2c.c b/hw/i2c/versatile_i2c.c
59
+ clock_step(40 * 500 + 1);
66
index XXXXXXX..XXXXXXX 100644
60
+ g_assert_cmpuint(readl(TIMER_BASE + INTSTATUS), ==, 0);
67
--- a/hw/i2c/versatile_i2c.c
61
+ g_assert_cmpuint(readl(TIMER_BASE + VALUE), ==, 500);
68
+++ b/hw/i2c/versatile_i2c.c
62
+
69
@@ -XXX,XX +XXX,XX @@
63
+ /* Just past the 1000th tick: timer should have fired */
70
/*
64
+ clock_step(40 * 500);
71
- * ARM Versatile I2C controller
65
+ g_assert_cmpuint(readl(TIMER_BASE + INTSTATUS), ==, 1);
72
+ * ARM SBCon two-wire serial bus interface (I2C bitbang)
66
+ g_assert_cmpuint(readl(TIMER_BASE + VALUE), ==, 0);
73
+ * a.k.a. ARM Versatile I2C controller
67
+
74
*
68
+ /* VALUE reloads at the following tick */
75
* Copyright (c) 2006-2007 CodeSourcery.
69
+ clock_step(40);
76
* Copyright (c) 2012 Oskar Andero <oskar.andero@gmail.com>
70
+ g_assert_cmpuint(readl(TIMER_BASE + VALUE), ==, 1000);
77
@@ -XXX,XX +XXX,XX @@
71
+
78
*/
72
+ /* Check write-1-to-clear behaviour of INTSTATUS */
79
73
+ writel(TIMER_BASE + INTSTATUS, 0);
80
#include "qemu/osdep.h"
74
+ g_assert_cmpuint(readl(TIMER_BASE + INTSTATUS), ==, 1);
81
-#include "hw/sysbus.h"
75
+ writel(TIMER_BASE + INTSTATUS, 1);
82
-#include "hw/i2c/bitbang_i2c.h"
76
+ g_assert_cmpuint(readl(TIMER_BASE + INTSTATUS), ==, 0);
83
+#include "hw/i2c/arm_sbcon_i2c.h"
77
+
84
#include "hw/registerfields.h"
78
+ /* Turn off the timer */
85
#include "qemu/log.h"
79
+ writel(TIMER_BASE + CTRL, 0);
86
#include "qemu/module.h"
80
+}
87
81
+
88
-#define TYPE_VERSATILE_I2C "versatile_i2c"
82
+int main(int argc, char **argv)
89
#define VERSATILE_I2C(obj) \
83
+{
90
OBJECT_CHECK(VersatileI2CState, (obj), TYPE_VERSATILE_I2C)
84
+ int r;
91
85
+
92
-typedef struct VersatileI2CState {
86
+ g_test_init(&argc, &argv, NULL);
93
- SysBusDevice parent_obj;
87
+
94
+typedef ArmSbconI2CState VersatileI2CState;
88
+ qtest_start("-machine mps2-an385");
95
89
+
96
- MemoryRegion iomem;
90
+ qtest_add_func("/cmsdk-apb-timer/timer", test_timer);
97
- bitbang_i2c_interface bitbang;
91
+
98
- int out;
92
+ r = g_test_run();
99
- int in;
93
+
100
-} VersatileI2CState;
94
+ qtest_end();
101
95
+
102
REG32(CONTROL_GET, 0)
96
+ return r;
103
REG32(CONTROL_SET, 0)
97
+}
104
@@ -XXX,XX +XXX,XX @@ static void versatile_i2c_init(Object *obj)
105
bus = i2c_init_bus(dev, "i2c");
106
bitbang_i2c_init(&s->bitbang, bus);
107
memory_region_init_io(&s->iomem, obj, &versatile_i2c_ops, s,
108
- "versatile_i2c", 0x1000);
109
+ "arm_sbcon_i2c", 0x1000);
110
sysbus_init_mmio(sbd, &s->iomem);
111
}
112
113
diff --git a/MAINTAINERS b/MAINTAINERS
98
diff --git a/MAINTAINERS b/MAINTAINERS
114
index XXXXXXX..XXXXXXX 100644
99
index XXXXXXX..XXXXXXX 100644
115
--- a/MAINTAINERS
100
--- a/MAINTAINERS
116
+++ b/MAINTAINERS
101
+++ b/MAINTAINERS
117
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
102
@@ -XXX,XX +XXX,XX @@ F: include/hw/rtc/pl031.h
118
L: qemu-arm@nongnu.org
103
F: include/hw/arm/primecell.h
119
S: Maintained
104
F: hw/timer/cmsdk-apb-timer.c
120
F: hw/*/versatile*
105
F: include/hw/timer/cmsdk-apb-timer.h
121
+F: include/hw/i2c/arm_sbcon_i2c.h
106
+F: tests/qtest/cmsdk-apb-timer-test.c
122
F: hw/misc/arm_sysctl.c
107
F: hw/timer/cmsdk-apb-dualtimer.c
123
F: docs/system/arm/versatile.rst
108
F: include/hw/timer/cmsdk-apb-dualtimer.h
124
109
F: hw/char/cmsdk-apb-uart.c
110
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
111
index XXXXXXX..XXXXXXX 100644
112
--- a/tests/qtest/meson.build
113
+++ b/tests/qtest/meson.build
114
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
115
'npcm7xx_timer-test',
116
'npcm7xx_watchdog_timer-test']
117
qtests_arm = \
118
+ (config_all_devices.has_key('CONFIG_CMSDK_APB_TIMER') ? ['cmsdk-apb-timer-test'] : []) + \
119
(config_all_devices.has_key('CONFIG_PFLASH_CFI02') ? ['pflash-cfi02-test'] : []) + \
120
(config_all_devices.has_key('CONFIG_NPCM7XX') ? qtests_npcm7xx : []) + \
121
['arm-cpu-features',
125
--
122
--
126
2.20.1
123
2.20.1
127
124
128
125
diff view generated by jsdifflib
1
Convert the Neon VQABS and VQNEG insns to decodetree.
1
Add a simple test of the CMSDK watchdog, since we're about to do some
2
Since these are the only ones which need cpu_env passing to
2
refactoring of how it is clocked.
3
the helper, we wrap the helper rather than creating a whole
4
new do_2misc_env() function.
5
3
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Message-id: 20200616170844.13318-15-peter.maydell@linaro.org
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-5-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-5-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
---
11
---
10
target/arm/neon-dp.decode | 3 +++
12
tests/qtest/cmsdk-apb-watchdog-test.c | 79 +++++++++++++++++++++++++++
11
target/arm/translate-neon.inc.c | 35 +++++++++++++++++++++++++++++++++
13
MAINTAINERS | 1 +
12
target/arm/translate.c | 30 ++--------------------------
14
tests/qtest/meson.build | 1 +
13
3 files changed, 40 insertions(+), 28 deletions(-)
15
3 files changed, 81 insertions(+)
16
create mode 100644 tests/qtest/cmsdk-apb-watchdog-test.c
14
17
15
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
18
diff --git a/tests/qtest/cmsdk-apb-watchdog-test.c b/tests/qtest/cmsdk-apb-watchdog-test.c
16
index XXXXXXX..XXXXXXX 100644
19
new file mode 100644
17
--- a/target/arm/neon-dp.decode
20
index XXXXXXX..XXXXXXX
18
+++ b/target/arm/neon-dp.decode
21
--- /dev/null
19
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
22
+++ b/tests/qtest/cmsdk-apb-watchdog-test.c
20
VPADAL_S 1111 001 11 . 11 .. 00 .... 0 1100 . . 0 .... @2misc
23
@@ -XXX,XX +XXX,XX @@
21
VPADAL_U 1111 001 11 . 11 .. 00 .... 0 1101 . . 0 .... @2misc
24
+/*
22
25
+ * QTest testcase for the CMSDK APB watchdog device
23
+ VQABS 1111 001 11 . 11 .. 00 .... 0 1110 . . 0 .... @2misc
26
+ *
24
+ VQNEG 1111 001 11 . 11 .. 00 .... 0 1111 . . 0 .... @2misc
27
+ * Copyright (c) 2021 Linaro Limited
28
+ *
29
+ * This program is free software; you can redistribute it and/or modify it
30
+ * under the terms of the GNU General Public License as published by the
31
+ * Free Software Foundation; either version 2 of the License, or
32
+ * (at your option) any later version.
33
+ *
34
+ * This program is distributed in the hope that it will be useful, but WITHOUT
35
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
36
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37
+ * for more details.
38
+ */
25
+
39
+
26
VCGT0 1111 001 11 . 11 .. 01 .... 0 0000 . . 0 .... @2misc
40
+#include "qemu/osdep.h"
27
VCGE0 1111 001 11 . 11 .. 01 .... 0 0001 . . 0 .... @2misc
41
+#include "libqtest-single.h"
28
VCEQ0 1111 001 11 . 11 .. 01 .... 0 0010 . . 0 .... @2misc
29
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/translate-neon.inc.c
32
+++ b/target/arm/translate-neon.inc.c
33
@@ -XXX,XX +XXX,XX @@ static bool trans_VRSQRTE(DisasContext *s, arg_2misc *a)
34
}
35
return do_2misc(s, a, gen_helper_rsqrte_u32);
36
}
37
+
42
+
38
+#define WRAP_1OP_ENV_FN(WRAPNAME, FUNC) \
43
+/*
39
+ static void WRAPNAME(TCGv_i32 d, TCGv_i32 m) \
44
+ * lm3s811evb watchdog; at board startup this runs at 200MHz / 16 == 12.5MHz,
40
+ { \
45
+ * which is 80ns per tick.
41
+ FUNC(d, cpu_env, m); \
46
+ */
42
+ }
47
+#define WDOG_BASE 0x40000000
43
+
48
+
44
+WRAP_1OP_ENV_FN(gen_VQABS_s8, gen_helper_neon_qabs_s8)
49
+#define WDOGLOAD 0
45
+WRAP_1OP_ENV_FN(gen_VQABS_s16, gen_helper_neon_qabs_s16)
50
+#define WDOGVALUE 4
46
+WRAP_1OP_ENV_FN(gen_VQABS_s32, gen_helper_neon_qabs_s32)
51
+#define WDOGCONTROL 8
47
+WRAP_1OP_ENV_FN(gen_VQNEG_s8, gen_helper_neon_qneg_s8)
52
+#define WDOGINTCLR 0xc
48
+WRAP_1OP_ENV_FN(gen_VQNEG_s16, gen_helper_neon_qneg_s16)
53
+#define WDOGRIS 0x10
49
+WRAP_1OP_ENV_FN(gen_VQNEG_s32, gen_helper_neon_qneg_s32)
54
+#define WDOGMIS 0x14
55
+#define WDOGLOCK 0xc00
50
+
56
+
51
+static bool trans_VQABS(DisasContext *s, arg_2misc *a)
57
+static void test_watchdog(void)
52
+{
58
+{
53
+ static NeonGenOneOpFn * const fn[] = {
59
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
54
+ gen_VQABS_s8,
60
+
55
+ gen_VQABS_s16,
61
+ writel(WDOG_BASE + WDOGCONTROL, 1);
56
+ gen_VQABS_s32,
62
+ writel(WDOG_BASE + WDOGLOAD, 1000);
57
+ NULL,
63
+
58
+ };
64
+ /* Step to just past the 500th tick */
59
+ return do_2misc(s, a, fn[a->size]);
65
+ clock_step(500 * 80 + 1);
66
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
67
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
68
+
69
+ /* Just past the 1000th tick: timer should have fired */
70
+ clock_step(500 * 80);
71
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
72
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 0);
73
+
74
+ /* VALUE reloads at following tick */
75
+ clock_step(80);
76
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
77
+
78
+ /* Writing any value to WDOGINTCLR clears the interrupt and reloads */
79
+ clock_step(500 * 80);
80
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
81
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
82
+ writel(WDOG_BASE + WDOGINTCLR, 0);
83
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
84
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
60
+}
85
+}
61
+
86
+
62
+static bool trans_VQNEG(DisasContext *s, arg_2misc *a)
87
+int main(int argc, char **argv)
63
+{
88
+{
64
+ static NeonGenOneOpFn * const fn[] = {
89
+ int r;
65
+ gen_VQNEG_s8,
90
+
66
+ gen_VQNEG_s16,
91
+ g_test_init(&argc, &argv, NULL);
67
+ gen_VQNEG_s32,
92
+
68
+ NULL,
93
+ qtest_start("-machine lm3s811evb");
69
+ };
94
+
70
+ return do_2misc(s, a, fn[a->size]);
95
+ qtest_add_func("/cmsdk-apb-watchdog/watchdog", test_watchdog);
96
+
97
+ r = g_test_run();
98
+
99
+ qtest_end();
100
+
101
+ return r;
71
+}
102
+}
72
diff --git a/target/arm/translate.c b/target/arm/translate.c
103
diff --git a/MAINTAINERS b/MAINTAINERS
73
index XXXXXXX..XXXXXXX 100644
104
index XXXXXXX..XXXXXXX 100644
74
--- a/target/arm/translate.c
105
--- a/MAINTAINERS
75
+++ b/target/arm/translate.c
106
+++ b/MAINTAINERS
76
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
107
@@ -XXX,XX +XXX,XX @@ F: hw/char/cmsdk-apb-uart.c
77
case NEON_2RM_VNEG_F:
108
F: include/hw/char/cmsdk-apb-uart.h
78
case NEON_2RM_VRECPE:
109
F: hw/watchdog/cmsdk-apb-watchdog.c
79
case NEON_2RM_VRSQRTE:
110
F: include/hw/watchdog/cmsdk-apb-watchdog.h
80
+ case NEON_2RM_VQABS:
111
+F: tests/qtest/cmsdk-apb-watchdog-test.c
81
+ case NEON_2RM_VQNEG:
112
F: hw/misc/tz-ppc.c
82
/* handled by decodetree */
113
F: include/hw/misc/tz-ppc.h
83
return 1;
114
F: hw/misc/tz-mpc.c
84
case NEON_2RM_VTRN:
115
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
85
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
116
index XXXXXXX..XXXXXXX 100644
86
for (pass = 0; pass < (q ? 4 : 2); pass++) {
117
--- a/tests/qtest/meson.build
87
tmp = neon_load_reg(rm, pass);
118
+++ b/tests/qtest/meson.build
88
switch (op) {
119
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
89
- case NEON_2RM_VQABS:
120
'npcm7xx_watchdog_timer-test']
90
- switch (size) {
121
qtests_arm = \
91
- case 0:
122
(config_all_devices.has_key('CONFIG_CMSDK_APB_TIMER') ? ['cmsdk-apb-timer-test'] : []) + \
92
- gen_helper_neon_qabs_s8(tmp, cpu_env, tmp);
123
+ (config_all_devices.has_key('CONFIG_CMSDK_APB_WATCHDOG') ? ['cmsdk-apb-watchdog-test'] : []) + \
93
- break;
124
(config_all_devices.has_key('CONFIG_PFLASH_CFI02') ? ['pflash-cfi02-test'] : []) + \
94
- case 1:
125
(config_all_devices.has_key('CONFIG_NPCM7XX') ? qtests_npcm7xx : []) + \
95
- gen_helper_neon_qabs_s16(tmp, cpu_env, tmp);
126
['arm-cpu-features',
96
- break;
97
- case 2:
98
- gen_helper_neon_qabs_s32(tmp, cpu_env, tmp);
99
- break;
100
- default: abort();
101
- }
102
- break;
103
- case NEON_2RM_VQNEG:
104
- switch (size) {
105
- case 0:
106
- gen_helper_neon_qneg_s8(tmp, cpu_env, tmp);
107
- break;
108
- case 1:
109
- gen_helper_neon_qneg_s16(tmp, cpu_env, tmp);
110
- break;
111
- case 2:
112
- gen_helper_neon_qneg_s32(tmp, cpu_env, tmp);
113
- break;
114
- default: abort();
115
- }
116
- break;
117
case NEON_2RM_VCGT0_F:
118
{
119
TCGv_ptr fpstatus = get_fpstatus_ptr(1);
120
--
127
--
121
2.20.1
128
2.20.1
122
129
123
130
diff view generated by jsdifflib
1
Convert the VREV32 and VREV16 insns in the Neon 2-reg-misc group
1
Add a simple test of the CMSDK dual timer, since we're about to do
2
to decodetree.
2
some refactoring of how it is clocked.
3
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200616170844.13318-13-peter.maydell@linaro.org
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Message-id: 20210128114145.20536-6-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-6-peter.maydell@linaro.org
7
---
10
---
8
target/arm/translate.h | 1 +
11
tests/qtest/cmsdk-apb-dualtimer-test.c | 130 +++++++++++++++++++++++++
9
target/arm/neon-dp.decode | 2 ++
12
MAINTAINERS | 1 +
10
target/arm/translate-neon.inc.c | 55 +++++++++++++++++++++++++++++++++
13
tests/qtest/meson.build | 1 +
11
target/arm/translate.c | 12 ++-----
14
3 files changed, 132 insertions(+)
12
4 files changed, 60 insertions(+), 10 deletions(-)
15
create mode 100644 tests/qtest/cmsdk-apb-dualtimer-test.c
13
16
14
diff --git a/target/arm/translate.h b/target/arm/translate.h
17
diff --git a/tests/qtest/cmsdk-apb-dualtimer-test.c b/tests/qtest/cmsdk-apb-dualtimer-test.c
15
index XXXXXXX..XXXXXXX 100644
18
new file mode 100644
16
--- a/target/arm/translate.h
19
index XXXXXXX..XXXXXXX
17
+++ b/target/arm/translate.h
20
--- /dev/null
18
@@ -XXX,XX +XXX,XX @@ typedef void GVecGen4Fn(unsigned, uint32_t, uint32_t, uint32_t,
21
+++ b/tests/qtest/cmsdk-apb-dualtimer-test.c
19
uint32_t, uint32_t, uint32_t);
22
@@ -XXX,XX +XXX,XX @@
20
23
+/*
21
/* Function prototype for gen_ functions for calling Neon helpers */
24
+ * QTest testcase for the CMSDK APB dualtimer device
22
+typedef void NeonGenOneOpFn(TCGv_i32, TCGv_i32);
25
+ *
23
typedef void NeonGenOneOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32);
26
+ * Copyright (c) 2021 Linaro Limited
24
typedef void NeonGenTwoOpFn(TCGv_i32, TCGv_i32, TCGv_i32);
27
+ *
25
typedef void NeonGenTwoOpEnvFn(TCGv_i32, TCGv_ptr, TCGv_i32, TCGv_i32);
28
+ * This program is free software; you can redistribute it and/or modify it
26
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
29
+ * under the terms of the GNU General Public License as published by the
27
index XXXXXXX..XXXXXXX 100644
30
+ * Free Software Foundation; either version 2 of the License, or
28
--- a/target/arm/neon-dp.decode
31
+ * (at your option) any later version.
29
+++ b/target/arm/neon-dp.decode
32
+ *
30
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
33
+ * This program is distributed in the hope that it will be useful, but WITHOUT
31
&2misc vm=%vm_dp vd=%vd_dp q=1
34
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
32
35
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
33
VREV64 1111 001 11 . 11 .. 00 .... 0 0000 . . 0 .... @2misc
36
+ * for more details.
34
+ VREV32 1111 001 11 . 11 .. 00 .... 0 0001 . . 0 .... @2misc
37
+ */
35
+ VREV16 1111 001 11 . 11 .. 00 .... 0 0010 . . 0 .... @2misc
36
37
VPADDL_S 1111 001 11 . 11 .. 00 .... 0 0100 . . 0 .... @2misc
38
VPADDL_U 1111 001 11 . 11 .. 00 .... 0 0101 . . 0 .... @2misc
39
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/translate-neon.inc.c
42
+++ b/target/arm/translate-neon.inc.c
43
@@ -XXX,XX +XXX,XX @@ DO_2M_CRYPTO(AESIMC, aa32_aes, 0)
44
DO_2M_CRYPTO(SHA1H, aa32_sha1, 2)
45
DO_2M_CRYPTO(SHA1SU1, aa32_sha1, 2)
46
DO_2M_CRYPTO(SHA256SU0, aa32_sha2, 2)
47
+
38
+
48
+static bool do_2misc(DisasContext *s, arg_2misc *a, NeonGenOneOpFn *fn)
39
+#include "qemu/osdep.h"
40
+#include "libqtest-single.h"
41
+
42
+/* IoTKit/ARMSSE dualtimer; driven at 25MHz in mps2-an385, so 40ns per tick */
43
+#define TIMER_BASE 0x40002000
44
+
45
+#define TIMER1LOAD 0
46
+#define TIMER1VALUE 4
47
+#define TIMER1CONTROL 8
48
+#define TIMER1INTCLR 0xc
49
+#define TIMER1RIS 0x10
50
+#define TIMER1MIS 0x14
51
+#define TIMER1BGLOAD 0x18
52
+
53
+#define TIMER2LOAD 0x20
54
+#define TIMER2VALUE 0x24
55
+#define TIMER2CONTROL 0x28
56
+#define TIMER2INTCLR 0x2c
57
+#define TIMER2RIS 0x30
58
+#define TIMER2MIS 0x34
59
+#define TIMER2BGLOAD 0x38
60
+
61
+#define CTRL_ENABLE (1 << 7)
62
+#define CTRL_PERIODIC (1 << 6)
63
+#define CTRL_INTEN (1 << 5)
64
+#define CTRL_PRESCALE_1 (0 << 2)
65
+#define CTRL_PRESCALE_16 (1 << 2)
66
+#define CTRL_PRESCALE_256 (2 << 2)
67
+#define CTRL_32BIT (1 << 1)
68
+#define CTRL_ONESHOT (1 << 0)
69
+
70
+static void test_dualtimer(void)
49
+{
71
+{
50
+ int pass;
72
+ g_assert_true(readl(TIMER_BASE + TIMER1RIS) == 0);
51
+
73
+
52
+ /* Handle a 2-reg-misc operation by iterating 32 bits at a time */
74
+ /* Start timer: will fire after 40000 ns */
53
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
75
+ writel(TIMER_BASE + TIMER1LOAD, 1000);
54
+ return false;
76
+ /* enable in free-running, wrapping, interrupt mode */
55
+ }
77
+ writel(TIMER_BASE + TIMER1CONTROL, CTRL_ENABLE | CTRL_INTEN);
56
+
78
+
57
+ /* UNDEF accesses to D16-D31 if they don't exist. */
79
+ /* Step to just past the 500th tick and check VALUE */
58
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
80
+ clock_step(500 * 40 + 1);
59
+ ((a->vd | a->vm) & 0x10)) {
81
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1RIS), ==, 0);
60
+ return false;
82
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1VALUE), ==, 500);
61
+ }
62
+
83
+
63
+ if (!fn) {
84
+ /* Just past the 1000th tick: timer should have fired */
64
+ return false;
85
+ clock_step(500 * 40);
65
+ }
86
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1RIS), ==, 1);
87
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1VALUE), ==, 0);
66
+
88
+
67
+ if ((a->vd | a->vm) & a->q) {
89
+ /*
68
+ return false;
90
+ * We are in free-running wrapping 16-bit mode, so on the following
69
+ }
91
+ * tick VALUE should have wrapped round to 0xffff.
92
+ */
93
+ clock_step(40);
94
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1VALUE), ==, 0xffff);
70
+
95
+
71
+ if (!vfp_access_check(s)) {
96
+ /* Check that any write to INTCLR clears interrupt */
72
+ return true;
97
+ writel(TIMER_BASE + TIMER1INTCLR, 1);
73
+ }
98
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER1RIS), ==, 0);
74
+
99
+
75
+ for (pass = 0; pass < (a->q ? 4 : 2); pass++) {
100
+ /* Turn off the timer */
76
+ TCGv_i32 tmp = neon_load_reg(a->vm, pass);
101
+ writel(TIMER_BASE + TIMER1CONTROL, 0);
77
+ fn(tmp, tmp);
78
+ neon_store_reg(a->vd, pass, tmp);
79
+ }
80
+
81
+ return true;
82
+}
102
+}
83
+
103
+
84
+static bool trans_VREV32(DisasContext *s, arg_2misc *a)
104
+static void test_prescale(void)
85
+{
105
+{
86
+ static NeonGenOneOpFn * const fn[] = {
106
+ g_assert_true(readl(TIMER_BASE + TIMER2RIS) == 0);
87
+ tcg_gen_bswap32_i32,
107
+
88
+ gen_swap_half,
108
+ /* Start timer: will fire after 40 * 256 * 1000 == 1024000 ns */
89
+ NULL,
109
+ writel(TIMER_BASE + TIMER2LOAD, 1000);
90
+ NULL,
110
+ /* enable in periodic, wrapping, interrupt mode, prescale 256 */
91
+ };
111
+ writel(TIMER_BASE + TIMER2CONTROL,
92
+ return do_2misc(s, a, fn[a->size]);
112
+ CTRL_ENABLE | CTRL_INTEN | CTRL_PERIODIC | CTRL_PRESCALE_256);
113
+
114
+ /* Step to just past the 500th tick and check VALUE */
115
+ clock_step(40 * 256 * 501);
116
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2RIS), ==, 0);
117
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2VALUE), ==, 500);
118
+
119
+ /* Just past the 1000th tick: timer should have fired */
120
+ clock_step(40 * 256 * 500);
121
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2RIS), ==, 1);
122
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2VALUE), ==, 0);
123
+
124
+ /* In periodic mode the tick VALUE now reloads */
125
+ clock_step(40 * 256);
126
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2VALUE), ==, 1000);
127
+
128
+ /* Check that any write to INTCLR clears interrupt */
129
+ writel(TIMER_BASE + TIMER2INTCLR, 1);
130
+ g_assert_cmpuint(readl(TIMER_BASE + TIMER2RIS), ==, 0);
131
+
132
+ /* Turn off the timer */
133
+ writel(TIMER_BASE + TIMER2CONTROL, 0);
93
+}
134
+}
94
+
135
+
95
+static bool trans_VREV16(DisasContext *s, arg_2misc *a)
136
+int main(int argc, char **argv)
96
+{
137
+{
97
+ if (a->size != 0) {
138
+ int r;
98
+ return false;
139
+
99
+ }
140
+ g_test_init(&argc, &argv, NULL);
100
+ return do_2misc(s, a, gen_rev16);
141
+
142
+ qtest_start("-machine mps2-an385");
143
+
144
+ qtest_add_func("/cmsdk-apb-dualtimer/dualtimer", test_dualtimer);
145
+ qtest_add_func("/cmsdk-apb-dualtimer/prescale", test_prescale);
146
+
147
+ r = g_test_run();
148
+
149
+ qtest_end();
150
+
151
+ return r;
101
+}
152
+}
102
diff --git a/target/arm/translate.c b/target/arm/translate.c
153
diff --git a/MAINTAINERS b/MAINTAINERS
103
index XXXXXXX..XXXXXXX 100644
154
index XXXXXXX..XXXXXXX 100644
104
--- a/target/arm/translate.c
155
--- a/MAINTAINERS
105
+++ b/target/arm/translate.c
156
+++ b/MAINTAINERS
106
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
157
@@ -XXX,XX +XXX,XX @@ F: include/hw/timer/cmsdk-apb-timer.h
107
case NEON_2RM_AESE: case NEON_2RM_AESMC:
158
F: tests/qtest/cmsdk-apb-timer-test.c
108
case NEON_2RM_SHA1H:
159
F: hw/timer/cmsdk-apb-dualtimer.c
109
case NEON_2RM_SHA1SU1:
160
F: include/hw/timer/cmsdk-apb-dualtimer.h
110
+ case NEON_2RM_VREV32:
161
+F: tests/qtest/cmsdk-apb-dualtimer-test.c
111
+ case NEON_2RM_VREV16:
162
F: hw/char/cmsdk-apb-uart.c
112
/* handled by decodetree */
163
F: include/hw/char/cmsdk-apb-uart.h
113
return 1;
164
F: hw/watchdog/cmsdk-apb-watchdog.c
114
case NEON_2RM_VTRN:
165
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
115
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
166
index XXXXXXX..XXXXXXX 100644
116
for (pass = 0; pass < (q ? 4 : 2); pass++) {
167
--- a/tests/qtest/meson.build
117
tmp = neon_load_reg(rm, pass);
168
+++ b/tests/qtest/meson.build
118
switch (op) {
169
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
119
- case NEON_2RM_VREV32:
170
'npcm7xx_timer-test',
120
- switch (size) {
171
'npcm7xx_watchdog_timer-test']
121
- case 0: tcg_gen_bswap32_i32(tmp, tmp); break;
172
qtests_arm = \
122
- case 1: gen_swap_half(tmp, tmp); break;
173
+ (config_all_devices.has_key('CONFIG_CMSDK_APB_DUALTIMER') ? ['cmsdk-apb-dualtimer-test'] : []) + \
123
- default: abort();
174
(config_all_devices.has_key('CONFIG_CMSDK_APB_TIMER') ? ['cmsdk-apb-timer-test'] : []) + \
124
- }
175
(config_all_devices.has_key('CONFIG_CMSDK_APB_WATCHDOG') ? ['cmsdk-apb-watchdog-test'] : []) + \
125
- break;
176
(config_all_devices.has_key('CONFIG_PFLASH_CFI02') ? ['pflash-cfi02-test'] : []) + \
126
- case NEON_2RM_VREV16:
127
- gen_rev16(tmp, tmp);
128
- break;
129
case NEON_2RM_VCLS:
130
switch (size) {
131
case 0: gen_helper_neon_cls_s8(tmp, tmp); break;
132
--
177
--
133
2.20.1
178
2.20.1
134
179
135
180
diff view generated by jsdifflib
1
In commit cfdb2c0c95ae9205b0 ("target/arm: Vectorize SABA/UABA") we
1
The state struct for the CMSDK APB timer device doesn't follow our
2
replaced the old handling of SABA/UABA with a vectorized implementation
2
usual naming convention of camelcase -- "CMSDK" and "APB" are both
3
which returns early rather than falling into the loop-ever-elements
3
acronyms, but "TIMER" is not so should not be all-uppercase.
4
code. We forgot to delete the part of the old looping code that
4
Globally rename the struct to "CMSDKAPBTimer" (bringing it into line
5
did the accumulate step, and Coverity correctly warns (CID 1428955)
5
with CMSDKAPBWatchdog and CMSDKAPBDualTimer; CMSDKAPBUART remains
6
that this code is now dead. Delete it.
6
as-is because "UART" is an acronym).
7
7
8
Fixes: cfdb2c0c95ae9205b0
8
Commit created with:
9
perl -p -i -e 's/CMSDKAPBTIMER/CMSDKAPBTimer/g' hw/timer/cmsdk-apb-timer.c include/hw/arm/armsse.h include/hw/timer/cmsdk-apb-timer.h
10
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Luc Michel <luc@lmichel.fr>
12
Message-id: 20200619171547.29780-1-peter.maydell@linaro.org
14
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20210128114145.20536-7-peter.maydell@linaro.org
16
Message-id: 20210121190622.22000-7-peter.maydell@linaro.org
13
---
17
---
14
target/arm/translate-a64.c | 12 ------------
18
include/hw/arm/armsse.h | 6 +++---
15
1 file changed, 12 deletions(-)
19
include/hw/timer/cmsdk-apb-timer.h | 4 ++--
20
hw/timer/cmsdk-apb-timer.c | 28 ++++++++++++++--------------
21
3 files changed, 19 insertions(+), 19 deletions(-)
16
22
17
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
23
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
18
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/translate-a64.c
25
--- a/include/hw/arm/armsse.h
20
+++ b/target/arm/translate-a64.c
26
+++ b/include/hw/arm/armsse.h
21
@@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn)
27
@@ -XXX,XX +XXX,XX @@ struct ARMSSE {
22
genfn(tcg_res, tcg_op1, tcg_op2);
28
TZPPC apb_ppc0;
23
}
29
TZPPC apb_ppc1;
24
30
TZMPC mpc[IOTS_NUM_MPC];
25
- if (opcode == 0xf) {
31
- CMSDKAPBTIMER timer0;
26
- /* SABA, UABA: accumulating ops */
32
- CMSDKAPBTIMER timer1;
27
- static NeonGenTwoOpFn * const fns[3] = {
33
- CMSDKAPBTIMER s32ktimer;
28
- gen_helper_neon_add_u8,
34
+ CMSDKAPBTimer timer0;
29
- gen_helper_neon_add_u16,
35
+ CMSDKAPBTimer timer1;
30
- tcg_gen_add_i32,
36
+ CMSDKAPBTimer s32ktimer;
31
- };
37
qemu_or_irq ppc_irq_orgate;
32
-
38
SplitIRQ sec_resp_splitter;
33
- read_vec_element_i32(s, tcg_op1, rd, pass, MO_32);
39
SplitIRQ ppc_irq_splitter[NUM_PPCS];
34
- fns[size](tcg_res, tcg_op1, tcg_res);
40
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
35
- }
41
index XXXXXXX..XXXXXXX 100644
36
-
42
--- a/include/hw/timer/cmsdk-apb-timer.h
37
write_vec_element_i32(s, tcg_res, rd, pass, MO_32);
43
+++ b/include/hw/timer/cmsdk-apb-timer.h
38
44
@@ -XXX,XX +XXX,XX @@
39
tcg_temp_free_i32(tcg_res);
45
#include "qom/object.h"
46
47
#define TYPE_CMSDK_APB_TIMER "cmsdk-apb-timer"
48
-OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTIMER, CMSDK_APB_TIMER)
49
+OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTimer, CMSDK_APB_TIMER)
50
51
-struct CMSDKAPBTIMER {
52
+struct CMSDKAPBTimer {
53
/*< private >*/
54
SysBusDevice parent_obj;
55
56
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/timer/cmsdk-apb-timer.c
59
+++ b/hw/timer/cmsdk-apb-timer.c
60
@@ -XXX,XX +XXX,XX @@ static const int timer_id[] = {
61
0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
62
};
63
64
-static void cmsdk_apb_timer_update(CMSDKAPBTIMER *s)
65
+static void cmsdk_apb_timer_update(CMSDKAPBTimer *s)
66
{
67
qemu_set_irq(s->timerint, !!(s->intstatus & R_INTSTATUS_IRQ_MASK));
68
}
69
70
static uint64_t cmsdk_apb_timer_read(void *opaque, hwaddr offset, unsigned size)
71
{
72
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
73
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(opaque);
74
uint64_t r;
75
76
switch (offset) {
77
@@ -XXX,XX +XXX,XX @@ static uint64_t cmsdk_apb_timer_read(void *opaque, hwaddr offset, unsigned size)
78
static void cmsdk_apb_timer_write(void *opaque, hwaddr offset, uint64_t value,
79
unsigned size)
80
{
81
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
82
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(opaque);
83
84
trace_cmsdk_apb_timer_write(offset, value, size);
85
86
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps cmsdk_apb_timer_ops = {
87
88
static void cmsdk_apb_timer_tick(void *opaque)
89
{
90
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
91
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(opaque);
92
93
if (s->ctrl & R_CTRL_IRQEN_MASK) {
94
s->intstatus |= R_INTSTATUS_IRQ_MASK;
95
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_tick(void *opaque)
96
97
static void cmsdk_apb_timer_reset(DeviceState *dev)
98
{
99
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(dev);
100
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(dev);
101
102
trace_cmsdk_apb_timer_reset();
103
s->ctrl = 0;
104
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_reset(DeviceState *dev)
105
static void cmsdk_apb_timer_init(Object *obj)
106
{
107
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
108
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(obj);
109
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(obj);
110
111
memory_region_init_io(&s->iomem, obj, &cmsdk_apb_timer_ops,
112
s, "cmsdk-apb-timer", 0x1000);
113
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_init(Object *obj)
114
115
static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
116
{
117
- CMSDKAPBTIMER *s = CMSDK_APB_TIMER(dev);
118
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(dev);
119
120
if (s->pclk_frq == 0) {
121
error_setg(errp, "CMSDK APB timer: pclk-frq property must be set");
122
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_apb_timer_vmstate = {
123
.version_id = 1,
124
.minimum_version_id = 1,
125
.fields = (VMStateField[]) {
126
- VMSTATE_PTIMER(timer, CMSDKAPBTIMER),
127
- VMSTATE_UINT32(ctrl, CMSDKAPBTIMER),
128
- VMSTATE_UINT32(value, CMSDKAPBTIMER),
129
- VMSTATE_UINT32(reload, CMSDKAPBTIMER),
130
- VMSTATE_UINT32(intstatus, CMSDKAPBTIMER),
131
+ VMSTATE_PTIMER(timer, CMSDKAPBTimer),
132
+ VMSTATE_UINT32(ctrl, CMSDKAPBTimer),
133
+ VMSTATE_UINT32(value, CMSDKAPBTimer),
134
+ VMSTATE_UINT32(reload, CMSDKAPBTimer),
135
+ VMSTATE_UINT32(intstatus, CMSDKAPBTimer),
136
VMSTATE_END_OF_LIST()
137
}
138
};
139
140
static Property cmsdk_apb_timer_properties[] = {
141
- DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBTIMER, pclk_frq, 0),
142
+ DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBTimer, pclk_frq, 0),
143
DEFINE_PROP_END_OF_LIST(),
144
};
145
146
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_class_init(ObjectClass *klass, void *data)
147
static const TypeInfo cmsdk_apb_timer_info = {
148
.name = TYPE_CMSDK_APB_TIMER,
149
.parent = TYPE_SYS_BUS_DEVICE,
150
- .instance_size = sizeof(CMSDKAPBTIMER),
151
+ .instance_size = sizeof(CMSDKAPBTimer),
152
.instance_init = cmsdk_apb_timer_init,
153
.class_init = cmsdk_apb_timer_class_init,
154
};
40
--
155
--
41
2.20.1
156
2.20.1
42
157
43
158
diff view generated by jsdifflib
1
Convert the fp-compare-with-zero insns in the Neon 2-reg-misc group to
1
As the first step in converting the CMSDK_APB_TIMER device to the
2
decodetree.
2
Clock framework, add a Clock input. For the moment we do nothing
3
with this clock; we will change the behaviour from using the pclk-frq
4
property to using the Clock once all the users of this device have
5
been converted to wire up the Clock.
6
7
Since the device doesn't already have a doc comment for its "QEMU
8
interface", we add one including the new Clock.
9
10
This is a migration compatibility break for machines mps2-an505,
11
mps2-an521, musca-a, musca-b1.
3
12
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200616170844.13318-17-peter.maydell@linaro.org
15
Reviewed-by: Luc Michel <luc@lmichel.fr>
16
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20210128114145.20536-8-peter.maydell@linaro.org
18
Message-id: 20210121190622.22000-8-peter.maydell@linaro.org
7
---
19
---
8
target/arm/neon-dp.decode | 6 ++++
20
include/hw/timer/cmsdk-apb-timer.h | 9 +++++++++
9
target/arm/translate-neon.inc.c | 28 ++++++++++++++++++
21
hw/timer/cmsdk-apb-timer.c | 7 +++++--
10
target/arm/translate.c | 50 ++++-----------------------------
22
2 files changed, 14 insertions(+), 2 deletions(-)
11
3 files changed, 39 insertions(+), 45 deletions(-)
12
23
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
24
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
14
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
26
--- a/include/hw/timer/cmsdk-apb-timer.h
16
+++ b/target/arm/neon-dp.decode
27
+++ b/include/hw/timer/cmsdk-apb-timer.h
17
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
28
@@ -XXX,XX +XXX,XX @@
18
VABS 1111 001 11 . 11 .. 01 .... 0 0110 . . 0 .... @2misc
29
#include "hw/qdev-properties.h"
19
VNEG 1111 001 11 . 11 .. 01 .... 0 0111 . . 0 .... @2misc
30
#include "hw/sysbus.h"
20
31
#include "hw/ptimer.h"
21
+ VCGT0_F 1111 001 11 . 11 .. 01 .... 0 1000 . . 0 .... @2misc
32
+#include "hw/clock.h"
22
+ VCGE0_F 1111 001 11 . 11 .. 01 .... 0 1001 . . 0 .... @2misc
33
#include "qom/object.h"
23
+ VCEQ0_F 1111 001 11 . 11 .. 01 .... 0 1010 . . 0 .... @2misc
34
24
+ VCLE0_F 1111 001 11 . 11 .. 01 .... 0 1011 . . 0 .... @2misc
35
#define TYPE_CMSDK_APB_TIMER "cmsdk-apb-timer"
25
+ VCLT0_F 1111 001 11 . 11 .. 01 .... 0 1100 . . 0 .... @2misc
36
OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTimer, CMSDK_APB_TIMER)
26
+
37
27
VABS_F 1111 001 11 . 11 .. 01 .... 0 1110 . . 0 .... @2misc
38
+/*
28
VNEG_F 1111 001 11 . 11 .. 01 .... 0 1111 . . 0 .... @2misc
39
+ * QEMU interface:
29
40
+ * + QOM property "pclk-frq": frequency at which the timer is clocked
30
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
41
+ * + Clock input "pclk": clock for the timer
42
+ * + sysbus MMIO region 0: the register bank
43
+ * + sysbus IRQ 0: timer interrupt TIMERINT
44
+ */
45
struct CMSDKAPBTimer {
46
/*< private >*/
47
SysBusDevice parent_obj;
48
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBTimer {
49
qemu_irq timerint;
50
uint32_t pclk_frq;
51
struct ptimer_state *timer;
52
+ Clock *pclk;
53
54
uint32_t ctrl;
55
uint32_t value;
56
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
31
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/translate-neon.inc.c
58
--- a/hw/timer/cmsdk-apb-timer.c
33
+++ b/target/arm/translate-neon.inc.c
59
+++ b/hw/timer/cmsdk-apb-timer.c
34
@@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX(DisasContext *s, arg_2misc *a)
60
@@ -XXX,XX +XXX,XX @@
35
}
61
#include "hw/sysbus.h"
36
return do_2misc_fp(s, a, gen_helper_rints_exact);
62
#include "hw/irq.h"
63
#include "hw/registerfields.h"
64
+#include "hw/qdev-clock.h"
65
#include "hw/timer/cmsdk-apb-timer.h"
66
#include "migration/vmstate.h"
67
68
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_init(Object *obj)
69
s, "cmsdk-apb-timer", 0x1000);
70
sysbus_init_mmio(sbd, &s->iomem);
71
sysbus_init_irq(sbd, &s->timerint);
72
+ s->pclk = qdev_init_clock_in(DEVICE(s), "pclk", NULL, NULL);
37
}
73
}
38
+
74
39
+#define WRAP_FP_CMP0_FWD(WRAPNAME, FUNC) \
75
static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
40
+ static void WRAPNAME(TCGv_i32 d, TCGv_i32 m, TCGv_ptr fpst) \
76
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
41
+ { \
77
42
+ TCGv_i32 zero = tcg_const_i32(0); \
78
static const VMStateDescription cmsdk_apb_timer_vmstate = {
43
+ FUNC(d, m, zero, fpst); \
79
.name = "cmsdk-apb-timer",
44
+ tcg_temp_free_i32(zero); \
80
- .version_id = 1,
45
+ }
81
- .minimum_version_id = 1,
46
+#define WRAP_FP_CMP0_REV(WRAPNAME, FUNC) \
82
+ .version_id = 2,
47
+ static void WRAPNAME(TCGv_i32 d, TCGv_i32 m, TCGv_ptr fpst) \
83
+ .minimum_version_id = 2,
48
+ { \
84
.fields = (VMStateField[]) {
49
+ TCGv_i32 zero = tcg_const_i32(0); \
85
VMSTATE_PTIMER(timer, CMSDKAPBTimer),
50
+ FUNC(d, zero, m, fpst); \
86
+ VMSTATE_CLOCK(pclk, CMSDKAPBTimer),
51
+ tcg_temp_free_i32(zero); \
87
VMSTATE_UINT32(ctrl, CMSDKAPBTimer),
52
+ }
88
VMSTATE_UINT32(value, CMSDKAPBTimer),
53
+
89
VMSTATE_UINT32(reload, CMSDKAPBTimer),
54
+#define DO_FP_CMP0(INSN, FUNC, REV) \
55
+ WRAP_FP_CMP0_##REV(gen_##INSN, FUNC) \
56
+ static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
57
+ { \
58
+ return do_2misc_fp(s, a, gen_##INSN); \
59
+ }
60
+
61
+DO_FP_CMP0(VCGT0_F, gen_helper_neon_cgt_f32, FWD)
62
+DO_FP_CMP0(VCGE0_F, gen_helper_neon_cge_f32, FWD)
63
+DO_FP_CMP0(VCEQ0_F, gen_helper_neon_ceq_f32, FWD)
64
+DO_FP_CMP0(VCLE0_F, gen_helper_neon_cge_f32, REV)
65
+DO_FP_CMP0(VCLT0_F, gen_helper_neon_cgt_f32, REV)
66
diff --git a/target/arm/translate.c b/target/arm/translate.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/arm/translate.c
69
+++ b/target/arm/translate.c
70
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
71
case NEON_2RM_VCVT_SF:
72
case NEON_2RM_VCVT_UF:
73
case NEON_2RM_VRINTX:
74
+ case NEON_2RM_VCGT0_F:
75
+ case NEON_2RM_VCGE0_F:
76
+ case NEON_2RM_VCEQ0_F:
77
+ case NEON_2RM_VCLE0_F:
78
+ case NEON_2RM_VCLT0_F:
79
/* handled by decodetree */
80
return 1;
81
case NEON_2RM_VTRN:
82
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
83
for (pass = 0; pass < (q ? 4 : 2); pass++) {
84
tmp = neon_load_reg(rm, pass);
85
switch (op) {
86
- case NEON_2RM_VCGT0_F:
87
- {
88
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
89
- tmp2 = tcg_const_i32(0);
90
- gen_helper_neon_cgt_f32(tmp, tmp, tmp2, fpstatus);
91
- tcg_temp_free_i32(tmp2);
92
- tcg_temp_free_ptr(fpstatus);
93
- break;
94
- }
95
- case NEON_2RM_VCGE0_F:
96
- {
97
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
98
- tmp2 = tcg_const_i32(0);
99
- gen_helper_neon_cge_f32(tmp, tmp, tmp2, fpstatus);
100
- tcg_temp_free_i32(tmp2);
101
- tcg_temp_free_ptr(fpstatus);
102
- break;
103
- }
104
- case NEON_2RM_VCEQ0_F:
105
- {
106
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
107
- tmp2 = tcg_const_i32(0);
108
- gen_helper_neon_ceq_f32(tmp, tmp, tmp2, fpstatus);
109
- tcg_temp_free_i32(tmp2);
110
- tcg_temp_free_ptr(fpstatus);
111
- break;
112
- }
113
- case NEON_2RM_VCLE0_F:
114
- {
115
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
116
- tmp2 = tcg_const_i32(0);
117
- gen_helper_neon_cge_f32(tmp, tmp2, tmp, fpstatus);
118
- tcg_temp_free_i32(tmp2);
119
- tcg_temp_free_ptr(fpstatus);
120
- break;
121
- }
122
- case NEON_2RM_VCLT0_F:
123
- {
124
- TCGv_ptr fpstatus = get_fpstatus_ptr(1);
125
- tmp2 = tcg_const_i32(0);
126
- gen_helper_neon_cgt_f32(tmp, tmp2, tmp, fpstatus);
127
- tcg_temp_free_i32(tmp2);
128
- tcg_temp_free_ptr(fpstatus);
129
- break;
130
- }
131
case NEON_2RM_VSWP:
132
tmp2 = neon_load_reg(rd, pass);
133
neon_store_reg(rm, pass, tmp2);
134
--
90
--
135
2.20.1
91
2.20.1
136
92
137
93
diff view generated by jsdifflib
1
All the other typedefs like these spell "Op" with a lowercase 'p';
1
As the first step in converting the CMSDK_APB_DUALTIMER device to the
2
remane the NeonGenTwoSingleOPFn and NeonGenTwoDoubleOPFn typedefs to
2
Clock framework, add a Clock input. For the moment we do nothing
3
match.
3
with this clock; we will change the behaviour from using the pclk-frq
4
property to using the Clock once all the users of this device have
5
been converted to wire up the Clock.
6
7
We take the opportunity to correct the name of the clock input to
8
match the hardware -- the dual timer names the clock which drives the
9
timers TIMCLK. (It does also have a 'pclk' input, which is used only
10
for the register and APB bus logic; on the SSE-200 these clocks are
11
both connected together.)
12
13
This is a migration compatibility break for machines mps2-an385,
14
mps2-an386, mps2-an500, mps2-an511, mps2-an505, mps2-an521, musca-a,
15
musca-b1.
4
16
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20200616170844.13318-11-peter.maydell@linaro.org
19
Reviewed-by: Luc Michel <luc@lmichel.fr>
20
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Message-id: 20210128114145.20536-9-peter.maydell@linaro.org
22
Message-id: 20210121190622.22000-9-peter.maydell@linaro.org
8
---
23
---
9
target/arm/translate.h | 4 ++--
24
include/hw/timer/cmsdk-apb-dualtimer.h | 3 +++
10
target/arm/translate-a64.c | 4 ++--
25
hw/timer/cmsdk-apb-dualtimer.c | 7 +++++--
11
target/arm/translate-neon.inc.c | 2 +-
26
2 files changed, 8 insertions(+), 2 deletions(-)
12
3 files changed, 5 insertions(+), 5 deletions(-)
13
27
14
diff --git a/target/arm/translate.h b/target/arm/translate.h
28
diff --git a/include/hw/timer/cmsdk-apb-dualtimer.h b/include/hw/timer/cmsdk-apb-dualtimer.h
15
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.h
30
--- a/include/hw/timer/cmsdk-apb-dualtimer.h
17
+++ b/target/arm/translate.h
31
+++ b/include/hw/timer/cmsdk-apb-dualtimer.h
18
@@ -XXX,XX +XXX,XX @@ typedef void NeonGenNarrowFn(TCGv_i32, TCGv_i64);
32
@@ -XXX,XX +XXX,XX @@
19
typedef void NeonGenNarrowEnvFn(TCGv_i32, TCGv_ptr, TCGv_i64);
33
*
20
typedef void NeonGenWidenFn(TCGv_i64, TCGv_i32);
34
* QEMU interface:
21
typedef void NeonGenTwoOpWidenFn(TCGv_i64, TCGv_i32, TCGv_i32);
35
* + QOM property "pclk-frq": frequency at which the timer is clocked
22
-typedef void NeonGenTwoSingleOPFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
36
+ * + Clock input "TIMCLK": clock (for both timers)
23
-typedef void NeonGenTwoDoubleOPFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr);
37
* + sysbus MMIO region 0: the register bank
24
+typedef void NeonGenTwoSingleOpFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
38
* + sysbus IRQ 0: combined timer interrupt TIMINTC
25
+typedef void NeonGenTwoDoubleOpFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr);
39
* + sysbus IRO 1: timer block 1 interrupt TIMINT1
26
typedef void NeonGenOne64OpFn(TCGv_i64, TCGv_i64);
40
@@ -XXX,XX +XXX,XX @@
27
typedef void CryptoTwoOpFn(TCGv_ptr, TCGv_ptr);
41
28
typedef void CryptoThreeOpIntFn(TCGv_ptr, TCGv_ptr, TCGv_i32);
42
#include "hw/sysbus.h"
29
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
43
#include "hw/ptimer.h"
44
+#include "hw/clock.h"
45
#include "qom/object.h"
46
47
#define TYPE_CMSDK_APB_DUALTIMER "cmsdk-apb-dualtimer"
48
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBDualTimer {
49
MemoryRegion iomem;
50
qemu_irq timerintc;
51
uint32_t pclk_frq;
52
+ Clock *timclk;
53
54
CMSDKAPBDualTimerModule timermod[CMSDK_APB_DUALTIMER_NUM_MODULES];
55
uint32_t timeritcr;
56
diff --git a/hw/timer/cmsdk-apb-dualtimer.c b/hw/timer/cmsdk-apb-dualtimer.c
30
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/translate-a64.c
58
--- a/hw/timer/cmsdk-apb-dualtimer.c
32
+++ b/target/arm/translate-a64.c
59
+++ b/hw/timer/cmsdk-apb-dualtimer.c
33
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
60
@@ -XXX,XX +XXX,XX @@
34
TCGv_i64 tcg_op = tcg_temp_new_i64();
61
#include "hw/irq.h"
35
TCGv_i64 tcg_zero = tcg_const_i64(0);
62
#include "hw/qdev-properties.h"
36
TCGv_i64 tcg_res = tcg_temp_new_i64();
63
#include "hw/registerfields.h"
37
- NeonGenTwoDoubleOPFn *genfn;
64
+#include "hw/qdev-clock.h"
38
+ NeonGenTwoDoubleOpFn *genfn;
65
#include "hw/timer/cmsdk-apb-dualtimer.h"
39
bool swap = false;
66
#include "migration/vmstate.h"
40
int pass;
67
41
68
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_init(Object *obj)
42
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
69
for (i = 0; i < ARRAY_SIZE(s->timermod); i++) {
43
TCGv_i32 tcg_op = tcg_temp_new_i32();
70
sysbus_init_irq(sbd, &s->timermod[i].timerint);
44
TCGv_i32 tcg_zero = tcg_const_i32(0);
71
}
45
TCGv_i32 tcg_res = tcg_temp_new_i32();
72
+ s->timclk = qdev_init_clock_in(DEVICE(s), "TIMCLK", NULL, NULL);
46
- NeonGenTwoSingleOPFn *genfn;
47
+ NeonGenTwoSingleOpFn *genfn;
48
bool swap = false;
49
int pass, maxpasses;
50
51
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/target/arm/translate-neon.inc.c
54
+++ b/target/arm/translate-neon.inc.c
55
@@ -XXX,XX +XXX,XX @@ static bool trans_VSHLL_U_2sh(DisasContext *s, arg_2reg_shift *a)
56
}
73
}
57
74
58
static bool do_fp_2sh(DisasContext *s, arg_2reg_shift *a,
75
static void cmsdk_apb_dualtimer_realize(DeviceState *dev, Error **errp)
59
- NeonGenTwoSingleOPFn *fn)
76
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_dualtimermod_vmstate = {
60
+ NeonGenTwoSingleOpFn *fn)
77
61
{
78
static const VMStateDescription cmsdk_apb_dualtimer_vmstate = {
62
/* FP operations in 2-reg-and-shift group */
79
.name = "cmsdk-apb-dualtimer",
63
TCGv_i32 tmp, shiftv;
80
- .version_id = 1,
81
- .minimum_version_id = 1,
82
+ .version_id = 2,
83
+ .minimum_version_id = 2,
84
.fields = (VMStateField[]) {
85
+ VMSTATE_CLOCK(timclk, CMSDKAPBDualTimer),
86
VMSTATE_STRUCT_ARRAY(timermod, CMSDKAPBDualTimer,
87
CMSDK_APB_DUALTIMER_NUM_MODULES,
88
1, cmsdk_dualtimermod_vmstate,
64
--
89
--
65
2.20.1
90
2.20.1
66
91
67
92
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
As the first step in converting the CMSDK_APB_TIMER device to the
2
Clock framework, add a Clock input. For the moment we do nothing
3
with this clock; we will change the behaviour from using the
4
wdogclk-frq property to using the Clock once all the users of this
5
device have been converted to wire up the Clock.
2
6
3
Add a trace event to see when a guest disable/enable the watchdog.
7
This is a migration compatibility break for machines mps2-an385,
8
mps2-an386, mps2-an500, mps2-an511, mps2-an505, mps2-an521, musca-a,
9
musca-b1, lm3s811evb, lm3s6965evb.
4
10
5
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200617072539.32686-2-f4bug@amsat.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Luc Michel <luc@lmichel.fr>
14
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Message-id: 20210128114145.20536-10-peter.maydell@linaro.org
16
Message-id: 20210121190622.22000-10-peter.maydell@linaro.org
9
---
17
---
10
hw/watchdog/cmsdk-apb-watchdog.c | 1 +
18
include/hw/watchdog/cmsdk-apb-watchdog.h | 3 +++
11
hw/watchdog/trace-events | 1 +
19
hw/watchdog/cmsdk-apb-watchdog.c | 7 +++++--
12
2 files changed, 2 insertions(+)
20
2 files changed, 8 insertions(+), 2 deletions(-)
13
21
22
diff --git a/include/hw/watchdog/cmsdk-apb-watchdog.h b/include/hw/watchdog/cmsdk-apb-watchdog.h
23
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/watchdog/cmsdk-apb-watchdog.h
25
+++ b/include/hw/watchdog/cmsdk-apb-watchdog.h
26
@@ -XXX,XX +XXX,XX @@
27
*
28
* QEMU interface:
29
* + QOM property "wdogclk-frq": frequency at which the watchdog is clocked
30
+ * + Clock input "WDOGCLK": clock for the watchdog's timer
31
* + sysbus MMIO region 0: the register bank
32
* + sysbus IRQ 0: watchdog interrupt
33
*
34
@@ -XXX,XX +XXX,XX @@
35
36
#include "hw/sysbus.h"
37
#include "hw/ptimer.h"
38
+#include "hw/clock.h"
39
#include "qom/object.h"
40
41
#define TYPE_CMSDK_APB_WATCHDOG "cmsdk-apb-watchdog"
42
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBWatchdog {
43
uint32_t wdogclk_frq;
44
bool is_luminary;
45
struct ptimer_state *timer;
46
+ Clock *wdogclk;
47
48
uint32_t control;
49
uint32_t intstatus;
14
diff --git a/hw/watchdog/cmsdk-apb-watchdog.c b/hw/watchdog/cmsdk-apb-watchdog.c
50
diff --git a/hw/watchdog/cmsdk-apb-watchdog.c b/hw/watchdog/cmsdk-apb-watchdog.c
15
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/watchdog/cmsdk-apb-watchdog.c
52
--- a/hw/watchdog/cmsdk-apb-watchdog.c
17
+++ b/hw/watchdog/cmsdk-apb-watchdog.c
53
+++ b/hw/watchdog/cmsdk-apb-watchdog.c
18
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_write(void *opaque, hwaddr offset,
19
break;
20
case A_WDOGLOCK:
21
s->lock = (value != WDOG_UNLOCK_VALUE);
22
+ trace_cmsdk_apb_watchdog_lock(s->lock);
23
break;
24
case A_WDOGITCR:
25
if (s->is_luminary) {
26
diff --git a/hw/watchdog/trace-events b/hw/watchdog/trace-events
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/watchdog/trace-events
29
+++ b/hw/watchdog/trace-events
30
@@ -XXX,XX +XXX,XX @@
54
@@ -XXX,XX +XXX,XX @@
31
cmsdk_apb_watchdog_read(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB watchdog read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
55
#include "hw/irq.h"
32
cmsdk_apb_watchdog_write(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB watchdog write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
56
#include "hw/qdev-properties.h"
33
cmsdk_apb_watchdog_reset(void) "CMSDK APB watchdog: reset"
57
#include "hw/registerfields.h"
34
+cmsdk_apb_watchdog_lock(uint32_t lock) "CMSDK APB watchdog: lock %" PRIu32
58
+#include "hw/qdev-clock.h"
59
#include "hw/watchdog/cmsdk-apb-watchdog.h"
60
#include "migration/vmstate.h"
61
62
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_init(Object *obj)
63
s, "cmsdk-apb-watchdog", 0x1000);
64
sysbus_init_mmio(sbd, &s->iomem);
65
sysbus_init_irq(sbd, &s->wdogint);
66
+ s->wdogclk = qdev_init_clock_in(DEVICE(s), "WDOGCLK", NULL, NULL);
67
68
s->is_luminary = false;
69
s->id = cmsdk_apb_watchdog_id;
70
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_realize(DeviceState *dev, Error **errp)
71
72
static const VMStateDescription cmsdk_apb_watchdog_vmstate = {
73
.name = "cmsdk-apb-watchdog",
74
- .version_id = 1,
75
- .minimum_version_id = 1,
76
+ .version_id = 2,
77
+ .minimum_version_id = 2,
78
.fields = (VMStateField[]) {
79
+ VMSTATE_CLOCK(wdogclk, CMSDKAPBWatchdog),
80
VMSTATE_PTIMER(timer, CMSDKAPBWatchdog),
81
VMSTATE_UINT32(control, CMSDKAPBWatchdog),
82
VMSTATE_UINT32(intstatus, CMSDKAPBWatchdog),
35
--
83
--
36
2.20.1
84
2.20.1
37
85
38
86
diff view generated by jsdifflib
1
The NeonGenOneOpFn typedef breaks with the pattern of the other
1
While we transition the ARMSSE code from integer properties
2
NeonGen*Fn typedefs, because it is a TCGv_i64 -> TCGv_i64 operation
2
specifying clock frequencies to Clock objects, we want to have the
3
but it does not have '64' in its name. Rename it to NeonGenOne64OpFn,
3
device provide both at once. We want the final name of the main
4
so that the old name is available for a TCGv_i32 -> TCGv_i32 operation
4
input Clock to be "MAINCLK", following the hardware name.
5
(which we will need in a subsequent commit).
5
Unfortunately creating an input Clock with a name X creates an
6
under-the-hood QOM property X; for "MAINCLK" this clashes with the
7
existing UINT32 property of that name.
8
9
Rename the UINT32 property to MAINCLK_FRQ so it can coexist with the
10
MAINCLK Clock; once the transition is complete MAINCLK_FRQ will be
11
deleted.
12
13
Commit created with:
14
perl -p -i -e 's/MAINCLK/MAINCLK_FRQ/g' hw/arm/{armsse,mps2-tz,musca}.c include/hw/arm/armsse.h
6
15
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20200616170844.13318-10-peter.maydell@linaro.org
18
Reviewed-by: Luc Michel <luc@lmichel.fr>
19
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
20
Message-id: 20210128114145.20536-11-peter.maydell@linaro.org
21
Message-id: 20210121190622.22000-11-peter.maydell@linaro.org
10
---
22
---
11
target/arm/translate.h | 2 +-
23
include/hw/arm/armsse.h | 2 +-
12
target/arm/translate-a64.c | 4 ++--
24
hw/arm/armsse.c | 6 +++---
13
2 files changed, 3 insertions(+), 3 deletions(-)
25
hw/arm/mps2-tz.c | 2 +-
26
hw/arm/musca.c | 2 +-
27
4 files changed, 6 insertions(+), 6 deletions(-)
14
28
15
diff --git a/target/arm/translate.h b/target/arm/translate.h
29
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
16
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate.h
31
--- a/include/hw/arm/armsse.h
18
+++ b/target/arm/translate.h
32
+++ b/include/hw/arm/armsse.h
19
@@ -XXX,XX +XXX,XX @@ typedef void NeonGenWidenFn(TCGv_i64, TCGv_i32);
33
@@ -XXX,XX +XXX,XX @@
20
typedef void NeonGenTwoOpWidenFn(TCGv_i64, TCGv_i32, TCGv_i32);
34
* QEMU interface:
21
typedef void NeonGenTwoSingleOPFn(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
35
* + QOM property "memory" is a MemoryRegion containing the devices provided
22
typedef void NeonGenTwoDoubleOPFn(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_ptr);
36
* by the board model.
23
-typedef void NeonGenOneOpFn(TCGv_i64, TCGv_i64);
37
- * + QOM property "MAINCLK" is the frequency of the main system clock
24
+typedef void NeonGenOne64OpFn(TCGv_i64, TCGv_i64);
38
+ * + QOM property "MAINCLK_FRQ" is the frequency of the main system clock
25
typedef void CryptoTwoOpFn(TCGv_ptr, TCGv_ptr);
39
* + QOM property "EXP_NUMIRQ" sets the number of expansion interrupts.
26
typedef void CryptoThreeOpIntFn(TCGv_ptr, TCGv_ptr, TCGv_i32);
40
* (In hardware, the SSE-200 permits the number of expansion interrupts
27
typedef void CryptoThreeOpFn(TCGv_ptr, TCGv_ptr, TCGv_ptr);
41
* for the two CPUs to be configured separately, but we restrict it to
28
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
42
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
29
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/translate-a64.c
44
--- a/hw/arm/armsse.c
31
+++ b/target/arm/translate-a64.c
45
+++ b/hw/arm/armsse.c
32
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u,
46
@@ -XXX,XX +XXX,XX @@ static Property iotkit_properties[] = {
33
} else {
47
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
34
for (pass = 0; pass < maxpass; pass++) {
48
MemoryRegion *),
35
TCGv_i64 tcg_op = tcg_temp_new_i64();
49
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
36
- NeonGenOneOpFn *genfn;
50
- DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
37
- static NeonGenOneOpFn * const fns[2][2] = {
51
+ DEFINE_PROP_UINT32("MAINCLK_FRQ", ARMSSE, mainclk_frq, 0),
38
+ NeonGenOne64OpFn *genfn;
52
DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
39
+ static NeonGenOne64OpFn * const fns[2][2] = {
53
DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
40
{ gen_helper_neon_addlp_s8, gen_helper_neon_addlp_u8 },
54
DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], true),
41
{ gen_helper_neon_addlp_s16, gen_helper_neon_addlp_u16 },
55
@@ -XXX,XX +XXX,XX @@ static Property armsse_properties[] = {
42
};
56
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
57
MemoryRegion *),
58
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
59
- DEFINE_PROP_UINT32("MAINCLK", ARMSSE, mainclk_frq, 0),
60
+ DEFINE_PROP_UINT32("MAINCLK_FRQ", ARMSSE, mainclk_frq, 0),
61
DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
62
DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
63
DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], false),
64
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
65
}
66
67
if (!s->mainclk_frq) {
68
- error_setg(errp, "MAINCLK property was not set");
69
+ error_setg(errp, "MAINCLK_FRQ property was not set");
70
return;
71
}
72
73
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/hw/arm/mps2-tz.c
76
+++ b/hw/arm/mps2-tz.c
77
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
78
object_property_set_link(OBJECT(&mms->iotkit), "memory",
79
OBJECT(system_memory), &error_abort);
80
qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", MPS2TZ_NUMIRQ);
81
- qdev_prop_set_uint32(iotkitdev, "MAINCLK", SYSCLK_FRQ);
82
+ qdev_prop_set_uint32(iotkitdev, "MAINCLK_FRQ", SYSCLK_FRQ);
83
sysbus_realize(SYS_BUS_DEVICE(&mms->iotkit), &error_fatal);
84
85
/*
86
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/arm/musca.c
89
+++ b/hw/arm/musca.c
90
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
91
qdev_prop_set_uint32(ssedev, "EXP_NUMIRQ", mmc->num_irqs);
92
qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor);
93
qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width);
94
- qdev_prop_set_uint32(ssedev, "MAINCLK", SYSCLK_FRQ);
95
+ qdev_prop_set_uint32(ssedev, "MAINCLK_FRQ", SYSCLK_FRQ);
96
/*
97
* Musca-A takes the default SSE-200 FPU/DSP settings (ie no for
98
* CPU0 and yes for CPU1); Musca-B1 explicitly enables them for CPU0.
43
--
99
--
44
2.20.1
100
2.20.1
45
101
46
102
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@redhat.com>
1
Create two input clocks on the ARMSSE devices, one for the normal
2
MAINCLK, and one for the 32KHz S32KCLK, and wire these up to the
3
appropriate devices. The old property-based clock frequency setting
4
will remain in place until conversion is complete.
2
5
3
Since commit d70c996df23f, when enabling the PMU we get:
6
This is a migration compatibility break for machines mps2-an505,
7
mps2-an521, musca-a, musca-b1.
4
8
5
$ qemu-system-aarch64 -cpu host,pmu=on -M virt,accel=kvm,gic-version=3
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Segmentation fault (core dumped)
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Luc Michel <luc@lmichel.fr>
12
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20210128114145.20536-12-peter.maydell@linaro.org
14
Message-id: 20210121190622.22000-12-peter.maydell@linaro.org
15
---
16
include/hw/arm/armsse.h | 6 ++++++
17
hw/arm/armsse.c | 17 +++++++++++++++--
18
2 files changed, 21 insertions(+), 2 deletions(-)
7
19
8
Thread 1 "qemu-system-aar" received signal SIGSEGV, Segmentation fault.
20
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
9
0x0000aaaaaae356d0 in kvm_ioctl (s=0x0, type=44547) at accel/kvm/kvm-all.c:2588
10
2588 ret = ioctl(s->fd, type, arg);
11
(gdb) bt
12
#0 0x0000aaaaaae356d0 in kvm_ioctl (s=0x0, type=44547) at accel/kvm/kvm-all.c:2588
13
#1 0x0000aaaaaae31568 in kvm_check_extension (s=0x0, extension=126) at accel/kvm/kvm-all.c:916
14
#2 0x0000aaaaaafce254 in kvm_arm_pmu_supported (cpu=0xaaaaac214ab0) at target/arm/kvm.c:213
15
#3 0x0000aaaaaafc0f94 in arm_set_pmu (obj=0xaaaaac214ab0, value=true, errp=0xffffffffe438) at target/arm/cpu.c:1111
16
#4 0x0000aaaaab5533ac in property_set_bool (obj=0xaaaaac214ab0, v=0xaaaaac223a80, name=0xaaaaac11a970 "pmu", opaque=0xaaaaac222730, errp=0xffffffffe438) at qom/object.c:2170
17
#5 0x0000aaaaab5512f0 in object_property_set (obj=0xaaaaac214ab0, v=0xaaaaac223a80, name=0xaaaaac11a970 "pmu", errp=0xffffffffe438) at qom/object.c:1328
18
#6 0x0000aaaaab551e10 in object_property_parse (obj=0xaaaaac214ab0, string=0xaaaaac11b4c0 "on", name=0xaaaaac11a970 "pmu", errp=0xffffffffe438) at qom/object.c:1561
19
#7 0x0000aaaaab54ee8c in object_apply_global_props (obj=0xaaaaac214ab0, props=0xaaaaac018e20, errp=0xaaaaabd6fd88 <error_fatal>) at qom/object.c:407
20
#8 0x0000aaaaab1dd5a4 in qdev_prop_set_globals (dev=0xaaaaac214ab0) at hw/core/qdev-properties.c:1218
21
#9 0x0000aaaaab1d9fac in device_post_init (obj=0xaaaaac214ab0) at hw/core/qdev.c:1050
22
...
23
#15 0x0000aaaaab54f310 in object_initialize_with_type (obj=0xaaaaac214ab0, size=52208, type=0xaaaaabe237f0) at qom/object.c:512
24
#16 0x0000aaaaab54fa24 in object_new_with_type (type=0xaaaaabe237f0) at qom/object.c:687
25
#17 0x0000aaaaab54fa80 in object_new (typename=0xaaaaabe23970 "host-arm-cpu") at qom/object.c:702
26
#18 0x0000aaaaaaf04a74 in machvirt_init (machine=0xaaaaac0a8550) at hw/arm/virt.c:1770
27
#19 0x0000aaaaab1e8720 in machine_run_board_init (machine=0xaaaaac0a8550) at hw/core/machine.c:1138
28
#20 0x0000aaaaaaf95394 in qemu_init (argc=5, argv=0xffffffffea58, envp=0xffffffffea88) at softmmu/vl.c:4348
29
#21 0x0000aaaaaada3f74 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at softmmu/main.c:48
30
31
This is because in frame #2, cpu->kvm_state is still NULL
32
(the vCPU is not yet realized).
33
34
KVM has a hard requirement of all cores supporting the same
35
feature set. We only need to check if the accelerator supports
36
a feature, not each vCPU individually.
37
38
Fix by removing the 'CPUState *cpu' argument from the
39
kvm_arm_<FEATURE>_supported() functions.
40
41
Fixes: d70c996df23f ('Use CPUState::kvm_state in kvm_arm_pmu_supported')
42
Reported-by: Haibo Xu <haibo.xu@linaro.org>
43
Reviewed-by: Andrew Jones <drjones@redhat.com>
44
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
45
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
46
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
47
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
48
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
49
---
50
target/arm/kvm_arm.h | 21 +++++++++------------
51
target/arm/cpu.c | 2 +-
52
target/arm/cpu64.c | 10 +++++-----
53
target/arm/kvm.c | 4 ++--
54
target/arm/kvm64.c | 14 +++++---------
55
5 files changed, 22 insertions(+), 29 deletions(-)
56
57
diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h
58
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
59
--- a/target/arm/kvm_arm.h
22
--- a/include/hw/arm/armsse.h
60
+++ b/target/arm/kvm_arm.h
23
+++ b/include/hw/arm/armsse.h
61
@@ -XXX,XX +XXX,XX @@ void kvm_arm_add_vcpu_properties(Object *obj);
24
@@ -XXX,XX +XXX,XX @@
62
25
* per-CPU identity and control register blocks
63
/**
64
* kvm_arm_aarch32_supported:
65
- * @cs: CPUState
66
*
26
*
67
- * Returns: true if the KVM VCPU can enable AArch32 mode
27
* QEMU interface:
68
+ * Returns: true if KVM can enable AArch32 mode
28
+ * + Clock input "MAINCLK": clock for CPUs and most peripherals
69
* and false otherwise.
29
+ * + Clock input "S32KCLK": slow 32KHz clock used for a few peripherals
70
*/
30
* + QOM property "memory" is a MemoryRegion containing the devices provided
71
-bool kvm_arm_aarch32_supported(CPUState *cs);
31
* by the board model.
72
+bool kvm_arm_aarch32_supported(void);
32
* + QOM property "MAINCLK_FRQ" is the frequency of the main system clock
73
33
@@ -XXX,XX +XXX,XX @@
74
/**
34
#include "hw/misc/armsse-mhu.h"
75
* kvm_arm_pmu_supported:
35
#include "hw/misc/unimp.h"
76
- * @cs: CPUState
36
#include "hw/or-irq.h"
77
*
37
+#include "hw/clock.h"
78
- * Returns: true if the KVM VCPU can enable its PMU
38
#include "hw/core/split-irq.h"
79
+ * Returns: true if KVM can enable the PMU
39
#include "hw/cpu/cluster.h"
80
* and false otherwise.
40
#include "qom/object.h"
81
*/
41
@@ -XXX,XX +XXX,XX @@ struct ARMSSE {
82
-bool kvm_arm_pmu_supported(CPUState *cs);
42
83
+bool kvm_arm_pmu_supported(void);
43
uint32_t nsccfg;
84
44
85
/**
45
+ Clock *mainclk;
86
* kvm_arm_sve_supported:
46
+ Clock *s32kclk;
87
- * @cs: CPUState
47
+
88
*
48
/* Properties */
89
- * Returns true if the KVM VCPU can enable SVE and false otherwise.
49
MemoryRegion *board_memory;
90
+ * Returns true if KVM can enable SVE and false otherwise.
50
uint32_t exp_numirq;
91
*/
51
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
92
-bool kvm_arm_sve_supported(CPUState *cs);
93
+bool kvm_arm_sve_supported(void);
94
95
/**
96
* kvm_arm_get_max_vm_ipa_size:
97
@@ -XXX,XX +XXX,XX @@ static inline void kvm_arm_set_cpu_features_from_host(ARMCPU *cpu)
98
99
static inline void kvm_arm_add_vcpu_properties(Object *obj) {}
100
101
-static inline bool kvm_arm_aarch32_supported(CPUState *cs)
102
+static inline bool kvm_arm_aarch32_supported(void)
103
{
104
return false;
105
}
106
107
-static inline bool kvm_arm_pmu_supported(CPUState *cs)
108
+static inline bool kvm_arm_pmu_supported(void)
109
{
110
return false;
111
}
112
113
-static inline bool kvm_arm_sve_supported(CPUState *cs)
114
+static inline bool kvm_arm_sve_supported(void)
115
{
116
return false;
117
}
118
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
119
index XXXXXXX..XXXXXXX 100644
52
index XXXXXXX..XXXXXXX 100644
120
--- a/target/arm/cpu.c
53
--- a/hw/arm/armsse.c
121
+++ b/target/arm/cpu.c
54
+++ b/hw/arm/armsse.c
122
@@ -XXX,XX +XXX,XX @@ static void arm_set_pmu(Object *obj, bool value, Error **errp)
55
@@ -XXX,XX +XXX,XX @@
123
ARMCPU *cpu = ARM_CPU(obj);
56
#include "hw/arm/armsse.h"
124
57
#include "hw/arm/boot.h"
125
if (value) {
58
#include "hw/irq.h"
126
- if (kvm_enabled() && !kvm_arm_pmu_supported(CPU(cpu))) {
59
+#include "hw/qdev-clock.h"
127
+ if (kvm_enabled() && !kvm_arm_pmu_supported()) {
60
128
error_setg(errp, "'pmu' feature not supported by KVM on this host");
61
/* Format of the System Information block SYS_CONFIG register */
129
return;
62
typedef enum SysConfigFormat {
130
}
63
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
131
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
64
assert(info->sram_banks <= MAX_SRAM_BANKS);
132
index XXXXXXX..XXXXXXX 100644
65
assert(info->num_cpus <= SSE_MAX_CPUS);
133
--- a/target/arm/cpu64.c
66
134
+++ b/target/arm/cpu64.c
67
+ s->mainclk = qdev_init_clock_in(DEVICE(s), "MAINCLK", NULL, NULL);
135
@@ -XXX,XX +XXX,XX @@ void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp)
68
+ s->s32kclk = qdev_init_clock_in(DEVICE(s), "S32KCLK", NULL, NULL);
136
69
+
137
/* Collect the set of vector lengths supported by KVM. */
70
memory_region_init(&s->container, obj, "armsse-container", UINT64_MAX);
138
bitmap_zero(kvm_supported, ARM_MAX_VQ);
71
139
- if (kvm_enabled() && kvm_arm_sve_supported(CPU(cpu))) {
72
for (i = 0; i < info->num_cpus; i++) {
140
+ if (kvm_enabled() && kvm_arm_sve_supported()) {
73
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
141
kvm_arm_sve_get_vls(CPU(cpu), kvm_supported);
74
* map its upstream ends to the right place in the container.
142
} else if (kvm_enabled()) {
75
*/
143
assert(!cpu_isar_feature(aa64_sve, cpu));
76
qdev_prop_set_uint32(DEVICE(&s->timer0), "pclk-frq", s->mainclk_frq);
144
@@ -XXX,XX +XXX,XX @@ static void cpu_max_set_sve_max_vq(Object *obj, Visitor *v, const char *name,
77
+ qdev_connect_clock_in(DEVICE(&s->timer0), "pclk", s->mainclk);
78
if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer0), errp)) {
145
return;
79
return;
146
}
80
}
147
81
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
148
- if (kvm_enabled() && !kvm_arm_sve_supported(CPU(cpu))) {
82
&error_abort);
149
+ if (kvm_enabled() && !kvm_arm_sve_supported()) {
83
150
error_setg(errp, "cannot set sve-max-vq");
84
qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
151
error_append_hint(errp, "SVE not supported by KVM on this host\n");
85
+ qdev_connect_clock_in(DEVICE(&s->timer1), "pclk", s->mainclk);
152
return;
86
if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer1), errp)) {
153
@@ -XXX,XX +XXX,XX @@ static void cpu_arm_set_sve_vq(Object *obj, Visitor *v, const char *name,
154
return;
87
return;
155
}
88
}
156
89
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
157
- if (value && kvm_enabled() && !kvm_arm_sve_supported(CPU(cpu))) {
90
&error_abort);
158
+ if (value && kvm_enabled() && !kvm_arm_sve_supported()) {
91
159
error_setg(errp, "cannot enable %s", name);
92
qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
160
error_append_hint(errp, "SVE not supported by KVM on this host\n");
93
+ qdev_connect_clock_in(DEVICE(&s->dualtimer), "TIMCLK", s->mainclk);
161
return;
94
if (!sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), errp)) {
162
@@ -XXX,XX +XXX,XX @@ static void cpu_arm_set_sve(Object *obj, Visitor *v, const char *name,
163
return;
95
return;
164
}
96
}
165
97
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
166
- if (value && kvm_enabled() && !kvm_arm_sve_supported(CPU(cpu))) {
98
* 0x4002f000: S32K timer
167
+ if (value && kvm_enabled() && !kvm_arm_sve_supported()) {
99
*/
168
error_setg(errp, "'sve' feature not supported by KVM on this host");
100
qdev_prop_set_uint32(DEVICE(&s->s32ktimer), "pclk-frq", S32KCLK);
101
+ qdev_connect_clock_in(DEVICE(&s->s32ktimer), "pclk", s->s32kclk);
102
if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), errp)) {
169
return;
103
return;
170
}
104
}
171
@@ -XXX,XX +XXX,XX @@ static void aarch64_cpu_set_aarch64(Object *obj, bool value, Error **errp)
105
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
172
* uniform execution state like do_interrupt.
106
qdev_get_gpio_in_named(DEVICE(&s->armv7m), "NMI", 0));
173
*/
107
174
if (value == false) {
108
qdev_prop_set_uint32(DEVICE(&s->s32kwatchdog), "wdogclk-frq", S32KCLK);
175
- if (!kvm_enabled() || !kvm_arm_aarch32_supported(CPU(cpu))) {
109
+ qdev_connect_clock_in(DEVICE(&s->s32kwatchdog), "WDOGCLK", s->s32kclk);
176
+ if (!kvm_enabled() || !kvm_arm_aarch32_supported()) {
110
if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), errp)) {
177
error_setg(errp, "'aarch64' feature cannot be disabled "
111
return;
178
"unless KVM is enabled and 32-bit EL1 "
179
"is supported");
180
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
181
index XXXXXXX..XXXXXXX 100644
182
--- a/target/arm/kvm.c
183
+++ b/target/arm/kvm.c
184
@@ -XXX,XX +XXX,XX @@ void kvm_arm_add_vcpu_properties(Object *obj)
185
}
112
}
186
}
113
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
187
114
/* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
188
-bool kvm_arm_pmu_supported(CPUState *cpu)
115
189
+bool kvm_arm_pmu_supported(void)
116
qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
190
{
117
+ qdev_connect_clock_in(DEVICE(&s->nswatchdog), "WDOGCLK", s->mainclk);
191
- return kvm_check_extension(cpu->kvm_state, KVM_CAP_ARM_PMU_V3);
118
if (!sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), errp)) {
192
+ return kvm_check_extension(kvm_state, KVM_CAP_ARM_PMU_V3);
119
return;
193
}
194
195
int kvm_arm_get_max_vm_ipa_size(MachineState *ms)
196
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
197
index XXXXXXX..XXXXXXX 100644
198
--- a/target/arm/kvm64.c
199
+++ b/target/arm/kvm64.c
200
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
201
return true;
202
}
203
204
-bool kvm_arm_aarch32_supported(CPUState *cpu)
205
+bool kvm_arm_aarch32_supported(void)
206
{
207
- KVMState *s = KVM_STATE(current_accel());
208
-
209
- return kvm_check_extension(s, KVM_CAP_ARM_EL1_32BIT);
210
+ return kvm_check_extension(kvm_state, KVM_CAP_ARM_EL1_32BIT);
211
}
212
213
-bool kvm_arm_sve_supported(CPUState *cpu)
214
+bool kvm_arm_sve_supported(void)
215
{
216
- KVMState *s = KVM_STATE(current_accel());
217
-
218
- return kvm_check_extension(s, KVM_CAP_ARM_SVE);
219
+ return kvm_check_extension(kvm_state, KVM_CAP_ARM_SVE);
220
}
221
222
QEMU_BUILD_BUG_ON(KVM_ARM64_SVE_VQ_MIN != 1);
223
@@ -XXX,XX +XXX,XX @@ int kvm_arch_init_vcpu(CPUState *cs)
224
env->features &= ~(1ULL << ARM_FEATURE_PMU);
225
}
120
}
226
if (cpu_isar_feature(aa64_sve, cpu)) {
121
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
227
- assert(kvm_arm_sve_supported(cs));
122
sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
228
+ assert(kvm_arm_sve_supported());
123
229
cpu->kvm_init_features[0] |= 1 << KVM_ARM_VCPU_SVE;
124
qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
125
+ qdev_connect_clock_in(DEVICE(&s->swatchdog), "WDOGCLK", s->mainclk);
126
if (!sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), errp)) {
127
return;
230
}
128
}
231
129
@@ -XXX,XX +XXX,XX @@ static void armsse_idau_check(IDAUInterface *ii, uint32_t address,
130
131
static const VMStateDescription armsse_vmstate = {
132
.name = "iotkit",
133
- .version_id = 1,
134
- .minimum_version_id = 1,
135
+ .version_id = 2,
136
+ .minimum_version_id = 2,
137
.fields = (VMStateField[]) {
138
+ VMSTATE_CLOCK(mainclk, ARMSSE),
139
+ VMSTATE_CLOCK(s32kclk, ARMSSE),
140
VMSTATE_UINT32(nsccfg, ARMSSE),
141
VMSTATE_END_OF_LIST()
142
}
232
--
143
--
233
2.20.1
144
2.20.1
234
145
235
146
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
The old-style convenience function cmsdk_apb_timer_create() for
2
creating CMSDK_APB_TIMER objects is used in only two places in
3
mps2.c. Most of the rest of the code in that file uses the new
4
"initialize in place" coding style.
2
5
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
We want to connect up a Clock object which should be done between the
4
Message-id: 20200617072539.32686-7-f4bug@amsat.org
7
object creation and realization; rather than adding a Clock* argument
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
to the convenience function, convert the timer creation code in
9
mps2.c to the same style as is used already for the watchdog,
10
dualtimer and other devices, and delete the now-unused convenience
11
function.
12
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Reviewed-by: Luc Michel <luc@lmichel.fr>
16
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20210128114145.20536-13-peter.maydell@linaro.org
18
Message-id: 20210121190622.22000-13-peter.maydell@linaro.org
7
---
19
---
8
hw/arm/mps2.c | 5 ++++-
20
include/hw/timer/cmsdk-apb-timer.h | 21 ---------------------
9
1 file changed, 4 insertions(+), 1 deletion(-)
21
hw/arm/mps2.c | 18 ++++++++++++++++--
22
2 files changed, 16 insertions(+), 23 deletions(-)
10
23
24
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
25
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/timer/cmsdk-apb-timer.h
27
+++ b/include/hw/timer/cmsdk-apb-timer.h
28
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBTimer {
29
uint32_t intstatus;
30
};
31
32
-/**
33
- * cmsdk_apb_timer_create - convenience function to create TYPE_CMSDK_APB_TIMER
34
- * @addr: location in system memory to map registers
35
- * @pclk_frq: frequency in Hz of the PCLK clock (used for calculating baud rate)
36
- */
37
-static inline DeviceState *cmsdk_apb_timer_create(hwaddr addr,
38
- qemu_irq timerint,
39
- uint32_t pclk_frq)
40
-{
41
- DeviceState *dev;
42
- SysBusDevice *s;
43
-
44
- dev = qdev_new(TYPE_CMSDK_APB_TIMER);
45
- s = SYS_BUS_DEVICE(dev);
46
- qdev_prop_set_uint32(dev, "pclk-frq", pclk_frq);
47
- sysbus_realize_and_unref(s, &error_fatal);
48
- sysbus_mmio_map(s, 0, addr);
49
- sysbus_connect_irq(s, 0, timerint);
50
- return dev;
51
-}
52
-
53
#endif
11
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
54
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
12
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/mps2.c
56
--- a/hw/arm/mps2.c
14
+++ b/hw/arm/mps2.c
57
+++ b/hw/arm/mps2.c
15
@@ -XXX,XX +XXX,XX @@ typedef struct {
58
@@ -XXX,XX +XXX,XX @@ struct MPS2MachineState {
16
MemoryRegion blockram_m2;
59
/* CMSDK APB subsystem */
17
MemoryRegion blockram_m3;
18
MemoryRegion sram;
19
+ /* FPGA APB subsystem */
20
MPS2SCC scc;
21
+ /* CMSDK APB subsystem */
22
CMSDKAPBDualTimer dualtimer;
60
CMSDKAPBDualTimer dualtimer;
23
} MPS2MachineState;
61
CMSDKAPBWatchdog watchdog;
24
62
+ CMSDKAPBTimer timer[2];
63
};
64
65
#define TYPE_MPS2_MACHINE "mps2"
25
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
66
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
26
g_assert_not_reached();
27
}
67
}
28
68
29
+ /* CMSDK APB subsystem */
69
/* CMSDK APB subsystem */
30
cmsdk_apb_timer_create(0x40000000, qdev_get_gpio_in(armv7m, 8), SYSCLK_FRQ);
70
- cmsdk_apb_timer_create(0x40000000, qdev_get_gpio_in(armv7m, 8), SYSCLK_FRQ);
31
cmsdk_apb_timer_create(0x40001000, qdev_get_gpio_in(armv7m, 9), SYSCLK_FRQ);
71
- cmsdk_apb_timer_create(0x40001000, qdev_get_gpio_in(armv7m, 9), SYSCLK_FRQ);
32
-
72
+ for (i = 0; i < ARRAY_SIZE(mms->timer); i++) {
73
+ g_autofree char *name = g_strdup_printf("timer%d", i);
74
+ hwaddr base = 0x40000000 + i * 0x1000;
75
+ int irqno = 8 + i;
76
+ SysBusDevice *sbd;
77
+
78
+ object_initialize_child(OBJECT(mms), name, &mms->timer[i],
79
+ TYPE_CMSDK_APB_TIMER);
80
+ sbd = SYS_BUS_DEVICE(&mms->timer[i]);
81
+ qdev_prop_set_uint32(DEVICE(&mms->timer[i]), "pclk-frq", SYSCLK_FRQ);
82
+ sysbus_realize_and_unref(sbd, &error_fatal);
83
+ sysbus_mmio_map(sbd, 0, base);
84
+ sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(armv7m, irqno));
85
+ }
86
+
33
object_initialize_child(OBJECT(mms), "dualtimer", &mms->dualtimer,
87
object_initialize_child(OBJECT(mms), "dualtimer", &mms->dualtimer,
34
TYPE_CMSDK_APB_DUALTIMER);
88
TYPE_CMSDK_APB_DUALTIMER);
35
qdev_prop_set_uint32(DEVICE(&mms->dualtimer), "pclk-frq", SYSCLK_FRQ);
89
qdev_prop_set_uint32(DEVICE(&mms->dualtimer), "pclk-frq", SYSCLK_FRQ);
36
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
37
qdev_get_gpio_in(armv7m, 10));
38
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->dualtimer), 0, 0x40002000);
39
40
+ /* FPGA APB subsystem */
41
object_initialize_child(OBJECT(mms), "scc", &mms->scc, TYPE_MPS2_SCC);
42
sccdev = DEVICE(&mms->scc);
43
qdev_prop_set_uint32(sccdev, "scc-cfg4", 0x2);
44
--
90
--
45
2.20.1
91
2.20.1
46
92
47
93
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Create a fixed-frequency Clock object to be the SYSCLK, and wire it
2
up to the devices that require it.
2
3
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20200617072539.32686-11-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
7
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-14-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-14-peter.maydell@linaro.org
7
---
10
---
8
hw/arm/mps2.c | 9 +++++++++
11
hw/arm/mps2.c | 9 +++++++++
9
1 file changed, 9 insertions(+)
12
1 file changed, 9 insertions(+)
10
13
11
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
14
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/arm/mps2.c
16
--- a/hw/arm/mps2.c
14
+++ b/hw/arm/mps2.c
17
+++ b/hw/arm/mps2.c
15
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@
16
#include "hw/timer/cmsdk-apb-timer.h"
17
#include "hw/timer/cmsdk-apb-dualtimer.h"
18
#include "hw/misc/mps2-scc.h"
19
+#include "hw/misc/mps2-fpgaio.h"
20
#include "hw/net/lan9118.h"
19
#include "hw/net/lan9118.h"
21
#include "net/net.h"
20
#include "net/net.h"
22
+#include "hw/watchdog/cmsdk-apb-watchdog.h"
21
#include "hw/watchdog/cmsdk-apb-watchdog.h"
22
+#include "hw/qdev-clock.h"
23
#include "qom/object.h"
23
24
24
typedef enum MPS2FPGAType {
25
typedef enum MPS2FPGAType {
25
FPGA_AN385,
26
@@ -XXX,XX +XXX,XX @@ struct MPS2MachineState {
26
@@ -XXX,XX +XXX,XX @@ typedef struct {
27
MemoryRegion sram;
28
/* FPGA APB subsystem */
29
MPS2SCC scc;
30
+ MPS2FPGAIO fpgaio;
31
/* CMSDK APB subsystem */
32
CMSDKAPBDualTimer dualtimer;
27
CMSDKAPBDualTimer dualtimer;
33
+ CMSDKAPBWatchdog watchdog;
28
CMSDKAPBWatchdog watchdog;
34
} MPS2MachineState;
29
CMSDKAPBTimer timer[2];
30
+ Clock *sysclk;
31
};
35
32
36
#define TYPE_MPS2_MACHINE "mps2"
33
#define TYPE_MPS2_MACHINE "mps2"
37
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
34
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
38
qdev_prop_set_uint32(sccdev, "scc-id", mmc->scc_id);
35
exit(EXIT_FAILURE);
39
sysbus_realize(SYS_BUS_DEVICE(&mms->scc), &error_fatal);
36
}
40
sysbus_mmio_map(SYS_BUS_DEVICE(sccdev), 0, 0x4002f000);
37
41
+ object_initialize_child(OBJECT(mms), "fpgaio",
38
+ /* This clock doesn't need migration because it is fixed-frequency */
42
+ &mms->fpgaio, TYPE_MPS2_FPGAIO);
39
+ mms->sysclk = clock_new(OBJECT(machine), "SYSCLK");
43
+ qdev_prop_set_uint32(DEVICE(&mms->fpgaio), "prescale-clk", 25000000);
40
+ clock_set_hz(mms->sysclk, SYSCLK_FRQ);
44
+ sysbus_realize(SYS_BUS_DEVICE(&mms->fpgaio), &error_fatal);
41
+
45
+ sysbus_mmio_map(SYS_BUS_DEVICE(&mms->fpgaio), 0, 0x40028000);
42
/* The FPGA images have an odd combination of different RAMs,
46
43
* because in hardware they are different implementations and
47
/* In hardware this is a LAN9220; the LAN9118 is software compatible
44
* connected to different buses, giving varying performance/size
48
* except that it doesn't support the checksum-offload feature.
45
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
46
TYPE_CMSDK_APB_TIMER);
47
sbd = SYS_BUS_DEVICE(&mms->timer[i]);
48
qdev_prop_set_uint32(DEVICE(&mms->timer[i]), "pclk-frq", SYSCLK_FRQ);
49
+ qdev_connect_clock_in(DEVICE(&mms->timer[i]), "pclk", mms->sysclk);
50
sysbus_realize_and_unref(sbd, &error_fatal);
51
sysbus_mmio_map(sbd, 0, base);
52
sysbus_connect_irq(sbd, 0, qdev_get_gpio_in(armv7m, irqno));
53
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
54
object_initialize_child(OBJECT(mms), "dualtimer", &mms->dualtimer,
55
TYPE_CMSDK_APB_DUALTIMER);
56
qdev_prop_set_uint32(DEVICE(&mms->dualtimer), "pclk-frq", SYSCLK_FRQ);
57
+ qdev_connect_clock_in(DEVICE(&mms->dualtimer), "TIMCLK", mms->sysclk);
58
sysbus_realize(SYS_BUS_DEVICE(&mms->dualtimer), &error_fatal);
59
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->dualtimer), 0,
60
qdev_get_gpio_in(armv7m, 10));
61
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
62
object_initialize_child(OBJECT(mms), "watchdog", &mms->watchdog,
63
TYPE_CMSDK_APB_WATCHDOG);
64
qdev_prop_set_uint32(DEVICE(&mms->watchdog), "wdogclk-frq", SYSCLK_FRQ);
65
+ qdev_connect_clock_in(DEVICE(&mms->watchdog), "WDOGCLK", mms->sysclk);
66
sysbus_realize(SYS_BUS_DEVICE(&mms->watchdog), &error_fatal);
67
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->watchdog), 0,
68
qdev_get_gpio_in_named(armv7m, "NMI", 0));
49
--
69
--
50
2.20.1
70
2.20.1
51
71
52
72
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Create and connect the two clocks needed by the ARMSSE.
2
2
3
From 'Application Note AN521', chapter 4.7:
4
5
The SMM implements four SBCon serial modules:
6
7
One SBCon module for use by the Color LCD touch interface.
8
One SBCon module to configure the audio controller.
9
Two general purpose SBCon modules, that connect to the
10
Expansion headers J7 and J8, are intended for use with the
11
V2C-Shield1 which provide an I2C interface on the headers.
12
13
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20200617072539.32686-15-f4bug@amsat.org
15
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20210128114145.20536-15-peter.maydell@linaro.org
8
Message-id: 20210121190622.22000-15-peter.maydell@linaro.org
17
---
9
---
18
hw/arm/mps2-tz.c | 23 ++++++++++++++++++-----
10
hw/arm/mps2-tz.c | 13 +++++++++++++
19
1 file changed, 18 insertions(+), 5 deletions(-)
11
1 file changed, 13 insertions(+)
20
12
21
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
13
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
22
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/mps2-tz.c
15
--- a/hw/arm/mps2-tz.c
24
+++ b/hw/arm/mps2-tz.c
16
+++ b/hw/arm/mps2-tz.c
25
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@
26
#include "hw/arm/armsse.h"
27
#include "hw/dma/pl080.h"
28
#include "hw/ssi/pl022.h"
29
+#include "hw/i2c/arm_sbcon_i2c.h"
30
#include "hw/net/lan9118.h"
18
#include "hw/net/lan9118.h"
31
#include "net/net.h"
19
#include "net/net.h"
32
#include "hw/core/split-irq.h"
20
#include "hw/core/split-irq.h"
33
@@ -XXX,XX +XXX,XX @@ typedef struct {
21
+#include "hw/qdev-clock.h"
34
TZPPC ppc[5];
22
#include "qom/object.h"
35
TZMPC ssram_mpc[3];
23
36
PL022State spi[5];
24
#define MPS2TZ_NUMIRQ 92
37
- UnimplementedDeviceState i2c[4];
25
@@ -XXX,XX +XXX,XX @@ struct MPS2TZMachineState {
38
+ ArmSbconI2CState i2c[4];
26
qemu_or_irq uart_irq_orgate;
39
UnimplementedDeviceState i2s_audio;
27
DeviceState *lan9118;
40
UnimplementedDeviceState gpio[4];
28
SplitIRQ cpu_irq_splitter[MPS2TZ_NUMIRQ];
41
UnimplementedDeviceState gfx;
29
+ Clock *sysclk;
42
@@ -XXX,XX +XXX,XX @@ static MemoryRegion *make_spi(MPS2TZMachineState *mms, void *opaque,
30
+ Clock *s32kclk;
43
return sysbus_mmio_get_region(s, 0);
31
};
44
}
32
45
33
#define TYPE_MPS2TZ_MACHINE "mps2tz"
46
+static MemoryRegion *make_i2c(MPS2TZMachineState *mms, void *opaque,
34
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(MPS2TZMachineState, MPS2TZMachineClass, MPS2TZ_MACHINE)
47
+ const char *name, hwaddr size)
35
48
+{
36
/* Main SYSCLK frequency in Hz */
49
+ ArmSbconI2CState *i2c = opaque;
37
#define SYSCLK_FRQ 20000000
50
+ SysBusDevice *s;
38
+/* Slow 32Khz S32KCLK frequency in Hz */
39
+#define S32KCLK_FRQ (32 * 1000)
40
41
/* Create an alias of an entire original MemoryRegion @orig
42
* located at @base in the memory map.
43
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
44
exit(EXIT_FAILURE);
45
}
46
47
+ /* These clocks don't need migration because they are fixed-frequency */
48
+ mms->sysclk = clock_new(OBJECT(machine), "SYSCLK");
49
+ clock_set_hz(mms->sysclk, SYSCLK_FRQ);
50
+ mms->s32kclk = clock_new(OBJECT(machine), "S32KCLK");
51
+ clock_set_hz(mms->s32kclk, S32KCLK_FRQ);
51
+
52
+
52
+ object_initialize_child(OBJECT(mms), name, i2c, TYPE_ARM_SBCON_I2C);
53
object_initialize_child(OBJECT(machine), TYPE_IOTKIT, &mms->iotkit,
53
+ s = SYS_BUS_DEVICE(i2c);
54
mmc->armsse_type);
54
+ sysbus_realize(s, &error_fatal);
55
iotkitdev = DEVICE(&mms->iotkit);
55
+ return sysbus_mmio_get_region(s, 0);
56
+}
57
+
58
static void mps2tz_common_init(MachineState *machine)
59
{
60
MPS2TZMachineState *mms = MPS2TZ_MACHINE(machine);
61
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
56
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
62
{ "uart2", make_uart, &mms->uart[2], 0x40202000, 0x1000 },
57
OBJECT(system_memory), &error_abort);
63
{ "uart3", make_uart, &mms->uart[3], 0x40203000, 0x1000 },
58
qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", MPS2TZ_NUMIRQ);
64
{ "uart4", make_uart, &mms->uart[4], 0x40204000, 0x1000 },
59
qdev_prop_set_uint32(iotkitdev, "MAINCLK_FRQ", SYSCLK_FRQ);
65
- { "i2c0", make_unimp_dev, &mms->i2c[0], 0x40207000, 0x1000 },
60
+ qdev_connect_clock_in(iotkitdev, "MAINCLK", mms->sysclk);
66
- { "i2c1", make_unimp_dev, &mms->i2c[1], 0x40208000, 0x1000 },
61
+ qdev_connect_clock_in(iotkitdev, "S32KCLK", mms->s32kclk);
67
- { "i2c2", make_unimp_dev, &mms->i2c[2], 0x4020c000, 0x1000 },
62
sysbus_realize(SYS_BUS_DEVICE(&mms->iotkit), &error_fatal);
68
- { "i2c3", make_unimp_dev, &mms->i2c[3], 0x4020d000, 0x1000 },
63
69
+ { "i2c0", make_i2c, &mms->i2c[0], 0x40207000, 0x1000 },
64
/*
70
+ { "i2c1", make_i2c, &mms->i2c[1], 0x40208000, 0x1000 },
71
+ { "i2c2", make_i2c, &mms->i2c[2], 0x4020c000, 0x1000 },
72
+ { "i2c3", make_i2c, &mms->i2c[3], 0x4020d000, 0x1000 },
73
},
74
}, {
75
.name = "apb_ppcexp2",
76
--
65
--
77
2.20.1
66
2.20.1
78
67
79
68
diff view generated by jsdifflib
1
Convert the Neon-2-reg misc crypto ops (AESE, AESMC, SHA1H, SHA1SU1)
1
Create and connect the two clocks needed by the ARMSSE.
2
to decodetree.
3
2
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200616170844.13318-9-peter.maydell@linaro.org
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20210128114145.20536-16-peter.maydell@linaro.org
8
Message-id: 20210121190622.22000-16-peter.maydell@linaro.org
7
---
9
---
8
target/arm/neon-dp.decode | 12 ++++++++
10
hw/arm/musca.c | 12 ++++++++++++
9
target/arm/translate-neon.inc.c | 42 ++++++++++++++++++++++++++
11
1 file changed, 12 insertions(+)
10
target/arm/translate.c | 52 +++------------------------------
11
3 files changed, 58 insertions(+), 48 deletions(-)
12
12
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
13
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
15
--- a/hw/arm/musca.c
16
+++ b/target/arm/neon-dp.decode
16
+++ b/hw/arm/musca.c
17
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
17
@@ -XXX,XX +XXX,XX @@
18
&2misc vm=%vm_dp vd=%vd_dp
18
#include "hw/misc/tz-ppc.h"
19
@2misc_q0 .... ... .. . .. size:2 .. .... . .... . . . .... \
19
#include "hw/misc/unimp.h"
20
&2misc vm=%vm_dp vd=%vd_dp q=0
20
#include "hw/rtc/pl031.h"
21
+ @2misc_q1 .... ... .. . .. size:2 .. .... . .... . . . .... \
21
+#include "hw/qdev-clock.h"
22
+ &2misc vm=%vm_dp vd=%vd_dp q=1
22
#include "qom/object.h"
23
23
24
VREV64 1111 001 11 . 11 .. 00 .... 0 0000 . . 0 .... @2misc
24
#define MUSCA_NUMIRQ_MAX 96
25
25
@@ -XXX,XX +XXX,XX @@ struct MuscaMachineState {
26
VPADDL_S 1111 001 11 . 11 .. 00 .... 0 0100 . . 0 .... @2misc
26
UnimplementedDeviceState sdio;
27
VPADDL_U 1111 001 11 . 11 .. 00 .... 0 0101 . . 0 .... @2misc
27
UnimplementedDeviceState gpio;
28
28
UnimplementedDeviceState cryptoisland;
29
+ AESE 1111 001 11 . 11 .. 00 .... 0 0110 0 . 0 .... @2misc_q1
29
+ Clock *sysclk;
30
+ AESD 1111 001 11 . 11 .. 00 .... 0 0110 1 . 0 .... @2misc_q1
30
+ Clock *s32kclk;
31
+ AESMC 1111 001 11 . 11 .. 00 .... 0 0111 0 . 0 .... @2misc_q1
31
};
32
+ AESIMC 1111 001 11 . 11 .. 00 .... 0 0111 1 . 0 .... @2misc_q1
32
33
#define TYPE_MUSCA_MACHINE "musca"
34
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(MuscaMachineState, MuscaMachineClass, MUSCA_MACHINE)
35
* don't model that in our SSE-200 model yet.
36
*/
37
#define SYSCLK_FRQ 40000000
38
+/* Slow 32Khz S32KCLK frequency in Hz */
39
+#define S32KCLK_FRQ (32 * 1000)
40
41
static qemu_irq get_sse_irq_in(MuscaMachineState *mms, int irqno)
42
{
43
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
44
exit(1);
45
}
46
47
+ mms->sysclk = clock_new(OBJECT(machine), "SYSCLK");
48
+ clock_set_hz(mms->sysclk, SYSCLK_FRQ);
49
+ mms->s32kclk = clock_new(OBJECT(machine), "S32KCLK");
50
+ clock_set_hz(mms->s32kclk, S32KCLK_FRQ);
33
+
51
+
34
VMVN 1111 001 11 . 11 .. 00 .... 0 1011 . . 0 .... @2misc
52
object_initialize_child(OBJECT(machine), "sse-200", &mms->sse,
35
53
TYPE_SSE200);
36
VPADAL_S 1111 001 11 . 11 .. 00 .... 0 1100 . . 0 .... @2misc
54
ssedev = DEVICE(&mms->sse);
37
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
55
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
38
VCLE0 1111 001 11 . 11 .. 01 .... 0 0011 . . 0 .... @2misc
56
qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor);
39
VCLT0 1111 001 11 . 11 .. 01 .... 0 0100 . . 0 .... @2misc
57
qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width);
40
58
qdev_prop_set_uint32(ssedev, "MAINCLK_FRQ", SYSCLK_FRQ);
41
+ SHA1H 1111 001 11 . 11 .. 01 .... 0 0101 1 . 0 .... @2misc_q1
59
+ qdev_connect_clock_in(ssedev, "MAINCLK", mms->sysclk);
42
+
60
+ qdev_connect_clock_in(ssedev, "S32KCLK", mms->s32kclk);
43
VABS 1111 001 11 . 11 .. 01 .... 0 0110 . . 0 .... @2misc
61
/*
44
VNEG 1111 001 11 . 11 .. 01 .... 0 0111 . . 0 .... @2misc
62
* Musca-A takes the default SSE-200 FPU/DSP settings (ie no for
45
63
* CPU0 and yes for CPU1); Musca-B1 explicitly enables them for CPU0.
46
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
47
48
VSHLL 1111 001 11 . 11 .. 10 .... 0 0110 0 . 0 .... @2misc_q0
49
50
+ SHA1SU1 1111 001 11 . 11 .. 10 .... 0 0111 0 . 0 .... @2misc_q1
51
+ SHA256SU0 1111 001 11 . 11 .. 10 .... 0 0111 1 . 0 .... @2misc_q1
52
+
53
VCVT_F16_F32 1111 001 11 . 11 .. 10 .... 0 1100 0 . 0 .... @2misc_q0
54
VCVT_F32_F16 1111 001 11 . 11 .. 10 .... 0 1110 0 . 0 .... @2misc_q0
55
]
56
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/arm/translate-neon.inc.c
59
+++ b/target/arm/translate-neon.inc.c
60
@@ -XXX,XX +XXX,XX @@ static bool trans_VMVN(DisasContext *s, arg_2misc *a)
61
}
62
return do_2misc_vec(s, a, tcg_gen_gvec_not);
63
}
64
+
65
+#define WRAP_2M_3_OOL_FN(WRAPNAME, FUNC, DATA) \
66
+ static void WRAPNAME(unsigned vece, uint32_t rd_ofs, \
67
+ uint32_t rm_ofs, uint32_t oprsz, \
68
+ uint32_t maxsz) \
69
+ { \
70
+ tcg_gen_gvec_3_ool(rd_ofs, rd_ofs, rm_ofs, oprsz, maxsz, \
71
+ DATA, FUNC); \
72
+ }
73
+
74
+#define WRAP_2M_2_OOL_FN(WRAPNAME, FUNC, DATA) \
75
+ static void WRAPNAME(unsigned vece, uint32_t rd_ofs, \
76
+ uint32_t rm_ofs, uint32_t oprsz, \
77
+ uint32_t maxsz) \
78
+ { \
79
+ tcg_gen_gvec_2_ool(rd_ofs, rm_ofs, oprsz, maxsz, DATA, FUNC); \
80
+ }
81
+
82
+WRAP_2M_3_OOL_FN(gen_AESE, gen_helper_crypto_aese, 0)
83
+WRAP_2M_3_OOL_FN(gen_AESD, gen_helper_crypto_aese, 1)
84
+WRAP_2M_2_OOL_FN(gen_AESMC, gen_helper_crypto_aesmc, 0)
85
+WRAP_2M_2_OOL_FN(gen_AESIMC, gen_helper_crypto_aesmc, 1)
86
+WRAP_2M_2_OOL_FN(gen_SHA1H, gen_helper_crypto_sha1h, 0)
87
+WRAP_2M_2_OOL_FN(gen_SHA1SU1, gen_helper_crypto_sha1su1, 0)
88
+WRAP_2M_2_OOL_FN(gen_SHA256SU0, gen_helper_crypto_sha256su0, 0)
89
+
90
+#define DO_2M_CRYPTO(INSN, FEATURE, SIZE) \
91
+ static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
92
+ { \
93
+ if (!dc_isar_feature(FEATURE, s) || a->size != SIZE) { \
94
+ return false; \
95
+ } \
96
+ return do_2misc_vec(s, a, gen_##INSN); \
97
+ }
98
+
99
+DO_2M_CRYPTO(AESE, aa32_aes, 0)
100
+DO_2M_CRYPTO(AESD, aa32_aes, 0)
101
+DO_2M_CRYPTO(AESMC, aa32_aes, 0)
102
+DO_2M_CRYPTO(AESIMC, aa32_aes, 0)
103
+DO_2M_CRYPTO(SHA1H, aa32_sha1, 2)
104
+DO_2M_CRYPTO(SHA1SU1, aa32_sha1, 2)
105
+DO_2M_CRYPTO(SHA256SU0, aa32_sha2, 2)
106
diff --git a/target/arm/translate.c b/target/arm/translate.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/arm/translate.c
109
+++ b/target/arm/translate.c
110
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
111
{
112
int op;
113
int q;
114
- int rd, rm, rd_ofs, rm_ofs;
115
+ int rd, rm;
116
int size;
117
int pass;
118
int u;
119
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
120
VFP_DREG_D(rd, insn);
121
VFP_DREG_M(rm, insn);
122
size = (insn >> 20) & 3;
123
- rd_ofs = neon_reg_offset(rd, 0);
124
- rm_ofs = neon_reg_offset(rm, 0);
125
126
if ((insn & (1 << 23)) == 0) {
127
/* Three register same length: handled by decodetree */
128
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
129
case NEON_2RM_VCLE0:
130
case NEON_2RM_VCGE0:
131
case NEON_2RM_VCLT0:
132
+ case NEON_2RM_AESE: case NEON_2RM_AESMC:
133
+ case NEON_2RM_SHA1H:
134
+ case NEON_2RM_SHA1SU1:
135
/* handled by decodetree */
136
return 1;
137
case NEON_2RM_VTRN:
138
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
139
goto elementwise;
140
}
141
break;
142
- case NEON_2RM_AESE: case NEON_2RM_AESMC:
143
- if (!dc_isar_feature(aa32_aes, s) || ((rm | rd) & 1)) {
144
- return 1;
145
- }
146
- /*
147
- * Bit 6 is the lowest opcode bit; it distinguishes
148
- * between encryption (AESE/AESMC) and decryption
149
- * (AESD/AESIMC).
150
- */
151
- if (op == NEON_2RM_AESE) {
152
- tcg_gen_gvec_3_ool(vfp_reg_offset(true, rd),
153
- vfp_reg_offset(true, rd),
154
- vfp_reg_offset(true, rm),
155
- 16, 16, extract32(insn, 6, 1),
156
- gen_helper_crypto_aese);
157
- } else {
158
- tcg_gen_gvec_2_ool(vfp_reg_offset(true, rd),
159
- vfp_reg_offset(true, rm),
160
- 16, 16, extract32(insn, 6, 1),
161
- gen_helper_crypto_aesmc);
162
- }
163
- break;
164
- case NEON_2RM_SHA1H:
165
- if (!dc_isar_feature(aa32_sha1, s) || ((rm | rd) & 1)) {
166
- return 1;
167
- }
168
- tcg_gen_gvec_2_ool(rd_ofs, rm_ofs, 16, 16, 0,
169
- gen_helper_crypto_sha1h);
170
- break;
171
- case NEON_2RM_SHA1SU1:
172
- if ((rm | rd) & 1) {
173
- return 1;
174
- }
175
- /* bit 6 (q): set -> SHA256SU0, cleared -> SHA1SU1 */
176
- if (q) {
177
- if (!dc_isar_feature(aa32_sha2, s)) {
178
- return 1;
179
- }
180
- } else if (!dc_isar_feature(aa32_sha1, s)) {
181
- return 1;
182
- }
183
- tcg_gen_gvec_2_ool(rd_ofs, rm_ofs, 16, 16, 0,
184
- q ? gen_helper_crypto_sha256su0
185
- : gen_helper_crypto_sha1su1);
186
- break;
187
188
default:
189
elementwise:
190
--
64
--
191
2.20.1
65
2.20.1
192
66
193
67
diff view generated by jsdifflib
1
Convert the Neon VREV64 insn from the 2-reg-misc grouping to decodetree.
1
Convert the SSYS code in the Stellaris boards (which encapsulates the
2
system registers) to a proper QOM device. This will provide us with
3
somewhere to put the output Clock whose frequency depends on the
4
setting of the PLL configuration registers.
5
6
This is a migration compatibility break for lm3s811evb, lm3s6965evb.
7
8
We use 3-phase reset here because the Clock will need to propagate
9
its value in the hold phase.
10
11
For the moment we reset the device during the board creation so that
12
the system_clock_scale global gets set; this will be removed in a
13
subsequent commit.
2
14
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Reviewed-by: Luc Michel <luc@lmichel.fr>
5
Message-id: 20200616170844.13318-2-peter.maydell@linaro.org
17
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
19
Message-id: 20210128114145.20536-17-peter.maydell@linaro.org
20
Message-id: 20210121190622.22000-17-peter.maydell@linaro.org
21
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
---
22
---
7
target/arm/neon-dp.decode | 12 ++++++++
23
hw/arm/stellaris.c | 132 ++++++++++++++++++++++++++++++++++++---------
8
target/arm/translate-neon.inc.c | 50 +++++++++++++++++++++++++++++++++
24
1 file changed, 107 insertions(+), 25 deletions(-)
9
target/arm/translate.c | 24 ++--------------
25
10
3 files changed, 64 insertions(+), 22 deletions(-)
26
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
11
12
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
13
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-dp.decode
28
--- a/hw/arm/stellaris.c
15
+++ b/target/arm/neon-dp.decode
29
+++ b/hw/arm/stellaris.c
16
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
30
@@ -XXX,XX +XXX,XX @@ static void stellaris_gptm_realize(DeviceState *dev, Error **errp)
17
vm=%vm_dp vd=%vd_dp size=1
31
18
VDUP_scalar 1111 001 1 1 . 11 index:1 100 .... 11 000 q:1 . 0 .... \
32
/* System controller. */
19
vm=%vm_dp vd=%vd_dp size=2
33
20
+
34
-typedef struct {
21
+ ##################################################################
35
+#define TYPE_STELLARIS_SYS "stellaris-sys"
22
+ # 2-reg-misc grouping:
36
+OBJECT_DECLARE_SIMPLE_TYPE(ssys_state, STELLARIS_SYS)
23
+ # 1111 001 11 D 11 size:2 opc1:2 Vd:4 0 opc2:4 q:1 M 0 Vm:4
37
+
24
+ ##################################################################
38
+struct ssys_state {
25
+
39
+ SysBusDevice parent_obj;
26
+ &2misc vd vm q size
40
+
27
+
41
MemoryRegion iomem;
28
+ @2misc .... ... .. . .. size:2 .. .... . .... q:1 . . .... \
42
uint32_t pborctl;
29
+ &2misc vm=%vm_dp vd=%vd_dp
43
uint32_t ldopctl;
30
+
44
@@ -XXX,XX +XXX,XX @@ typedef struct {
31
+ VREV64 1111 001 11 . 11 .. 00 .... 0 0000 . . 0 .... @2misc
45
uint32_t dcgc[3];
32
]
46
uint32_t clkvclr;
33
47
uint32_t ldoarst;
34
# Subgroup for size != 0b11
48
+ qemu_irq irq;
35
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
49
+ /* Properties (all read-only registers) */
36
index XXXXXXX..XXXXXXX 100644
50
uint32_t user0;
37
--- a/target/arm/translate-neon.inc.c
51
uint32_t user1;
38
+++ b/target/arm/translate-neon.inc.c
52
- qemu_irq irq;
39
@@ -XXX,XX +XXX,XX @@ static bool trans_VDUP_scalar(DisasContext *s, arg_VDUP_scalar *a)
53
- stellaris_board_info *board;
40
a->q ? 16 : 8, a->q ? 16 : 8);
54
-} ssys_state;
41
return true;
55
+ uint32_t did0;
56
+ uint32_t did1;
57
+ uint32_t dc0;
58
+ uint32_t dc1;
59
+ uint32_t dc2;
60
+ uint32_t dc3;
61
+ uint32_t dc4;
62
+};
63
64
static void ssys_update(ssys_state *s)
65
{
66
@@ -XXX,XX +XXX,XX @@ static uint32_t pllcfg_fury[16] = {
67
68
static int ssys_board_class(const ssys_state *s)
69
{
70
- uint32_t did0 = s->board->did0;
71
+ uint32_t did0 = s->did0;
72
switch (did0 & DID0_VER_MASK) {
73
case DID0_VER_0:
74
return DID0_CLASS_SANDSTORM;
75
@@ -XXX,XX +XXX,XX @@ static uint64_t ssys_read(void *opaque, hwaddr offset,
76
77
switch (offset) {
78
case 0x000: /* DID0 */
79
- return s->board->did0;
80
+ return s->did0;
81
case 0x004: /* DID1 */
82
- return s->board->did1;
83
+ return s->did1;
84
case 0x008: /* DC0 */
85
- return s->board->dc0;
86
+ return s->dc0;
87
case 0x010: /* DC1 */
88
- return s->board->dc1;
89
+ return s->dc1;
90
case 0x014: /* DC2 */
91
- return s->board->dc2;
92
+ return s->dc2;
93
case 0x018: /* DC3 */
94
- return s->board->dc3;
95
+ return s->dc3;
96
case 0x01c: /* DC4 */
97
- return s->board->dc4;
98
+ return s->dc4;
99
case 0x030: /* PBORCTL */
100
return s->pborctl;
101
case 0x034: /* LDOPCTL */
102
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps ssys_ops = {
103
.endianness = DEVICE_NATIVE_ENDIAN,
104
};
105
106
-static void ssys_reset(void *opaque)
107
+static void stellaris_sys_reset_enter(Object *obj, ResetType type)
108
{
109
- ssys_state *s = (ssys_state *)opaque;
110
+ ssys_state *s = STELLARIS_SYS(obj);
111
112
s->pborctl = 0x7ffd;
113
s->rcc = 0x078e3ac0;
114
@@ -XXX,XX +XXX,XX @@ static void ssys_reset(void *opaque)
115
s->rcgc[0] = 1;
116
s->scgc[0] = 1;
117
s->dcgc[0] = 1;
118
+}
119
+
120
+static void stellaris_sys_reset_hold(Object *obj)
121
+{
122
+ ssys_state *s = STELLARIS_SYS(obj);
123
+
124
ssys_calculate_system_clock(s);
42
}
125
}
43
+
126
44
+static bool trans_VREV64(DisasContext *s, arg_VREV64 *a)
127
+static void stellaris_sys_reset_exit(Object *obj)
45
+{
128
+{
46
+ int pass, half;
129
+}
47
+
130
+
48
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
131
static int stellaris_sys_post_load(void *opaque, int version_id)
49
+ return false;
132
{
50
+ }
133
ssys_state *s = opaque;
51
+
134
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_stellaris_sys = {
52
+ /* UNDEF accesses to D16-D31 if they don't exist. */
135
}
53
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
136
};
54
+ ((a->vd | a->vm) & 0x10)) {
137
55
+ return false;
138
+static Property stellaris_sys_properties[] = {
56
+ }
139
+ DEFINE_PROP_UINT32("user0", ssys_state, user0, 0),
57
+
140
+ DEFINE_PROP_UINT32("user1", ssys_state, user1, 0),
58
+ if ((a->vd | a->vm) & a->q) {
141
+ DEFINE_PROP_UINT32("did0", ssys_state, did0, 0),
59
+ return false;
142
+ DEFINE_PROP_UINT32("did1", ssys_state, did1, 0),
60
+ }
143
+ DEFINE_PROP_UINT32("dc0", ssys_state, dc0, 0),
61
+
144
+ DEFINE_PROP_UINT32("dc1", ssys_state, dc1, 0),
62
+ if (a->size == 3) {
145
+ DEFINE_PROP_UINT32("dc2", ssys_state, dc2, 0),
63
+ return false;
146
+ DEFINE_PROP_UINT32("dc3", ssys_state, dc3, 0),
64
+ }
147
+ DEFINE_PROP_UINT32("dc4", ssys_state, dc4, 0),
65
+
148
+ DEFINE_PROP_END_OF_LIST()
66
+ if (!vfp_access_check(s)) {
149
+};
67
+ return true;
150
+
68
+ }
151
+static void stellaris_sys_instance_init(Object *obj)
69
+
152
+{
70
+ for (pass = 0; pass < (a->q ? 2 : 1); pass++) {
153
+ ssys_state *s = STELLARIS_SYS(obj);
71
+ TCGv_i32 tmp[2];
154
+ SysBusDevice *sbd = SYS_BUS_DEVICE(s);
72
+
155
+
73
+ for (half = 0; half < 2; half++) {
156
+ memory_region_init_io(&s->iomem, obj, &ssys_ops, s, "ssys", 0x00001000);
74
+ tmp[half] = neon_load_reg(a->vm, pass * 2 + half);
157
+ sysbus_init_mmio(sbd, &s->iomem);
75
+ switch (a->size) {
158
+ sysbus_init_irq(sbd, &s->irq);
76
+ case 0:
159
+}
77
+ tcg_gen_bswap32_i32(tmp[half], tmp[half]);
160
+
78
+ break;
161
static int stellaris_sys_init(uint32_t base, qemu_irq irq,
79
+ case 1:
162
stellaris_board_info * board,
80
+ gen_swap_half(tmp[half]);
163
uint8_t *macaddr)
81
+ break;
164
{
82
+ case 2:
165
- ssys_state *s;
83
+ break;
166
+ DeviceState *dev = qdev_new(TYPE_STELLARIS_SYS);
84
+ default:
167
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
85
+ g_assert_not_reached();
168
86
+ }
169
- s = g_new0(ssys_state, 1);
87
+ }
170
- s->irq = irq;
88
+ neon_store_reg(a->vd, pass * 2, tmp[1]);
171
- s->board = board;
89
+ neon_store_reg(a->vd, pass * 2 + 1, tmp[0]);
172
/* Most devices come preprogrammed with a MAC address in the user data. */
90
+ }
173
- s->user0 = macaddr[0] | (macaddr[1] << 8) | (macaddr[2] << 16);
91
+ return true;
174
- s->user1 = macaddr[3] | (macaddr[4] << 8) | (macaddr[5] << 16);
92
+}
175
+ qdev_prop_set_uint32(dev, "user0",
93
diff --git a/target/arm/translate.c b/target/arm/translate.c
176
+ macaddr[0] | (macaddr[1] << 8) | (macaddr[2] << 16));
94
index XXXXXXX..XXXXXXX 100644
177
+ qdev_prop_set_uint32(dev, "user1",
95
--- a/target/arm/translate.c
178
+ macaddr[3] | (macaddr[4] << 8) | (macaddr[5] << 16));
96
+++ b/target/arm/translate.c
179
+ qdev_prop_set_uint32(dev, "did0", board->did0);
97
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
180
+ qdev_prop_set_uint32(dev, "did1", board->did1);
98
}
181
+ qdev_prop_set_uint32(dev, "dc0", board->dc0);
99
switch (op) {
182
+ qdev_prop_set_uint32(dev, "dc1", board->dc1);
100
case NEON_2RM_VREV64:
183
+ qdev_prop_set_uint32(dev, "dc2", board->dc2);
101
- for (pass = 0; pass < (q ? 2 : 1); pass++) {
184
+ qdev_prop_set_uint32(dev, "dc3", board->dc3);
102
- tmp = neon_load_reg(rm, pass * 2);
185
+ qdev_prop_set_uint32(dev, "dc4", board->dc4);
103
- tmp2 = neon_load_reg(rm, pass * 2 + 1);
186
+
104
- switch (size) {
187
+ sysbus_realize_and_unref(sbd, &error_fatal);
105
- case 0: tcg_gen_bswap32_i32(tmp, tmp); break;
188
+ sysbus_mmio_map(sbd, 0, base);
106
- case 1: gen_swap_half(tmp); break;
189
+ sysbus_connect_irq(sbd, 0, irq);
107
- case 2: /* no-op */ break;
190
+
108
- default: abort();
191
+ /*
109
- }
192
+ * Normally we should not be resetting devices like this during
110
- neon_store_reg(rd, pass * 2 + 1, tmp);
193
+ * board creation. For the moment we need to do so, because
111
- if (size == 2) {
194
+ * system_clock_scale will only get set when the STELLARIS_SYS
112
- neon_store_reg(rd, pass * 2, tmp2);
195
+ * device is reset, and we need its initial value to pass to
113
- } else {
196
+ * the watchdog device. This hack can be removed once the
114
- switch (size) {
197
+ * watchdog has been converted to use a Clock input instead.
115
- case 0: tcg_gen_bswap32_i32(tmp2, tmp2); break;
198
+ */
116
- case 1: gen_swap_half(tmp2); break;
199
+ device_cold_reset(dev);
117
- default: abort();
200
118
- }
201
- memory_region_init_io(&s->iomem, NULL, &ssys_ops, s, "ssys", 0x00001000);
119
- neon_store_reg(rd, pass * 2, tmp2);
202
- memory_region_add_subregion(get_system_memory(), base, &s->iomem);
120
- }
203
- ssys_reset(s);
121
- }
204
- vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_stellaris_sys, s);
122
- break;
205
return 0;
123
+ /* handled by decodetree */
206
}
124
+ return 1;
207
125
case NEON_2RM_VPADDL: case NEON_2RM_VPADDL_U:
208
-
126
case NEON_2RM_VPADAL: case NEON_2RM_VPADAL_U:
209
/* I2C controller. */
127
for (pass = 0; pass < q + 1; pass++) {
210
211
#define TYPE_STELLARIS_I2C "stellaris-i2c"
212
@@ -XXX,XX +XXX,XX @@ static const TypeInfo stellaris_adc_info = {
213
.class_init = stellaris_adc_class_init,
214
};
215
216
+static void stellaris_sys_class_init(ObjectClass *klass, void *data)
217
+{
218
+ DeviceClass *dc = DEVICE_CLASS(klass);
219
+ ResettableClass *rc = RESETTABLE_CLASS(klass);
220
+
221
+ dc->vmsd = &vmstate_stellaris_sys;
222
+ rc->phases.enter = stellaris_sys_reset_enter;
223
+ rc->phases.hold = stellaris_sys_reset_hold;
224
+ rc->phases.exit = stellaris_sys_reset_exit;
225
+ device_class_set_props(dc, stellaris_sys_properties);
226
+}
227
+
228
+static const TypeInfo stellaris_sys_info = {
229
+ .name = TYPE_STELLARIS_SYS,
230
+ .parent = TYPE_SYS_BUS_DEVICE,
231
+ .instance_size = sizeof(ssys_state),
232
+ .instance_init = stellaris_sys_instance_init,
233
+ .class_init = stellaris_sys_class_init,
234
+};
235
+
236
static void stellaris_register_types(void)
237
{
238
type_register_static(&stellaris_i2c_info);
239
type_register_static(&stellaris_gptm_info);
240
type_register_static(&stellaris_adc_info);
241
+ type_register_static(&stellaris_sys_info);
242
}
243
244
type_init(stellaris_register_types)
128
--
245
--
129
2.20.1
246
2.20.1
130
247
131
248
diff view generated by jsdifflib
1
Convert the Neon narrowing moves VMQNV, VQMOVN, VQMOVUN in the 2-reg-misc
1
Create and connect the Clock input for the watchdog device on the
2
group to decodetree.
2
Stellaris boards. Because the Stellaris boards model the ability to
3
change the clock rate by programming PLL registers, we have to create
4
an output Clock on the ssys_state device and wire it up to the
5
watchdog.
6
7
Note that the old comment on ssys_calculate_system_clock() got the
8
units wrong -- system_clock_scale is in nanoseconds, not
9
milliseconds. Improve the commentary to clarify how we are
10
calculating the period.
3
11
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Reviewed-by: Luc Michel <luc@lmichel.fr>
6
Message-id: 20200616170844.13318-5-peter.maydell@linaro.org
14
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
16
Message-id: 20210128114145.20536-18-peter.maydell@linaro.org
17
Message-id: 20210121190622.22000-18-peter.maydell@linaro.org
18
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
---
19
---
8
target/arm/neon-dp.decode | 9 ++++
20
hw/arm/stellaris.c | 43 +++++++++++++++++++++++++++++++------------
9
target/arm/translate-neon.inc.c | 59 ++++++++++++++++++++++++
21
1 file changed, 31 insertions(+), 12 deletions(-)
10
target/arm/translate.c | 81 +--------------------------------
11
3 files changed, 70 insertions(+), 79 deletions(-)
12
22
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
23
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
14
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
25
--- a/hw/arm/stellaris.c
16
+++ b/target/arm/neon-dp.decode
26
+++ b/hw/arm/stellaris.c
17
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
27
@@ -XXX,XX +XXX,XX @@
18
28
#include "hw/watchdog/cmsdk-apb-watchdog.h"
19
@2misc .... ... .. . .. size:2 .. .... . .... q:1 . . .... \
29
#include "migration/vmstate.h"
20
&2misc vm=%vm_dp vd=%vd_dp
30
#include "hw/misc/unimp.h"
21
+ @2misc_q0 .... ... .. . .. size:2 .. .... . .... . . . .... \
31
+#include "hw/qdev-clock.h"
22
+ &2misc vm=%vm_dp vd=%vd_dp q=0
32
#include "cpu.h"
23
33
#include "qom/object.h"
24
VREV64 1111 001 11 . 11 .. 00 .... 0 0000 . . 0 .... @2misc
34
25
35
@@ -XXX,XX +XXX,XX @@ struct ssys_state {
26
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
36
uint32_t clkvclr;
27
37
uint32_t ldoarst;
28
VUZP 1111 001 11 . 11 .. 10 .... 0 0010 . . 0 .... @2misc
38
qemu_irq irq;
29
VZIP 1111 001 11 . 11 .. 10 .... 0 0011 . . 0 .... @2misc
39
+ Clock *sysclk;
30
+
40
/* Properties (all read-only registers) */
31
+ VMOVN 1111 001 11 . 11 .. 10 .... 0 0100 0 . 0 .... @2misc_q0
41
uint32_t user0;
32
+ # VQMOVUN: unsigned result (source is always signed)
42
uint32_t user1;
33
+ VQMOVUN 1111 001 11 . 11 .. 10 .... 0 0100 1 . 0 .... @2misc_q0
43
@@ -XXX,XX +XXX,XX @@ static bool ssys_use_rcc2(ssys_state *s)
34
+ # VQMOVN: signed result, source may be signed (_S) or unsigned (_U)
35
+ VQMOVN_S 1111 001 11 . 11 .. 10 .... 0 0101 0 . 0 .... @2misc_q0
36
+ VQMOVN_U 1111 001 11 . 11 .. 10 .... 0 0101 1 . 0 .... @2misc_q0
37
]
38
39
# Subgroup for size != 0b11
40
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/translate-neon.inc.c
43
+++ b/target/arm/translate-neon.inc.c
44
@@ -XXX,XX +XXX,XX @@ static bool trans_VZIP(DisasContext *s, arg_2misc *a)
45
};
46
return do_zip_uzp(s, a, fn[a->q][a->size]);
47
}
44
}
48
+
45
49
+static bool do_vmovn(DisasContext *s, arg_2misc *a,
46
/*
50
+ NeonGenNarrowEnvFn *narrowfn)
47
- * Caculate the sys. clock period in ms.
51
+{
48
+ * Calculate the system clock period. We only want to propagate
52
+ TCGv_i64 rm;
49
+ * this change to the rest of the system if we're not being called
53
+ TCGv_i32 rd0, rd1;
50
+ * from migration post-load.
54
+
51
*/
55
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
52
-static void ssys_calculate_system_clock(ssys_state *s)
56
+ return false;
53
+static void ssys_calculate_system_clock(ssys_state *s, bool propagate_clock)
54
{
55
+ /*
56
+ * SYSDIV field specifies divisor: 0 == /1, 1 == /2, etc. Input
57
+ * clock is 200MHz, which is a period of 5 ns. Dividing the clock
58
+ * frequency by X is the same as multiplying the period by X.
59
+ */
60
if (ssys_use_rcc2(s)) {
61
system_clock_scale = 5 * (((s->rcc2 >> 23) & 0x3f) + 1);
62
} else {
63
system_clock_scale = 5 * (((s->rcc >> 23) & 0xf) + 1);
64
}
65
+ clock_set_ns(s->sysclk, system_clock_scale);
66
+ if (propagate_clock) {
67
+ clock_propagate(s->sysclk);
57
+ }
68
+ }
58
+
59
+ /* UNDEF accesses to D16-D31 if they don't exist. */
60
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
61
+ ((a->vd | a->vm) & 0x10)) {
62
+ return false;
63
+ }
64
+
65
+ if (a->vm & 1) {
66
+ return false;
67
+ }
68
+
69
+ if (!narrowfn) {
70
+ return false;
71
+ }
72
+
73
+ if (!vfp_access_check(s)) {
74
+ return true;
75
+ }
76
+
77
+ rm = tcg_temp_new_i64();
78
+ rd0 = tcg_temp_new_i32();
79
+ rd1 = tcg_temp_new_i32();
80
+
81
+ neon_load_reg64(rm, a->vm);
82
+ narrowfn(rd0, cpu_env, rm);
83
+ neon_load_reg64(rm, a->vm + 1);
84
+ narrowfn(rd1, cpu_env, rm);
85
+ neon_store_reg(a->vd, 0, rd0);
86
+ neon_store_reg(a->vd, 1, rd1);
87
+ tcg_temp_free_i64(rm);
88
+ return true;
89
+}
90
+
91
+#define DO_VMOVN(INSN, FUNC) \
92
+ static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
93
+ { \
94
+ static NeonGenNarrowEnvFn * const narrowfn[] = { \
95
+ FUNC##8, \
96
+ FUNC##16, \
97
+ FUNC##32, \
98
+ NULL, \
99
+ }; \
100
+ return do_vmovn(s, a, narrowfn[a->size]); \
101
+ }
102
+
103
+DO_VMOVN(VMOVN, gen_neon_narrow_u)
104
+DO_VMOVN(VQMOVUN, gen_helper_neon_unarrow_sat)
105
+DO_VMOVN(VQMOVN_S, gen_helper_neon_narrow_sat_s)
106
+DO_VMOVN(VQMOVN_U, gen_helper_neon_narrow_sat_u)
107
diff --git a/target/arm/translate.c b/target/arm/translate.c
108
index XXXXXXX..XXXXXXX 100644
109
--- a/target/arm/translate.c
110
+++ b/target/arm/translate.c
111
@@ -XXX,XX +XXX,XX @@ static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
112
tcg_temp_free_i32(rd);
113
}
69
}
114
70
115
-static inline void gen_neon_narrow(int size, TCGv_i32 dest, TCGv_i64 src)
71
static void ssys_write(void *opaque, hwaddr offset,
116
-{
72
@@ -XXX,XX +XXX,XX @@ static void ssys_write(void *opaque, hwaddr offset,
117
- switch (size) {
73
s->int_status |= (1 << 6);
118
- case 0: gen_helper_neon_narrow_u8(dest, src); break;
74
}
119
- case 1: gen_helper_neon_narrow_u16(dest, src); break;
75
s->rcc = value;
120
- case 2: tcg_gen_extrl_i64_i32(dest, src); break;
76
- ssys_calculate_system_clock(s);
121
- default: abort();
77
+ ssys_calculate_system_clock(s, true);
122
- }
78
break;
123
-}
79
case 0x070: /* RCC2 */
124
-
80
if (ssys_board_class(s) == DID0_CLASS_SANDSTORM) {
125
-static inline void gen_neon_narrow_sats(int size, TCGv_i32 dest, TCGv_i64 src)
81
@@ -XXX,XX +XXX,XX @@ static void ssys_write(void *opaque, hwaddr offset,
126
-{
82
s->int_status |= (1 << 6);
127
- switch (size) {
83
}
128
- case 0: gen_helper_neon_narrow_sat_s8(dest, cpu_env, src); break;
84
s->rcc2 = value;
129
- case 1: gen_helper_neon_narrow_sat_s16(dest, cpu_env, src); break;
85
- ssys_calculate_system_clock(s);
130
- case 2: gen_helper_neon_narrow_sat_s32(dest, cpu_env, src); break;
86
+ ssys_calculate_system_clock(s, true);
131
- default: abort();
87
break;
132
- }
88
case 0x100: /* RCGC0 */
133
-}
89
s->rcgc[0] = value;
134
-
90
@@ -XXX,XX +XXX,XX @@ static void stellaris_sys_reset_hold(Object *obj)
135
-static inline void gen_neon_narrow_satu(int size, TCGv_i32 dest, TCGv_i64 src)
136
-{
137
- switch (size) {
138
- case 0: gen_helper_neon_narrow_sat_u8(dest, cpu_env, src); break;
139
- case 1: gen_helper_neon_narrow_sat_u16(dest, cpu_env, src); break;
140
- case 2: gen_helper_neon_narrow_sat_u32(dest, cpu_env, src); break;
141
- default: abort();
142
- }
143
-}
144
-
145
-static inline void gen_neon_unarrow_sats(int size, TCGv_i32 dest, TCGv_i64 src)
146
-{
147
- switch (size) {
148
- case 0: gen_helper_neon_unarrow_sat8(dest, cpu_env, src); break;
149
- case 1: gen_helper_neon_unarrow_sat16(dest, cpu_env, src); break;
150
- case 2: gen_helper_neon_unarrow_sat32(dest, cpu_env, src); break;
151
- default: abort();
152
- }
153
-}
154
-
155
static inline void gen_neon_widen(TCGv_i64 dest, TCGv_i32 src, int size, int u)
156
{
91
{
157
if (u) {
92
ssys_state *s = STELLARIS_SYS(obj);
158
@@ -XXX,XX +XXX,XX @@ static inline void gen_neon_widen(TCGv_i64 dest, TCGv_i32 src, int size, int u)
93
159
tcg_temp_free_i32(src);
94
- ssys_calculate_system_clock(s);
95
+ /* OK to propagate clocks from the hold phase */
96
+ ssys_calculate_system_clock(s, true);
160
}
97
}
161
98
162
-static void gen_neon_narrow_op(int op, int u, int size,
99
static void stellaris_sys_reset_exit(Object *obj)
163
- TCGv_i32 dest, TCGv_i64 src)
100
@@ -XXX,XX +XXX,XX @@ static int stellaris_sys_post_load(void *opaque, int version_id)
164
-{
101
{
165
- if (op) {
102
ssys_state *s = opaque;
166
- if (u) {
103
167
- gen_neon_unarrow_sats(size, dest, src);
104
- ssys_calculate_system_clock(s);
168
- } else {
105
+ ssys_calculate_system_clock(s, false);
169
- gen_neon_narrow(size, dest, src);
106
170
- }
107
return 0;
171
- } else {
108
}
172
- if (u) {
109
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_stellaris_sys = {
173
- gen_neon_narrow_satu(size, dest, src);
110
VMSTATE_UINT32_ARRAY(dcgc, ssys_state, 3),
174
- } else {
111
VMSTATE_UINT32(clkvclr, ssys_state),
175
- gen_neon_narrow_sats(size, dest, src);
112
VMSTATE_UINT32(ldoarst, ssys_state),
176
- }
113
+ /* No field for sysclk -- handled in post-load instead */
177
- }
114
VMSTATE_END_OF_LIST()
178
-}
115
}
179
-
116
};
180
/* Symbolic constants for op fields for Neon 2-register miscellaneous.
117
@@ -XXX,XX +XXX,XX @@ static void stellaris_sys_instance_init(Object *obj)
181
* The values correspond to bits [17:16,10:7]; see the ARM ARM DDI0406B
118
memory_region_init_io(&s->iomem, obj, &ssys_ops, s, "ssys", 0x00001000);
182
* table A7-13.
119
sysbus_init_mmio(sbd, &s->iomem);
183
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
120
sysbus_init_irq(sbd, &s->irq);
184
!arm_dc_feature(s, ARM_FEATURE_V8)) {
121
+ s->sysclk = qdev_init_clock_out(DEVICE(s), "SYSCLK");
185
return 1;
122
}
186
}
123
187
- if ((op != NEON_2RM_VMOVN && op != NEON_2RM_VQMOVN) &&
124
-static int stellaris_sys_init(uint32_t base, qemu_irq irq,
188
- q && ((rm | rd) & 1)) {
125
- stellaris_board_info * board,
189
+ if (q && ((rm | rd) & 1)) {
126
- uint8_t *macaddr)
190
return 1;
127
+static DeviceState *stellaris_sys_init(uint32_t base, qemu_irq irq,
191
}
128
+ stellaris_board_info *board,
192
switch (op) {
129
+ uint8_t *macaddr)
193
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
130
{
194
case NEON_2RM_VPADAL: case NEON_2RM_VPADAL_U:
131
DeviceState *dev = qdev_new(TYPE_STELLARIS_SYS);
195
case NEON_2RM_VUZP:
132
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
196
case NEON_2RM_VZIP:
133
@@ -XXX,XX +XXX,XX @@ static int stellaris_sys_init(uint32_t base, qemu_irq irq,
197
+ case NEON_2RM_VMOVN: case NEON_2RM_VQMOVN:
134
*/
198
/* handled by decodetree */
135
device_cold_reset(dev);
199
return 1;
136
200
case NEON_2RM_VTRN:
137
- return 0;
201
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
138
+ return dev;
202
goto elementwise;
139
}
203
}
140
204
break;
141
/* I2C controller. */
205
- case NEON_2RM_VMOVN: case NEON_2RM_VQMOVN:
142
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
206
- /* also VQMOVUN; op field and mnemonics don't line up */
143
int flash_size;
207
- if (rm & 1) {
144
I2CBus *i2c;
208
- return 1;
145
DeviceState *dev;
209
- }
146
+ DeviceState *ssys_dev;
210
- tmp2 = NULL;
147
int i;
211
- for (pass = 0; pass < 2; pass++) {
148
int j;
212
- neon_load_reg64(cpu_V0, rm + pass);
149
213
- tmp = tcg_temp_new_i32();
150
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
214
- gen_neon_narrow_op(op == NEON_2RM_VMOVN, q, size,
151
}
215
- tmp, cpu_V0);
152
}
216
- if (pass == 0) {
153
217
- tmp2 = tmp;
154
- stellaris_sys_init(0x400fe000, qdev_get_gpio_in(nvic, 28),
218
- } else {
155
- board, nd_table[0].macaddr.a);
219
- neon_store_reg(rd, 0, tmp2);
156
+ ssys_dev = stellaris_sys_init(0x400fe000, qdev_get_gpio_in(nvic, 28),
220
- neon_store_reg(rd, 1, tmp);
157
+ board, nd_table[0].macaddr.a);
221
- }
158
222
- }
159
223
- break;
160
if (board->dc1 & (1 << 3)) { /* watchdog present */
224
case NEON_2RM_VSHLL:
161
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
225
if (q || (rd & 1)) {
162
/* system_clock_scale is valid now */
226
return 1;
163
uint32_t mainclk = NANOSECONDS_PER_SECOND / system_clock_scale;
164
qdev_prop_set_uint32(dev, "wdogclk-frq", mainclk);
165
+ qdev_connect_clock_in(dev, "WDOGCLK",
166
+ qdev_get_clock_out(ssys_dev, "SYSCLK"));
167
168
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
169
sysbus_mmio_map(SYS_BUS_DEVICE(dev),
227
--
170
--
228
2.20.1
171
2.20.1
229
172
230
173
diff view generated by jsdifflib
1
Make gen_swap_half() take a source and destination TCGv_i32 rather
1
Switch the CMSDK APB timer device over to using its Clock input; the
2
than modifying the input TCGv_i32; we're going to want to be able to
2
pclk-frq property is now ignored.
3
use it with the more flexible function signature, and this also
4
brings it into line with other functions like gen_rev16() and
5
gen_revsh().
6
3
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20200616170844.13318-12-peter.maydell@linaro.org
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
7
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-19-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-19-peter.maydell@linaro.org
10
---
10
---
11
target/arm/translate-neon.inc.c | 2 +-
11
hw/timer/cmsdk-apb-timer.c | 18 ++++++++++++++----
12
target/arm/translate.c | 10 +++++-----
12
1 file changed, 14 insertions(+), 4 deletions(-)
13
2 files changed, 6 insertions(+), 6 deletions(-)
14
13
15
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
14
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-neon.inc.c
16
--- a/hw/timer/cmsdk-apb-timer.c
18
+++ b/target/arm/translate-neon.inc.c
17
+++ b/hw/timer/cmsdk-apb-timer.c
19
@@ -XXX,XX +XXX,XX @@ static bool trans_VREV64(DisasContext *s, arg_VREV64 *a)
18
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_reset(DeviceState *dev)
20
tcg_gen_bswap32_i32(tmp[half], tmp[half]);
19
ptimer_transaction_commit(s->timer);
21
break;
22
case 1:
23
- gen_swap_half(tmp[half]);
24
+ gen_swap_half(tmp[half], tmp[half]);
25
break;
26
case 2:
27
break;
28
diff --git a/target/arm/translate.c b/target/arm/translate.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/translate.c
31
+++ b/target/arm/translate.c
32
@@ -XXX,XX +XXX,XX @@ static void gen_revsh(TCGv_i32 dest, TCGv_i32 var)
33
}
20
}
34
21
35
/* Swap low and high halfwords. */
22
+static void cmsdk_apb_timer_clk_update(void *opaque)
36
-static void gen_swap_half(TCGv_i32 var)
23
+{
37
+static void gen_swap_half(TCGv_i32 dest, TCGv_i32 var)
24
+ CMSDKAPBTimer *s = CMSDK_APB_TIMER(opaque);
25
+
26
+ ptimer_transaction_begin(s->timer);
27
+ ptimer_set_period_from_clock(s->timer, s->pclk, 1);
28
+ ptimer_transaction_commit(s->timer);
29
+}
30
+
31
static void cmsdk_apb_timer_init(Object *obj)
38
{
32
{
39
- tcg_gen_rotri_i32(var, var, 16);
33
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
40
+ tcg_gen_rotri_i32(dest, var, 16);
34
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_init(Object *obj)
35
s, "cmsdk-apb-timer", 0x1000);
36
sysbus_init_mmio(sbd, &s->iomem);
37
sysbus_init_irq(sbd, &s->timerint);
38
- s->pclk = qdev_init_clock_in(DEVICE(s), "pclk", NULL, NULL);
39
+ s->pclk = qdev_init_clock_in(DEVICE(s), "pclk",
40
+ cmsdk_apb_timer_clk_update, s);
41
}
41
}
42
42
43
/* Dual 16-bit add. Result placed in t0 and t1 is marked as dead.
43
static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
44
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
44
{
45
case NEON_2RM_VREV32:
45
CMSDKAPBTimer *s = CMSDK_APB_TIMER(dev);
46
switch (size) {
46
47
case 0: tcg_gen_bswap32_i32(tmp, tmp); break;
47
- if (s->pclk_frq == 0) {
48
- case 1: gen_swap_half(tmp); break;
48
- error_setg(errp, "CMSDK APB timer: pclk-frq property must be set");
49
+ case 1: gen_swap_half(tmp, tmp); break;
49
+ if (!clock_has_source(s->pclk)) {
50
default: abort();
50
+ error_setg(errp, "CMSDK APB timer: pclk clock must be connected");
51
}
51
return;
52
break;
53
@@ -XXX,XX +XXX,XX @@ static bool op_smlad(DisasContext *s, arg_rrrr *a, bool m_swap, bool sub)
54
t1 = load_reg(s, a->rn);
55
t2 = load_reg(s, a->rm);
56
if (m_swap) {
57
- gen_swap_half(t2);
58
+ gen_swap_half(t2, t2);
59
}
52
}
60
gen_smul_dual(t1, t2);
53
61
54
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
62
@@ -XXX,XX +XXX,XX @@ static bool op_smlald(DisasContext *s, arg_rrrr *a, bool m_swap, bool sub)
55
PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
63
t1 = load_reg(s, a->rn);
56
64
t2 = load_reg(s, a->rm);
57
ptimer_transaction_begin(s->timer);
65
if (m_swap) {
58
- ptimer_set_freq(s->timer, s->pclk_frq);
66
- gen_swap_half(t2);
59
+ ptimer_set_period_from_clock(s->timer, s->pclk, 1);
67
+ gen_swap_half(t2, t2);
60
ptimer_transaction_commit(s->timer);
68
}
61
}
69
gen_smul_dual(t1, t2);
70
62
71
--
63
--
72
2.20.1
64
2.20.1
73
65
74
66
diff view generated by jsdifflib
1
The functions neon_element_offset(), neon_load_element(),
1
Switch the CMSDK APB dualtimer device over to using its Clock input;
2
neon_load_element64(), neon_store_element() and
2
the pclk-frq property is now ignored.
3
neon_store_element64() are used only in the translate-neon.inc.c
4
file, so move their definitions there.
5
6
Since the .inc.c file is #included in translate.c this doesn't make
7
much difference currently, but it's a more logical place to put the
8
functions and it might be helpful if we ever decide to try to make
9
the .inc.c files genuinely separate compilation units.
10
3
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Luc Michel <luc@lmichel.fr>
13
Message-id: 20200616170844.13318-22-peter.maydell@linaro.org
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-20-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-20-peter.maydell@linaro.org
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
---
11
---
15
target/arm/translate-neon.inc.c | 101 ++++++++++++++++++++++++++++++++
12
hw/timer/cmsdk-apb-dualtimer.c | 42 ++++++++++++++++++++++++++++++----
16
target/arm/translate.c | 101 --------------------------------
13
1 file changed, 37 insertions(+), 5 deletions(-)
17
2 files changed, 101 insertions(+), 101 deletions(-)
18
14
19
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
15
diff --git a/hw/timer/cmsdk-apb-dualtimer.c b/hw/timer/cmsdk-apb-dualtimer.c
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/translate-neon.inc.c
17
--- a/hw/timer/cmsdk-apb-dualtimer.c
22
+++ b/target/arm/translate-neon.inc.c
18
+++ b/hw/timer/cmsdk-apb-dualtimer.c
23
@@ -XXX,XX +XXX,XX @@ static inline int rsub_8(DisasContext *s, int x)
19
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_update(CMSDKAPBDualTimer *s)
24
#include "decode-neon-ls.inc.c"
20
qemu_set_irq(s->timerintc, timintc);
25
#include "decode-neon-shared.inc.c"
21
}
26
22
27
+/* Return the offset of a 2**SIZE piece of a NEON register, at index ELE,
23
+static int cmsdk_dualtimermod_divisor(CMSDKAPBDualTimerModule *m)
28
+ * where 0 is the least significant end of the register.
29
+ */
30
+static inline long
31
+neon_element_offset(int reg, int element, MemOp size)
32
+{
24
+{
33
+ int element_size = 1 << size;
25
+ /* Return the divisor set by the current CONTROL.PRESCALE value */
34
+ int ofs = element * element_size;
26
+ switch (FIELD_EX32(m->control, CONTROL, PRESCALE)) {
35
+#ifdef HOST_WORDS_BIGENDIAN
27
+ case 0:
36
+ /* Calculate the offset assuming fully little-endian,
28
+ return 1;
37
+ * then XOR to account for the order of the 8-byte units.
29
+ case 1:
38
+ */
30
+ return 16;
39
+ if (element_size < 8) {
31
+ case 2:
40
+ ofs ^= 8 - element_size;
32
+ case 3: /* UNDEFINED, we treat like 2 (and complained when it was set) */
41
+ }
33
+ return 256;
42
+#endif
43
+ return neon_reg_offset(reg, 0) + ofs;
44
+}
45
+
46
+static void neon_load_element(TCGv_i32 var, int reg, int ele, MemOp mop)
47
+{
48
+ long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
49
+
50
+ switch (mop) {
51
+ case MO_UB:
52
+ tcg_gen_ld8u_i32(var, cpu_env, offset);
53
+ break;
54
+ case MO_UW:
55
+ tcg_gen_ld16u_i32(var, cpu_env, offset);
56
+ break;
57
+ case MO_UL:
58
+ tcg_gen_ld_i32(var, cpu_env, offset);
59
+ break;
60
+ default:
34
+ default:
61
+ g_assert_not_reached();
35
+ g_assert_not_reached();
62
+ }
36
+ }
63
+}
37
+}
64
+
38
+
65
+static void neon_load_element64(TCGv_i64 var, int reg, int ele, MemOp mop)
39
static void cmsdk_dualtimermod_write_control(CMSDKAPBDualTimerModule *m,
40
uint32_t newctrl)
41
{
42
@@ -XXX,XX +XXX,XX @@ static void cmsdk_dualtimermod_write_control(CMSDKAPBDualTimerModule *m,
43
default:
44
g_assert_not_reached();
45
}
46
- ptimer_set_freq(m->timer, m->parent->pclk_frq / divisor);
47
+ ptimer_set_period_from_clock(m->timer, m->parent->timclk, divisor);
48
}
49
50
if (changed & R_CONTROL_MODE_MASK) {
51
@@ -XXX,XX +XXX,XX @@ static void cmsdk_dualtimermod_reset(CMSDKAPBDualTimerModule *m)
52
* limit must both be set to 0xffff, so we wrap at 16 bits.
53
*/
54
ptimer_set_limit(m->timer, 0xffff, 1);
55
- ptimer_set_freq(m->timer, m->parent->pclk_frq);
56
+ ptimer_set_period_from_clock(m->timer, m->parent->timclk,
57
+ cmsdk_dualtimermod_divisor(m));
58
ptimer_transaction_commit(m->timer);
59
}
60
61
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_reset(DeviceState *dev)
62
s->timeritop = 0;
63
}
64
65
+static void cmsdk_apb_dualtimer_clk_update(void *opaque)
66
+{
66
+{
67
+ long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
67
+ CMSDKAPBDualTimer *s = CMSDK_APB_DUALTIMER(opaque);
68
+ int i;
68
+
69
+
69
+ switch (mop) {
70
+ for (i = 0; i < ARRAY_SIZE(s->timermod); i++) {
70
+ case MO_UB:
71
+ CMSDKAPBDualTimerModule *m = &s->timermod[i];
71
+ tcg_gen_ld8u_i64(var, cpu_env, offset);
72
+ ptimer_transaction_begin(m->timer);
72
+ break;
73
+ ptimer_set_period_from_clock(m->timer, m->parent->timclk,
73
+ case MO_UW:
74
+ cmsdk_dualtimermod_divisor(m));
74
+ tcg_gen_ld16u_i64(var, cpu_env, offset);
75
+ ptimer_transaction_commit(m->timer);
75
+ break;
76
+ case MO_UL:
77
+ tcg_gen_ld32u_i64(var, cpu_env, offset);
78
+ break;
79
+ case MO_Q:
80
+ tcg_gen_ld_i64(var, cpu_env, offset);
81
+ break;
82
+ default:
83
+ g_assert_not_reached();
84
+ }
76
+ }
85
+}
77
+}
86
+
78
+
87
+static void neon_store_element(int reg, int ele, MemOp size, TCGv_i32 var)
79
static void cmsdk_apb_dualtimer_init(Object *obj)
88
+{
89
+ long offset = neon_element_offset(reg, ele, size);
90
+
91
+ switch (size) {
92
+ case MO_8:
93
+ tcg_gen_st8_i32(var, cpu_env, offset);
94
+ break;
95
+ case MO_16:
96
+ tcg_gen_st16_i32(var, cpu_env, offset);
97
+ break;
98
+ case MO_32:
99
+ tcg_gen_st_i32(var, cpu_env, offset);
100
+ break;
101
+ default:
102
+ g_assert_not_reached();
103
+ }
104
+}
105
+
106
+static void neon_store_element64(int reg, int ele, MemOp size, TCGv_i64 var)
107
+{
108
+ long offset = neon_element_offset(reg, ele, size);
109
+
110
+ switch (size) {
111
+ case MO_8:
112
+ tcg_gen_st8_i64(var, cpu_env, offset);
113
+ break;
114
+ case MO_16:
115
+ tcg_gen_st16_i64(var, cpu_env, offset);
116
+ break;
117
+ case MO_32:
118
+ tcg_gen_st32_i64(var, cpu_env, offset);
119
+ break;
120
+ case MO_64:
121
+ tcg_gen_st_i64(var, cpu_env, offset);
122
+ break;
123
+ default:
124
+ g_assert_not_reached();
125
+ }
126
+}
127
+
128
static bool trans_VCMLA(DisasContext *s, arg_VCMLA *a)
129
{
80
{
130
int opr_sz;
81
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
131
diff --git a/target/arm/translate.c b/target/arm/translate.c
82
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_init(Object *obj)
132
index XXXXXXX..XXXXXXX 100644
83
for (i = 0; i < ARRAY_SIZE(s->timermod); i++) {
133
--- a/target/arm/translate.c
84
sysbus_init_irq(sbd, &s->timermod[i].timerint);
134
+++ b/target/arm/translate.c
85
}
135
@@ -XXX,XX +XXX,XX @@ neon_reg_offset (int reg, int n)
86
- s->timclk = qdev_init_clock_in(DEVICE(s), "TIMCLK", NULL, NULL);
136
return vfp_reg_offset(0, sreg);
87
+ s->timclk = qdev_init_clock_in(DEVICE(s), "TIMCLK",
88
+ cmsdk_apb_dualtimer_clk_update, s);
137
}
89
}
138
90
139
-/* Return the offset of a 2**SIZE piece of a NEON register, at index ELE,
91
static void cmsdk_apb_dualtimer_realize(DeviceState *dev, Error **errp)
140
- * where 0 is the least significant end of the register.
92
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_realize(DeviceState *dev, Error **errp)
141
- */
93
CMSDKAPBDualTimer *s = CMSDK_APB_DUALTIMER(dev);
142
-static inline long
94
int i;
143
-neon_element_offset(int reg, int element, MemOp size)
95
144
-{
96
- if (s->pclk_frq == 0) {
145
- int element_size = 1 << size;
97
- error_setg(errp, "CMSDK APB timer: pclk-frq property must be set");
146
- int ofs = element * element_size;
98
+ if (!clock_has_source(s->timclk)) {
147
-#ifdef HOST_WORDS_BIGENDIAN
99
+ error_setg(errp, "CMSDK APB dualtimer: TIMCLK clock must be connected");
148
- /* Calculate the offset assuming fully little-endian,
100
return;
149
- * then XOR to account for the order of the 8-byte units.
101
}
150
- */
102
151
- if (element_size < 8) {
152
- ofs ^= 8 - element_size;
153
- }
154
-#endif
155
- return neon_reg_offset(reg, 0) + ofs;
156
-}
157
-
158
static TCGv_i32 neon_load_reg(int reg, int pass)
159
{
160
TCGv_i32 tmp = tcg_temp_new_i32();
161
@@ -XXX,XX +XXX,XX @@ static TCGv_i32 neon_load_reg(int reg, int pass)
162
return tmp;
163
}
164
165
-static void neon_load_element(TCGv_i32 var, int reg, int ele, MemOp mop)
166
-{
167
- long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
168
-
169
- switch (mop) {
170
- case MO_UB:
171
- tcg_gen_ld8u_i32(var, cpu_env, offset);
172
- break;
173
- case MO_UW:
174
- tcg_gen_ld16u_i32(var, cpu_env, offset);
175
- break;
176
- case MO_UL:
177
- tcg_gen_ld_i32(var, cpu_env, offset);
178
- break;
179
- default:
180
- g_assert_not_reached();
181
- }
182
-}
183
-
184
-static void neon_load_element64(TCGv_i64 var, int reg, int ele, MemOp mop)
185
-{
186
- long offset = neon_element_offset(reg, ele, mop & MO_SIZE);
187
-
188
- switch (mop) {
189
- case MO_UB:
190
- tcg_gen_ld8u_i64(var, cpu_env, offset);
191
- break;
192
- case MO_UW:
193
- tcg_gen_ld16u_i64(var, cpu_env, offset);
194
- break;
195
- case MO_UL:
196
- tcg_gen_ld32u_i64(var, cpu_env, offset);
197
- break;
198
- case MO_Q:
199
- tcg_gen_ld_i64(var, cpu_env, offset);
200
- break;
201
- default:
202
- g_assert_not_reached();
203
- }
204
-}
205
-
206
static void neon_store_reg(int reg, int pass, TCGv_i32 var)
207
{
208
tcg_gen_st_i32(var, cpu_env, neon_reg_offset(reg, pass));
209
tcg_temp_free_i32(var);
210
}
211
212
-static void neon_store_element(int reg, int ele, MemOp size, TCGv_i32 var)
213
-{
214
- long offset = neon_element_offset(reg, ele, size);
215
-
216
- switch (size) {
217
- case MO_8:
218
- tcg_gen_st8_i32(var, cpu_env, offset);
219
- break;
220
- case MO_16:
221
- tcg_gen_st16_i32(var, cpu_env, offset);
222
- break;
223
- case MO_32:
224
- tcg_gen_st_i32(var, cpu_env, offset);
225
- break;
226
- default:
227
- g_assert_not_reached();
228
- }
229
-}
230
-
231
-static void neon_store_element64(int reg, int ele, MemOp size, TCGv_i64 var)
232
-{
233
- long offset = neon_element_offset(reg, ele, size);
234
-
235
- switch (size) {
236
- case MO_8:
237
- tcg_gen_st8_i64(var, cpu_env, offset);
238
- break;
239
- case MO_16:
240
- tcg_gen_st16_i64(var, cpu_env, offset);
241
- break;
242
- case MO_32:
243
- tcg_gen_st32_i64(var, cpu_env, offset);
244
- break;
245
- case MO_64:
246
- tcg_gen_st_i64(var, cpu_env, offset);
247
- break;
248
- default:
249
- g_assert_not_reached();
250
- }
251
-}
252
-
253
static inline void neon_load_reg64(TCGv_i64 var, int reg)
254
{
255
tcg_gen_ld_i64(var, cpu_env, vfp_reg_offset(1, reg));
256
--
103
--
257
2.20.1
104
2.20.1
258
105
259
106
diff view generated by jsdifflib
1
Convert to decodetree the insns in the Neon 2-reg-misc grouping which
1
Switch the CMSDK APB watchdog device over to using its Clock input;
2
we implement using gvec.
2
the wdogclk_frq property is now ignored.
3
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200616170844.13318-8-peter.maydell@linaro.org
6
Reviewed-by: Luc Michel <luc@lmichel.fr>
7
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Message-id: 20210128114145.20536-21-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-21-peter.maydell@linaro.org
7
---
10
---
8
target/arm/neon-dp.decode | 11 +++++++
11
hw/watchdog/cmsdk-apb-watchdog.c | 18 ++++++++++++++----
9
target/arm/translate-neon.inc.c | 55 +++++++++++++++++++++++++++++++++
12
1 file changed, 14 insertions(+), 4 deletions(-)
10
target/arm/translate.c | 35 +++++----------------
11
3 files changed, 74 insertions(+), 27 deletions(-)
12
13
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
14
diff --git a/hw/watchdog/cmsdk-apb-watchdog.c b/hw/watchdog/cmsdk-apb-watchdog.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
16
--- a/hw/watchdog/cmsdk-apb-watchdog.c
16
+++ b/target/arm/neon-dp.decode
17
+++ b/hw/watchdog/cmsdk-apb-watchdog.c
17
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
18
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_reset(DeviceState *dev)
18
VPADDL_S 1111 001 11 . 11 .. 00 .... 0 0100 . . 0 .... @2misc
19
ptimer_transaction_commit(s->timer);
19
VPADDL_U 1111 001 11 . 11 .. 00 .... 0 0101 . . 0 .... @2misc
20
}
20
21
21
+ VMVN 1111 001 11 . 11 .. 00 .... 0 1011 . . 0 .... @2misc
22
+static void cmsdk_apb_watchdog_clk_update(void *opaque)
23
+{
24
+ CMSDKAPBWatchdog *s = CMSDK_APB_WATCHDOG(opaque);
22
+
25
+
23
VPADAL_S 1111 001 11 . 11 .. 00 .... 0 1100 . . 0 .... @2misc
26
+ ptimer_transaction_begin(s->timer);
24
VPADAL_U 1111 001 11 . 11 .. 00 .... 0 1101 . . 0 .... @2misc
27
+ ptimer_set_period_from_clock(s->timer, s->wdogclk, 1);
25
28
+ ptimer_transaction_commit(s->timer);
26
+ VCGT0 1111 001 11 . 11 .. 01 .... 0 0000 . . 0 .... @2misc
27
+ VCGE0 1111 001 11 . 11 .. 01 .... 0 0001 . . 0 .... @2misc
28
+ VCEQ0 1111 001 11 . 11 .. 01 .... 0 0010 . . 0 .... @2misc
29
+ VCLE0 1111 001 11 . 11 .. 01 .... 0 0011 . . 0 .... @2misc
30
+ VCLT0 1111 001 11 . 11 .. 01 .... 0 0100 . . 0 .... @2misc
31
+
32
+ VABS 1111 001 11 . 11 .. 01 .... 0 0110 . . 0 .... @2misc
33
+ VNEG 1111 001 11 . 11 .. 01 .... 0 0111 . . 0 .... @2misc
34
+
35
VUZP 1111 001 11 . 11 .. 10 .... 0 0010 . . 0 .... @2misc
36
VZIP 1111 001 11 . 11 .. 10 .... 0 0011 . . 0 .... @2misc
37
38
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/translate-neon.inc.c
41
+++ b/target/arm/translate-neon.inc.c
42
@@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_F32_F16(DisasContext *s, arg_2misc *a)
43
44
return true;
45
}
46
+
47
+static bool do_2misc_vec(DisasContext *s, arg_2misc *a, GVecGen2Fn *fn)
48
+{
49
+ int vec_size = a->q ? 16 : 8;
50
+ int rd_ofs = neon_reg_offset(a->vd, 0);
51
+ int rm_ofs = neon_reg_offset(a->vm, 0);
52
+
53
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
54
+ return false;
55
+ }
56
+
57
+ /* UNDEF accesses to D16-D31 if they don't exist. */
58
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
59
+ ((a->vd | a->vm) & 0x10)) {
60
+ return false;
61
+ }
62
+
63
+ if (a->size == 3) {
64
+ return false;
65
+ }
66
+
67
+ if ((a->vd | a->vm) & a->q) {
68
+ return false;
69
+ }
70
+
71
+ if (!vfp_access_check(s)) {
72
+ return true;
73
+ }
74
+
75
+ fn(a->size, rd_ofs, rm_ofs, vec_size, vec_size);
76
+
77
+ return true;
78
+}
29
+}
79
+
30
+
80
+#define DO_2MISC_VEC(INSN, FN) \
31
static void cmsdk_apb_watchdog_init(Object *obj)
81
+ static bool trans_##INSN(DisasContext *s, arg_2misc *a) \
32
{
82
+ { \
33
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
83
+ return do_2misc_vec(s, a, FN); \
34
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_init(Object *obj)
84
+ }
35
s, "cmsdk-apb-watchdog", 0x1000);
85
+
36
sysbus_init_mmio(sbd, &s->iomem);
86
+DO_2MISC_VEC(VNEG, tcg_gen_gvec_neg)
37
sysbus_init_irq(sbd, &s->wdogint);
87
+DO_2MISC_VEC(VABS, tcg_gen_gvec_abs)
38
- s->wdogclk = qdev_init_clock_in(DEVICE(s), "WDOGCLK", NULL, NULL);
88
+DO_2MISC_VEC(VCEQ0, gen_gvec_ceq0)
39
+ s->wdogclk = qdev_init_clock_in(DEVICE(s), "WDOGCLK",
89
+DO_2MISC_VEC(VCGT0, gen_gvec_cgt0)
40
+ cmsdk_apb_watchdog_clk_update, s);
90
+DO_2MISC_VEC(VCLE0, gen_gvec_cle0)
41
91
+DO_2MISC_VEC(VCGE0, gen_gvec_cge0)
42
s->is_luminary = false;
92
+DO_2MISC_VEC(VCLT0, gen_gvec_clt0)
43
s->id = cmsdk_apb_watchdog_id;
93
+
44
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_realize(DeviceState *dev, Error **errp)
94
+static bool trans_VMVN(DisasContext *s, arg_2misc *a)
45
{
95
+{
46
CMSDKAPBWatchdog *s = CMSDK_APB_WATCHDOG(dev);
96
+ if (a->size != 0) {
47
97
+ return false;
48
- if (s->wdogclk_frq == 0) {
98
+ }
49
+ if (!clock_has_source(s->wdogclk)) {
99
+ return do_2misc_vec(s, a, tcg_gen_gvec_not);
50
error_setg(errp,
100
+}
51
- "CMSDK APB watchdog: wdogclk-frq property must be set");
101
diff --git a/target/arm/translate.c b/target/arm/translate.c
52
+ "CMSDK APB watchdog: WDOGCLK clock must be connected");
102
index XXXXXXX..XXXXXXX 100644
53
return;
103
--- a/target/arm/translate.c
54
}
104
+++ b/target/arm/translate.c
55
105
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
56
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_realize(DeviceState *dev, Error **errp)
106
int size;
57
PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
107
int pass;
58
108
int u;
59
ptimer_transaction_begin(s->timer);
109
- int vec_size;
60
- ptimer_set_freq(s->timer, s->wdogclk_frq);
110
TCGv_i32 tmp, tmp2;
61
+ ptimer_set_period_from_clock(s->timer, s->wdogclk, 1);
111
62
ptimer_transaction_commit(s->timer);
112
if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
63
}
113
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
64
114
VFP_DREG_D(rd, insn);
115
VFP_DREG_M(rm, insn);
116
size = (insn >> 20) & 3;
117
- vec_size = q ? 16 : 8;
118
rd_ofs = neon_reg_offset(rd, 0);
119
rm_ofs = neon_reg_offset(rm, 0);
120
121
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
122
case NEON_2RM_VSHLL:
123
case NEON_2RM_VCVT_F16_F32:
124
case NEON_2RM_VCVT_F32_F16:
125
+ case NEON_2RM_VMVN:
126
+ case NEON_2RM_VNEG:
127
+ case NEON_2RM_VABS:
128
+ case NEON_2RM_VCEQ0:
129
+ case NEON_2RM_VCGT0:
130
+ case NEON_2RM_VCLE0:
131
+ case NEON_2RM_VCGE0:
132
+ case NEON_2RM_VCLT0:
133
/* handled by decodetree */
134
return 1;
135
case NEON_2RM_VTRN:
136
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
137
q ? gen_helper_crypto_sha256su0
138
: gen_helper_crypto_sha1su1);
139
break;
140
- case NEON_2RM_VMVN:
141
- tcg_gen_gvec_not(0, rd_ofs, rm_ofs, vec_size, vec_size);
142
- break;
143
- case NEON_2RM_VNEG:
144
- tcg_gen_gvec_neg(size, rd_ofs, rm_ofs, vec_size, vec_size);
145
- break;
146
- case NEON_2RM_VABS:
147
- tcg_gen_gvec_abs(size, rd_ofs, rm_ofs, vec_size, vec_size);
148
- break;
149
-
150
- case NEON_2RM_VCEQ0:
151
- gen_gvec_ceq0(size, rd_ofs, rm_ofs, vec_size, vec_size);
152
- break;
153
- case NEON_2RM_VCGT0:
154
- gen_gvec_cgt0(size, rd_ofs, rm_ofs, vec_size, vec_size);
155
- break;
156
- case NEON_2RM_VCLE0:
157
- gen_gvec_cle0(size, rd_ofs, rm_ofs, vec_size, vec_size);
158
- break;
159
- case NEON_2RM_VCGE0:
160
- gen_gvec_cge0(size, rd_ofs, rm_ofs, vec_size, vec_size);
161
- break;
162
- case NEON_2RM_VCLT0:
163
- gen_gvec_clt0(size, rd_ofs, rm_ofs, vec_size, vec_size);
164
- break;
165
166
default:
167
elementwise:
168
--
65
--
169
2.20.1
66
2.20.1
170
67
171
68
diff view generated by jsdifflib
1
Convert the Neon insns in the 2-reg-misc group which are
1
Now that the CMSDK APB watchdog uses its Clock input, it will
2
VCVT between f32 and f16 to decodetree.
2
correctly respond when the system clock frequency is changed using
3
the RCC register on in the Stellaris board system registers. Test
4
that when the RCC register is written it causes the watchdog timer to
5
change speed.
3
6
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200616170844.13318-7-peter.maydell@linaro.org
9
Reviewed-by: Luc Michel <luc@lmichel.fr>
10
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-id: 20210128114145.20536-22-peter.maydell@linaro.org
12
Message-id: 20210121190622.22000-22-peter.maydell@linaro.org
7
---
13
---
8
target/arm/neon-dp.decode | 3 ++
14
tests/qtest/cmsdk-apb-watchdog-test.c | 52 +++++++++++++++++++++++++++
9
target/arm/translate-neon.inc.c | 96 +++++++++++++++++++++++++++++++++
15
1 file changed, 52 insertions(+)
10
target/arm/translate.c | 65 ++--------------------
11
3 files changed, 102 insertions(+), 62 deletions(-)
12
16
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
17
diff --git a/tests/qtest/cmsdk-apb-watchdog-test.c b/tests/qtest/cmsdk-apb-watchdog-test.c
14
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
19
--- a/tests/qtest/cmsdk-apb-watchdog-test.c
16
+++ b/target/arm/neon-dp.decode
20
+++ b/tests/qtest/cmsdk-apb-watchdog-test.c
17
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
21
@@ -XXX,XX +XXX,XX @@
18
VQMOVN_U 1111 001 11 . 11 .. 10 .... 0 0101 1 . 0 .... @2misc_q0
22
*/
19
23
20
VSHLL 1111 001 11 . 11 .. 10 .... 0 0110 0 . 0 .... @2misc_q0
24
#include "qemu/osdep.h"
25
+#include "qemu/bitops.h"
26
#include "libqtest-single.h"
27
28
/*
29
@@ -XXX,XX +XXX,XX @@
30
#define WDOGMIS 0x14
31
#define WDOGLOCK 0xc00
32
33
+#define SSYS_BASE 0x400fe000
34
+#define RCC 0x60
35
+#define SYSDIV_SHIFT 23
36
+#define SYSDIV_LENGTH 4
21
+
37
+
22
+ VCVT_F16_F32 1111 001 11 . 11 .. 10 .... 0 1100 0 . 0 .... @2misc_q0
38
static void test_watchdog(void)
23
+ VCVT_F32_F16 1111 001 11 . 11 .. 10 .... 0 1110 0 . 0 .... @2misc_q0
39
{
24
]
40
g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
25
41
@@ -XXX,XX +XXX,XX @@ static void test_watchdog(void)
26
# Subgroup for size != 0b11
42
g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
27
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/translate-neon.inc.c
30
+++ b/target/arm/translate-neon.inc.c
31
@@ -XXX,XX +XXX,XX @@ static bool trans_VSHLL(DisasContext *s, arg_2misc *a)
32
tcg_temp_free_i32(rm1);
33
return true;
34
}
43
}
44
45
+static void test_clock_change(void)
46
+{
47
+ uint32_t rcc;
35
+
48
+
36
+static bool trans_VCVT_F16_F32(DisasContext *s, arg_2misc *a)
49
+ /*
37
+{
50
+ * Test that writing to the stellaris board's RCC register to
38
+ TCGv_ptr fpst;
51
+ * change the system clock frequency causes the watchdog
39
+ TCGv_i32 ahp, tmp, tmp2, tmp3;
52
+ * to change the speed it counts at.
53
+ */
54
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
40
+
55
+
41
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON) ||
56
+ writel(WDOG_BASE + WDOGCONTROL, 1);
42
+ !dc_isar_feature(aa32_fp16_spconv, s)) {
57
+ writel(WDOG_BASE + WDOGLOAD, 1000);
43
+ return false;
44
+ }
45
+
58
+
46
+ /* UNDEF accesses to D16-D31 if they don't exist. */
59
+ /* Step to just past the 500th tick */
47
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
60
+ clock_step(80 * 500 + 1);
48
+ ((a->vd | a->vm) & 0x10)) {
61
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
49
+ return false;
62
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
50
+ }
51
+
63
+
52
+ if ((a->vm & 1) || (a->size != 1)) {
64
+ /* Rewrite RCC.SYSDIV from 16 to 8, so the clock is now 40ns per tick */
53
+ return false;
65
+ rcc = readl(SSYS_BASE + RCC);
54
+ }
66
+ g_assert_cmpuint(extract32(rcc, SYSDIV_SHIFT, SYSDIV_LENGTH), ==, 0xf);
67
+ rcc = deposit32(rcc, SYSDIV_SHIFT, SYSDIV_LENGTH, 7);
68
+ writel(SSYS_BASE + RCC, rcc);
55
+
69
+
56
+ if (!vfp_access_check(s)) {
70
+ /* Just past the 1000th tick: timer should have fired */
57
+ return true;
71
+ clock_step(40 * 500);
58
+ }
72
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
59
+
73
+
60
+ fpst = get_fpstatus_ptr(true);
74
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 0);
61
+ ahp = get_ahp_flag();
62
+ tmp = neon_load_reg(a->vm, 0);
63
+ gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
64
+ tmp2 = neon_load_reg(a->vm, 1);
65
+ gen_helper_vfp_fcvt_f32_to_f16(tmp2, tmp2, fpst, ahp);
66
+ tcg_gen_shli_i32(tmp2, tmp2, 16);
67
+ tcg_gen_or_i32(tmp2, tmp2, tmp);
68
+ tcg_temp_free_i32(tmp);
69
+ tmp = neon_load_reg(a->vm, 2);
70
+ gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
71
+ tmp3 = neon_load_reg(a->vm, 3);
72
+ neon_store_reg(a->vd, 0, tmp2);
73
+ gen_helper_vfp_fcvt_f32_to_f16(tmp3, tmp3, fpst, ahp);
74
+ tcg_gen_shli_i32(tmp3, tmp3, 16);
75
+ tcg_gen_or_i32(tmp3, tmp3, tmp);
76
+ neon_store_reg(a->vd, 1, tmp3);
77
+ tcg_temp_free_i32(tmp);
78
+ tcg_temp_free_i32(ahp);
79
+ tcg_temp_free_ptr(fpst);
80
+
75
+
81
+ return true;
76
+ /* VALUE reloads at following tick */
77
+ clock_step(41);
78
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
79
+
80
+ /* Writing any value to WDOGINTCLR clears the interrupt and reloads */
81
+ clock_step(40 * 500);
82
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 500);
83
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 1);
84
+ writel(WDOG_BASE + WDOGINTCLR, 0);
85
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGVALUE), ==, 1000);
86
+ g_assert_cmpuint(readl(WDOG_BASE + WDOGRIS), ==, 0);
82
+}
87
+}
83
+
88
+
84
+static bool trans_VCVT_F32_F16(DisasContext *s, arg_2misc *a)
89
int main(int argc, char **argv)
85
+{
90
{
86
+ TCGv_ptr fpst;
91
int r;
87
+ TCGv_i32 ahp, tmp, tmp2, tmp3;
92
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
88
+
93
qtest_start("-machine lm3s811evb");
89
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON) ||
94
90
+ !dc_isar_feature(aa32_fp16_spconv, s)) {
95
qtest_add_func("/cmsdk-apb-watchdog/watchdog", test_watchdog);
91
+ return false;
96
+ qtest_add_func("/cmsdk-apb-watchdog/watchdog_clock_change",
92
+ }
97
+ test_clock_change);
93
+
98
94
+ /* UNDEF accesses to D16-D31 if they don't exist. */
99
r = g_test_run();
95
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
100
96
+ ((a->vd | a->vm) & 0x10)) {
97
+ return false;
98
+ }
99
+
100
+ if ((a->vd & 1) || (a->size != 1)) {
101
+ return false;
102
+ }
103
+
104
+ if (!vfp_access_check(s)) {
105
+ return true;
106
+ }
107
+
108
+ fpst = get_fpstatus_ptr(true);
109
+ ahp = get_ahp_flag();
110
+ tmp3 = tcg_temp_new_i32();
111
+ tmp = neon_load_reg(a->vm, 0);
112
+ tmp2 = neon_load_reg(a->vm, 1);
113
+ tcg_gen_ext16u_i32(tmp3, tmp);
114
+ gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
115
+ neon_store_reg(a->vd, 0, tmp3);
116
+ tcg_gen_shri_i32(tmp, tmp, 16);
117
+ gen_helper_vfp_fcvt_f16_to_f32(tmp, tmp, fpst, ahp);
118
+ neon_store_reg(a->vd, 1, tmp);
119
+ tmp3 = tcg_temp_new_i32();
120
+ tcg_gen_ext16u_i32(tmp3, tmp2);
121
+ gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
122
+ neon_store_reg(a->vd, 2, tmp3);
123
+ tcg_gen_shri_i32(tmp2, tmp2, 16);
124
+ gen_helper_vfp_fcvt_f16_to_f32(tmp2, tmp2, fpst, ahp);
125
+ neon_store_reg(a->vd, 3, tmp2);
126
+ tcg_temp_free_i32(ahp);
127
+ tcg_temp_free_ptr(fpst);
128
+
129
+ return true;
130
+}
131
diff --git a/target/arm/translate.c b/target/arm/translate.c
132
index XXXXXXX..XXXXXXX 100644
133
--- a/target/arm/translate.c
134
+++ b/target/arm/translate.c
135
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
136
int pass;
137
int u;
138
int vec_size;
139
- TCGv_i32 tmp, tmp2, tmp3;
140
+ TCGv_i32 tmp, tmp2;
141
142
if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
143
return 1;
144
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
145
case NEON_2RM_VZIP:
146
case NEON_2RM_VMOVN: case NEON_2RM_VQMOVN:
147
case NEON_2RM_VSHLL:
148
+ case NEON_2RM_VCVT_F16_F32:
149
+ case NEON_2RM_VCVT_F32_F16:
150
/* handled by decodetree */
151
return 1;
152
case NEON_2RM_VTRN:
153
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
154
goto elementwise;
155
}
156
break;
157
- case NEON_2RM_VCVT_F16_F32:
158
- {
159
- TCGv_ptr fpst;
160
- TCGv_i32 ahp;
161
-
162
- if (!dc_isar_feature(aa32_fp16_spconv, s) ||
163
- q || (rm & 1)) {
164
- return 1;
165
- }
166
- fpst = get_fpstatus_ptr(true);
167
- ahp = get_ahp_flag();
168
- tmp = neon_load_reg(rm, 0);
169
- gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
170
- tmp2 = neon_load_reg(rm, 1);
171
- gen_helper_vfp_fcvt_f32_to_f16(tmp2, tmp2, fpst, ahp);
172
- tcg_gen_shli_i32(tmp2, tmp2, 16);
173
- tcg_gen_or_i32(tmp2, tmp2, tmp);
174
- tcg_temp_free_i32(tmp);
175
- tmp = neon_load_reg(rm, 2);
176
- gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
177
- tmp3 = neon_load_reg(rm, 3);
178
- neon_store_reg(rd, 0, tmp2);
179
- gen_helper_vfp_fcvt_f32_to_f16(tmp3, tmp3, fpst, ahp);
180
- tcg_gen_shli_i32(tmp3, tmp3, 16);
181
- tcg_gen_or_i32(tmp3, tmp3, tmp);
182
- neon_store_reg(rd, 1, tmp3);
183
- tcg_temp_free_i32(tmp);
184
- tcg_temp_free_i32(ahp);
185
- tcg_temp_free_ptr(fpst);
186
- break;
187
- }
188
- case NEON_2RM_VCVT_F32_F16:
189
- {
190
- TCGv_ptr fpst;
191
- TCGv_i32 ahp;
192
- if (!dc_isar_feature(aa32_fp16_spconv, s) ||
193
- q || (rd & 1)) {
194
- return 1;
195
- }
196
- fpst = get_fpstatus_ptr(true);
197
- ahp = get_ahp_flag();
198
- tmp3 = tcg_temp_new_i32();
199
- tmp = neon_load_reg(rm, 0);
200
- tmp2 = neon_load_reg(rm, 1);
201
- tcg_gen_ext16u_i32(tmp3, tmp);
202
- gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
203
- neon_store_reg(rd, 0, tmp3);
204
- tcg_gen_shri_i32(tmp, tmp, 16);
205
- gen_helper_vfp_fcvt_f16_to_f32(tmp, tmp, fpst, ahp);
206
- neon_store_reg(rd, 1, tmp);
207
- tmp3 = tcg_temp_new_i32();
208
- tcg_gen_ext16u_i32(tmp3, tmp2);
209
- gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp);
210
- neon_store_reg(rd, 2, tmp3);
211
- tcg_gen_shri_i32(tmp2, tmp2, 16);
212
- gen_helper_vfp_fcvt_f16_to_f32(tmp2, tmp2, fpst, ahp);
213
- neon_store_reg(rd, 3, tmp2);
214
- tcg_temp_free_i32(ahp);
215
- tcg_temp_free_ptr(fpst);
216
- break;
217
- }
218
case NEON_2RM_AESE: case NEON_2RM_AESMC:
219
if (!dc_isar_feature(aa32_aes, s) || ((rm | rd) & 1)) {
220
return 1;
221
--
101
--
222
2.20.1
102
2.20.1
223
103
224
104
diff view generated by jsdifflib
1
Convert the Neon VZIP and VUZP insns in the 2-reg-misc group to
1
Use the MAINCLK Clock input to set the system_clock_scale variable
2
decodetree.
2
rather than using the mainclk_frq property.
3
3
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
Message-id: 20200616170844.13318-4-peter.maydell@linaro.org
6
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Message-id: 20210128114145.20536-23-peter.maydell@linaro.org
9
Message-id: 20210121190622.22000-23-peter.maydell@linaro.org
7
---
10
---
8
target/arm/neon-dp.decode | 3 ++
11
hw/arm/armsse.c | 24 +++++++++++++++++++-----
9
target/arm/translate-neon.inc.c | 74 ++++++++++++++++++++++++++
12
1 file changed, 19 insertions(+), 5 deletions(-)
10
target/arm/translate.c | 92 +--------------------------------
11
3 files changed, 79 insertions(+), 90 deletions(-)
12
13
13
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
14
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/neon-dp.decode
16
--- a/hw/arm/armsse.c
16
+++ b/target/arm/neon-dp.decode
17
+++ b/hw/arm/armsse.c
17
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
18
@@ -XXX,XX +XXX,XX @@ static void armsse_forward_sec_resp_cfg(ARMSSE *s)
18
19
qdev_connect_gpio_out(dev_splitter, 2, s->sec_resp_cfg_in);
19
VPADAL_S 1111 001 11 . 11 .. 00 .... 0 1100 . . 0 .... @2misc
20
VPADAL_U 1111 001 11 . 11 .. 00 .... 0 1101 . . 0 .... @2misc
21
+
22
+ VUZP 1111 001 11 . 11 .. 10 .... 0 0010 . . 0 .... @2misc
23
+ VZIP 1111 001 11 . 11 .. 10 .... 0 0011 . . 0 .... @2misc
24
]
25
26
# Subgroup for size != 0b11
27
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/translate-neon.inc.c
30
+++ b/target/arm/translate-neon.inc.c
31
@@ -XXX,XX +XXX,XX @@ static bool trans_VPADAL_U(DisasContext *s, arg_2misc *a)
32
return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size],
33
accfn[a->size]);
34
}
20
}
35
+
21
36
+typedef void ZipFn(TCGv_ptr, TCGv_ptr);
22
+static void armsse_mainclk_update(void *opaque)
37
+
38
+static bool do_zip_uzp(DisasContext *s, arg_2misc *a,
39
+ ZipFn *fn)
40
+{
23
+{
41
+ TCGv_ptr pd, pm;
24
+ ARMSSE *s = ARM_SSE(opaque);
42
+
25
+ /*
43
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
26
+ * Set system_clock_scale from our Clock input; this is what
44
+ return false;
27
+ * controls the tick rate of the CPU SysTick timer.
45
+ }
28
+ */
46
+
29
+ system_clock_scale = clock_ticks_to_ns(s->mainclk, 1);
47
+ /* UNDEF accesses to D16-D31 if they don't exist. */
48
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
49
+ ((a->vd | a->vm) & 0x10)) {
50
+ return false;
51
+ }
52
+
53
+ if ((a->vd | a->vm) & a->q) {
54
+ return false;
55
+ }
56
+
57
+ if (!fn) {
58
+ /* Bad size or size/q combination */
59
+ return false;
60
+ }
61
+
62
+ if (!vfp_access_check(s)) {
63
+ return true;
64
+ }
65
+
66
+ pd = vfp_reg_ptr(true, a->vd);
67
+ pm = vfp_reg_ptr(true, a->vm);
68
+ fn(pd, pm);
69
+ tcg_temp_free_ptr(pd);
70
+ tcg_temp_free_ptr(pm);
71
+ return true;
72
+}
30
+}
73
+
31
+
74
+static bool trans_VUZP(DisasContext *s, arg_2misc *a)
32
static void armsse_init(Object *obj)
75
+{
33
{
76
+ static ZipFn * const fn[2][4] = {
34
ARMSSE *s = ARM_SSE(obj);
77
+ {
35
@@ -XXX,XX +XXX,XX @@ static void armsse_init(Object *obj)
78
+ gen_helper_neon_unzip8,
36
assert(info->sram_banks <= MAX_SRAM_BANKS);
79
+ gen_helper_neon_unzip16,
37
assert(info->num_cpus <= SSE_MAX_CPUS);
80
+ NULL,
38
81
+ NULL,
39
- s->mainclk = qdev_init_clock_in(DEVICE(s), "MAINCLK", NULL, NULL);
82
+ }, {
40
+ s->mainclk = qdev_init_clock_in(DEVICE(s), "MAINCLK",
83
+ gen_helper_neon_qunzip8,
41
+ armsse_mainclk_update, s);
84
+ gen_helper_neon_qunzip16,
42
s->s32kclk = qdev_init_clock_in(DEVICE(s), "S32KCLK", NULL, NULL);
85
+ gen_helper_neon_qunzip32,
43
86
+ NULL,
44
memory_region_init(&s->container, obj, "armsse-container", UINT64_MAX);
87
+ }
45
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
88
+ };
46
return;
89
+ return do_zip_uzp(s, a, fn[a->q][a->size]);
47
}
90
+}
48
91
+
49
- if (!s->mainclk_frq) {
92
+static bool trans_VZIP(DisasContext *s, arg_2misc *a)
50
- error_setg(errp, "MAINCLK_FRQ property was not set");
93
+{
51
- return;
94
+ static ZipFn * const fn[2][4] = {
52
+ if (!clock_has_source(s->mainclk)) {
95
+ {
53
+ error_setg(errp, "MAINCLK clock was not connected");
96
+ gen_helper_neon_zip8,
54
+ }
97
+ gen_helper_neon_zip16,
55
+ if (!clock_has_source(s->s32kclk)) {
98
+ NULL,
56
+ error_setg(errp, "S32KCLK clock was not connected");
99
+ NULL,
57
}
100
+ }, {
58
101
+ gen_helper_neon_qzip8,
59
assert(info->num_cpus <= SSE_MAX_CPUS);
102
+ gen_helper_neon_qzip16,
60
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
103
+ gen_helper_neon_qzip32,
61
*/
104
+ NULL,
62
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->container);
105
+ }
63
106
+ };
64
- system_clock_scale = NANOSECONDS_PER_SECOND / s->mainclk_frq;
107
+ return do_zip_uzp(s, a, fn[a->q][a->size]);
65
+ /* Set initial system_clock_scale from MAINCLK */
108
+}
66
+ armsse_mainclk_update(s);
109
diff --git a/target/arm/translate.c b/target/arm/translate.c
110
index XXXXXXX..XXXXXXX 100644
111
--- a/target/arm/translate.c
112
+++ b/target/arm/translate.c
113
@@ -XXX,XX +XXX,XX @@ static void gen_exception_return(DisasContext *s, TCGv_i32 pc)
114
gen_rfe(s, pc, load_cpu_field(spsr));
115
}
67
}
116
68
117
-static int gen_neon_unzip(int rd, int rm, int size, int q)
69
static void armsse_idau_check(IDAUInterface *ii, uint32_t address,
118
-{
119
- TCGv_ptr pd, pm;
120
-
121
- if (!q && size == 2) {
122
- return 1;
123
- }
124
- pd = vfp_reg_ptr(true, rd);
125
- pm = vfp_reg_ptr(true, rm);
126
- if (q) {
127
- switch (size) {
128
- case 0:
129
- gen_helper_neon_qunzip8(pd, pm);
130
- break;
131
- case 1:
132
- gen_helper_neon_qunzip16(pd, pm);
133
- break;
134
- case 2:
135
- gen_helper_neon_qunzip32(pd, pm);
136
- break;
137
- default:
138
- abort();
139
- }
140
- } else {
141
- switch (size) {
142
- case 0:
143
- gen_helper_neon_unzip8(pd, pm);
144
- break;
145
- case 1:
146
- gen_helper_neon_unzip16(pd, pm);
147
- break;
148
- default:
149
- abort();
150
- }
151
- }
152
- tcg_temp_free_ptr(pd);
153
- tcg_temp_free_ptr(pm);
154
- return 0;
155
-}
156
-
157
-static int gen_neon_zip(int rd, int rm, int size, int q)
158
-{
159
- TCGv_ptr pd, pm;
160
-
161
- if (!q && size == 2) {
162
- return 1;
163
- }
164
- pd = vfp_reg_ptr(true, rd);
165
- pm = vfp_reg_ptr(true, rm);
166
- if (q) {
167
- switch (size) {
168
- case 0:
169
- gen_helper_neon_qzip8(pd, pm);
170
- break;
171
- case 1:
172
- gen_helper_neon_qzip16(pd, pm);
173
- break;
174
- case 2:
175
- gen_helper_neon_qzip32(pd, pm);
176
- break;
177
- default:
178
- abort();
179
- }
180
- } else {
181
- switch (size) {
182
- case 0:
183
- gen_helper_neon_zip8(pd, pm);
184
- break;
185
- case 1:
186
- gen_helper_neon_zip16(pd, pm);
187
- break;
188
- default:
189
- abort();
190
- }
191
- }
192
- tcg_temp_free_ptr(pd);
193
- tcg_temp_free_ptr(pm);
194
- return 0;
195
-}
196
-
197
static void gen_neon_trn_u8(TCGv_i32 t0, TCGv_i32 t1)
198
{
199
TCGv_i32 rd, tmp;
200
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
201
case NEON_2RM_VREV64:
202
case NEON_2RM_VPADDL: case NEON_2RM_VPADDL_U:
203
case NEON_2RM_VPADAL: case NEON_2RM_VPADAL_U:
204
+ case NEON_2RM_VUZP:
205
+ case NEON_2RM_VZIP:
206
/* handled by decodetree */
207
return 1;
208
case NEON_2RM_VTRN:
209
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
210
goto elementwise;
211
}
212
break;
213
- case NEON_2RM_VUZP:
214
- if (gen_neon_unzip(rd, rm, size, q)) {
215
- return 1;
216
- }
217
- break;
218
- case NEON_2RM_VZIP:
219
- if (gen_neon_zip(rd, rm, size, q)) {
220
- return 1;
221
- }
222
- break;
223
case NEON_2RM_VMOVN: case NEON_2RM_VQMOVN:
224
/* also VQMOVUN; op field and mnemonics don't line up */
225
if (rm & 1) {
226
--
70
--
227
2.20.1
71
2.20.1
228
72
229
73
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
Remove all the code that sets frequency properties on the CMSDK
2
timer, dualtimer and watchdog devices and on the ARMSSE SoC device:
3
these properties are unused now that the devices rely on their Clock
4
inputs instead.
2
5
3
To differenciate with the CMSDK APB peripheral region,
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
rename this region 'CMSDK AHB peripheral region'.
7
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Reviewed-by: Luc Michel <luc@lmichel.fr>
9
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20210128114145.20536-24-peter.maydell@linaro.org
11
Message-id: 20210121190622.22000-24-peter.maydell@linaro.org
12
---
13
hw/arm/armsse.c | 7 -------
14
hw/arm/mps2-tz.c | 1 -
15
hw/arm/mps2.c | 3 ---
16
hw/arm/musca.c | 1 -
17
hw/arm/stellaris.c | 3 ---
18
5 files changed, 15 deletions(-)
5
19
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
20
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
index XXXXXXX..XXXXXXX 100644
8
Message-id: 20200617072539.32686-8-f4bug@amsat.org
22
--- a/hw/arm/armsse.c
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
+++ b/hw/arm/armsse.c
10
---
24
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
11
hw/arm/mps2.c | 3 ++-
25
* it to the appropriate PPC port; then we can realize the PPC and
12
1 file changed, 2 insertions(+), 1 deletion(-)
26
* map its upstream ends to the right place in the container.
13
27
*/
28
- qdev_prop_set_uint32(DEVICE(&s->timer0), "pclk-frq", s->mainclk_frq);
29
qdev_connect_clock_in(DEVICE(&s->timer0), "pclk", s->mainclk);
30
if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer0), errp)) {
31
return;
32
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
33
object_property_set_link(OBJECT(&s->apb_ppc0), "port[0]", OBJECT(mr),
34
&error_abort);
35
36
- qdev_prop_set_uint32(DEVICE(&s->timer1), "pclk-frq", s->mainclk_frq);
37
qdev_connect_clock_in(DEVICE(&s->timer1), "pclk", s->mainclk);
38
if (!sysbus_realize(SYS_BUS_DEVICE(&s->timer1), errp)) {
39
return;
40
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
41
object_property_set_link(OBJECT(&s->apb_ppc0), "port[1]", OBJECT(mr),
42
&error_abort);
43
44
- qdev_prop_set_uint32(DEVICE(&s->dualtimer), "pclk-frq", s->mainclk_frq);
45
qdev_connect_clock_in(DEVICE(&s->dualtimer), "TIMCLK", s->mainclk);
46
if (!sysbus_realize(SYS_BUS_DEVICE(&s->dualtimer), errp)) {
47
return;
48
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
49
/* Devices behind APB PPC1:
50
* 0x4002f000: S32K timer
51
*/
52
- qdev_prop_set_uint32(DEVICE(&s->s32ktimer), "pclk-frq", S32KCLK);
53
qdev_connect_clock_in(DEVICE(&s->s32ktimer), "pclk", s->s32kclk);
54
if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32ktimer), errp)) {
55
return;
56
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
57
qdev_connect_gpio_out(DEVICE(&s->nmi_orgate), 0,
58
qdev_get_gpio_in_named(DEVICE(&s->armv7m), "NMI", 0));
59
60
- qdev_prop_set_uint32(DEVICE(&s->s32kwatchdog), "wdogclk-frq", S32KCLK);
61
qdev_connect_clock_in(DEVICE(&s->s32kwatchdog), "WDOGCLK", s->s32kclk);
62
if (!sysbus_realize(SYS_BUS_DEVICE(&s->s32kwatchdog), errp)) {
63
return;
64
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
65
66
/* 0x40080000 .. 0x4008ffff : ARMSSE second Base peripheral region */
67
68
- qdev_prop_set_uint32(DEVICE(&s->nswatchdog), "wdogclk-frq", s->mainclk_frq);
69
qdev_connect_clock_in(DEVICE(&s->nswatchdog), "WDOGCLK", s->mainclk);
70
if (!sysbus_realize(SYS_BUS_DEVICE(&s->nswatchdog), errp)) {
71
return;
72
@@ -XXX,XX +XXX,XX @@ static void armsse_realize(DeviceState *dev, Error **errp)
73
armsse_get_common_irq_in(s, 1));
74
sysbus_mmio_map(SYS_BUS_DEVICE(&s->nswatchdog), 0, 0x40081000);
75
76
- qdev_prop_set_uint32(DEVICE(&s->swatchdog), "wdogclk-frq", s->mainclk_frq);
77
qdev_connect_clock_in(DEVICE(&s->swatchdog), "WDOGCLK", s->mainclk);
78
if (!sysbus_realize(SYS_BUS_DEVICE(&s->swatchdog), errp)) {
79
return;
80
diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/hw/arm/mps2-tz.c
83
+++ b/hw/arm/mps2-tz.c
84
@@ -XXX,XX +XXX,XX @@ static void mps2tz_common_init(MachineState *machine)
85
object_property_set_link(OBJECT(&mms->iotkit), "memory",
86
OBJECT(system_memory), &error_abort);
87
qdev_prop_set_uint32(iotkitdev, "EXP_NUMIRQ", MPS2TZ_NUMIRQ);
88
- qdev_prop_set_uint32(iotkitdev, "MAINCLK_FRQ", SYSCLK_FRQ);
89
qdev_connect_clock_in(iotkitdev, "MAINCLK", mms->sysclk);
90
qdev_connect_clock_in(iotkitdev, "S32KCLK", mms->s32kclk);
91
sysbus_realize(SYS_BUS_DEVICE(&mms->iotkit), &error_fatal);
14
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
92
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
15
index XXXXXXX..XXXXXXX 100644
93
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/mps2.c
94
--- a/hw/arm/mps2.c
17
+++ b/hw/arm/mps2.c
95
+++ b/hw/arm/mps2.c
18
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
96
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
19
*/
97
object_initialize_child(OBJECT(mms), name, &mms->timer[i],
20
create_unimplemented_device("CMSDK APB peripheral region @0x40000000",
98
TYPE_CMSDK_APB_TIMER);
21
0x40000000, 0x00010000);
99
sbd = SYS_BUS_DEVICE(&mms->timer[i]);
22
- create_unimplemented_device("CMSDK peripheral region @0x40010000",
100
- qdev_prop_set_uint32(DEVICE(&mms->timer[i]), "pclk-frq", SYSCLK_FRQ);
23
+ create_unimplemented_device("CMSDK AHB peripheral region @0x40010000",
101
qdev_connect_clock_in(DEVICE(&mms->timer[i]), "pclk", mms->sysclk);
24
0x40010000, 0x00010000);
102
sysbus_realize_and_unref(sbd, &error_fatal);
25
create_unimplemented_device("Extra peripheral region @0x40020000",
103
sysbus_mmio_map(sbd, 0, base);
26
0x40020000, 0x00010000);
104
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
27
+
105
28
create_unimplemented_device("RESERVED 4", 0x40030000, 0x001D0000);
106
object_initialize_child(OBJECT(mms), "dualtimer", &mms->dualtimer,
29
create_unimplemented_device("VGA", 0x41000000, 0x0200000);
107
TYPE_CMSDK_APB_DUALTIMER);
108
- qdev_prop_set_uint32(DEVICE(&mms->dualtimer), "pclk-frq", SYSCLK_FRQ);
109
qdev_connect_clock_in(DEVICE(&mms->dualtimer), "TIMCLK", mms->sysclk);
110
sysbus_realize(SYS_BUS_DEVICE(&mms->dualtimer), &error_fatal);
111
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->dualtimer), 0,
112
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
113
sysbus_mmio_map(SYS_BUS_DEVICE(&mms->dualtimer), 0, 0x40002000);
114
object_initialize_child(OBJECT(mms), "watchdog", &mms->watchdog,
115
TYPE_CMSDK_APB_WATCHDOG);
116
- qdev_prop_set_uint32(DEVICE(&mms->watchdog), "wdogclk-frq", SYSCLK_FRQ);
117
qdev_connect_clock_in(DEVICE(&mms->watchdog), "WDOGCLK", mms->sysclk);
118
sysbus_realize(SYS_BUS_DEVICE(&mms->watchdog), &error_fatal);
119
sysbus_connect_irq(SYS_BUS_DEVICE(&mms->watchdog), 0,
120
diff --git a/hw/arm/musca.c b/hw/arm/musca.c
121
index XXXXXXX..XXXXXXX 100644
122
--- a/hw/arm/musca.c
123
+++ b/hw/arm/musca.c
124
@@ -XXX,XX +XXX,XX @@ static void musca_init(MachineState *machine)
125
qdev_prop_set_uint32(ssedev, "EXP_NUMIRQ", mmc->num_irqs);
126
qdev_prop_set_uint32(ssedev, "init-svtor", mmc->init_svtor);
127
qdev_prop_set_uint32(ssedev, "SRAM_ADDR_WIDTH", mmc->sram_addr_width);
128
- qdev_prop_set_uint32(ssedev, "MAINCLK_FRQ", SYSCLK_FRQ);
129
qdev_connect_clock_in(ssedev, "MAINCLK", mms->sysclk);
130
qdev_connect_clock_in(ssedev, "S32KCLK", mms->s32kclk);
131
/*
132
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
133
index XXXXXXX..XXXXXXX 100644
134
--- a/hw/arm/stellaris.c
135
+++ b/hw/arm/stellaris.c
136
@@ -XXX,XX +XXX,XX @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board)
137
if (board->dc1 & (1 << 3)) { /* watchdog present */
138
dev = qdev_new(TYPE_LUMINARY_WATCHDOG);
139
140
- /* system_clock_scale is valid now */
141
- uint32_t mainclk = NANOSECONDS_PER_SECOND / system_clock_scale;
142
- qdev_prop_set_uint32(dev, "wdogclk-frq", mainclk);
143
qdev_connect_clock_in(dev, "WDOGCLK",
144
qdev_get_clock_out(ssys_dev, "SYSCLK"));
30
145
31
--
146
--
32
2.20.1
147
2.20.1
33
148
34
149
diff view generated by jsdifflib
1
Convert the pairwise ops VPADDL and VPADAL in the 2-reg-misc grouping
1
Now no users are setting the frq properties on the CMSDK timer,
2
to decodetree.
2
dualtimer, watchdog or ARMSSE SoC devices, we can remove the
3
3
properties and the struct fields that back them.
4
At this point we can get rid of the weird CPU_V001 #define that was
5
used to avoid having to explicitly list all the arguments being
6
passed to some TCG gen/helper functions.
7
4
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20200616170844.13318-3-peter.maydell@linaro.org
7
Reviewed-by: Luc Michel <luc@lmichel.fr>
8
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20210128114145.20536-25-peter.maydell@linaro.org
10
Message-id: 20210121190622.22000-25-peter.maydell@linaro.org
11
---
11
---
12
target/arm/neon-dp.decode | 6 ++
12
include/hw/arm/armsse.h | 2 --
13
target/arm/translate-neon.inc.c | 149 ++++++++++++++++++++++++++++++++
13
include/hw/timer/cmsdk-apb-dualtimer.h | 2 --
14
target/arm/translate.c | 35 +-------
14
include/hw/timer/cmsdk-apb-timer.h | 2 --
15
3 files changed, 157 insertions(+), 33 deletions(-)
15
include/hw/watchdog/cmsdk-apb-watchdog.h | 2 --
16
hw/arm/armsse.c | 2 --
17
hw/timer/cmsdk-apb-dualtimer.c | 6 ------
18
hw/timer/cmsdk-apb-timer.c | 6 ------
19
hw/watchdog/cmsdk-apb-watchdog.c | 6 ------
20
8 files changed, 28 deletions(-)
16
21
17
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
22
diff --git a/include/hw/arm/armsse.h b/include/hw/arm/armsse.h
18
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/neon-dp.decode
24
--- a/include/hw/arm/armsse.h
20
+++ b/target/arm/neon-dp.decode
25
+++ b/include/hw/arm/armsse.h
21
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
26
@@ -XXX,XX +XXX,XX @@
22
&2misc vm=%vm_dp vd=%vd_dp
27
* + Clock input "S32KCLK": slow 32KHz clock used for a few peripherals
23
28
* + QOM property "memory" is a MemoryRegion containing the devices provided
24
VREV64 1111 001 11 . 11 .. 00 .... 0 0000 . . 0 .... @2misc
29
* by the board model.
25
+
30
- * + QOM property "MAINCLK_FRQ" is the frequency of the main system clock
26
+ VPADDL_S 1111 001 11 . 11 .. 00 .... 0 0100 . . 0 .... @2misc
31
* + QOM property "EXP_NUMIRQ" sets the number of expansion interrupts.
27
+ VPADDL_U 1111 001 11 . 11 .. 00 .... 0 0101 . . 0 .... @2misc
32
* (In hardware, the SSE-200 permits the number of expansion interrupts
28
+
33
* for the two CPUs to be configured separately, but we restrict it to
29
+ VPADAL_S 1111 001 11 . 11 .. 00 .... 0 1100 . . 0 .... @2misc
34
@@ -XXX,XX +XXX,XX @@ struct ARMSSE {
30
+ VPADAL_U 1111 001 11 . 11 .. 00 .... 0 1101 . . 0 .... @2misc
35
/* Properties */
31
]
36
MemoryRegion *board_memory;
32
37
uint32_t exp_numirq;
33
# Subgroup for size != 0b11
38
- uint32_t mainclk_frq;
34
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
39
uint32_t sram_addr_width;
40
uint32_t init_svtor;
41
bool cpu_fpu[SSE_MAX_CPUS];
42
diff --git a/include/hw/timer/cmsdk-apb-dualtimer.h b/include/hw/timer/cmsdk-apb-dualtimer.h
35
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/translate-neon.inc.c
44
--- a/include/hw/timer/cmsdk-apb-dualtimer.h
37
+++ b/target/arm/translate-neon.inc.c
45
+++ b/include/hw/timer/cmsdk-apb-dualtimer.h
38
@@ -XXX,XX +XXX,XX @@ static bool trans_VREV64(DisasContext *s, arg_VREV64 *a)
46
@@ -XXX,XX +XXX,XX @@
47
* https://developer.arm.com/products/system-design/system-design-kits/cortex-m-system-design-kit
48
*
49
* QEMU interface:
50
- * + QOM property "pclk-frq": frequency at which the timer is clocked
51
* + Clock input "TIMCLK": clock (for both timers)
52
* + sysbus MMIO region 0: the register bank
53
* + sysbus IRQ 0: combined timer interrupt TIMINTC
54
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBDualTimer {
55
/*< public >*/
56
MemoryRegion iomem;
57
qemu_irq timerintc;
58
- uint32_t pclk_frq;
59
Clock *timclk;
60
61
CMSDKAPBDualTimerModule timermod[CMSDK_APB_DUALTIMER_NUM_MODULES];
62
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
63
index XXXXXXX..XXXXXXX 100644
64
--- a/include/hw/timer/cmsdk-apb-timer.h
65
+++ b/include/hw/timer/cmsdk-apb-timer.h
66
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(CMSDKAPBTimer, CMSDK_APB_TIMER)
67
68
/*
69
* QEMU interface:
70
- * + QOM property "pclk-frq": frequency at which the timer is clocked
71
* + Clock input "pclk": clock for the timer
72
* + sysbus MMIO region 0: the register bank
73
* + sysbus IRQ 0: timer interrupt TIMERINT
74
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBTimer {
75
/*< public >*/
76
MemoryRegion iomem;
77
qemu_irq timerint;
78
- uint32_t pclk_frq;
79
struct ptimer_state *timer;
80
Clock *pclk;
81
82
diff --git a/include/hw/watchdog/cmsdk-apb-watchdog.h b/include/hw/watchdog/cmsdk-apb-watchdog.h
83
index XXXXXXX..XXXXXXX 100644
84
--- a/include/hw/watchdog/cmsdk-apb-watchdog.h
85
+++ b/include/hw/watchdog/cmsdk-apb-watchdog.h
86
@@ -XXX,XX +XXX,XX @@
87
* https://developer.arm.com/products/system-design/system-design-kits/cortex-m-system-design-kit
88
*
89
* QEMU interface:
90
- * + QOM property "wdogclk-frq": frequency at which the watchdog is clocked
91
* + Clock input "WDOGCLK": clock for the watchdog's timer
92
* + sysbus MMIO region 0: the register bank
93
* + sysbus IRQ 0: watchdog interrupt
94
@@ -XXX,XX +XXX,XX @@ struct CMSDKAPBWatchdog {
95
/*< public >*/
96
MemoryRegion iomem;
97
qemu_irq wdogint;
98
- uint32_t wdogclk_frq;
99
bool is_luminary;
100
struct ptimer_state *timer;
101
Clock *wdogclk;
102
diff --git a/hw/arm/armsse.c b/hw/arm/armsse.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/hw/arm/armsse.c
105
+++ b/hw/arm/armsse.c
106
@@ -XXX,XX +XXX,XX @@ static Property iotkit_properties[] = {
107
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
108
MemoryRegion *),
109
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
110
- DEFINE_PROP_UINT32("MAINCLK_FRQ", ARMSSE, mainclk_frq, 0),
111
DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
112
DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
113
DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], true),
114
@@ -XXX,XX +XXX,XX @@ static Property armsse_properties[] = {
115
DEFINE_PROP_LINK("memory", ARMSSE, board_memory, TYPE_MEMORY_REGION,
116
MemoryRegion *),
117
DEFINE_PROP_UINT32("EXP_NUMIRQ", ARMSSE, exp_numirq, 64),
118
- DEFINE_PROP_UINT32("MAINCLK_FRQ", ARMSSE, mainclk_frq, 0),
119
DEFINE_PROP_UINT32("SRAM_ADDR_WIDTH", ARMSSE, sram_addr_width, 15),
120
DEFINE_PROP_UINT32("init-svtor", ARMSSE, init_svtor, 0x10000000),
121
DEFINE_PROP_BOOL("CPU0_FPU", ARMSSE, cpu_fpu[0], false),
122
diff --git a/hw/timer/cmsdk-apb-dualtimer.c b/hw/timer/cmsdk-apb-dualtimer.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/hw/timer/cmsdk-apb-dualtimer.c
125
+++ b/hw/timer/cmsdk-apb-dualtimer.c
126
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_apb_dualtimer_vmstate = {
39
}
127
}
40
return true;
128
};
129
130
-static Property cmsdk_apb_dualtimer_properties[] = {
131
- DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBDualTimer, pclk_frq, 0),
132
- DEFINE_PROP_END_OF_LIST(),
133
-};
134
-
135
static void cmsdk_apb_dualtimer_class_init(ObjectClass *klass, void *data)
136
{
137
DeviceClass *dc = DEVICE_CLASS(klass);
138
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_dualtimer_class_init(ObjectClass *klass, void *data)
139
dc->realize = cmsdk_apb_dualtimer_realize;
140
dc->vmsd = &cmsdk_apb_dualtimer_vmstate;
141
dc->reset = cmsdk_apb_dualtimer_reset;
142
- device_class_set_props(dc, cmsdk_apb_dualtimer_properties);
41
}
143
}
42
+
144
43
+static bool do_2misc_pairwise(DisasContext *s, arg_2misc *a,
145
static const TypeInfo cmsdk_apb_dualtimer_info = {
44
+ NeonGenWidenFn *widenfn,
146
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
45
+ NeonGenTwo64OpFn *opfn,
46
+ NeonGenTwo64OpFn *accfn)
47
+{
48
+ /*
49
+ * Pairwise long operations: widen both halves of the pair,
50
+ * combine the pairs with the opfn, and then possibly accumulate
51
+ * into the destination with the accfn.
52
+ */
53
+ int pass;
54
+
55
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
56
+ return false;
57
+ }
58
+
59
+ /* UNDEF accesses to D16-D31 if they don't exist. */
60
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
61
+ ((a->vd | a->vm) & 0x10)) {
62
+ return false;
63
+ }
64
+
65
+ if ((a->vd | a->vm) & a->q) {
66
+ return false;
67
+ }
68
+
69
+ if (!widenfn) {
70
+ return false;
71
+ }
72
+
73
+ if (!vfp_access_check(s)) {
74
+ return true;
75
+ }
76
+
77
+ for (pass = 0; pass < a->q + 1; pass++) {
78
+ TCGv_i32 tmp;
79
+ TCGv_i64 rm0_64, rm1_64, rd_64;
80
+
81
+ rm0_64 = tcg_temp_new_i64();
82
+ rm1_64 = tcg_temp_new_i64();
83
+ rd_64 = tcg_temp_new_i64();
84
+ tmp = neon_load_reg(a->vm, pass * 2);
85
+ widenfn(rm0_64, tmp);
86
+ tcg_temp_free_i32(tmp);
87
+ tmp = neon_load_reg(a->vm, pass * 2 + 1);
88
+ widenfn(rm1_64, tmp);
89
+ tcg_temp_free_i32(tmp);
90
+ opfn(rd_64, rm0_64, rm1_64);
91
+ tcg_temp_free_i64(rm0_64);
92
+ tcg_temp_free_i64(rm1_64);
93
+
94
+ if (accfn) {
95
+ TCGv_i64 tmp64 = tcg_temp_new_i64();
96
+ neon_load_reg64(tmp64, a->vd + pass);
97
+ accfn(rd_64, tmp64, rd_64);
98
+ tcg_temp_free_i64(tmp64);
99
+ }
100
+ neon_store_reg64(rd_64, a->vd + pass);
101
+ tcg_temp_free_i64(rd_64);
102
+ }
103
+ return true;
104
+}
105
+
106
+static bool trans_VPADDL_S(DisasContext *s, arg_2misc *a)
107
+{
108
+ static NeonGenWidenFn * const widenfn[] = {
109
+ gen_helper_neon_widen_s8,
110
+ gen_helper_neon_widen_s16,
111
+ tcg_gen_ext_i32_i64,
112
+ NULL,
113
+ };
114
+ static NeonGenTwo64OpFn * const opfn[] = {
115
+ gen_helper_neon_paddl_u16,
116
+ gen_helper_neon_paddl_u32,
117
+ tcg_gen_add_i64,
118
+ NULL,
119
+ };
120
+
121
+ return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size], NULL);
122
+}
123
+
124
+static bool trans_VPADDL_U(DisasContext *s, arg_2misc *a)
125
+{
126
+ static NeonGenWidenFn * const widenfn[] = {
127
+ gen_helper_neon_widen_u8,
128
+ gen_helper_neon_widen_u16,
129
+ tcg_gen_extu_i32_i64,
130
+ NULL,
131
+ };
132
+ static NeonGenTwo64OpFn * const opfn[] = {
133
+ gen_helper_neon_paddl_u16,
134
+ gen_helper_neon_paddl_u32,
135
+ tcg_gen_add_i64,
136
+ NULL,
137
+ };
138
+
139
+ return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size], NULL);
140
+}
141
+
142
+static bool trans_VPADAL_S(DisasContext *s, arg_2misc *a)
143
+{
144
+ static NeonGenWidenFn * const widenfn[] = {
145
+ gen_helper_neon_widen_s8,
146
+ gen_helper_neon_widen_s16,
147
+ tcg_gen_ext_i32_i64,
148
+ NULL,
149
+ };
150
+ static NeonGenTwo64OpFn * const opfn[] = {
151
+ gen_helper_neon_paddl_u16,
152
+ gen_helper_neon_paddl_u32,
153
+ tcg_gen_add_i64,
154
+ NULL,
155
+ };
156
+ static NeonGenTwo64OpFn * const accfn[] = {
157
+ gen_helper_neon_addl_u16,
158
+ gen_helper_neon_addl_u32,
159
+ tcg_gen_add_i64,
160
+ NULL,
161
+ };
162
+
163
+ return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size],
164
+ accfn[a->size]);
165
+}
166
+
167
+static bool trans_VPADAL_U(DisasContext *s, arg_2misc *a)
168
+{
169
+ static NeonGenWidenFn * const widenfn[] = {
170
+ gen_helper_neon_widen_u8,
171
+ gen_helper_neon_widen_u16,
172
+ tcg_gen_extu_i32_i64,
173
+ NULL,
174
+ };
175
+ static NeonGenTwo64OpFn * const opfn[] = {
176
+ gen_helper_neon_paddl_u16,
177
+ gen_helper_neon_paddl_u32,
178
+ tcg_gen_add_i64,
179
+ NULL,
180
+ };
181
+ static NeonGenTwo64OpFn * const accfn[] = {
182
+ gen_helper_neon_addl_u16,
183
+ gen_helper_neon_addl_u32,
184
+ tcg_gen_add_i64,
185
+ NULL,
186
+ };
187
+
188
+ return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size],
189
+ accfn[a->size]);
190
+}
191
diff --git a/target/arm/translate.c b/target/arm/translate.c
192
index XXXXXXX..XXXXXXX 100644
147
index XXXXXXX..XXXXXXX 100644
193
--- a/target/arm/translate.c
148
--- a/hw/timer/cmsdk-apb-timer.c
194
+++ b/target/arm/translate.c
149
+++ b/hw/timer/cmsdk-apb-timer.c
195
@@ -XXX,XX +XXX,XX @@ static void gen_exception_return(DisasContext *s, TCGv_i32 pc)
150
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_apb_timer_vmstate = {
196
gen_rfe(s, pc, load_cpu_field(spsr));
151
}
152
};
153
154
-static Property cmsdk_apb_timer_properties[] = {
155
- DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBTimer, pclk_frq, 0),
156
- DEFINE_PROP_END_OF_LIST(),
157
-};
158
-
159
static void cmsdk_apb_timer_class_init(ObjectClass *klass, void *data)
160
{
161
DeviceClass *dc = DEVICE_CLASS(klass);
162
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_timer_class_init(ObjectClass *klass, void *data)
163
dc->realize = cmsdk_apb_timer_realize;
164
dc->vmsd = &cmsdk_apb_timer_vmstate;
165
dc->reset = cmsdk_apb_timer_reset;
166
- device_class_set_props(dc, cmsdk_apb_timer_properties);
197
}
167
}
198
168
199
-#define CPU_V001 cpu_V0, cpu_V0, cpu_V1
169
static const TypeInfo cmsdk_apb_timer_info = {
170
diff --git a/hw/watchdog/cmsdk-apb-watchdog.c b/hw/watchdog/cmsdk-apb-watchdog.c
171
index XXXXXXX..XXXXXXX 100644
172
--- a/hw/watchdog/cmsdk-apb-watchdog.c
173
+++ b/hw/watchdog/cmsdk-apb-watchdog.c
174
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription cmsdk_apb_watchdog_vmstate = {
175
}
176
};
177
178
-static Property cmsdk_apb_watchdog_properties[] = {
179
- DEFINE_PROP_UINT32("wdogclk-frq", CMSDKAPBWatchdog, wdogclk_frq, 0),
180
- DEFINE_PROP_END_OF_LIST(),
181
-};
200
-
182
-
201
static int gen_neon_unzip(int rd, int rm, int size, int q)
183
static void cmsdk_apb_watchdog_class_init(ObjectClass *klass, void *data)
202
{
184
{
203
TCGv_ptr pd, pm;
185
DeviceClass *dc = DEVICE_CLASS(klass);
204
@@ -XXX,XX +XXX,XX @@ static inline void gen_neon_widen(TCGv_i64 dest, TCGv_i32 src, int size, int u)
186
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_watchdog_class_init(ObjectClass *klass, void *data)
205
tcg_temp_free_i32(src);
187
dc->realize = cmsdk_apb_watchdog_realize;
188
dc->vmsd = &cmsdk_apb_watchdog_vmstate;
189
dc->reset = cmsdk_apb_watchdog_reset;
190
- device_class_set_props(dc, cmsdk_apb_watchdog_properties);
206
}
191
}
207
192
208
-static inline void gen_neon_addl(int size)
193
static const TypeInfo cmsdk_apb_watchdog_info = {
209
-{
210
- switch (size) {
211
- case 0: gen_helper_neon_addl_u16(CPU_V001); break;
212
- case 1: gen_helper_neon_addl_u32(CPU_V001); break;
213
- case 2: tcg_gen_add_i64(CPU_V001); break;
214
- default: abort();
215
- }
216
-}
217
-
218
static void gen_neon_narrow_op(int op, int u, int size,
219
TCGv_i32 dest, TCGv_i64 src)
220
{
221
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
222
}
223
switch (op) {
224
case NEON_2RM_VREV64:
225
- /* handled by decodetree */
226
- return 1;
227
case NEON_2RM_VPADDL: case NEON_2RM_VPADDL_U:
228
case NEON_2RM_VPADAL: case NEON_2RM_VPADAL_U:
229
- for (pass = 0; pass < q + 1; pass++) {
230
- tmp = neon_load_reg(rm, pass * 2);
231
- gen_neon_widen(cpu_V0, tmp, size, op & 1);
232
- tmp = neon_load_reg(rm, pass * 2 + 1);
233
- gen_neon_widen(cpu_V1, tmp, size, op & 1);
234
- switch (size) {
235
- case 0: gen_helper_neon_paddl_u16(CPU_V001); break;
236
- case 1: gen_helper_neon_paddl_u32(CPU_V001); break;
237
- case 2: tcg_gen_add_i64(CPU_V001); break;
238
- default: abort();
239
- }
240
- if (op >= NEON_2RM_VPADAL) {
241
- /* Accumulate. */
242
- neon_load_reg64(cpu_V1, rd + pass);
243
- gen_neon_addl(size);
244
- }
245
- neon_store_reg64(cpu_V0, rd + pass);
246
- }
247
- break;
248
+ /* handled by decodetree */
249
+ return 1;
250
case NEON_2RM_VTRN:
251
if (size == 2) {
252
int n;
253
--
194
--
254
2.20.1
195
2.20.1
255
196
256
197
diff view generated by jsdifflib
1
Convert the VSHLL insn in the 2-reg-misc Neon group to decodetree.
1
Now that the watchdog device uses its Clock input rather than being
2
passed the value of system_clock_scale at creation time, we can
3
remove the hack where we reset the STELLARIS_SYS at board creation
4
time to force it to set system_clock_scale. Instead it will be reset
5
at the usual point in startup and will inform the watchdog of the
6
clock frequency at that point.
2
7
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Luc Michel <luc@lmichel.fr>
5
Message-id: 20200616170844.13318-6-peter.maydell@linaro.org
10
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 20210128114145.20536-26-peter.maydell@linaro.org
13
Message-id: 20210121190622.22000-26-peter.maydell@linaro.org
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
6
---
15
---
7
target/arm/neon-dp.decode | 2 ++
16
hw/arm/stellaris.c | 10 ----------
8
target/arm/translate-neon.inc.c | 52 +++++++++++++++++++++++++++++++++
17
1 file changed, 10 deletions(-)
9
target/arm/translate.c | 35 +---------------------
10
3 files changed, 55 insertions(+), 34 deletions(-)
11
18
12
diff --git a/target/arm/neon-dp.decode b/target/arm/neon-dp.decode
19
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
13
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/neon-dp.decode
21
--- a/hw/arm/stellaris.c
15
+++ b/target/arm/neon-dp.decode
22
+++ b/hw/arm/stellaris.c
16
@@ -XXX,XX +XXX,XX @@ Vimm_1r 1111 001 . 1 . 000 ... .... cmode:4 0 . op:1 1 .... @1reg_imm
23
@@ -XXX,XX +XXX,XX @@ static DeviceState *stellaris_sys_init(uint32_t base, qemu_irq irq,
17
# VQMOVN: signed result, source may be signed (_S) or unsigned (_U)
24
sysbus_mmio_map(sbd, 0, base);
18
VQMOVN_S 1111 001 11 . 11 .. 10 .... 0 0101 0 . 0 .... @2misc_q0
25
sysbus_connect_irq(sbd, 0, irq);
19
VQMOVN_U 1111 001 11 . 11 .. 10 .... 0 0101 1 . 0 .... @2misc_q0
26
20
+
27
- /*
21
+ VSHLL 1111 001 11 . 11 .. 10 .... 0 0110 0 . 0 .... @2misc_q0
28
- * Normally we should not be resetting devices like this during
22
]
29
- * board creation. For the moment we need to do so, because
23
30
- * system_clock_scale will only get set when the STELLARIS_SYS
24
# Subgroup for size != 0b11
31
- * device is reset, and we need its initial value to pass to
25
diff --git a/target/arm/translate-neon.inc.c b/target/arm/translate-neon.inc.c
32
- * the watchdog device. This hack can be removed once the
26
index XXXXXXX..XXXXXXX 100644
33
- * watchdog has been converted to use a Clock input instead.
27
--- a/target/arm/translate-neon.inc.c
34
- */
28
+++ b/target/arm/translate-neon.inc.c
35
- device_cold_reset(dev);
29
@@ -XXX,XX +XXX,XX @@ DO_VMOVN(VMOVN, gen_neon_narrow_u)
36
-
30
DO_VMOVN(VQMOVUN, gen_helper_neon_unarrow_sat)
37
return dev;
31
DO_VMOVN(VQMOVN_S, gen_helper_neon_narrow_sat_s)
32
DO_VMOVN(VQMOVN_U, gen_helper_neon_narrow_sat_u)
33
+
34
+static bool trans_VSHLL(DisasContext *s, arg_2misc *a)
35
+{
36
+ TCGv_i32 rm0, rm1;
37
+ TCGv_i64 rd;
38
+ static NeonGenWidenFn * const widenfns[] = {
39
+ gen_helper_neon_widen_u8,
40
+ gen_helper_neon_widen_u16,
41
+ tcg_gen_extu_i32_i64,
42
+ NULL,
43
+ };
44
+ NeonGenWidenFn *widenfn = widenfns[a->size];
45
+
46
+ if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
47
+ return false;
48
+ }
49
+
50
+ /* UNDEF accesses to D16-D31 if they don't exist. */
51
+ if (!dc_isar_feature(aa32_simd_r32, s) &&
52
+ ((a->vd | a->vm) & 0x10)) {
53
+ return false;
54
+ }
55
+
56
+ if (a->vd & 1) {
57
+ return false;
58
+ }
59
+
60
+ if (!widenfn) {
61
+ return false;
62
+ }
63
+
64
+ if (!vfp_access_check(s)) {
65
+ return true;
66
+ }
67
+
68
+ rd = tcg_temp_new_i64();
69
+
70
+ rm0 = neon_load_reg(a->vm, 0);
71
+ rm1 = neon_load_reg(a->vm, 1);
72
+
73
+ widenfn(rd, rm0);
74
+ tcg_gen_shli_i64(rd, rd, 8 << a->size);
75
+ neon_store_reg64(rd, a->vd);
76
+ widenfn(rd, rm1);
77
+ tcg_gen_shli_i64(rd, rd, 8 << a->size);
78
+ neon_store_reg64(rd, a->vd + 1);
79
+
80
+ tcg_temp_free_i64(rd);
81
+ tcg_temp_free_i32(rm0);
82
+ tcg_temp_free_i32(rm1);
83
+ return true;
84
+}
85
diff --git a/target/arm/translate.c b/target/arm/translate.c
86
index XXXXXXX..XXXXXXX 100644
87
--- a/target/arm/translate.c
88
+++ b/target/arm/translate.c
89
@@ -XXX,XX +XXX,XX @@ static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1)
90
tcg_temp_free_i32(rd);
91
}
38
}
92
39
93
-static inline void gen_neon_widen(TCGv_i64 dest, TCGv_i32 src, int size, int u)
94
-{
95
- if (u) {
96
- switch (size) {
97
- case 0: gen_helper_neon_widen_u8(dest, src); break;
98
- case 1: gen_helper_neon_widen_u16(dest, src); break;
99
- case 2: tcg_gen_extu_i32_i64(dest, src); break;
100
- default: abort();
101
- }
102
- } else {
103
- switch (size) {
104
- case 0: gen_helper_neon_widen_s8(dest, src); break;
105
- case 1: gen_helper_neon_widen_s16(dest, src); break;
106
- case 2: tcg_gen_ext_i32_i64(dest, src); break;
107
- default: abort();
108
- }
109
- }
110
- tcg_temp_free_i32(src);
111
-}
112
-
113
/* Symbolic constants for op fields for Neon 2-register miscellaneous.
114
* The values correspond to bits [17:16,10:7]; see the ARM ARM DDI0406B
115
* table A7-13.
116
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
117
case NEON_2RM_VUZP:
118
case NEON_2RM_VZIP:
119
case NEON_2RM_VMOVN: case NEON_2RM_VQMOVN:
120
+ case NEON_2RM_VSHLL:
121
/* handled by decodetree */
122
return 1;
123
case NEON_2RM_VTRN:
124
@@ -XXX,XX +XXX,XX @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
125
goto elementwise;
126
}
127
break;
128
- case NEON_2RM_VSHLL:
129
- if (q || (rd & 1)) {
130
- return 1;
131
- }
132
- tmp = neon_load_reg(rm, 0);
133
- tmp2 = neon_load_reg(rm, 1);
134
- for (pass = 0; pass < 2; pass++) {
135
- if (pass == 1)
136
- tmp = tmp2;
137
- gen_neon_widen(cpu_V0, tmp, size, 1);
138
- tcg_gen_shli_i64(cpu_V0, cpu_V0, 8 << size);
139
- neon_store_reg64(cpu_V0, rd + pass);
140
- }
141
- break;
142
case NEON_2RM_VCVT_F16_F32:
143
{
144
TCGv_ptr fpst;
145
--
40
--
146
2.20.1
41
2.20.1
147
42
148
43
diff view generated by jsdifflib