1
This is mostly RTH's tcg_constant refactoring work, plus a few
1
target-arm queue: mostly aspeed changes from Cédric.
2
other things.
3
2
4
thanks
3
thanks
5
-- PMM
4
-- PMM
6
5
7
The following changes since commit cf6f26d6f9b2015ee12b4604b79359e76784163a:
6
The following changes since commit 85182c96de61f0b600bbe834d5a23e713162e892:
8
7
9
Merge tag 'kraxel-20220427-pull-request' of git://git.kraxel.org/qemu into staging (2022-04-27 10:49:28 -0700)
8
Merge remote-tracking branch 'remotes/dgilbert/tags/pull-migration-20190912a' into staging (2019-09-13 14:37:48 +0100)
10
9
11
are available in the Git repository at:
10
are available in the Git repository at:
12
11
13
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220428
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20190913
14
13
15
for you to fetch changes up to f8e7163d9e6740b5cef02bf73a17a59d0bef8bdb:
14
for you to fetch changes up to 27a296fce9821e3608d537756cffa6e43a46df3b:
16
15
17
hw/arm/smmuv3: Advertise support for SMMUv3.2-BBML2 (2022-04-28 13:59:23 +0100)
16
qemu-ga: Convert invocation documentation to rST (2019-09-13 16:05:01 +0100)
18
17
19
----------------------------------------------------------------
18
----------------------------------------------------------------
20
target-arm queue:
19
target-arm queue:
21
* refactor to use tcg_constant where appropriate
20
* aspeed: add a GPIO controller to the SoC
22
* Advertise support for FEAT_TTL and FEAT_BBM level 2
21
* aspeed: Various refactorings
23
* smmuv3: Cache event fault record
22
* aspeed: Improve DMA controller modelling
24
* smmuv3: Add space in guest error message
23
* atomic_template: fix indentation in GEN_ATOMIC_HELPER
25
* smmuv3: Advertise support for SMMUv3.2-BBML2
24
* qemu-ga: Convert invocation documentation to rST
26
25
27
----------------------------------------------------------------
26
----------------------------------------------------------------
28
Damien Hedde (1):
27
Christian Svensson (1):
29
target/arm: Disable cryptographic instructions when neon is disabled
28
aspeed/smc: Calculate checksum on normal DMA
30
29
31
Jean-Philippe Brucker (2):
30
Cédric Le Goater (7):
32
hw/arm/smmuv3: Cache event fault record
31
aspeed: Remove unused SoC definitions
33
hw/arm/smmuv3: Add space in guest error message
32
aspeed: Use consistent typenames
33
aspeed/smc: Add support for DMAs
34
aspeed/smc: Add DMA calibration settings
35
aspeed/smc: Inject errors in DMA checksum
36
aspeed/scu: Introduce per-SoC SCU types
37
aspeed/scu: Introduce a aspeed_scu_get_apb_freq() routine
34
38
35
Peter Maydell (3):
39
Emilio G. Cota (1):
36
target/arm: Advertise support for FEAT_TTL
40
atomic_template: fix indentation in GEN_ATOMIC_HELPER
37
target/arm: Advertise support for FEAT_BBM level 2
38
hw/arm/smmuv3: Advertise support for SMMUv3.2-BBML2
39
41
40
Richard Henderson (48):
42
Peter Maydell (1):
41
target/arm: Use tcg_constant in gen_probe_access
43
qemu-ga: Convert invocation documentation to rST
42
target/arm: Use tcg_constant in gen_mte_check*
43
target/arm: Use tcg_constant in gen_exception*
44
target/arm: Use tcg_constant in gen_adc_CC
45
target/arm: Use tcg_constant in handle_msr_i
46
target/arm: Use tcg_constant in handle_sys
47
target/arm: Use tcg_constant in disas_exc
48
target/arm: Use tcg_constant in gen_compare_and_swap_pair
49
target/arm: Use tcg_constant in disas_ld_lit
50
target/arm: Use tcg_constant in disas_ldst_*
51
target/arm: Use tcg_constant in disas_add_sum_imm*
52
target/arm: Use tcg_constant in disas_movw_imm
53
target/arm: Use tcg_constant in shift_reg_imm
54
target/arm: Use tcg_constant in disas_cond_select
55
target/arm: Use tcg_constant in handle_{rev16,crc32}
56
target/arm: Use tcg_constant in disas_data_proc_2src
57
target/arm: Use tcg_constant in disas_fp*
58
target/arm: Use tcg_constant in simd shift expanders
59
target/arm: Use tcg_constant in simd fp/int conversion
60
target/arm: Use tcg_constant in 2misc expanders
61
target/arm: Use tcg_constant in balance of translate-a64.c
62
target/arm: Use tcg_constant for aa32 exceptions
63
target/arm: Use tcg_constant for disas_iwmmxt_insn
64
target/arm: Use tcg_constant for gen_{msr,mrs}
65
target/arm: Use tcg_constant for vector shift expanders
66
target/arm: Use tcg_constant for do_coproc_insn
67
target/arm: Use tcg_constant for gen_srs
68
target/arm: Use tcg_constant for op_s_{rri,rxi}_rot
69
target/arm: Use tcg_constant for MOVW, UMAAL, CRC32
70
target/arm: Use tcg_constant for v7m MRS, MSR
71
target/arm: Use tcg_constant for TT, SAT, SMMLA
72
target/arm: Use tcg_constant in LDM, STM
73
target/arm: Use tcg_constant in CLRM, DLS, WLS, LE
74
target/arm: Use tcg_constant in trans_CPS_v7m
75
target/arm: Use tcg_constant in trans_CSEL
76
target/arm: Use tcg_constant for trans_INDEX_*
77
target/arm: Use tcg_constant in SINCDEC, INCDEC
78
target/arm: Use tcg_constant in FCPY, CPY
79
target/arm: Use tcg_constant in {incr, wrap}_last_active
80
target/arm: Use tcg_constant in do_clast_scalar
81
target/arm: Use tcg_constant in WHILE
82
target/arm: Use tcg_constant in LD1, ST1
83
target/arm: Use tcg_constant in SUBR
84
target/arm: Use tcg_constant in do_zzi_{sat, ool}, do_fp_imm
85
target/arm: Use tcg_constant for predicate descriptors
86
target/arm: Use tcg_constant for do_brk{2,3}
87
target/arm: Use tcg_constant for vector descriptor
88
target/arm: Use field names for accessing DBGWCRn
89
44
90
docs/system/arm/emulation.rst | 2 +
45
Rashmica Gupta (2):
91
hw/arm/smmuv3-internal.h | 2 +-
46
hw/gpio: Add basic Aspeed GPIO model for AST2400 and AST2500
92
include/hw/arm/smmu-common.h | 1 +
47
aspeed: add a GPIO controller to the SoC
93
target/arm/internals.h | 12 ++
48
94
hw/arm/smmuv3.c | 17 +--
49
Makefile | 24 +-
95
target/arm/cpu.c | 9 ++
50
hw/gpio/Makefile.objs | 1 +
96
target/arm/cpu64.c | 2 +
51
accel/tcg/atomic_template.h | 2 +-
97
target/arm/debug_helper.c | 10 +-
52
include/hw/arm/aspeed_soc.h | 4 +-
98
target/arm/helper.c | 8 +-
53
include/hw/gpio/aspeed_gpio.h | 100 +++++
99
target/arm/kvm64.c | 14 +-
54
include/hw/misc/aspeed_scu.h | 21 +-
100
target/arm/translate-a64.c | 301 +++++++++++++-----------------------------
55
include/hw/ssi/aspeed_smc.h | 7 +
101
target/arm/translate-sve.c | 202 ++++++++++------------------
56
hw/arm/aspeed.c | 2 +
102
target/arm/translate.c | 244 ++++++++++++----------------------
57
hw/arm/aspeed_soc.c | 63 ++-
103
13 files changed, 293 insertions(+), 531 deletions(-)
58
hw/gpio/aspeed_gpio.c | 884 ++++++++++++++++++++++++++++++++++++++++++
59
hw/misc/aspeed_scu.c | 102 ++---
60
hw/ssi/aspeed_smc.c | 335 +++++++++++++++-
61
hw/timer/aspeed_timer.c | 3 +-
62
MAINTAINERS | 2 +-
63
docs/conf.py | 18 +-
64
docs/interop/conf.py | 7 +
65
docs/interop/index.rst | 1 +
66
docs/interop/qemu-ga.rst | 133 +++++++
67
qemu-doc.texi | 5 -
68
qemu-ga.texi | 137 -------
69
20 files changed, 1585 insertions(+), 266 deletions(-)
70
create mode 100644 include/hw/gpio/aspeed_gpio.h
71
create mode 100644 hw/gpio/aspeed_gpio.c
72
create mode 100644 docs/interop/qemu-ga.rst
73
delete mode 100644 qemu-ga.texi
74
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-2-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 12 ++++--------
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_address_with_allocation_tag0(TCGv_i64 dst, TCGv_i64 src)
16
static void gen_probe_access(DisasContext *s, TCGv_i64 ptr,
17
MMUAccessType acc, int log2_size)
18
{
19
- TCGv_i32 t_acc = tcg_const_i32(acc);
20
- TCGv_i32 t_idx = tcg_const_i32(get_mem_index(s));
21
- TCGv_i32 t_size = tcg_const_i32(1 << log2_size);
22
-
23
- gen_helper_probe_access(cpu_env, ptr, t_acc, t_idx, t_size);
24
- tcg_temp_free_i32(t_acc);
25
- tcg_temp_free_i32(t_idx);
26
- tcg_temp_free_i32(t_size);
27
+ gen_helper_probe_access(cpu_env, ptr,
28
+ tcg_constant_i32(acc),
29
+ tcg_constant_i32(get_mem_index(s)),
30
+ tcg_constant_i32(1 << log2_size));
31
}
32
33
/*
34
--
35
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-3-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 10 ++--------
9
1 file changed, 2 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static TCGv_i64 gen_mte_check1_mmuidx(DisasContext *s, TCGv_i64 addr,
16
int core_idx)
17
{
18
if (tag_checked && s->mte_active[is_unpriv]) {
19
- TCGv_i32 tcg_desc;
20
TCGv_i64 ret;
21
int desc = 0;
22
23
@@ -XXX,XX +XXX,XX @@ static TCGv_i64 gen_mte_check1_mmuidx(DisasContext *s, TCGv_i64 addr,
24
desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
25
desc = FIELD_DP32(desc, MTEDESC, WRITE, is_write);
26
desc = FIELD_DP32(desc, MTEDESC, SIZEM1, (1 << log2_size) - 1);
27
- tcg_desc = tcg_const_i32(desc);
28
29
ret = new_tmp_a64(s);
30
- gen_helper_mte_check(ret, cpu_env, tcg_desc, addr);
31
- tcg_temp_free_i32(tcg_desc);
32
+ gen_helper_mte_check(ret, cpu_env, tcg_constant_i32(desc), addr);
33
34
return ret;
35
}
36
@@ -XXX,XX +XXX,XX @@ TCGv_i64 gen_mte_checkN(DisasContext *s, TCGv_i64 addr, bool is_write,
37
bool tag_checked, int size)
38
{
39
if (tag_checked && s->mte_active[0]) {
40
- TCGv_i32 tcg_desc;
41
TCGv_i64 ret;
42
int desc = 0;
43
44
@@ -XXX,XX +XXX,XX @@ TCGv_i64 gen_mte_checkN(DisasContext *s, TCGv_i64 addr, bool is_write,
45
desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
46
desc = FIELD_DP32(desc, MTEDESC, WRITE, is_write);
47
desc = FIELD_DP32(desc, MTEDESC, SIZEM1, size - 1);
48
- tcg_desc = tcg_const_i32(desc);
49
50
ret = new_tmp_a64(s);
51
- gen_helper_mte_check(ret, cpu_env, tcg_desc, addr);
52
- tcg_temp_free_i32(tcg_desc);
53
+ gen_helper_mte_check(ret, cpu_env, tcg_constant_i32(desc), addr);
54
55
return ret;
56
}
57
--
58
2.25.1
diff view generated by jsdifflib
1
From: Damien Hedde <damien.hedde@greensocs.com>
1
From: Rashmica Gupta <rashmica.g@gmail.com>
2
2
3
As of now, cryptographic instructions ISAR fields are never cleared so
3
GPIO pins are arranged in groups of 8 pins labeled A,B,..,Y,Z,AA,AB,AC.
4
we can end up with a cpu with cryptographic instructions but no
4
(Note that the ast2400 controller only goes up to group AB).
5
floating-point/neon instructions which is not a possible configuration
5
A set has four groups (except set AC which only has one) and is
6
according to Arm specifications.
6
referred to by the groups it is composed of (eg ABCD,EFGH,...,YZAAAB).
7
Each set is accessed and controlled by a bank of 14 registers.
7
8
8
In QEMU, we have 3 kinds of cpus regarding cryptographic instructions:
9
These registers operate on a per pin level where each bit in the register
9
+ no support
10
corresponds to a pin, except for the command source registers. The command
10
+ cortex-a57/a72: cryptographic extension is optional,
11
source registers operate on a per group level where bits 24, 16, 8 and 0
11
floating-point/neon is not.
12
correspond to each group in the set.
12
+ cortex-a53: crytographic extension is optional as well as
13
floating-point/neon. But cryptographic requires
14
floating-point/neon support.
15
13
16
Therefore we can safely clear the ISAR fields when neon is disabled.
14
eg. registers for set ABCD:
15
|D7...D0|C7...C0|B7...B0|A7...A0| <- GPIOs
16
|31...24|23...16|15....8|7.....0| <- bit position
17
17
18
Note that other Arm cpus seem to follow this. For example cortex-a55 is
18
Note that there are a couple of groups that only have 4 pins.
19
like cortex-a53 and cortex-a76/cortex-a710 are like cortex-a57/a72.
20
19
21
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
20
There are two ways that this model deviates from the behaviour of the
22
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
21
actual controller:
23
Message-id: 20220427090117.6954-1-damien.hedde@greensocs.com
22
(1) The only control source driving the GPIO pins in the model is the ARM
24
[PMM: fixed commit message typos]
23
model (as there currently aren't models for the LPC or Coprocessor).
24
25
(2) None of the registers in the model are reset tolerant (needs
26
integration with the watchdog).
27
28
Signed-off-by: Rashmica Gupta <rashmica.g@gmail.com>
29
Tested-by: Andrew Jeffery <andrew@aj.id.au>
30
Reviewed-by: Cédric Le Goater <clg@kaod.org>
31
Signed-off-by: Cédric Le Goater <clg@kaod.org>
32
Message-id: 20190904070506.1052-2-clg@kaod.org
33
[clg: fixed missing header files
34
made use of HWADDR_PRIx to fix compilation on windows ]
35
Signed-off-by: Cédric Le Goater <clg@kaod.org>
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
36
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
---
37
---
27
target/arm/cpu.c | 9 +++++++++
38
hw/gpio/Makefile.objs | 1 +
28
1 file changed, 9 insertions(+)
39
include/hw/gpio/aspeed_gpio.h | 100 ++++
40
hw/gpio/aspeed_gpio.c | 884 ++++++++++++++++++++++++++++++++++
41
3 files changed, 985 insertions(+)
42
create mode 100644 include/hw/gpio/aspeed_gpio.h
43
create mode 100644 hw/gpio/aspeed_gpio.c
29
44
30
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
45
diff --git a/hw/gpio/Makefile.objs b/hw/gpio/Makefile.objs
31
index XXXXXXX..XXXXXXX 100644
46
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/cpu.c
47
--- a/hw/gpio/Makefile.objs
33
+++ b/target/arm/cpu.c
48
+++ b/hw/gpio/Makefile.objs
34
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
49
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_OMAP) += omap_gpio.o
35
unset_feature(env, ARM_FEATURE_NEON);
50
obj-$(CONFIG_IMX) += imx_gpio.o
36
51
obj-$(CONFIG_RASPI) += bcm2835_gpio.o
37
t = cpu->isar.id_aa64isar0;
52
obj-$(CONFIG_NRF51_SOC) += nrf51_gpio.o
38
+ t = FIELD_DP64(t, ID_AA64ISAR0, AES, 0);
53
+obj-$(CONFIG_ASPEED_SOC) += aspeed_gpio.o
39
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA1, 0);
54
diff --git a/include/hw/gpio/aspeed_gpio.h b/include/hw/gpio/aspeed_gpio.h
40
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA2, 0);
55
new file mode 100644
41
+ t = FIELD_DP64(t, ID_AA64ISAR0, SHA3, 0);
56
index XXXXXXX..XXXXXXX
42
+ t = FIELD_DP64(t, ID_AA64ISAR0, SM3, 0);
57
--- /dev/null
43
+ t = FIELD_DP64(t, ID_AA64ISAR0, SM4, 0);
58
+++ b/include/hw/gpio/aspeed_gpio.h
44
t = FIELD_DP64(t, ID_AA64ISAR0, DP, 0);
59
@@ -XXX,XX +XXX,XX @@
45
cpu->isar.id_aa64isar0 = t;
60
+/*
46
61
+ * ASPEED GPIO Controller
47
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
62
+ *
48
cpu->isar.id_aa64pfr0 = t;
63
+ * Copyright (C) 2017-2018 IBM Corp.
49
64
+ *
50
u = cpu->isar.id_isar5;
65
+ * This code is licensed under the GPL version 2 or later. See
51
+ u = FIELD_DP32(u, ID_ISAR5, AES, 0);
66
+ * the COPYING file in the top-level directory.
52
+ u = FIELD_DP32(u, ID_ISAR5, SHA1, 0);
67
+ */
53
+ u = FIELD_DP32(u, ID_ISAR5, SHA2, 0);
68
+
54
u = FIELD_DP32(u, ID_ISAR5, RDM, 0);
69
+#ifndef ASPEED_GPIO_H
55
u = FIELD_DP32(u, ID_ISAR5, VCMA, 0);
70
+#define ASPEED_GPIO_H
56
cpu->isar.id_isar5 = u;
71
+
72
+#include "hw/sysbus.h"
73
+
74
+#define TYPE_ASPEED_GPIO "aspeed.gpio"
75
+#define ASPEED_GPIO(obj) OBJECT_CHECK(AspeedGPIOState, (obj), TYPE_ASPEED_GPIO)
76
+#define ASPEED_GPIO_CLASS(klass) \
77
+ OBJECT_CLASS_CHECK(AspeedGPIOClass, (klass), TYPE_ASPEED_GPIO)
78
+#define ASPEED_GPIO_GET_CLASS(obj) \
79
+ OBJECT_GET_CLASS(AspeedGPIOClass, (obj), TYPE_ASPEED_GPIO)
80
+
81
+#define ASPEED_GPIO_MAX_NR_SETS 8
82
+#define ASPEED_REGS_PER_BANK 14
83
+#define ASPEED_GPIO_MAX_NR_REGS (ASPEED_REGS_PER_BANK * ASPEED_GPIO_MAX_NR_SETS)
84
+#define ASPEED_GPIO_NR_PINS 228
85
+#define ASPEED_GROUPS_PER_SET 4
86
+#define ASPEED_GPIO_NR_DEBOUNCE_REGS 3
87
+#define ASPEED_CHARS_PER_GROUP_LABEL 4
88
+
89
+typedef struct GPIOSets GPIOSets;
90
+
91
+typedef struct GPIOSetProperties {
92
+ uint32_t input;
93
+ uint32_t output;
94
+ char group_label[ASPEED_GROUPS_PER_SET][ASPEED_CHARS_PER_GROUP_LABEL];
95
+} GPIOSetProperties;
96
+
97
+enum GPIORegType {
98
+ gpio_not_a_reg,
99
+ gpio_reg_data_value,
100
+ gpio_reg_direction,
101
+ gpio_reg_int_enable,
102
+ gpio_reg_int_sens_0,
103
+ gpio_reg_int_sens_1,
104
+ gpio_reg_int_sens_2,
105
+ gpio_reg_int_status,
106
+ gpio_reg_reset_tolerant,
107
+ gpio_reg_debounce_1,
108
+ gpio_reg_debounce_2,
109
+ gpio_reg_cmd_source_0,
110
+ gpio_reg_cmd_source_1,
111
+ gpio_reg_data_read,
112
+ gpio_reg_input_mask,
113
+};
114
+
115
+typedef struct AspeedGPIOReg {
116
+ uint16_t set_idx;
117
+ enum GPIORegType type;
118
+ } AspeedGPIOReg;
119
+
120
+typedef struct AspeedGPIOClass {
121
+ SysBusDevice parent_obj;
122
+ const GPIOSetProperties *props;
123
+ uint32_t nr_gpio_pins;
124
+ uint32_t nr_gpio_sets;
125
+ uint32_t gap;
126
+ const AspeedGPIOReg *reg_table;
127
+} AspeedGPIOClass;
128
+
129
+typedef struct AspeedGPIOState {
130
+ /* <private> */
131
+ SysBusDevice parent;
132
+
133
+ /*< public >*/
134
+ MemoryRegion iomem;
135
+ int pending;
136
+ qemu_irq irq;
137
+ qemu_irq gpios[ASPEED_GPIO_NR_PINS];
138
+
139
+/* Parallel GPIO Registers */
140
+ uint32_t debounce_regs[ASPEED_GPIO_NR_DEBOUNCE_REGS];
141
+ struct GPIOSets {
142
+ uint32_t data_value; /* Reflects pin values */
143
+ uint32_t data_read; /* Contains last value written to data value */
144
+ uint32_t direction;
145
+ uint32_t int_enable;
146
+ uint32_t int_sens_0;
147
+ uint32_t int_sens_1;
148
+ uint32_t int_sens_2;
149
+ uint32_t int_status;
150
+ uint32_t reset_tol;
151
+ uint32_t cmd_source_0;
152
+ uint32_t cmd_source_1;
153
+ uint32_t debounce_1;
154
+ uint32_t debounce_2;
155
+ uint32_t input_mask;
156
+ } sets[ASPEED_GPIO_MAX_NR_SETS];
157
+} AspeedGPIOState;
158
+
159
+#endif /* _ASPEED_GPIO_H_ */
160
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
161
new file mode 100644
162
index XXXXXXX..XXXXXXX
163
--- /dev/null
164
+++ b/hw/gpio/aspeed_gpio.c
165
@@ -XXX,XX +XXX,XX @@
166
+/*
167
+ * ASPEED GPIO Controller
168
+ *
169
+ * Copyright (C) 2017-2019 IBM Corp.
170
+ *
171
+ * SPDX-License-Identifier: GPL-2.0-or-later
172
+ */
173
+
174
+#include <assert.h>
175
+
176
+#include "qemu/osdep.h"
177
+#include "qemu/host-utils.h"
178
+#include "qemu/log.h"
179
+#include "hw/gpio/aspeed_gpio.h"
180
+#include "include/hw/misc/aspeed_scu.h"
181
+#include "qapi/error.h"
182
+#include "qapi/visitor.h"
183
+#include "hw/irq.h"
184
+#include "migration/vmstate.h"
185
+
186
+#define GPIOS_PER_REG 32
187
+#define GPIOS_PER_SET GPIOS_PER_REG
188
+#define GPIO_PIN_GAP_SIZE 4
189
+#define GPIOS_PER_GROUP 8
190
+#define GPIO_GROUP_SHIFT 3
191
+
192
+/* GPIO Source Types */
193
+#define ASPEED_CMD_SRC_MASK 0x01010101
194
+#define ASPEED_SOURCE_ARM 0
195
+#define ASPEED_SOURCE_LPC 1
196
+#define ASPEED_SOURCE_COPROCESSOR 2
197
+#define ASPEED_SOURCE_RESERVED 3
198
+
199
+/* GPIO Interrupt Triggers */
200
+/*
201
+ * For each set of gpios there are three sensitivity registers that control
202
+ * the interrupt trigger mode.
203
+ *
204
+ * | 2 | 1 | 0 | trigger mode
205
+ * -----------------------------
206
+ * | 0 | 0 | 0 | falling-edge
207
+ * | 0 | 0 | 1 | rising-edge
208
+ * | 0 | 1 | 0 | level-low
209
+ * | 0 | 1 | 1 | level-high
210
+ * | 1 | X | X | dual-edge
211
+ */
212
+#define ASPEED_FALLING_EDGE 0
213
+#define ASPEED_RISING_EDGE 1
214
+#define ASPEED_LEVEL_LOW 2
215
+#define ASPEED_LEVEL_HIGH 3
216
+#define ASPEED_DUAL_EDGE 4
217
+
218
+/* GPIO Register Address Offsets */
219
+#define GPIO_ABCD_DATA_VALUE (0x000 >> 2)
220
+#define GPIO_ABCD_DIRECTION (0x004 >> 2)
221
+#define GPIO_ABCD_INT_ENABLE (0x008 >> 2)
222
+#define GPIO_ABCD_INT_SENS_0 (0x00C >> 2)
223
+#define GPIO_ABCD_INT_SENS_1 (0x010 >> 2)
224
+#define GPIO_ABCD_INT_SENS_2 (0x014 >> 2)
225
+#define GPIO_ABCD_INT_STATUS (0x018 >> 2)
226
+#define GPIO_ABCD_RESET_TOLERANT (0x01C >> 2)
227
+#define GPIO_EFGH_DATA_VALUE (0x020 >> 2)
228
+#define GPIO_EFGH_DIRECTION (0x024 >> 2)
229
+#define GPIO_EFGH_INT_ENABLE (0x028 >> 2)
230
+#define GPIO_EFGH_INT_SENS_0 (0x02C >> 2)
231
+#define GPIO_EFGH_INT_SENS_1 (0x030 >> 2)
232
+#define GPIO_EFGH_INT_SENS_2 (0x034 >> 2)
233
+#define GPIO_EFGH_INT_STATUS (0x038 >> 2)
234
+#define GPIO_EFGH_RESET_TOLERANT (0x03C >> 2)
235
+#define GPIO_ABCD_DEBOUNCE_1 (0x040 >> 2)
236
+#define GPIO_ABCD_DEBOUNCE_2 (0x044 >> 2)
237
+#define GPIO_EFGH_DEBOUNCE_1 (0x048 >> 2)
238
+#define GPIO_EFGH_DEBOUNCE_2 (0x04C >> 2)
239
+#define GPIO_DEBOUNCE_TIME_1 (0x050 >> 2)
240
+#define GPIO_DEBOUNCE_TIME_2 (0x054 >> 2)
241
+#define GPIO_DEBOUNCE_TIME_3 (0x058 >> 2)
242
+#define GPIO_ABCD_COMMAND_SRC_0 (0x060 >> 2)
243
+#define GPIO_ABCD_COMMAND_SRC_1 (0x064 >> 2)
244
+#define GPIO_EFGH_COMMAND_SRC_0 (0x068 >> 2)
245
+#define GPIO_EFGH_COMMAND_SRC_1 (0x06C >> 2)
246
+#define GPIO_IJKL_DATA_VALUE (0x070 >> 2)
247
+#define GPIO_IJKL_DIRECTION (0x074 >> 2)
248
+#define GPIO_MNOP_DATA_VALUE (0x078 >> 2)
249
+#define GPIO_MNOP_DIRECTION (0x07C >> 2)
250
+#define GPIO_QRST_DATA_VALUE (0x080 >> 2)
251
+#define GPIO_QRST_DIRECTION (0x084 >> 2)
252
+#define GPIO_UVWX_DATA_VALUE (0x088 >> 2)
253
+#define GPIO_UVWX_DIRECTION (0x08C >> 2)
254
+#define GPIO_IJKL_COMMAND_SRC_0 (0x090 >> 2)
255
+#define GPIO_IJKL_COMMAND_SRC_1 (0x094 >> 2)
256
+#define GPIO_IJKL_INT_ENABLE (0x098 >> 2)
257
+#define GPIO_IJKL_INT_SENS_0 (0x09C >> 2)
258
+#define GPIO_IJKL_INT_SENS_1 (0x0A0 >> 2)
259
+#define GPIO_IJKL_INT_SENS_2 (0x0A4 >> 2)
260
+#define GPIO_IJKL_INT_STATUS (0x0A8 >> 2)
261
+#define GPIO_IJKL_RESET_TOLERANT (0x0AC >> 2)
262
+#define GPIO_IJKL_DEBOUNCE_1 (0x0B0 >> 2)
263
+#define GPIO_IJKL_DEBOUNCE_2 (0x0B4 >> 2)
264
+#define GPIO_IJKL_INPUT_MASK (0x0B8 >> 2)
265
+#define GPIO_ABCD_DATA_READ (0x0C0 >> 2)
266
+#define GPIO_EFGH_DATA_READ (0x0C4 >> 2)
267
+#define GPIO_IJKL_DATA_READ (0x0C8 >> 2)
268
+#define GPIO_MNOP_DATA_READ (0x0CC >> 2)
269
+#define GPIO_QRST_DATA_READ (0x0D0 >> 2)
270
+#define GPIO_UVWX_DATA_READ (0x0D4 >> 2)
271
+#define GPIO_YZAAAB_DATA_READ (0x0D8 >> 2)
272
+#define GPIO_AC_DATA_READ (0x0DC >> 2)
273
+#define GPIO_MNOP_COMMAND_SRC_0 (0x0E0 >> 2)
274
+#define GPIO_MNOP_COMMAND_SRC_1 (0x0E4 >> 2)
275
+#define GPIO_MNOP_INT_ENABLE (0x0E8 >> 2)
276
+#define GPIO_MNOP_INT_SENS_0 (0x0EC >> 2)
277
+#define GPIO_MNOP_INT_SENS_1 (0x0F0 >> 2)
278
+#define GPIO_MNOP_INT_SENS_2 (0x0F4 >> 2)
279
+#define GPIO_MNOP_INT_STATUS (0x0F8 >> 2)
280
+#define GPIO_MNOP_RESET_TOLERANT (0x0FC >> 2)
281
+#define GPIO_MNOP_DEBOUNCE_1 (0x100 >> 2)
282
+#define GPIO_MNOP_DEBOUNCE_2 (0x104 >> 2)
283
+#define GPIO_MNOP_INPUT_MASK (0x108 >> 2)
284
+#define GPIO_QRST_COMMAND_SRC_0 (0x110 >> 2)
285
+#define GPIO_QRST_COMMAND_SRC_1 (0x114 >> 2)
286
+#define GPIO_QRST_INT_ENABLE (0x118 >> 2)
287
+#define GPIO_QRST_INT_SENS_0 (0x11C >> 2)
288
+#define GPIO_QRST_INT_SENS_1 (0x120 >> 2)
289
+#define GPIO_QRST_INT_SENS_2 (0x124 >> 2)
290
+#define GPIO_QRST_INT_STATUS (0x128 >> 2)
291
+#define GPIO_QRST_RESET_TOLERANT (0x12C >> 2)
292
+#define GPIO_QRST_DEBOUNCE_1 (0x130 >> 2)
293
+#define GPIO_QRST_DEBOUNCE_2 (0x134 >> 2)
294
+#define GPIO_QRST_INPUT_MASK (0x138 >> 2)
295
+#define GPIO_UVWX_COMMAND_SRC_0 (0x140 >> 2)
296
+#define GPIO_UVWX_COMMAND_SRC_1 (0x144 >> 2)
297
+#define GPIO_UVWX_INT_ENABLE (0x148 >> 2)
298
+#define GPIO_UVWX_INT_SENS_0 (0x14C >> 2)
299
+#define GPIO_UVWX_INT_SENS_1 (0x150 >> 2)
300
+#define GPIO_UVWX_INT_SENS_2 (0x154 >> 2)
301
+#define GPIO_UVWX_INT_STATUS (0x158 >> 2)
302
+#define GPIO_UVWX_RESET_TOLERANT (0x15C >> 2)
303
+#define GPIO_UVWX_DEBOUNCE_1 (0x160 >> 2)
304
+#define GPIO_UVWX_DEBOUNCE_2 (0x164 >> 2)
305
+#define GPIO_UVWX_INPUT_MASK (0x168 >> 2)
306
+#define GPIO_YZAAAB_COMMAND_SRC_0 (0x170 >> 2)
307
+#define GPIO_YZAAAB_COMMAND_SRC_1 (0x174 >> 2)
308
+#define GPIO_YZAAAB_INT_ENABLE (0x178 >> 2)
309
+#define GPIO_YZAAAB_INT_SENS_0 (0x17C >> 2)
310
+#define GPIO_YZAAAB_INT_SENS_1 (0x180 >> 2)
311
+#define GPIO_YZAAAB_INT_SENS_2 (0x184 >> 2)
312
+#define GPIO_YZAAAB_INT_STATUS (0x188 >> 2)
313
+#define GPIO_YZAAAB_RESET_TOLERANT (0x18C >> 2)
314
+#define GPIO_YZAAAB_DEBOUNCE_1 (0x190 >> 2)
315
+#define GPIO_YZAAAB_DEBOUNCE_2 (0x194 >> 2)
316
+#define GPIO_YZAAAB_INPUT_MASK (0x198 >> 2)
317
+#define GPIO_AC_COMMAND_SRC_0 (0x1A0 >> 2)
318
+#define GPIO_AC_COMMAND_SRC_1 (0x1A4 >> 2)
319
+#define GPIO_AC_INT_ENABLE (0x1A8 >> 2)
320
+#define GPIO_AC_INT_SENS_0 (0x1AC >> 2)
321
+#define GPIO_AC_INT_SENS_1 (0x1B0 >> 2)
322
+#define GPIO_AC_INT_SENS_2 (0x1B4 >> 2)
323
+#define GPIO_AC_INT_STATUS (0x1B8 >> 2)
324
+#define GPIO_AC_RESET_TOLERANT (0x1BC >> 2)
325
+#define GPIO_AC_DEBOUNCE_1 (0x1C0 >> 2)
326
+#define GPIO_AC_DEBOUNCE_2 (0x1C4 >> 2)
327
+#define GPIO_AC_INPUT_MASK (0x1C8 >> 2)
328
+#define GPIO_ABCD_INPUT_MASK (0x1D0 >> 2)
329
+#define GPIO_EFGH_INPUT_MASK (0x1D4 >> 2)
330
+#define GPIO_YZAAAB_DATA_VALUE (0x1E0 >> 2)
331
+#define GPIO_YZAAAB_DIRECTION (0x1E4 >> 2)
332
+#define GPIO_AC_DATA_VALUE (0x1E8 >> 2)
333
+#define GPIO_AC_DIRECTION (0x1EC >> 2)
334
+#define GPIO_3_6V_MEM_SIZE 0x1F0
335
+#define GPIO_3_6V_REG_ARRAY_SIZE (GPIO_3_6V_MEM_SIZE >> 2)
336
+
337
+static int aspeed_evaluate_irq(GPIOSets *regs, int gpio_prev_high, int gpio)
338
+{
339
+ uint32_t falling_edge = 0, rising_edge = 0;
340
+ uint32_t int_trigger = extract32(regs->int_sens_0, gpio, 1)
341
+ | extract32(regs->int_sens_1, gpio, 1) << 1
342
+ | extract32(regs->int_sens_2, gpio, 1) << 2;
343
+ uint32_t gpio_curr_high = extract32(regs->data_value, gpio, 1);
344
+ uint32_t gpio_int_enabled = extract32(regs->int_enable, gpio, 1);
345
+
346
+ if (!gpio_int_enabled) {
347
+ return 0;
348
+ }
349
+
350
+ /* Detect edges */
351
+ if (gpio_curr_high && !gpio_prev_high) {
352
+ rising_edge = 1;
353
+ } else if (!gpio_curr_high && gpio_prev_high) {
354
+ falling_edge = 1;
355
+ }
356
+
357
+ if (((int_trigger == ASPEED_FALLING_EDGE) && falling_edge) ||
358
+ ((int_trigger == ASPEED_RISING_EDGE) && rising_edge) ||
359
+ ((int_trigger == ASPEED_LEVEL_LOW) && !gpio_curr_high) ||
360
+ ((int_trigger == ASPEED_LEVEL_HIGH) && gpio_curr_high) ||
361
+ ((int_trigger >= ASPEED_DUAL_EDGE) && (rising_edge || falling_edge)))
362
+ {
363
+ regs->int_status = deposit32(regs->int_status, gpio, 1, 1);
364
+ return 1;
365
+ }
366
+ return 0;
367
+}
368
+
369
+#define nested_struct_index(ta, pa, m, tb, pb) \
370
+ (pb - ((tb *)(((char *)pa) + offsetof(ta, m))))
371
+
372
+static ptrdiff_t aspeed_gpio_set_idx(AspeedGPIOState *s, GPIOSets *regs)
373
+{
374
+ return nested_struct_index(AspeedGPIOState, s, sets, GPIOSets, regs);
375
+}
376
+
377
+static void aspeed_gpio_update(AspeedGPIOState *s, GPIOSets *regs,
378
+ uint32_t value)
379
+{
380
+ uint32_t input_mask = regs->input_mask;
381
+ uint32_t direction = regs->direction;
382
+ uint32_t old = regs->data_value;
383
+ uint32_t new = value;
384
+ uint32_t diff;
385
+ int gpio;
386
+
387
+ diff = old ^ new;
388
+ if (diff) {
389
+ for (gpio = 0; gpio < GPIOS_PER_REG; gpio++) {
390
+ uint32_t mask = 1 << gpio;
391
+
392
+ /* If the gpio needs to be updated... */
393
+ if (!(diff & mask)) {
394
+ continue;
395
+ }
396
+
397
+ /* ...and we're output or not input-masked... */
398
+ if (!(direction & mask) && (input_mask & mask)) {
399
+ continue;
400
+ }
401
+
402
+ /* ...then update the state. */
403
+ if (mask & new) {
404
+ regs->data_value |= mask;
405
+ } else {
406
+ regs->data_value &= ~mask;
407
+ }
408
+
409
+ /* If the gpio is set to output... */
410
+ if (direction & mask) {
411
+ /* ...trigger the line-state IRQ */
412
+ ptrdiff_t set = aspeed_gpio_set_idx(s, regs);
413
+ size_t offset = set * GPIOS_PER_SET + gpio;
414
+ qemu_set_irq(s->gpios[offset], !!(new & mask));
415
+ } else {
416
+ /* ...otherwise if we meet the line's current IRQ policy... */
417
+ if (aspeed_evaluate_irq(regs, old & mask, gpio)) {
418
+ /* ...trigger the VIC IRQ */
419
+ s->pending++;
420
+ }
421
+ }
422
+ }
423
+ }
424
+ qemu_set_irq(s->irq, !!(s->pending));
425
+}
426
+
427
+static uint32_t aspeed_adjust_pin(AspeedGPIOState *s, uint32_t pin)
428
+{
429
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
430
+ /*
431
+ * The 2500 has a 4 pin gap in group AB and the 2400 has a 4 pin
432
+ * gap in group Y (and only four pins in AB but this is the last group so
433
+ * it doesn't matter).
434
+ */
435
+ if (agc->gap && pin >= agc->gap) {
436
+ pin += GPIO_PIN_GAP_SIZE;
437
+ }
438
+
439
+ return pin;
440
+}
441
+
442
+static bool aspeed_gpio_get_pin_level(AspeedGPIOState *s, uint32_t set_idx,
443
+ uint32_t pin)
444
+{
445
+ uint32_t reg_val;
446
+ uint32_t pin_mask = 1 << pin;
447
+
448
+ reg_val = s->sets[set_idx].data_value;
449
+
450
+ return !!(reg_val & pin_mask);
451
+}
452
+
453
+static void aspeed_gpio_set_pin_level(AspeedGPIOState *s, uint32_t set_idx,
454
+ uint32_t pin, bool level)
455
+{
456
+ uint32_t value = s->sets[set_idx].data_value;
457
+ uint32_t pin_mask = 1 << pin;
458
+
459
+ if (level) {
460
+ value |= pin_mask;
461
+ } else {
462
+ value &= !pin_mask;
463
+ }
464
+
465
+ aspeed_gpio_update(s, &s->sets[set_idx], value);
466
+}
467
+
468
+/*
469
+ * | src_1 | src_2 | source |
470
+ * |-----------------------------|
471
+ * | 0 | 0 | ARM |
472
+ * | 0 | 1 | LPC |
473
+ * | 1 | 0 | Coprocessor|
474
+ * | 1 | 1 | Reserved |
475
+ *
476
+ * Once the source of a set is programmed, corresponding bits in the
477
+ * data_value, direction, interrupt [enable, sens[0-2]], reset_tol and
478
+ * debounce registers can only be written by the source.
479
+ *
480
+ * Source is ARM by default
481
+ * only bits 24, 16, 8, and 0 can be set
482
+ *
483
+ * we don't currently have a model for the LPC or Coprocessor
484
+ */
485
+static uint32_t update_value_control_source(GPIOSets *regs, uint32_t old_value,
486
+ uint32_t value)
487
+{
488
+ int i;
489
+ int cmd_source;
490
+
491
+ /* assume the source is always ARM for now */
492
+ int source = ASPEED_SOURCE_ARM;
493
+
494
+ uint32_t new_value = 0;
495
+
496
+ /* for each group in set */
497
+ for (i = 0; i < GPIOS_PER_REG; i += GPIOS_PER_GROUP) {
498
+ cmd_source = extract32(regs->cmd_source_0, i, 1)
499
+ | (extract32(regs->cmd_source_1, i, 1) << 1);
500
+
501
+ if (source == cmd_source) {
502
+ new_value |= (0xff << i) & value;
503
+ } else {
504
+ new_value |= (0xff << i) & old_value;
505
+ }
506
+ }
507
+ return new_value;
508
+}
509
+
510
+static const AspeedGPIOReg aspeed_3_6v_gpios[GPIO_3_6V_REG_ARRAY_SIZE] = {
511
+ /* Set ABCD */
512
+ [GPIO_ABCD_DATA_VALUE] = { 0, gpio_reg_data_value },
513
+ [GPIO_ABCD_DIRECTION] = { 0, gpio_reg_direction },
514
+ [GPIO_ABCD_INT_ENABLE] = { 0, gpio_reg_int_enable },
515
+ [GPIO_ABCD_INT_SENS_0] = { 0, gpio_reg_int_sens_0 },
516
+ [GPIO_ABCD_INT_SENS_1] = { 0, gpio_reg_int_sens_1 },
517
+ [GPIO_ABCD_INT_SENS_2] = { 0, gpio_reg_int_sens_2 },
518
+ [GPIO_ABCD_INT_STATUS] = { 0, gpio_reg_int_status },
519
+ [GPIO_ABCD_RESET_TOLERANT] = { 0, gpio_reg_reset_tolerant },
520
+ [GPIO_ABCD_DEBOUNCE_1] = { 0, gpio_reg_debounce_1 },
521
+ [GPIO_ABCD_DEBOUNCE_2] = { 0, gpio_reg_debounce_2 },
522
+ [GPIO_ABCD_COMMAND_SRC_0] = { 0, gpio_reg_cmd_source_0 },
523
+ [GPIO_ABCD_COMMAND_SRC_1] = { 0, gpio_reg_cmd_source_1 },
524
+ [GPIO_ABCD_DATA_READ] = { 0, gpio_reg_data_read },
525
+ [GPIO_ABCD_INPUT_MASK] = { 0, gpio_reg_input_mask },
526
+ /* Set EFGH */
527
+ [GPIO_EFGH_DATA_VALUE] = { 1, gpio_reg_data_value },
528
+ [GPIO_EFGH_DIRECTION] = { 1, gpio_reg_direction },
529
+ [GPIO_EFGH_INT_ENABLE] = { 1, gpio_reg_int_enable },
530
+ [GPIO_EFGH_INT_SENS_0] = { 1, gpio_reg_int_sens_0 },
531
+ [GPIO_EFGH_INT_SENS_1] = { 1, gpio_reg_int_sens_1 },
532
+ [GPIO_EFGH_INT_SENS_2] = { 1, gpio_reg_int_sens_2 },
533
+ [GPIO_EFGH_INT_STATUS] = { 1, gpio_reg_int_status },
534
+ [GPIO_EFGH_RESET_TOLERANT] = { 1, gpio_reg_reset_tolerant },
535
+ [GPIO_EFGH_DEBOUNCE_1] = { 1, gpio_reg_debounce_1 },
536
+ [GPIO_EFGH_DEBOUNCE_2] = { 1, gpio_reg_debounce_2 },
537
+ [GPIO_EFGH_COMMAND_SRC_0] = { 1, gpio_reg_cmd_source_0 },
538
+ [GPIO_EFGH_COMMAND_SRC_1] = { 1, gpio_reg_cmd_source_1 },
539
+ [GPIO_EFGH_DATA_READ] = { 1, gpio_reg_data_read },
540
+ [GPIO_EFGH_INPUT_MASK] = { 1, gpio_reg_input_mask },
541
+ /* Set IJKL */
542
+ [GPIO_IJKL_DATA_VALUE] = { 2, gpio_reg_data_value },
543
+ [GPIO_IJKL_DIRECTION] = { 2, gpio_reg_direction },
544
+ [GPIO_IJKL_INT_ENABLE] = { 2, gpio_reg_int_enable },
545
+ [GPIO_IJKL_INT_SENS_0] = { 2, gpio_reg_int_sens_0 },
546
+ [GPIO_IJKL_INT_SENS_1] = { 2, gpio_reg_int_sens_1 },
547
+ [GPIO_IJKL_INT_SENS_2] = { 2, gpio_reg_int_sens_2 },
548
+ [GPIO_IJKL_INT_STATUS] = { 2, gpio_reg_int_status },
549
+ [GPIO_IJKL_RESET_TOLERANT] = { 2, gpio_reg_reset_tolerant },
550
+ [GPIO_IJKL_DEBOUNCE_1] = { 2, gpio_reg_debounce_1 },
551
+ [GPIO_IJKL_DEBOUNCE_2] = { 2, gpio_reg_debounce_2 },
552
+ [GPIO_IJKL_COMMAND_SRC_0] = { 2, gpio_reg_cmd_source_0 },
553
+ [GPIO_IJKL_COMMAND_SRC_1] = { 2, gpio_reg_cmd_source_1 },
554
+ [GPIO_IJKL_DATA_READ] = { 2, gpio_reg_data_read },
555
+ [GPIO_IJKL_INPUT_MASK] = { 2, gpio_reg_input_mask },
556
+ /* Set MNOP */
557
+ [GPIO_MNOP_DATA_VALUE] = { 3, gpio_reg_data_value },
558
+ [GPIO_MNOP_DIRECTION] = { 3, gpio_reg_direction },
559
+ [GPIO_MNOP_INT_ENABLE] = { 3, gpio_reg_int_enable },
560
+ [GPIO_MNOP_INT_SENS_0] = { 3, gpio_reg_int_sens_0 },
561
+ [GPIO_MNOP_INT_SENS_1] = { 3, gpio_reg_int_sens_1 },
562
+ [GPIO_MNOP_INT_SENS_2] = { 3, gpio_reg_int_sens_2 },
563
+ [GPIO_MNOP_INT_STATUS] = { 3, gpio_reg_int_status },
564
+ [GPIO_MNOP_RESET_TOLERANT] = { 3, gpio_reg_reset_tolerant },
565
+ [GPIO_MNOP_DEBOUNCE_1] = { 3, gpio_reg_debounce_1 },
566
+ [GPIO_MNOP_DEBOUNCE_2] = { 3, gpio_reg_debounce_2 },
567
+ [GPIO_MNOP_COMMAND_SRC_0] = { 3, gpio_reg_cmd_source_0 },
568
+ [GPIO_MNOP_COMMAND_SRC_1] = { 3, gpio_reg_cmd_source_1 },
569
+ [GPIO_MNOP_DATA_READ] = { 3, gpio_reg_data_read },
570
+ [GPIO_MNOP_INPUT_MASK] = { 3, gpio_reg_input_mask },
571
+ /* Set QRST */
572
+ [GPIO_QRST_DATA_VALUE] = { 4, gpio_reg_data_value },
573
+ [GPIO_QRST_DIRECTION] = { 4, gpio_reg_direction },
574
+ [GPIO_QRST_INT_ENABLE] = { 4, gpio_reg_int_enable },
575
+ [GPIO_QRST_INT_SENS_0] = { 4, gpio_reg_int_sens_0 },
576
+ [GPIO_QRST_INT_SENS_1] = { 4, gpio_reg_int_sens_1 },
577
+ [GPIO_QRST_INT_SENS_2] = { 4, gpio_reg_int_sens_2 },
578
+ [GPIO_QRST_INT_STATUS] = { 4, gpio_reg_int_status },
579
+ [GPIO_QRST_RESET_TOLERANT] = { 4, gpio_reg_reset_tolerant },
580
+ [GPIO_QRST_DEBOUNCE_1] = { 4, gpio_reg_debounce_1 },
581
+ [GPIO_QRST_DEBOUNCE_2] = { 4, gpio_reg_debounce_2 },
582
+ [GPIO_QRST_COMMAND_SRC_0] = { 4, gpio_reg_cmd_source_0 },
583
+ [GPIO_QRST_COMMAND_SRC_1] = { 4, gpio_reg_cmd_source_1 },
584
+ [GPIO_QRST_DATA_READ] = { 4, gpio_reg_data_read },
585
+ [GPIO_QRST_INPUT_MASK] = { 4, gpio_reg_input_mask },
586
+ /* Set UVWX */
587
+ [GPIO_UVWX_DATA_VALUE] = { 5, gpio_reg_data_value },
588
+ [GPIO_UVWX_DIRECTION] = { 5, gpio_reg_direction },
589
+ [GPIO_UVWX_INT_ENABLE] = { 5, gpio_reg_int_enable },
590
+ [GPIO_UVWX_INT_SENS_0] = { 5, gpio_reg_int_sens_0 },
591
+ [GPIO_UVWX_INT_SENS_1] = { 5, gpio_reg_int_sens_1 },
592
+ [GPIO_UVWX_INT_SENS_2] = { 5, gpio_reg_int_sens_2 },
593
+ [GPIO_UVWX_INT_STATUS] = { 5, gpio_reg_int_status },
594
+ [GPIO_UVWX_RESET_TOLERANT] = { 5, gpio_reg_reset_tolerant },
595
+ [GPIO_UVWX_DEBOUNCE_1] = { 5, gpio_reg_debounce_1 },
596
+ [GPIO_UVWX_DEBOUNCE_2] = { 5, gpio_reg_debounce_2 },
597
+ [GPIO_UVWX_COMMAND_SRC_0] = { 5, gpio_reg_cmd_source_0 },
598
+ [GPIO_UVWX_COMMAND_SRC_1] = { 5, gpio_reg_cmd_source_1 },
599
+ [GPIO_UVWX_DATA_READ] = { 5, gpio_reg_data_read },
600
+ [GPIO_UVWX_INPUT_MASK] = { 5, gpio_reg_input_mask },
601
+ /* Set YZAAAB */
602
+ [GPIO_YZAAAB_DATA_VALUE] = { 6, gpio_reg_data_value },
603
+ [GPIO_YZAAAB_DIRECTION] = { 6, gpio_reg_direction },
604
+ [GPIO_YZAAAB_INT_ENABLE] = { 6, gpio_reg_int_enable },
605
+ [GPIO_YZAAAB_INT_SENS_0] = { 6, gpio_reg_int_sens_0 },
606
+ [GPIO_YZAAAB_INT_SENS_1] = { 6, gpio_reg_int_sens_1 },
607
+ [GPIO_YZAAAB_INT_SENS_2] = { 6, gpio_reg_int_sens_2 },
608
+ [GPIO_YZAAAB_INT_STATUS] = { 6, gpio_reg_int_status },
609
+ [GPIO_YZAAAB_RESET_TOLERANT] = { 6, gpio_reg_reset_tolerant },
610
+ [GPIO_YZAAAB_DEBOUNCE_1] = { 6, gpio_reg_debounce_1 },
611
+ [GPIO_YZAAAB_DEBOUNCE_2] = { 6, gpio_reg_debounce_2 },
612
+ [GPIO_YZAAAB_COMMAND_SRC_0] = { 6, gpio_reg_cmd_source_0 },
613
+ [GPIO_YZAAAB_COMMAND_SRC_1] = { 6, gpio_reg_cmd_source_1 },
614
+ [GPIO_YZAAAB_DATA_READ] = { 6, gpio_reg_data_read },
615
+ [GPIO_YZAAAB_INPUT_MASK] = { 6, gpio_reg_input_mask },
616
+ /* Set AC (ast2500 only) */
617
+ [GPIO_AC_DATA_VALUE] = { 7, gpio_reg_data_value },
618
+ [GPIO_AC_DIRECTION] = { 7, gpio_reg_direction },
619
+ [GPIO_AC_INT_ENABLE] = { 7, gpio_reg_int_enable },
620
+ [GPIO_AC_INT_SENS_0] = { 7, gpio_reg_int_sens_0 },
621
+ [GPIO_AC_INT_SENS_1] = { 7, gpio_reg_int_sens_1 },
622
+ [GPIO_AC_INT_SENS_2] = { 7, gpio_reg_int_sens_2 },
623
+ [GPIO_AC_INT_STATUS] = { 7, gpio_reg_int_status },
624
+ [GPIO_AC_RESET_TOLERANT] = { 7, gpio_reg_reset_tolerant },
625
+ [GPIO_AC_DEBOUNCE_1] = { 7, gpio_reg_debounce_1 },
626
+ [GPIO_AC_DEBOUNCE_2] = { 7, gpio_reg_debounce_2 },
627
+ [GPIO_AC_COMMAND_SRC_0] = { 7, gpio_reg_cmd_source_0 },
628
+ [GPIO_AC_COMMAND_SRC_1] = { 7, gpio_reg_cmd_source_1 },
629
+ [GPIO_AC_DATA_READ] = { 7, gpio_reg_data_read },
630
+ [GPIO_AC_INPUT_MASK] = { 7, gpio_reg_input_mask },
631
+};
632
+
633
+static uint64_t aspeed_gpio_read(void *opaque, hwaddr offset, uint32_t size)
634
+{
635
+ AspeedGPIOState *s = ASPEED_GPIO(opaque);
636
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
637
+ uint64_t idx = -1;
638
+ const AspeedGPIOReg *reg;
639
+ GPIOSets *set;
640
+
641
+ idx = offset >> 2;
642
+ if (idx >= GPIO_DEBOUNCE_TIME_1 && idx <= GPIO_DEBOUNCE_TIME_3) {
643
+ idx -= GPIO_DEBOUNCE_TIME_1;
644
+ return (uint64_t) s->debounce_regs[idx];
645
+ }
646
+
647
+ reg = &agc->reg_table[idx];
648
+ if (reg->set_idx >= agc->nr_gpio_sets) {
649
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: no getter for offset 0x%"
650
+ HWADDR_PRIx"\n", __func__, offset);
651
+ return 0;
652
+ }
653
+
654
+ set = &s->sets[reg->set_idx];
655
+ switch (reg->type) {
656
+ case gpio_reg_data_value:
657
+ return set->data_value;
658
+ case gpio_reg_direction:
659
+ return set->direction;
660
+ case gpio_reg_int_enable:
661
+ return set->int_enable;
662
+ case gpio_reg_int_sens_0:
663
+ return set->int_sens_0;
664
+ case gpio_reg_int_sens_1:
665
+ return set->int_sens_1;
666
+ case gpio_reg_int_sens_2:
667
+ return set->int_sens_2;
668
+ case gpio_reg_int_status:
669
+ return set->int_status;
670
+ case gpio_reg_reset_tolerant:
671
+ return set->reset_tol;
672
+ case gpio_reg_debounce_1:
673
+ return set->debounce_1;
674
+ case gpio_reg_debounce_2:
675
+ return set->debounce_2;
676
+ case gpio_reg_cmd_source_0:
677
+ return set->cmd_source_0;
678
+ case gpio_reg_cmd_source_1:
679
+ return set->cmd_source_1;
680
+ case gpio_reg_data_read:
681
+ return set->data_read;
682
+ case gpio_reg_input_mask:
683
+ return set->input_mask;
684
+ default:
685
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: no getter for offset 0x%"
686
+ HWADDR_PRIx"\n", __func__, offset);
687
+ return 0;
688
+ };
689
+}
690
+
691
+static void aspeed_gpio_write(void *opaque, hwaddr offset, uint64_t data,
692
+ uint32_t size)
693
+{
694
+ AspeedGPIOState *s = ASPEED_GPIO(opaque);
695
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
696
+ const GPIOSetProperties *props;
697
+ uint64_t idx = -1;
698
+ const AspeedGPIOReg *reg;
699
+ GPIOSets *set;
700
+ uint32_t cleared;
701
+
702
+ idx = offset >> 2;
703
+ if (idx >= GPIO_DEBOUNCE_TIME_1 && idx <= GPIO_DEBOUNCE_TIME_3) {
704
+ idx -= GPIO_DEBOUNCE_TIME_1;
705
+ s->debounce_regs[idx] = (uint32_t) data;
706
+ return;
707
+ }
708
+
709
+ reg = &agc->reg_table[idx];
710
+ if (reg->set_idx >= agc->nr_gpio_sets) {
711
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: no setter for offset 0x%"
712
+ HWADDR_PRIx"\n", __func__, offset);
713
+ return;
714
+ }
715
+
716
+ set = &s->sets[reg->set_idx];
717
+ props = &agc->props[reg->set_idx];
718
+
719
+ switch (reg->type) {
720
+ case gpio_reg_data_value:
721
+ data &= props->output;
722
+ data = update_value_control_source(set, set->data_value, data);
723
+ set->data_read = data;
724
+ aspeed_gpio_update(s, set, data);
725
+ return;
726
+ case gpio_reg_direction:
727
+ /*
728
+ * where data is the value attempted to be written to the pin:
729
+ * pin type | input mask | output mask | expected value
730
+ * ------------------------------------------------------------
731
+ * bidirectional | 1 | 1 | data
732
+ * input only | 1 | 0 | 0
733
+ * output only | 0 | 1 | 1
734
+ * no pin / gap | 0 | 0 | 0
735
+ *
736
+ * which is captured by:
737
+ * data = ( data | ~input) & output;
738
+ */
739
+ data = (data | ~props->input) & props->output;
740
+ set->direction = update_value_control_source(set, set->direction, data);
741
+ break;
742
+ case gpio_reg_int_enable:
743
+ set->int_enable = update_value_control_source(set, set->int_enable,
744
+ data);
745
+ break;
746
+ case gpio_reg_int_sens_0:
747
+ set->int_sens_0 = update_value_control_source(set, set->int_sens_0,
748
+ data);
749
+ break;
750
+ case gpio_reg_int_sens_1:
751
+ set->int_sens_1 = update_value_control_source(set, set->int_sens_1,
752
+ data);
753
+ break;
754
+ case gpio_reg_int_sens_2:
755
+ set->int_sens_2 = update_value_control_source(set, set->int_sens_2,
756
+ data);
757
+ break;
758
+ case gpio_reg_int_status:
759
+ cleared = ctpop32(data & set->int_status);
760
+ if (s->pending && cleared) {
761
+ assert(s->pending >= cleared);
762
+ s->pending -= cleared;
763
+ }
764
+ set->int_status &= ~data;
765
+ break;
766
+ case gpio_reg_reset_tolerant:
767
+ set->reset_tol = update_value_control_source(set, set->reset_tol,
768
+ data);
769
+ return;
770
+ case gpio_reg_debounce_1:
771
+ set->debounce_1 = update_value_control_source(set, set->debounce_1,
772
+ data);
773
+ return;
774
+ case gpio_reg_debounce_2:
775
+ set->debounce_2 = update_value_control_source(set, set->debounce_2,
776
+ data);
777
+ return;
778
+ case gpio_reg_cmd_source_0:
779
+ set->cmd_source_0 = data & ASPEED_CMD_SRC_MASK;
780
+ return;
781
+ case gpio_reg_cmd_source_1:
782
+ set->cmd_source_1 = data & ASPEED_CMD_SRC_MASK;
783
+ return;
784
+ case gpio_reg_data_read:
785
+ /* Read only register */
786
+ return;
787
+ case gpio_reg_input_mask:
788
+ /*
789
+ * feeds into interrupt generation
790
+ * 0: read from data value reg will be updated
791
+ * 1: read from data value reg will not be updated
792
+ */
793
+ set->input_mask = data & props->input;
794
+ break;
795
+ default:
796
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: no setter for offset 0x%"
797
+ HWADDR_PRIx"\n", __func__, offset);
798
+ return;
799
+ }
800
+ aspeed_gpio_update(s, set, set->data_value);
801
+ return;
802
+}
803
+
804
+static int get_set_idx(AspeedGPIOState *s, const char *group, int *group_idx)
805
+{
806
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
807
+ int set_idx, g_idx = *group_idx;
808
+
809
+ for (set_idx = 0; set_idx < agc->nr_gpio_sets; set_idx++) {
810
+ const GPIOSetProperties *set_props = &agc->props[set_idx];
811
+ for (g_idx = 0; g_idx < ASPEED_GROUPS_PER_SET; g_idx++) {
812
+ if (!strncmp(group, set_props->group_label[g_idx], strlen(group))) {
813
+ *group_idx = g_idx;
814
+ return set_idx;
815
+ }
816
+ }
817
+ }
818
+ return -1;
819
+}
820
+
821
+static void aspeed_gpio_get_pin(Object *obj, Visitor *v, const char *name,
822
+ void *opaque, Error **errp)
823
+{
824
+ int pin = 0xfff;
825
+ bool level = true;
826
+ char group[3];
827
+ AspeedGPIOState *s = ASPEED_GPIO(obj);
828
+ int set_idx, group_idx = 0;
829
+
830
+ if (sscanf(name, "gpio%2[A-Z]%1d", group, &pin) != 2) {
831
+ error_setg(errp, "%s: error reading %s", __func__, name);
832
+ return;
833
+ }
834
+ set_idx = get_set_idx(s, group, &group_idx);
835
+ if (set_idx == -1) {
836
+ error_setg(errp, "%s: invalid group %s", __func__, group);
837
+ return;
838
+ }
839
+ pin = pin + group_idx * GPIOS_PER_GROUP;
840
+ level = aspeed_gpio_get_pin_level(s, set_idx, pin);
841
+ visit_type_bool(v, name, &level, errp);
842
+}
843
+
844
+static void aspeed_gpio_set_pin(Object *obj, Visitor *v, const char *name,
845
+ void *opaque, Error **errp)
846
+{
847
+ Error *local_err = NULL;
848
+ bool level;
849
+ int pin = 0xfff;
850
+ char group[3];
851
+ AspeedGPIOState *s = ASPEED_GPIO(obj);
852
+ int set_idx, group_idx = 0;
853
+
854
+ visit_type_bool(v, name, &level, &local_err);
855
+ if (local_err) {
856
+ error_propagate(errp, local_err);
857
+ return;
858
+ }
859
+ if (sscanf(name, "gpio%2[A-Z]%1d", group, &pin) != 2) {
860
+ error_setg(errp, "%s: error reading %s", __func__, name);
861
+ return;
862
+ }
863
+ set_idx = get_set_idx(s, group, &group_idx);
864
+ if (set_idx == -1) {
865
+ error_setg(errp, "%s: invalid group %s", __func__, group);
866
+ return;
867
+ }
868
+ pin = pin + group_idx * GPIOS_PER_GROUP;
869
+ aspeed_gpio_set_pin_level(s, set_idx, pin, level);
870
+}
871
+
872
+/****************** Setup functions ******************/
873
+static const GPIOSetProperties ast2400_set_props[] = {
874
+ [0] = {0xffffffff, 0xffffffff, {"A", "B", "C", "D"} },
875
+ [1] = {0xffffffff, 0xffffffff, {"E", "F", "G", "H"} },
876
+ [2] = {0xffffffff, 0xffffffff, {"I", "J", "K", "L"} },
877
+ [3] = {0xffffffff, 0xffffffff, {"M", "N", "O", "P"} },
878
+ [4] = {0xffffffff, 0xffffffff, {"Q", "R", "S", "T"} },
879
+ [5] = {0xffffffff, 0x0000ffff, {"U", "V", "W", "X"} },
880
+ [6] = {0x0000000f, 0x0fffff0f, {"Y", "Z", "AA", "AB"} },
881
+};
882
+
883
+static const GPIOSetProperties ast2500_set_props[] = {
884
+ [0] = {0xffffffff, 0xffffffff, {"A", "B", "C", "D"} },
885
+ [1] = {0xffffffff, 0xffffffff, {"E", "F", "G", "H"} },
886
+ [2] = {0xffffffff, 0xffffffff, {"I", "J", "K", "L"} },
887
+ [3] = {0xffffffff, 0xffffffff, {"M", "N", "O", "P"} },
888
+ [4] = {0xffffffff, 0xffffffff, {"Q", "R", "S", "T"} },
889
+ [5] = {0xffffffff, 0x0000ffff, {"U", "V", "W", "X"} },
890
+ [6] = {0xffffff0f, 0x0fffff0f, {"Y", "Z", "AA", "AB"} },
891
+ [7] = {0x000000ff, 0x000000ff, {"AC"} },
892
+};
893
+
894
+static const MemoryRegionOps aspeed_gpio_ops = {
895
+ .read = aspeed_gpio_read,
896
+ .write = aspeed_gpio_write,
897
+ .endianness = DEVICE_LITTLE_ENDIAN,
898
+ .valid.min_access_size = 4,
899
+ .valid.max_access_size = 4,
900
+};
901
+
902
+static void aspeed_gpio_reset(DeviceState *dev)
903
+{
904
+ AspeedGPIOState *s = ASPEED_GPIO(dev);
905
+
906
+ /* TODO: respect the reset tolerance registers */
907
+ memset(s->sets, 0, sizeof(s->sets));
908
+}
909
+
910
+static void aspeed_gpio_realize(DeviceState *dev, Error **errp)
911
+{
912
+ AspeedGPIOState *s = ASPEED_GPIO(dev);
913
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
914
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
915
+ int pin;
916
+
917
+ /* Interrupt parent line */
918
+ sysbus_init_irq(sbd, &s->irq);
919
+
920
+ /* Individual GPIOs */
921
+ for (pin = 0; pin < agc->nr_gpio_pins; pin++) {
922
+ sysbus_init_irq(sbd, &s->gpios[pin]);
923
+ }
924
+
925
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_gpio_ops, s,
926
+ TYPE_ASPEED_GPIO, GPIO_3_6V_MEM_SIZE);
927
+
928
+ sysbus_init_mmio(sbd, &s->iomem);
929
+}
930
+
931
+static void aspeed_gpio_init(Object *obj)
932
+{
933
+ AspeedGPIOState *s = ASPEED_GPIO(obj);
934
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
935
+ int pin;
936
+
937
+ for (pin = 0; pin < agc->nr_gpio_pins; pin++) {
938
+ char *name;
939
+ int set_idx = pin / GPIOS_PER_SET;
940
+ int pin_idx = aspeed_adjust_pin(s, pin) - (set_idx * GPIOS_PER_SET);
941
+ int group_idx = pin_idx >> GPIO_GROUP_SHIFT;
942
+ const GPIOSetProperties *props = &agc->props[set_idx];
943
+
944
+ name = g_strdup_printf("gpio%s%d", props->group_label[group_idx],
945
+ pin_idx % GPIOS_PER_GROUP);
946
+ object_property_add(obj, name, "bool", aspeed_gpio_get_pin,
947
+ aspeed_gpio_set_pin, NULL, NULL, NULL);
948
+ }
949
+}
950
+
951
+static const VMStateDescription vmstate_gpio_regs = {
952
+ .name = TYPE_ASPEED_GPIO"/regs",
953
+ .version_id = 1,
954
+ .minimum_version_id = 1,
955
+ .fields = (VMStateField[]) {
956
+ VMSTATE_UINT32(data_value, GPIOSets),
957
+ VMSTATE_UINT32(data_read, GPIOSets),
958
+ VMSTATE_UINT32(direction, GPIOSets),
959
+ VMSTATE_UINT32(int_enable, GPIOSets),
960
+ VMSTATE_UINT32(int_sens_0, GPIOSets),
961
+ VMSTATE_UINT32(int_sens_1, GPIOSets),
962
+ VMSTATE_UINT32(int_sens_2, GPIOSets),
963
+ VMSTATE_UINT32(int_status, GPIOSets),
964
+ VMSTATE_UINT32(reset_tol, GPIOSets),
965
+ VMSTATE_UINT32(cmd_source_0, GPIOSets),
966
+ VMSTATE_UINT32(cmd_source_1, GPIOSets),
967
+ VMSTATE_UINT32(debounce_1, GPIOSets),
968
+ VMSTATE_UINT32(debounce_2, GPIOSets),
969
+ VMSTATE_UINT32(input_mask, GPIOSets),
970
+ VMSTATE_END_OF_LIST(),
971
+ }
972
+};
973
+
974
+static const VMStateDescription vmstate_aspeed_gpio = {
975
+ .name = TYPE_ASPEED_GPIO,
976
+ .version_id = 1,
977
+ .minimum_version_id = 1,
978
+ .fields = (VMStateField[]) {
979
+ VMSTATE_STRUCT_ARRAY(sets, AspeedGPIOState, ASPEED_GPIO_MAX_NR_SETS,
980
+ 1, vmstate_gpio_regs, GPIOSets),
981
+ VMSTATE_UINT32_ARRAY(debounce_regs, AspeedGPIOState,
982
+ ASPEED_GPIO_NR_DEBOUNCE_REGS),
983
+ VMSTATE_END_OF_LIST(),
984
+ }
985
+};
986
+
987
+static void aspeed_gpio_class_init(ObjectClass *klass, void *data)
988
+{
989
+ DeviceClass *dc = DEVICE_CLASS(klass);
990
+
991
+ dc->realize = aspeed_gpio_realize;
992
+ dc->reset = aspeed_gpio_reset;
993
+ dc->desc = "Aspeed GPIO Controller";
994
+ dc->vmsd = &vmstate_aspeed_gpio;
995
+}
996
+
997
+static void aspeed_gpio_ast2400_class_init(ObjectClass *klass, void *data)
998
+{
999
+ AspeedGPIOClass *agc = ASPEED_GPIO_CLASS(klass);
1000
+
1001
+ agc->props = ast2400_set_props;
1002
+ agc->nr_gpio_pins = 216;
1003
+ agc->nr_gpio_sets = 7;
1004
+ agc->gap = 196;
1005
+ agc->reg_table = aspeed_3_6v_gpios;
1006
+}
1007
+
1008
+static void aspeed_gpio_2500_class_init(ObjectClass *klass, void *data)
1009
+{
1010
+ AspeedGPIOClass *agc = ASPEED_GPIO_CLASS(klass);
1011
+
1012
+ agc->props = ast2500_set_props;
1013
+ agc->nr_gpio_pins = 228;
1014
+ agc->nr_gpio_sets = 8;
1015
+ agc->gap = 220;
1016
+ agc->reg_table = aspeed_3_6v_gpios;
1017
+}
1018
+
1019
+static const TypeInfo aspeed_gpio_info = {
1020
+ .name = TYPE_ASPEED_GPIO,
1021
+ .parent = TYPE_SYS_BUS_DEVICE,
1022
+ .instance_size = sizeof(AspeedGPIOState),
1023
+ .class_size = sizeof(AspeedGPIOClass),
1024
+ .class_init = aspeed_gpio_class_init,
1025
+ .abstract = true,
1026
+};
1027
+
1028
+static const TypeInfo aspeed_gpio_ast2400_info = {
1029
+ .name = TYPE_ASPEED_GPIO "-ast2400",
1030
+ .parent = TYPE_ASPEED_GPIO,
1031
+ .class_init = aspeed_gpio_ast2400_class_init,
1032
+ .instance_init = aspeed_gpio_init,
1033
+};
1034
+
1035
+static const TypeInfo aspeed_gpio_ast2500_info = {
1036
+ .name = TYPE_ASPEED_GPIO "-ast2500",
1037
+ .parent = TYPE_ASPEED_GPIO,
1038
+ .class_init = aspeed_gpio_2500_class_init,
1039
+ .instance_init = aspeed_gpio_init,
1040
+};
1041
+
1042
+static void aspeed_gpio_register_types(void)
1043
+{
1044
+ type_register_static(&aspeed_gpio_info);
1045
+ type_register_static(&aspeed_gpio_ast2400_info);
1046
+ type_register_static(&aspeed_gpio_ast2500_info);
1047
+}
1048
+
1049
+type_init(aspeed_gpio_register_types);
57
--
1050
--
58
2.25.1
1051
2.20.1
1052
1053
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Rashmica Gupta <rashmica.g@gmail.com>
2
2
3
In these cases, 't' did double-duty as zero source and
3
Signed-off-by: Rashmica Gupta <rashmica.g@gmail.com>
4
temporary destination. Split the two uses and narrow
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
5
the scope of the temp.
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
6
Message-id: 20190904070506.1052-3-clg@kaod.org
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220426163043.100432-47-richard.henderson@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
target/arm/translate-sve.c | 18 ++++++++++--------
9
include/hw/arm/aspeed_soc.h | 3 +++
13
1 file changed, 10 insertions(+), 8 deletions(-)
10
hw/arm/aspeed_soc.c | 17 +++++++++++++++++
11
2 files changed, 20 insertions(+)
14
12
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
15
--- a/include/hw/arm/aspeed_soc.h
18
+++ b/target/arm/translate-sve.c
16
+++ b/include/hw/arm/aspeed_soc.h
19
@@ -XXX,XX +XXX,XX @@ static bool do_brk3(DisasContext *s, arg_rprr_s *a,
17
@@ -XXX,XX +XXX,XX @@
20
TCGv_ptr n = tcg_temp_new_ptr();
18
#include "hw/watchdog/wdt_aspeed.h"
21
TCGv_ptr m = tcg_temp_new_ptr();
19
#include "hw/net/ftgmac100.h"
22
TCGv_ptr g = tcg_temp_new_ptr();
20
#include "target/arm/cpu.h"
23
- TCGv_i32 t = tcg_const_i32(FIELD_DP32(0, PREDDESC, OPRSZ, vsz));
21
+#include "hw/gpio/aspeed_gpio.h"
24
+ TCGv_i32 desc = tcg_constant_i32(FIELD_DP32(0, PREDDESC, OPRSZ, vsz));
22
25
23
#define ASPEED_SPIS_NUM 2
26
tcg_gen_addi_ptr(d, cpu_env, pred_full_reg_offset(s, a->rd));
24
#define ASPEED_WDTS_NUM 3
27
tcg_gen_addi_ptr(n, cpu_env, pred_full_reg_offset(s, a->rn));
25
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCState {
28
@@ -XXX,XX +XXX,XX @@ static bool do_brk3(DisasContext *s, arg_rprr_s *a,
26
AspeedSDMCState sdmc;
29
tcg_gen_addi_ptr(g, cpu_env, pred_full_reg_offset(s, a->pg));
27
AspeedWDTState wdt[ASPEED_WDTS_NUM];
30
28
FTGMAC100State ftgmac100[ASPEED_MACS_NUM];
31
if (a->s) {
29
+ AspeedGPIOState gpio;
32
- fn_s(t, d, n, m, g, t);
30
} AspeedSoCState;
33
+ TCGv_i32 t = tcg_temp_new_i32();
31
34
+ fn_s(t, d, n, m, g, desc);
32
#define TYPE_ASPEED_SOC "aspeed-soc"
35
do_pred_flags(t);
33
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCInfo {
36
+ tcg_temp_free_i32(t);
34
int spis_num;
37
} else {
35
const char *fmc_typename;
38
- fn(d, n, m, g, t);
36
const char **spi_typename;
39
+ fn(d, n, m, g, desc);
37
+ const char *gpio_typename;
40
}
38
int wdts_num;
41
tcg_temp_free_ptr(d);
39
const int *irqmap;
42
tcg_temp_free_ptr(n);
40
const hwaddr *memmap;
43
tcg_temp_free_ptr(m);
41
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
44
tcg_temp_free_ptr(g);
42
index XXXXXXX..XXXXXXX 100644
45
- tcg_temp_free_i32(t);
43
--- a/hw/arm/aspeed_soc.c
46
return true;
44
+++ b/hw/arm/aspeed_soc.c
45
@@ -XXX,XX +XXX,XX @@ static const AspeedSoCInfo aspeed_socs[] = {
46
.spis_num = 1,
47
.fmc_typename = "aspeed.smc.fmc",
48
.spi_typename = aspeed_soc_ast2400_typenames,
49
+ .gpio_typename = "aspeed.gpio-ast2400",
50
.wdts_num = 2,
51
.irqmap = aspeed_soc_ast2400_irqmap,
52
.memmap = aspeed_soc_ast2400_memmap,
53
@@ -XXX,XX +XXX,XX @@ static const AspeedSoCInfo aspeed_socs[] = {
54
.spis_num = 1,
55
.fmc_typename = "aspeed.smc.fmc",
56
.spi_typename = aspeed_soc_ast2400_typenames,
57
+ .gpio_typename = "aspeed.gpio-ast2400",
58
.wdts_num = 2,
59
.irqmap = aspeed_soc_ast2400_irqmap,
60
.memmap = aspeed_soc_ast2400_memmap,
61
@@ -XXX,XX +XXX,XX @@ static const AspeedSoCInfo aspeed_socs[] = {
62
.spis_num = 1,
63
.fmc_typename = "aspeed.smc.fmc",
64
.spi_typename = aspeed_soc_ast2400_typenames,
65
+ .gpio_typename = "aspeed.gpio-ast2400",
66
.wdts_num = 2,
67
.irqmap = aspeed_soc_ast2400_irqmap,
68
.memmap = aspeed_soc_ast2400_memmap,
69
@@ -XXX,XX +XXX,XX @@ static const AspeedSoCInfo aspeed_socs[] = {
70
.spis_num = 2,
71
.fmc_typename = "aspeed.smc.ast2500-fmc",
72
.spi_typename = aspeed_soc_ast2500_typenames,
73
+ .gpio_typename = "aspeed.gpio-ast2500",
74
.wdts_num = 3,
75
.irqmap = aspeed_soc_ast2500_irqmap,
76
.memmap = aspeed_soc_ast2500_memmap,
77
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
78
79
sysbus_init_child_obj(obj, "xdma", OBJECT(&s->xdma), sizeof(s->xdma),
80
TYPE_ASPEED_XDMA);
81
+
82
+ sysbus_init_child_obj(obj, "gpio", OBJECT(&s->gpio), sizeof(s->gpio),
83
+ sc->info->gpio_typename);
47
}
84
}
48
85
49
@@ -XXX,XX +XXX,XX @@ static bool do_brk2(DisasContext *s, arg_rpr_s *a,
86
static void aspeed_soc_realize(DeviceState *dev, Error **errp)
50
TCGv_ptr d = tcg_temp_new_ptr();
87
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
51
TCGv_ptr n = tcg_temp_new_ptr();
88
sc->info->memmap[ASPEED_XDMA]);
52
TCGv_ptr g = tcg_temp_new_ptr();
89
sysbus_connect_irq(SYS_BUS_DEVICE(&s->xdma), 0,
53
- TCGv_i32 t = tcg_const_i32(FIELD_DP32(0, PREDDESC, OPRSZ, vsz));
90
aspeed_soc_get_irq(s, ASPEED_XDMA));
54
+ TCGv_i32 desc = tcg_constant_i32(FIELD_DP32(0, PREDDESC, OPRSZ, vsz));
91
+
55
92
+ /* GPIO */
56
tcg_gen_addi_ptr(d, cpu_env, pred_full_reg_offset(s, a->rd));
93
+ object_property_set_bool(OBJECT(&s->gpio), true, "realized", &err);
57
tcg_gen_addi_ptr(n, cpu_env, pred_full_reg_offset(s, a->rn));
94
+ if (err) {
58
tcg_gen_addi_ptr(g, cpu_env, pred_full_reg_offset(s, a->pg));
95
+ error_propagate(errp, err);
59
96
+ return;
60
if (a->s) {
97
+ }
61
- fn_s(t, d, n, g, t);
98
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio), 0, sc->info->memmap[ASPEED_GPIO]);
62
+ TCGv_i32 t = tcg_temp_new_i32();
99
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
63
+ fn_s(t, d, n, g, desc);
100
+ aspeed_soc_get_irq(s, ASPEED_GPIO));
64
do_pred_flags(t);
65
+ tcg_temp_free_i32(t);
66
} else {
67
- fn(d, n, g, t);
68
+ fn(d, n, g, desc);
69
}
70
tcg_temp_free_ptr(d);
71
tcg_temp_free_ptr(n);
72
tcg_temp_free_ptr(g);
73
- tcg_temp_free_i32(t);
74
return true;
75
}
101
}
76
102
static Property aspeed_soc_properties[] = {
103
DEFINE_PROP_UINT32("num-cpus", AspeedSoCState, num_cpus, 0),
77
--
104
--
78
2.25.1
105
2.20.1
106
107
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
The Record bit in the Context Descriptor tells the SMMU to report fault
3
There are no QEMU Aspeed machines using the SoCs "ast2400-a0" or
4
events to the event queue. Since we don't cache the Record bit at the
4
"ast2400".
5
moment, access faults from a cached Context Descriptor are never
6
reported. Store the Record bit in the cached SMMUTransCfg.
7
5
8
Fixes: 9bde7f0674fe ("hw/arm/smmuv3: Implement translate callback")
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
7
Message-id: 20190904070506.1052-4-clg@kaod.org
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Eric Auger <eric.auger@redhat.com>
12
Message-id: 20220427111543.124620-1-jean-philippe@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
hw/arm/smmuv3-internal.h | 1 -
11
hw/arm/aspeed_soc.c | 26 --------------------------
16
include/hw/arm/smmu-common.h | 1 +
12
1 file changed, 26 deletions(-)
17
hw/arm/smmuv3.c | 14 +++++++-------
18
3 files changed, 8 insertions(+), 8 deletions(-)
19
13
20
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
14
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/smmuv3-internal.h
16
--- a/hw/arm/aspeed_soc.c
23
+++ b/hw/arm/smmuv3-internal.h
17
+++ b/hw/arm/aspeed_soc.c
24
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUEventInfo {
18
@@ -XXX,XX +XXX,XX @@ static const char *aspeed_soc_ast2500_typenames[] = {
25
SMMUEventType type;
19
26
uint32_t sid;
20
static const AspeedSoCInfo aspeed_socs[] = {
27
bool recorded;
21
{
28
- bool record_trans_faults;
22
- .name = "ast2400-a0",
29
bool inval_ste_allowed;
23
- .cpu_type = ARM_CPU_TYPE_NAME("arm926"),
30
union {
24
- .silicon_rev = AST2400_A0_SILICON_REV,
31
struct {
25
- .sram_size = 0x8000,
32
diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
26
- .spis_num = 1,
33
index XXXXXXX..XXXXXXX 100644
27
- .fmc_typename = "aspeed.smc.fmc",
34
--- a/include/hw/arm/smmu-common.h
28
- .spi_typename = aspeed_soc_ast2400_typenames,
35
+++ b/include/hw/arm/smmu-common.h
29
- .gpio_typename = "aspeed.gpio-ast2400",
36
@@ -XXX,XX +XXX,XX @@ typedef struct SMMUTransCfg {
30
- .wdts_num = 2,
37
bool disabled; /* smmu is disabled */
31
- .irqmap = aspeed_soc_ast2400_irqmap,
38
bool bypassed; /* translation is bypassed */
32
- .memmap = aspeed_soc_ast2400_memmap,
39
bool aborted; /* translation is aborted */
33
- .num_cpus = 1,
40
+ bool record_faults; /* record fault events */
34
- }, {
41
uint64_t ttb; /* TT base address */
35
.name = "ast2400-a1",
42
uint8_t oas; /* output address width */
36
.cpu_type = ARM_CPU_TYPE_NAME("arm926"),
43
uint8_t tbi; /* Top Byte Ignore */
37
.silicon_rev = AST2400_A1_SILICON_REV,
44
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
38
@@ -XXX,XX +XXX,XX @@ static const AspeedSoCInfo aspeed_socs[] = {
45
index XXXXXXX..XXXXXXX 100644
39
.irqmap = aspeed_soc_ast2400_irqmap,
46
--- a/hw/arm/smmuv3.c
40
.memmap = aspeed_soc_ast2400_memmap,
47
+++ b/hw/arm/smmuv3.c
41
.num_cpus = 1,
48
@@ -XXX,XX +XXX,XX @@ static int decode_cd(SMMUTransCfg *cfg, CD *cd, SMMUEventInfo *event)
42
- }, {
49
trace_smmuv3_decode_cd_tt(i, tt->tsz, tt->ttb, tt->granule_sz, tt->had);
43
- .name = "ast2400",
50
}
44
- .cpu_type = ARM_CPU_TYPE_NAME("arm926"),
51
45
- .silicon_rev = AST2400_A0_SILICON_REV,
52
- event->record_trans_faults = CD_R(cd);
46
- .sram_size = 0x8000,
53
+ cfg->record_faults = CD_R(cd);
47
- .spis_num = 1,
54
48
- .fmc_typename = "aspeed.smc.fmc",
55
return 0;
49
- .spi_typename = aspeed_soc_ast2400_typenames,
56
50
- .gpio_typename = "aspeed.gpio-ast2400",
57
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
51
- .wdts_num = 2,
58
52
- .irqmap = aspeed_soc_ast2400_irqmap,
59
tt = select_tt(cfg, addr);
53
- .memmap = aspeed_soc_ast2400_memmap,
60
if (!tt) {
54
- .num_cpus = 1,
61
- if (event.record_trans_faults) {
55
}, {
62
+ if (cfg->record_faults) {
56
.name = "ast2500-a1",
63
event.type = SMMU_EVT_F_TRANSLATION;
57
.cpu_type = ARM_CPU_TYPE_NAME("arm1176"),
64
event.u.f_translation.addr = addr;
65
event.u.f_translation.rnw = flag & 0x1;
66
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
67
if (cached_entry) {
68
if ((flag & IOMMU_WO) && !(cached_entry->entry.perm & IOMMU_WO)) {
69
status = SMMU_TRANS_ERROR;
70
- if (event.record_trans_faults) {
71
+ if (cfg->record_faults) {
72
event.type = SMMU_EVT_F_PERMISSION;
73
event.u.f_permission.addr = addr;
74
event.u.f_permission.rnw = flag & 0x1;
75
@@ -XXX,XX +XXX,XX @@ static IOMMUTLBEntry smmuv3_translate(IOMMUMemoryRegion *mr, hwaddr addr,
76
event.u.f_walk_eabt.addr2 = ptw_info.addr;
77
break;
78
case SMMU_PTW_ERR_TRANSLATION:
79
- if (event.record_trans_faults) {
80
+ if (cfg->record_faults) {
81
event.type = SMMU_EVT_F_TRANSLATION;
82
event.u.f_translation.addr = addr;
83
event.u.f_translation.rnw = flag & 0x1;
84
}
85
break;
86
case SMMU_PTW_ERR_ADDR_SIZE:
87
- if (event.record_trans_faults) {
88
+ if (cfg->record_faults) {
89
event.type = SMMU_EVT_F_ADDR_SIZE;
90
event.u.f_addr_size.addr = addr;
91
event.u.f_addr_size.rnw = flag & 0x1;
92
}
93
break;
94
case SMMU_PTW_ERR_ACCESS:
95
- if (event.record_trans_faults) {
96
+ if (cfg->record_faults) {
97
event.type = SMMU_EVT_F_ACCESS;
98
event.u.f_access.addr = addr;
99
event.u.f_access.rnw = flag & 0x1;
100
}
101
break;
102
case SMMU_PTW_ERR_PERMISSION:
103
- if (event.record_trans_faults) {
104
+ if (cfg->record_faults) {
105
event.type = SMMU_EVT_F_PERMISSION;
106
event.u.f_permission.addr = addr;
107
event.u.f_permission.rnw = flag & 0x1;
108
--
58
--
109
2.25.1
59
2.20.1
60
61
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Improve the naming of the different controller models to ease their
4
generation when initializing the SoC. The rename of the SMC types is
5
breaking migration compatibility.
6
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Message-id: 20190904070506.1052-5-clg@kaod.org
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-19-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/translate-a64.c | 21 +++++----------------
12
include/hw/arm/aspeed_soc.h | 3 ---
9
1 file changed, 5 insertions(+), 16 deletions(-)
13
hw/arm/aspeed_soc.c | 25 ++++++++++++-------------
14
hw/ssi/aspeed_smc.c | 12 ++++++------
15
3 files changed, 18 insertions(+), 22 deletions(-)
10
16
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
17
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
19
--- a/include/hw/arm/aspeed_soc.h
14
+++ b/target/arm/translate-a64.c
20
+++ b/include/hw/arm/aspeed_soc.h
15
@@ -XXX,XX +XXX,XX @@ static void handle_shri_with_rndacc(TCGv_i64 tcg_res, TCGv_i64 tcg_src,
21
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSoCInfo {
16
/* Deal with the rounding step */
22
uint32_t silicon_rev;
17
if (round) {
23
uint64_t sram_size;
18
if (extended_result) {
24
int spis_num;
19
- TCGv_i64 tcg_zero = tcg_const_i64(0);
25
- const char *fmc_typename;
20
+ TCGv_i64 tcg_zero = tcg_constant_i64(0);
26
- const char **spi_typename;
21
if (!is_u) {
27
- const char *gpio_typename;
22
/* take care of sign extending tcg_res */
28
int wdts_num;
23
tcg_gen_sari_i64(tcg_src_hi, tcg_src, 63);
29
const int *irqmap;
24
@@ -XXX,XX +XXX,XX @@ static void handle_shri_with_rndacc(TCGv_i64 tcg_res, TCGv_i64 tcg_src,
30
const hwaddr *memmap;
25
tcg_src, tcg_zero,
31
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
26
tcg_rnd, tcg_zero);
32
index XXXXXXX..XXXXXXX 100644
27
}
33
--- a/hw/arm/aspeed_soc.c
28
- tcg_temp_free_i64(tcg_zero);
34
+++ b/hw/arm/aspeed_soc.c
29
} else {
35
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2400_irqmap[] = {
30
tcg_gen_add_i64(tcg_src, tcg_src, tcg_rnd);
36
31
}
37
#define aspeed_soc_ast2500_irqmap aspeed_soc_ast2400_irqmap
32
@@ -XXX,XX +XXX,XX @@ static void handle_scalar_simd_shri(DisasContext *s,
38
39
-static const char *aspeed_soc_ast2400_typenames[] = { "aspeed.smc.spi" };
40
-static const char *aspeed_soc_ast2500_typenames[] = {
41
- "aspeed.smc.ast2500-spi1", "aspeed.smc.ast2500-spi2" };
42
-
43
static const AspeedSoCInfo aspeed_socs[] = {
44
{
45
.name = "ast2400-a1",
46
@@ -XXX,XX +XXX,XX @@ static const AspeedSoCInfo aspeed_socs[] = {
47
.silicon_rev = AST2400_A1_SILICON_REV,
48
.sram_size = 0x8000,
49
.spis_num = 1,
50
- .fmc_typename = "aspeed.smc.fmc",
51
- .spi_typename = aspeed_soc_ast2400_typenames,
52
- .gpio_typename = "aspeed.gpio-ast2400",
53
.wdts_num = 2,
54
.irqmap = aspeed_soc_ast2400_irqmap,
55
.memmap = aspeed_soc_ast2400_memmap,
56
@@ -XXX,XX +XXX,XX @@ static const AspeedSoCInfo aspeed_socs[] = {
57
.silicon_rev = AST2500_A1_SILICON_REV,
58
.sram_size = 0x9000,
59
.spis_num = 2,
60
- .fmc_typename = "aspeed.smc.ast2500-fmc",
61
- .spi_typename = aspeed_soc_ast2500_typenames,
62
- .gpio_typename = "aspeed.gpio-ast2500",
63
.wdts_num = 3,
64
.irqmap = aspeed_soc_ast2500_irqmap,
65
.memmap = aspeed_soc_ast2500_memmap,
66
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
67
AspeedSoCState *s = ASPEED_SOC(obj);
68
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
69
int i;
70
+ char socname[8];
71
+ char typename[64];
72
+
73
+ if (sscanf(sc->info->name, "%7s", socname) != 1) {
74
+ g_assert_not_reached();
75
+ }
76
77
for (i = 0; i < sc->info->num_cpus; i++) {
78
object_initialize_child(obj, "cpu[*]", OBJECT(&s->cpu[i]),
79
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
80
sysbus_init_child_obj(obj, "i2c", OBJECT(&s->i2c), sizeof(s->i2c),
81
TYPE_ASPEED_I2C);
82
83
+ snprintf(typename, sizeof(typename), "aspeed.fmc-%s", socname);
84
sysbus_init_child_obj(obj, "fmc", OBJECT(&s->fmc), sizeof(s->fmc),
85
- sc->info->fmc_typename);
86
+ typename);
87
object_property_add_alias(obj, "num-cs", OBJECT(&s->fmc), "num-cs",
88
&error_abort);
89
90
for (i = 0; i < sc->info->spis_num; i++) {
91
+ snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, socname);
92
sysbus_init_child_obj(obj, "spi[*]", OBJECT(&s->spi[i]),
93
- sizeof(s->spi[i]), sc->info->spi_typename[i]);
94
+ sizeof(s->spi[i]), typename);
33
}
95
}
34
96
35
if (round) {
97
sysbus_init_child_obj(obj, "sdmc", OBJECT(&s->sdmc), sizeof(s->sdmc),
36
- uint64_t round_const = 1ULL << (shift - 1);
98
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
37
- tcg_round = tcg_const_i64(round_const);
99
sysbus_init_child_obj(obj, "xdma", OBJECT(&s->xdma), sizeof(s->xdma),
38
+ tcg_round = tcg_constant_i64(1ULL << (shift - 1));
100
TYPE_ASPEED_XDMA);
39
} else {
101
40
tcg_round = NULL;
102
+ snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
41
}
103
sysbus_init_child_obj(obj, "gpio", OBJECT(&s->gpio), sizeof(s->gpio),
42
@@ -XXX,XX +XXX,XX @@ static void handle_scalar_simd_shri(DisasContext *s,
104
- sc->info->gpio_typename);
43
105
+ typename);
44
tcg_temp_free_i64(tcg_rn);
45
tcg_temp_free_i64(tcg_rd);
46
- if (round) {
47
- tcg_temp_free_i64(tcg_round);
48
- }
49
}
106
}
50
107
51
/* SHL/SLI - Scalar shift left */
108
static void aspeed_soc_realize(DeviceState *dev, Error **errp)
52
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q,
109
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
53
tcg_final = tcg_const_i64(0);
110
index XXXXXXX..XXXXXXX 100644
54
111
--- a/hw/ssi/aspeed_smc.c
55
if (round) {
112
+++ b/hw/ssi/aspeed_smc.c
56
- uint64_t round_const = 1ULL << (shift - 1);
113
@@ -XXX,XX +XXX,XX @@ static const AspeedSegments aspeed_segments_ast2500_spi2[] = {
57
- tcg_round = tcg_const_i64(round_const);
114
58
+ tcg_round = tcg_constant_i64(1ULL << (shift - 1));
115
static const AspeedSMCController controllers[] = {
59
} else {
116
{
60
tcg_round = NULL;
117
- .name = "aspeed.smc.smc",
61
}
118
+ .name = "aspeed.smc-ast2400",
62
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q,
119
.r_conf = R_CONF,
63
write_vec_element(s, tcg_final, rd, 1, MO_64);
120
.r_ce_ctrl = R_CE_CTRL,
64
}
121
.r_ctrl0 = R_CTRL0,
65
122
@@ -XXX,XX +XXX,XX @@ static const AspeedSMCController controllers[] = {
66
- if (round) {
123
.has_dma = false,
67
- tcg_temp_free_i64(tcg_round);
124
.nregs = ASPEED_SMC_R_SMC_MAX,
68
- }
125
}, {
69
tcg_temp_free_i64(tcg_rn);
126
- .name = "aspeed.smc.fmc",
70
tcg_temp_free_i64(tcg_rd);
127
+ .name = "aspeed.fmc-ast2400",
71
tcg_temp_free_i32(tcg_rd_narrowed);
128
.r_conf = R_CONF,
72
@@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
129
.r_ce_ctrl = R_CE_CTRL,
73
}
130
.r_ctrl0 = R_CTRL0,
74
131
@@ -XXX,XX +XXX,XX @@ static const AspeedSMCController controllers[] = {
75
if (size == 3) {
132
.has_dma = true,
76
- TCGv_i64 tcg_shift = tcg_const_i64(shift);
133
.nregs = ASPEED_SMC_R_MAX,
77
+ TCGv_i64 tcg_shift = tcg_constant_i64(shift);
134
}, {
78
static NeonGenTwo64OpEnvFn * const fns[2][2] = {
135
- .name = "aspeed.smc.spi",
79
{ gen_helper_neon_qshl_s64, gen_helper_neon_qshlu_s64 },
136
+ .name = "aspeed.spi1-ast2400",
80
{ NULL, gen_helper_neon_qshl_u64 },
137
.r_conf = R_SPI_CONF,
81
@@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
138
.r_ce_ctrl = 0xff,
82
139
.r_ctrl0 = R_SPI_CTRL0,
83
tcg_temp_free_i64(tcg_op);
140
@@ -XXX,XX +XXX,XX @@ static const AspeedSMCController controllers[] = {
84
}
141
.has_dma = false,
85
- tcg_temp_free_i64(tcg_shift);
142
.nregs = ASPEED_SMC_R_SPI_MAX,
86
clear_vec_high(s, is_q, rd);
143
}, {
87
} else {
144
- .name = "aspeed.smc.ast2500-fmc",
88
- TCGv_i32 tcg_shift = tcg_const_i32(shift);
145
+ .name = "aspeed.fmc-ast2500",
89
+ TCGv_i32 tcg_shift = tcg_constant_i32(shift);
146
.r_conf = R_CONF,
90
static NeonGenTwoOpEnvFn * const fns[2][2][3] = {
147
.r_ce_ctrl = R_CE_CTRL,
91
{
148
.r_ctrl0 = R_CTRL0,
92
{ gen_helper_neon_qshl_s8,
149
@@ -XXX,XX +XXX,XX @@ static const AspeedSMCController controllers[] = {
93
@@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q,
150
.has_dma = true,
94
151
.nregs = ASPEED_SMC_R_MAX,
95
tcg_temp_free_i32(tcg_op);
152
}, {
96
}
153
- .name = "aspeed.smc.ast2500-spi1",
97
- tcg_temp_free_i32(tcg_shift);
154
+ .name = "aspeed.spi1-ast2500",
98
155
.r_conf = R_CONF,
99
if (!scalar) {
156
.r_ce_ctrl = R_CE_CTRL,
100
clear_vec_high(s, is_q, rd);
157
.r_ctrl0 = R_CTRL0,
158
@@ -XXX,XX +XXX,XX @@ static const AspeedSMCController controllers[] = {
159
.has_dma = false,
160
.nregs = ASPEED_SMC_R_MAX,
161
}, {
162
- .name = "aspeed.smc.ast2500-spi2",
163
+ .name = "aspeed.spi2-ast2500",
164
.r_conf = R_CONF,
165
.r_ce_ctrl = R_CE_CTRL,
166
.r_ctrl0 = R_CTRL0,
101
--
167
--
102
2.25.1
168
2.20.1
169
170
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
The FMC controller on the Aspeed SoCs support DMA to access the flash
4
modules. It can operate in a normal mode, to copy to or from the flash
5
module mapping window, or in a checksum calculation mode, to evaluate
6
the best clock settings for reads.
7
8
The model introduces two custom address spaces for DMAs: one for the
9
AHB window of the FMC flash devices and one for the DRAM. The latter
10
is populated using a "dram" link set from the machine with the RAM
11
container region.
12
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
Acked-by: Joel Stanley <joel@jms.id.au>
15
Message-id: 20190904070506.1052-6-clg@kaod.org
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-48-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
18
---
8
target/arm/translate-sve.c | 54 ++++++++++----------------------------
19
include/hw/ssi/aspeed_smc.h | 6 +
9
1 file changed, 14 insertions(+), 40 deletions(-)
20
hw/arm/aspeed.c | 2 +
10
21
hw/arm/aspeed_soc.c | 2 +
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
22
hw/ssi/aspeed_smc.c | 222 +++++++++++++++++++++++++++++++++++-
23
4 files changed, 226 insertions(+), 6 deletions(-)
24
25
diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
12
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
27
--- a/include/hw/ssi/aspeed_smc.h
14
+++ b/target/arm/translate-sve.c
28
+++ b/include/hw/ssi/aspeed_smc.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a,
29
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSMCController {
16
return true;
30
hwaddr flash_window_base;
17
}
31
uint32_t flash_window_size;
18
32
bool has_dma;
19
- desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
33
+ hwaddr dma_flash_mask;
20
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
34
+ hwaddr dma_dram_mask;
21
temp = tcg_temp_new_i64();
35
uint32_t nregs;
22
t_zn = tcg_temp_new_ptr();
36
} AspeedSMCController;
23
t_pg = tcg_temp_new_ptr();
37
24
@@ -XXX,XX +XXX,XX @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a,
38
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSMCState {
25
fn(temp, t_zn, t_pg, desc);
39
/* for DMA support */
26
tcg_temp_free_ptr(t_zn);
40
uint64_t sdram_base;
27
tcg_temp_free_ptr(t_pg);
41
28
- tcg_temp_free_i32(desc);
42
+ AddressSpace flash_as;
29
43
+ MemoryRegion *dram_mr;
30
write_fp_dreg(s, a->rd, temp);
44
+ AddressSpace dram_as;
31
tcg_temp_free_i64(temp);
45
+
32
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
46
AspeedSMCFlash *flashes;
33
TCGv_i64 start, TCGv_i64 incr)
47
34
{
48
uint8_t snoop_index;
35
unsigned vsz = vec_full_reg_size(s);
49
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
36
- TCGv_i32 desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
50
index XXXXXXX..XXXXXXX 100644
37
+ TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
51
--- a/hw/arm/aspeed.c
38
TCGv_ptr t_zd = tcg_temp_new_ptr();
52
+++ b/hw/arm/aspeed.c
39
53
@@ -XXX,XX +XXX,XX @@ static void aspeed_board_init(MachineState *machine,
40
tcg_gen_addi_ptr(t_zd, cpu_env, vec_full_reg_offset(s, rd));
54
&error_abort);
41
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
55
object_property_set_int(OBJECT(&bmc->soc), machine->smp.cpus, "num-cpus",
42
tcg_temp_free_i32(i32);
56
&error_abort);
43
}
57
+ object_property_set_link(OBJECT(&bmc->soc), OBJECT(&bmc->ram_container),
44
tcg_temp_free_ptr(t_zd);
58
+ "dram", &error_abort);
45
- tcg_temp_free_i32(desc);
59
if (machine->kernel_filename) {
46
}
60
/*
47
61
* When booting with a -kernel command line there is no u-boot
48
static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
62
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
49
@@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
63
index XXXXXXX..XXXXXXX 100644
50
nptr = tcg_temp_new_ptr();
64
--- a/hw/arm/aspeed_soc.c
51
tcg_gen_addi_ptr(dptr, cpu_env, vec_full_reg_offset(s, rd));
65
+++ b/hw/arm/aspeed_soc.c
52
tcg_gen_addi_ptr(nptr, cpu_env, vec_full_reg_offset(s, rn));
66
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
53
- desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
67
typename);
54
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
68
object_property_add_alias(obj, "num-cs", OBJECT(&s->fmc), "num-cs",
55
69
&error_abort);
56
switch (esz) {
70
+ object_property_add_alias(obj, "dram", OBJECT(&s->fmc), "dram",
57
case MO_8:
71
+ &error_abort);
58
@@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn,
72
59
73
for (i = 0; i < sc->info->spis_num; i++) {
60
tcg_temp_free_ptr(dptr);
74
snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, socname);
61
tcg_temp_free_ptr(nptr);
75
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
62
- tcg_temp_free_i32(desc);
76
index XXXXXXX..XXXXXXX 100644
63
}
77
--- a/hw/ssi/aspeed_smc.c
64
78
+++ b/hw/ssi/aspeed_smc.c
65
static bool trans_CNT_r(DisasContext *s, arg_CNT_r *a)
79
@@ -XXX,XX +XXX,XX @@
66
@@ -XXX,XX +XXX,XX @@ static void do_cpy_m(DisasContext *s, int esz, int rd, int rn, int pg,
80
#include "qemu/log.h"
67
gen_helper_sve_cpy_m_s, gen_helper_sve_cpy_m_d,
81
#include "qemu/module.h"
68
};
82
#include "qemu/error-report.h"
69
unsigned vsz = vec_full_reg_size(s);
83
+#include "qapi/error.h"
70
- TCGv_i32 desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
84
+#include "exec/address-spaces.h"
71
+ TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
85
72
TCGv_ptr t_zd = tcg_temp_new_ptr();
86
#include "hw/irq.h"
73
TCGv_ptr t_zn = tcg_temp_new_ptr();
87
#include "hw/qdev-properties.h"
74
TCGv_ptr t_pg = tcg_temp_new_ptr();
88
@@ -XXX,XX +XXX,XX @@
75
@@ -XXX,XX +XXX,XX @@ static void do_cpy_m(DisasContext *s, int esz, int rd, int rn, int pg,
89
#define DMA_CTRL_FREQ_SHIFT 4
76
tcg_temp_free_ptr(t_zd);
90
#define DMA_CTRL_MODE (1 << 3)
77
tcg_temp_free_ptr(t_zn);
91
#define DMA_CTRL_CKSUM (1 << 2)
78
tcg_temp_free_ptr(t_pg);
92
-#define DMA_CTRL_DIR (1 << 1)
79
- tcg_temp_free_i32(desc);
93
-#define DMA_CTRL_EN (1 << 0)
80
}
94
+#define DMA_CTRL_WRITE (1 << 1)
81
95
+#define DMA_CTRL_ENABLE (1 << 0)
82
static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
96
83
@@ -XXX,XX +XXX,XX @@ static void do_insr_i64(DisasContext *s, arg_rrr_esz *a, TCGv_i64 val)
97
/* DMA Flash Side Address */
84
gen_helper_sve_insr_s, gen_helper_sve_insr_d,
98
#define R_DMA_FLASH_ADDR (0x84 / 4)
85
};
99
@@ -XXX,XX +XXX,XX @@
86
unsigned vsz = vec_full_reg_size(s);
100
#define ASPEED_SOC_SPI_FLASH_BASE 0x30000000
87
- TCGv_i32 desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
101
#define ASPEED_SOC_SPI2_FLASH_BASE 0x38000000
88
+ TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
102
89
TCGv_ptr t_zd = tcg_temp_new_ptr();
103
+/*
90
TCGv_ptr t_zn = tcg_temp_new_ptr();
104
+ * DMA DRAM addresses should be 4 bytes aligned and the valid address
91
105
+ * range is 0x40000000 - 0x5FFFFFFF (AST2400)
92
@@ -XXX,XX +XXX,XX @@ static void do_insr_i64(DisasContext *s, arg_rrr_esz *a, TCGv_i64 val)
106
+ * 0x80000000 - 0xBFFFFFFF (AST2500)
93
107
+ *
94
tcg_temp_free_ptr(t_zd);
108
+ * DMA flash addresses should be 4 bytes aligned and the valid address
95
tcg_temp_free_ptr(t_zn);
109
+ * range is 0x20000000 - 0x2FFFFFFF.
96
- tcg_temp_free_i32(desc);
110
+ *
97
}
111
+ * DMA length is from 4 bytes to 32MB
98
112
+ * 0: 4 bytes
99
static bool trans_INSR_f(DisasContext *s, arg_rrr_esz *a)
113
+ * 0x7FFFFF: 32M bytes
100
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred3(DisasContext *s, arg_rrr_esz *a, bool high_odd,
114
+ */
101
TCGv_ptr t_d = tcg_temp_new_ptr();
115
+#define DMA_DRAM_ADDR(s, val) ((s)->sdram_base | \
102
TCGv_ptr t_n = tcg_temp_new_ptr();
116
+ ((val) & (s)->ctrl->dma_dram_mask))
103
TCGv_ptr t_m = tcg_temp_new_ptr();
117
+#define DMA_FLASH_ADDR(s, val) ((s)->ctrl->flash_window_base | \
104
- TCGv_i32 t_desc;
118
+ ((val) & (s)->ctrl->dma_flash_mask))
105
uint32_t desc = 0;
119
+#define DMA_LENGTH(val) ((val) & 0x01FFFFFC)
106
120
+
107
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz);
121
/* Flash opcodes. */
108
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred3(DisasContext *s, arg_rrr_esz *a, bool high_odd,
122
#define SPI_OP_READ 0x03 /* Read data bytes (low frequency) */
109
tcg_gen_addi_ptr(t_d, cpu_env, pred_full_reg_offset(s, a->rd));
123
110
tcg_gen_addi_ptr(t_n, cpu_env, pred_full_reg_offset(s, a->rn));
124
@@ -XXX,XX +XXX,XX @@ static const AspeedSMCController controllers[] = {
111
tcg_gen_addi_ptr(t_m, cpu_env, pred_full_reg_offset(s, a->rm));
125
.flash_window_base = ASPEED_SOC_FMC_FLASH_BASE,
112
- t_desc = tcg_const_i32(desc);
126
.flash_window_size = 0x10000000,
113
127
.has_dma = true,
114
- fn(t_d, t_n, t_m, t_desc);
128
+ .dma_flash_mask = 0x0FFFFFFC,
115
+ fn(t_d, t_n, t_m, tcg_constant_i32(desc));
129
+ .dma_dram_mask = 0x1FFFFFFC,
116
130
.nregs = ASPEED_SMC_R_MAX,
117
tcg_temp_free_ptr(t_d);
131
}, {
118
tcg_temp_free_ptr(t_n);
132
.name = "aspeed.spi1-ast2400",
119
tcg_temp_free_ptr(t_m);
133
@@ -XXX,XX +XXX,XX @@ static const AspeedSMCController controllers[] = {
120
- tcg_temp_free_i32(t_desc);
134
.flash_window_base = ASPEED_SOC_FMC_FLASH_BASE,
121
return true;
135
.flash_window_size = 0x10000000,
122
}
136
.has_dma = true,
123
137
+ .dma_flash_mask = 0x0FFFFFFC,
124
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd,
138
+ .dma_dram_mask = 0x3FFFFFFC,
125
unsigned vsz = pred_full_reg_size(s);
139
.nregs = ASPEED_SMC_R_MAX,
126
TCGv_ptr t_d = tcg_temp_new_ptr();
140
}, {
127
TCGv_ptr t_n = tcg_temp_new_ptr();
141
.name = "aspeed.spi1-ast2500",
128
- TCGv_i32 t_desc;
142
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_reset(DeviceState *d)
129
uint32_t desc = 0;
143
130
144
memset(s->regs, 0, sizeof s->regs);
131
tcg_gen_addi_ptr(t_d, cpu_env, pred_full_reg_offset(s, a->rd));
145
132
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd,
146
- /* Pretend DMA is done (u-boot initialization) */
133
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz);
147
- s->regs[R_INTR_CTRL] = INTR_CTRL_DMA_STATUS;
134
desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz);
148
-
135
desc = FIELD_DP32(desc, PREDDESC, DATA, high_odd);
149
/* Unselect all slaves */
136
- t_desc = tcg_const_i32(desc);
150
for (i = 0; i < s->num_cs; ++i) {
137
151
s->regs[s->r_ctrl0 + i] |= CTRL_CE_STOP_ACTIVE;
138
- fn(t_d, t_n, t_desc);
152
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
139
+ fn(t_d, t_n, tcg_constant_i32(desc));
153
addr == s->r_ce_ctrl ||
140
154
addr == R_INTR_CTRL ||
141
- tcg_temp_free_i32(t_desc);
155
addr == R_DUMMY_DATA ||
142
tcg_temp_free_ptr(t_d);
156
+ (s->ctrl->has_dma && addr == R_DMA_CTRL) ||
143
tcg_temp_free_ptr(t_n);
157
+ (s->ctrl->has_dma && addr == R_DMA_FLASH_ADDR) ||
144
return true;
158
+ (s->ctrl->has_dma && addr == R_DMA_DRAM_ADDR) ||
145
@@ -XXX,XX +XXX,XX @@ static void find_last_active(DisasContext *s, TCGv_i32 ret, int esz, int pg)
159
+ (s->ctrl->has_dma && addr == R_DMA_LEN) ||
146
* round up, as we do elsewhere, because we need the exact size.
160
+ (s->ctrl->has_dma && addr == R_DMA_CHECKSUM) ||
147
*/
161
(addr >= R_SEG_ADDR0 && addr < R_SEG_ADDR0 + s->ctrl->max_slaves) ||
148
TCGv_ptr t_p = tcg_temp_new_ptr();
162
(addr >= s->r_ctrl0 && addr < s->r_ctrl0 + s->ctrl->max_slaves)) {
149
- TCGv_i32 t_desc;
163
return s->regs[addr];
150
unsigned desc = 0;
164
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
151
152
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, pred_full_reg_size(s));
153
desc = FIELD_DP32(desc, PREDDESC, ESZ, esz);
154
155
tcg_gen_addi_ptr(t_p, cpu_env, pred_full_reg_offset(s, pg));
156
- t_desc = tcg_const_i32(desc);
157
158
- gen_helper_sve_last_active_element(ret, t_p, t_desc);
159
+ gen_helper_sve_last_active_element(ret, t_p, tcg_constant_i32(desc));
160
161
- tcg_temp_free_i32(t_desc);
162
tcg_temp_free_ptr(t_p);
163
}
164
165
@@ -XXX,XX +XXX,XX @@ static void do_cntp(DisasContext *s, TCGv_i64 val, int esz, int pn, int pg)
166
TCGv_ptr t_pn = tcg_temp_new_ptr();
167
TCGv_ptr t_pg = tcg_temp_new_ptr();
168
unsigned desc = 0;
169
- TCGv_i32 t_desc;
170
171
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, psz);
172
desc = FIELD_DP32(desc, PREDDESC, ESZ, esz);
173
174
tcg_gen_addi_ptr(t_pn, cpu_env, pred_full_reg_offset(s, pn));
175
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
176
- t_desc = tcg_const_i32(desc);
177
178
- gen_helper_sve_cntp(val, t_pn, t_pg, t_desc);
179
+ gen_helper_sve_cntp(val, t_pn, t_pg, tcg_constant_i32(desc));
180
tcg_temp_free_ptr(t_pn);
181
tcg_temp_free_ptr(t_pg);
182
- tcg_temp_free_i32(t_desc);
183
}
165
}
184
}
166
}
185
167
186
@@ -XXX,XX +XXX,XX @@ static void do_reduce(DisasContext *s, arg_rpr_esz *a,
168
+/*
169
+ * Accumulate the result of the reads to provide a checksum that will
170
+ * be used to validate the read timing settings.
171
+ */
172
+static void aspeed_smc_dma_checksum(AspeedSMCState *s)
173
+{
174
+ MemTxResult result;
175
+ uint32_t data;
176
+
177
+ if (s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE) {
178
+ qemu_log_mask(LOG_GUEST_ERROR,
179
+ "%s: invalid direction for DMA checksum\n", __func__);
180
+ return;
181
+ }
182
+
183
+ while (s->regs[R_DMA_LEN]) {
184
+ data = address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLASH_ADDR],
185
+ MEMTXATTRS_UNSPECIFIED, &result);
186
+ if (result != MEMTX_OK) {
187
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash read failed @%08x\n",
188
+ __func__, s->regs[R_DMA_FLASH_ADDR]);
189
+ return;
190
+ }
191
+
192
+ /*
193
+ * When the DMA is on-going, the DMA registers are updated
194
+ * with the current working addresses and length.
195
+ */
196
+ s->regs[R_DMA_CHECKSUM] += data;
197
+ s->regs[R_DMA_FLASH_ADDR] += 4;
198
+ s->regs[R_DMA_LEN] -= 4;
199
+ }
200
+}
201
+
202
+static void aspeed_smc_dma_rw(AspeedSMCState *s)
203
+{
204
+ MemTxResult result;
205
+ uint32_t data;
206
+
207
+ while (s->regs[R_DMA_LEN]) {
208
+ if (s->regs[R_DMA_CTRL] & DMA_CTRL_WRITE) {
209
+ data = address_space_ldl_le(&s->dram_as, s->regs[R_DMA_DRAM_ADDR],
210
+ MEMTXATTRS_UNSPECIFIED, &result);
211
+ if (result != MEMTX_OK) {
212
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM read failed @%08x\n",
213
+ __func__, s->regs[R_DMA_DRAM_ADDR]);
214
+ return;
215
+ }
216
+
217
+ address_space_stl_le(&s->flash_as, s->regs[R_DMA_FLASH_ADDR],
218
+ data, MEMTXATTRS_UNSPECIFIED, &result);
219
+ if (result != MEMTX_OK) {
220
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash write failed @%08x\n",
221
+ __func__, s->regs[R_DMA_FLASH_ADDR]);
222
+ return;
223
+ }
224
+ } else {
225
+ data = address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLASH_ADDR],
226
+ MEMTXATTRS_UNSPECIFIED, &result);
227
+ if (result != MEMTX_OK) {
228
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash read failed @%08x\n",
229
+ __func__, s->regs[R_DMA_FLASH_ADDR]);
230
+ return;
231
+ }
232
+
233
+ address_space_stl_le(&s->dram_as, s->regs[R_DMA_DRAM_ADDR],
234
+ data, MEMTXATTRS_UNSPECIFIED, &result);
235
+ if (result != MEMTX_OK) {
236
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM write failed @%08x\n",
237
+ __func__, s->regs[R_DMA_DRAM_ADDR]);
238
+ return;
239
+ }
240
+ }
241
+
242
+ /*
243
+ * When the DMA is on-going, the DMA registers are updated
244
+ * with the current working addresses and length.
245
+ */
246
+ s->regs[R_DMA_FLASH_ADDR] += 4;
247
+ s->regs[R_DMA_DRAM_ADDR] += 4;
248
+ s->regs[R_DMA_LEN] -= 4;
249
+ }
250
+}
251
+
252
+static void aspeed_smc_dma_stop(AspeedSMCState *s)
253
+{
254
+ /*
255
+ * When the DMA is disabled, INTR_CTRL_DMA_STATUS=0 means the
256
+ * engine is idle
257
+ */
258
+ s->regs[R_INTR_CTRL] &= ~INTR_CTRL_DMA_STATUS;
259
+ s->regs[R_DMA_CHECKSUM] = 0;
260
+
261
+ /*
262
+ * Lower the DMA irq in any case. The IRQ control register could
263
+ * have been cleared before disabling the DMA.
264
+ */
265
+ qemu_irq_lower(s->irq);
266
+}
267
+
268
+/*
269
+ * When INTR_CTRL_DMA_STATUS=1, the DMA has completed and a new DMA
270
+ * can start even if the result of the previous was not collected.
271
+ */
272
+static bool aspeed_smc_dma_in_progress(AspeedSMCState *s)
273
+{
274
+ return s->regs[R_DMA_CTRL] & DMA_CTRL_ENABLE &&
275
+ !(s->regs[R_INTR_CTRL] & INTR_CTRL_DMA_STATUS);
276
+}
277
+
278
+static void aspeed_smc_dma_done(AspeedSMCState *s)
279
+{
280
+ s->regs[R_INTR_CTRL] |= INTR_CTRL_DMA_STATUS;
281
+ if (s->regs[R_INTR_CTRL] & INTR_CTRL_DMA_EN) {
282
+ qemu_irq_raise(s->irq);
283
+ }
284
+}
285
+
286
+static void aspeed_smc_dma_ctrl(AspeedSMCState *s, uint64_t dma_ctrl)
287
+{
288
+ if (!(dma_ctrl & DMA_CTRL_ENABLE)) {
289
+ s->regs[R_DMA_CTRL] = dma_ctrl;
290
+
291
+ aspeed_smc_dma_stop(s);
292
+ return;
293
+ }
294
+
295
+ if (aspeed_smc_dma_in_progress(s)) {
296
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: DMA in progress\n", __func__);
297
+ return;
298
+ }
299
+
300
+ s->regs[R_DMA_CTRL] = dma_ctrl;
301
+
302
+ if (s->regs[R_DMA_CTRL] & DMA_CTRL_CKSUM) {
303
+ aspeed_smc_dma_checksum(s);
304
+ } else {
305
+ aspeed_smc_dma_rw(s);
306
+ }
307
+
308
+ aspeed_smc_dma_done(s);
309
+}
310
+
311
static void aspeed_smc_write(void *opaque, hwaddr addr, uint64_t data,
312
unsigned int size)
187
{
313
{
188
unsigned vsz = vec_full_reg_size(s);
314
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_write(void *opaque, hwaddr addr, uint64_t data,
189
unsigned p2vsz = pow2ceil(vsz);
315
}
190
- TCGv_i32 t_desc = tcg_const_i32(simd_desc(vsz, vsz, p2vsz));
316
} else if (addr == R_DUMMY_DATA) {
191
+ TCGv_i32 t_desc = tcg_constant_i32(simd_desc(vsz, vsz, p2vsz));
317
s->regs[addr] = value & 0xff;
192
TCGv_ptr t_zn, t_pg, status;
318
+ } else if (addr == R_INTR_CTRL) {
193
TCGv_i64 temp;
319
+ s->regs[addr] = value;
194
320
+ } else if (s->ctrl->has_dma && addr == R_DMA_CTRL) {
195
@@ -XXX,XX +XXX,XX @@ static void do_reduce(DisasContext *s, arg_rpr_esz *a,
321
+ aspeed_smc_dma_ctrl(s, value);
196
tcg_temp_free_ptr(t_zn);
322
+ } else if (s->ctrl->has_dma && addr == R_DMA_DRAM_ADDR) {
197
tcg_temp_free_ptr(t_pg);
323
+ s->regs[addr] = DMA_DRAM_ADDR(s, value);
198
tcg_temp_free_ptr(status);
324
+ } else if (s->ctrl->has_dma && addr == R_DMA_FLASH_ADDR) {
199
- tcg_temp_free_i32(t_desc);
325
+ s->regs[addr] = DMA_FLASH_ADDR(s, value);
200
326
+ } else if (s->ctrl->has_dma && addr == R_DMA_LEN) {
201
write_fp_dreg(s, a->rd, temp);
327
+ s->regs[addr] = DMA_LENGTH(value);
202
tcg_temp_free_i64(temp);
328
} else {
203
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
329
qemu_log_mask(LOG_UNIMP, "%s: not implemented: 0x%" HWADDR_PRIx "\n",
204
tcg_gen_addi_ptr(t_rm, cpu_env, vec_full_reg_offset(s, a->rm));
330
__func__, addr);
205
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, a->pg));
331
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_smc_ops = {
206
t_fpst = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
332
.valid.unaligned = true,
207
- t_desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
333
};
208
+ t_desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
334
209
335
+
210
fns[a->esz - 1](t_val, t_val, t_rm, t_pg, t_fpst, t_desc);
336
+/*
211
337
+ * Initialize the custom address spaces for DMAs
212
- tcg_temp_free_i32(t_desc);
338
+ */
213
tcg_temp_free_ptr(t_fpst);
339
+static void aspeed_smc_dma_setup(AspeedSMCState *s, Error **errp)
214
tcg_temp_free_ptr(t_pg);
340
+{
215
tcg_temp_free_ptr(t_rm);
341
+ char *name;
216
@@ -XXX,XX +XXX,XX @@ static void do_fp_scalar(DisasContext *s, int zd, int zn, int pg, bool is_fp16,
342
+
217
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
343
+ if (!s->dram_mr) {
218
344
+ error_setg(errp, TYPE_ASPEED_SMC ": 'dram' link not set");
219
status = fpstatus_ptr(is_fp16 ? FPST_FPCR_F16 : FPST_FPCR);
345
+ return;
220
- desc = tcg_const_i32(simd_desc(vsz, vsz, 0));
346
+ }
221
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
347
+
222
fn(t_zd, t_zn, t_pg, scalar, status, desc);
348
+ name = g_strdup_printf("%s-dma-flash", s->ctrl->name);
223
349
+ address_space_init(&s->flash_as, &s->mmio_flash, name);
224
- tcg_temp_free_i32(desc);
350
+ g_free(name);
225
tcg_temp_free_ptr(status);
351
+
226
tcg_temp_free_ptr(t_pg);
352
+ name = g_strdup_printf("%s-dma-dram", s->ctrl->name);
227
tcg_temp_free_ptr(t_zn);
353
+ address_space_init(&s->dram_as, s->dram_mr, name);
228
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr,
354
+ g_free(name);
355
+}
356
+
357
static void aspeed_smc_realize(DeviceState *dev, Error **errp)
229
{
358
{
230
unsigned vsz = vec_full_reg_size(s);
359
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
231
TCGv_ptr t_pg;
360
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_realize(DeviceState *dev, Error **errp)
232
- TCGv_i32 t_desc;
361
s->num_cs = s->ctrl->max_slaves;
233
int desc = 0;
234
235
/*
236
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr,
237
}
362
}
238
363
239
desc = simd_desc(vsz, vsz, zt | desc);
364
+ /* DMA irq. Keep it first for the initialization in the SoC */
240
- t_desc = tcg_const_i32(desc);
365
+ sysbus_init_irq(sbd, &s->irq);
241
t_pg = tcg_temp_new_ptr();
366
+
242
367
s->spi = ssi_create_bus(dev, "spi");
243
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
368
244
- fn(cpu_env, t_pg, addr, t_desc);
369
/* Setup cs_lines for slaves */
245
+ fn(cpu_env, t_pg, addr, tcg_constant_i32(desc));
370
- sysbus_init_irq(sbd, &s->irq);
246
371
s->cs_lines = g_new0(qemu_irq, s->num_cs);
247
tcg_temp_free_ptr(t_pg);
372
ssi_auto_connect_slaves(dev, s->cs_lines, s->spi);
248
- tcg_temp_free_i32(t_desc);
373
374
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_realize(DeviceState *dev, Error **errp)
375
memory_region_add_subregion(&s->mmio_flash, offset, &fl->mmio);
376
offset += fl->size;
377
}
378
+
379
+ /* DMA support */
380
+ if (s->ctrl->has_dma) {
381
+ aspeed_smc_dma_setup(s, errp);
382
+ }
249
}
383
}
250
384
251
/* Indexed by [mte][be][dtype][nreg] */
385
static const VMStateDescription vmstate_aspeed_smc = {
252
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpz(DisasContext *s, int zt, int pg, int zm,
386
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_smc = {
253
TCGv_ptr t_zm = tcg_temp_new_ptr();
387
static Property aspeed_smc_properties[] = {
254
TCGv_ptr t_pg = tcg_temp_new_ptr();
388
DEFINE_PROP_UINT32("num-cs", AspeedSMCState, num_cs, 1),
255
TCGv_ptr t_zt = tcg_temp_new_ptr();
389
DEFINE_PROP_UINT64("sdram-base", AspeedSMCState, sdram_base, 0),
256
- TCGv_i32 t_desc;
390
+ DEFINE_PROP_LINK("dram", AspeedSMCState, dram_mr,
257
int desc = 0;
391
+ TYPE_MEMORY_REGION, MemoryRegion *),
258
392
DEFINE_PROP_END_OF_LIST(),
259
if (s->mte_active[0]) {
393
};
260
@@ -XXX,XX +XXX,XX @@ static void do_mem_zpz(DisasContext *s, int zt, int pg, int zm,
394
261
desc <<= SVE_MTEDESC_SHIFT;
262
}
263
desc = simd_desc(vsz, vsz, desc | scale);
264
- t_desc = tcg_const_i32(desc);
265
266
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg));
267
tcg_gen_addi_ptr(t_zm, cpu_env, vec_full_reg_offset(s, zm));
268
tcg_gen_addi_ptr(t_zt, cpu_env, vec_full_reg_offset(s, zt));
269
- fn(cpu_env, t_zt, t_pg, t_zm, scalar, t_desc);
270
+ fn(cpu_env, t_zt, t_pg, t_zm, scalar, tcg_constant_i32(desc));
271
272
tcg_temp_free_ptr(t_zt);
273
tcg_temp_free_ptr(t_zm);
274
tcg_temp_free_ptr(t_pg);
275
- tcg_temp_free_i32(t_desc);
276
}
277
278
/* Indexed by [mte][be][ff][xs][u][msz]. */
279
--
395
--
280
2.25.1
396
2.20.1
397
398
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
While defining these names, use the correct field width of 5 not 4 for
3
When doing calibration, the SPI clock rate in the CE0 Control Register
4
DBGWCR.MASK. This typo prevented setting a watchpoint larger than 32k.
4
and the read delay cycles in the Read Timing Compensation Register are
5
set using bit[11:4] of the DMA Control Register.
5
6
6
Reported-by: Chris Howard <cvz185@web.de>
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Acked-by: Joel Stanley <joel@jms.id.au>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220427051926.295223-1-richard.henderson@linaro.org
10
Message-id: 20190904070506.1052-7-clg@kaod.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
---
12
target/arm/internals.h | 12 ++++++++++++
13
hw/ssi/aspeed_smc.c | 64 ++++++++++++++++++++++++++++++++++++++++++++-
13
target/arm/debug_helper.c | 10 +++++-----
14
1 file changed, 63 insertions(+), 1 deletion(-)
14
target/arm/helper.c | 8 ++++----
15
target/arm/kvm64.c | 14 +++++++-------
16
4 files changed, 28 insertions(+), 16 deletions(-)
17
15
18
diff --git a/target/arm/internals.h b/target/arm/internals.h
16
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
19
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/internals.h
18
--- a/hw/ssi/aspeed_smc.c
21
+++ b/target/arm/internals.h
19
+++ b/hw/ssi/aspeed_smc.c
22
@@ -XXX,XX +XXX,XX @@ FIELD(V7M_EXCRET, RES1, 7, 25) /* including the must-be-1 prefix */
20
@@ -XXX,XX +XXX,XX @@
23
*/
21
#define CTRL_CMD_MASK 0xff
24
#define FNC_RETURN_MIN_MAGIC 0xfefffffe
22
#define CTRL_DUMMY_HIGH_SHIFT 14
25
23
#define CTRL_AST2400_SPI_4BYTE (1 << 13)
26
+/* Bit definitions for DBGWCRn and DBGWCRn_EL1 */
24
+#define CE_CTRL_CLOCK_FREQ_SHIFT 8
27
+FIELD(DBGWCR, E, 0, 1)
25
+#define CE_CTRL_CLOCK_FREQ_MASK 0xf
28
+FIELD(DBGWCR, PAC, 1, 2)
26
+#define CE_CTRL_CLOCK_FREQ(div) \
29
+FIELD(DBGWCR, LSC, 3, 2)
27
+ (((div) & CE_CTRL_CLOCK_FREQ_MASK) << CE_CTRL_CLOCK_FREQ_SHIFT)
30
+FIELD(DBGWCR, BAS, 5, 8)
28
#define CTRL_DUMMY_LOW_SHIFT 6 /* 2 bits [7:6] */
31
+FIELD(DBGWCR, HMC, 13, 1)
29
#define CTRL_CE_STOP_ACTIVE (1 << 2)
32
+FIELD(DBGWCR, SSC, 14, 2)
30
#define CTRL_CMD_MODE_MASK 0x3
33
+FIELD(DBGWCR, LBN, 16, 4)
31
@@ -XXX,XX +XXX,XX @@
34
+FIELD(DBGWCR, WT, 20, 1)
32
#define DMA_CTRL_DELAY_SHIFT 8
35
+FIELD(DBGWCR, MASK, 24, 5)
33
#define DMA_CTRL_FREQ_MASK 0xf
36
+FIELD(DBGWCR, SSCE, 29, 1)
34
#define DMA_CTRL_FREQ_SHIFT 4
35
-#define DMA_CTRL_MODE (1 << 3)
36
+#define DMA_CTRL_CALIB (1 << 3)
37
#define DMA_CTRL_CKSUM (1 << 2)
38
#define DMA_CTRL_WRITE (1 << 1)
39
#define DMA_CTRL_ENABLE (1 << 0)
40
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_smc_read(void *opaque, hwaddr addr, unsigned int size)
41
}
42
}
43
44
+static uint8_t aspeed_smc_hclk_divisor(uint8_t hclk_mask)
45
+{
46
+ /* HCLK/1 .. HCLK/16 */
47
+ const uint8_t hclk_divisors[] = {
48
+ 15, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 0
49
+ };
50
+ int i;
37
+
51
+
38
/* We use a few fake FSR values for internal purposes in M profile.
52
+ for (i = 0; i < ARRAY_SIZE(hclk_divisors); i++) {
39
* M profile cores don't have A/R format FSRs, but currently our
53
+ if (hclk_mask == hclk_divisors[i]) {
40
* get_phys_addr() code assumes A/R profile and reports failures via
54
+ return i + 1;
41
diff --git a/target/arm/debug_helper.c b/target/arm/debug_helper.c
55
+ }
42
index XXXXXXX..XXXXXXX 100644
56
+ }
43
--- a/target/arm/debug_helper.c
57
+
44
+++ b/target/arm/debug_helper.c
58
+ qemu_log_mask(LOG_GUEST_ERROR, "invalid HCLK mask %x", hclk_mask);
45
@@ -XXX,XX +XXX,XX @@ static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp)
59
+ return 0;
46
* Non-Secure to simplify the code slightly compared to the full
60
+}
47
* table in the ARM ARM.
61
+
48
*/
62
+/*
49
- pac = extract64(cr, 1, 2);
63
+ * When doing calibration, the SPI clock rate in the CE0 Control
50
- hmc = extract64(cr, 13, 1);
64
+ * Register and the read delay cycles in the Read Timing Compensation
51
- ssc = extract64(cr, 14, 2);
65
+ * Register are set using bit[11:4] of the DMA Control Register.
52
+ pac = FIELD_EX64(cr, DBGWCR, PAC);
66
+ */
53
+ hmc = FIELD_EX64(cr, DBGWCR, HMC);
67
+static void aspeed_smc_dma_calibration(AspeedSMCState *s)
54
+ ssc = FIELD_EX64(cr, DBGWCR, SSC);
68
+{
55
69
+ uint8_t delay =
56
switch (ssc) {
70
+ (s->regs[R_DMA_CTRL] >> DMA_CTRL_DELAY_SHIFT) & DMA_CTRL_DELAY_MASK;
57
case 0:
71
+ uint8_t hclk_mask =
58
@@ -XXX,XX +XXX,XX @@ static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp)
72
+ (s->regs[R_DMA_CTRL] >> DMA_CTRL_FREQ_SHIFT) & DMA_CTRL_FREQ_MASK;
59
g_assert_not_reached();
73
+ uint8_t hclk_div = aspeed_smc_hclk_divisor(hclk_mask);
60
}
74
+ uint32_t hclk_shift = (hclk_div - 1) << 2;
61
75
+ uint8_t cs;
62
- wt = extract64(cr, 20, 1);
76
+
63
- lbn = extract64(cr, 16, 4);
77
+ /*
64
+ wt = FIELD_EX64(cr, DBGWCR, WT);
78
+ * The Read Timing Compensation Register values apply to all CS on
65
+ lbn = FIELD_EX64(cr, DBGWCR, LBN);
79
+ * the SPI bus and only HCLK/1 - HCLK/5 can have tunable delays
66
80
+ */
67
if (wt && !linked_bp_matches(cpu, lbn)) {
81
+ if (hclk_div && hclk_div < 6) {
68
return false;
82
+ s->regs[s->r_timings] &= ~(0xf << hclk_shift);
69
diff --git a/target/arm/helper.c b/target/arm/helper.c
83
+ s->regs[s->r_timings] |= delay << hclk_shift;
70
index XXXXXXX..XXXXXXX 100644
84
+ }
71
--- a/target/arm/helper.c
85
+
72
+++ b/target/arm/helper.c
86
+ /*
73
@@ -XXX,XX +XXX,XX @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
87
+ * TODO: compute the CS from the DMA address and the segment
74
env->cpu_watchpoint[n] = NULL;
88
+ * registers. This is not really a problem for now because the
75
}
89
+ * Timing Register values apply to all CS and software uses CS0 to
76
90
+ * do calibration.
77
- if (!extract64(wcr, 0, 1)) {
91
+ */
78
+ if (!FIELD_EX64(wcr, DBGWCR, E)) {
92
+ cs = 0;
79
/* E bit clear : watchpoint disabled */
93
+ s->regs[s->r_ctrl0 + cs] &=
94
+ ~(CE_CTRL_CLOCK_FREQ_MASK << CE_CTRL_CLOCK_FREQ_SHIFT);
95
+ s->regs[s->r_ctrl0 + cs] |= CE_CTRL_CLOCK_FREQ(hclk_div);
96
+}
97
+
98
/*
99
* Accumulate the result of the reads to provide a checksum that will
100
* be used to validate the read timing settings.
101
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s)
80
return;
102
return;
81
}
103
}
82
104
83
- switch (extract64(wcr, 3, 2)) {
105
+ if (s->regs[R_DMA_CTRL] & DMA_CTRL_CALIB) {
84
+ switch (FIELD_EX64(wcr, DBGWCR, LSC)) {
106
+ aspeed_smc_dma_calibration(s);
85
case 0:
107
+ }
86
/* LSC 00 is reserved and must behave as if the wp is disabled */
108
+
87
return;
109
while (s->regs[R_DMA_LEN]) {
88
@@ -XXX,XX +XXX,XX @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
110
data = address_space_ldl_le(&s->flash_as, s->regs[R_DMA_FLASH_ADDR],
89
* CONSTRAINED UNPREDICTABLE; we opt to ignore BAS in this case,
111
MEMTXATTRS_UNSPECIFIED, &result);
90
* thus generating a watchpoint for every byte in the masked region.
91
*/
92
- mask = extract64(wcr, 24, 4);
93
+ mask = FIELD_EX64(wcr, DBGWCR, MASK);
94
if (mask == 1 || mask == 2) {
95
/* Reserved values of MASK; we must act as if the mask value was
96
* some non-reserved value, or as if the watchpoint were disabled.
97
@@ -XXX,XX +XXX,XX @@ void hw_watchpoint_update(ARMCPU *cpu, int n)
98
wvr &= ~(len - 1);
99
} else {
100
/* Watchpoint covers bytes defined by the byte address select bits */
101
- int bas = extract64(wcr, 5, 8);
102
+ int bas = FIELD_EX64(wcr, DBGWCR, BAS);
103
int basstart;
104
105
if (extract64(wvr, 2, 1)) {
106
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/arm/kvm64.c
109
+++ b/target/arm/kvm64.c
110
@@ -XXX,XX +XXX,XX @@ static int insert_hw_watchpoint(target_ulong addr,
111
target_ulong len, int type)
112
{
113
HWWatchpoint wp = {
114
- .wcr = 1, /* E=1, enable */
115
+ .wcr = R_DBGWCR_E_MASK, /* E=1, enable */
116
.wvr = addr & (~0x7ULL),
117
.details = { .vaddr = addr, .len = len }
118
};
119
@@ -XXX,XX +XXX,XX @@ static int insert_hw_watchpoint(target_ulong addr,
120
* HMC=0 SSC=0 PAC=3 will hit EL0 or EL1, any security state,
121
* valid whether EL3 is implemented or not
122
*/
123
- wp.wcr = deposit32(wp.wcr, 1, 2, 3);
124
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, PAC, 3);
125
126
switch (type) {
127
case GDB_WATCHPOINT_READ:
128
- wp.wcr = deposit32(wp.wcr, 3, 2, 1);
129
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 1);
130
wp.details.flags = BP_MEM_READ;
131
break;
132
case GDB_WATCHPOINT_WRITE:
133
- wp.wcr = deposit32(wp.wcr, 3, 2, 2);
134
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 2);
135
wp.details.flags = BP_MEM_WRITE;
136
break;
137
case GDB_WATCHPOINT_ACCESS:
138
- wp.wcr = deposit32(wp.wcr, 3, 2, 3);
139
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, LSC, 3);
140
wp.details.flags = BP_MEM_ACCESS;
141
break;
142
default:
143
@@ -XXX,XX +XXX,XX @@ static int insert_hw_watchpoint(target_ulong addr,
144
int bits = ctz64(len);
145
146
wp.wvr &= ~((1 << bits) - 1);
147
- wp.wcr = deposit32(wp.wcr, 24, 4, bits);
148
- wp.wcr = deposit32(wp.wcr, 5, 8, 0xff);
149
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, MASK, bits);
150
+ wp.wcr = FIELD_DP64(wp.wcr, DBGWCR, BAS, 0xff);
151
} else {
152
return -ENOBUFS;
153
}
154
--
112
--
155
2.25.1
113
2.20.1
156
114
157
115
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Emulate read errors in the DMA Checksum Register for high frequencies
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
and optimistic settings of the Read Timing Compensation Register. This
5
Message-id: 20220426163043.100432-4-richard.henderson@linaro.org
5
will help in tuning the SPI timing calibration algorithm. Errors are
6
only injected when the property "inject_failure" is set to true as
7
suggested by Philippe.
8
9
The values below are those to expect from the first flash device of
10
the FMC controller of a palmetto-bmc machine.
11
12
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
Reviewed-by: Joel Stanley <joel@jms.id.au>
15
Message-id: 20190904070506.1052-8-clg@kaod.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
17
---
8
target/arm/translate-a64.c | 11 ++---------
18
include/hw/ssi/aspeed_smc.h | 1 +
9
1 file changed, 2 insertions(+), 9 deletions(-)
19
hw/ssi/aspeed_smc.c | 36 ++++++++++++++++++++++++++++++++++++
20
2 files changed, 37 insertions(+)
10
21
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
22
diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
12
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
24
--- a/include/hw/ssi/aspeed_smc.h
14
+++ b/target/arm/translate-a64.c
25
+++ b/include/hw/ssi/aspeed_smc.h
15
@@ -XXX,XX +XXX,XX @@ static void gen_rebuild_hflags(DisasContext *s)
26
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSMCState {
16
27
17
static void gen_exception_internal(int excp)
28
uint32_t num_cs;
18
{
29
qemu_irq *cs_lines;
19
- TCGv_i32 tcg_excp = tcg_const_i32(excp);
30
+ bool inject_failure;
20
-
31
21
assert(excp_is_internal(excp));
32
SSIBus *spi;
22
- gen_helper_exception_internal(cpu_env, tcg_excp);
33
23
- tcg_temp_free_i32(tcg_excp);
34
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
24
+ gen_helper_exception_internal(cpu_env, tcg_constant_i32(excp));
35
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/ssi/aspeed_smc.c
37
+++ b/hw/ssi/aspeed_smc.c
38
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_calibration(AspeedSMCState *s)
39
s->regs[s->r_ctrl0 + cs] |= CE_CTRL_CLOCK_FREQ(hclk_div);
25
}
40
}
26
41
27
static void gen_exception_internal_insn(DisasContext *s, uint64_t pc, int excp)
42
+/*
28
@@ -XXX,XX +XXX,XX @@ static void gen_exception_internal_insn(DisasContext *s, uint64_t pc, int excp)
43
+ * Emulate read errors in the DMA Checksum Register for high
29
44
+ * frequencies and optimistic settings of the Read Timing Compensation
30
static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syndrome)
45
+ * Register. This will help in tuning the SPI timing calibration
31
{
46
+ * algorithm.
32
- TCGv_i32 tcg_syn;
47
+ */
33
-
48
+static bool aspeed_smc_inject_read_failure(AspeedSMCState *s)
34
gen_a64_set_pc_im(s->pc_curr);
49
+{
35
- tcg_syn = tcg_const_i32(syndrome);
50
+ uint8_t delay =
36
- gen_helper_exception_bkpt_insn(cpu_env, tcg_syn);
51
+ (s->regs[R_DMA_CTRL] >> DMA_CTRL_DELAY_SHIFT) & DMA_CTRL_DELAY_MASK;
37
- tcg_temp_free_i32(tcg_syn);
52
+ uint8_t hclk_mask =
38
+ gen_helper_exception_bkpt_insn(cpu_env, tcg_constant_i32(syndrome));
53
+ (s->regs[R_DMA_CTRL] >> DMA_CTRL_FREQ_SHIFT) & DMA_CTRL_FREQ_MASK;
39
s->base.is_jmp = DISAS_NORETURN;
54
+
55
+ /*
56
+ * Typical values of a palmetto-bmc machine.
57
+ */
58
+ switch (aspeed_smc_hclk_divisor(hclk_mask)) {
59
+ case 4 ... 16:
60
+ return false;
61
+ case 3: /* at least one HCLK cycle delay */
62
+ return (delay & 0x7) < 1;
63
+ case 2: /* at least two HCLK cycle delay */
64
+ return (delay & 0x7) < 2;
65
+ case 1: /* (> 100MHz) is above the max freq of the controller */
66
+ return true;
67
+ default:
68
+ g_assert_not_reached();
69
+ }
70
+}
71
+
72
/*
73
* Accumulate the result of the reads to provide a checksum that will
74
* be used to validate the read timing settings.
75
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_checksum(AspeedSMCState *s)
76
s->regs[R_DMA_FLASH_ADDR] += 4;
77
s->regs[R_DMA_LEN] -= 4;
78
}
79
+
80
+ if (s->inject_failure && aspeed_smc_inject_read_failure(s)) {
81
+ s->regs[R_DMA_CHECKSUM] = 0xbadc0de;
82
+ }
83
+
40
}
84
}
41
85
86
static void aspeed_smc_dma_rw(AspeedSMCState *s)
87
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_smc = {
88
89
static Property aspeed_smc_properties[] = {
90
DEFINE_PROP_UINT32("num-cs", AspeedSMCState, num_cs, 1),
91
+ DEFINE_PROP_BOOL("inject-failure", AspeedSMCState, inject_failure, false),
92
DEFINE_PROP_UINT64("sdram-base", AspeedSMCState, sdram_base, 0),
93
DEFINE_PROP_LINK("dram", AspeedSMCState, dram_mr,
94
TYPE_MEMORY_REGION, MemoryRegion *),
42
--
95
--
43
2.25.1
96
2.20.1
97
98
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Note that tmp was doing double-duty as zero
4
and then later as a temporary in its own right.
5
Split the use of 0 to a new variable 'zero'.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220426163043.100432-5-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-a64.c | 26 +++++++++++++-------------
13
1 file changed, 13 insertions(+), 13 deletions(-)
14
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
18
+++ b/target/arm/translate-a64.c
19
@@ -XXX,XX +XXX,XX @@ static void gen_adc(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1)
20
static void gen_adc_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1)
21
{
22
if (sf) {
23
- TCGv_i64 result, cf_64, vf_64, tmp;
24
- result = tcg_temp_new_i64();
25
- cf_64 = tcg_temp_new_i64();
26
- vf_64 = tcg_temp_new_i64();
27
- tmp = tcg_const_i64(0);
28
+ TCGv_i64 result = tcg_temp_new_i64();
29
+ TCGv_i64 cf_64 = tcg_temp_new_i64();
30
+ TCGv_i64 vf_64 = tcg_temp_new_i64();
31
+ TCGv_i64 tmp = tcg_temp_new_i64();
32
+ TCGv_i64 zero = tcg_constant_i64(0);
33
34
tcg_gen_extu_i32_i64(cf_64, cpu_CF);
35
- tcg_gen_add2_i64(result, cf_64, t0, tmp, cf_64, tmp);
36
- tcg_gen_add2_i64(result, cf_64, result, cf_64, t1, tmp);
37
+ tcg_gen_add2_i64(result, cf_64, t0, zero, cf_64, zero);
38
+ tcg_gen_add2_i64(result, cf_64, result, cf_64, t1, zero);
39
tcg_gen_extrl_i64_i32(cpu_CF, cf_64);
40
gen_set_NZ64(result);
41
42
@@ -XXX,XX +XXX,XX @@ static void gen_adc_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1)
43
tcg_temp_free_i64(cf_64);
44
tcg_temp_free_i64(result);
45
} else {
46
- TCGv_i32 t0_32, t1_32, tmp;
47
- t0_32 = tcg_temp_new_i32();
48
- t1_32 = tcg_temp_new_i32();
49
- tmp = tcg_const_i32(0);
50
+ TCGv_i32 t0_32 = tcg_temp_new_i32();
51
+ TCGv_i32 t1_32 = tcg_temp_new_i32();
52
+ TCGv_i32 tmp = tcg_temp_new_i32();
53
+ TCGv_i32 zero = tcg_constant_i32(0);
54
55
tcg_gen_extrl_i64_i32(t0_32, t0);
56
tcg_gen_extrl_i64_i32(t1_32, t1);
57
- tcg_gen_add2_i32(cpu_NF, cpu_CF, t0_32, tmp, cpu_CF, tmp);
58
- tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1_32, tmp);
59
+ tcg_gen_add2_i32(cpu_NF, cpu_CF, t0_32, zero, cpu_CF, zero);
60
+ tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1_32, zero);
61
62
tcg_gen_mov_i32(cpu_ZF, cpu_NF);
63
tcg_gen_xor_i32(cpu_VF, cpu_NF, t0_32);
64
--
65
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-6-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 13 +++----------
9
1 file changed, 3 insertions(+), 10 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_axflag(void)
16
static void handle_msr_i(DisasContext *s, uint32_t insn,
17
unsigned int op1, unsigned int op2, unsigned int crm)
18
{
19
- TCGv_i32 t1;
20
int op = op1 << 3 | op2;
21
22
/* End the TB by default, chaining is ok. */
23
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
24
if (s->current_el == 0) {
25
goto do_unallocated;
26
}
27
- t1 = tcg_const_i32(crm & PSTATE_SP);
28
- gen_helper_msr_i_spsel(cpu_env, t1);
29
- tcg_temp_free_i32(t1);
30
+ gen_helper_msr_i_spsel(cpu_env, tcg_constant_i32(crm & PSTATE_SP));
31
break;
32
33
case 0x19: /* SSBS */
34
@@ -XXX,XX +XXX,XX @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
35
break;
36
37
case 0x1e: /* DAIFSet */
38
- t1 = tcg_const_i32(crm);
39
- gen_helper_msr_i_daifset(cpu_env, t1);
40
- tcg_temp_free_i32(t1);
41
+ gen_helper_msr_i_daifset(cpu_env, tcg_constant_i32(crm));
42
break;
43
44
case 0x1f: /* DAIFClear */
45
- t1 = tcg_const_i32(crm);
46
- gen_helper_msr_i_daifclear(cpu_env, t1);
47
- tcg_temp_free_i32(t1);
48
+ gen_helper_msr_i_daifclear(cpu_env, tcg_constant_i32(crm));
49
/* For DAIFClear, exit the cpu loop to re-evaluate pending IRQs. */
50
s->base.is_jmp = DISAS_UPDATE_EXIT;
51
break;
52
--
53
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-7-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 31 +++++++++----------------------
9
1 file changed, 9 insertions(+), 22 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
16
/* Emit code to perform further access permissions checks at
17
* runtime; this may result in an exception.
18
*/
19
- TCGv_ptr tmpptr;
20
- TCGv_i32 tcg_syn, tcg_isread;
21
uint32_t syndrome;
22
23
- gen_a64_set_pc_im(s->pc_curr);
24
- tmpptr = tcg_const_ptr(ri);
25
syndrome = syn_aa64_sysregtrap(op0, op1, op2, crn, crm, rt, isread);
26
- tcg_syn = tcg_const_i32(syndrome);
27
- tcg_isread = tcg_const_i32(isread);
28
- gen_helper_access_check_cp_reg(cpu_env, tmpptr, tcg_syn, tcg_isread);
29
- tcg_temp_free_ptr(tmpptr);
30
- tcg_temp_free_i32(tcg_syn);
31
- tcg_temp_free_i32(tcg_isread);
32
+ gen_a64_set_pc_im(s->pc_curr);
33
+ gen_helper_access_check_cp_reg(cpu_env,
34
+ tcg_constant_ptr(ri),
35
+ tcg_constant_i32(syndrome),
36
+ tcg_constant_i32(isread));
37
} else if (ri->type & ARM_CP_RAISES_EXC) {
38
/*
39
* The readfn or writefn might raise an exception;
40
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
41
case ARM_CP_DC_ZVA:
42
/* Writes clear the aligned block of memory which rt points into. */
43
if (s->mte_active[0]) {
44
- TCGv_i32 t_desc;
45
int desc = 0;
46
47
desc = FIELD_DP32(desc, MTEDESC, MIDX, get_mem_index(s));
48
desc = FIELD_DP32(desc, MTEDESC, TBI, s->tbid);
49
desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
50
- t_desc = tcg_const_i32(desc);
51
52
tcg_rt = new_tmp_a64(s);
53
- gen_helper_mte_check_zva(tcg_rt, cpu_env, t_desc, cpu_reg(s, rt));
54
- tcg_temp_free_i32(t_desc);
55
+ gen_helper_mte_check_zva(tcg_rt, cpu_env,
56
+ tcg_constant_i32(desc), cpu_reg(s, rt));
57
} else {
58
tcg_rt = clean_data_tbi(s, cpu_reg(s, rt));
59
}
60
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
61
if (ri->type & ARM_CP_CONST) {
62
tcg_gen_movi_i64(tcg_rt, ri->resetvalue);
63
} else if (ri->readfn) {
64
- TCGv_ptr tmpptr;
65
- tmpptr = tcg_const_ptr(ri);
66
- gen_helper_get_cp_reg64(tcg_rt, cpu_env, tmpptr);
67
- tcg_temp_free_ptr(tmpptr);
68
+ gen_helper_get_cp_reg64(tcg_rt, cpu_env, tcg_constant_ptr(ri));
69
} else {
70
tcg_gen_ld_i64(tcg_rt, cpu_env, ri->fieldoffset);
71
}
72
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
73
/* If not forbidden by access permissions, treat as WI */
74
return;
75
} else if (ri->writefn) {
76
- TCGv_ptr tmpptr;
77
- tmpptr = tcg_const_ptr(ri);
78
- gen_helper_set_cp_reg64(cpu_env, tmpptr, tcg_rt);
79
- tcg_temp_free_ptr(tmpptr);
80
+ gen_helper_set_cp_reg64(cpu_env, tcg_constant_ptr(ri), tcg_rt);
81
} else {
82
tcg_gen_st_i64(tcg_rt, cpu_env, ri->fieldoffset);
83
}
84
--
85
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-8-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 5 +----
9
1 file changed, 1 insertion(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_exc(DisasContext *s, uint32_t insn)
16
int opc = extract32(insn, 21, 3);
17
int op2_ll = extract32(insn, 0, 5);
18
int imm16 = extract32(insn, 5, 16);
19
- TCGv_i32 tmp;
20
21
switch (opc) {
22
case 0:
23
@@ -XXX,XX +XXX,XX @@ static void disas_exc(DisasContext *s, uint32_t insn)
24
break;
25
}
26
gen_a64_set_pc_im(s->pc_curr);
27
- tmp = tcg_const_i32(syn_aa64_smc(imm16));
28
- gen_helper_pre_smc(cpu_env, tmp);
29
- tcg_temp_free_i32(tmp);
30
+ gen_helper_pre_smc(cpu_env, tcg_constant_i32(syn_aa64_smc(imm16)));
31
gen_ss_advance(s);
32
gen_exception_insn(s, s->base.pc_next, EXCP_SMC,
33
syn_aa64_smc(imm16), 3);
34
--
35
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-9-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 6 ++----
9
1 file changed, 2 insertions(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
16
tcg_temp_free_i64(cmp);
17
} else if (tb_cflags(s->base.tb) & CF_PARALLEL) {
18
if (HAVE_CMPXCHG128) {
19
- TCGv_i32 tcg_rs = tcg_const_i32(rs);
20
+ TCGv_i32 tcg_rs = tcg_constant_i32(rs);
21
if (s->be_data == MO_LE) {
22
gen_helper_casp_le_parallel(cpu_env, tcg_rs,
23
clean_addr, t1, t2);
24
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
25
gen_helper_casp_be_parallel(cpu_env, tcg_rs,
26
clean_addr, t1, t2);
27
}
28
- tcg_temp_free_i32(tcg_rs);
29
} else {
30
gen_helper_exit_atomic(cpu_env);
31
s->base.is_jmp = DISAS_NORETURN;
32
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
33
TCGv_i64 a2 = tcg_temp_new_i64();
34
TCGv_i64 c1 = tcg_temp_new_i64();
35
TCGv_i64 c2 = tcg_temp_new_i64();
36
- TCGv_i64 zero = tcg_const_i64(0);
37
+ TCGv_i64 zero = tcg_constant_i64(0);
38
39
/* Load the two words, in memory order. */
40
tcg_gen_qemu_ld_i64(d1, clean_addr, memidx,
41
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
42
tcg_temp_free_i64(a2);
43
tcg_temp_free_i64(c1);
44
tcg_temp_free_i64(c2);
45
- tcg_temp_free_i64(zero);
46
47
/* Write back the data from memory to Rs. */
48
tcg_gen_mov_i64(s1, d1);
49
--
50
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-10-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 3 +--
9
1 file changed, 1 insertion(+), 2 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_ld_lit(DisasContext *s, uint32_t insn)
16
17
tcg_rt = cpu_reg(s, rt);
18
19
- clean_addr = tcg_const_i64(s->pc_curr + imm);
20
+ clean_addr = tcg_constant_i64(s->pc_curr + imm);
21
if (is_vector) {
22
do_fp_ld(s, rt, clean_addr, size);
23
} else {
24
@@ -XXX,XX +XXX,XX @@ static void disas_ld_lit(DisasContext *s, uint32_t insn)
25
do_gpr_ld(s, tcg_rt, clean_addr, size + is_signed * MO_SIGN,
26
false, true, rt, iss_sf, false);
27
}
28
- tcg_temp_free_i64(clean_addr);
29
}
30
31
/*
32
--
33
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-11-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 9 +++------
9
1 file changed, 3 insertions(+), 6 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
16
mop = endian | size | align;
17
18
elements = (is_q ? 16 : 8) >> size;
19
- tcg_ebytes = tcg_const_i64(1 << size);
20
+ tcg_ebytes = tcg_constant_i64(1 << size);
21
for (r = 0; r < rpt; r++) {
22
int e;
23
for (e = 0; e < elements; e++) {
24
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_multiple_struct(DisasContext *s, uint32_t insn)
25
}
26
}
27
}
28
- tcg_temp_free_i64(tcg_ebytes);
29
30
if (!is_store) {
31
/* For non-quad operations, setting a slice of the low
32
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
33
total);
34
mop = finalize_memop(s, scale);
35
36
- tcg_ebytes = tcg_const_i64(1 << scale);
37
+ tcg_ebytes = tcg_constant_i64(1 << scale);
38
for (xs = 0; xs < selem; xs++) {
39
if (replicate) {
40
/* Load and replicate to all elements */
41
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn)
42
tcg_gen_add_i64(clean_addr, clean_addr, tcg_ebytes);
43
rt = (rt + 1) % 32;
44
}
45
- tcg_temp_free_i64(tcg_ebytes);
46
47
if (is_postidx) {
48
if (rm == 31) {
49
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_tag(DisasContext *s, uint32_t insn)
50
51
if (is_zero) {
52
TCGv_i64 clean_addr = clean_data_tbi(s, addr);
53
- TCGv_i64 tcg_zero = tcg_const_i64(0);
54
+ TCGv_i64 tcg_zero = tcg_constant_i64(0);
55
int mem_index = get_mem_index(s);
56
int i, n = (1 + is_pair) << LOG2_TAG_GRANULE;
57
58
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_tag(DisasContext *s, uint32_t insn)
59
tcg_gen_addi_i64(clean_addr, clean_addr, 8);
60
tcg_gen_qemu_st_i64(tcg_zero, clean_addr, mem_index, MO_UQ);
61
}
62
- tcg_temp_free_i64(tcg_zero);
63
}
64
65
if (index != 0) {
66
--
67
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-12-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 12 ++++--------
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_add_sub_imm(DisasContext *s, uint32_t insn)
16
tcg_gen_addi_i64(tcg_result, tcg_rn, imm);
17
}
18
} else {
19
- TCGv_i64 tcg_imm = tcg_const_i64(imm);
20
+ TCGv_i64 tcg_imm = tcg_constant_i64(imm);
21
if (sub_op) {
22
gen_sub_CC(is_64bit, tcg_result, tcg_rn, tcg_imm);
23
} else {
24
gen_add_CC(is_64bit, tcg_result, tcg_rn, tcg_imm);
25
}
26
- tcg_temp_free_i64(tcg_imm);
27
}
28
29
if (is_64bit) {
30
@@ -XXX,XX +XXX,XX @@ static void disas_add_sub_imm_with_tags(DisasContext *s, uint32_t insn)
31
tcg_rd = cpu_reg_sp(s, rd);
32
33
if (s->ata) {
34
- TCGv_i32 offset = tcg_const_i32(imm);
35
- TCGv_i32 tag_offset = tcg_const_i32(uimm4);
36
-
37
- gen_helper_addsubg(tcg_rd, cpu_env, tcg_rn, offset, tag_offset);
38
- tcg_temp_free_i32(tag_offset);
39
- tcg_temp_free_i32(offset);
40
+ gen_helper_addsubg(tcg_rd, cpu_env, tcg_rn,
41
+ tcg_constant_i32(imm),
42
+ tcg_constant_i32(uimm4));
43
} else {
44
tcg_gen_addi_i64(tcg_rd, tcg_rn, imm);
45
gen_address_with_allocation_tag0(tcg_rd, tcg_rd);
46
--
47
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-13-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 5 +----
9
1 file changed, 1 insertion(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_movw_imm(DisasContext *s, uint32_t insn)
16
int opc = extract32(insn, 29, 2);
17
int pos = extract32(insn, 21, 2) << 4;
18
TCGv_i64 tcg_rd = cpu_reg(s, rd);
19
- TCGv_i64 tcg_imm;
20
21
if (!sf && (pos >= 32)) {
22
unallocated_encoding(s);
23
@@ -XXX,XX +XXX,XX @@ static void disas_movw_imm(DisasContext *s, uint32_t insn)
24
tcg_gen_movi_i64(tcg_rd, imm);
25
break;
26
case 3: /* MOVK */
27
- tcg_imm = tcg_const_i64(imm);
28
- tcg_gen_deposit_i64(tcg_rd, tcg_rd, tcg_imm, pos, 16);
29
- tcg_temp_free_i64(tcg_imm);
30
+ tcg_gen_deposit_i64(tcg_rd, tcg_rd, tcg_constant_i64(imm), pos, 16);
31
if (!sf) {
32
tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
33
}
34
--
35
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Christian Svensson <bluecmd@google.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
This patch adds the missing checksum calculation on normal DMA transfer.
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
According to the datasheet this is how the SMC should behave.
5
Message-id: 20220426163043.100432-14-richard.henderson@linaro.org
5
6
Verified on AST1250 that the hardware matches the behaviour.
7
8
Signed-off-by: Christian Svensson <bluecmd@google.com>
9
Reviewed-by: Joel Stanley <joel@jms.id.au>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
Message-id: 20190904070506.1052-9-clg@kaod.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
13
---
8
target/arm/translate-a64.c | 6 +-----
14
hw/ssi/aspeed_smc.c | 1 +
9
1 file changed, 1 insertion(+), 5 deletions(-)
15
1 file changed, 1 insertion(+)
10
16
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
17
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
19
--- a/hw/ssi/aspeed_smc.c
14
+++ b/target/arm/translate-a64.c
20
+++ b/hw/ssi/aspeed_smc.c
15
@@ -XXX,XX +XXX,XX @@ static void shift_reg_imm(TCGv_i64 dst, TCGv_i64 src, int sf,
21
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_dma_rw(AspeedSMCState *s)
16
if (shift_i == 0) {
22
s->regs[R_DMA_FLASH_ADDR] += 4;
17
tcg_gen_mov_i64(dst, src);
23
s->regs[R_DMA_DRAM_ADDR] += 4;
18
} else {
24
s->regs[R_DMA_LEN] -= 4;
19
- TCGv_i64 shift_const;
25
+ s->regs[R_DMA_CHECKSUM] += data;
20
-
21
- shift_const = tcg_const_i64(shift_i);
22
- shift_reg(dst, src, sf, shift_type, shift_const);
23
- tcg_temp_free_i64(shift_const);
24
+ shift_reg(dst, src, sf, shift_type, tcg_constant_i64(shift_i));
25
}
26
}
26
}
27
}
27
28
28
--
29
--
29
2.25.1
30
2.20.1
31
32
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-15-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 3 +--
9
1 file changed, 1 insertion(+), 2 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void disas_cond_select(DisasContext *s, uint32_t insn)
16
tcg_rd = cpu_reg(s, rd);
17
18
a64_test_cc(&c, cond);
19
- zero = tcg_const_i64(0);
20
+ zero = tcg_constant_i64(0);
21
22
if (rn == 31 && rm == 31 && (else_inc ^ else_inv)) {
23
/* CSET & CSETM. */
24
@@ -XXX,XX +XXX,XX @@ static void disas_cond_select(DisasContext *s, uint32_t insn)
25
tcg_gen_movcond_i64(c.cond, tcg_rd, c.value, zero, t_true, t_false);
26
}
27
28
- tcg_temp_free_i64(zero);
29
a64_free_cc(&c);
30
31
if (!sf) {
32
--
33
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-16-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 7 ++-----
9
1 file changed, 2 insertions(+), 5 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void handle_rev16(DisasContext *s, unsigned int sf,
16
TCGv_i64 tcg_rd = cpu_reg(s, rd);
17
TCGv_i64 tcg_tmp = tcg_temp_new_i64();
18
TCGv_i64 tcg_rn = read_cpu_reg(s, rn, sf);
19
- TCGv_i64 mask = tcg_const_i64(sf ? 0x00ff00ff00ff00ffull : 0x00ff00ff);
20
+ TCGv_i64 mask = tcg_constant_i64(sf ? 0x00ff00ff00ff00ffull : 0x00ff00ff);
21
22
tcg_gen_shri_i64(tcg_tmp, tcg_rn, 8);
23
tcg_gen_and_i64(tcg_rd, tcg_rn, mask);
24
@@ -XXX,XX +XXX,XX @@ static void handle_rev16(DisasContext *s, unsigned int sf,
25
tcg_gen_shli_i64(tcg_rd, tcg_rd, 8);
26
tcg_gen_or_i64(tcg_rd, tcg_rd, tcg_tmp);
27
28
- tcg_temp_free_i64(mask);
29
tcg_temp_free_i64(tcg_tmp);
30
}
31
32
@@ -XXX,XX +XXX,XX @@ static void handle_crc32(DisasContext *s,
33
}
34
35
tcg_acc = cpu_reg(s, rn);
36
- tcg_bytes = tcg_const_i32(1 << sz);
37
+ tcg_bytes = tcg_constant_i32(1 << sz);
38
39
if (crc32c) {
40
gen_helper_crc32c_64(cpu_reg(s, rd), tcg_acc, tcg_val, tcg_bytes);
41
} else {
42
gen_helper_crc32_64(cpu_reg(s, rd), tcg_acc, tcg_val, tcg_bytes);
43
}
44
-
45
- tcg_temp_free_i32(tcg_bytes);
46
}
47
48
/* Data-processing (2 source)
49
--
50
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Existing temp usage treats t1 as both zero and as a
4
temporary. Rearrange to only require one temporary,
5
so remove t1 and rename t2.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Message-id: 20220426163043.100432-17-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-a64.c | 12 +++++-------
13
1 file changed, 5 insertions(+), 7 deletions(-)
14
15
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-a64.c
18
+++ b/target/arm/translate-a64.c
19
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
20
if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) {
21
goto do_unallocated;
22
} else {
23
- TCGv_i64 t1 = tcg_const_i64(1);
24
- TCGv_i64 t2 = tcg_temp_new_i64();
25
+ TCGv_i64 t = tcg_temp_new_i64();
26
27
- tcg_gen_extract_i64(t2, cpu_reg_sp(s, rn), 56, 4);
28
- tcg_gen_shl_i64(t1, t1, t2);
29
- tcg_gen_or_i64(cpu_reg(s, rd), cpu_reg(s, rm), t1);
30
+ tcg_gen_extract_i64(t, cpu_reg_sp(s, rn), 56, 4);
31
+ tcg_gen_shl_i64(t, tcg_constant_i64(1), t);
32
+ tcg_gen_or_i64(cpu_reg(s, rd), cpu_reg(s, rm), t);
33
34
- tcg_temp_free_i64(t1);
35
- tcg_temp_free_i64(t2);
36
+ tcg_temp_free_i64(t);
37
}
38
break;
39
case 8: /* LSLV */
40
--
41
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-18-richard.henderson@linaro.org
6
[PMM: Restore incorrectly removed free of t_false in disas_fp_csel()]
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
---
9
target/arm/translate-a64.c | 23 +++++++----------------
10
1 file changed, 7 insertions(+), 16 deletions(-)
11
12
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/translate-a64.c
15
+++ b/target/arm/translate-a64.c
16
@@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, int size,
17
18
tcg_vn = read_fp_dreg(s, rn);
19
if (cmp_with_zero) {
20
- tcg_vm = tcg_const_i64(0);
21
+ tcg_vm = tcg_constant_i64(0);
22
} else {
23
tcg_vm = read_fp_dreg(s, rm);
24
}
25
@@ -XXX,XX +XXX,XX @@ static void disas_fp_compare(DisasContext *s, uint32_t insn)
26
static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
27
{
28
unsigned int mos, type, rm, cond, rn, op, nzcv;
29
- TCGv_i64 tcg_flags;
30
TCGLabel *label_continue = NULL;
31
int size;
32
33
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
34
label_continue = gen_new_label();
35
arm_gen_test_cc(cond, label_match);
36
/* nomatch: */
37
- tcg_flags = tcg_const_i64(nzcv << 28);
38
- gen_set_nzcv(tcg_flags);
39
- tcg_temp_free_i64(tcg_flags);
40
+ gen_set_nzcv(tcg_constant_i64(nzcv << 28));
41
tcg_gen_br(label_continue);
42
gen_set_label(label_match);
43
}
44
@@ -XXX,XX +XXX,XX @@ static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
45
static void disas_fp_csel(DisasContext *s, uint32_t insn)
46
{
47
unsigned int mos, type, rm, cond, rn, rd;
48
- TCGv_i64 t_true, t_false, t_zero;
49
+ TCGv_i64 t_true, t_false;
50
DisasCompare64 c;
51
MemOp sz;
52
53
@@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn)
54
read_vec_element(s, t_false, rm, 0, sz);
55
56
a64_test_cc(&c, cond);
57
- t_zero = tcg_const_i64(0);
58
- tcg_gen_movcond_i64(c.cond, t_true, c.value, t_zero, t_true, t_false);
59
- tcg_temp_free_i64(t_zero);
60
+ tcg_gen_movcond_i64(c.cond, t_true, c.value, tcg_constant_i64(0),
61
+ t_true, t_false);
62
tcg_temp_free_i64(t_false);
63
a64_free_cc(&c);
64
65
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
66
int type = extract32(insn, 22, 2);
67
int mos = extract32(insn, 29, 3);
68
uint64_t imm;
69
- TCGv_i64 tcg_res;
70
MemOp sz;
71
72
if (mos || imm5) {
73
@@ -XXX,XX +XXX,XX @@ static void disas_fp_imm(DisasContext *s, uint32_t insn)
74
}
75
76
imm = vfp_expand_imm(sz, imm8);
77
-
78
- tcg_res = tcg_const_i64(imm);
79
- write_fp_dreg(s, rd, tcg_res);
80
- tcg_temp_free_i64(tcg_res);
81
+ write_fp_dreg(s, rd, tcg_constant_i64(imm));
82
}
83
84
/* Handle floating point <=> fixed point conversions. Note that we can
85
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
86
87
tcg_fpstatus = fpstatus_ptr(type == 3 ? FPST_FPCR_F16 : FPST_FPCR);
88
89
- tcg_shift = tcg_const_i32(64 - scale);
90
+ tcg_shift = tcg_constant_i32(64 - scale);
91
92
if (itof) {
93
TCGv_i64 tcg_int = cpu_reg(s, rn);
94
@@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
95
}
96
97
tcg_temp_free_ptr(tcg_fpstatus);
98
- tcg_temp_free_i32(tcg_shift);
99
}
100
101
/* Floating point <-> fixed point conversions
102
--
103
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-20-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 26 ++++++--------------------
9
1 file changed, 6 insertions(+), 20 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
16
int pass;
17
18
if (fracbits || size == MO_64) {
19
- tcg_shift = tcg_const_i32(fracbits);
20
+ tcg_shift = tcg_constant_i32(fracbits);
21
}
22
23
if (size == MO_64) {
24
@@ -XXX,XX +XXX,XX @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
25
}
26
27
tcg_temp_free_ptr(tcg_fpst);
28
- if (tcg_shift) {
29
- tcg_temp_free_i32(tcg_shift);
30
- }
31
32
clear_vec_high(s, elements << size == 16, rd);
33
}
34
@@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
35
tcg_fpstatus = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
36
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
37
fracbits = (16 << size) - immhb;
38
- tcg_shift = tcg_const_i32(fracbits);
39
+ tcg_shift = tcg_constant_i32(fracbits);
40
41
if (size == MO_64) {
42
int maxpass = is_scalar ? 1 : 2;
43
@@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
44
}
45
}
46
47
- tcg_temp_free_i32(tcg_shift);
48
gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus);
49
tcg_temp_free_ptr(tcg_fpstatus);
50
tcg_temp_free_i32(tcg_rmode);
51
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
52
case 0x1c: /* FCVTAS */
53
case 0x3a: /* FCVTPS */
54
case 0x3b: /* FCVTZS */
55
- {
56
- TCGv_i32 tcg_shift = tcg_const_i32(0);
57
- gen_helper_vfp_tosqd(tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus);
58
- tcg_temp_free_i32(tcg_shift);
59
+ gen_helper_vfp_tosqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus);
60
break;
61
- }
62
case 0x5a: /* FCVTNU */
63
case 0x5b: /* FCVTMU */
64
case 0x5c: /* FCVTAU */
65
case 0x7a: /* FCVTPU */
66
case 0x7b: /* FCVTZU */
67
- {
68
- TCGv_i32 tcg_shift = tcg_const_i32(0);
69
- gen_helper_vfp_touqd(tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus);
70
- tcg_temp_free_i32(tcg_shift);
71
+ gen_helper_vfp_touqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus);
72
break;
73
- }
74
case 0x18: /* FRINTN */
75
case 0x19: /* FRINTM */
76
case 0x38: /* FRINTP */
77
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
78
79
if (is_double) {
80
TCGv_i64 tcg_op = tcg_temp_new_i64();
81
- TCGv_i64 tcg_zero = tcg_const_i64(0);
82
+ TCGv_i64 tcg_zero = tcg_constant_i64(0);
83
TCGv_i64 tcg_res = tcg_temp_new_i64();
84
NeonGenTwoDoubleOpFn *genfn;
85
bool swap = false;
86
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
87
write_vec_element(s, tcg_res, rd, pass, MO_64);
88
}
89
tcg_temp_free_i64(tcg_res);
90
- tcg_temp_free_i64(tcg_zero);
91
tcg_temp_free_i64(tcg_op);
92
93
clear_vec_high(s, !is_scalar, rd);
94
} else {
95
TCGv_i32 tcg_op = tcg_temp_new_i32();
96
- TCGv_i32 tcg_zero = tcg_const_i32(0);
97
+ TCGv_i32 tcg_zero = tcg_constant_i32(0);
98
TCGv_i32 tcg_res = tcg_temp_new_i32();
99
NeonGenTwoSingleOpFn *genfn;
100
bool swap = false;
101
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
102
}
103
}
104
tcg_temp_free_i32(tcg_res);
105
- tcg_temp_free_i32(tcg_zero);
106
tcg_temp_free_i32(tcg_op);
107
if (!is_scalar) {
108
clear_vec_high(s, is_q, rd);
109
--
110
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-21-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-a64.c | 40 ++++++++++----------------------------
9
1 file changed, 10 insertions(+), 30 deletions(-)
10
11
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-a64.c
14
+++ b/target/arm/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
16
int passes = scalar ? 1 : 2;
17
18
if (scalar) {
19
- tcg_res[1] = tcg_const_i32(0);
20
+ tcg_res[1] = tcg_constant_i32(0);
21
}
22
23
for (pass = 0; pass < passes; pass++) {
24
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_satacc(DisasContext *s, bool is_scalar, bool is_u,
25
}
26
27
if (is_scalar) {
28
- TCGv_i64 tcg_zero = tcg_const_i64(0);
29
- write_vec_element(s, tcg_zero, rd, 0, MO_64);
30
- tcg_temp_free_i64(tcg_zero);
31
+ write_vec_element(s, tcg_constant_i64(0), rd, 0, MO_64);
32
}
33
write_vec_element_i32(s, tcg_rd, rd, pass, MO_32);
34
}
35
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
36
case 0x1c: /* FCVTAS */
37
case 0x3a: /* FCVTPS */
38
case 0x3b: /* FCVTZS */
39
- {
40
- TCGv_i32 tcg_shift = tcg_const_i32(0);
41
- gen_helper_vfp_tosls(tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus);
42
- tcg_temp_free_i32(tcg_shift);
43
+ gen_helper_vfp_tosls(tcg_rd, tcg_rn, tcg_constant_i32(0),
44
+ tcg_fpstatus);
45
break;
46
- }
47
case 0x5a: /* FCVTNU */
48
case 0x5b: /* FCVTMU */
49
case 0x5c: /* FCVTAU */
50
case 0x7a: /* FCVTPU */
51
case 0x7b: /* FCVTZU */
52
- {
53
- TCGv_i32 tcg_shift = tcg_const_i32(0);
54
- gen_helper_vfp_touls(tcg_rd, tcg_rn, tcg_shift, tcg_fpstatus);
55
- tcg_temp_free_i32(tcg_shift);
56
+ gen_helper_vfp_touls(tcg_rd, tcg_rn, tcg_constant_i32(0),
57
+ tcg_fpstatus);
58
break;
59
- }
60
default:
61
g_assert_not_reached();
62
}
63
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_shrn(DisasContext *s, bool is_q,
64
read_vec_element(s, tcg_final, rd, is_q ? 1 : 0, MO_64);
65
66
if (round) {
67
- uint64_t round_const = 1ULL << (shift - 1);
68
- tcg_round = tcg_const_i64(round_const);
69
+ tcg_round = tcg_constant_i64(1ULL << (shift - 1));
70
} else {
71
tcg_round = NULL;
72
}
73
@@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_shrn(DisasContext *s, bool is_q,
74
} else {
75
write_vec_element(s, tcg_final, rd, 1, MO_64);
76
}
77
- if (round) {
78
- tcg_temp_free_i64(tcg_round);
79
- }
80
tcg_temp_free_i64(tcg_rn);
81
tcg_temp_free_i64(tcg_rd);
82
tcg_temp_free_i64(tcg_final);
83
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u,
84
}
85
}
86
if (!is_q) {
87
- tcg_res[1] = tcg_const_i64(0);
88
+ tcg_res[1] = tcg_constant_i64(0);
89
}
90
for (pass = 0; pass < 2; pass++) {
91
write_vec_element(s, tcg_res[pass], rd, pass, MO_64);
92
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
93
case 0x1c: /* FCVTAS */
94
case 0x3a: /* FCVTPS */
95
case 0x3b: /* FCVTZS */
96
- {
97
- TCGv_i32 tcg_shift = tcg_const_i32(0);
98
gen_helper_vfp_tosls(tcg_res, tcg_op,
99
- tcg_shift, tcg_fpstatus);
100
- tcg_temp_free_i32(tcg_shift);
101
+ tcg_constant_i32(0), tcg_fpstatus);
102
break;
103
- }
104
case 0x5a: /* FCVTNU */
105
case 0x5b: /* FCVTMU */
106
case 0x5c: /* FCVTAU */
107
case 0x7a: /* FCVTPU */
108
case 0x7b: /* FCVTZU */
109
- {
110
- TCGv_i32 tcg_shift = tcg_const_i32(0);
111
gen_helper_vfp_touls(tcg_res, tcg_op,
112
- tcg_shift, tcg_fpstatus);
113
- tcg_temp_free_i32(tcg_shift);
114
+ tcg_constant_i32(0), tcg_fpstatus);
115
break;
116
- }
117
case 0x18: /* FRINTN */
118
case 0x19: /* FRINTM */
119
case 0x38: /* FRINTP */
120
--
121
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Finish conversion of the file to tcg_constant_*.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20220426163043.100432-22-richard.henderson@linaro.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-a64.c | 20 ++++++++------------
11
1 file changed, 8 insertions(+), 12 deletions(-)
12
13
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-a64.c
16
+++ b/target/arm/translate-a64.c
17
@@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn)
18
}
19
20
if (is_scalar) {
21
- tcg_res[1] = tcg_const_i64(0);
22
+ tcg_res[1] = tcg_constant_i64(0);
23
}
24
25
for (pass = 0; pass < 2; pass++) {
26
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_four_reg(DisasContext *s, uint32_t insn)
27
tcg_op2 = tcg_temp_new_i32();
28
tcg_op3 = tcg_temp_new_i32();
29
tcg_res = tcg_temp_new_i32();
30
- tcg_zero = tcg_const_i32(0);
31
+ tcg_zero = tcg_constant_i32(0);
32
33
read_vec_element_i32(s, tcg_op1, rn, 3, MO_32);
34
read_vec_element_i32(s, tcg_op2, rm, 3, MO_32);
35
@@ -XXX,XX +XXX,XX @@ static void disas_crypto_four_reg(DisasContext *s, uint32_t insn)
36
tcg_temp_free_i32(tcg_op2);
37
tcg_temp_free_i32(tcg_op3);
38
tcg_temp_free_i32(tcg_res);
39
- tcg_temp_free_i32(tcg_zero);
40
}
41
}
42
43
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
44
gen_helper_yield(cpu_env);
45
break;
46
case DISAS_WFI:
47
- {
48
- /* This is a special case because we don't want to just halt the CPU
49
- * if trying to debug across a WFI.
50
+ /*
51
+ * This is a special case because we don't want to just halt
52
+ * the CPU if trying to debug across a WFI.
53
*/
54
- TCGv_i32 tmp = tcg_const_i32(4);
55
-
56
gen_a64_set_pc_im(dc->base.pc_next);
57
- gen_helper_wfi(cpu_env, tmp);
58
- tcg_temp_free_i32(tmp);
59
- /* The helper doesn't necessarily throw an exception, but we
60
+ gen_helper_wfi(cpu_env, tcg_constant_i32(4));
61
+ /*
62
+ * The helper doesn't necessarily throw an exception, but we
63
* must go back to the main loop to check for interrupts anyway.
64
*/
65
tcg_gen_exit_tb(NULL, 0);
66
break;
67
}
68
- }
69
}
70
}
71
72
--
73
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-23-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 32 +++++++-------------------------
9
1 file changed, 7 insertions(+), 25 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static void store_sp_checked(DisasContext *s, TCGv_i32 var)
16
17
void gen_set_cpsr(TCGv_i32 var, uint32_t mask)
18
{
19
- TCGv_i32 tmp_mask = tcg_const_i32(mask);
20
- gen_helper_cpsr_write(cpu_env, var, tmp_mask);
21
- tcg_temp_free_i32(tmp_mask);
22
+ gen_helper_cpsr_write(cpu_env, var, tcg_constant_i32(mask));
23
}
24
25
static void gen_rebuild_hflags(DisasContext *s, bool new_el)
26
@@ -XXX,XX +XXX,XX @@ static void gen_rebuild_hflags(DisasContext *s, bool new_el)
27
28
static void gen_exception_internal(int excp)
29
{
30
- TCGv_i32 tcg_excp = tcg_const_i32(excp);
31
-
32
assert(excp_is_internal(excp));
33
- gen_helper_exception_internal(cpu_env, tcg_excp);
34
- tcg_temp_free_i32(tcg_excp);
35
+ gen_helper_exception_internal(cpu_env, tcg_constant_i32(excp));
36
}
37
38
static void gen_singlestep_exception(DisasContext *s)
39
@@ -XXX,XX +XXX,XX @@ static inline void gen_smc(DisasContext *s)
40
/* As with HVC, we may take an exception either before or after
41
* the insn executes.
42
*/
43
- TCGv_i32 tmp;
44
-
45
gen_set_pc_im(s, s->pc_curr);
46
- tmp = tcg_const_i32(syn_aa32_smc());
47
- gen_helper_pre_smc(cpu_env, tmp);
48
- tcg_temp_free_i32(tmp);
49
+ gen_helper_pre_smc(cpu_env, tcg_constant_i32(syn_aa32_smc()));
50
gen_set_pc_im(s, s->base.pc_next);
51
s->base.is_jmp = DISAS_SMC;
52
}
53
@@ -XXX,XX +XXX,XX @@ void gen_exception_insn(DisasContext *s, uint64_t pc, int excp,
54
55
static void gen_exception_bkpt_insn(DisasContext *s, uint32_t syn)
56
{
57
- TCGv_i32 tcg_syn;
58
-
59
gen_set_condexec(s);
60
gen_set_pc_im(s, s->pc_curr);
61
- tcg_syn = tcg_const_i32(syn);
62
- gen_helper_exception_bkpt_insn(cpu_env, tcg_syn);
63
- tcg_temp_free_i32(tcg_syn);
64
+ gen_helper_exception_bkpt_insn(cpu_env, tcg_constant_i32(syn));
65
s->base.is_jmp = DISAS_NORETURN;
66
}
67
68
@@ -XXX,XX +XXX,XX @@ void unallocated_encoding(DisasContext *s)
69
static void gen_exception_el(DisasContext *s, int excp, uint32_t syn,
70
TCGv_i32 tcg_el)
71
{
72
- TCGv_i32 tcg_excp;
73
- TCGv_i32 tcg_syn;
74
-
75
gen_set_condexec(s);
76
gen_set_pc_im(s, s->pc_curr);
77
- tcg_excp = tcg_const_i32(excp);
78
- tcg_syn = tcg_const_i32(syn);
79
- gen_helper_exception_with_syndrome(cpu_env, tcg_excp, tcg_syn, tcg_el);
80
- tcg_temp_free_i32(tcg_syn);
81
- tcg_temp_free_i32(tcg_excp);
82
+ gen_helper_exception_with_syndrome(cpu_env,
83
+ tcg_constant_i32(excp),
84
+ tcg_constant_i32(syn), tcg_el);
85
s->base.is_jmp = DISAS_NORETURN;
86
}
87
88
--
89
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-24-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 25 ++++++++++---------------
9
1 file changed, 10 insertions(+), 15 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn)
16
gen_op_iwmmxt_movq_M0_wRn(wrd);
17
switch ((insn >> 6) & 3) {
18
case 0:
19
- tmp2 = tcg_const_i32(0xff);
20
- tmp3 = tcg_const_i32((insn & 7) << 3);
21
+ tmp2 = tcg_constant_i32(0xff);
22
+ tmp3 = tcg_constant_i32((insn & 7) << 3);
23
break;
24
case 1:
25
- tmp2 = tcg_const_i32(0xffff);
26
- tmp3 = tcg_const_i32((insn & 3) << 4);
27
+ tmp2 = tcg_constant_i32(0xffff);
28
+ tmp3 = tcg_constant_i32((insn & 3) << 4);
29
break;
30
case 2:
31
- tmp2 = tcg_const_i32(0xffffffff);
32
- tmp3 = tcg_const_i32((insn & 1) << 5);
33
+ tmp2 = tcg_constant_i32(0xffffffff);
34
+ tmp3 = tcg_constant_i32((insn & 1) << 5);
35
break;
36
default:
37
- tmp2 = NULL;
38
- tmp3 = NULL;
39
+ g_assert_not_reached();
40
}
41
gen_helper_iwmmxt_insr(cpu_M0, cpu_M0, tmp, tmp2, tmp3);
42
- tcg_temp_free_i32(tmp3);
43
- tcg_temp_free_i32(tmp2);
44
tcg_temp_free_i32(tmp);
45
gen_op_iwmmxt_movq_wRn_M0(wrd);
46
gen_op_iwmmxt_set_mup();
47
@@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn)
48
rd0 = (insn >> 16) & 0xf;
49
rd1 = (insn >> 0) & 0xf;
50
gen_op_iwmmxt_movq_M0_wRn(rd0);
51
- tmp = tcg_const_i32((insn >> 20) & 3);
52
iwmmxt_load_reg(cpu_V1, rd1);
53
- gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1, tmp);
54
- tcg_temp_free_i32(tmp);
55
+ gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1,
56
+ tcg_constant_i32((insn >> 20) & 3));
57
gen_op_iwmmxt_movq_wRn_M0(wrd);
58
gen_op_iwmmxt_set_mup();
59
break;
60
@@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn)
61
wrd = (insn >> 12) & 0xf;
62
rd0 = (insn >> 16) & 0xf;
63
gen_op_iwmmxt_movq_M0_wRn(rd0);
64
- tmp = tcg_const_i32(((insn >> 16) & 0xf0) | (insn & 0x0f));
65
+ tmp = tcg_constant_i32(((insn >> 16) & 0xf0) | (insn & 0x0f));
66
gen_helper_iwmmxt_shufh(cpu_M0, cpu_env, cpu_M0, tmp);
67
- tcg_temp_free_i32(tmp);
68
gen_op_iwmmxt_movq_wRn_M0(wrd);
69
gen_op_iwmmxt_set_mup();
70
gen_op_iwmmxt_set_cup();
71
--
72
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-25-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 22 +++++++++-------------
9
1 file changed, 9 insertions(+), 13 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool msr_banked_access_decode(DisasContext *s, int r, int sysm, int rn,
16
tcg_gen_sextract_i32(tcg_el, tcg_el, ctz32(SCR_EEL2), 1);
17
tcg_gen_addi_i32(tcg_el, tcg_el, 3);
18
} else {
19
- tcg_el = tcg_const_i32(3);
20
+ tcg_el = tcg_constant_i32(3);
21
}
22
23
gen_exception_el(s, EXCP_UDEF, syn_uncategorized(), tcg_el);
24
@@ -XXX,XX +XXX,XX @@ undef:
25
26
static void gen_msr_banked(DisasContext *s, int r, int sysm, int rn)
27
{
28
- TCGv_i32 tcg_reg, tcg_tgtmode, tcg_regno;
29
+ TCGv_i32 tcg_reg;
30
int tgtmode = 0, regno = 0;
31
32
if (!msr_banked_access_decode(s, r, sysm, rn, &tgtmode, &regno)) {
33
@@ -XXX,XX +XXX,XX @@ static void gen_msr_banked(DisasContext *s, int r, int sysm, int rn)
34
gen_set_condexec(s);
35
gen_set_pc_im(s, s->pc_curr);
36
tcg_reg = load_reg(s, rn);
37
- tcg_tgtmode = tcg_const_i32(tgtmode);
38
- tcg_regno = tcg_const_i32(regno);
39
- gen_helper_msr_banked(cpu_env, tcg_reg, tcg_tgtmode, tcg_regno);
40
- tcg_temp_free_i32(tcg_tgtmode);
41
- tcg_temp_free_i32(tcg_regno);
42
+ gen_helper_msr_banked(cpu_env, tcg_reg,
43
+ tcg_constant_i32(tgtmode),
44
+ tcg_constant_i32(regno));
45
tcg_temp_free_i32(tcg_reg);
46
s->base.is_jmp = DISAS_UPDATE_EXIT;
47
}
48
49
static void gen_mrs_banked(DisasContext *s, int r, int sysm, int rn)
50
{
51
- TCGv_i32 tcg_reg, tcg_tgtmode, tcg_regno;
52
+ TCGv_i32 tcg_reg;
53
int tgtmode = 0, regno = 0;
54
55
if (!msr_banked_access_decode(s, r, sysm, rn, &tgtmode, &regno)) {
56
@@ -XXX,XX +XXX,XX @@ static void gen_mrs_banked(DisasContext *s, int r, int sysm, int rn)
57
gen_set_condexec(s);
58
gen_set_pc_im(s, s->pc_curr);
59
tcg_reg = tcg_temp_new_i32();
60
- tcg_tgtmode = tcg_const_i32(tgtmode);
61
- tcg_regno = tcg_const_i32(regno);
62
- gen_helper_mrs_banked(tcg_reg, cpu_env, tcg_tgtmode, tcg_regno);
63
- tcg_temp_free_i32(tcg_tgtmode);
64
- tcg_temp_free_i32(tcg_regno);
65
+ gen_helper_mrs_banked(tcg_reg, cpu_env,
66
+ tcg_constant_i32(tgtmode),
67
+ tcg_constant_i32(regno));
68
store_reg(s, rn, tcg_reg);
69
s->base.is_jmp = DISAS_UPDATE_EXIT;
70
}
71
--
72
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
In these cases, 't' did double-duty as zero source and
3
and use a class AspeedSCUClass to define each SoC characteristics.
4
temporary destination. Split the two uses.
4
5
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20190904070506.1052-10-clg@kaod.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Message-id: 20220426163043.100432-46-richard.henderson@linaro.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
target/arm/translate-sve.c | 17 ++++++++---------
10
include/hw/misc/aspeed_scu.h | 15 +++++++
12
1 file changed, 8 insertions(+), 9 deletions(-)
11
hw/arm/aspeed_soc.c | 3 +-
13
12
hw/misc/aspeed_scu.c | 83 ++++++++++++++++++++----------------
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
3 files changed, 64 insertions(+), 37 deletions(-)
14
15
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/include/hw/misc/aspeed_scu.h
17
+++ b/target/arm/translate-sve.c
18
+++ b/include/hw/misc/aspeed_scu.h
18
@@ -XXX,XX +XXX,XX @@ static void do_predtest(DisasContext *s, int dofs, int gofs, int words)
19
@@ -XXX,XX +XXX,XX @@
19
{
20
20
TCGv_ptr dptr = tcg_temp_new_ptr();
21
#define TYPE_ASPEED_SCU "aspeed.scu"
21
TCGv_ptr gptr = tcg_temp_new_ptr();
22
#define ASPEED_SCU(obj) OBJECT_CHECK(AspeedSCUState, (obj), TYPE_ASPEED_SCU)
22
- TCGv_i32 t;
23
+#define TYPE_ASPEED_2400_SCU TYPE_ASPEED_SCU "-ast2400"
23
+ TCGv_i32 t = tcg_temp_new_i32();
24
+#define TYPE_ASPEED_2500_SCU TYPE_ASPEED_SCU "-ast2500"
24
25
25
tcg_gen_addi_ptr(dptr, cpu_env, dofs);
26
#define ASPEED_SCU_NR_REGS (0x1A8 >> 2)
26
tcg_gen_addi_ptr(gptr, cpu_env, gofs);
27
27
- t = tcg_const_i32(words);
28
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSCUState {
28
29
29
- gen_helper_sve_predtest(t, dptr, gptr, t);
30
extern bool is_supported_silicon_rev(uint32_t silicon_rev);
30
+ gen_helper_sve_predtest(t, dptr, gptr, tcg_constant_i32(words));
31
31
tcg_temp_free_ptr(dptr);
32
+#define ASPEED_SCU_CLASS(klass) \
32
tcg_temp_free_ptr(gptr);
33
+ OBJECT_CLASS_CHECK(AspeedSCUClass, (klass), TYPE_ASPEED_SCU)
33
34
+#define ASPEED_SCU_GET_CLASS(obj) \
34
@@ -XXX,XX +XXX,XX @@ static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
35
+ OBJECT_GET_CLASS(AspeedSCUClass, (obj), TYPE_ASPEED_SCU)
35
36
+
36
tcg_gen_addi_ptr(t_pd, cpu_env, pred_full_reg_offset(s, a->rd));
37
+typedef struct AspeedSCUClass {
37
tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, a->rn));
38
+ SysBusDeviceClass parent_class;
38
- t = tcg_const_i32(desc);
39
+
39
+ t = tcg_temp_new_i32();
40
+ const uint32_t *resets;
40
41
+ uint32_t (*calc_hpll)(AspeedSCUState *s);
41
- gen_fn(t, t_pd, t_pg, t);
42
+ uint32_t apb_divider;
42
+ gen_fn(t, t_pd, t_pg, tcg_constant_i32(desc));
43
+} AspeedSCUClass;
43
tcg_temp_free_ptr(t_pd);
44
+
44
tcg_temp_free_ptr(t_pg);
45
#define ASPEED_SCU_PROT_KEY 0x1688A8A8
45
46
46
@@ -XXX,XX +XXX,XX @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
47
/*
48
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/arm/aspeed_soc.c
51
+++ b/hw/arm/aspeed_soc.c
52
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_init(Object *obj)
53
&error_abort, NULL);
47
}
54
}
48
55
49
vsz = vec_full_reg_size(s);
56
+ snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
50
- t = tcg_const_i32(simd_desc(vsz, vsz, 0));
57
sysbus_init_child_obj(obj, "scu", OBJECT(&s->scu), sizeof(s->scu),
51
+ t = tcg_temp_new_i32();
58
- TYPE_ASPEED_SCU);
52
pd = tcg_temp_new_ptr();
59
+ typename);
53
zn = tcg_temp_new_ptr();
60
qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev",
54
zm = tcg_temp_new_ptr();
61
sc->info->silicon_rev);
55
@@ -XXX,XX +XXX,XX @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
62
object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu),
56
tcg_gen_addi_ptr(zm, cpu_env, vec_full_reg_offset(s, a->rm));
63
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
57
tcg_gen_addi_ptr(pg, cpu_env, pred_full_reg_offset(s, a->pg));
64
index XXXXXXX..XXXXXXX 100644
58
65
--- a/hw/misc/aspeed_scu.c
59
- gen_fn(t, pd, zn, zm, pg, t);
66
+++ b/hw/misc/aspeed_scu.c
60
+ gen_fn(t, pd, zn, zm, pg, tcg_constant_i32(simd_desc(vsz, vsz, 0)));
67
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_scu_get_random(void)
61
68
62
tcg_temp_free_ptr(pd);
69
static void aspeed_scu_set_apb_freq(AspeedSCUState *s)
63
tcg_temp_free_ptr(zn);
70
{
64
@@ -XXX,XX +XXX,XX @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a,
71
- uint32_t apb_divider;
65
}
72
-
66
73
- switch (s->silicon_rev) {
67
vsz = vec_full_reg_size(s);
74
- case AST2400_A0_SILICON_REV:
68
- t = tcg_const_i32(simd_desc(vsz, vsz, a->imm));
75
- case AST2400_A1_SILICON_REV:
69
+ t = tcg_temp_new_i32();
76
- apb_divider = 2;
70
pd = tcg_temp_new_ptr();
77
- break;
71
zn = tcg_temp_new_ptr();
78
- case AST2500_A0_SILICON_REV:
72
pg = tcg_temp_new_ptr();
79
- case AST2500_A1_SILICON_REV:
73
@@ -XXX,XX +XXX,XX @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a,
80
- apb_divider = 4;
74
tcg_gen_addi_ptr(zn, cpu_env, vec_full_reg_offset(s, a->rn));
81
- break;
75
tcg_gen_addi_ptr(pg, cpu_env, pred_full_reg_offset(s, a->pg));
82
- default:
76
83
- g_assert_not_reached();
77
- gen_fn(t, pd, zn, pg, t);
84
- }
78
+ gen_fn(t, pd, zn, pg, tcg_constant_i32(simd_desc(vsz, vsz, a->imm)));
85
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
79
86
80
tcg_temp_free_ptr(pd);
87
s->apb_freq = s->hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[CLK_SEL]) + 1)
81
tcg_temp_free_ptr(zn);
88
- / apb_divider;
89
+ / asc->apb_divider;
90
}
91
92
static uint64_t aspeed_scu_read(void *opaque, hwaddr offset, unsigned size)
93
@@ -XXX,XX +XXX,XX @@ static const uint32_t hpll_ast2400_freqs[][4] = {
94
{ 400, 375, 350, 425 }, /* 25MHz */
95
};
96
97
-static uint32_t aspeed_scu_calc_hpll_ast2400(AspeedSCUState *s)
98
+static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUState *s)
99
{
100
uint32_t hpll_reg = s->regs[HPLL_PARAM];
101
uint8_t freq_select;
102
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_scu_calc_hpll_ast2400(AspeedSCUState *s)
103
return hpll_ast2400_freqs[clk_25m_in][freq_select] * 1000000;
104
}
105
106
-static uint32_t aspeed_scu_calc_hpll_ast2500(AspeedSCUState *s)
107
+static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s)
108
{
109
uint32_t hpll_reg = s->regs[HPLL_PARAM];
110
uint32_t multiplier = 1;
111
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_scu_calc_hpll_ast2500(AspeedSCUState *s)
112
static void aspeed_scu_reset(DeviceState *dev)
113
{
114
AspeedSCUState *s = ASPEED_SCU(dev);
115
- const uint32_t *reset;
116
- uint32_t (*calc_hpll)(AspeedSCUState *s);
117
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(dev);
118
119
- switch (s->silicon_rev) {
120
- case AST2400_A0_SILICON_REV:
121
- case AST2400_A1_SILICON_REV:
122
- reset = ast2400_a0_resets;
123
- calc_hpll = aspeed_scu_calc_hpll_ast2400;
124
- break;
125
- case AST2500_A0_SILICON_REV:
126
- case AST2500_A1_SILICON_REV:
127
- reset = ast2500_a1_resets;
128
- calc_hpll = aspeed_scu_calc_hpll_ast2500;
129
- break;
130
- default:
131
- g_assert_not_reached();
132
- }
133
-
134
- memcpy(s->regs, reset, sizeof(s->regs));
135
+ memcpy(s->regs, asc->resets, sizeof(s->regs));
136
s->regs[SILICON_REV] = s->silicon_rev;
137
s->regs[HW_STRAP1] = s->hw_strap1;
138
s->regs[HW_STRAP2] = s->hw_strap2;
139
@@ -XXX,XX +XXX,XX @@ static void aspeed_scu_reset(DeviceState *dev)
140
* All registers are set. Now compute the frequencies of the main clocks
141
*/
142
s->clkin = aspeed_scu_get_clkin(s);
143
- s->hpll = calc_hpll(s);
144
+ s->hpll = asc->calc_hpll(s);
145
aspeed_scu_set_apb_freq(s);
146
}
147
148
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_scu_info = {
149
.parent = TYPE_SYS_BUS_DEVICE,
150
.instance_size = sizeof(AspeedSCUState),
151
.class_init = aspeed_scu_class_init,
152
+ .class_size = sizeof(AspeedSCUClass),
153
+ .abstract = true,
154
+};
155
+
156
+static void aspeed_2400_scu_class_init(ObjectClass *klass, void *data)
157
+{
158
+ DeviceClass *dc = DEVICE_CLASS(klass);
159
+ AspeedSCUClass *asc = ASPEED_SCU_CLASS(klass);
160
+
161
+ dc->desc = "ASPEED 2400 System Control Unit";
162
+ asc->resets = ast2400_a0_resets;
163
+ asc->calc_hpll = aspeed_2400_scu_calc_hpll;
164
+ asc->apb_divider = 2;
165
+}
166
+
167
+static const TypeInfo aspeed_2400_scu_info = {
168
+ .name = TYPE_ASPEED_2400_SCU,
169
+ .parent = TYPE_ASPEED_SCU,
170
+ .instance_size = sizeof(AspeedSCUState),
171
+ .class_init = aspeed_2400_scu_class_init,
172
+};
173
+
174
+static void aspeed_2500_scu_class_init(ObjectClass *klass, void *data)
175
+{
176
+ DeviceClass *dc = DEVICE_CLASS(klass);
177
+ AspeedSCUClass *asc = ASPEED_SCU_CLASS(klass);
178
+
179
+ dc->desc = "ASPEED 2500 System Control Unit";
180
+ asc->resets = ast2500_a1_resets;
181
+ asc->calc_hpll = aspeed_2500_scu_calc_hpll;
182
+ asc->apb_divider = 4;
183
+}
184
+
185
+static const TypeInfo aspeed_2500_scu_info = {
186
+ .name = TYPE_ASPEED_2500_SCU,
187
+ .parent = TYPE_ASPEED_SCU,
188
+ .instance_size = sizeof(AspeedSCUState),
189
+ .class_init = aspeed_2500_scu_class_init,
190
};
191
192
static void aspeed_scu_register_types(void)
193
{
194
type_register_static(&aspeed_scu_info);
195
+ type_register_static(&aspeed_2400_scu_info);
196
+ type_register_static(&aspeed_2500_scu_info);
197
}
198
199
type_init(aspeed_scu_register_types);
82
--
200
--
83
2.25.1
201
2.20.1
202
203
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
The APB frequency can be calculated directly when needed from the
4
HPLL_PARAM and CLK_SEL register values. This removes useless state in
5
the model.
6
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Message-id: 20190904070506.1052-11-clg@kaod.org
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-26-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/translate.c | 27 +++++++++------------------
12
include/hw/misc/aspeed_scu.h | 8 +++-----
9
1 file changed, 9 insertions(+), 18 deletions(-)
13
hw/misc/aspeed_scu.c | 25 +++++++++----------------
14
hw/timer/aspeed_timer.c | 3 ++-
15
3 files changed, 14 insertions(+), 22 deletions(-)
10
16
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
17
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
19
--- a/include/hw/misc/aspeed_scu.h
14
+++ b/target/arm/translate.c
20
+++ b/include/hw/misc/aspeed_scu.h
15
@@ -XXX,XX +XXX,XX @@ void gen_gvec_sqrdmlsh_qc(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
21
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSCUState {
16
} \
22
uint32_t hw_strap1;
17
static void gen_##NAME##0_vec(unsigned vece, TCGv_vec d, TCGv_vec a) \
23
uint32_t hw_strap2;
18
{ \
24
uint32_t hw_prot_key;
19
- TCGv_vec zero = tcg_const_zeros_vec_matching(d); \
25
-
20
+ TCGv_vec zero = tcg_constant_vec_matching(d, vece, 0); \
26
- uint32_t clkin;
21
tcg_gen_cmp_vec(COND, vece, d, a, zero); \
27
- uint32_t hpll;
22
- tcg_temp_free_vec(zero); \
28
- uint32_t apb_freq;
23
} \
29
} AspeedSCUState;
24
void gen_gvec_##NAME##0(unsigned vece, uint32_t d, uint32_t m, \
30
25
uint32_t opr_sz, uint32_t max_sz) \
31
#define AST2400_A0_SILICON_REV 0x02000303U
26
@@ -XXX,XX +XXX,XX @@ void gen_ushl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift)
32
@@ -XXX,XX +XXX,XX @@ typedef struct AspeedSCUClass {
27
TCGv_i32 rval = tcg_temp_new_i32();
33
SysBusDeviceClass parent_class;
28
TCGv_i32 lsh = tcg_temp_new_i32();
34
29
TCGv_i32 rsh = tcg_temp_new_i32();
35
const uint32_t *resets;
30
- TCGv_i32 zero = tcg_const_i32(0);
36
- uint32_t (*calc_hpll)(AspeedSCUState *s);
31
- TCGv_i32 max = tcg_const_i32(32);
37
+ uint32_t (*calc_hpll)(AspeedSCUState *s, uint32_t hpll_reg);
32
+ TCGv_i32 zero = tcg_constant_i32(0);
38
uint32_t apb_divider;
33
+ TCGv_i32 max = tcg_constant_i32(32);
39
} AspeedSCUClass;
34
40
35
/*
41
#define ASPEED_SCU_PROT_KEY 0x1688A8A8
36
* Rely on the TCG guarantee that out of range shifts produce
42
37
@@ -XXX,XX +XXX,XX @@ void gen_ushl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift)
43
+uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
38
tcg_temp_free_i32(rval);
44
+
39
tcg_temp_free_i32(lsh);
45
/*
40
tcg_temp_free_i32(rsh);
46
* Extracted from Aspeed SDK v00.03.21. Fixes and extra definitions
41
- tcg_temp_free_i32(zero);
47
* were added.
42
- tcg_temp_free_i32(max);
48
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/hw/misc/aspeed_scu.c
51
+++ b/hw/misc/aspeed_scu.c
52
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_scu_get_random(void)
53
return num;
43
}
54
}
44
55
45
void gen_ushl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
56
-static void aspeed_scu_set_apb_freq(AspeedSCUState *s)
46
@@ -XXX,XX +XXX,XX @@ void gen_ushl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
57
+uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s)
47
TCGv_i64 rval = tcg_temp_new_i64();
58
{
48
TCGv_i64 lsh = tcg_temp_new_i64();
59
AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
49
TCGv_i64 rsh = tcg_temp_new_i64();
60
+ uint32_t hpll = asc->calc_hpll(s, s->regs[HPLL_PARAM]);
50
- TCGv_i64 zero = tcg_const_i64(0);
61
51
- TCGv_i64 max = tcg_const_i64(64);
62
- s->apb_freq = s->hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[CLK_SEL]) + 1)
52
+ TCGv_i64 zero = tcg_constant_i64(0);
63
+ return hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[CLK_SEL]) + 1)
53
+ TCGv_i64 max = tcg_constant_i64(64);
64
/ asc->apb_divider;
54
55
/*
56
* Rely on the TCG guarantee that out of range shifts produce
57
@@ -XXX,XX +XXX,XX @@ void gen_ushl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
58
tcg_temp_free_i64(rval);
59
tcg_temp_free_i64(lsh);
60
tcg_temp_free_i64(rsh);
61
- tcg_temp_free_i64(zero);
62
- tcg_temp_free_i64(max);
63
}
65
}
64
66
65
static void gen_ushl_vec(unsigned vece, TCGv_vec dst,
67
@@ -XXX,XX +XXX,XX @@ static void aspeed_scu_write(void *opaque, hwaddr offset, uint64_t data,
66
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift)
68
return;
67
TCGv_i32 rval = tcg_temp_new_i32();
69
case CLK_SEL:
68
TCGv_i32 lsh = tcg_temp_new_i32();
70
s->regs[reg] = data;
69
TCGv_i32 rsh = tcg_temp_new_i32();
71
- aspeed_scu_set_apb_freq(s);
70
- TCGv_i32 zero = tcg_const_i32(0);
72
break;
71
- TCGv_i32 max = tcg_const_i32(31);
73
case HW_STRAP1:
72
+ TCGv_i32 zero = tcg_constant_i32(0);
74
if (ASPEED_IS_AST2500(s->regs[SILICON_REV])) {
73
+ TCGv_i32 max = tcg_constant_i32(31);
75
@@ -XXX,XX +XXX,XX @@ static const uint32_t hpll_ast2400_freqs[][4] = {
74
76
{ 400, 375, 350, 425 }, /* 25MHz */
75
/*
77
};
76
* Rely on the TCG guarantee that out of range shifts produce
78
77
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift)
79
-static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUState *s)
78
tcg_temp_free_i32(rval);
80
+static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUState *s, uint32_t hpll_reg)
79
tcg_temp_free_i32(lsh);
81
{
80
tcg_temp_free_i32(rsh);
82
- uint32_t hpll_reg = s->regs[HPLL_PARAM];
81
- tcg_temp_free_i32(zero);
83
uint8_t freq_select;
82
- tcg_temp_free_i32(max);
84
bool clk_25m_in;
85
+ uint32_t clkin = aspeed_scu_get_clkin(s);
86
87
if (hpll_reg & SCU_AST2400_H_PLL_OFF) {
88
return 0;
89
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUState *s)
90
multiplier = (2 - od) * ((n + 2) / (d + 1));
91
}
92
93
- return s->clkin * multiplier;
94
+ return clkin * multiplier;
95
}
96
97
/* HW strapping */
98
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2400_scu_calc_hpll(AspeedSCUState *s)
99
return hpll_ast2400_freqs[clk_25m_in][freq_select] * 1000000;
83
}
100
}
84
101
85
void gen_sshl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
102
-static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s)
86
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
103
+static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s, uint32_t hpll_reg)
87
TCGv_i64 rval = tcg_temp_new_i64();
104
{
88
TCGv_i64 lsh = tcg_temp_new_i64();
105
- uint32_t hpll_reg = s->regs[HPLL_PARAM];
89
TCGv_i64 rsh = tcg_temp_new_i64();
106
uint32_t multiplier = 1;
90
- TCGv_i64 zero = tcg_const_i64(0);
107
+ uint32_t clkin = aspeed_scu_get_clkin(s);
91
- TCGv_i64 max = tcg_const_i64(63);
108
92
+ TCGv_i64 zero = tcg_constant_i64(0);
109
if (hpll_reg & SCU_H_PLL_OFF) {
93
+ TCGv_i64 max = tcg_constant_i64(63);
110
return 0;
94
111
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s)
95
/*
112
multiplier = ((m + 1) / (n + 1)) / (p + 1);
96
* Rely on the TCG guarantee that out of range shifts produce
113
}
97
@@ -XXX,XX +XXX,XX @@ void gen_sshl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift)
114
98
tcg_temp_free_i64(rval);
115
- return s->clkin * multiplier;
99
tcg_temp_free_i64(lsh);
116
+ return clkin * multiplier;
100
tcg_temp_free_i64(rsh);
101
- tcg_temp_free_i64(zero);
102
- tcg_temp_free_i64(max);
103
}
117
}
104
118
105
static void gen_sshl_vec(unsigned vece, TCGv_vec dst,
119
static void aspeed_scu_reset(DeviceState *dev)
120
@@ -XXX,XX +XXX,XX @@ static void aspeed_scu_reset(DeviceState *dev)
121
s->regs[HW_STRAP1] = s->hw_strap1;
122
s->regs[HW_STRAP2] = s->hw_strap2;
123
s->regs[PROT_KEY] = s->hw_prot_key;
124
-
125
- /*
126
- * All registers are set. Now compute the frequencies of the main clocks
127
- */
128
- s->clkin = aspeed_scu_get_clkin(s);
129
- s->hpll = asc->calc_hpll(s);
130
- aspeed_scu_set_apb_freq(s);
131
}
132
133
static uint32_t aspeed_silicon_revs[] = {
134
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
135
index XXXXXXX..XXXXXXX 100644
136
--- a/hw/timer/aspeed_timer.c
137
+++ b/hw/timer/aspeed_timer.c
138
@@ -XXX,XX +XXX,XX @@ static inline uint32_t calculate_rate(struct AspeedTimer *t)
139
{
140
AspeedTimerCtrlState *s = timer_to_ctrl(t);
141
142
- return timer_external_clock(t) ? TIMER_CLOCK_EXT_HZ : s->scu->apb_freq;
143
+ return timer_external_clock(t) ? TIMER_CLOCK_EXT_HZ :
144
+ aspeed_scu_get_apb_freq(s->scu);
145
}
146
147
static inline uint32_t calculate_ticks(struct AspeedTimer *t, uint64_t now_ns)
106
--
148
--
107
2.25.1
149
2.20.1
150
151
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-27-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 43 +++++++++++++-----------------------------
9
1 file changed, 13 insertions(+), 30 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
16
* Note that on XScale all cp0..c13 registers do an access check
17
* call in order to handle c15_cpar.
18
*/
19
- TCGv_ptr tmpptr;
20
- TCGv_i32 tcg_syn, tcg_isread;
21
uint32_t syndrome;
22
23
/* Note that since we are an implementation which takes an
24
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
25
26
gen_set_condexec(s);
27
gen_set_pc_im(s, s->pc_curr);
28
- tmpptr = tcg_const_ptr(ri);
29
- tcg_syn = tcg_const_i32(syndrome);
30
- tcg_isread = tcg_const_i32(isread);
31
- gen_helper_access_check_cp_reg(cpu_env, tmpptr, tcg_syn,
32
- tcg_isread);
33
- tcg_temp_free_ptr(tmpptr);
34
- tcg_temp_free_i32(tcg_syn);
35
- tcg_temp_free_i32(tcg_isread);
36
+ gen_helper_access_check_cp_reg(cpu_env,
37
+ tcg_constant_ptr(ri),
38
+ tcg_constant_i32(syndrome),
39
+ tcg_constant_i32(isread));
40
} else if (ri->type & ARM_CP_RAISES_EXC) {
41
/*
42
* The readfn or writefn might raise an exception;
43
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
44
TCGv_i64 tmp64;
45
TCGv_i32 tmp;
46
if (ri->type & ARM_CP_CONST) {
47
- tmp64 = tcg_const_i64(ri->resetvalue);
48
+ tmp64 = tcg_constant_i64(ri->resetvalue);
49
} else if (ri->readfn) {
50
- TCGv_ptr tmpptr;
51
tmp64 = tcg_temp_new_i64();
52
- tmpptr = tcg_const_ptr(ri);
53
- gen_helper_get_cp_reg64(tmp64, cpu_env, tmpptr);
54
- tcg_temp_free_ptr(tmpptr);
55
+ gen_helper_get_cp_reg64(tmp64, cpu_env,
56
+ tcg_constant_ptr(ri));
57
} else {
58
tmp64 = tcg_temp_new_i64();
59
tcg_gen_ld_i64(tmp64, cpu_env, ri->fieldoffset);
60
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
61
} else {
62
TCGv_i32 tmp;
63
if (ri->type & ARM_CP_CONST) {
64
- tmp = tcg_const_i32(ri->resetvalue);
65
+ tmp = tcg_constant_i32(ri->resetvalue);
66
} else if (ri->readfn) {
67
- TCGv_ptr tmpptr;
68
tmp = tcg_temp_new_i32();
69
- tmpptr = tcg_const_ptr(ri);
70
- gen_helper_get_cp_reg(tmp, cpu_env, tmpptr);
71
- tcg_temp_free_ptr(tmpptr);
72
+ gen_helper_get_cp_reg(tmp, cpu_env, tcg_constant_ptr(ri));
73
} else {
74
tmp = load_cpu_offset(ri->fieldoffset);
75
}
76
@@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64,
77
tcg_temp_free_i32(tmplo);
78
tcg_temp_free_i32(tmphi);
79
if (ri->writefn) {
80
- TCGv_ptr tmpptr = tcg_const_ptr(ri);
81
- gen_helper_set_cp_reg64(cpu_env, tmpptr, tmp64);
82
- tcg_temp_free_ptr(tmpptr);
83
+ gen_helper_set_cp_reg64(cpu_env, tcg_constant_ptr(ri),
84
+ tmp64);
85
} else {
86
tcg_gen_st_i64(tmp64, cpu_env, ri->fieldoffset);
87
}
88
tcg_temp_free_i64(tmp64);
89
} else {
90
+ TCGv_i32 tmp = load_reg(s, rt);
91
if (ri->writefn) {
92
- TCGv_i32 tmp;
93
- TCGv_ptr tmpptr;
94
- tmp = load_reg(s, rt);
95
- tmpptr = tcg_const_ptr(ri);
96
- gen_helper_set_cp_reg(cpu_env, tmpptr, tmp);
97
- tcg_temp_free_ptr(tmpptr);
98
+ gen_helper_set_cp_reg(cpu_env, tcg_constant_ptr(ri), tmp);
99
tcg_temp_free_i32(tmp);
100
} else {
101
- TCGv_i32 tmp = load_reg(s, rt);
102
store_cpu_offset(tmp, ri->fieldoffset, 4);
103
}
104
}
105
--
106
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-28-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 8 ++------
9
1 file changed, 2 insertions(+), 6 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s,
16
}
17
18
addr = tcg_temp_new_i32();
19
- tmp = tcg_const_i32(mode);
20
/* get_r13_banked() will raise an exception if called from System mode */
21
gen_set_condexec(s);
22
gen_set_pc_im(s, s->pc_curr);
23
- gen_helper_get_r13_banked(addr, cpu_env, tmp);
24
- tcg_temp_free_i32(tmp);
25
+ gen_helper_get_r13_banked(addr, cpu_env, tcg_constant_i32(mode));
26
switch (amode) {
27
case 0: /* DA */
28
offset = -4;
29
@@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s,
30
abort();
31
}
32
tcg_gen_addi_i32(addr, addr, offset);
33
- tmp = tcg_const_i32(mode);
34
- gen_helper_set_r13_banked(cpu_env, tmp, addr);
35
- tcg_temp_free_i32(tmp);
36
+ gen_helper_set_r13_banked(cpu_env, tcg_constant_i32(mode), addr);
37
}
38
tcg_temp_free_i32(addr);
39
s->base.is_jmp = DISAS_UPDATE_EXIT;
40
--
41
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-29-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 11 +++++------
9
1 file changed, 5 insertions(+), 6 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool op_s_rri_rot(DisasContext *s, arg_s_rri_rot *a,
16
void (*gen)(TCGv_i32, TCGv_i32, TCGv_i32),
17
int logic_cc, StoreRegKind kind)
18
{
19
- TCGv_i32 tmp1, tmp2;
20
+ TCGv_i32 tmp1;
21
uint32_t imm;
22
23
imm = ror32(a->imm, a->rot);
24
if (logic_cc && a->rot) {
25
tcg_gen_movi_i32(cpu_CF, imm >> 31);
26
}
27
- tmp2 = tcg_const_i32(imm);
28
tmp1 = load_reg(s, a->rn);
29
30
- gen(tmp1, tmp1, tmp2);
31
- tcg_temp_free_i32(tmp2);
32
+ gen(tmp1, tmp1, tcg_constant_i32(imm));
33
34
if (logic_cc) {
35
gen_logic_CC(tmp1);
36
@@ -XXX,XX +XXX,XX @@ static bool op_s_rxi_rot(DisasContext *s, arg_s_rri_rot *a,
37
if (logic_cc && a->rot) {
38
tcg_gen_movi_i32(cpu_CF, imm >> 31);
39
}
40
- tmp = tcg_const_i32(imm);
41
42
- gen(tmp, tmp);
43
+ tmp = tcg_temp_new_i32();
44
+ gen(tmp, tcg_constant_i32(imm));
45
+
46
if (logic_cc) {
47
gen_logic_CC(tmp);
48
}
49
--
50
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-30-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 11 +++--------
9
1 file changed, 3 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_ADR(DisasContext *s, arg_ri *a)
16
17
static bool trans_MOVW(DisasContext *s, arg_MOVW *a)
18
{
19
- TCGv_i32 tmp;
20
-
21
if (!ENABLE_ARCH_6T2) {
22
return false;
23
}
24
25
- tmp = tcg_const_i32(a->imm);
26
- store_reg(s, a->rd, tmp);
27
+ store_reg(s, a->rd, tcg_constant_i32(a->imm));
28
return true;
29
}
30
31
@@ -XXX,XX +XXX,XX @@ static bool trans_UMAAL(DisasContext *s, arg_UMAAL *a)
32
t0 = load_reg(s, a->rm);
33
t1 = load_reg(s, a->rn);
34
tcg_gen_mulu2_i32(t0, t1, t0, t1);
35
- zero = tcg_const_i32(0);
36
+ zero = tcg_constant_i32(0);
37
t2 = load_reg(s, a->ra);
38
tcg_gen_add2_i32(t0, t1, t0, t1, t2, zero);
39
tcg_temp_free_i32(t2);
40
t2 = load_reg(s, a->rd);
41
tcg_gen_add2_i32(t0, t1, t0, t1, t2, zero);
42
tcg_temp_free_i32(t2);
43
- tcg_temp_free_i32(zero);
44
store_reg(s, a->ra, t0);
45
store_reg(s, a->rd, t1);
46
return true;
47
@@ -XXX,XX +XXX,XX @@ static bool op_crc32(DisasContext *s, arg_rrr *a, bool c, MemOp sz)
48
default:
49
g_assert_not_reached();
50
}
51
- t3 = tcg_const_i32(1 << sz);
52
+ t3 = tcg_constant_i32(1 << sz);
53
if (c) {
54
gen_helper_crc32c(t1, t1, t2, t3);
55
} else {
56
gen_helper_crc32(t1, t1, t2, t3);
57
}
58
tcg_temp_free_i32(t2);
59
- tcg_temp_free_i32(t3);
60
store_reg(s, a->rd, t1);
61
return true;
62
}
63
--
64
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-31-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 7 +++----
9
1 file changed, 3 insertions(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_MRS_v7m(DisasContext *s, arg_MRS_v7m *a)
16
if (!arm_dc_feature(s, ARM_FEATURE_M)) {
17
return false;
18
}
19
- tmp = tcg_const_i32(a->sysm);
20
- gen_helper_v7m_mrs(tmp, cpu_env, tmp);
21
+ tmp = tcg_temp_new_i32();
22
+ gen_helper_v7m_mrs(tmp, cpu_env, tcg_constant_i32(a->sysm));
23
store_reg(s, a->rd, tmp);
24
return true;
25
}
26
@@ -XXX,XX +XXX,XX @@ static bool trans_MSR_v7m(DisasContext *s, arg_MSR_v7m *a)
27
if (!arm_dc_feature(s, ARM_FEATURE_M)) {
28
return false;
29
}
30
- addr = tcg_const_i32((a->mask << 10) | a->sysm);
31
+ addr = tcg_constant_i32((a->mask << 10) | a->sysm);
32
reg = load_reg(s, a->rn);
33
gen_helper_v7m_msr(cpu_env, addr, reg);
34
- tcg_temp_free_i32(addr);
35
tcg_temp_free_i32(reg);
36
/* If we wrote to CONTROL, the EL might have changed */
37
gen_rebuild_hflags(s, true);
38
--
39
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-32-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 14 +++++---------
9
1 file changed, 5 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_TT(DisasContext *s, arg_TT *a)
16
}
17
18
addr = load_reg(s, a->rn);
19
- tmp = tcg_const_i32((a->A << 1) | a->T);
20
- gen_helper_v7m_tt(tmp, cpu_env, addr, tmp);
21
+ tmp = tcg_temp_new_i32();
22
+ gen_helper_v7m_tt(tmp, cpu_env, addr, tcg_constant_i32((a->A << 1) | a->T));
23
tcg_temp_free_i32(addr);
24
store_reg(s, a->rd, tmp);
25
return true;
26
@@ -XXX,XX +XXX,XX @@ static bool trans_PKH(DisasContext *s, arg_PKH *a)
27
static bool op_sat(DisasContext *s, arg_sat *a,
28
void (*gen)(TCGv_i32, TCGv_env, TCGv_i32, TCGv_i32))
29
{
30
- TCGv_i32 tmp, satimm;
31
+ TCGv_i32 tmp;
32
int shift = a->imm;
33
34
if (!ENABLE_ARCH_6) {
35
@@ -XXX,XX +XXX,XX @@ static bool op_sat(DisasContext *s, arg_sat *a,
36
tcg_gen_shli_i32(tmp, tmp, shift);
37
}
38
39
- satimm = tcg_const_i32(a->satimm);
40
- gen(tmp, cpu_env, tmp, satimm);
41
- tcg_temp_free_i32(satimm);
42
+ gen(tmp, cpu_env, tmp, tcg_constant_i32(a->satimm));
43
44
store_reg(s, a->rd, tmp);
45
return true;
46
@@ -XXX,XX +XXX,XX @@ static bool op_smmla(DisasContext *s, arg_rrrr *a, bool round, bool sub)
47
* a non-zero multiplicand lowpart, and the correct result
48
* lowpart for rounding.
49
*/
50
- TCGv_i32 zero = tcg_const_i32(0);
51
- tcg_gen_sub2_i32(t2, t1, zero, t3, t2, t1);
52
- tcg_temp_free_i32(zero);
53
+ tcg_gen_sub2_i32(t2, t1, tcg_constant_i32(0), t3, t2, t1);
54
} else {
55
tcg_gen_add_i32(t1, t1, t3);
56
}
57
--
58
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-33-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 12 ++++--------
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
16
{
17
int i, j, n, list, mem_idx;
18
bool user = a->u;
19
- TCGv_i32 addr, tmp, tmp2;
20
+ TCGv_i32 addr, tmp;
21
22
if (user) {
23
/* STM (user) */
24
@@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n)
25
26
if (user && i != 15) {
27
tmp = tcg_temp_new_i32();
28
- tmp2 = tcg_const_i32(i);
29
- gen_helper_get_user_reg(tmp, cpu_env, tmp2);
30
- tcg_temp_free_i32(tmp2);
31
+ gen_helper_get_user_reg(tmp, cpu_env, tcg_constant_i32(i));
32
} else {
33
tmp = load_reg(s, i);
34
}
35
@@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
36
bool loaded_base;
37
bool user = a->u;
38
bool exc_return = false;
39
- TCGv_i32 addr, tmp, tmp2, loaded_var;
40
+ TCGv_i32 addr, tmp, loaded_var;
41
42
if (user) {
43
/* LDM (user), LDM (exception return) */
44
@@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
45
tmp = tcg_temp_new_i32();
46
gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN);
47
if (user) {
48
- tmp2 = tcg_const_i32(i);
49
- gen_helper_set_user_reg(cpu_env, tmp2, tmp);
50
- tcg_temp_free_i32(tmp2);
51
+ gen_helper_set_user_reg(cpu_env, tcg_constant_i32(i), tmp);
52
tcg_temp_free_i32(tmp);
53
} else if (i == a->rn) {
54
loaded_var = tmp;
55
--
56
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-34-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 16 +++++-----------
9
1 file changed, 5 insertions(+), 11 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CLRM(DisasContext *s, arg_CLRM *a)
16
17
s->eci_handled = true;
18
19
- zero = tcg_const_i32(0);
20
+ zero = tcg_constant_i32(0);
21
for (i = 0; i < 15; i++) {
22
if (extract32(a->list, i, 1)) {
23
/* Clear R[i] */
24
@@ -XXX,XX +XXX,XX @@ static bool trans_CLRM(DisasContext *s, arg_CLRM *a)
25
* Clear APSR (by calling the MSR helper with the same argument
26
* as for "MSR APSR_nzcvqg, Rn": mask = 0b1100, SYSM=0)
27
*/
28
- TCGv_i32 maskreg = tcg_const_i32(0xc << 8);
29
- gen_helper_v7m_msr(cpu_env, maskreg, zero);
30
- tcg_temp_free_i32(maskreg);
31
+ gen_helper_v7m_msr(cpu_env, tcg_constant_i32(0xc00), zero);
32
}
33
- tcg_temp_free_i32(zero);
34
clear_eci_state(s);
35
return true;
36
}
37
@@ -XXX,XX +XXX,XX @@ static bool trans_DLS(DisasContext *s, arg_DLS *a)
38
store_reg(s, 14, tmp);
39
if (a->size != 4) {
40
/* DLSTP: set FPSCR.LTPSIZE */
41
- tmp = tcg_const_i32(a->size);
42
- store_cpu_field(tmp, v7m.ltpsize);
43
+ store_cpu_field(tcg_constant_i32(a->size), v7m.ltpsize);
44
s->base.is_jmp = DISAS_UPDATE_NOCHAIN;
45
}
46
return true;
47
@@ -XXX,XX +XXX,XX @@ static bool trans_WLS(DisasContext *s, arg_WLS *a)
48
*/
49
bool ok = vfp_access_check(s);
50
assert(ok);
51
- tmp = tcg_const_i32(a->size);
52
- store_cpu_field(tmp, v7m.ltpsize);
53
+ store_cpu_field(tcg_constant_i32(a->size), v7m.ltpsize);
54
/*
55
* LTPSIZE updated, but MVE_NO_PRED will always be the same thing (0)
56
* when we take this upcoming exit from this TB, so gen_jmp_tb() is OK.
57
@@ -XXX,XX +XXX,XX @@ static bool trans_LE(DisasContext *s, arg_LE *a)
58
gen_set_label(loopend);
59
if (a->tp) {
60
/* Exits from tail-pred loops must reset LTPSIZE to 4 */
61
- tmp = tcg_const_i32(4);
62
- store_cpu_field(tmp, v7m.ltpsize);
63
+ store_cpu_field(tcg_constant_i32(4), v7m.ltpsize);
64
}
65
/* End TB, continuing to following insn */
66
gen_jmp_tb(s, s->base.pc_next, 1);
67
--
68
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-35-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 9 +++------
9
1 file changed, 3 insertions(+), 6 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CPS_v7m(DisasContext *s, arg_CPS_v7m *a)
16
return true;
17
}
18
19
- tmp = tcg_const_i32(a->im);
20
+ tmp = tcg_constant_i32(a->im);
21
/* FAULTMASK */
22
if (a->F) {
23
- addr = tcg_const_i32(19);
24
+ addr = tcg_constant_i32(19);
25
gen_helper_v7m_msr(cpu_env, addr, tmp);
26
- tcg_temp_free_i32(addr);
27
}
28
/* PRIMASK */
29
if (a->I) {
30
- addr = tcg_const_i32(16);
31
+ addr = tcg_constant_i32(16);
32
gen_helper_v7m_msr(cpu_env, addr, tmp);
33
- tcg_temp_free_i32(addr);
34
}
35
gen_rebuild_hflags(s, false);
36
- tcg_temp_free_i32(tmp);
37
gen_lookup_tb(s);
38
return true;
39
}
40
--
41
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-36-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate.c | 7 +++----
9
1 file changed, 3 insertions(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate.c b/target/arm/translate.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate.c
14
+++ b/target/arm/translate.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CSEL(DisasContext *s, arg_CSEL *a)
16
}
17
18
/* In this insn input reg fields of 0b1111 mean "zero", not "PC" */
19
+ zero = tcg_constant_i32(0);
20
if (a->rn == 15) {
21
- rn = tcg_const_i32(0);
22
+ rn = zero;
23
} else {
24
rn = load_reg(s, a->rn);
25
}
26
if (a->rm == 15) {
27
- rm = tcg_const_i32(0);
28
+ rm = zero;
29
} else {
30
rm = load_reg(s, a->rm);
31
}
32
@@ -XXX,XX +XXX,XX @@ static bool trans_CSEL(DisasContext *s, arg_CSEL *a)
33
}
34
35
arm_test_cc(&c, a->fcond);
36
- zero = tcg_const_i32(0);
37
tcg_gen_movcond_i32(c.cond, rn, c.value, zero, rn, rm);
38
arm_free_cc(&c);
39
- tcg_temp_free_i32(zero);
40
41
store_reg(s, a->rd, rn);
42
tcg_temp_free_i32(rm);
43
--
44
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-37-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 12 ++++--------
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
16
static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
17
{
18
if (sve_access_check(s)) {
19
- TCGv_i64 start = tcg_const_i64(a->imm1);
20
- TCGv_i64 incr = tcg_const_i64(a->imm2);
21
+ TCGv_i64 start = tcg_constant_i64(a->imm1);
22
+ TCGv_i64 incr = tcg_constant_i64(a->imm2);
23
do_index(s, a->esz, a->rd, start, incr);
24
- tcg_temp_free_i64(start);
25
- tcg_temp_free_i64(incr);
26
}
27
return true;
28
}
29
@@ -XXX,XX +XXX,XX @@ static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
30
static bool trans_INDEX_ir(DisasContext *s, arg_INDEX_ir *a)
31
{
32
if (sve_access_check(s)) {
33
- TCGv_i64 start = tcg_const_i64(a->imm);
34
+ TCGv_i64 start = tcg_constant_i64(a->imm);
35
TCGv_i64 incr = cpu_reg(s, a->rm);
36
do_index(s, a->esz, a->rd, start, incr);
37
- tcg_temp_free_i64(start);
38
}
39
return true;
40
}
41
@@ -XXX,XX +XXX,XX @@ static bool trans_INDEX_ri(DisasContext *s, arg_INDEX_ri *a)
42
{
43
if (sve_access_check(s)) {
44
TCGv_i64 start = cpu_reg(s, a->rn);
45
- TCGv_i64 incr = tcg_const_i64(a->imm);
46
+ TCGv_i64 incr = tcg_constant_i64(a->imm);
47
do_index(s, a->esz, a->rd, start, incr);
48
- tcg_temp_free_i64(incr);
49
}
50
return true;
51
}
52
--
53
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-38-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 18 ++++++------------
9
1 file changed, 6 insertions(+), 12 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_SINCDEC_r_32(DisasContext *s, arg_incdec_cnt *a)
16
tcg_gen_ext32s_i64(reg, reg);
17
}
18
} else {
19
- TCGv_i64 t = tcg_const_i64(inc);
20
- do_sat_addsub_32(reg, t, a->u, a->d);
21
- tcg_temp_free_i64(t);
22
+ do_sat_addsub_32(reg, tcg_constant_i64(inc), a->u, a->d);
23
}
24
return true;
25
}
26
@@ -XXX,XX +XXX,XX @@ static bool trans_SINCDEC_r_64(DisasContext *s, arg_incdec_cnt *a)
27
TCGv_i64 reg = cpu_reg(s, a->rd);
28
29
if (inc != 0) {
30
- TCGv_i64 t = tcg_const_i64(inc);
31
- do_sat_addsub_64(reg, t, a->u, a->d);
32
- tcg_temp_free_i64(t);
33
+ do_sat_addsub_64(reg, tcg_constant_i64(inc), a->u, a->d);
34
}
35
return true;
36
}
37
@@ -XXX,XX +XXX,XX @@ static bool trans_INCDEC_v(DisasContext *s, arg_incdec2_cnt *a)
38
39
if (inc != 0) {
40
if (sve_access_check(s)) {
41
- TCGv_i64 t = tcg_const_i64(a->d ? -inc : inc);
42
tcg_gen_gvec_adds(a->esz, vec_full_reg_offset(s, a->rd),
43
vec_full_reg_offset(s, a->rn),
44
- t, fullsz, fullsz);
45
- tcg_temp_free_i64(t);
46
+ tcg_constant_i64(a->d ? -inc : inc),
47
+ fullsz, fullsz);
48
}
49
} else {
50
do_mov_z(s, a->rd, a->rn);
51
@@ -XXX,XX +XXX,XX @@ static bool trans_SINCDEC_v(DisasContext *s, arg_incdec2_cnt *a)
52
53
if (inc != 0) {
54
if (sve_access_check(s)) {
55
- TCGv_i64 t = tcg_const_i64(inc);
56
- do_sat_addsub_vec(s, a->esz, a->rd, a->rn, t, a->u, a->d);
57
- tcg_temp_free_i64(t);
58
+ do_sat_addsub_vec(s, a->esz, a->rd, a->rn,
59
+ tcg_constant_i64(inc), a->u, a->d);
60
}
61
} else {
62
do_mov_z(s, a->rd, a->rn);
63
--
64
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-39-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 13 ++++---------
9
1 file changed, 4 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
16
if (sve_access_check(s)) {
17
/* Decode the VFP immediate. */
18
uint64_t imm = vfp_expand_imm(a->esz, a->imm);
19
- TCGv_i64 t_imm = tcg_const_i64(imm);
20
- do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, t_imm);
21
- tcg_temp_free_i64(t_imm);
22
+ do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, tcg_constant_i64(imm));
23
}
24
return true;
25
}
26
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_m_i(DisasContext *s, arg_rpri_esz *a)
27
return false;
28
}
29
if (sve_access_check(s)) {
30
- TCGv_i64 t_imm = tcg_const_i64(a->imm);
31
- do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, t_imm);
32
- tcg_temp_free_i64(t_imm);
33
+ do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, tcg_constant_i64(a->imm));
34
}
35
return true;
36
}
37
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_z_i(DisasContext *s, arg_CPY_z_i *a)
38
}
39
if (sve_access_check(s)) {
40
unsigned vsz = vec_full_reg_size(s);
41
- TCGv_i64 t_imm = tcg_const_i64(a->imm);
42
tcg_gen_gvec_2i_ool(vec_full_reg_offset(s, a->rd),
43
pred_full_reg_offset(s, a->pg),
44
- t_imm, vsz, vsz, 0, fns[a->esz]);
45
- tcg_temp_free_i64(t_imm);
46
+ tcg_constant_i64(a->imm),
47
+ vsz, vsz, 0, fns[a->esz]);
48
}
49
return true;
50
}
51
--
52
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-40-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 12 ++++--------
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static void incr_last_active(DisasContext *s, TCGv_i32 last, int esz)
16
if (is_power_of_2(vsz)) {
17
tcg_gen_andi_i32(last, last, vsz - 1);
18
} else {
19
- TCGv_i32 max = tcg_const_i32(vsz);
20
- TCGv_i32 zero = tcg_const_i32(0);
21
+ TCGv_i32 max = tcg_constant_i32(vsz);
22
+ TCGv_i32 zero = tcg_constant_i32(0);
23
tcg_gen_movcond_i32(TCG_COND_GEU, last, last, max, zero, last);
24
- tcg_temp_free_i32(max);
25
- tcg_temp_free_i32(zero);
26
}
27
}
28
29
@@ -XXX,XX +XXX,XX @@ static void wrap_last_active(DisasContext *s, TCGv_i32 last, int esz)
30
if (is_power_of_2(vsz)) {
31
tcg_gen_andi_i32(last, last, vsz - 1);
32
} else {
33
- TCGv_i32 max = tcg_const_i32(vsz - (1 << esz));
34
- TCGv_i32 zero = tcg_const_i32(0);
35
+ TCGv_i32 max = tcg_constant_i32(vsz - (1 << esz));
36
+ TCGv_i32 zero = tcg_constant_i32(0);
37
tcg_gen_movcond_i32(TCG_COND_LT, last, last, zero, max, last);
38
- tcg_temp_free_i32(max);
39
- tcg_temp_free_i32(zero);
40
}
41
}
42
43
--
44
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-41-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 7 +++----
9
1 file changed, 3 insertions(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm,
16
bool before, TCGv_i64 reg_val)
17
{
18
TCGv_i32 last = tcg_temp_new_i32();
19
- TCGv_i64 ele, cmp, zero;
20
+ TCGv_i64 ele, cmp;
21
22
find_last_active(s, last, esz, pg);
23
24
@@ -XXX,XX +XXX,XX @@ static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm,
25
ele = load_last_active(s, last, rm, esz);
26
tcg_temp_free_i32(last);
27
28
- zero = tcg_const_i64(0);
29
- tcg_gen_movcond_i64(TCG_COND_GE, reg_val, cmp, zero, ele, reg_val);
30
+ tcg_gen_movcond_i64(TCG_COND_GE, reg_val, cmp, tcg_constant_i64(0),
31
+ ele, reg_val);
32
33
- tcg_temp_free_i64(zero);
34
tcg_temp_free_i64(cmp);
35
tcg_temp_free_i64(ele);
36
}
37
--
38
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-42-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 20 +++++++-------------
9
1 file changed, 7 insertions(+), 13 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CTERM(DisasContext *s, arg_CTERM *a)
16
static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
17
{
18
TCGv_i64 op0, op1, t0, t1, tmax;
19
- TCGv_i32 t2, t3;
20
+ TCGv_i32 t2;
21
TCGv_ptr ptr;
22
unsigned vsz = vec_full_reg_size(s);
23
unsigned desc = 0;
24
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
25
}
26
}
27
28
- tmax = tcg_const_i64(vsz >> a->esz);
29
+ tmax = tcg_constant_i64(vsz >> a->esz);
30
if (eq) {
31
/* Equality means one more iteration. */
32
tcg_gen_addi_i64(t0, t0, 1);
33
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
34
35
/* Bound to the maximum. */
36
tcg_gen_umin_i64(t0, t0, tmax);
37
- tcg_temp_free_i64(tmax);
38
39
/* Set the count to zero if the condition is false. */
40
tcg_gen_movi_i64(t1, 0);
41
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a)
42
43
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz / 8);
44
desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz);
45
- t3 = tcg_const_i32(desc);
46
47
ptr = tcg_temp_new_ptr();
48
tcg_gen_addi_ptr(ptr, cpu_env, pred_full_reg_offset(s, a->rd));
49
50
if (a->lt) {
51
- gen_helper_sve_whilel(t2, ptr, t2, t3);
52
+ gen_helper_sve_whilel(t2, ptr, t2, tcg_constant_i32(desc));
53
} else {
54
- gen_helper_sve_whileg(t2, ptr, t2, t3);
55
+ gen_helper_sve_whileg(t2, ptr, t2, tcg_constant_i32(desc));
56
}
57
do_pred_flags(t2);
58
59
tcg_temp_free_ptr(ptr);
60
tcg_temp_free_i32(t2);
61
- tcg_temp_free_i32(t3);
62
return true;
63
}
64
65
static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
66
{
67
TCGv_i64 op0, op1, diff, t1, tmax;
68
- TCGv_i32 t2, t3;
69
+ TCGv_i32 t2;
70
TCGv_ptr ptr;
71
unsigned vsz = vec_full_reg_size(s);
72
unsigned desc = 0;
73
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
74
op0 = read_cpu_reg(s, a->rn, 1);
75
op1 = read_cpu_reg(s, a->rm, 1);
76
77
- tmax = tcg_const_i64(vsz);
78
+ tmax = tcg_constant_i64(vsz);
79
diff = tcg_temp_new_i64();
80
81
if (a->rw) {
82
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
83
84
/* Bound to the maximum. */
85
tcg_gen_umin_i64(diff, diff, tmax);
86
- tcg_temp_free_i64(tmax);
87
88
/* Since we're bounded, pass as a 32-bit type. */
89
t2 = tcg_temp_new_i32();
90
@@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a)
91
92
desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz / 8);
93
desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz);
94
- t3 = tcg_const_i32(desc);
95
96
ptr = tcg_temp_new_ptr();
97
tcg_gen_addi_ptr(ptr, cpu_env, pred_full_reg_offset(s, a->rd));
98
99
- gen_helper_sve_whilel(t2, ptr, t2, t3);
100
+ gen_helper_sve_whilel(t2, ptr, t2, tcg_constant_i32(desc));
101
do_pred_flags(t2);
102
103
tcg_temp_free_ptr(ptr);
104
tcg_temp_free_i32(t2);
105
- tcg_temp_free_i32(t3);
106
return true;
107
}
108
109
--
110
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-43-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 12 ++++--------
9
1 file changed, 4 insertions(+), 8 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1_zpiz(DisasContext *s, arg_LD1_zpiz *a)
16
gen_helper_gvec_mem_scatter *fn = NULL;
17
bool be = s->be_data == MO_BE;
18
bool mte = s->mte_active[0];
19
- TCGv_i64 imm;
20
21
if (a->esz < a->msz || (a->esz == a->msz && !a->u)) {
22
return false;
23
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1_zpiz(DisasContext *s, arg_LD1_zpiz *a)
24
/* Treat LD1_zpiz (zn[x] + imm) the same way as LD1_zprz (rn + zm[x])
25
* by loading the immediate into the scalar parameter.
26
*/
27
- imm = tcg_const_i64(a->imm << a->msz);
28
- do_mem_zpz(s, a->rd, a->pg, a->rn, 0, imm, a->msz, false, fn);
29
- tcg_temp_free_i64(imm);
30
+ do_mem_zpz(s, a->rd, a->pg, a->rn, 0,
31
+ tcg_constant_i64(a->imm << a->msz), a->msz, false, fn);
32
return true;
33
}
34
35
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zpiz(DisasContext *s, arg_ST1_zpiz *a)
36
gen_helper_gvec_mem_scatter *fn = NULL;
37
bool be = s->be_data == MO_BE;
38
bool mte = s->mte_active[0];
39
- TCGv_i64 imm;
40
41
if (a->esz < a->msz) {
42
return false;
43
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zpiz(DisasContext *s, arg_ST1_zpiz *a)
44
/* Treat ST1_zpiz (zn[x] + imm) the same way as ST1_zprz (rn + zm[x])
45
* by loading the immediate into the scalar parameter.
46
*/
47
- imm = tcg_const_i64(a->imm << a->msz);
48
- do_mem_zpz(s, a->rd, a->pg, a->rn, 0, imm, a->msz, true, fn);
49
- tcg_temp_free_i64(imm);
50
+ do_mem_zpz(s, a->rd, a->pg, a->rn, 0,
51
+ tcg_constant_i64(a->imm << a->msz), a->msz, true, fn);
52
return true;
53
}
54
55
--
56
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-44-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 4 +---
9
1 file changed, 1 insertion(+), 3 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_SUBR_zzi(DisasContext *s, arg_rri_esz *a)
16
}
17
if (sve_access_check(s)) {
18
unsigned vsz = vec_full_reg_size(s);
19
- TCGv_i64 c = tcg_const_i64(a->imm);
20
tcg_gen_gvec_2s(vec_full_reg_offset(s, a->rd),
21
vec_full_reg_offset(s, a->rn),
22
- vsz, vsz, c, &op[a->esz]);
23
- tcg_temp_free_i64(c);
24
+ vsz, vsz, tcg_constant_i64(a->imm), &op[a->esz]);
25
}
26
return true;
27
}
28
--
29
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20220426163043.100432-45-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 15 +++++----------
9
1 file changed, 5 insertions(+), 10 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
16
return false;
17
}
18
if (sve_access_check(s)) {
19
- TCGv_i64 val = tcg_const_i64(a->imm);
20
- do_sat_addsub_vec(s, a->esz, a->rd, a->rn, val, u, d);
21
- tcg_temp_free_i64(val);
22
+ do_sat_addsub_vec(s, a->esz, a->rd, a->rn,
23
+ tcg_constant_i64(a->imm), u, d);
24
}
25
return true;
26
}
27
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_ool(DisasContext *s, arg_rri_esz *a, gen_helper_gvec_2i *fn)
28
{
29
if (sve_access_check(s)) {
30
unsigned vsz = vec_full_reg_size(s);
31
- TCGv_i64 c = tcg_const_i64(a->imm);
32
-
33
tcg_gen_gvec_2i_ool(vec_full_reg_offset(s, a->rd),
34
vec_full_reg_offset(s, a->rn),
35
- c, vsz, vsz, 0, fn);
36
- tcg_temp_free_i64(c);
37
+ tcg_constant_i64(a->imm), vsz, vsz, 0, fn);
38
}
39
return true;
40
}
41
@@ -XXX,XX +XXX,XX @@ static void do_fp_scalar(DisasContext *s, int zd, int zn, int pg, bool is_fp16,
42
static void do_fp_imm(DisasContext *s, arg_rpri_esz *a, uint64_t imm,
43
gen_helper_sve_fp2scalar *fn)
44
{
45
- TCGv_i64 temp = tcg_const_i64(imm);
46
- do_fp_scalar(s, a->rd, a->rn, a->pg, a->esz == MO_16, temp, fn);
47
- tcg_temp_free_i64(temp);
48
+ do_fp_scalar(s, a->rd, a->rn, a->pg, a->esz == MO_16,
49
+ tcg_constant_i64(imm), fn);
50
}
51
52
#define DO_FP_IMM(NAME, name, const0, const1) \
53
--
54
2.25.1
diff view generated by jsdifflib
1
From: Jean-Philippe Brucker <jean-philippe@linaro.org>
1
From: "Emilio G. Cota" <cota@braap.org>
2
2
3
Make the translation error message prettier by adding a missing space
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
before the parenthesis.
4
Signed-off-by: Emilio G. Cota <cota@braap.org>
5
6
Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Eric Auger <eric.auger@redhat.com>
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20220427111543.124620-2-jean-philippe@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/smmuv3.c | 2 +-
9
accel/tcg/atomic_template.h | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
10
1 file changed, 1 insertion(+), 1 deletion(-)
14
11
15
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
12
diff --git a/accel/tcg/atomic_template.h b/accel/tcg/atomic_template.h
16
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/smmuv3.c
14
--- a/accel/tcg/atomic_template.h
18
+++ b/hw/arm/smmuv3.c
15
+++ b/accel/tcg/atomic_template.h
19
@@ -XXX,XX +XXX,XX @@ epilogue:
16
@@ -XXX,XX +XXX,XX @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr,
20
break;
17
21
case SMMU_TRANS_ERROR:
18
#define GEN_ATOMIC_HELPER(X) \
22
qemu_log_mask(LOG_GUEST_ERROR,
19
ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
23
- "%s translation failed for iova=0x%"PRIx64"(%s)\n",
20
- ABI_TYPE val EXTRA_ARGS) \
24
+ "%s translation failed for iova=0x%"PRIx64" (%s)\n",
21
+ ABI_TYPE val EXTRA_ARGS) \
25
mr->parent_obj.name, addr, smmu_event_string(event.type));
22
{ \
26
smmuv3_record_event(s, &event);
23
ATOMIC_MMU_DECLS; \
27
break;
24
DATA_TYPE *haddr = ATOMIC_MMU_LOOKUP; \
28
--
25
--
29
2.25.1
26
2.20.1
27
28
diff view generated by jsdifflib
Deleted patch
1
The Arm FEAT_TTL architectural feature allows the guest to provide an
2
optional hint in an AArch64 TLB invalidate operation about which
3
translation table level holds the leaf entry for the address being
4
invalidated. QEMU's TLB implementation doesn't need that hint, and
5
we correctly ignore the (previously RES0) bits in TLB invalidate
6
operation values that are now used for the TTL field. So we can
7
simply advertise support for it in our 'max' CPU.
8
1
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-id: 20220426160422.2353158-2-peter.maydell@linaro.org
12
---
13
docs/system/arm/emulation.rst | 1 +
14
target/arm/cpu64.c | 1 +
15
2 files changed, 2 insertions(+)
16
17
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
18
index XXXXXXX..XXXXXXX 100644
19
--- a/docs/system/arm/emulation.rst
20
+++ b/docs/system/arm/emulation.rst
21
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
22
- FEAT_TLBIOS (TLB invalidate instructions in Outer Shareable domain)
23
- FEAT_TLBIRANGE (TLB invalidate range instructions)
24
- FEAT_TTCNP (Translation table Common not private translations)
25
+- FEAT_TTL (Translation Table Level)
26
- FEAT_TTST (Small translation tables)
27
- FEAT_UAO (Unprivileged Access Override control)
28
- FEAT_VHE (Virtualization Host Extensions)
29
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/cpu64.c
32
+++ b/target/arm/cpu64.c
33
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
34
t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* TTCNP */
35
t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* TTST */
36
t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1); /* FEAT_LVA */
37
+ t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */
38
cpu->isar.id_aa64mmfr2 = t;
39
40
t = cpu->isar.id_aa64zfr0;
41
--
42
2.25.1
diff view generated by jsdifflib
Deleted patch
1
The description in the Arm ARM of the requirements of FEAT_BBM is
2
admirably clear on the guarantees it provides software, but slightly
3
more obscure on what that means for implementations. The description
4
of the equivalent SMMU feature in the SMMU specification (IHI0070D.b
5
section 3.21.1) is perhaps a bit more detailed and includes some
6
example valid implementation choices. (The SMMU version of this
7
feature is slightly tighter than the CPU version: the CPU is permitted
8
to raise TLB Conflict aborts in some situations that the SMMU may
9
not. This doesn't matter for QEMU because we don't want to do TLB
10
Conflict aborts anyway.)
11
1
12
The informal summary of FEAT_BBM is that it is about permitting an OS
13
to switch a range of memory between "covered by a huge page" and
14
"covered by a sequence of normal pages" without having to engage in
15
the 'break-before-make' dance that has traditionally been
16
necessary. The 'break-before-make' sequence is:
17
18
* replace the old translation table entry with an invalid entry
19
* execute a DSB insn
20
* execute a broadcast TLB invalidate insn
21
* execute a DSB insn
22
* write the new translation table entry
23
* execute a DSB insn
24
25
The point of this is to ensure that no TLB can simultaneously contain
26
TLB entries for the old and the new entry, which would traditionally
27
be UNPREDICTABLE (allowing the CPU to generate a TLB Conflict fault
28
or to use a random mishmash of values from the old and the new
29
entry). FEAT_BBM level 2 says "for the specific case where the only
30
thing that changed is the size of the block, the TLB is guaranteed
31
not to do weird things even if there are multiple entries for an
32
address", which means that software can now do:
33
34
* replace old translation table entry with new entry
35
* DSB
36
* broadcast TLB invalidate
37
* DSB
38
39
As the SMMU spec notes, valid ways to do this include:
40
41
* if there are multiple entries in the TLB for an address,
42
choose one of them and use it, ignoring the others
43
* if there are multiple entries in the TLB for an address,
44
throw them all out and do a page table walk to get a new one
45
46
QEMU's page table walk implementation for Arm CPUs already meets the
47
requirements for FEAT_BBM level 2. When we cache an entry in our TCG
48
TLB, we do so only for the specific (non-huge) page that the address
49
is in, and there is no way for the TLB data structure to ever have
50
more than one TLB entry for that page. (We handle huge pages only in
51
that we track what part of the address space is covered by huge pages
52
so that a TLB invalidate operation for an address in a huge page
53
results in an invalidation of the whole TLB.) We ignore the Contiguous
54
bit in page table entries, so we don't have to do anything for the
55
parts of FEAT_BBM that deal with changis to the Contiguous bit.
56
57
FEAT_BBM level 2 also requires that the nT bit in block descriptors
58
must be ignored; since commit 39a1fd25287f5dece5 we do this.
59
60
It's therefore safe for QEMU to advertise FEAT_BBM level 2 by
61
setting ID_AA64MMFR2_EL1.BBM to 2.
62
63
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
64
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
65
Message-id: 20220426160422.2353158-3-peter.maydell@linaro.org
66
---
67
docs/system/arm/emulation.rst | 1 +
68
target/arm/cpu64.c | 1 +
69
2 files changed, 2 insertions(+)
70
71
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
72
index XXXXXXX..XXXXXXX 100644
73
--- a/docs/system/arm/emulation.rst
74
+++ b/docs/system/arm/emulation.rst
75
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
76
- FEAT_AA32HPD (AArch32 hierarchical permission disables)
77
- FEAT_AA32I8MM (AArch32 Int8 matrix multiplication instructions)
78
- FEAT_AES (AESD and AESE instructions)
79
+- FEAT_BBM at level 2 (Translation table break-before-make levels)
80
- FEAT_BF16 (AArch64 BFloat16 instructions)
81
- FEAT_BTI (Branch Target Identification)
82
- FEAT_DIT (Data Independent Timing instructions)
83
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
84
index XXXXXXX..XXXXXXX 100644
85
--- a/target/arm/cpu64.c
86
+++ b/target/arm/cpu64.c
87
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
88
t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* TTST */
89
t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1); /* FEAT_LVA */
90
t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */
91
+ t = FIELD_DP64(t, ID_AA64MMFR2, BBM, 2); /* FEAT_BBM at level 2 */
92
cpu->isar.id_aa64mmfr2 = t;
93
94
t = cpu->isar.id_aa64zfr0;
95
--
96
2.25.1
diff view generated by jsdifflib
1
The Arm SMMUv3 includes an optional feature equivalent to the CPU
1
The qemu-ga documentation is currently in qemu-ga.texi in
2
FEAT_BBM, which permits an OS to switch a range of memory between
2
Texinfo format, which we present to the user as:
3
"covered by a huge page" and "covered by a sequence of normal pages"
3
* a qemu-ga manpage
4
without having to engage in the traditional 'break-before-make'
4
* a section of the main qemu-doc HTML documentation
5
dance. (This is particularly important for the SMMU, because devices
6
performing I/O through an SMMU are less likely to be able to cope with
7
the window in the sequence where an access results in a translation
8
fault.) The SMMU spec explicitly notes that one of the valid ways to
9
be a BBM level 2 compliant implementation is:
10
* if there are multiple entries in the TLB for an address,
11
choose one of them and use it, ignoring the others
12
5
13
Our SMMU TLB implementation (unlike our CPU TLB) does allow multiple
6
Convert the documentation to rST format, and present it to
14
TLB entries for an address, because the translation table level is
7
the user as:
15
part of the SMMUIOTLBKey, and so our IOTLB hashtable can include
8
* a qemu-ga manpage
16
entries for the same address where the leaf was at different levels
9
* part of the interop/ Sphinx manual
17
(i.e. both hugepage and normal page). Our TLB lookup implementation in
18
smmu_iotlb_lookup() will always find the entry with the lowest level
19
(i.e. it prefers the hugepage over the normal page) and ignore any
20
others. TLB invalidation correctly removes all TLB entries matching
21
the specified address or address range (unless the guest specifies the
22
leaf level explicitly, in which case it gets what it asked for). So we
23
can validly advertise support for BBML level 2.
24
25
Note that we still can't yet advertise ourselves as an SMMU v3.2,
26
because v3.2 requires support for the S2FWB feature, which we don't
27
yet implement.
28
10
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
31
Reviewed-by: Eric Auger <eric.auger@redhat.com>
13
Tested-by: Michael Roth <mdroth@linux.vnet.ibm.com>
32
Message-id: 20220426160422.2353158-4-peter.maydell@linaro.org
14
Message-id: 20190905131040.8350-1-peter.maydell@linaro.org
33
---
15
---
34
hw/arm/smmuv3-internal.h | 1 +
16
Makefile | 24 ++++---
35
hw/arm/smmuv3.c | 1 +
17
MAINTAINERS | 2 +-
36
2 files changed, 2 insertions(+)
18
docs/conf.py | 18 ++---
19
docs/interop/conf.py | 7 ++
20
docs/interop/index.rst | 1 +
21
docs/interop/qemu-ga.rst | 133 +++++++++++++++++++++++++++++++++++++
22
qemu-doc.texi | 5 --
23
qemu-ga.texi | 137 ---------------------------------------
24
8 files changed, 166 insertions(+), 161 deletions(-)
25
create mode 100644 docs/interop/qemu-ga.rst
26
delete mode 100644 qemu-ga.texi
37
27
38
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
28
diff --git a/Makefile b/Makefile
39
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/arm/smmuv3-internal.h
30
--- a/Makefile
41
+++ b/hw/arm/smmuv3-internal.h
31
+++ b/Makefile
42
@@ -XXX,XX +XXX,XX @@ REG32(IDR2, 0x8)
32
@@ -XXX,XX +XXX,XX @@ endif
43
REG32(IDR3, 0xc)
33
endif
44
FIELD(IDR3, HAD, 2, 1);
34
45
FIELD(IDR3, RIL, 10, 1);
35
ifdef BUILD_DOCS
46
+ FIELD(IDR3, BBML, 11, 2);
36
-DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 qemu-ga.8
47
REG32(IDR4, 0x10)
37
+DOCS=qemu-doc.html qemu-doc.txt qemu.1 qemu-img.1 qemu-nbd.8 docs/interop/qemu-ga.8
48
REG32(IDR5, 0x14)
38
DOCS+=docs/interop/qemu-qmp-ref.html docs/interop/qemu-qmp-ref.txt docs/interop/qemu-qmp-ref.7
49
FIELD(IDR5, OAS, 0, 3);
39
DOCS+=docs/interop/qemu-ga-ref.html docs/interop/qemu-ga-ref.txt docs/interop/qemu-ga-ref.7
50
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
40
DOCS+=docs/qemu-block-drivers.7
51
index XXXXXXX..XXXXXXX 100644
41
@@ -XXX,XX +XXX,XX @@ DESCS=
52
--- a/hw/arm/smmuv3.c
42
endif
53
+++ b/hw/arm/smmuv3.c
43
54
@@ -XXX,XX +XXX,XX @@ static void smmuv3_init_regs(SMMUv3State *s)
44
# Note that we manually filter-out the non-Sphinx documentation which
55
45
-# is currently built into the docs/interop directory in the build tree.
56
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
46
+# is currently built into the docs/interop directory in the build tree,
57
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, HAD, 1);
47
+# and also any sphinx-built manpages.
58
+ s->idr[3] = FIELD_DP32(s->idr[3], IDR3, BBML, 2);
48
define install-manual =
59
49
for d in $$(cd $(MANUAL_BUILDDIR) && find $1 -type d); do $(INSTALL_DIR) "$(DESTDIR)$(qemu_docdir)/$$d"; done
60
/* 4K, 16K and 64K granule support */
50
-for f in $$(cd $(MANUAL_BUILDDIR) && find $1 -type f -a '!' '(' -name 'qemu-*-qapi.*' -o -name 'qemu-*-ref.*' ')' ); do $(INSTALL_DATA) "$(MANUAL_BUILDDIR)/$$f" "$(DESTDIR)$(qemu_docdir)/$$f"; done
61
s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN4K, 1);
51
+for f in $$(cd $(MANUAL_BUILDDIR) && find $1 -type f -a '!' '(' -name '*.[0-9]' -o -name 'qemu-*-qapi.*' -o -name 'qemu-*-ref.*' ')' ); do $(INSTALL_DATA) "$(MANUAL_BUILDDIR)/$$f" "$(DESTDIR)$(qemu_docdir)/$$f"; done
52
endef
53
54
# Note that we deliberately do not install the "devel" manual: it is
55
@@ -XXX,XX +XXX,XX @@ ifdef CONFIG_TRACE_SYSTEMTAP
56
    $(INSTALL_DATA) scripts/qemu-trace-stap.1 "$(DESTDIR)$(mandir)/man1"
57
endif
58
ifneq (,$(findstring qemu-ga,$(TOOLS)))
59
-    $(INSTALL_DATA) qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
60
+    $(INSTALL_DATA) docs/interop/qemu-ga.8 "$(DESTDIR)$(mandir)/man8"
61
    $(INSTALL_DATA) docs/interop/qemu-ga-ref.html "$(DESTDIR)$(qemu_docdir)"
62
    $(INSTALL_DATA) docs/interop/qemu-ga-ref.txt "$(DESTDIR)$(qemu_docdir)"
63
    $(INSTALL_DATA) docs/interop/qemu-ga-ref.7 "$(DESTDIR)$(mandir)/man7"
64
@@ -XXX,XX +XXX,XX @@ docs/version.texi: $(SRC_PATH)/VERSION config-host.mak
65
sphinxdocs: $(MANUAL_BUILDDIR)/devel/index.html $(MANUAL_BUILDDIR)/interop/index.html $(MANUAL_BUILDDIR)/specs/index.html
66
67
# Canned command to build a single manual
68
-build-manual = $(call quiet-command,sphinx-build $(if $(V),,-q) -W -n -b html -D version=$(VERSION) -D release="$(FULL_VERSION)" -d .doctrees/$1 $(SRC_PATH)/docs/$1 $(MANUAL_BUILDDIR)/$1 ,"SPHINX","$(MANUAL_BUILDDIR)/$1")
69
+# Arguments: $1 = manual name, $2 = Sphinx builder ('html' or 'man')
70
+build-manual = $(call quiet-command,CONFDIR="$(qemu_confdir)" sphinx-build $(if $(V),,-q) -W -n -b $2 -D version=$(VERSION) -D release="$(FULL_VERSION)" -d .doctrees/$1 $(SRC_PATH)/docs/$1 $(MANUAL_BUILDDIR)/$1 ,"SPHINX","$(MANUAL_BUILDDIR)/$1")
71
# We assume all RST files in the manual's directory are used in it
72
manual-deps = $(wildcard $(SRC_PATH)/docs/$1/*.rst) $(SRC_PATH)/docs/$1/conf.py $(SRC_PATH)/docs/conf.py
73
74
$(MANUAL_BUILDDIR)/devel/index.html: $(call manual-deps,devel)
75
-    $(call build-manual,devel)
76
+    $(call build-manual,devel,html)
77
78
$(MANUAL_BUILDDIR)/interop/index.html: $(call manual-deps,interop)
79
-    $(call build-manual,interop)
80
+    $(call build-manual,interop,html)
81
82
$(MANUAL_BUILDDIR)/specs/index.html: $(call manual-deps,specs)
83
-    $(call build-manual,specs)
84
+    $(call build-manual,specs,html)
85
+
86
+$(MANUAL_BUILDDIR)/interop/qemu-ga.8: $(call manual-deps,interop)
87
+    $(call build-manual,interop,man)
88
89
qemu-options.texi: $(SRC_PATH)/qemu-options.hx $(SRC_PATH)/scripts/hxtool
90
    $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@,"GEN","$@")
91
@@ -XXX,XX +XXX,XX @@ qemu.1: qemu-option-trace.texi
92
qemu-img.1: qemu-img.texi qemu-option-trace.texi qemu-img-cmds.texi
93
fsdev/virtfs-proxy-helper.1: fsdev/virtfs-proxy-helper.texi
94
qemu-nbd.8: qemu-nbd.texi qemu-option-trace.texi
95
-qemu-ga.8: qemu-ga.texi
96
docs/qemu-block-drivers.7: docs/qemu-block-drivers.texi
97
docs/qemu-cpu-models.7: docs/qemu-cpu-models.texi
98
scripts/qemu-trace-stap.1: scripts/qemu-trace-stap.texi
99
@@ -XXX,XX +XXX,XX @@ txt: qemu-doc.txt docs/interop/qemu-qmp-ref.txt docs/interop/qemu-ga-ref.txt
100
qemu-doc.html qemu-doc.info qemu-doc.pdf qemu-doc.txt: \
101
    qemu-img.texi qemu-nbd.texi qemu-options.texi \
102
    qemu-tech.texi qemu-option-trace.texi \
103
-    qemu-deprecated.texi qemu-monitor.texi qemu-img-cmds.texi qemu-ga.texi \
104
+    qemu-deprecated.texi qemu-monitor.texi qemu-img-cmds.texi \
105
    qemu-monitor-info.texi docs/qemu-block-drivers.texi \
106
    docs/qemu-cpu-models.texi docs/security.texi
107
108
diff --git a/MAINTAINERS b/MAINTAINERS
109
index XXXXXXX..XXXXXXX 100644
110
--- a/MAINTAINERS
111
+++ b/MAINTAINERS
112
@@ -XXX,XX +XXX,XX @@ QEMU Guest Agent
113
M: Michael Roth <mdroth@linux.vnet.ibm.com>
114
S: Maintained
115
F: qga/
116
-F: qemu-ga.texi
117
+F: docs/interop/qemu-ga.rst
118
F: scripts/qemu-guest-agent/
119
F: tests/test-qga.c
120
F: docs/interop/qemu-ga-ref.texi
121
diff --git a/docs/conf.py b/docs/conf.py
122
index XXXXXXX..XXXXXXX 100644
123
--- a/docs/conf.py
124
+++ b/docs/conf.py
125
@@ -XXX,XX +XXX,XX @@ todo_include_todos = False
126
# with "option::" in the document being processed. Turn that off.
127
suppress_warnings = ["ref.option"]
128
129
+# The rst_epilog fragment is effectively included in every rST file.
130
+# We use it to define substitutions based on build config that
131
+# can then be used in the documentation. The fallback if the
132
+# environment variable is not set is for the benefit of readthedocs
133
+# style document building; our Makefile always sets the variable.
134
+confdir = os.getenv('CONFDIR', "/etc/qemu")
135
+rst_epilog = ".. |CONFDIR| replace:: ``" + confdir + "``\n"
136
+
137
# -- Options for HTML output ----------------------------------------------
138
139
# The theme to use for HTML and HTML Help pages. See the documentation for
140
@@ -XXX,XX +XXX,XX @@ latex_documents = [
141
142
143
# -- Options for manual page output ---------------------------------------
144
-
145
-# One entry per manual page. List of tuples
146
-# (source start file, name, description, authors, manual section).
147
-man_pages = [
148
- (master_doc, 'qemu', u'QEMU Documentation',
149
- [author], 1)
150
-]
151
-
152
+# Individual manual/conf.py can override this to create man pages
153
+man_pages = []
154
155
# -- Options for Texinfo output -------------------------------------------
156
157
diff --git a/docs/interop/conf.py b/docs/interop/conf.py
158
index XXXXXXX..XXXXXXX 100644
159
--- a/docs/interop/conf.py
160
+++ b/docs/interop/conf.py
161
@@ -XXX,XX +XXX,XX @@ exec(compile(open(parent_config, "rb").read(), parent_config, 'exec'))
162
# This slightly misuses the 'description', but is the best way to get
163
# the manual title to appear in the sidebar.
164
html_theme_options['description'] = u'System Emulation Management and Interoperability Guide'
165
+
166
+# One entry per manual page. List of tuples
167
+# (source start file, name, description, authors, manual section).
168
+man_pages = [
169
+ ('qemu-ga', 'qemu-ga', u'QEMU Guest Agent',
170
+ ['Michael Roth <mdroth@linux.vnet.ibm.com>'], 8)
171
+]
172
diff --git a/docs/interop/index.rst b/docs/interop/index.rst
173
index XXXXXXX..XXXXXXX 100644
174
--- a/docs/interop/index.rst
175
+++ b/docs/interop/index.rst
176
@@ -XXX,XX +XXX,XX @@ Contents:
177
bitmaps
178
live-block-operations
179
pr-helper
180
+ qemu-ga
181
vhost-user
182
vhost-user-gpu
183
diff --git a/docs/interop/qemu-ga.rst b/docs/interop/qemu-ga.rst
184
new file mode 100644
185
index XXXXXXX..XXXXXXX
186
--- /dev/null
187
+++ b/docs/interop/qemu-ga.rst
188
@@ -XXX,XX +XXX,XX @@
189
+QEMU Guest Agent
190
+================
191
+
192
+Synopsis
193
+--------
194
+
195
+**qemu-ga** [*OPTIONS*]
196
+
197
+Description
198
+-----------
199
+
200
+The QEMU Guest Agent is a daemon intended to be run within virtual
201
+machines. It allows the hypervisor host to perform various operations
202
+in the guest, such as:
203
+
204
+- get information from the guest
205
+- set the guest's system time
206
+- read/write a file
207
+- sync and freeze the filesystems
208
+- suspend the guest
209
+- reconfigure guest local processors
210
+- set user's password
211
+- ...
212
+
213
+qemu-ga will read a system configuration file on startup (located at
214
+|CONFDIR|\ ``/qemu-ga.conf`` by default), then parse remaining
215
+configuration options on the command line. For the same key, the last
216
+option wins, but the lists accumulate (see below for configuration
217
+file format).
218
+
219
+Options
220
+-------
221
+
222
+.. program:: qemu-ga
223
+
224
+.. option:: -m, --method=METHOD
225
+
226
+ Transport method: one of ``unix-listen``, ``virtio-serial``, or
227
+ ``isa-serial`` (``virtio-serial`` is the default).
228
+
229
+.. option:: -p, --path=PATH
230
+
231
+ Device/socket path (the default for virtio-serial is
232
+ ``/dev/virtio-ports/org.qemu.guest_agent.0``,
233
+ the default for isa-serial is ``/dev/ttyS0``)
234
+
235
+.. option:: -l, --logfile=PATH
236
+
237
+ Set log file path (default is stderr).
238
+
239
+.. option:: -f, --pidfile=PATH
240
+
241
+ Specify pid file (default is ``/var/run/qemu-ga.pid``).
242
+
243
+.. option:: -F, --fsfreeze-hook=PATH
244
+
245
+ Enable fsfreeze hook. Accepts an optional argument that specifies
246
+ script to run on freeze/thaw. Script will be called with
247
+ 'freeze'/'thaw' arguments accordingly (default is
248
+ |CONFDIR|\ ``/fsfreeze-hook``). If using -F with an argument, do
249
+ not follow -F with a space (for example:
250
+ ``-F/var/run/fsfreezehook.sh``).
251
+
252
+.. option:: -t, --statedir=PATH
253
+
254
+ Specify the directory to store state information (absolute paths only,
255
+ default is ``/var/run``).
256
+
257
+.. option:: -v, --verbose
258
+
259
+ Log extra debugging information.
260
+
261
+.. option:: -V, --version
262
+
263
+ Print version information and exit.
264
+
265
+.. option:: -d, --daemon
266
+
267
+ Daemonize after startup (detach from terminal).
268
+
269
+.. option:: -b, --blacklist=LIST
270
+
271
+ Comma-separated list of RPCs to disable (no spaces, ``?`` to list
272
+ available RPCs).
273
+
274
+.. option:: -D, --dump-conf
275
+
276
+ Dump the configuration in a format compatible with ``qemu-ga.conf``
277
+ and exit.
278
+
279
+.. option:: -h, --help
280
+
281
+ Display this help and exit.
282
+
283
+Files
284
+-----
285
+
286
+
287
+The syntax of the ``qemu-ga.conf`` configuration file follows the
288
+Desktop Entry Specification, here is a quick summary: it consists of
289
+groups of key-value pairs, interspersed with comments.
290
+
291
+::
292
+
293
+ # qemu-ga configuration sample
294
+ [general]
295
+ daemonize = 0
296
+ pidfile = /var/run/qemu-ga.pid
297
+ verbose = 0
298
+ method = virtio-serial
299
+ path = /dev/virtio-ports/org.qemu.guest_agent.0
300
+ statedir = /var/run
301
+
302
+The list of keys follows the command line options:
303
+
304
+============= ===========
305
+Key Key type
306
+============= ===========
307
+daemon boolean
308
+method string
309
+path string
310
+logfile string
311
+pidfile string
312
+fsfreeze-hook string
313
+statedir string
314
+verbose boolean
315
+blacklist string list
316
+============= ===========
317
+
318
+See also
319
+--------
320
+
321
+:manpage:`qemu(1)`
322
diff --git a/qemu-doc.texi b/qemu-doc.texi
323
index XXXXXXX..XXXXXXX 100644
324
--- a/qemu-doc.texi
325
+++ b/qemu-doc.texi
326
@@ -XXX,XX +XXX,XX @@ so should only be used with trusted guest OS.
327
328
@c man end
329
330
-@node QEMU Guest Agent
331
-@chapter QEMU Guest Agent invocation
332
-
333
-@include qemu-ga.texi
334
-
335
@node QEMU User space emulator
336
@chapter QEMU User space emulator
337
338
diff --git a/qemu-ga.texi b/qemu-ga.texi
339
deleted file mode 100644
340
index XXXXXXX..XXXXXXX
341
--- a/qemu-ga.texi
342
+++ /dev/null
343
@@ -XXX,XX +XXX,XX @@
344
-@example
345
-@c man begin SYNOPSIS
346
-@command{qemu-ga} [@var{OPTIONS}]
347
-@c man end
348
-@end example
349
-
350
-@c man begin DESCRIPTION
351
-
352
-The QEMU Guest Agent is a daemon intended to be run within virtual
353
-machines. It allows the hypervisor host to perform various operations
354
-in the guest, such as:
355
-
356
-@itemize
357
-@item
358
-get information from the guest
359
-@item
360
-set the guest's system time
361
-@item
362
-read/write a file
363
-@item
364
-sync and freeze the filesystems
365
-@item
366
-suspend the guest
367
-@item
368
-reconfigure guest local processors
369
-@item
370
-set user's password
371
-@item
372
-...
373
-@end itemize
374
-
375
-qemu-ga will read a system configuration file on startup (located at
376
-@file{@value{CONFDIR}/qemu-ga.conf} by default), then parse remaining
377
-configuration options on the command line. For the same key, the last
378
-option wins, but the lists accumulate (see below for configuration
379
-file format).
380
-
381
-@c man end
382
-
383
-@c man begin OPTIONS
384
-@table @option
385
-@item -m, --method=@var{method}
386
- Transport method: one of @samp{unix-listen}, @samp{virtio-serial}, or
387
- @samp{isa-serial} (@samp{virtio-serial} is the default).
388
-
389
-@item -p, --path=@var{path}
390
- Device/socket path (the default for virtio-serial is
391
- @samp{/dev/virtio-ports/org.qemu.guest_agent.0},
392
- the default for isa-serial is @samp{/dev/ttyS0})
393
-
394
-@item -l, --logfile=@var{path}
395
- Set log file path (default is stderr).
396
-
397
-@item -f, --pidfile=@var{path}
398
- Specify pid file (default is @samp{/var/run/qemu-ga.pid}).
399
-
400
-@item -F, --fsfreeze-hook=@var{path}
401
- Enable fsfreeze hook. Accepts an optional argument that specifies
402
- script to run on freeze/thaw. Script will be called with
403
- 'freeze'/'thaw' arguments accordingly (default is
404
- @samp{@value{CONFDIR}/fsfreeze-hook}). If using -F with an argument, do
405
- not follow -F with a space (for example:
406
- @samp{-F/var/run/fsfreezehook.sh}).
407
-
408
-@item -t, --statedir=@var{path}
409
- Specify the directory to store state information (absolute paths only,
410
- default is @samp{/var/run}).
411
-
412
-@item -v, --verbose
413
- Log extra debugging information.
414
-
415
-@item -V, --version
416
- Print version information and exit.
417
-
418
-@item -d, --daemon
419
- Daemonize after startup (detach from terminal).
420
-
421
-@item -b, --blacklist=@var{list}
422
- Comma-separated list of RPCs to disable (no spaces, @samp{?} to list
423
- available RPCs).
424
-
425
-@item -D, --dump-conf
426
- Dump the configuration in a format compatible with @file{qemu-ga.conf}
427
- and exit.
428
-
429
-@item -h, --help
430
- Display this help and exit.
431
-@end table
432
-
433
-@c man end
434
-
435
-@c man begin FILES
436
-
437
-The syntax of the @file{qemu-ga.conf} configuration file follows the
438
-Desktop Entry Specification, here is a quick summary: it consists of
439
-groups of key-value pairs, interspersed with comments.
440
-
441
-@example
442
-# qemu-ga configuration sample
443
-[general]
444
-daemonize = 0
445
-pidfile = /var/run/qemu-ga.pid
446
-verbose = 0
447
-method = virtio-serial
448
-path = /dev/virtio-ports/org.qemu.guest_agent.0
449
-statedir = /var/run
450
-@end example
451
-
452
-The list of keys follows the command line options:
453
-@table @option
454
-@item daemon= boolean
455
-@item method= string
456
-@item path= string
457
-@item logfile= string
458
-@item pidfile= string
459
-@item fsfreeze-hook= string
460
-@item statedir= string
461
-@item verbose= boolean
462
-@item blacklist= string list
463
-@end table
464
-
465
-@c man end
466
-
467
-@ignore
468
-
469
-@setfilename qemu-ga
470
-@settitle QEMU Guest Agent
471
-
472
-@c man begin AUTHOR
473
-Michael Roth <mdroth@linux.vnet.ibm.com>
474
-@c man end
475
-
476
-@c man begin SEEALSO
477
-qemu(1)
478
-@c man end
479
-
480
-@end ignore
62
--
481
--
63
2.25.1
482
2.20.1
483
484
diff view generated by jsdifflib