1
target-arm queue. This has the "plumb txattrs through various
1
target-arm queue: aspeed patches from Cédric, and
2
bits of exec.c" patches, and a collection of bug fixes from
2
cleanup and sd card patches from Philippe.
3
various people.
4
3
5
thanks
4
thanks
6
-- PMM
5
-- PMM
7
6
7
The following changes since commit bac5ba3dc5da706f52c149fa6c0bd1dc96899bec:
8
8
9
9
Merge remote-tracking branch 'remotes/thibault/tags/samuel-thibault' into staging (2018-06-08 10:26:16 +0100)
10
The following changes since commit a3ac12fba028df90f7b3dbec924995c126c41022:
11
12
Merge remote-tracking branch 'remotes/ehabkost/tags/numa-next-pull-request' into staging (2018-05-31 11:12:36 +0100)
13
10
14
are available in the Git repository at:
11
are available in the Git repository at:
15
12
16
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180531
13
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20180608
17
14
18
for you to fetch changes up to 49d1dca0520ea71bc21867fab6647f474fcf857b:
15
for you to fetch changes up to 113f31c06c6bf16451892b2459d83c9b9c5e9844:
19
16
20
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice (2018-05-31 14:52:53 +0100)
17
sdcard: Disable CMD19/CMD23 for Spec v2 (2018-06-08 13:15:34 +0100)
21
18
22
----------------------------------------------------------------
19
----------------------------------------------------------------
23
target-arm queue:
20
target-arm queue:
24
* target/arm: Honour FPCR.FZ in FRECPX
21
* arm_gicv3_kvm: fix migration of registers corresponding to
25
* MAINTAINERS: Add entries for newer MPS2 boards and devices
22
IRQs 992 to 1020 in the KVM GIC
26
* hw/intc/arm_gicv3: Fix APxR<n> register dispatching
23
* aspeed: remove ignore_memory_transaction_failures on all boards
27
* arm_gicv3_kvm: fix bug in writing zero bits back to the in-kernel
24
* aspeed: add support for the witherspoon-bmc board
28
GIC state
25
* aspeed: add an I2C RTC device and EEPROM I2C devices
29
* tcg: Fix helper function vs host abi for float16
26
* aspeed: add the pc9552 chips to the witherspoon machine
30
* arm: fix qemu crash on startup with -bios option
27
* ftgmac100: fix various bugs
31
* arm: fix malloc type mismatch
28
* hw/arm: Remove the deprecated xlnx-ep108 machine
32
* xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
29
* hw/i2c: Add trace events
33
* Correct CPACR reset value for v7 cores
30
* add missing '\n' on various qemu_log() logging strings
34
* memory.h: Improve IOMMU related documentation
31
* sdcard: clean up spec version support so we report the
35
* exec: Plumb transaction attributes through various functions in
32
right spec version to the guest and only implement the
36
preparation for allowing IOMMUs to see them
33
commands that are supposed to be present in that version
37
* vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
38
* ARM: ACPI: Fix use-after-free due to memory realloc
39
* KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
40
34
41
----------------------------------------------------------------
35
----------------------------------------------------------------
42
Francisco Iglesias (1):
36
Cédric Le Goater (11):
43
xlnx-zdma: Correct mem leaks and memset to zero on desc unaligned errors
37
aspeed: remove ignore_memory_transaction_failures on all boards
38
aspeed: add support for the witherspoon-bmc board
39
aspeed: add an I2C RTC device to all machines
40
smbus: add a smbus_eeprom_init_one() routine
41
aspeed: Add EEPROM I2C devices
42
misc: add pca9552 LED blinker model
43
aspeed: add the pc9552 chips to the witherspoon machine
44
ftgmac100: compute maximum frame size depending on the protocol
45
ftgmac100: add IEEE 802.1Q VLAN support
46
ftgmac100: fix multicast hash routine
47
ftgmac100: remove check on runt messages
44
48
45
Igor Mammedov (1):
49
Philippe Mathieu-Daudé (18):
46
arm: fix qemu crash on startup with -bios option
50
hw/i2c: Add trace events
51
hw/sd/milkymist-memcard: Add trailing '\n' to qemu_log() call
52
hw/digic: Add trailing '\n' to qemu_log() calls
53
xilinx-dp: Add trailing '\n' to qemu_log() call
54
ppc/pnv: Add trailing '\n' to qemu_log() calls
55
hw/core/register: Add trailing '\n' to qemu_log() call
56
hw/mips/boston: Add trailing '\n' to qemu_log() calls
57
stellaris: Add trailing '\n' to qemu_log() calls
58
target/arm: Add trailing '\n' to qemu_log() calls
59
target/m68k: Add trailing '\n' to qemu_log() call
60
RISC-V: Add trailing '\n' to qemu_log() calls
61
target/xtensa: Add trailing '\n' to qemu_log() calls
62
sdcard: Update the Configuration Register (SCR) to Spec Version 1.10
63
sdcard: Allow commands valid in SPI mode
64
sdcard: Add a 'spec_version' property, default to Spec v2.00
65
sdcard: Disable SEND_IF_COND (CMD8) for Spec v1
66
sdcard: Reflect when the Spec v3 is supported in the Config Register (SCR)
67
sdcard: Disable CMD19/CMD23 for Spec v2
47
68
48
Jan Kiszka (1):
69
Shannon Zhao (1):
49
hw/intc/arm_gicv3: Fix APxR<n> register dispatching
70
arm_gicv3_kvm: kvm_dist_get/put: skip the registers banked by GICR
50
71
51
Paolo Bonzini (1):
72
Thomas Huth (1):
52
arm: fix malloc type mismatch
73
hw/arm: Remove the deprecated xlnx-ep108 machine
53
74
54
Peter Maydell (17):
75
Makefile.objs | 1 +
55
target/arm: Honour FPCR.FZ in FRECPX
76
hw/misc/Makefile.objs | 1 +
56
MAINTAINERS: Add entries for newer MPS2 boards and devices
77
tests/Makefile.include | 2 +
57
Correct CPACR reset value for v7 cores
78
include/hw/i2c/smbus.h | 1 +
58
memory.h: Improve IOMMU related documentation
79
include/hw/intc/arm_gicv3_common.h | 1 +
59
Make tb_invalidate_phys_addr() take a MemTxAttrs argument
80
include/hw/misc/pca9552.h | 32 +++++
60
Make address_space_translate{, _cached}() take a MemTxAttrs argument
81
include/hw/misc/pca9552_regs.h | 32 +++++
61
Make address_space_map() take a MemTxAttrs argument
82
include/hw/net/ftgmac100.h | 7 +-
62
Make address_space_access_valid() take a MemTxAttrs argument
83
include/hw/sd/sd.h | 6 +
63
Make flatview_extend_translation() take a MemTxAttrs argument
84
tests/libqos/i2c.h | 2 +
64
Make memory_region_access_valid() take a MemTxAttrs argument
85
hw/arm/aspeed.c | 88 +++++++++++++-
65
Make MemoryRegion valid.accepts callback take a MemTxAttrs argument
86
hw/arm/stellaris.c | 11 +-
66
Make flatview_access_valid() take a MemTxAttrs argument
87
hw/arm/xlnx-zcu102.c | 62 +---------
67
Make flatview_translate() take a MemTxAttrs argument
88
hw/char/digic-uart.c | 4 +-
68
Make address_space_get_iotlb_entry() take a MemTxAttrs argument
89
hw/core/register.c | 2 +-
69
Make flatview_do_translate() take a MemTxAttrs argument
90
hw/display/xlnx_dp.c | 4 +-
70
Make address_space_translate_iommu take a MemTxAttrs argument
91
hw/i2c/core.c | 25 ++--
71
vmstate.h: Provide VMSTATE_BOOL_SUB_ARRAY
92
hw/i2c/smbus_eeprom.c | 16 ++-
93
hw/intc/arm_gicv3_common.c | 79 ++++++++++++
94
hw/intc/arm_gicv3_kvm.c | 38 ++++++
95
hw/mips/boston.c | 8 +-
96
hw/misc/pca9552.c | 240 +++++++++++++++++++++++++++++++++++++
97
hw/net/ftgmac100.c | 64 ++++++----
98
hw/ppc/pnv_core.c | 4 +-
99
hw/sd/milkymist-memcard.c | 2 +-
100
hw/sd/sd.c | 50 +++++---
101
hw/timer/digic-timer.c | 4 +-
102
target/arm/helper.c | 4 +-
103
target/m68k/translate.c | 2 +-
104
target/riscv/op_helper.c | 6 +-
105
target/xtensa/translate.c | 6 +-
106
tests/pca9552-test.c | 116 ++++++++++++++++++
107
tests/tmp105-test.c | 2 -
108
default-configs/arm-softmmu.mak | 1 +
109
hw/i2c/trace-events | 7 ++
110
qemu-doc.texi | 5 -
111
36 files changed, 788 insertions(+), 147 deletions(-)
112
create mode 100644 include/hw/misc/pca9552.h
113
create mode 100644 include/hw/misc/pca9552_regs.h
114
create mode 100644 hw/misc/pca9552.c
115
create mode 100644 tests/pca9552-test.c
116
create mode 100644 hw/i2c/trace-events
72
117
73
Richard Henderson (1):
74
tcg: Fix helper function vs host abi for float16
75
76
Shannon Zhao (3):
77
arm_gicv3_kvm: increase clroffset accordingly
78
ARM: ACPI: Fix use-after-free due to memory realloc
79
KVM: GIC: Fix memory leak due to calling kvm_init_irq_routing twice
80
81
include/exec/exec-all.h | 5 +-
82
include/exec/helper-head.h | 2 +-
83
include/exec/memory-internal.h | 3 +-
84
include/exec/memory.h | 128 +++++++++++++++++++++++++++++++++++------
85
include/migration/vmstate.h | 3 +
86
include/sysemu/dma.h | 6 +-
87
accel/tcg/translate-all.c | 4 +-
88
exec.c | 95 ++++++++++++++++++------------
89
hw/arm/boot.c | 18 +++---
90
hw/arm/virt-acpi-build.c | 20 +++++--
91
hw/dma/xlnx-zdma.c | 10 +++-
92
hw/hppa/dino.c | 3 +-
93
hw/intc/arm_gic_kvm.c | 1 -
94
hw/intc/arm_gicv3_cpuif.c | 12 ++--
95
hw/intc/arm_gicv3_kvm.c | 2 +-
96
hw/nvram/fw_cfg.c | 12 ++--
97
hw/s390x/s390-pci-inst.c | 3 +-
98
hw/scsi/esp.c | 3 +-
99
hw/vfio/common.c | 3 +-
100
hw/virtio/vhost.c | 3 +-
101
hw/xen/xen_pt_msi.c | 3 +-
102
memory.c | 12 ++--
103
memory_ldst.inc.c | 18 +++---
104
target/arm/gdbstub.c | 3 +-
105
target/arm/helper-a64.c | 41 +++++++------
106
target/arm/helper.c | 90 ++++++++++++++++-------------
107
target/ppc/mmu-hash64.c | 3 +-
108
target/riscv/helper.c | 2 +-
109
target/s390x/diag.c | 6 +-
110
target/s390x/excp_helper.c | 3 +-
111
target/s390x/mmu_helper.c | 3 +-
112
target/s390x/sigp.c | 3 +-
113
target/xtensa/op_helper.c | 3 +-
114
MAINTAINERS | 9 ++-
115
34 files changed, 353 insertions(+), 182 deletions(-)
116
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
2
2
3
It forgot to increase clroffset during the loop. So it only clear the
3
While we skip the GIC_INTERNAL irqs, we don't change the register offset
4
first 4 bytes.
4
accordingly. This will overlap the GICR registers value and leave the
5
last GIC_INTERNAL irq's registers out of update.
6
7
Fix this by skipping the registers banked by GICR.
8
9
Also for migration compatibility if the migration source (old version
10
qemu) doesn't send gicd_no_migration_shift_bug = 1 to destination, then
11
we shift the data of PPI to get the right data for SPI.
5
12
6
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
13
Fixes: 367b9f527becdd20ddf116e17a3c0c2bbc486920
7
Cc: qemu-stable@nongnu.org
14
Cc: qemu-stable@nongnu.org
15
Reviewed-by: Eric Auger <eric.auger@redhat.com>
16
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
17
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
9
Reviewed-by: Eric Auger <eric.auger@redhat.com>
18
Message-id: 1527816987-16108-1-git-send-email-zhaoshenglong@huawei.com
10
Message-id: 1527047633-12368-1-git-send-email-zhaoshenglong@huawei.com
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
20
---
14
hw/intc/arm_gicv3_kvm.c | 1 +
21
include/hw/intc/arm_gicv3_common.h | 1 +
15
1 file changed, 1 insertion(+)
22
hw/intc/arm_gicv3_common.c | 79 ++++++++++++++++++++++++++++++
16
23
hw/intc/arm_gicv3_kvm.c | 38 ++++++++++++++
24
3 files changed, 118 insertions(+)
25
26
diff --git a/include/hw/intc/arm_gicv3_common.h b/include/hw/intc/arm_gicv3_common.h
27
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/intc/arm_gicv3_common.h
29
+++ b/include/hw/intc/arm_gicv3_common.h
30
@@ -XXX,XX +XXX,XX @@ struct GICv3State {
31
uint32_t revision;
32
bool security_extn;
33
bool irq_reset_nonsecure;
34
+ bool gicd_no_migration_shift_bug;
35
36
int dev_fd; /* kvm device fd if backed by kvm vgic support */
37
Error *migration_blocker;
38
diff --git a/hw/intc/arm_gicv3_common.c b/hw/intc/arm_gicv3_common.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/intc/arm_gicv3_common.c
41
+++ b/hw/intc/arm_gicv3_common.c
42
@@ -XXX,XX +XXX,XX @@
43
#include "hw/intc/arm_gicv3_common.h"
44
#include "gicv3_internal.h"
45
#include "hw/arm/linux-boot-if.h"
46
+#include "sysemu/kvm.h"
47
48
static int gicv3_pre_save(void *opaque)
49
{
50
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_gicv3_cpu = {
51
}
52
};
53
54
+static int gicv3_gicd_no_migration_shift_bug_pre_load(void *opaque)
55
+{
56
+ GICv3State *cs = opaque;
57
+
58
+ /*
59
+ * The gicd_no_migration_shift_bug flag is used for migration compatibility
60
+ * for old version QEMU which may have the GICD bmp shift bug under KVM mode.
61
+ * Strictly, what we want to know is whether the migration source is using
62
+ * KVM. Since we don't have any way to determine that, we look at whether the
63
+ * destination is using KVM; this is close enough because for the older QEMU
64
+ * versions with this bug KVM -> TCG migration didn't work anyway. If the
65
+ * source is a newer QEMU without this bug it will transmit the migration
66
+ * subsection which sets the flag to true; otherwise it will remain set to
67
+ * the value we select here.
68
+ */
69
+ if (kvm_enabled()) {
70
+ cs->gicd_no_migration_shift_bug = false;
71
+ }
72
+
73
+ return 0;
74
+}
75
+
76
+static int gicv3_gicd_no_migration_shift_bug_post_load(void *opaque,
77
+ int version_id)
78
+{
79
+ GICv3State *cs = opaque;
80
+
81
+ if (cs->gicd_no_migration_shift_bug) {
82
+ return 0;
83
+ }
84
+
85
+ /* Older versions of QEMU had a bug in the handling of state save/restore
86
+ * to the KVM GICv3: they got the offset in the bitmap arrays wrong,
87
+ * so that instead of the data for external interrupts 32 and up
88
+ * starting at bit position 32 in the bitmap, it started at bit
89
+ * position 64. If we're receiving data from a QEMU with that bug,
90
+ * we must move the data down into the right place.
91
+ */
92
+ memmove(cs->group, (uint8_t *)cs->group + GIC_INTERNAL / 8,
93
+ sizeof(cs->group) - GIC_INTERNAL / 8);
94
+ memmove(cs->grpmod, (uint8_t *)cs->grpmod + GIC_INTERNAL / 8,
95
+ sizeof(cs->grpmod) - GIC_INTERNAL / 8);
96
+ memmove(cs->enabled, (uint8_t *)cs->enabled + GIC_INTERNAL / 8,
97
+ sizeof(cs->enabled) - GIC_INTERNAL / 8);
98
+ memmove(cs->pending, (uint8_t *)cs->pending + GIC_INTERNAL / 8,
99
+ sizeof(cs->pending) - GIC_INTERNAL / 8);
100
+ memmove(cs->active, (uint8_t *)cs->active + GIC_INTERNAL / 8,
101
+ sizeof(cs->active) - GIC_INTERNAL / 8);
102
+ memmove(cs->edge_trigger, (uint8_t *)cs->edge_trigger + GIC_INTERNAL / 8,
103
+ sizeof(cs->edge_trigger) - GIC_INTERNAL / 8);
104
+
105
+ /*
106
+ * While this new version QEMU doesn't have this kind of bug as we fix it,
107
+ * so it needs to set the flag to true to indicate that and it's necessary
108
+ * for next migration to work from this new version QEMU.
109
+ */
110
+ cs->gicd_no_migration_shift_bug = true;
111
+
112
+ return 0;
113
+}
114
+
115
+const VMStateDescription vmstate_gicv3_gicd_no_migration_shift_bug = {
116
+ .name = "arm_gicv3/gicd_no_migration_shift_bug",
117
+ .version_id = 1,
118
+ .minimum_version_id = 1,
119
+ .pre_load = gicv3_gicd_no_migration_shift_bug_pre_load,
120
+ .post_load = gicv3_gicd_no_migration_shift_bug_post_load,
121
+ .fields = (VMStateField[]) {
122
+ VMSTATE_BOOL(gicd_no_migration_shift_bug, GICv3State),
123
+ VMSTATE_END_OF_LIST()
124
+ }
125
+};
126
+
127
static const VMStateDescription vmstate_gicv3 = {
128
.name = "arm_gicv3",
129
.version_id = 1,
130
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_gicv3 = {
131
VMSTATE_STRUCT_VARRAY_POINTER_UINT32(cpu, GICv3State, num_cpu,
132
vmstate_gicv3_cpu, GICv3CPUState),
133
VMSTATE_END_OF_LIST()
134
+ },
135
+ .subsections = (const VMStateDescription * []) {
136
+ &vmstate_gicv3_gicd_no_migration_shift_bug,
137
+ NULL
138
}
139
};
140
141
@@ -XXX,XX +XXX,XX @@ static void arm_gicv3_common_reset(DeviceState *dev)
142
gicv3_gicd_group_set(s, i);
143
}
144
}
145
+ s->gicd_no_migration_shift_bug = true;
146
}
147
148
static void arm_gic_common_linux_init(ARMLinuxBootIf *obj,
17
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
149
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
18
index XXXXXXX..XXXXXXX 100644
150
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/arm_gicv3_kvm.c
151
--- a/hw/intc/arm_gicv3_kvm.c
20
+++ b/hw/intc/arm_gicv3_kvm.c
152
+++ b/hw/intc/arm_gicv3_kvm.c
153
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_get_edge_trigger(GICv3State *s, uint32_t offset,
154
uint32_t reg;
155
int irq;
156
157
+ /* For the KVM GICv3, affinity routing is always enabled, and the first 2
158
+ * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
159
+ * functionality is replaced by GICR_ICFGR<n>. It doesn't need to sync
160
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
161
+ * This matches the for_each_dist_irq_reg() macro which also skips the
162
+ * first GIC_INTERNAL irqs.
163
+ */
164
+ offset += (GIC_INTERNAL * 2) / 8;
165
for_each_dist_irq_reg(irq, s->num_irq, 2) {
166
kvm_gicd_access(s, offset, &reg, false);
167
reg = half_unshuffle32(reg >> 1);
168
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_put_edge_trigger(GICv3State *s, uint32_t offset,
169
uint32_t reg;
170
int irq;
171
172
+ /* For the KVM GICv3, affinity routing is always enabled, and the first 2
173
+ * GICD_ICFGR<n> registers are always RAZ/WI. The corresponding
174
+ * functionality is replaced by GICR_ICFGR<n>. It doesn't need to sync
175
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
176
+ * This matches the for_each_dist_irq_reg() macro which also skips the
177
+ * first GIC_INTERNAL irqs.
178
+ */
179
+ offset += (GIC_INTERNAL * 2) / 8;
180
for_each_dist_irq_reg(irq, s->num_irq, 2) {
181
reg = *gic_bmp_ptr32(bmp, irq);
182
if (irq % 32 != 0) {
183
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_getbmp(GICv3State *s, uint32_t offset, uint32_t *bmp)
184
uint32_t reg;
185
int irq;
186
187
+ /* For the KVM GICv3, affinity routing is always enabled, and the
188
+ * GICD_IGROUPR0/GICD_IGRPMODR0/GICD_ISENABLER0/GICD_ISPENDR0/
189
+ * GICD_ISACTIVER0 registers are always RAZ/WI. The corresponding
190
+ * functionality is replaced by the GICR registers. It doesn't need to sync
191
+ * them. So it should increase the offset to skip GIC_INTERNAL irqs.
192
+ * This matches the for_each_dist_irq_reg() macro which also skips the
193
+ * first GIC_INTERNAL irqs.
194
+ */
195
+ offset += (GIC_INTERNAL * 1) / 8;
196
for_each_dist_irq_reg(irq, s->num_irq, 1) {
197
kvm_gicd_access(s, offset, &reg, false);
198
*gic_bmp_ptr32(bmp, irq) = reg;
21
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
199
@@ -XXX,XX +XXX,XX @@ static void kvm_dist_putbmp(GICv3State *s, uint32_t offset,
22
if (clroffset != 0) {
200
uint32_t reg;
23
reg = 0;
201
int irq;
24
kvm_gicd_access(s, clroffset, &reg, true);
202
25
+ clroffset += 4;
203
+ /* For the KVM GICv3, affinity routing is always enabled, and the
26
}
204
+ * GICD_IGROUPR0/GICD_IGRPMODR0/GICD_ISENABLER0/GICD_ISPENDR0/
27
reg = *gic_bmp_ptr32(bmp, irq);
205
+ * GICD_ISACTIVER0 registers are always RAZ/WI. The corresponding
28
kvm_gicd_access(s, offset, &reg, true);
206
+ * functionality is replaced by the GICR registers. It doesn't need to sync
207
+ * them. So it should increase the offset and clroffset to skip GIC_INTERNAL
208
+ * irqs. This matches the for_each_dist_irq_reg() macro which also skips the
209
+ * first GIC_INTERNAL irqs.
210
+ */
211
+ offset += (GIC_INTERNAL * 1) / 8;
212
+ if (clroffset != 0) {
213
+ clroffset += (GIC_INTERNAL * 1) / 8;
214
+ }
215
+
216
for_each_dist_irq_reg(irq, s->num_irq, 1) {
217
/* If this bitmap is a set/clear register pair, first write to the
218
* clear-reg to clear all bits before using the set-reg to write
29
--
219
--
30
2.17.1
220
2.17.1
31
221
32
222
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Cédric Le Goater <clg@kaod.org>
2
add MemTxAttrs as an argument to the MemoryRegion valid.accepts
3
callback. We'll need this for subpage_accepts().
4
2
5
We could take the approach we used with the read and write
3
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
callbacks and add new a new _with_attrs version, but since there
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
are so few implementations of the accepts hook we just change
5
Message-id: 20180530064049.27976-2-clg@kaod.org
8
them all.
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
hw/arm/aspeed.c | 3 ---
9
1 file changed, 3 deletions(-)
9
10
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
11
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20180521140402.23318-9-peter.maydell@linaro.org
14
---
15
include/exec/memory.h | 3 ++-
16
exec.c | 9 ++++++---
17
hw/hppa/dino.c | 3 ++-
18
hw/nvram/fw_cfg.c | 12 ++++++++----
19
hw/scsi/esp.c | 3 ++-
20
hw/xen/xen_pt_msi.c | 3 ++-
21
memory.c | 5 +++--
22
7 files changed, 25 insertions(+), 13 deletions(-)
23
24
diff --git a/include/exec/memory.h b/include/exec/memory.h
25
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory.h
13
--- a/hw/arm/aspeed.c
27
+++ b/include/exec/memory.h
14
+++ b/hw/arm/aspeed.c
28
@@ -XXX,XX +XXX,XX @@ struct MemoryRegionOps {
15
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_class_init(ObjectClass *oc, void *data)
29
* as a machine check exception).
16
mc->no_floppy = 1;
30
*/
17
mc->no_cdrom = 1;
31
bool (*accepts)(void *opaque, hwaddr addr,
18
mc->no_parallel = 1;
32
- unsigned size, bool is_write);
19
- mc->ignore_memory_transaction_failures = true;
33
+ unsigned size, bool is_write,
34
+ MemTxAttrs attrs);
35
} valid;
36
/* Internal implementation constraints: */
37
struct {
38
diff --git a/exec.c b/exec.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/exec.c
41
+++ b/exec.c
42
@@ -XXX,XX +XXX,XX @@ static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
43
}
20
}
44
21
45
static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
22
static const TypeInfo palmetto_bmc_type = {
46
- unsigned size, bool is_write)
23
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_class_init(ObjectClass *oc, void *data)
47
+ unsigned size, bool is_write,
24
mc->no_floppy = 1;
48
+ MemTxAttrs attrs)
25
mc->no_cdrom = 1;
49
{
26
mc->no_parallel = 1;
50
return is_write;
27
- mc->ignore_memory_transaction_failures = true;
51
}
28
}
52
@@ -XXX,XX +XXX,XX @@ static MemTxResult subpage_write(void *opaque, hwaddr addr,
29
30
static const TypeInfo ast2500_evb_type = {
31
@@ -XXX,XX +XXX,XX @@ static void romulus_bmc_class_init(ObjectClass *oc, void *data)
32
mc->no_floppy = 1;
33
mc->no_cdrom = 1;
34
mc->no_parallel = 1;
35
- mc->ignore_memory_transaction_failures = true;
53
}
36
}
54
37
55
static bool subpage_accepts(void *opaque, hwaddr addr,
38
static const TypeInfo romulus_bmc_type = {
56
- unsigned len, bool is_write)
57
+ unsigned len, bool is_write,
58
+ MemTxAttrs attrs)
59
{
60
subpage_t *subpage = opaque;
61
#if defined(DEBUG_SUBPAGE)
62
@@ -XXX,XX +XXX,XX @@ static void readonly_mem_write(void *opaque, hwaddr addr,
63
}
64
65
static bool readonly_mem_accepts(void *opaque, hwaddr addr,
66
- unsigned size, bool is_write)
67
+ unsigned size, bool is_write,
68
+ MemTxAttrs attrs)
69
{
70
return is_write;
71
}
72
diff --git a/hw/hppa/dino.c b/hw/hppa/dino.c
73
index XXXXXXX..XXXXXXX 100644
74
--- a/hw/hppa/dino.c
75
+++ b/hw/hppa/dino.c
76
@@ -XXX,XX +XXX,XX @@ static void gsc_to_pci_forwarding(DinoState *s)
77
}
78
79
static bool dino_chip_mem_valid(void *opaque, hwaddr addr,
80
- unsigned size, bool is_write)
81
+ unsigned size, bool is_write,
82
+ MemTxAttrs attrs)
83
{
84
switch (addr) {
85
case DINO_IAR0:
86
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/nvram/fw_cfg.c
89
+++ b/hw/nvram/fw_cfg.c
90
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_dma_mem_write(void *opaque, hwaddr addr,
91
}
92
93
static bool fw_cfg_dma_mem_valid(void *opaque, hwaddr addr,
94
- unsigned size, bool is_write)
95
+ unsigned size, bool is_write,
96
+ MemTxAttrs attrs)
97
{
98
return !is_write || ((size == 4 && (addr == 0 || addr == 4)) ||
99
(size == 8 && addr == 0));
100
}
101
102
static bool fw_cfg_data_mem_valid(void *opaque, hwaddr addr,
103
- unsigned size, bool is_write)
104
+ unsigned size, bool is_write,
105
+ MemTxAttrs attrs)
106
{
107
return addr == 0;
108
}
109
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_ctl_mem_write(void *opaque, hwaddr addr,
110
}
111
112
static bool fw_cfg_ctl_mem_valid(void *opaque, hwaddr addr,
113
- unsigned size, bool is_write)
114
+ unsigned size, bool is_write,
115
+ MemTxAttrs attrs)
116
{
117
return is_write && size == 2;
118
}
119
@@ -XXX,XX +XXX,XX @@ static void fw_cfg_comb_write(void *opaque, hwaddr addr,
120
}
121
122
static bool fw_cfg_comb_valid(void *opaque, hwaddr addr,
123
- unsigned size, bool is_write)
124
+ unsigned size, bool is_write,
125
+ MemTxAttrs attrs)
126
{
127
return (size == 1) || (is_write && size == 2);
128
}
129
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
130
index XXXXXXX..XXXXXXX 100644
131
--- a/hw/scsi/esp.c
132
+++ b/hw/scsi/esp.c
133
@@ -XXX,XX +XXX,XX @@ void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val)
134
}
135
136
static bool esp_mem_accepts(void *opaque, hwaddr addr,
137
- unsigned size, bool is_write)
138
+ unsigned size, bool is_write,
139
+ MemTxAttrs attrs)
140
{
141
return (size == 1) || (is_write && size == 4);
142
}
143
diff --git a/hw/xen/xen_pt_msi.c b/hw/xen/xen_pt_msi.c
144
index XXXXXXX..XXXXXXX 100644
145
--- a/hw/xen/xen_pt_msi.c
146
+++ b/hw/xen/xen_pt_msi.c
147
@@ -XXX,XX +XXX,XX @@ static uint64_t pci_msix_read(void *opaque, hwaddr addr,
148
}
149
150
static bool pci_msix_accepts(void *opaque, hwaddr addr,
151
- unsigned size, bool is_write)
152
+ unsigned size, bool is_write,
153
+ MemTxAttrs attrs)
154
{
155
return !(addr & (size - 1));
156
}
157
diff --git a/memory.c b/memory.c
158
index XXXXXXX..XXXXXXX 100644
159
--- a/memory.c
160
+++ b/memory.c
161
@@ -XXX,XX +XXX,XX @@ static void unassigned_mem_write(void *opaque, hwaddr addr,
162
}
163
164
static bool unassigned_mem_accepts(void *opaque, hwaddr addr,
165
- unsigned size, bool is_write)
166
+ unsigned size, bool is_write,
167
+ MemTxAttrs attrs)
168
{
169
return false;
170
}
171
@@ -XXX,XX +XXX,XX @@ bool memory_region_access_valid(MemoryRegion *mr,
172
access_size = MAX(MIN(size, access_size_max), access_size_min);
173
for (i = 0; i < size; i += access_size) {
174
if (!mr->ops->valid.accepts(mr->opaque, addr + i, access_size,
175
- is_write)) {
176
+ is_write, attrs)) {
177
return false;
178
}
179
}
180
--
39
--
181
2.17.1
40
2.17.1
182
41
183
42
diff view generated by jsdifflib
New patch
1
From: Cédric Le Goater <clg@kaod.org>
1
2
3
The Witherspoon boards are OpenPOWER system hosting POWER9 Processors.
4
Add support for their BMC including a couple of I2C devices as found
5
on real HW.
6
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
9
Message-id: 20180530064049.27976-3-clg@kaod.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/aspeed.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
13
1 file changed, 49 insertions(+)
14
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed.c
18
+++ b/hw/arm/aspeed.c
19
@@ -XXX,XX +XXX,XX @@ enum {
20
PALMETTO_BMC,
21
AST2500_EVB,
22
ROMULUS_BMC,
23
+ WITHERSPOON_BMC,
24
};
25
26
/* Palmetto hardware value: 0x120CE416 */
27
@@ -XXX,XX +XXX,XX @@ enum {
28
SCU_AST2500_HW_STRAP_ACPI_ENABLE | \
29
SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_MASTER))
30
31
+/* Witherspoon hardware value: 0xF10AD216 (but use romulus definition) */
32
+#define WITHERSPOON_BMC_HW_STRAP1 ROMULUS_BMC_HW_STRAP1
33
+
34
static void palmetto_bmc_i2c_init(AspeedBoardState *bmc);
35
static void ast2500_evb_i2c_init(AspeedBoardState *bmc);
36
+static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc);
37
38
static const AspeedBoardConfig aspeed_boards[] = {
39
[PALMETTO_BMC] = {
40
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
41
.spi_model = "mx66l1g45g",
42
.num_cs = 2,
43
},
44
+ [WITHERSPOON_BMC] = {
45
+ .soc_name = "ast2500-a1",
46
+ .hw_strap1 = WITHERSPOON_BMC_HW_STRAP1,
47
+ .fmc_model = "mx25l25635e",
48
+ .spi_model = "mx66l1g45g",
49
+ .num_cs = 2,
50
+ .i2c_init = witherspoon_bmc_i2c_init,
51
+ },
52
};
53
54
#define FIRMWARE_ADDR 0x0
55
@@ -XXX,XX +XXX,XX @@ static const TypeInfo romulus_bmc_type = {
56
.class_init = romulus_bmc_class_init,
57
};
58
59
+static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
60
+{
61
+ AspeedSoCState *soc = &bmc->soc;
62
+
63
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
64
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
65
+
66
+ /* The Witherspoon expects a TMP275 but a TMP105 is compatible */
67
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 9), "tmp105", 0x4a);
68
+}
69
+
70
+static void witherspoon_bmc_init(MachineState *machine)
71
+{
72
+ aspeed_board_init(machine, &aspeed_boards[WITHERSPOON_BMC]);
73
+}
74
+
75
+static void witherspoon_bmc_class_init(ObjectClass *oc, void *data)
76
+{
77
+ MachineClass *mc = MACHINE_CLASS(oc);
78
+
79
+ mc->desc = "OpenPOWER Witherspoon BMC (ARM1176)";
80
+ mc->init = witherspoon_bmc_init;
81
+ mc->max_cpus = 1;
82
+ mc->no_sdcard = 1;
83
+ mc->no_floppy = 1;
84
+ mc->no_cdrom = 1;
85
+ mc->no_parallel = 1;
86
+}
87
+
88
+static const TypeInfo witherspoon_bmc_type = {
89
+ .name = MACHINE_TYPE_NAME("witherspoon-bmc"),
90
+ .parent = TYPE_MACHINE,
91
+ .class_init = witherspoon_bmc_class_init,
92
+};
93
+
94
static void aspeed_machine_init(void)
95
{
96
type_register_static(&palmetto_bmc_type);
97
type_register_static(&ast2500_evb_type);
98
type_register_static(&romulus_bmc_type);
99
+ type_register_static(&witherspoon_bmc_type);
100
}
101
102
type_init(aspeed_machine_init)
103
--
104
2.17.1
105
106
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Cédric Le Goater <clg@kaod.org>
2
add MemTxAttrs as an argument to address_space_map().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
The AST2500 EVB does not have an RTC but we can pretend that one is
4
plugged on the I2C bus header.
5
6
The romulus and witherspoon boards expects an Epson RX8900 I2C RTC but
7
a ds1338 is good enough for the basic features we need.
8
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
11
Message-id: 20180530064049.27976-4-clg@kaod.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-5-peter.maydell@linaro.org
10
---
13
---
11
include/exec/memory.h | 3 ++-
14
hw/arm/aspeed.c | 19 +++++++++++++++++++
12
include/sysemu/dma.h | 3 ++-
15
1 file changed, 19 insertions(+)
13
exec.c | 6 ++++--
14
target/ppc/mmu-hash64.c | 3 ++-
15
4 files changed, 10 insertions(+), 5 deletions(-)
16
16
17
diff --git a/include/exec/memory.h b/include/exec/memory.h
17
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
18
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/memory.h
19
--- a/hw/arm/aspeed.c
20
+++ b/include/exec/memory.h
20
+++ b/hw/arm/aspeed.c
21
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_
21
@@ -XXX,XX +XXX,XX @@ enum {
22
* @addr: address within that address space
22
23
* @plen: pointer to length of buffer; updated on return
23
static void palmetto_bmc_i2c_init(AspeedBoardState *bmc);
24
* @is_write: indicates the transfer direction
24
static void ast2500_evb_i2c_init(AspeedBoardState *bmc);
25
+ * @attrs: memory attributes
25
+static void romulus_bmc_i2c_init(AspeedBoardState *bmc);
26
*/
26
static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc);
27
void *address_space_map(AddressSpace *as, hwaddr addr,
27
28
- hwaddr *plen, bool is_write);
28
static const AspeedBoardConfig aspeed_boards[] = {
29
+ hwaddr *plen, bool is_write, MemTxAttrs attrs);
29
@@ -XXX,XX +XXX,XX @@ static const AspeedBoardConfig aspeed_boards[] = {
30
30
.fmc_model = "n25q256a",
31
/* address_space_unmap: Unmaps a memory region previously mapped by address_space_map()
31
.spi_model = "mx66l1g45g",
32
*
32
.num_cs = 2,
33
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
33
+ .i2c_init = romulus_bmc_i2c_init,
34
index XXXXXXX..XXXXXXX 100644
34
},
35
--- a/include/sysemu/dma.h
35
[WITHERSPOON_BMC] = {
36
+++ b/include/sysemu/dma.h
36
.soc_name = "ast2500-a1",
37
@@ -XXX,XX +XXX,XX @@ static inline void *dma_memory_map(AddressSpace *as,
37
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
38
hwaddr xlen = *len;
38
39
void *p;
39
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
40
40
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 7), "tmp105", 0x4d);
41
- p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE);
41
+
42
+ p = address_space_map(as, addr, &xlen, dir == DMA_DIRECTION_FROM_DEVICE,
42
+ /* The AST2500 EVB does not have an RTC. Let's pretend that one is
43
+ MEMTXATTRS_UNSPECIFIED);
43
+ * plugged on the I2C bus header */
44
*len = xlen;
44
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
45
return p;
46
}
45
}
47
diff --git a/exec.c b/exec.c
46
48
index XXXXXXX..XXXXXXX 100644
47
static void ast2500_evb_init(MachineState *machine)
49
--- a/exec.c
48
@@ -XXX,XX +XXX,XX @@ static const TypeInfo ast2500_evb_type = {
50
+++ b/exec.c
49
.class_init = ast2500_evb_class_init,
51
@@ -XXX,XX +XXX,XX @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
50
};
52
void *address_space_map(AddressSpace *as,
51
53
hwaddr addr,
52
+static void romulus_bmc_i2c_init(AspeedBoardState *bmc)
54
hwaddr *plen,
53
+{
55
- bool is_write)
54
+ AspeedSoCState *soc = &bmc->soc;
56
+ bool is_write,
55
+
57
+ MemTxAttrs attrs)
56
+ /* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
57
+ * good enough */
58
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
59
+}
60
+
61
static void romulus_bmc_init(MachineState *machine)
58
{
62
{
59
hwaddr len = *plen;
63
aspeed_board_init(machine, &aspeed_boards[ROMULUS_BMC]);
60
hwaddr l, xlat;
64
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
61
@@ -XXX,XX +XXX,XX @@ void *cpu_physical_memory_map(hwaddr addr,
65
62
hwaddr *plen,
66
/* The Witherspoon expects a TMP275 but a TMP105 is compatible */
63
int is_write)
67
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 9), "tmp105", 0x4a);
64
{
68
+
65
- return address_space_map(&address_space_memory, addr, plen, is_write);
69
+ /* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
66
+ return address_space_map(&address_space_memory, addr, plen, is_write,
70
+ * good enough */
67
+ MEMTXATTRS_UNSPECIFIED);
71
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
68
}
72
}
69
73
70
void cpu_physical_memory_unmap(void *buffer, hwaddr len,
74
static void witherspoon_bmc_init(MachineState *machine)
71
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/ppc/mmu-hash64.c
74
+++ b/target/ppc/mmu-hash64.c
75
@@ -XXX,XX +XXX,XX @@ const ppc_hash_pte64_t *ppc_hash64_map_hptes(PowerPCCPU *cpu,
76
return NULL;
77
}
78
79
- hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false);
80
+ hptes = address_space_map(CPU(cpu)->as, base + pte_offset, &plen, false,
81
+ MEMTXATTRS_UNSPECIFIED);
82
if (plen < (n * HASH_PTE_SIZE_64)) {
83
hw_error("%s: Unable to map all requested HPTEs\n", __func__);
84
}
85
--
75
--
86
2.17.1
76
2.17.1
87
77
88
78
diff view generated by jsdifflib
New patch
1
From: Cédric Le Goater <clg@kaod.org>
1
2
3
This is an helper routine to add a single EEPROM on an I2C bus. It can
4
be directly used by smbus_eeprom_init() which adds a certain number of
5
EEPROMs on mips and x86 machines.
6
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180530064049.27976-5-clg@kaod.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
include/hw/i2c/smbus.h | 1 +
13
hw/i2c/smbus_eeprom.c | 16 +++++++++++-----
14
2 files changed, 12 insertions(+), 5 deletions(-)
15
16
diff --git a/include/hw/i2c/smbus.h b/include/hw/i2c/smbus.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/i2c/smbus.h
19
+++ b/include/hw/i2c/smbus.h
20
@@ -XXX,XX +XXX,XX @@ int smbus_read_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data);
21
int smbus_write_block(I2CBus *bus, uint8_t addr, uint8_t command, uint8_t *data,
22
int len);
23
24
+void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf);
25
void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
26
const uint8_t *eeprom_spd, int size);
27
28
diff --git a/hw/i2c/smbus_eeprom.c b/hw/i2c/smbus_eeprom.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/i2c/smbus_eeprom.c
31
+++ b/hw/i2c/smbus_eeprom.c
32
@@ -XXX,XX +XXX,XX @@ static void smbus_eeprom_register_types(void)
33
34
type_init(smbus_eeprom_register_types)
35
36
+void smbus_eeprom_init_one(I2CBus *smbus, uint8_t address, uint8_t *eeprom_buf)
37
+{
38
+ DeviceState *dev;
39
+
40
+ dev = qdev_create((BusState *) smbus, "smbus-eeprom");
41
+ qdev_prop_set_uint8(dev, "address", address);
42
+ qdev_prop_set_ptr(dev, "data", eeprom_buf);
43
+ qdev_init_nofail(dev);
44
+}
45
+
46
void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
47
const uint8_t *eeprom_spd, int eeprom_spd_size)
48
{
49
@@ -XXX,XX +XXX,XX @@ void smbus_eeprom_init(I2CBus *smbus, int nb_eeprom,
50
}
51
52
for (i = 0; i < nb_eeprom; i++) {
53
- DeviceState *eeprom;
54
- eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
55
- qdev_prop_set_uint8(eeprom, "address", 0x50 + i);
56
- qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
57
- qdev_init_nofail(eeprom);
58
+ smbus_eeprom_init_one(smbus, 0x50 + i, eeprom_buf + (i * 256));
59
}
60
}
61
--
62
2.17.1
63
64
diff view generated by jsdifflib
New patch
1
From: Cédric Le Goater <clg@kaod.org>
1
2
3
The Aspeed boards have at least one EEPROM to hold the Vital Product
4
Data (VPD).
5
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
8
Message-id: 20180530064049.27976-6-clg@kaod.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
hw/arm/aspeed.c | 13 +++++++++++++
12
1 file changed, 13 insertions(+)
13
14
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/aspeed.c
17
+++ b/hw/arm/aspeed.c
18
@@ -XXX,XX +XXX,XX @@
19
#include "hw/arm/arm.h"
20
#include "hw/arm/aspeed_soc.h"
21
#include "hw/boards.h"
22
+#include "hw/i2c/smbus.h"
23
#include "qemu/log.h"
24
#include "sysemu/block-backend.h"
25
#include "hw/loader.h"
26
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_i2c_init(AspeedBoardState *bmc)
27
{
28
AspeedSoCState *soc = &bmc->soc;
29
DeviceState *dev;
30
+ uint8_t *eeprom_buf = g_malloc0(32 * 1024);
31
32
/* The palmetto platform expects a ds3231 RTC but a ds1338 is
33
* enough to provide basic RTC features. Alarms will be missing */
34
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 0), "ds1338", 0x68);
35
36
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 0), 0x50,
37
+ eeprom_buf);
38
+
39
/* add a TMP423 temperature sensor */
40
dev = i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 2),
41
"tmp423", 0x4c);
42
@@ -XXX,XX +XXX,XX @@ static const TypeInfo palmetto_bmc_type = {
43
static void ast2500_evb_i2c_init(AspeedBoardState *bmc)
44
{
45
AspeedSoCState *soc = &bmc->soc;
46
+ uint8_t *eeprom_buf = g_malloc0(8 * 1024);
47
+
48
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 3), 0x50,
49
+ eeprom_buf);
50
51
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
52
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 7), "tmp105", 0x4d);
53
@@ -XXX,XX +XXX,XX @@ static const TypeInfo romulus_bmc_type = {
54
static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
55
{
56
AspeedSoCState *soc = &bmc->soc;
57
+ uint8_t *eeprom_buf = g_malloc0(8 * 1024);
58
59
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
60
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
61
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
62
/* The witherspoon board expects Epson RX8900 I2C RTC but a ds1338 is
63
* good enough */
64
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "ds1338", 0x32);
65
+
66
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), 0x51,
67
+ eeprom_buf);
68
}
69
70
static void witherspoon_bmc_init(MachineState *machine)
71
--
72
2.17.1
73
74
diff view generated by jsdifflib
1
From: Paolo Bonzini <pbonzini@redhat.com>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
cpregs_keys is an uint32_t* so the allocation should use uint32_t.
3
Specs are available here :
4
g_new is even better because it is type-safe.
4
5
5
https://www.nxp.com/docs/en/application-note/AN264.pdf
6
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
6
7
This is a simple model supporting the basic registers for led and GPIO
8
mode. The device also supports two blinking rates but not the model
9
yet.
10
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-id: 20180530064049.27976-7-clg@kaod.org
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
16
---
11
target/arm/gdbstub.c | 3 +--
17
hw/misc/Makefile.objs | 1 +
12
1 file changed, 1 insertion(+), 2 deletions(-)
18
tests/Makefile.include | 2 +
13
19
include/hw/misc/pca9552.h | 32 +++++
14
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
20
include/hw/misc/pca9552_regs.h | 32 +++++
21
tests/libqos/i2c.h | 2 +
22
hw/misc/pca9552.c | 240 ++++++++++++++++++++++++++++++++
23
tests/pca9552-test.c | 116 +++++++++++++++
24
tests/tmp105-test.c | 2 -
25
default-configs/arm-softmmu.mak | 1 +
26
9 files changed, 426 insertions(+), 2 deletions(-)
27
create mode 100644 include/hw/misc/pca9552.h
28
create mode 100644 include/hw/misc/pca9552_regs.h
29
create mode 100644 hw/misc/pca9552.c
30
create mode 100644 tests/pca9552-test.c
31
32
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
15
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/gdbstub.c
34
--- a/hw/misc/Makefile.objs
17
+++ b/target/arm/gdbstub.c
35
+++ b/hw/misc/Makefile.objs
18
@@ -XXX,XX +XXX,XX @@ int arm_gen_dynamic_xml(CPUState *cs)
36
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_SGA) += sga.o
19
RegisterSysregXmlParam param = {cs, s};
37
common-obj-$(CONFIG_ISA_TESTDEV) += pc-testdev.o
20
38
common-obj-$(CONFIG_PCI_TESTDEV) += pci-testdev.o
21
cpu->dyn_xml.num_cpregs = 0;
39
common-obj-$(CONFIG_EDU) += edu.o
22
- cpu->dyn_xml.cpregs_keys = g_malloc(sizeof(uint32_t *) *
40
+common-obj-$(CONFIG_PCA9552) += pca9552.o
23
- g_hash_table_size(cpu->cp_regs));
41
24
+ cpu->dyn_xml.cpregs_keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
42
common-obj-y += unimp.o
25
g_string_printf(s, "<?xml version=\"1.0\"?>");
43
common-obj-$(CONFIG_FW_CFG_DMA) += vmcoreinfo.o
26
g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
44
diff --git a/tests/Makefile.include b/tests/Makefile.include
27
g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
45
index XXXXXXX..XXXXXXX 100644
46
--- a/tests/Makefile.include
47
+++ b/tests/Makefile.include
48
@@ -XXX,XX +XXX,XX @@ check-qtest-sparc64-y += tests/prom-env-test$(EXESUF)
49
check-qtest-sparc64-y += tests/boot-serial-test$(EXESUF)
50
51
check-qtest-arm-y = tests/tmp105-test$(EXESUF)
52
+check-qtest-arm-y += tests/pca9552-test$(EXESUF)
53
check-qtest-arm-y += tests/ds1338-test$(EXESUF)
54
check-qtest-arm-y += tests/m25p80-test$(EXESUF)
55
gcov-files-arm-y += hw/misc/tmp105.c
56
@@ -XXX,XX +XXX,XX @@ tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
57
    tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y)
58
tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y)
59
tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y)
60
+tests/pca9552-test$(EXESUF): tests/pca9552-test.o $(libqos-omap-obj-y)
61
tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y)
62
tests/m25p80-test$(EXESUF): tests/m25p80-test.o
63
tests/i440fx-test$(EXESUF): tests/i440fx-test.o $(libqos-pc-obj-y)
64
diff --git a/include/hw/misc/pca9552.h b/include/hw/misc/pca9552.h
65
new file mode 100644
66
index XXXXXXX..XXXXXXX
67
--- /dev/null
68
+++ b/include/hw/misc/pca9552.h
69
@@ -XXX,XX +XXX,XX @@
70
+/*
71
+ * PCA9552 I2C LED blinker
72
+ *
73
+ * Copyright (c) 2017-2018, IBM Corporation.
74
+ *
75
+ * This work is licensed under the terms of the GNU GPL, version 2 or
76
+ * later. See the COPYING file in the top-level directory.
77
+ */
78
+#ifndef PCA9552_H
79
+#define PCA9552_H
80
+
81
+#include "hw/i2c/i2c.h"
82
+
83
+#define TYPE_PCA9552 "pca9552"
84
+#define PCA9552(obj) OBJECT_CHECK(PCA9552State, (obj), TYPE_PCA9552)
85
+
86
+#define PCA9552_NR_REGS 10
87
+
88
+typedef struct PCA9552State {
89
+ /*< private >*/
90
+ I2CSlave i2c;
91
+ /*< public >*/
92
+
93
+ uint8_t len;
94
+ uint8_t pointer;
95
+
96
+ uint8_t regs[PCA9552_NR_REGS];
97
+ uint8_t max_reg;
98
+ uint8_t nr_leds;
99
+} PCA9552State;
100
+
101
+#endif
102
diff --git a/include/hw/misc/pca9552_regs.h b/include/hw/misc/pca9552_regs.h
103
new file mode 100644
104
index XXXXXXX..XXXXXXX
105
--- /dev/null
106
+++ b/include/hw/misc/pca9552_regs.h
107
@@ -XXX,XX +XXX,XX @@
108
+/*
109
+ * PCA9552 I2C LED blinker registers
110
+ *
111
+ * Copyright (c) 2017-2018, IBM Corporation.
112
+ *
113
+ * This work is licensed under the terms of the GNU GPL, version 2 or
114
+ * later. See the COPYING file in the top-level directory.
115
+ */
116
+#ifndef PCA9552_REGS_H
117
+#define PCA9552_REGS_H
118
+
119
+/*
120
+ * Bits [0:3] are used to address a specific register.
121
+ */
122
+#define PCA9552_INPUT0 0 /* read only input register 0 */
123
+#define PCA9552_INPUT1 1 /* read only input register 1 */
124
+#define PCA9552_PSC0 2 /* read/write frequency prescaler 0 */
125
+#define PCA9552_PWM0 3 /* read/write PWM register 0 */
126
+#define PCA9552_PSC1 4 /* read/write frequency prescaler 1 */
127
+#define PCA9552_PWM1 5 /* read/write PWM register 1 */
128
+#define PCA9552_LS0 6 /* read/write LED0 to LED3 selector */
129
+#define PCA9552_LS1 7 /* read/write LED4 to LED7 selector */
130
+#define PCA9552_LS2 8 /* read/write LED8 to LED11 selector */
131
+#define PCA9552_LS3 9 /* read/write LED12 to LED15 selector */
132
+
133
+/*
134
+ * Bit [4] is used to activate the Auto-Increment option of the
135
+ * register address
136
+ */
137
+#define PCA9552_AUTOINC (1 << 4)
138
+
139
+#endif
140
diff --git a/tests/libqos/i2c.h b/tests/libqos/i2c.h
141
index XXXXXXX..XXXXXXX 100644
142
--- a/tests/libqos/i2c.h
143
+++ b/tests/libqos/i2c.h
144
@@ -XXX,XX +XXX,XX @@ struct I2CAdapter {
145
QTestState *qts;
146
};
147
148
+#define OMAP2_I2C_1_BASE 0x48070000
149
+
150
void i2c_send(I2CAdapter *i2c, uint8_t addr,
151
const uint8_t *buf, uint16_t len);
152
void i2c_recv(I2CAdapter *i2c, uint8_t addr,
153
diff --git a/hw/misc/pca9552.c b/hw/misc/pca9552.c
154
new file mode 100644
155
index XXXXXXX..XXXXXXX
156
--- /dev/null
157
+++ b/hw/misc/pca9552.c
158
@@ -XXX,XX +XXX,XX @@
159
+/*
160
+ * PCA9552 I2C LED blinker
161
+ *
162
+ * https://www.nxp.com/docs/en/application-note/AN264.pdf
163
+ *
164
+ * Copyright (c) 2017-2018, IBM Corporation.
165
+ *
166
+ * This work is licensed under the terms of the GNU GPL, version 2 or
167
+ * later. See the COPYING file in the top-level directory.
168
+ */
169
+
170
+#include "qemu/osdep.h"
171
+#include "qemu/log.h"
172
+#include "hw/hw.h"
173
+#include "hw/misc/pca9552.h"
174
+#include "hw/misc/pca9552_regs.h"
175
+
176
+#define PCA9552_LED_ON 0x0
177
+#define PCA9552_LED_OFF 0x1
178
+#define PCA9552_LED_PWM0 0x2
179
+#define PCA9552_LED_PWM1 0x3
180
+
181
+static uint8_t pca9552_pin_get_config(PCA9552State *s, int pin)
182
+{
183
+ uint8_t reg = PCA9552_LS0 + (pin / 4);
184
+ uint8_t shift = (pin % 4) << 1;
185
+
186
+ return extract32(s->regs[reg], shift, 2);
187
+}
188
+
189
+static void pca9552_update_pin_input(PCA9552State *s)
190
+{
191
+ int i;
192
+
193
+ for (i = 0; i < s->nr_leds; i++) {
194
+ uint8_t input_reg = PCA9552_INPUT0 + (i / 8);
195
+ uint8_t input_shift = (i % 8);
196
+ uint8_t config = pca9552_pin_get_config(s, i);
197
+
198
+ switch (config) {
199
+ case PCA9552_LED_ON:
200
+ s->regs[input_reg] |= 1 << input_shift;
201
+ break;
202
+ case PCA9552_LED_OFF:
203
+ s->regs[input_reg] &= ~(1 << input_shift);
204
+ break;
205
+ case PCA9552_LED_PWM0:
206
+ case PCA9552_LED_PWM1:
207
+ /* TODO */
208
+ default:
209
+ break;
210
+ }
211
+ }
212
+}
213
+
214
+static uint8_t pca9552_read(PCA9552State *s, uint8_t reg)
215
+{
216
+ switch (reg) {
217
+ case PCA9552_INPUT0:
218
+ case PCA9552_INPUT1:
219
+ case PCA9552_PSC0:
220
+ case PCA9552_PWM0:
221
+ case PCA9552_PSC1:
222
+ case PCA9552_PWM1:
223
+ case PCA9552_LS0:
224
+ case PCA9552_LS1:
225
+ case PCA9552_LS2:
226
+ case PCA9552_LS3:
227
+ return s->regs[reg];
228
+ default:
229
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: unexpected read to register %d\n",
230
+ __func__, reg);
231
+ return 0xFF;
232
+ }
233
+}
234
+
235
+static void pca9552_write(PCA9552State *s, uint8_t reg, uint8_t data)
236
+{
237
+ switch (reg) {
238
+ case PCA9552_PSC0:
239
+ case PCA9552_PWM0:
240
+ case PCA9552_PSC1:
241
+ case PCA9552_PWM1:
242
+ s->regs[reg] = data;
243
+ break;
244
+
245
+ case PCA9552_LS0:
246
+ case PCA9552_LS1:
247
+ case PCA9552_LS2:
248
+ case PCA9552_LS3:
249
+ s->regs[reg] = data;
250
+ pca9552_update_pin_input(s);
251
+ break;
252
+
253
+ case PCA9552_INPUT0:
254
+ case PCA9552_INPUT1:
255
+ default:
256
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: unexpected write to register %d\n",
257
+ __func__, reg);
258
+ }
259
+}
260
+
261
+/*
262
+ * When Auto-Increment is on, the register address is incremented
263
+ * after each byte is sent to or received by the device. The index
264
+ * rollovers to 0 when the maximum register address is reached.
265
+ */
266
+static void pca9552_autoinc(PCA9552State *s)
267
+{
268
+ if (s->pointer != 0xFF && s->pointer & PCA9552_AUTOINC) {
269
+ uint8_t reg = s->pointer & 0xf;
270
+
271
+ reg = (reg + 1) % (s->max_reg + 1);
272
+ s->pointer = reg | PCA9552_AUTOINC;
273
+ }
274
+}
275
+
276
+static int pca9552_recv(I2CSlave *i2c)
277
+{
278
+ PCA9552State *s = PCA9552(i2c);
279
+ uint8_t ret;
280
+
281
+ ret = pca9552_read(s, s->pointer & 0xf);
282
+
283
+ /*
284
+ * From the Specs:
285
+ *
286
+ * Important Note: When a Read sequence is initiated and the
287
+ * AI bit is set to Logic Level 1, the Read Sequence MUST
288
+ * start by a register different from 0.
289
+ *
290
+ * I don't know what should be done in this case, so throw an
291
+ * error.
292
+ */
293
+ if (s->pointer == PCA9552_AUTOINC) {
294
+ qemu_log_mask(LOG_GUEST_ERROR,
295
+ "%s: Autoincrement read starting with register 0\n",
296
+ __func__);
297
+ }
298
+
299
+ pca9552_autoinc(s);
300
+
301
+ return ret;
302
+}
303
+
304
+static int pca9552_send(I2CSlave *i2c, uint8_t data)
305
+{
306
+ PCA9552State *s = PCA9552(i2c);
307
+
308
+ /* First byte sent by is the register address */
309
+ if (s->len == 0) {
310
+ s->pointer = data;
311
+ s->len++;
312
+ } else {
313
+ pca9552_write(s, s->pointer & 0xf, data);
314
+
315
+ pca9552_autoinc(s);
316
+ }
317
+
318
+ return 0;
319
+}
320
+
321
+static int pca9552_event(I2CSlave *i2c, enum i2c_event event)
322
+{
323
+ PCA9552State *s = PCA9552(i2c);
324
+
325
+ s->len = 0;
326
+ return 0;
327
+}
328
+
329
+static const VMStateDescription pca9552_vmstate = {
330
+ .name = "PCA9552",
331
+ .version_id = 0,
332
+ .minimum_version_id = 0,
333
+ .fields = (VMStateField[]) {
334
+ VMSTATE_UINT8(len, PCA9552State),
335
+ VMSTATE_UINT8(pointer, PCA9552State),
336
+ VMSTATE_UINT8_ARRAY(regs, PCA9552State, PCA9552_NR_REGS),
337
+ VMSTATE_I2C_SLAVE(i2c, PCA9552State),
338
+ VMSTATE_END_OF_LIST()
339
+ }
340
+};
341
+
342
+static void pca9552_reset(DeviceState *dev)
343
+{
344
+ PCA9552State *s = PCA9552(dev);
345
+
346
+ s->regs[PCA9552_PSC0] = 0xFF;
347
+ s->regs[PCA9552_PWM0] = 0x80;
348
+ s->regs[PCA9552_PSC1] = 0xFF;
349
+ s->regs[PCA9552_PWM1] = 0x80;
350
+ s->regs[PCA9552_LS0] = 0x55; /* all OFF */
351
+ s->regs[PCA9552_LS1] = 0x55;
352
+ s->regs[PCA9552_LS2] = 0x55;
353
+ s->regs[PCA9552_LS3] = 0x55;
354
+
355
+ pca9552_update_pin_input(s);
356
+
357
+ s->pointer = 0xFF;
358
+ s->len = 0;
359
+}
360
+
361
+static void pca9552_initfn(Object *obj)
362
+{
363
+ PCA9552State *s = PCA9552(obj);
364
+
365
+ /* If support for the other PCA955X devices are implemented, these
366
+ * constant values might be part of class structure describing the
367
+ * PCA955X device
368
+ */
369
+ s->max_reg = PCA9552_LS3;
370
+ s->nr_leds = 16;
371
+}
372
+
373
+static void pca9552_class_init(ObjectClass *klass, void *data)
374
+{
375
+ DeviceClass *dc = DEVICE_CLASS(klass);
376
+ I2CSlaveClass *k = I2C_SLAVE_CLASS(klass);
377
+
378
+ k->event = pca9552_event;
379
+ k->recv = pca9552_recv;
380
+ k->send = pca9552_send;
381
+ dc->reset = pca9552_reset;
382
+ dc->vmsd = &pca9552_vmstate;
383
+}
384
+
385
+static const TypeInfo pca9552_info = {
386
+ .name = TYPE_PCA9552,
387
+ .parent = TYPE_I2C_SLAVE,
388
+ .instance_init = pca9552_initfn,
389
+ .instance_size = sizeof(PCA9552State),
390
+ .class_init = pca9552_class_init,
391
+};
392
+
393
+static void pca9552_register_types(void)
394
+{
395
+ type_register_static(&pca9552_info);
396
+}
397
+
398
+type_init(pca9552_register_types)
399
diff --git a/tests/pca9552-test.c b/tests/pca9552-test.c
400
new file mode 100644
401
index XXXXXXX..XXXXXXX
402
--- /dev/null
403
+++ b/tests/pca9552-test.c
404
@@ -XXX,XX +XXX,XX @@
405
+/*
406
+ * QTest testcase for the PCA9552 LED blinker
407
+ *
408
+ * Copyright (c) 2017-2018, IBM Corporation.
409
+ *
410
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
411
+ * See the COPYING file in the top-level directory.
412
+ */
413
+
414
+#include "qemu/osdep.h"
415
+
416
+#include "libqtest.h"
417
+#include "libqos/i2c.h"
418
+#include "hw/misc/pca9552_regs.h"
419
+
420
+#define PCA9552_TEST_ID "pca9552-test"
421
+#define PCA9552_TEST_ADDR 0x60
422
+
423
+static I2CAdapter *i2c;
424
+
425
+static uint8_t pca9552_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
426
+{
427
+ uint8_t resp[1];
428
+ i2c_send(i2c, addr, &reg, 1);
429
+ i2c_recv(i2c, addr, resp, 1);
430
+ return resp[0];
431
+}
432
+
433
+static void pca9552_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
434
+ uint8_t value)
435
+{
436
+ uint8_t cmd[2];
437
+ uint8_t resp[1];
438
+
439
+ cmd[0] = reg;
440
+ cmd[1] = value;
441
+ i2c_send(i2c, addr, cmd, 2);
442
+ i2c_recv(i2c, addr, resp, 1);
443
+ g_assert_cmphex(resp[0], ==, cmd[1]);
444
+}
445
+
446
+static void receive_autoinc(void)
447
+{
448
+ uint8_t resp;
449
+ uint8_t reg = PCA9552_LS0 | PCA9552_AUTOINC;
450
+
451
+ i2c_send(i2c, PCA9552_TEST_ADDR, &reg, 1);
452
+
453
+ /* PCA9552_LS0 */
454
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
455
+ g_assert_cmphex(resp, ==, 0x54);
456
+
457
+ /* PCA9552_LS1 */
458
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
459
+ g_assert_cmphex(resp, ==, 0x55);
460
+
461
+ /* PCA9552_LS2 */
462
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
463
+ g_assert_cmphex(resp, ==, 0x55);
464
+
465
+ /* PCA9552_LS3 */
466
+ i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
467
+ g_assert_cmphex(resp, ==, 0x54);
468
+}
469
+
470
+static void send_and_receive(void)
471
+{
472
+ uint8_t value;
473
+
474
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
475
+ g_assert_cmphex(value, ==, 0x55);
476
+
477
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
478
+ g_assert_cmphex(value, ==, 0x0);
479
+
480
+ /* Switch on LED 0 */
481
+ pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0, 0x54);
482
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
483
+ g_assert_cmphex(value, ==, 0x54);
484
+
485
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
486
+ g_assert_cmphex(value, ==, 0x01);
487
+
488
+ /* Switch on LED 12 */
489
+ pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3, 0x54);
490
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3);
491
+ g_assert_cmphex(value, ==, 0x54);
492
+
493
+ value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT1);
494
+ g_assert_cmphex(value, ==, 0x10);
495
+}
496
+
497
+int main(int argc, char **argv)
498
+{
499
+ QTestState *s = NULL;
500
+ int ret;
501
+
502
+ g_test_init(&argc, &argv, NULL);
503
+
504
+ s = qtest_start("-machine n800 "
505
+ "-device pca9552,bus=i2c-bus.0,id=" PCA9552_TEST_ID
506
+ ",address=0x60");
507
+ i2c = omap_i2c_create(s, OMAP2_I2C_1_BASE);
508
+
509
+ qtest_add_func("/pca9552/tx-rx", send_and_receive);
510
+ qtest_add_func("/pca9552/rx-autoinc", receive_autoinc);
511
+
512
+ ret = g_test_run();
513
+
514
+ if (s) {
515
+ qtest_quit(s);
516
+ }
517
+ g_free(i2c);
518
+
519
+ return ret;
520
+}
521
diff --git a/tests/tmp105-test.c b/tests/tmp105-test.c
522
index XXXXXXX..XXXXXXX 100644
523
--- a/tests/tmp105-test.c
524
+++ b/tests/tmp105-test.c
525
@@ -XXX,XX +XXX,XX @@
526
#include "qapi/qmp/qdict.h"
527
#include "hw/misc/tmp105_regs.h"
528
529
-#define OMAP2_I2C_1_BASE 0x48070000
530
-
531
#define TMP105_TEST_ID "tmp105-test"
532
#define TMP105_TEST_ADDR 0x49
533
534
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
535
index XXXXXXX..XXXXXXX 100644
536
--- a/default-configs/arm-softmmu.mak
537
+++ b/default-configs/arm-softmmu.mak
538
@@ -XXX,XX +XXX,XX @@ CONFIG_TSC2005=y
539
CONFIG_LM832X=y
540
CONFIG_TMP105=y
541
CONFIG_TMP421=y
542
+CONFIG_PCA9552=y
543
CONFIG_STELLARIS=y
544
CONFIG_STELLARIS_INPUT=y
545
CONFIG_STELLARIS_ENET=y
28
--
546
--
29
2.17.1
547
2.17.1
30
548
31
549
diff view generated by jsdifflib
New patch
1
From: Cédric Le Goater <clg@kaod.org>
1
2
3
The pca9552 LED blinkers on the Witherspoon machine are used for leds
4
but also as GPIOs to control fans and GPUs.
5
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180530064049.27976-8-clg@kaod.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
hw/arm/aspeed.c | 4 ++++
13
1 file changed, 4 insertions(+)
14
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed.c
18
+++ b/hw/arm/aspeed.c
19
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
20
AspeedSoCState *soc = &bmc->soc;
21
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
22
23
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 3), "pca9552", 0x60);
24
+
25
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 4), "tmp423", 0x4c);
26
i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 5), "tmp423", 0x4c);
27
28
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedBoardState *bmc)
29
30
smbus_eeprom_init_one(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), 0x51,
31
eeprom_buf);
32
+ i2c_create_slave(aspeed_i2c_get_bus(DEVICE(&soc->i2c), 11), "pca9552",
33
+ 0x60);
34
}
35
36
static void witherspoon_bmc_init(MachineState *machine)
37
--
38
2.17.1
39
40
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Cédric Le Goater <clg@kaod.org>
2
add MemTxAttrs as an argument to flatview_translate(); all its
3
callers now have attrs available.
4
2
3
The maximum frame size includes the CRC and depends if a VLAN tag is
4
inserted or not. Adjust the frame size limit in the transmit handler
5
using on the FTGMAC100State buffer size and in the receive handler use
6
the packet protocol.
7
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Message-id: 20180530061711.23673-2-clg@kaod.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20180521140402.23318-11-peter.maydell@linaro.org
9
---
12
---
10
include/exec/memory.h | 7 ++++---
13
include/hw/net/ftgmac100.h | 7 ++++++-
11
exec.c | 17 +++++++++--------
14
hw/net/ftgmac100.c | 23 ++++++++++++-----------
12
2 files changed, 13 insertions(+), 11 deletions(-)
15
2 files changed, 18 insertions(+), 12 deletions(-)
13
16
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
17
diff --git a/include/hw/net/ftgmac100.h b/include/hw/net/ftgmac100.h
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
19
--- a/include/hw/net/ftgmac100.h
17
+++ b/include/exec/memory.h
20
+++ b/include/hw/net/ftgmac100.h
18
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
21
@@ -XXX,XX +XXX,XX @@
22
#include "hw/sysbus.h"
23
#include "net/net.h"
24
25
+/*
26
+ * Max frame size for the receiving buffer
27
+ */
28
+#define FTGMAC100_MAX_FRAME_SIZE 9220
29
+
30
typedef struct FTGMAC100State {
31
/*< private >*/
32
SysBusDevice parent_obj;
33
@@ -XXX,XX +XXX,XX @@ typedef struct FTGMAC100State {
34
qemu_irq irq;
35
MemoryRegion iomem;
36
37
- uint8_t *frame;
38
+ uint8_t frame[FTGMAC100_MAX_FRAME_SIZE];
39
40
uint32_t irq_state;
41
uint32_t isr;
42
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/net/ftgmac100.c
45
+++ b/hw/net/ftgmac100.c
46
@@ -XXX,XX +XXX,XX @@ typedef struct {
47
/*
48
* Max frame size for the receiving buffer
19
*/
49
*/
20
MemoryRegion *flatview_translate(FlatView *fv,
50
-#define FTGMAC100_MAX_FRAME_SIZE 10240
21
hwaddr addr, hwaddr *xlat,
51
+#define FTGMAC100_MAX_FRAME_SIZE 9220
22
- hwaddr *len, bool is_write);
52
23
+ hwaddr *len, bool is_write,
53
/* Limits depending on the type of the frame
24
+ MemTxAttrs attrs);
54
*
25
55
* 9216 for Jumbo frames (+ 4 for VLAN)
26
static inline MemoryRegion *address_space_translate(AddressSpace *as,
56
* 1518 for other frames (+ 4 for VLAN)
27
hwaddr addr, hwaddr *xlat,
57
*/
28
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
58
-static int ftgmac100_max_frame_size(FTGMAC100State *s)
29
MemTxAttrs attrs)
59
+static int ftgmac100_max_frame_size(FTGMAC100State *s, uint16_t proto)
30
{
60
{
31
return flatview_translate(address_space_to_flatview(as),
61
- return (s->maccr & FTGMAC100_MACCR_JUMBO_LF ? 9216 : 1518) + 4;
32
- addr, xlat, len, is_write);
62
+ int max = (s->maccr & FTGMAC100_MACCR_JUMBO_LF ? 9216 : 1518);
33
+ addr, xlat, len, is_write, attrs);
63
+
64
+ return max + (proto == ETH_P_VLAN ? 4 : 0);
34
}
65
}
35
66
36
/* address_space_access_valid: check for validity of accessing an address
67
static void ftgmac100_update_irq(FTGMAC100State *s)
37
@@ -XXX,XX +XXX,XX @@ MemTxResult address_space_read(AddressSpace *as, hwaddr addr,
68
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
38
rcu_read_lock();
69
uint8_t *ptr = s->frame;
39
fv = address_space_to_flatview(as);
70
uint32_t addr = tx_descriptor;
40
l = len;
71
uint32_t flags = 0;
41
- mr = flatview_translate(fv, addr, &addr1, &l, false);
72
- int max_frame_size = ftgmac100_max_frame_size(s);
42
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
73
43
if (len == l && memory_access_is_direct(mr, false)) {
74
while (1) {
44
ptr = qemu_map_ram_ptr(mr->ram_block, addr1);
75
FTGMAC100Desc bd;
45
memcpy(buf, ptr, len);
76
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
46
diff --git a/exec.c b/exec.c
77
flags = bd.des1;
47
index XXXXXXX..XXXXXXX 100644
48
--- a/exec.c
49
+++ b/exec.c
50
@@ -XXX,XX +XXX,XX @@ iotlb_fail:
51
52
/* Called from RCU critical section */
53
MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
54
- hwaddr *plen, bool is_write)
55
+ hwaddr *plen, bool is_write,
56
+ MemTxAttrs attrs)
57
{
58
MemoryRegion *mr;
59
MemoryRegionSection section;
60
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write_continue(FlatView *fv, hwaddr addr,
61
}
78
}
62
79
63
l = len;
80
- len = bd.des0 & 0x3FFF;
64
- mr = flatview_translate(fv, addr, &addr1, &l, true);
81
- if (frame_size + len > max_frame_size) {
65
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
82
+ len = FTGMAC100_TXDES0_TXBUF_SIZE(bd.des0);
83
+ if (frame_size + len > sizeof(s->frame)) {
84
qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d bytes\n",
85
__func__, len);
86
- len = max_frame_size - frame_size;
87
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
88
+ len = sizeof(s->frame) - frame_size;
89
}
90
91
if (dma_memory_read(&address_space_memory, bd.des3, ptr, len)) {
92
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
93
uint32_t buf_len;
94
size_t size = len;
95
uint32_t first = FTGMAC100_RXDES0_FRS;
96
- int max_frame_size = ftgmac100_max_frame_size(s);
97
+ uint16_t proto = be16_to_cpu(PKT_GET_ETH_HDR(buf)->h_proto);
98
+ int max_frame_size = ftgmac100_max_frame_size(s, proto);
99
100
if ((s->maccr & (FTGMAC100_MACCR_RXDMA_EN | FTGMAC100_MACCR_RXMAC_EN))
101
!= (FTGMAC100_MACCR_RXDMA_EN | FTGMAC100_MACCR_RXMAC_EN)) {
102
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
103
104
/* Huge frames are truncated. */
105
if (size > max_frame_size) {
106
- size = max_frame_size;
107
qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %zd bytes\n",
108
__func__, size);
109
+ size = max_frame_size;
110
flags |= FTGMAC100_RXDES0_FTL;
66
}
111
}
67
112
68
return result;
113
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_realize(DeviceState *dev, Error **errp)
69
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
114
object_get_typename(OBJECT(dev)), DEVICE(dev)->id,
70
MemTxResult result = MEMTX_OK;
115
s);
71
116
qemu_format_nic_info_str(qemu_get_queue(s->nic), s->conf.macaddr.a);
72
l = len;
117
-
73
- mr = flatview_translate(fv, addr, &addr1, &l, true);
118
- s->frame = g_malloc(FTGMAC100_MAX_FRAME_SIZE);
74
+ mr = flatview_translate(fv, addr, &addr1, &l, true, attrs);
75
result = flatview_write_continue(fv, addr, attrs, buf, len,
76
addr1, l, mr);
77
78
@@ -XXX,XX +XXX,XX @@ MemTxResult flatview_read_continue(FlatView *fv, hwaddr addr,
79
}
80
81
l = len;
82
- mr = flatview_translate(fv, addr, &addr1, &l, false);
83
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
84
}
85
86
return result;
87
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = flatview_translate(fv, addr, &addr1, &l, false);
92
+ mr = flatview_translate(fv, addr, &addr1, &l, false, attrs);
93
return flatview_read_continue(fv, addr, attrs, buf, len,
94
addr1, l, mr);
95
}
119
}
96
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
120
97
121
static const VMStateDescription vmstate_ftgmac100 = {
98
while (len > 0) {
99
l = len;
100
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
101
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
102
if (!memory_access_is_direct(mr, is_write)) {
103
l = memory_access_size(mr, l, addr);
104
if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
105
@@ -XXX,XX +XXX,XX @@ flatview_extend_translation(FlatView *fv, hwaddr addr,
106
107
len = target_len;
108
this_mr = flatview_translate(fv, addr, &xlat,
109
- &len, is_write);
110
+ &len, is_write, attrs);
111
if (this_mr != mr || xlat != base + done) {
112
return done;
113
}
114
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
115
l = len;
116
rcu_read_lock();
117
fv = address_space_to_flatview(as);
118
- mr = flatview_translate(fv, addr, &xlat, &l, is_write);
119
+ mr = flatview_translate(fv, addr, &xlat, &l, is_write, attrs);
120
121
if (!memory_access_is_direct(mr, is_write)) {
122
if (atomic_xchg(&bounce.in_use, true)) {
123
--
122
--
124
2.17.1
123
2.17.1
125
124
126
125
diff view generated by jsdifflib
New patch
1
From: Cédric Le Goater <clg@kaod.org>
1
2
3
The ftgmac100 NIC supports VLAN tag insertion and the MAC engine also
4
has a control to remove VLAN tags from received packets.
5
6
The VLAN control bits and VLAN tag information are contained in the
7
second word of the transmit and receive descriptors. The Insert VLAN
8
bit and the VLAN Tag available bit are only valid in the first segment
9
of the packet.
10
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-id: 20180530061711.23673-3-clg@kaod.org
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/net/ftgmac100.c | 31 ++++++++++++++++++++++++++++++-
17
1 file changed, 30 insertions(+), 1 deletion(-)
18
19
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/net/ftgmac100.c
22
+++ b/hw/net/ftgmac100.c
23
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
24
break;
25
}
26
27
+ /* Check for VLAN */
28
+ if (bd.des0 & FTGMAC100_TXDES0_FTS &&
29
+ bd.des1 & FTGMAC100_TXDES1_INS_VLANTAG &&
30
+ be16_to_cpu(PKT_GET_ETH_HDR(ptr)->h_proto) != ETH_P_VLAN) {
31
+ if (frame_size + len + 4 > sizeof(s->frame)) {
32
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d bytes\n",
33
+ __func__, len);
34
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
35
+ len = sizeof(s->frame) - frame_size - 4;
36
+ }
37
+ memmove(ptr + 16, ptr + 12, len - 12);
38
+ stw_be_p(ptr + 12, ETH_P_VLAN);
39
+ stw_be_p(ptr + 14, bd.des1);
40
+ len += 4;
41
+ }
42
+
43
ptr += len;
44
frame_size += len;
45
if (bd.des0 & FTGMAC100_TXDES0_LTS) {
46
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
47
buf_len += size - 4;
48
}
49
buf_addr = bd.des3;
50
- dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
51
+ if (first && proto == ETH_P_VLAN && buf_len >= 18) {
52
+ bd.des1 = lduw_be_p(buf + 14) | FTGMAC100_RXDES1_VLANTAG_AVAIL;
53
+
54
+ if (s->maccr & FTGMAC100_MACCR_RM_VLAN) {
55
+ dma_memory_write(&address_space_memory, buf_addr, buf, 12);
56
+ dma_memory_write(&address_space_memory, buf_addr + 12, buf + 16,
57
+ buf_len - 16);
58
+ } else {
59
+ dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
60
+ }
61
+ } else {
62
+ bd.des1 = 0;
63
+ dma_memory_write(&address_space_memory, buf_addr, buf, buf_len);
64
+ }
65
buf += buf_len;
66
if (size < 4) {
67
dma_memory_write(&address_space_memory, buf_addr + buf_len,
68
--
69
2.17.1
70
71
diff view generated by jsdifflib
New patch
1
From: Cédric Le Goater <clg@kaod.org>
1
2
3
Based on the multicast hash calculation of the FTGMAC100 Linux driver.
4
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Message-id: 20180530061711.23673-4-clg@kaod.org
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
hw/net/ftgmac100.c | 4 ++--
11
1 file changed, 2 insertions(+), 2 deletions(-)
12
13
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/net/ftgmac100.c
16
+++ b/hw/net/ftgmac100.c
17
@@ -XXX,XX +XXX,XX @@ static int ftgmac100_filter(FTGMAC100State *s, const uint8_t *buf, size_t len)
18
return 0;
19
}
20
21
- /* TODO: this does not seem to work for ftgmac100 */
22
- mcast_idx = net_crc32(buf, ETH_ALEN) >> 26;
23
+ mcast_idx = net_crc32_le(buf, ETH_ALEN);
24
+ mcast_idx = (~(mcast_idx >> 2)) & 0x3f;
25
if (!(s->math[mcast_idx / 32] & (1 << (mcast_idx % 32)))) {
26
return 0;
27
}
28
--
29
2.17.1
30
31
diff view generated by jsdifflib
1
From: Igor Mammedov <imammedo@redhat.com>
1
From: Cédric Le Goater <clg@kaod.org>
2
2
3
When QEMU is started with following CLI
3
This is a ethernet wire limitation not needed in emulation. It breaks
4
-machine virt,gic-version=3,accel=kvm -cpu host -bios AAVMF_CODE.fd
4
U-Boot n/w stack also.
5
it crashes with abort at
6
accel/kvm/kvm-all.c:2164:
7
KVM_SET_DEVICE_ATTR failed: Group 6 attr 0x000000000000c665: Invalid argument
8
5
9
Which is caused by implicit dependency of kvm_arm_gicv3_reset() on
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
arm_gicv3_icc_reset() where the later is called by CPU reset
7
Message-id: 20180530061711.23673-5-clg@kaod.org
11
reset callback.
12
13
However commit:
14
3b77f6c arm/boot: split load_dtb() from arm_load_kernel()
15
broke CPU reset callback registration in case
16
17
arm_load_kernel()
18
...
19
if (!info->kernel_filename || info->firmware_loaded)
20
21
branch is taken, i.e. it's sufficient to provide a firmware
22
or do not provide kernel on CLI to skip cpu reset callback
23
registration, where before offending commit the callback
24
has been registered unconditionally.
25
26
Fix it by registering the callback right at the beginning of
27
arm_load_kernel() unconditionally instead of doing it at the end.
28
29
NOTE:
30
we probably should eliminate that dependency anyways as well as
31
separate arch CPU reset parts from arm_load_kernel() into CPU
32
itself, but that refactoring that I probably would have to do
33
anyways later for CPU hotplug to work.
34
35
Reported-by: Auger Eric <eric.auger@redhat.com>
36
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
37
Reviewed-by: Eric Auger <eric.auger@redhat.com>
38
Tested-by: Eric Auger <eric.auger@redhat.com>
39
Message-id: 1527070950-208350-1-git-send-email-imammedo@redhat.com
40
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
41
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
42
---
10
---
43
hw/arm/boot.c | 18 +++++++++---------
11
hw/net/ftgmac100.c | 6 ------
44
1 file changed, 9 insertions(+), 9 deletions(-)
12
1 file changed, 6 deletions(-)
45
13
46
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
14
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
47
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/arm/boot.c
16
--- a/hw/net/ftgmac100.c
49
+++ b/hw/arm/boot.c
17
+++ b/hw/net/ftgmac100.c
50
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
18
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
51
static const ARMInsnFixup *primary_loader;
19
return size;
52
AddressSpace *as = arm_boot_address_space(cpu, info);
53
54
+ /* CPU objects (unlike devices) are not automatically reset on system
55
+ * reset, so we must always register a handler to do so. If we're
56
+ * actually loading a kernel, the handler is also responsible for
57
+ * arranging that we start it correctly.
58
+ */
59
+ for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
60
+ qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
61
+ }
62
+
63
/* The board code is not supposed to set secure_board_setup unless
64
* running its code in secure mode is actually possible, and KVM
65
* doesn't support secure.
66
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
67
ARM_CPU(cs)->env.boot_info = info;
68
}
20
}
69
21
70
- /* CPU objects (unlike devices) are not automatically reset on system
22
- if (size < 64 && !(s->maccr & FTGMAC100_MACCR_RX_RUNT)) {
71
- * reset, so we must always register a handler to do so. If we're
23
- qemu_log_mask(LOG_GUEST_ERROR, "%s: dropped runt frame of %zd bytes\n",
72
- * actually loading a kernel, the handler is also responsible for
24
- __func__, size);
73
- * arranging that we start it correctly.
25
- return size;
74
- */
75
- for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
76
- qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
77
- }
26
- }
78
-
27
-
79
if (!info->skip_dtb_autoload && have_dtb(info)) {
28
if (!ftgmac100_filter(s, buf, size)) {
80
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as) < 0) {
29
return size;
81
exit(1);
30
}
82
--
31
--
83
2.17.1
32
2.17.1
84
33
85
34
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Thomas Huth <thuth@redhat.com>
2
add MemTxAttrs as an argument to flatview_access_valid().
3
Its callers now all have an attrs value to hand, so we can
4
correct our earlier temporary use of MEMTXATTRS_UNSPECIFIED.
5
2
3
It has been marked as deprecated since QEMU v2.11, so it is time to
4
remove this now. The xlnx-zcu102 machine is very much the same and
5
can be used as a replacement instead.
6
7
Signed-off-by: Thomas Huth <thuth@redhat.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-10-peter.maydell@linaro.org
10
---
10
---
11
exec.c | 12 +++++-------
11
hw/arm/xlnx-zcu102.c | 62 ++------------------------------------------
12
1 file changed, 5 insertions(+), 7 deletions(-)
12
qemu-doc.texi | 5 ----
13
2 files changed, 2 insertions(+), 65 deletions(-)
13
14
14
diff --git a/exec.c b/exec.c
15
diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
17
--- a/hw/arm/xlnx-zcu102.c
17
+++ b/exec.c
18
+++ b/hw/arm/xlnx-zcu102.c
18
@@ -XXX,XX +XXX,XX @@ static MemTxResult flatview_read(FlatView *fv, hwaddr addr,
19
@@ -XXX,XX +XXX,XX @@ typedef struct XlnxZCU102 {
19
static MemTxResult flatview_write(FlatView *fv, hwaddr addr, MemTxAttrs attrs,
20
#define ZCU102_MACHINE(obj) \
20
const uint8_t *buf, int len);
21
OBJECT_CHECK(XlnxZCU102, (obj), TYPE_ZCU102_MACHINE)
21
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
22
22
- bool is_write);
23
-#define TYPE_EP108_MACHINE MACHINE_TYPE_NAME("xlnx-ep108")
23
+ bool is_write, MemTxAttrs attrs);
24
-#define EP108_MACHINE(obj) \
24
25
- OBJECT_CHECK(XlnxZCU102, (obj), TYPE_EP108_MACHINE)
25
static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
26
-
26
unsigned len, MemTxAttrs attrs)
27
static struct arm_boot_info xlnx_zcu102_binfo;
27
@@ -XXX,XX +XXX,XX @@ static bool subpage_accepts(void *opaque, hwaddr addr,
28
28
#endif
29
static bool zcu102_get_secure(Object *obj, Error **errp)
29
30
@@ -XXX,XX +XXX,XX @@ static void zcu102_set_virt(Object *obj, bool value, Error **errp)
30
return flatview_access_valid(subpage->fv, addr + subpage->base,
31
s->virt = value;
31
- len, is_write);
32
+ len, is_write, attrs);
33
}
32
}
34
33
35
static const MemoryRegionOps subpage_ops = {
34
-static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
36
@@ -XXX,XX +XXX,XX @@ static void cpu_notify_map_clients(void)
35
+static void xlnx_zcu102_init(MachineState *machine)
36
{
37
+ XlnxZCU102 *s = ZCU102_MACHINE(machine);
38
int i;
39
uint64_t ram_size = machine->ram_size;
40
41
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine)
42
arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_zcu102_binfo);
37
}
43
}
38
44
39
static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
45
-static void xlnx_ep108_init(MachineState *machine)
40
- bool is_write)
46
-{
41
+ bool is_write, MemTxAttrs attrs)
47
- XlnxZCU102 *s = EP108_MACHINE(machine);
48
-
49
- if (!qtest_enabled()) {
50
- info_report("The Xilinx EP108 machine is deprecated, please use the "
51
- "ZCU102 machine (which has the same features) instead.");
52
- }
53
-
54
- xlnx_zynqmp_init(s, machine);
55
-}
56
-
57
-static void xlnx_ep108_machine_instance_init(Object *obj)
58
-{
59
- XlnxZCU102 *s = EP108_MACHINE(obj);
60
-
61
- /* EP108, we don't support setting secure or virt */
62
- s->secure = false;
63
- s->virt = false;
64
-}
65
-
66
-static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data)
67
-{
68
- MachineClass *mc = MACHINE_CLASS(oc);
69
-
70
- mc->desc = "Xilinx ZynqMP EP108 board (Deprecated, please use xlnx-zcu102)";
71
- mc->init = xlnx_ep108_init;
72
- mc->block_default_type = IF_IDE;
73
- mc->units_per_default_bus = 1;
74
- mc->ignore_memory_transaction_failures = true;
75
- mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS;
76
- mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS;
77
-}
78
-
79
-static const TypeInfo xlnx_ep108_machine_init_typeinfo = {
80
- .name = MACHINE_TYPE_NAME("xlnx-ep108"),
81
- .parent = TYPE_MACHINE,
82
- .class_init = xlnx_ep108_machine_class_init,
83
- .instance_init = xlnx_ep108_machine_instance_init,
84
- .instance_size = sizeof(XlnxZCU102),
85
-};
86
-
87
-static void xlnx_ep108_machine_init_register_types(void)
88
-{
89
- type_register_static(&xlnx_ep108_machine_init_typeinfo);
90
-}
91
-
92
-static void xlnx_zcu102_init(MachineState *machine)
93
-{
94
- XlnxZCU102 *s = ZCU102_MACHINE(machine);
95
-
96
- xlnx_zynqmp_init(s, machine);
97
-}
98
-
99
static void xlnx_zcu102_machine_instance_init(Object *obj)
42
{
100
{
43
MemoryRegion *mr;
101
XlnxZCU102 *s = ZCU102_MACHINE(obj);
44
hwaddr l, xlat;
102
@@ -XXX,XX +XXX,XX @@ static void xlnx_zcu102_machine_init_register_types(void)
45
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
46
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
47
if (!memory_access_is_direct(mr, is_write)) {
48
l = memory_access_size(mr, l, addr);
49
- /* When our callers all have attrs we'll pass them through here */
50
- if (!memory_region_access_valid(mr, xlat, l, is_write,
51
- MEMTXATTRS_UNSPECIFIED)) {
52
+ if (!memory_region_access_valid(mr, xlat, l, is_write, attrs)) {
53
return false;
54
}
55
}
56
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
57
58
rcu_read_lock();
59
fv = address_space_to_flatview(as);
60
- result = flatview_access_valid(fv, addr, len, is_write);
61
+ result = flatview_access_valid(fv, addr, len, is_write, attrs);
62
rcu_read_unlock();
63
return result;
64
}
103
}
104
105
type_init(xlnx_zcu102_machine_init_register_types)
106
-type_init(xlnx_ep108_machine_init_register_types)
107
diff --git a/qemu-doc.texi b/qemu-doc.texi
108
index XXXXXXX..XXXXXXX 100644
109
--- a/qemu-doc.texi
110
+++ b/qemu-doc.texi
111
@@ -XXX,XX +XXX,XX @@ support page sizes < 4096 any longer.
112
113
@section System emulator machines
114
115
-@subsection Xilinx EP108 (since 2.11.0)
116
-
117
-The ``xlnx-ep108'' machine has been replaced by the ``xlnx-zcu102'' machine.
118
-The ``xlnx-zcu102'' machine has the same features and capabilites in QEMU.
119
-
120
@section Block device options
121
122
@subsection "backing": "" (since 2.12.0)
65
--
123
--
66
2.17.1
124
2.17.1
67
125
68
126
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
acpi_data_push uses g_array_set_size to resize the memory size. If there
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
is no enough contiguous memory, the address will be changed. So previous
4
Message-id: 20180606191801.6331-1-f4bug@amsat.org
5
pointer could not be used any more. It must update the pointer and use
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
the new one.
7
8
Also, previous codes wrongly use le32 conversion of iort->node_offset
9
for subsequent computations that will result incorrect value if host is
10
not litlle endian. So use the non-converted one instead.
11
12
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
13
Reviewed-by: Eric Auger <eric.auger@redhat.com>
14
Message-id: 1527663951-14552-1-git-send-email-zhaoshenglong@huawei.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
7
---
17
hw/arm/virt-acpi-build.c | 20 +++++++++++++++-----
8
Makefile.objs | 1 +
18
1 file changed, 15 insertions(+), 5 deletions(-)
9
hw/i2c/core.c | 25 ++++++++++++++++++-------
10
hw/i2c/trace-events | 7 +++++++
11
3 files changed, 26 insertions(+), 7 deletions(-)
12
create mode 100644 hw/i2c/trace-events
19
13
20
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
14
diff --git a/Makefile.objs b/Makefile.objs
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/virt-acpi-build.c
16
--- a/Makefile.objs
23
+++ b/hw/arm/virt-acpi-build.c
17
+++ b/Makefile.objs
24
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
18
@@ -XXX,XX +XXX,XX @@ trace-events-subdirs += hw/char
25
AcpiIortItsGroup *its;
19
trace-events-subdirs += hw/display
26
AcpiIortTable *iort;
20
trace-events-subdirs += hw/dma
27
AcpiIortSmmu3 *smmu;
21
trace-events-subdirs += hw/hppa
28
- size_t node_size, iort_length, smmu_offset = 0;
22
+trace-events-subdirs += hw/i2c
29
+ size_t node_size, iort_node_offset, iort_length, smmu_offset = 0;
23
trace-events-subdirs += hw/i386
30
AcpiIortRC *rc;
24
trace-events-subdirs += hw/i386/xen
31
25
trace-events-subdirs += hw/ide
32
iort = acpi_data_push(table_data, sizeof(*iort));
26
diff --git a/hw/i2c/core.c b/hw/i2c/core.c
33
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
27
index XXXXXXX..XXXXXXX 100644
34
28
--- a/hw/i2c/core.c
35
iort_length = sizeof(*iort);
29
+++ b/hw/i2c/core.c
36
iort->node_count = cpu_to_le32(nb_nodes);
30
@@ -XXX,XX +XXX,XX @@
37
- iort->node_offset = cpu_to_le32(sizeof(*iort));
31
38
+ /*
32
#include "qemu/osdep.h"
39
+ * Use a copy in case table_data->data moves during acpi_data_push
33
#include "hw/i2c/i2c.h"
40
+ * operations.
34
+#include "trace.h"
41
+ */
35
42
+ iort_node_offset = sizeof(*iort);
36
#define I2C_BROADCAST 0x00
43
+ iort->node_offset = cpu_to_le32(iort_node_offset);
37
44
38
@@ -XXX,XX +XXX,XX @@ int i2c_start_transfer(I2CBus *bus, uint8_t address, int recv)
45
/* ITS group node */
46
node_size = sizeof(*its) + sizeof(uint32_t);
47
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
48
int irq = vms->irqmap[VIRT_SMMU];
49
50
/* SMMUv3 node */
51
- smmu_offset = iort->node_offset + node_size;
52
+ smmu_offset = iort_node_offset + node_size;
53
node_size = sizeof(*smmu) + sizeof(*idmap);
54
iort_length += node_size;
55
smmu = acpi_data_push(table_data, node_size);
56
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
57
idmap->id_count = cpu_to_le32(0xFFFF);
58
idmap->output_base = 0;
59
/* output IORT node is the ITS group node (the first node) */
60
- idmap->output_reference = cpu_to_le32(iort->node_offset);
61
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
62
}
39
}
63
40
64
/* Root Complex Node */
41
QLIST_FOREACH(node, &bus->current_devs, next) {
65
@@ -XXX,XX +XXX,XX @@ build_iort(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
42
+ I2CSlave *s = node->elt;
66
idmap->output_reference = cpu_to_le32(smmu_offset);
43
int rv;
67
} else {
44
68
/* output IORT node is the ITS group node (the first node) */
45
- sc = I2C_SLAVE_GET_CLASS(node->elt);
69
- idmap->output_reference = cpu_to_le32(iort->node_offset);
46
+ sc = I2C_SLAVE_GET_CLASS(s);
70
+ idmap->output_reference = cpu_to_le32(iort_node_offset);
47
/* If the bus is already busy, assume this is a repeated
48
start condition. */
49
50
if (sc->event) {
51
- rv = sc->event(node->elt, recv ? I2C_START_RECV : I2C_START_SEND);
52
+ trace_i2c_event("start", s->address);
53
+ rv = sc->event(s, recv ? I2C_START_RECV : I2C_START_SEND);
54
if (rv && !bus->broadcast) {
55
if (bus_scanned) {
56
/* First call, terminate the transfer. */
57
@@ -XXX,XX +XXX,XX @@ void i2c_end_transfer(I2CBus *bus)
58
I2CNode *node, *next;
59
60
QLIST_FOREACH_SAFE(node, &bus->current_devs, next, next) {
61
- sc = I2C_SLAVE_GET_CLASS(node->elt);
62
+ I2CSlave *s = node->elt;
63
+ sc = I2C_SLAVE_GET_CLASS(s);
64
if (sc->event) {
65
- sc->event(node->elt, I2C_FINISH);
66
+ trace_i2c_event("finish", s->address);
67
+ sc->event(s, I2C_FINISH);
68
}
69
QLIST_REMOVE(node, next);
70
g_free(node);
71
@@ -XXX,XX +XXX,XX @@ void i2c_end_transfer(I2CBus *bus)
72
int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
73
{
74
I2CSlaveClass *sc;
75
+ I2CSlave *s;
76
I2CNode *node;
77
int ret = 0;
78
79
if (send) {
80
QLIST_FOREACH(node, &bus->current_devs, next) {
81
- sc = I2C_SLAVE_GET_CLASS(node->elt);
82
+ s = node->elt;
83
+ sc = I2C_SLAVE_GET_CLASS(s);
84
if (sc->send) {
85
- ret = ret || sc->send(node->elt, *data);
86
+ trace_i2c_send(s->address, *data);
87
+ ret = ret || sc->send(s, *data);
88
} else {
89
ret = -1;
90
}
91
@@ -XXX,XX +XXX,XX @@ int i2c_send_recv(I2CBus *bus, uint8_t *data, bool send)
92
93
sc = I2C_SLAVE_GET_CLASS(QLIST_FIRST(&bus->current_devs)->elt);
94
if (sc->recv) {
95
- ret = sc->recv(QLIST_FIRST(&bus->current_devs)->elt);
96
+ s = QLIST_FIRST(&bus->current_devs)->elt;
97
+ ret = sc->recv(s);
98
+ trace_i2c_recv(s->address, ret);
99
if (ret < 0) {
100
return ret;
101
} else {
102
@@ -XXX,XX +XXX,XX @@ void i2c_nack(I2CBus *bus)
103
QLIST_FOREACH(node, &bus->current_devs, next) {
104
sc = I2C_SLAVE_GET_CLASS(node->elt);
105
if (sc->event) {
106
+ trace_i2c_event("nack", node->elt->address);
107
sc->event(node->elt, I2C_NACK);
108
}
71
}
109
}
72
110
diff --git a/hw/i2c/trace-events b/hw/i2c/trace-events
73
+ /*
111
new file mode 100644
74
+ * Update the pointer address in case table_data->data moves during above
112
index XXXXXXX..XXXXXXX
75
+ * acpi_data_push operations.
113
--- /dev/null
76
+ */
114
+++ b/hw/i2c/trace-events
77
+ iort = (AcpiIortTable *)(table_data->data + iort_start);
115
@@ -XXX,XX +XXX,XX @@
78
iort->length = cpu_to_le32(iort_length);
116
+# See docs/devel/tracing.txt for syntax documentation.
79
117
+
80
build_header(linker, table_data, (void *)(table_data->data + iort_start),
118
+# hw/i2c/core.c
119
+
120
+i2c_event(const char *event, uint8_t address) "%s(addr:0x%02x)"
121
+i2c_send(uint8_t address, uint8_t data) "send(addr:0x%02x) data:0x%02x"
122
+i2c_recv(uint8_t address, uint8_t data) "recv(addr:0x%02x) data:0x%02x"
81
--
123
--
82
2.17.1
124
2.17.1
83
125
84
126
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to memory_region_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
6
The callsite in flatview_access_valid() is part of a recursive
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
loop flatview_access_valid() -> memory_region_access_valid() ->
4
Message-id: 20180606152128.449-2-f4bug@amsat.org
8
subpage_accepts() -> flatview_access_valid(); we make it pass
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
MEMTXATTRS_UNSPECIFIED for now, until the next several commits
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
have plumbed an attrs parameter through the rest of the loop
7
---
11
and we can add an attrs parameter to flatview_access_valid().
8
hw/sd/milkymist-memcard.c | 2 +-
9
1 file changed, 1 insertion(+), 1 deletion(-)
12
10
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
diff --git a/hw/sd/milkymist-memcard.c b/hw/sd/milkymist-memcard.c
14
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
16
Message-id: 20180521140402.23318-8-peter.maydell@linaro.org
17
---
18
include/exec/memory-internal.h | 3 ++-
19
exec.c | 4 +++-
20
hw/s390x/s390-pci-inst.c | 3 ++-
21
memory.c | 7 ++++---
22
4 files changed, 11 insertions(+), 6 deletions(-)
23
24
diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h
25
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
26
--- a/include/exec/memory-internal.h
13
--- a/hw/sd/milkymist-memcard.c
27
+++ b/include/exec/memory-internal.h
14
+++ b/hw/sd/milkymist-memcard.c
28
@@ -XXX,XX +XXX,XX @@ void flatview_unref(FlatView *view);
15
@@ -XXX,XX +XXX,XX @@ static uint64_t memcard_read(void *opaque, hwaddr addr,
29
extern const MemoryRegionOps unassigned_mem_ops;
16
r = s->response[s->response_read_ptr++];
30
17
if (s->response_read_ptr > s->response_len) {
31
bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr,
18
qemu_log_mask(LOG_GUEST_ERROR, "milkymist_memcard: "
32
- unsigned size, bool is_write);
19
- "read more cmd bytes than available. Clipping.");
33
+ unsigned size, bool is_write,
20
+ "read more cmd bytes than available: clipping\n");
34
+ MemTxAttrs attrs);
21
s->response_read_ptr = 0;
35
36
void flatview_add_to_dispatch(FlatView *fv, MemoryRegionSection *section);
37
AddressSpaceDispatch *address_space_dispatch_new(FlatView *fv);
38
diff --git a/exec.c b/exec.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/exec.c
41
+++ b/exec.c
42
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
43
mr = flatview_translate(fv, addr, &xlat, &l, is_write);
44
if (!memory_access_is_direct(mr, is_write)) {
45
l = memory_access_size(mr, l, addr);
46
- if (!memory_region_access_valid(mr, xlat, l, is_write)) {
47
+ /* When our callers all have attrs we'll pass them through here */
48
+ if (!memory_region_access_valid(mr, xlat, l, is_write,
49
+ MEMTXATTRS_UNSPECIFIED)) {
50
return false;
51
}
22
}
52
}
23
}
53
diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/s390x/s390-pci-inst.c
56
+++ b/hw/s390x/s390-pci-inst.c
57
@@ -XXX,XX +XXX,XX @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8_t r3, uint64_t gaddr,
58
mr = s390_get_subregion(mr, offset, len);
59
offset -= mr->addr;
60
61
- if (!memory_region_access_valid(mr, offset, len, true)) {
62
+ if (!memory_region_access_valid(mr, offset, len, true,
63
+ MEMTXATTRS_UNSPECIFIED)) {
64
s390_program_interrupt(env, PGM_OPERAND, 6, ra);
65
return 0;
66
}
67
diff --git a/memory.c b/memory.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/memory.c
70
+++ b/memory.c
71
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps ram_device_mem_ops = {
72
bool memory_region_access_valid(MemoryRegion *mr,
73
hwaddr addr,
74
unsigned size,
75
- bool is_write)
76
+ bool is_write,
77
+ MemTxAttrs attrs)
78
{
79
int access_size_min, access_size_max;
80
int access_size, i;
81
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_read(MemoryRegion *mr,
82
{
83
MemTxResult r;
84
85
- if (!memory_region_access_valid(mr, addr, size, false)) {
86
+ if (!memory_region_access_valid(mr, addr, size, false, attrs)) {
87
*pval = unassigned_mem_read(mr, addr, size);
88
return MEMTX_DECODE_ERROR;
89
}
90
@@ -XXX,XX +XXX,XX @@ MemTxResult memory_region_dispatch_write(MemoryRegion *mr,
91
unsigned size,
92
MemTxAttrs attrs)
93
{
94
- if (!memory_region_access_valid(mr, addr, size, true)) {
95
+ if (!memory_region_access_valid(mr, addr, size, true, attrs)) {
96
unassigned_mem_write(mr, addr, data, size);
97
return MEMTX_DECODE_ERROR;
98
}
99
--
24
--
100
2.17.1
25
2.17.1
101
26
102
27
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Depending on the host abi, float16, aka uint16_t, values are
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
passed and returned either zero-extended in the host register
4
Message-id: 20180606152128.449-3-f4bug@amsat.org
5
or with garbage at the top of the host register.
6
7
The tcg code generator has so far been assuming garbage, as that
8
matches the x86 abi, but this is incorrect for other host abis.
9
Further, target/arm has so far been assuming zero-extended results,
10
so that it may store the 16-bit value into a 32-bit slot with the
11
high 16-bits already clear.
12
13
Rectify both problems by mapping "f16" in the helper definition
14
to uint32_t instead of (a typedef for) uint16_t. This forces
15
the host compiler to assume garbage in the upper 16 bits on input
16
and to zero-extend the result on output.
17
18
Cc: qemu-stable@nongnu.org
19
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
21
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
22
Message-id: 20180522175629.24932-1-richard.henderson@linaro.org
23
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
24
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
25
---
7
---
26
include/exec/helper-head.h | 2 +-
8
hw/char/digic-uart.c | 4 ++--
27
target/arm/helper-a64.c | 35 +++++++++--------
9
hw/timer/digic-timer.c | 4 ++--
28
target/arm/helper.c | 80 +++++++++++++++++++-------------------
10
2 files changed, 4 insertions(+), 4 deletions(-)
29
3 files changed, 59 insertions(+), 58 deletions(-)
30
11
31
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h
12
diff --git a/hw/char/digic-uart.c b/hw/char/digic-uart.c
32
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
33
--- a/include/exec/helper-head.h
14
--- a/hw/char/digic-uart.c
34
+++ b/include/exec/helper-head.h
15
+++ b/hw/char/digic-uart.c
35
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ static uint64_t digic_uart_read(void *opaque, hwaddr addr,
36
#define dh_ctype_int int
17
default:
37
#define dh_ctype_i64 uint64_t
18
qemu_log_mask(LOG_UNIMP,
38
#define dh_ctype_s64 int64_t
19
"digic-uart: read access to unknown register 0x"
39
-#define dh_ctype_f16 float16
20
- TARGET_FMT_plx, addr << 2);
40
+#define dh_ctype_f16 uint32_t
21
+ TARGET_FMT_plx "\n", addr << 2);
41
#define dh_ctype_f32 float32
22
}
42
#define dh_ctype_f64 float64
23
43
#define dh_ctype_ptr void *
24
return ret;
44
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
25
@@ -XXX,XX +XXX,XX @@ static void digic_uart_write(void *opaque, hwaddr addr, uint64_t value,
45
index XXXXXXX..XXXXXXX 100644
26
default:
46
--- a/target/arm/helper-a64.c
27
qemu_log_mask(LOG_UNIMP,
47
+++ b/target/arm/helper-a64.c
28
"digic-uart: write access to unknown register 0x"
48
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float_rel_to_flags(int res)
29
- TARGET_FMT_plx, addr << 2);
49
return flags;
30
+ TARGET_FMT_plx "\n", addr << 2);
50
}
51
52
-uint64_t HELPER(vfp_cmph_a64)(float16 x, float16 y, void *fp_status)
53
+uint64_t HELPER(vfp_cmph_a64)(uint32_t x, uint32_t y, void *fp_status)
54
{
55
return float_rel_to_flags(float16_compare_quiet(x, y, fp_status));
56
}
57
58
-uint64_t HELPER(vfp_cmpeh_a64)(float16 x, float16 y, void *fp_status)
59
+uint64_t HELPER(vfp_cmpeh_a64)(uint32_t x, uint32_t y, void *fp_status)
60
{
61
return float_rel_to_flags(float16_compare(x, y, fp_status));
62
}
63
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_cgt_f64)(float64 a, float64 b, void *fpstp)
64
#define float64_three make_float64(0x4008000000000000ULL)
65
#define float64_one_point_five make_float64(0x3FF8000000000000ULL)
66
67
-float16 HELPER(recpsf_f16)(float16 a, float16 b, void *fpstp)
68
+uint32_t HELPER(recpsf_f16)(uint32_t a, uint32_t b, void *fpstp)
69
{
70
float_status *fpst = fpstp;
71
72
@@ -XXX,XX +XXX,XX @@ float64 HELPER(recpsf_f64)(float64 a, float64 b, void *fpstp)
73
return float64_muladd(a, b, float64_two, 0, fpst);
74
}
75
76
-float16 HELPER(rsqrtsf_f16)(float16 a, float16 b, void *fpstp)
77
+uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, void *fpstp)
78
{
79
float_status *fpst = fpstp;
80
81
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addlp_u16)(uint64_t a)
82
}
83
84
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
85
-float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
86
+uint32_t HELPER(frecpx_f16)(uint32_t a, void *fpstp)
87
{
88
float_status *fpst = fpstp;
89
uint16_t val16, sbit;
90
@@ -XXX,XX +XXX,XX @@ void HELPER(casp_be_parallel)(CPUARMState *env, uint32_t rs, uint64_t addr,
91
#define ADVSIMD_HELPER(name, suffix) HELPER(glue(glue(advsimd_, name), suffix))
92
93
#define ADVSIMD_HALFOP(name) \
94
-float16 ADVSIMD_HELPER(name, h)(float16 a, float16 b, void *fpstp) \
95
+uint32_t ADVSIMD_HELPER(name, h)(uint32_t a, uint32_t b, void *fpstp) \
96
{ \
97
float_status *fpst = fpstp; \
98
return float16_ ## name(a, b, fpst); \
99
@@ -XXX,XX +XXX,XX @@ ADVSIMD_HALFOP(mulx)
100
ADVSIMD_TWOHALFOP(mulx)
101
102
/* fused multiply-accumulate */
103
-float16 HELPER(advsimd_muladdh)(float16 a, float16 b, float16 c, void *fpstp)
104
+uint32_t HELPER(advsimd_muladdh)(uint32_t a, uint32_t b, uint32_t c,
105
+ void *fpstp)
106
{
107
float_status *fpst = fpstp;
108
return float16_muladd(a, b, c, 0, fpst);
109
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_muladd2h)(uint32_t two_a, uint32_t two_b,
110
111
#define ADVSIMD_CMPRES(test) (test) ? 0xffff : 0
112
113
-uint32_t HELPER(advsimd_ceq_f16)(float16 a, float16 b, void *fpstp)
114
+uint32_t HELPER(advsimd_ceq_f16)(uint32_t a, uint32_t b, void *fpstp)
115
{
116
float_status *fpst = fpstp;
117
int compare = float16_compare_quiet(a, b, fpst);
118
return ADVSIMD_CMPRES(compare == float_relation_equal);
119
}
120
121
-uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
122
+uint32_t HELPER(advsimd_cge_f16)(uint32_t a, uint32_t b, void *fpstp)
123
{
124
float_status *fpst = fpstp;
125
int compare = float16_compare(a, b, fpst);
126
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_cge_f16)(float16 a, float16 b, void *fpstp)
127
compare == float_relation_equal);
128
}
129
130
-uint32_t HELPER(advsimd_cgt_f16)(float16 a, float16 b, void *fpstp)
131
+uint32_t HELPER(advsimd_cgt_f16)(uint32_t a, uint32_t b, void *fpstp)
132
{
133
float_status *fpst = fpstp;
134
int compare = float16_compare(a, b, fpst);
135
return ADVSIMD_CMPRES(compare == float_relation_greater);
136
}
137
138
-uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
139
+uint32_t HELPER(advsimd_acge_f16)(uint32_t a, uint32_t b, void *fpstp)
140
{
141
float_status *fpst = fpstp;
142
float16 f0 = float16_abs(a);
143
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acge_f16)(float16 a, float16 b, void *fpstp)
144
compare == float_relation_equal);
145
}
146
147
-uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
148
+uint32_t HELPER(advsimd_acgt_f16)(uint32_t a, uint32_t b, void *fpstp)
149
{
150
float_status *fpst = fpstp;
151
float16 f0 = float16_abs(a);
152
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_acgt_f16)(float16 a, float16 b, void *fpstp)
153
}
154
155
/* round to integral */
156
-float16 HELPER(advsimd_rinth_exact)(float16 x, void *fp_status)
157
+uint32_t HELPER(advsimd_rinth_exact)(uint32_t x, void *fp_status)
158
{
159
return float16_round_to_int(x, fp_status);
160
}
161
162
-float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
163
+uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status)
164
{
165
int old_flags = get_float_exception_flags(fp_status), new_flags;
166
float16 ret;
167
@@ -XXX,XX +XXX,XX @@ float16 HELPER(advsimd_rinth)(float16 x, void *fp_status)
168
* setting the mode appropriately before calling the helper.
169
*/
170
171
-uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
172
+uint32_t HELPER(advsimd_f16tosinth)(uint32_t a, void *fpstp)
173
{
174
float_status *fpst = fpstp;
175
176
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16tosinth)(float16 a, void *fpstp)
177
return float16_to_int16(a, fpst);
178
}
179
180
-uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
181
+uint32_t HELPER(advsimd_f16touinth)(uint32_t a, void *fpstp)
182
{
183
float_status *fpst = fpstp;
184
185
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_f16touinth)(float16 a, void *fpstp)
186
* Square Root and Reciprocal square root
187
*/
188
189
-float16 HELPER(sqrt_f16)(float16 a, void *fpstp)
190
+uint32_t HELPER(sqrt_f16)(uint32_t a, void *fpstp)
191
{
192
float_status *s = fpstp;
193
194
diff --git a/target/arm/helper.c b/target/arm/helper.c
195
index XXXXXXX..XXXXXXX 100644
196
--- a/target/arm/helper.c
197
+++ b/target/arm/helper.c
198
@@ -XXX,XX +XXX,XX @@ DO_VFP_cmp(d, float64)
199
200
/* Integer to float and float to integer conversions */
201
202
-#define CONV_ITOF(name, fsz, sign) \
203
- float##fsz HELPER(name)(uint32_t x, void *fpstp) \
204
-{ \
205
- float_status *fpst = fpstp; \
206
- return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
207
+#define CONV_ITOF(name, ftype, fsz, sign) \
208
+ftype HELPER(name)(uint32_t x, void *fpstp) \
209
+{ \
210
+ float_status *fpst = fpstp; \
211
+ return sign##int32_to_##float##fsz((sign##int32_t)x, fpst); \
212
}
213
214
-#define CONV_FTOI(name, fsz, sign, round) \
215
-uint32_t HELPER(name)(float##fsz x, void *fpstp) \
216
-{ \
217
- float_status *fpst = fpstp; \
218
- if (float##fsz##_is_any_nan(x)) { \
219
- float_raise(float_flag_invalid, fpst); \
220
- return 0; \
221
- } \
222
- return float##fsz##_to_##sign##int32##round(x, fpst); \
223
+#define CONV_FTOI(name, ftype, fsz, sign, round) \
224
+uint32_t HELPER(name)(ftype x, void *fpstp) \
225
+{ \
226
+ float_status *fpst = fpstp; \
227
+ if (float##fsz##_is_any_nan(x)) { \
228
+ float_raise(float_flag_invalid, fpst); \
229
+ return 0; \
230
+ } \
231
+ return float##fsz##_to_##sign##int32##round(x, fpst); \
232
}
233
234
-#define FLOAT_CONVS(name, p, fsz, sign) \
235
-CONV_ITOF(vfp_##name##to##p, fsz, sign) \
236
-CONV_FTOI(vfp_to##name##p, fsz, sign, ) \
237
-CONV_FTOI(vfp_to##name##z##p, fsz, sign, _round_to_zero)
238
+#define FLOAT_CONVS(name, p, ftype, fsz, sign) \
239
+ CONV_ITOF(vfp_##name##to##p, ftype, fsz, sign) \
240
+ CONV_FTOI(vfp_to##name##p, ftype, fsz, sign, ) \
241
+ CONV_FTOI(vfp_to##name##z##p, ftype, fsz, sign, _round_to_zero)
242
243
-FLOAT_CONVS(si, h, 16, )
244
-FLOAT_CONVS(si, s, 32, )
245
-FLOAT_CONVS(si, d, 64, )
246
-FLOAT_CONVS(ui, h, 16, u)
247
-FLOAT_CONVS(ui, s, 32, u)
248
-FLOAT_CONVS(ui, d, 64, u)
249
+FLOAT_CONVS(si, h, uint32_t, 16, )
250
+FLOAT_CONVS(si, s, float32, 32, )
251
+FLOAT_CONVS(si, d, float64, 64, )
252
+FLOAT_CONVS(ui, h, uint32_t, 16, u)
253
+FLOAT_CONVS(ui, s, float32, 32, u)
254
+FLOAT_CONVS(ui, d, float64, 64, u)
255
256
#undef CONV_ITOF
257
#undef CONV_FTOI
258
@@ -XXX,XX +XXX,XX @@ static float16 do_postscale_fp16(float64 f, int shift, float_status *fpst)
259
return float64_to_float16(float64_scalbn(f, -shift, fpst), true, fpst);
260
}
261
262
-float16 HELPER(vfp_sltoh)(uint32_t x, uint32_t shift, void *fpst)
263
+uint32_t HELPER(vfp_sltoh)(uint32_t x, uint32_t shift, void *fpst)
264
{
265
return do_postscale_fp16(int32_to_float64(x, fpst), shift, fpst);
266
}
267
268
-float16 HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
269
+uint32_t HELPER(vfp_ultoh)(uint32_t x, uint32_t shift, void *fpst)
270
{
271
return do_postscale_fp16(uint32_to_float64(x, fpst), shift, fpst);
272
}
273
274
-float16 HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
275
+uint32_t HELPER(vfp_sqtoh)(uint64_t x, uint32_t shift, void *fpst)
276
{
277
return do_postscale_fp16(int64_to_float64(x, fpst), shift, fpst);
278
}
279
280
-float16 HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
281
+uint32_t HELPER(vfp_uqtoh)(uint64_t x, uint32_t shift, void *fpst)
282
{
283
return do_postscale_fp16(uint64_to_float64(x, fpst), shift, fpst);
284
}
285
@@ -XXX,XX +XXX,XX @@ static float64 do_prescale_fp16(float16 f, int shift, float_status *fpst)
286
}
31
}
287
}
32
}
288
33
289
-uint32_t HELPER(vfp_toshh)(float16 x, uint32_t shift, void *fpst)
34
diff --git a/hw/timer/digic-timer.c b/hw/timer/digic-timer.c
290
+uint32_t HELPER(vfp_toshh)(uint32_t x, uint32_t shift, void *fpst)
35
index XXXXXXX..XXXXXXX 100644
291
{
36
--- a/hw/timer/digic-timer.c
292
return float64_to_int16(do_prescale_fp16(x, shift, fpst), fpst);
37
+++ b/hw/timer/digic-timer.c
38
@@ -XXX,XX +XXX,XX @@ static uint64_t digic_timer_read(void *opaque, hwaddr offset, unsigned size)
39
default:
40
qemu_log_mask(LOG_UNIMP,
41
"digic-timer: read access to unknown register 0x"
42
- TARGET_FMT_plx, offset);
43
+ TARGET_FMT_plx "\n", offset);
44
}
45
46
return ret;
47
@@ -XXX,XX +XXX,XX @@ static void digic_timer_write(void *opaque, hwaddr offset,
48
default:
49
qemu_log_mask(LOG_UNIMP,
50
"digic-timer: read access to unknown register 0x"
51
- TARGET_FMT_plx, offset);
52
+ TARGET_FMT_plx "\n", offset);
53
}
293
}
54
}
294
55
295
-uint32_t HELPER(vfp_touhh)(float16 x, uint32_t shift, void *fpst)
296
+uint32_t HELPER(vfp_touhh)(uint32_t x, uint32_t shift, void *fpst)
297
{
298
return float64_to_uint16(do_prescale_fp16(x, shift, fpst), fpst);
299
}
300
301
-uint32_t HELPER(vfp_toslh)(float16 x, uint32_t shift, void *fpst)
302
+uint32_t HELPER(vfp_toslh)(uint32_t x, uint32_t shift, void *fpst)
303
{
304
return float64_to_int32(do_prescale_fp16(x, shift, fpst), fpst);
305
}
306
307
-uint32_t HELPER(vfp_toulh)(float16 x, uint32_t shift, void *fpst)
308
+uint32_t HELPER(vfp_toulh)(uint32_t x, uint32_t shift, void *fpst)
309
{
310
return float64_to_uint32(do_prescale_fp16(x, shift, fpst), fpst);
311
}
312
313
-uint64_t HELPER(vfp_tosqh)(float16 x, uint32_t shift, void *fpst)
314
+uint64_t HELPER(vfp_tosqh)(uint32_t x, uint32_t shift, void *fpst)
315
{
316
return float64_to_int64(do_prescale_fp16(x, shift, fpst), fpst);
317
}
318
319
-uint64_t HELPER(vfp_touqh)(float16 x, uint32_t shift, void *fpst)
320
+uint64_t HELPER(vfp_touqh)(uint32_t x, uint32_t shift, void *fpst)
321
{
322
return float64_to_uint64(do_prescale_fp16(x, shift, fpst), fpst);
323
}
324
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(set_neon_rmode)(uint32_t rmode, CPUARMState *env)
325
}
326
327
/* Half precision conversions. */
328
-float32 HELPER(vfp_fcvt_f16_to_f32)(float16 a, void *fpstp, uint32_t ahp_mode)
329
+float32 HELPER(vfp_fcvt_f16_to_f32)(uint32_t a, void *fpstp, uint32_t ahp_mode)
330
{
331
/* Squash FZ16 to 0 for the duration of conversion. In this case,
332
* it would affect flushing input denormals.
333
@@ -XXX,XX +XXX,XX @@ float32 HELPER(vfp_fcvt_f16_to_f32)(float16 a, void *fpstp, uint32_t ahp_mode)
334
return r;
335
}
336
337
-float16 HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
338
+uint32_t HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
339
{
340
/* Squash FZ16 to 0 for the duration of conversion. In this case,
341
* it would affect flushing output denormals.
342
@@ -XXX,XX +XXX,XX @@ float16 HELPER(vfp_fcvt_f32_to_f16)(float32 a, void *fpstp, uint32_t ahp_mode)
343
return r;
344
}
345
346
-float64 HELPER(vfp_fcvt_f16_to_f64)(float16 a, void *fpstp, uint32_t ahp_mode)
347
+float64 HELPER(vfp_fcvt_f16_to_f64)(uint32_t a, void *fpstp, uint32_t ahp_mode)
348
{
349
/* Squash FZ16 to 0 for the duration of conversion. In this case,
350
* it would affect flushing input denormals.
351
@@ -XXX,XX +XXX,XX @@ float64 HELPER(vfp_fcvt_f16_to_f64)(float16 a, void *fpstp, uint32_t ahp_mode)
352
return r;
353
}
354
355
-float16 HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
356
+uint32_t HELPER(vfp_fcvt_f64_to_f16)(float64 a, void *fpstp, uint32_t ahp_mode)
357
{
358
/* Squash FZ16 to 0 for the duration of conversion. In this case,
359
* it would affect flushing output denormals.
360
@@ -XXX,XX +XXX,XX @@ static bool round_to_inf(float_status *fpst, bool sign_bit)
361
g_assert_not_reached();
362
}
363
364
-float16 HELPER(recpe_f16)(float16 input, void *fpstp)
365
+uint32_t HELPER(recpe_f16)(uint32_t input, void *fpstp)
366
{
367
float_status *fpst = fpstp;
368
float16 f16 = float16_squash_input_denormal(input, fpst);
369
@@ -XXX,XX +XXX,XX @@ static uint64_t recip_sqrt_estimate(int *exp , int exp_off, uint64_t frac)
370
return extract64(estimate, 0, 8) << 44;
371
}
372
373
-float16 HELPER(rsqrte_f16)(float16 input, void *fpstp)
374
+uint32_t HELPER(rsqrte_f16)(uint32_t input, void *fpstp)
375
{
376
float_status *s = fpstp;
377
float16 f16 = float16_squash_input_denormal(input, s);
378
--
56
--
379
2.17.1
57
2.17.1
380
58
381
59
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to flatview_do_translate().
3
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20180606152128.449-4-f4bug@amsat.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-13-peter.maydell@linaro.org
8
---
7
---
9
exec.c | 9 ++++++---
8
hw/display/xlnx_dp.c | 4 +++-
10
1 file changed, 6 insertions(+), 3 deletions(-)
9
1 file changed, 3 insertions(+), 1 deletion(-)
11
10
12
diff --git a/exec.c b/exec.c
11
diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
13
--- a/hw/display/xlnx_dp.c
15
+++ b/exec.c
14
+++ b/hw/display/xlnx_dp.c
16
@@ -XXX,XX +XXX,XX @@ unassigned:
15
@@ -XXX,XX +XXX,XX @@ static void xlnx_dp_avbufm_write(void *opaque, hwaddr offset, uint64_t value,
17
* @is_write: whether the translation operation is for write
16
case AV_BUF_STC_SNAPSHOT1:
18
* @is_mmio: whether this can be MMIO, set true if it can
17
case AV_BUF_HCOUNT_VCOUNT_INT0:
19
* @target_as: the address space targeted by the IOMMU
18
case AV_BUF_HCOUNT_VCOUNT_INT1:
20
+ * @attrs: memory transaction attributes
19
- qemu_log_mask(LOG_UNIMP, "avbufm: unimplmented");
21
*
20
+ qemu_log_mask(LOG_UNIMP, "avbufm: unimplemented register 0x%04"
22
* This function is called from RCU critical section
21
+ PRIx64 "\n",
23
*/
22
+ offset << 2);
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
23
break;
25
hwaddr *page_mask_out,
24
default:
26
bool is_write,
25
s->avbufm_registers[offset] = value;
27
bool is_mmio,
28
- AddressSpace **target_as)
29
+ AddressSpace **target_as,
30
+ MemTxAttrs attrs)
31
{
32
MemoryRegionSection *section;
33
IOMMUMemoryRegion *iommu_mr;
34
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
35
* but page mask.
36
*/
37
section = flatview_do_translate(address_space_to_flatview(as), addr, &xlat,
38
- NULL, &page_mask, is_write, false, &as);
39
+ NULL, &page_mask, is_write, false, &as,
40
+ attrs);
41
42
/* Illegal translation */
43
if (section.mr == &io_mem_unassigned) {
44
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv, hwaddr addr, hwaddr *xlat,
45
46
/* This can be MMIO, so setup MMIO bit. */
47
section = flatview_do_translate(fv, addr, xlat, plen, NULL,
48
- is_write, true, &as);
49
+ is_write, true, &as, attrs);
50
mr = section.mr;
51
52
if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
53
--
26
--
54
2.17.1
27
2.17.1
55
28
56
29
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to address_space_translate_iommu().
3
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Acked-by: David Gibson <david@gibson.dropbear.id.au>
5
Message-id: 20180606152128.449-5-f4bug@amsat.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-14-peter.maydell@linaro.org
8
---
7
---
9
exec.c | 8 +++++---
8
hw/ppc/pnv_core.c | 4 ++--
10
1 file changed, 5 insertions(+), 3 deletions(-)
9
1 file changed, 2 insertions(+), 2 deletions(-)
11
10
12
diff --git a/exec.c b/exec.c
11
diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/exec.c
13
--- a/hw/ppc/pnv_core.c
15
+++ b/exec.c
14
+++ b/hw/ppc/pnv_core.c
16
@@ -XXX,XX +XXX,XX @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
15
@@ -XXX,XX +XXX,XX @@ static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr,
17
* @is_write: whether the translation operation is for write
16
val = 0x24f000000000000ull;
18
* @is_mmio: whether this can be MMIO, set true if it can
17
break;
19
* @target_as: the address space targeted by the IOMMU
18
default:
20
+ * @attrs: transaction attributes
19
- qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx,
21
*
20
+ qemu_log_mask(LOG_UNIMP, "Warning: reading reg=0x%" HWADDR_PRIx "\n",
22
* This function is called from RCU critical section. It is the common
21
addr);
23
* part of flatview_do_translate and address_space_translate_cached.
22
}
24
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection address_space_translate_iommu(IOMMUMemoryRegion *iomm
23
25
hwaddr *page_mask_out,
24
@@ -XXX,XX +XXX,XX @@ static uint64_t pnv_core_xscom_read(void *opaque, hwaddr addr,
26
bool is_write,
25
static void pnv_core_xscom_write(void *opaque, hwaddr addr, uint64_t val,
27
bool is_mmio,
26
unsigned int width)
28
- AddressSpace **target_as)
29
+ AddressSpace **target_as,
30
+ MemTxAttrs attrs)
31
{
27
{
32
MemoryRegionSection *section;
28
- qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx,
33
hwaddr page_mask = (hwaddr)-1;
29
+ qemu_log_mask(LOG_UNIMP, "Warning: writing to reg=0x%" HWADDR_PRIx "\n",
34
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
30
addr);
35
return address_space_translate_iommu(iommu_mr, xlat,
36
plen_out, page_mask_out,
37
is_write, is_mmio,
38
- target_as);
39
+ target_as, attrs);
40
}
41
if (page_mask_out) {
42
/* Not behind an IOMMU, use default page size. */
43
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate_cached(
44
45
section = address_space_translate_iommu(iommu_mr, xlat, plen,
46
NULL, is_write, true,
47
- &target_as);
48
+ &target_as, attrs);
49
return section.mr;
50
}
31
}
51
32
52
--
33
--
53
2.17.1
34
2.17.1
54
35
55
36
diff view generated by jsdifflib
1
Provide a VMSTATE_BOOL_SUB_ARRAY to go with VMSTATE_UINT8_SUB_ARRAY
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
and friends.
3
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20180606152128.449-6-f4bug@amsat.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Message-id: 20180521140402.23318-23-peter.maydell@linaro.org
7
---
7
---
8
include/migration/vmstate.h | 3 +++
8
hw/core/register.c | 2 +-
9
1 file changed, 3 insertions(+)
9
1 file changed, 1 insertion(+), 1 deletion(-)
10
10
11
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h
11
diff --git a/hw/core/register.c b/hw/core/register.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/include/migration/vmstate.h
13
--- a/hw/core/register.c
14
+++ b/include/migration/vmstate.h
14
+++ b/hw/core/register.c
15
@@ -XXX,XX +XXX,XX @@ extern const VMStateInfo vmstate_info_qtailq;
15
@@ -XXX,XX +XXX,XX @@ void register_write(RegisterInfo *reg, uint64_t val, uint64_t we,
16
#define VMSTATE_BOOL_ARRAY(_f, _s, _n) \
16
if (test) {
17
VMSTATE_BOOL_ARRAY_V(_f, _s, _n, 0)
17
qemu_log_mask(LOG_UNIMP,
18
18
"%s:%s writing %#" PRIx64 " to unimplemented bits:" \
19
+#define VMSTATE_BOOL_SUB_ARRAY(_f, _s, _start, _num) \
19
- " %#" PRIx64 "",
20
+ VMSTATE_SUB_ARRAY(_f, _s, _start, _num, 0, vmstate_info_bool, bool)
20
+ " %#" PRIx64 "\n",
21
+
21
prefix, reg->access->name, val, ac->unimp);
22
#define VMSTATE_UINT16_ARRAY_V(_f, _s, _n, _v) \
22
}
23
VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_uint16, uint16_t)
24
23
25
--
24
--
26
2.17.1
25
2.17.1
27
26
28
27
diff view generated by jsdifflib
1
The FRECPX instructions should (like most other floating point operations)
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
honour the FPCR.FZ bit which specifies whether input denormals should
3
be flushed to zero (or FZ16 for the half-precision version).
4
We forgot to implement this, which doesn't affect the results (since
5
the calculation doesn't actually care about the mantissa bits) but did
6
mean we were failing to set the FPSR.IDC bit.
7
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20180606152128.449-7-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-id: 20180521172712.19930-1-peter.maydell@linaro.org
11
---
7
---
12
target/arm/helper-a64.c | 6 ++++++
8
hw/mips/boston.c | 8 ++++----
13
1 file changed, 6 insertions(+)
9
1 file changed, 4 insertions(+), 4 deletions(-)
14
10
15
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
11
diff --git a/hw/mips/boston.c b/hw/mips/boston.c
16
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/helper-a64.c
13
--- a/hw/mips/boston.c
18
+++ b/target/arm/helper-a64.c
14
+++ b/hw/mips/boston.c
19
@@ -XXX,XX +XXX,XX @@ float16 HELPER(frecpx_f16)(float16 a, void *fpstp)
15
@@ -XXX,XX +XXX,XX @@ static uint64_t boston_platreg_read(void *opaque, hwaddr addr,
20
return nan;
16
uint32_t gic_freq, val;
17
18
if (size != 4) {
19
- qemu_log_mask(LOG_UNIMP, "%uB platform register read", size);
20
+ qemu_log_mask(LOG_UNIMP, "%uB platform register read\n", size);
21
return 0;
21
}
22
}
22
23
23
+ a = float16_squash_input_denormal(a, fpst);
24
@@ -XXX,XX +XXX,XX @@ static uint64_t boston_platreg_read(void *opaque, hwaddr addr,
24
+
25
val |= PLAT_DDR_CFG_MHZ;
25
val16 = float16_val(a);
26
return val;
26
sbit = 0x8000 & val16;
27
default:
27
exp = extract32(val16, 10, 5);
28
- qemu_log_mask(LOG_UNIMP, "Read platform register 0x%" HWADDR_PRIx,
28
@@ -XXX,XX +XXX,XX @@ float32 HELPER(frecpx_f32)(float32 a, void *fpstp)
29
+ qemu_log_mask(LOG_UNIMP, "Read platform register 0x%" HWADDR_PRIx "\n",
29
return nan;
30
addr & 0xffff);
31
return 0;
30
}
32
}
31
33
@@ -XXX,XX +XXX,XX @@ static void boston_platreg_write(void *opaque, hwaddr addr,
32
+ a = float32_squash_input_denormal(a, fpst);
34
uint64_t val, unsigned size)
33
+
35
{
34
val32 = float32_val(a);
36
if (size != 4) {
35
sbit = 0x80000000ULL & val32;
37
- qemu_log_mask(LOG_UNIMP, "%uB platform register write", size);
36
exp = extract32(val32, 23, 8);
38
+ qemu_log_mask(LOG_UNIMP, "%uB platform register write\n", size);
37
@@ -XXX,XX +XXX,XX @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
39
return;
38
return nan;
39
}
40
}
40
41
41
+ a = float64_squash_input_denormal(a, fpst);
42
@@ -XXX,XX +XXX,XX @@ static void boston_platreg_write(void *opaque, hwaddr addr,
42
+
43
break;
43
val64 = float64_val(a);
44
default:
44
sbit = 0x8000000000000000ULL & val64;
45
qemu_log_mask(LOG_UNIMP, "Write platform register 0x%" HWADDR_PRIx
45
exp = extract64(float64_val(a), 52, 11);
46
- " = 0x%" PRIx64, addr & 0xffff, val);
47
+ " = 0x%" PRIx64 "\n", addr & 0xffff, val);
48
break;
49
}
50
}
46
--
51
--
47
2.17.1
52
2.17.1
48
53
49
54
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to address_space_get_iotlb_entry().
3
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20180606152128.449-8-f4bug@amsat.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20180521140402.23318-12-peter.maydell@linaro.org
8
---
7
---
9
include/exec/memory.h | 2 +-
8
hw/arm/stellaris.c | 11 ++++++-----
10
exec.c | 2 +-
9
1 file changed, 6 insertions(+), 5 deletions(-)
11
hw/virtio/vhost.c | 3 ++-
12
3 files changed, 4 insertions(+), 3 deletions(-)
13
10
14
diff --git a/include/exec/memory.h b/include/exec/memory.h
11
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
15
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
16
--- a/include/exec/memory.h
13
--- a/hw/arm/stellaris.c
17
+++ b/include/exec/memory.h
14
+++ b/hw/arm/stellaris.c
18
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache);
15
@@ -XXX,XX +XXX,XX @@ static uint64_t gptm_read(void *opaque, hwaddr offset,
19
* entry. Should be called from an RCU critical section.
16
return s->rtc;
20
*/
17
}
21
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
18
qemu_log_mask(LOG_UNIMP,
22
- bool is_write);
19
- "GPTM: read of TAR but timer read not supported");
23
+ bool is_write, MemTxAttrs attrs);
20
+ "GPTM: read of TAR but timer read not supported\n");
24
21
return 0;
25
/* address_space_translate: translate an address range into an address space
22
case 0x4c: /* TBR */
26
* into a MemoryRegion and an address range into that section. Should be
23
qemu_log_mask(LOG_UNIMP,
27
diff --git a/exec.c b/exec.c
24
- "GPTM: read of TBR but timer read not supported");
28
index XXXXXXX..XXXXXXX 100644
25
+ "GPTM: read of TBR but timer read not supported\n");
29
--- a/exec.c
26
return 0;
30
+++ b/exec.c
27
default:
31
@@ -XXX,XX +XXX,XX @@ static MemoryRegionSection flatview_do_translate(FlatView *fv,
28
qemu_log_mask(LOG_GUEST_ERROR,
32
29
@@ -XXX,XX +XXX,XX @@ static void stellaris_i2c_write(void *opaque, hwaddr offset,
33
/* Called from RCU critical section */
30
break;
34
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
31
case 0x20: /* MCR */
35
- bool is_write)
32
if (value & 1) {
36
+ bool is_write, MemTxAttrs attrs)
33
- qemu_log_mask(LOG_UNIMP, "stellaris_i2c: Loopback not implemented");
37
{
34
+ qemu_log_mask(LOG_UNIMP,
38
MemoryRegionSection section;
35
+ "stellaris_i2c: Loopback not implemented\n");
39
hwaddr xlat, page_mask;
36
}
40
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
37
if (value & 0x20) {
41
index XXXXXXX..XXXXXXX 100644
38
qemu_log_mask(LOG_UNIMP,
42
--- a/hw/virtio/vhost.c
39
- "stellaris_i2c: Slave mode not implemented");
43
+++ b/hw/virtio/vhost.c
40
+ "stellaris_i2c: Slave mode not implemented\n");
44
@@ -XXX,XX +XXX,XX @@ int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write)
41
}
45
trace_vhost_iotlb_miss(dev, 1);
42
s->mcr = value & 0x31;
46
43
break;
47
iotlb = address_space_get_iotlb_entry(dev->vdev->dma_as,
44
@@ -XXX,XX +XXX,XX @@ static void stellaris_adc_write(void *opaque, hwaddr offset,
48
- iova, write);
45
s->sspri = value;
49
+ iova, write,
46
break;
50
+ MEMTXATTRS_UNSPECIFIED);
47
case 0x28: /* PSSI */
51
if (iotlb.target_as != NULL) {
48
- qemu_log_mask(LOG_UNIMP, "ADC: sample initiate unimplemented");
52
ret = vhost_memory_region_lookup(dev, iotlb.translated_addr,
49
+ qemu_log_mask(LOG_UNIMP, "ADC: sample initiate unimplemented\n");
53
&uaddr, &len);
50
break;
51
case 0x30: /* SAC */
52
s->sac = value;
54
--
53
--
55
2.17.1
54
2.17.1
56
55
57
56
diff view generated by jsdifflib
1
In commit f0aff255700 we made cpacr_write() enforce that some CPACR
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
bits are RAZ/WI and some are RAO/WI for ARMv7 cores. Unfortunately
3
we forgot to also update the register's reset value. The effect
4
was that (a) a guest that read CPACR on reset would not see ones in
5
the RAO bits, and (b) if you did a migration before the guest did
6
a write to the CPACR then the migration would fail because the
7
destination would enforce the RAO bits and then complain that they
8
didn't match the zero value from the source.
9
2
10
Implement reset for the CPACR using a custom reset function
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
that just calls cpacr_write(), to avoid having to duplicate
4
Message-id: 20180606152128.449-9-f4bug@amsat.org
12
the logic for which bits are RAO.
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
13
14
This bug would affect migration for TCG CPUs which are ARMv7
15
with VFP but without one of Neon or VFPv3.
16
17
Reported-by: Cédric Le Goater <clg@kaod.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Tested-by: Cédric Le Goater <clg@kaod.org>
20
Message-id: 20180522173713.26282-1-peter.maydell@linaro.org
21
---
7
---
22
target/arm/helper.c | 10 +++++++++-
8
target/arm/helper.c | 4 ++--
23
1 file changed, 9 insertions(+), 1 deletion(-)
9
1 file changed, 2 insertions(+), 2 deletions(-)
24
10
25
diff --git a/target/arm/helper.c b/target/arm/helper.c
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/helper.c
13
--- a/target/arm/helper.c
28
+++ b/target/arm/helper.c
14
+++ b/target/arm/helper.c
29
@@ -XXX,XX +XXX,XX @@ static void cpacr_write(CPUARMState *env, const ARMCPRegInfo *ri,
15
@@ -XXX,XX +XXX,XX @@ void hw_breakpoint_update(ARMCPU *cpu, int n)
30
env->cp15.cpacr_el1 = value;
16
case 4: /* unlinked address mismatch (reserved if AArch64) */
31
}
17
case 5: /* linked address mismatch (reserved if AArch64) */
32
18
qemu_log_mask(LOG_UNIMP,
33
+static void cpacr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
19
- "arm: address mismatch breakpoint types not implemented");
34
+{
20
+ "arm: address mismatch breakpoint types not implemented\n");
35
+ /* Call cpacr_write() so that we reset with the correct RAO bits set
21
return;
36
+ * for our CPU features.
22
case 0: /* unlinked address match */
37
+ */
23
case 1: /* linked address match */
38
+ cpacr_write(env, ri, 0);
24
@@ -XXX,XX +XXX,XX @@ void hw_breakpoint_update(ARMCPU *cpu, int n)
39
+}
25
case 8: /* unlinked VMID match (reserved if no EL2) */
40
+
26
case 10: /* unlinked context ID and VMID match (reserved if no EL2) */
41
static CPAccessResult cpacr_access(CPUARMState *env, const ARMCPRegInfo *ri,
27
qemu_log_mask(LOG_UNIMP,
42
bool isread)
28
- "arm: unlinked context breakpoint types not implemented");
43
{
29
+ "arm: unlinked context breakpoint types not implemented\n");
44
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
30
return;
45
{ .name = "CPACR", .state = ARM_CP_STATE_BOTH, .opc0 = 3,
31
case 9: /* linked VMID match (reserved if no EL2) */
46
.crn = 1, .crm = 0, .opc1 = 0, .opc2 = 2, .accessfn = cpacr_access,
32
case 11: /* linked context ID and VMID match (reserved if no EL2) */
47
.access = PL1_RW, .fieldoffset = offsetof(CPUARMState, cp15.cpacr_el1),
48
- .resetvalue = 0, .writefn = cpacr_write },
49
+ .resetfn = cpacr_reset, .writefn = cpacr_write },
50
REGINFO_SENTINEL
51
};
52
53
--
33
--
54
2.17.1
34
2.17.1
55
35
56
36
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to flatview_extend_translation().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
5
Message-id: 20180606152128.449-10-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-7-peter.maydell@linaro.org
10
---
7
---
11
exec.c | 15 ++++++++++-----
8
target/m68k/translate.c | 2 +-
12
1 file changed, 10 insertions(+), 5 deletions(-)
9
1 file changed, 1 insertion(+), 1 deletion(-)
13
10
14
diff --git a/exec.c b/exec.c
11
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
15
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
16
--- a/exec.c
13
--- a/target/m68k/translate.c
17
+++ b/exec.c
14
+++ b/target/m68k/translate.c
18
@@ -XXX,XX +XXX,XX @@ bool address_space_access_valid(AddressSpace *as, hwaddr addr,
15
@@ -XXX,XX +XXX,XX @@ DISAS_INSN(undef)
19
16
/* ??? This is both instructions that are as yet unimplemented
20
static hwaddr
17
for the 680x0 series, as well as those that are implemented
21
flatview_extend_translation(FlatView *fv, hwaddr addr,
18
but actually illegal for CPU32 or pre-68020. */
22
- hwaddr target_len,
19
- qemu_log_mask(LOG_UNIMP, "Illegal instruction: %04x @ %08x",
23
- MemoryRegion *mr, hwaddr base, hwaddr len,
20
+ qemu_log_mask(LOG_UNIMP, "Illegal instruction: %04x @ %08x\n",
24
- bool is_write)
21
insn, s->insn_pc);
25
+ hwaddr target_len,
22
gen_exception(s, s->insn_pc, EXCP_UNSUPPORTED);
26
+ MemoryRegion *mr, hwaddr base, hwaddr len,
23
}
27
+ bool is_write, MemTxAttrs attrs)
28
{
29
hwaddr done = 0;
30
hwaddr xlat;
31
@@ -XXX,XX +XXX,XX @@ void *address_space_map(AddressSpace *as,
32
33
memory_region_ref(mr);
34
*plen = flatview_extend_translation(fv, addr, len, mr, xlat,
35
- l, is_write);
36
+ l, is_write, attrs);
37
ptr = qemu_ram_ptr_length(mr->ram_block, xlat, plen, true);
38
rcu_read_unlock();
39
40
@@ -XXX,XX +XXX,XX @@ int64_t address_space_cache_init(MemoryRegionCache *cache,
41
mr = cache->mrs.mr;
42
memory_region_ref(mr);
43
if (memory_access_is_direct(mr, is_write)) {
44
+ /* We don't care about the memory attributes here as we're only
45
+ * doing this if we found actual RAM, which behaves the same
46
+ * regardless of attributes; so UNSPECIFIED is fine.
47
+ */
48
l = flatview_extend_translation(cache->fv, addr, len, mr,
49
- cache->xlat, l, is_write);
50
+ cache->xlat, l, is_write,
51
+ MEMTXATTRS_UNSPECIFIED);
52
cache->ptr = qemu_ram_ptr_length(mr->ram_block, cache->xlat, &l, true);
53
} else {
54
cache->ptr = NULL;
55
--
24
--
56
2.17.1
25
2.17.1
57
26
58
27
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to address_space_translate()
3
and address_space_translate_cached(). Callers either have an
4
attrs value to hand, or don't care and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Message-id: 20180606152128.449-11-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-4-peter.maydell@linaro.org
10
---
6
---
11
include/exec/memory.h | 4 +++-
7
target/riscv/op_helper.c | 6 ++++--
12
accel/tcg/translate-all.c | 2 +-
8
1 file changed, 4 insertions(+), 2 deletions(-)
13
exec.c | 14 +++++++++-----
14
hw/vfio/common.c | 3 ++-
15
memory_ldst.inc.c | 18 +++++++++---------
16
target/riscv/helper.c | 2 +-
17
6 files changed, 25 insertions(+), 18 deletions(-)
18
9
19
diff --git a/include/exec/memory.h b/include/exec/memory.h
10
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
20
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
21
--- a/include/exec/memory.h
12
--- a/target/riscv/op_helper.c
22
+++ b/include/exec/memory.h
13
+++ b/target/riscv/op_helper.c
23
@@ -XXX,XX +XXX,XX @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
14
@@ -XXX,XX +XXX,XX @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
24
* #MemoryRegion.
15
if ((val_to_write & 3) == 0) {
25
* @len: pointer to length
16
env->stvec = val_to_write >> 2 << 2;
26
* @is_write: indicates the transfer direction
17
} else {
27
+ * @attrs: memory attributes
18
- qemu_log_mask(LOG_UNIMP, "CSR_STVEC: vectored traps not supported");
28
*/
19
+ qemu_log_mask(LOG_UNIMP,
29
MemoryRegion *flatview_translate(FlatView *fv,
20
+ "CSR_STVEC: vectored traps not supported\n");
30
hwaddr addr, hwaddr *xlat,
21
}
31
@@ -XXX,XX +XXX,XX @@ MemoryRegion *flatview_translate(FlatView *fv,
22
break;
32
23
case CSR_SCOUNTEREN:
33
static inline MemoryRegion *address_space_translate(AddressSpace *as,
24
@@ -XXX,XX +XXX,XX @@ void csr_write_helper(CPURISCVState *env, target_ulong val_to_write,
34
hwaddr addr, hwaddr *xlat,
25
if ((val_to_write & 3) == 0) {
35
- hwaddr *len, bool is_write)
26
env->mtvec = val_to_write >> 2 << 2;
36
+ hwaddr *len, bool is_write,
27
} else {
37
+ MemTxAttrs attrs)
28
- qemu_log_mask(LOG_UNIMP, "CSR_MTVEC: vectored traps not supported");
38
{
29
+ qemu_log_mask(LOG_UNIMP,
39
return flatview_translate(address_space_to_flatview(as),
30
+ "CSR_MTVEC: vectored traps not supported\n");
40
addr, xlat, len, is_write);
31
}
41
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
32
break;
42
index XXXXXXX..XXXXXXX 100644
33
case CSR_MCOUNTEREN:
43
--- a/accel/tcg/translate-all.c
44
+++ b/accel/tcg/translate-all.c
45
@@ -XXX,XX +XXX,XX @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
46
hwaddr l = 1;
47
48
rcu_read_lock();
49
- mr = address_space_translate(as, addr, &addr, &l, false);
50
+ mr = address_space_translate(as, addr, &addr, &l, false, attrs);
51
if (!(memory_region_is_ram(mr)
52
|| memory_region_is_romd(mr))) {
53
rcu_read_unlock();
54
diff --git a/exec.c b/exec.c
55
index XXXXXXX..XXXXXXX 100644
56
--- a/exec.c
57
+++ b/exec.c
58
@@ -XXX,XX +XXX,XX @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
59
rcu_read_lock();
60
while (len > 0) {
61
l = len;
62
- mr = address_space_translate(as, addr, &addr1, &l, true);
63
+ mr = address_space_translate(as, addr, &addr1, &l, true,
64
+ MEMTXATTRS_UNSPECIFIED);
65
66
if (!(memory_region_is_ram(mr) ||
67
memory_region_is_romd(mr))) {
68
@@ -XXX,XX +XXX,XX @@ void address_space_cache_destroy(MemoryRegionCache *cache)
69
*/
70
static inline MemoryRegion *address_space_translate_cached(
71
MemoryRegionCache *cache, hwaddr addr, hwaddr *xlat,
72
- hwaddr *plen, bool is_write)
73
+ hwaddr *plen, bool is_write, MemTxAttrs attrs)
74
{
75
MemoryRegionSection section;
76
MemoryRegion *mr;
77
@@ -XXX,XX +XXX,XX @@ address_space_read_cached_slow(MemoryRegionCache *cache, hwaddr addr,
78
MemoryRegion *mr;
79
80
l = len;
81
- mr = address_space_translate_cached(cache, addr, &addr1, &l, false);
82
+ mr = address_space_translate_cached(cache, addr, &addr1, &l, false,
83
+ MEMTXATTRS_UNSPECIFIED);
84
flatview_read_continue(cache->fv,
85
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
86
addr1, l, mr);
87
@@ -XXX,XX +XXX,XX @@ address_space_write_cached_slow(MemoryRegionCache *cache, hwaddr addr,
88
MemoryRegion *mr;
89
90
l = len;
91
- mr = address_space_translate_cached(cache, addr, &addr1, &l, true);
92
+ mr = address_space_translate_cached(cache, addr, &addr1, &l, true,
93
+ MEMTXATTRS_UNSPECIFIED);
94
flatview_write_continue(cache->fv,
95
addr, MEMTXATTRS_UNSPECIFIED, buf, len,
96
addr1, l, mr);
97
@@ -XXX,XX +XXX,XX @@ bool cpu_physical_memory_is_io(hwaddr phys_addr)
98
99
rcu_read_lock();
100
mr = address_space_translate(&address_space_memory,
101
- phys_addr, &phys_addr, &l, false);
102
+ phys_addr, &phys_addr, &l, false,
103
+ MEMTXATTRS_UNSPECIFIED);
104
105
res = !(memory_region_is_ram(mr) || memory_region_is_romd(mr));
106
rcu_read_unlock();
107
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
108
index XXXXXXX..XXXXXXX 100644
109
--- a/hw/vfio/common.c
110
+++ b/hw/vfio/common.c
111
@@ -XXX,XX +XXX,XX @@ static bool vfio_get_vaddr(IOMMUTLBEntry *iotlb, void **vaddr,
112
*/
113
mr = address_space_translate(&address_space_memory,
114
iotlb->translated_addr,
115
- &xlat, &len, writable);
116
+ &xlat, &len, writable,
117
+ MEMTXATTRS_UNSPECIFIED);
118
if (!memory_region_is_ram(mr)) {
119
error_report("iommu map to non memory area %"HWADDR_PRIx"",
120
xlat);
121
diff --git a/memory_ldst.inc.c b/memory_ldst.inc.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/memory_ldst.inc.c
124
+++ b/memory_ldst.inc.c
125
@@ -XXX,XX +XXX,XX @@ static inline uint32_t glue(address_space_ldl_internal, SUFFIX)(ARG1_DECL,
126
bool release_lock = false;
127
128
RCU_READ_LOCK();
129
- mr = TRANSLATE(addr, &addr1, &l, false);
130
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
131
if (l < 4 || !IS_DIRECT(mr, false)) {
132
release_lock |= prepare_mmio_access(mr);
133
134
@@ -XXX,XX +XXX,XX @@ static inline uint64_t glue(address_space_ldq_internal, SUFFIX)(ARG1_DECL,
135
bool release_lock = false;
136
137
RCU_READ_LOCK();
138
- mr = TRANSLATE(addr, &addr1, &l, false);
139
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
140
if (l < 8 || !IS_DIRECT(mr, false)) {
141
release_lock |= prepare_mmio_access(mr);
142
143
@@ -XXX,XX +XXX,XX @@ uint32_t glue(address_space_ldub, SUFFIX)(ARG1_DECL,
144
bool release_lock = false;
145
146
RCU_READ_LOCK();
147
- mr = TRANSLATE(addr, &addr1, &l, false);
148
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
149
if (!IS_DIRECT(mr, false)) {
150
release_lock |= prepare_mmio_access(mr);
151
152
@@ -XXX,XX +XXX,XX @@ static inline uint32_t glue(address_space_lduw_internal, SUFFIX)(ARG1_DECL,
153
bool release_lock = false;
154
155
RCU_READ_LOCK();
156
- mr = TRANSLATE(addr, &addr1, &l, false);
157
+ mr = TRANSLATE(addr, &addr1, &l, false, attrs);
158
if (l < 2 || !IS_DIRECT(mr, false)) {
159
release_lock |= prepare_mmio_access(mr);
160
161
@@ -XXX,XX +XXX,XX @@ void glue(address_space_stl_notdirty, SUFFIX)(ARG1_DECL,
162
bool release_lock = false;
163
164
RCU_READ_LOCK();
165
- mr = TRANSLATE(addr, &addr1, &l, true);
166
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
167
if (l < 4 || !IS_DIRECT(mr, true)) {
168
release_lock |= prepare_mmio_access(mr);
169
170
@@ -XXX,XX +XXX,XX @@ static inline void glue(address_space_stl_internal, SUFFIX)(ARG1_DECL,
171
bool release_lock = false;
172
173
RCU_READ_LOCK();
174
- mr = TRANSLATE(addr, &addr1, &l, true);
175
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
176
if (l < 4 || !IS_DIRECT(mr, true)) {
177
release_lock |= prepare_mmio_access(mr);
178
179
@@ -XXX,XX +XXX,XX @@ void glue(address_space_stb, SUFFIX)(ARG1_DECL,
180
bool release_lock = false;
181
182
RCU_READ_LOCK();
183
- mr = TRANSLATE(addr, &addr1, &l, true);
184
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
185
if (!IS_DIRECT(mr, true)) {
186
release_lock |= prepare_mmio_access(mr);
187
r = memory_region_dispatch_write(mr, addr1, val, 1, attrs);
188
@@ -XXX,XX +XXX,XX @@ static inline void glue(address_space_stw_internal, SUFFIX)(ARG1_DECL,
189
bool release_lock = false;
190
191
RCU_READ_LOCK();
192
- mr = TRANSLATE(addr, &addr1, &l, true);
193
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
194
if (l < 2 || !IS_DIRECT(mr, true)) {
195
release_lock |= prepare_mmio_access(mr);
196
197
@@ -XXX,XX +XXX,XX @@ static void glue(address_space_stq_internal, SUFFIX)(ARG1_DECL,
198
bool release_lock = false;
199
200
RCU_READ_LOCK();
201
- mr = TRANSLATE(addr, &addr1, &l, true);
202
+ mr = TRANSLATE(addr, &addr1, &l, true, attrs);
203
if (l < 8 || !IS_DIRECT(mr, true)) {
204
release_lock |= prepare_mmio_access(mr);
205
206
diff --git a/target/riscv/helper.c b/target/riscv/helper.c
207
index XXXXXXX..XXXXXXX 100644
208
--- a/target/riscv/helper.c
209
+++ b/target/riscv/helper.c
210
@@ -XXX,XX +XXX,XX @@ restart:
211
MemoryRegion *mr;
212
hwaddr l = sizeof(target_ulong), addr1;
213
mr = address_space_translate(cs->as, pte_addr,
214
- &addr1, &l, false);
215
+ &addr1, &l, false, MEMTXATTRS_UNSPECIFIED);
216
if (memory_access_is_direct(mr, true)) {
217
target_ulong *pte_pa =
218
qemu_map_ram_ptr(mr->ram_block, addr1);
219
--
34
--
220
2.17.1
35
2.17.1
221
36
222
37
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to tb_invalidate_phys_addr().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Acked-by: Max Filippov <jcmvbkbc@gmail.com>
5
Message-id: 20180606152128.449-12-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Message-id: 20180521140402.23318-3-peter.maydell@linaro.org
10
---
7
---
11
include/exec/exec-all.h | 5 +++--
8
target/xtensa/translate.c | 6 +++---
12
accel/tcg/translate-all.c | 2 +-
9
1 file changed, 3 insertions(+), 3 deletions(-)
13
exec.c | 2 +-
14
target/xtensa/op_helper.c | 3 ++-
15
4 files changed, 7 insertions(+), 5 deletions(-)
16
10
17
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
11
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
18
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/exec-all.h
13
--- a/target/xtensa/translate.c
20
+++ b/include/exec/exec-all.h
14
+++ b/target/xtensa/translate.c
21
@@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, target_ulong vaddr,
15
@@ -XXX,XX +XXX,XX @@ static void translate_rur(DisasContext *dc, const uint32_t arg[],
22
void tlb_set_page(CPUState *cpu, target_ulong vaddr,
16
if (uregnames[par[0]].name) {
23
hwaddr paddr, int prot,
17
tcg_gen_mov_i32(cpu_R[arg[0]], cpu_UR[par[0]]);
24
int mmu_idx, target_ulong size);
18
} else {
25
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr);
19
- qemu_log_mask(LOG_UNIMP, "RUR %d not implemented, ", par[0]);
26
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs);
20
+ qemu_log_mask(LOG_UNIMP, "RUR %d not implemented\n", par[0]);
27
void probe_write(CPUArchState *env, target_ulong addr, int size, int mmu_idx,
21
}
28
uintptr_t retaddr);
29
#else
30
@@ -XXX,XX +XXX,XX @@ static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
31
uint16_t idxmap)
32
{
33
}
34
-static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
35
+static inline void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr,
36
+ MemTxAttrs attrs)
37
{
38
}
39
#endif
40
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/accel/tcg/translate-all.c
43
+++ b/accel/tcg/translate-all.c
44
@@ -XXX,XX +XXX,XX @@ static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
45
}
46
47
#if !defined(CONFIG_USER_ONLY)
48
-void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr)
49
+void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs)
50
{
51
ram_addr_t ram_addr;
52
MemoryRegion *mr;
53
diff --git a/exec.c b/exec.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/exec.c
56
+++ b/exec.c
57
@@ -XXX,XX +XXX,XX @@ static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
58
if (phys != -1) {
59
/* Locks grabbed by tb_invalidate_phys_addr */
60
tb_invalidate_phys_addr(cpu->cpu_ases[asidx].as,
61
- phys | (pc & ~TARGET_PAGE_MASK));
62
+ phys | (pc & ~TARGET_PAGE_MASK), attrs);
63
}
22
}
64
}
23
}
65
#endif
24
@@ -XXX,XX +XXX,XX @@ static void translate_slli(DisasContext *dc, const uint32_t arg[],
66
diff --git a/target/xtensa/op_helper.c b/target/xtensa/op_helper.c
25
{
67
index XXXXXXX..XXXXXXX 100644
26
if (gen_window_check2(dc, arg[0], arg[1])) {
68
--- a/target/xtensa/op_helper.c
27
if (arg[2] == 32) {
69
+++ b/target/xtensa/op_helper.c
28
- qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined",
70
@@ -XXX,XX +XXX,XX @@ static void tb_invalidate_virtual_addr(CPUXtensaState *env, uint32_t vaddr)
29
+ qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined\n",
71
int ret = xtensa_get_physical_addr(env, false, vaddr, 2, 0,
30
arg[0], arg[1]);
72
&paddr, &page_size, &access);
31
}
73
if (ret == 0) {
32
tcg_gen_shli_i32(cpu_R[arg[0]], cpu_R[arg[1]], arg[2] & 0x1f);
74
- tb_invalidate_phys_addr(&address_space_memory, paddr);
33
@@ -XXX,XX +XXX,XX @@ static void translate_wur(DisasContext *dc, const uint32_t arg[],
75
+ tb_invalidate_phys_addr(&address_space_memory, paddr,
34
if (uregnames[par[0]].name) {
76
+ MEMTXATTRS_UNSPECIFIED);
35
gen_wur(par[0], cpu_R[arg[0]]);
36
} else {
37
- qemu_log_mask(LOG_UNIMP, "WUR %d not implemented, ", par[0]);
38
+ qemu_log_mask(LOG_UNIMP, "WUR %d not implemented\n", par[0]);
39
}
77
}
40
}
78
}
41
}
79
80
--
42
--
81
2.17.1
43
2.17.1
82
44
83
45
diff view generated by jsdifflib
1
Add entries to MAINTAINERS to cover the newer MPS2 boards and
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
the new devices they use.
3
2
3
The initial implementation is based on the Specs v1.10 (see a1bb27b1e98).
4
5
However the SCR is anouncing the card being v1.01.
6
7
The new chapters added in version 1.10 are:
8
9
4.3.10 Switch function command
10
11
Switch function command (CMD6) 1 is used to switch or expand
12
memory card functions. [...]
13
This is a new feature, introduced in SD physical Layer
14
Specification Version 1.10. Therefore, cards that are
15
compatible with earlier versions of the spec do not support
16
it. The host shall check the "SD_SPEC" field in the SCR
17
register to recognize what version of the spec the card
18
complies with before using CMD6. It is mandatory for SD
19
memory card of Ver1.10 to support CMD6.
20
21
4.3.11 High-Speed mode (25MB/sec interface speed)
22
23
Though the Rev 1.01 SD memory card supports up to 12.5MB/sec
24
interface speed, the speed of 25MB/sec is necessary to support
25
increasing performance needs of the host and because of memory
26
size which continues to grow.
27
To achieve 25MB/sec interface speed, clock rate is increased to
28
50MHz and CLK/CMD/DAT signal timing and circuit conditions are
29
reconsidered and changed from Physical Layer Specification
30
Version 1.01.
31
32
4.3.12 Command system (This chapter is newly added in version 1.10)
33
34
SD commands CMD34-37, CMD50, CMD57 are reserved for SD command
35
system expansion via the switch command.
36
[These commands] will be considered as illegal commands (as
37
defined in revision 1.01 of the SD physical layer specification).
38
39
The SWITCH_FUNCTION is implemented since the first commit, a1bb27b1e98.
40
41
The 25MB/sec High-Speed mode was already updated in d7ecb867529.
42
43
The current implementation does not implements CMD34-37, CMD50 and
44
CMD57, thus these commands already return ILLEGAL.
45
46
With this patch, the SCR register now matches the description of the header:
47
48
* SD Memory Card emulation as defined in the "SD Memory Card Physical
49
* layer specification, Version 1.10."
50
51
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
52
Message-id: 20180607180641.874-2-f4bug@amsat.org
53
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
54
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 20180518153157.14899-1-peter.maydell@linaro.org
6
---
55
---
7
MAINTAINERS | 9 +++++++--
56
hw/sd/sd.c | 4 ++--
8
1 file changed, 7 insertions(+), 2 deletions(-)
57
1 file changed, 2 insertions(+), 2 deletions(-)
9
58
10
diff --git a/MAINTAINERS b/MAINTAINERS
59
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
11
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
12
--- a/MAINTAINERS
61
--- a/hw/sd/sd.c
13
+++ b/MAINTAINERS
62
+++ b/hw/sd/sd.c
14
@@ -XXX,XX +XXX,XX @@ F: hw/timer/cmsdk-apb-timer.c
63
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
15
F: include/hw/timer/cmsdk-apb-timer.h
64
16
F: hw/char/cmsdk-apb-uart.c
65
static void sd_set_scr(SDState *sd)
17
F: include/hw/char/cmsdk-apb-uart.h
66
{
18
+F: hw/misc/tz-ppc.c
67
- sd->scr[0] = (0 << 4) /* SCR version 1.0 */
19
+F: include/hw/misc/tz-ppc.h
68
- | 0; /* Spec Versions 1.0 and 1.01 */
20
69
+ sd->scr[0] = (0 << 4) /* SCR structure version 1.0 */
21
ARM cores
70
+ | 1; /* Spec Version 1.10 */
22
M: Peter Maydell <peter.maydell@linaro.org>
71
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
23
@@ -XXX,XX +XXX,XX @@ M: Peter Maydell <peter.maydell@linaro.org>
72
| 0b0101; /* 1-bit or 4-bit width bus modes */
24
L: qemu-arm@nongnu.org
73
sd->scr[2] = 0x00; /* Extended Security is not supported. */
25
S: Maintained
26
F: hw/arm/mps2.c
27
-F: hw/misc/mps2-scc.c
28
-F: include/hw/misc/mps2-scc.h
29
+F: hw/arm/mps2-tz.c
30
+F: hw/misc/mps2-*.c
31
+F: include/hw/misc/mps2-*.h
32
+F: hw/arm/iotkit.c
33
+F: include/hw/arm/iotkit.h
34
35
Musicpal
36
M: Jan Kiszka <jan.kiszka@web.de>
37
--
74
--
38
2.17.1
75
2.17.1
39
76
40
77
diff view generated by jsdifflib
1
From: Francisco Iglesias <frasse.iglesias@gmail.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
Coverity found that the string return by 'object_get_canonical_path' was not
3
From the "Physical Layer Simplified Specification Version 1.10"
4
being freed at two locations in the model (CID 1391294 and CID 1391293) and
4
Chapter 7.3 "SPI Mode Transaction Packets"
5
also that a memset was being called with a value greater than the max of a byte
5
Table 57: "Commands and arguments"
6
on the second argument (CID 1391286). This patch corrects this by adding the
7
freeing of the strings and also changing to memset to zero instead on
8
descriptor unaligned errors.
9
6
10
Signed-off-by: Francisco Iglesias <frasse.iglesias@gmail.com>
7
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
8
Acked-by: Alistair Francis <alistair.francis@wdc.com>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
Message-id: 20180607180641.874-3-f4bug@amsat.org
13
Message-id: 20180528184859.3530-1-frasse.iglesias@gmail.com
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
12
---
17
hw/dma/xlnx-zdma.c | 10 +++++++---
13
hw/sd/sd.c | 14 --------------
18
1 file changed, 7 insertions(+), 3 deletions(-)
14
1 file changed, 14 deletions(-)
19
15
20
diff --git a/hw/dma/xlnx-zdma.c b/hw/dma/xlnx-zdma.c
16
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
21
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/dma/xlnx-zdma.c
18
--- a/hw/sd/sd.c
23
+++ b/hw/dma/xlnx-zdma.c
19
+++ b/hw/sd/sd.c
24
@@ -XXX,XX +XXX,XX @@ static bool zdma_load_descriptor(XlnxZDMA *s, uint64_t addr, void *buf)
20
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
25
qemu_log_mask(LOG_GUEST_ERROR,
21
return sd_illegal;
26
"zdma: unaligned descriptor at %" PRIx64,
22
27
addr);
23
case 6:    /* CMD6: SWITCH_FUNCTION */
28
- memset(buf, 0xdeadbeef, sizeof(XlnxZDMADescr));
24
- if (sd->spi)
29
+ memset(buf, 0x0, sizeof(XlnxZDMADescr));
25
- goto bad_cmd;
30
s->error = true;
26
switch (sd->mode) {
31
return false;
27
case sd_data_transfer_mode:
32
}
28
sd_function_switch(sd, req.arg);
33
@@ -XXX,XX +XXX,XX @@ static uint64_t zdma_read(void *opaque, hwaddr addr, unsigned size)
29
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
34
RegisterInfo *r = &s->regs_info[addr / 4];
30
35
31
/* Block write commands (Class 4) */
36
if (!r->data) {
32
case 24:    /* CMD24: WRITE_SINGLE_BLOCK */
37
+ gchar *path = object_get_canonical_path(OBJECT(s));
33
- if (sd->spi) {
38
qemu_log("%s: Decode error: read from %" HWADDR_PRIx "\n",
34
- goto unimplemented_spi_cmd;
39
- object_get_canonical_path(OBJECT(s)),
35
- }
40
+ path,
36
switch (sd->state) {
41
addr);
37
case sd_transfer_state:
42
+ g_free(path);
38
/* Writing in SPI mode not implemented. */
43
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
39
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
44
zdma_ch_imr_update_irq(s);
40
break;
45
return 0;
41
46
@@ -XXX,XX +XXX,XX @@ static void zdma_write(void *opaque, hwaddr addr, uint64_t value,
42
case 25:    /* CMD25: WRITE_MULTIPLE_BLOCK */
47
RegisterInfo *r = &s->regs_info[addr / 4];
43
- if (sd->spi) {
48
44
- goto unimplemented_spi_cmd;
49
if (!r->data) {
45
- }
50
+ gchar *path = object_get_canonical_path(OBJECT(s));
46
switch (sd->state) {
51
qemu_log("%s: Decode error: write to %" HWADDR_PRIx "=%" PRIx64 "\n",
47
case sd_transfer_state:
52
- object_get_canonical_path(OBJECT(s)),
48
/* Writing in SPI mode not implemented. */
53
+ path,
49
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
54
addr, value);
50
break;
55
+ g_free(path);
51
56
ARRAY_FIELD_DP32(s->regs, ZDMA_CH_ISR, INV_APB, true);
52
case 27:    /* CMD27: PROGRAM_CSD */
57
zdma_ch_imr_update_irq(s);
53
- if (sd->spi) {
58
return;
54
- goto unimplemented_spi_cmd;
55
- }
56
switch (sd->state) {
57
case sd_transfer_state:
58
sd->state = sd_receivingdata_state;
59
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
60
61
/* Lock card commands (Class 7) */
62
case 42:    /* CMD42: LOCK_UNLOCK */
63
- if (sd->spi) {
64
- goto unimplemented_spi_cmd;
65
- }
66
switch (sd->state) {
67
case sd_transfer_state:
68
sd->state = sd_receivingdata_state;
59
--
69
--
60
2.17.1
70
2.17.1
61
71
62
72
diff view generated by jsdifflib
1
As part of plumbing MemTxAttrs down to the IOMMU translate method,
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
add MemTxAttrs as an argument to address_space_access_valid().
3
Its callers either have an attrs value to hand, or don't care
4
and can use MEMTXATTRS_UNSPECIFIED.
5
2
3
As of this commit, the Spec v1 is not working, and all controllers
4
expect the cards to be conformant to Spec v2.
5
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20180607180641.874-4-f4bug@amsat.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20180521140402.23318-6-peter.maydell@linaro.org
10
---
10
---
11
include/exec/memory.h | 4 +++-
11
include/hw/sd/sd.h | 5 +++++
12
include/sysemu/dma.h | 3 ++-
12
hw/sd/sd.c | 23 ++++++++++++++++++++---
13
exec.c | 3 ++-
13
2 files changed, 25 insertions(+), 3 deletions(-)
14
target/s390x/diag.c | 6 ++++--
15
target/s390x/excp_helper.c | 3 ++-
16
target/s390x/mmu_helper.c | 3 ++-
17
target/s390x/sigp.c | 3 ++-
18
7 files changed, 17 insertions(+), 8 deletions(-)
19
14
20
diff --git a/include/exec/memory.h b/include/exec/memory.h
15
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/include/exec/memory.h
17
--- a/include/hw/sd/sd.h
23
+++ b/include/exec/memory.h
18
+++ b/include/hw/sd/sd.h
24
@@ -XXX,XX +XXX,XX @@ static inline MemoryRegion *address_space_translate(AddressSpace *as,
19
@@ -XXX,XX +XXX,XX @@
25
* @addr: address within that address space
20
#define APP_CMD            (1 << 5)
26
* @len: length of the area to be checked
21
#define AKE_SEQ_ERROR        (1 << 3)
27
* @is_write: indicates the transfer direction
22
28
+ * @attrs: memory attributes
23
+enum SDPhySpecificationVersion {
29
*/
24
+ SD_PHY_SPECv1_10_VERS = 1,
30
-bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write);
25
+ SD_PHY_SPECv2_00_VERS = 2,
31
+bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len,
26
+};
32
+ bool is_write, MemTxAttrs attrs);
27
+
33
28
typedef enum {
34
/* address_space_map: map a physical memory region into a host virtual address
29
SD_VOLTAGE_0_4V = 400, /* currently not supported */
30
SD_VOLTAGE_1_8V = 1800,
31
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/sd/sd.c
34
+++ b/hw/sd/sd.c
35
@@ -XXX,XX +XXX,XX @@
36
/*
37
* SD Memory Card emulation as defined in the "SD Memory Card Physical
38
- * layer specification, Version 1.10."
39
+ * layer specification, Version 2.00."
35
*
40
*
36
diff --git a/include/sysemu/dma.h b/include/sysemu/dma.h
41
* Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
37
index XXXXXXX..XXXXXXX 100644
42
* Copyright (c) 2007 CodeSourcery
38
--- a/include/sysemu/dma.h
43
+ * Copyright (c) 2018 Philippe Mathieu-Daudé <f4bug@amsat.org>
39
+++ b/include/sysemu/dma.h
44
*
40
@@ -XXX,XX +XXX,XX @@ static inline bool dma_memory_valid(AddressSpace *as,
45
* Redistribution and use in source and binary forms, with or without
41
DMADirection dir)
46
* modification, are permitted provided that the following conditions
47
@@ -XXX,XX +XXX,XX @@ struct SDState {
48
uint8_t sd_status[64];
49
50
/* Configurable properties */
51
+ uint8_t spec_version;
52
BlockBackend *blk;
53
bool spi;
54
55
@@ -XXX,XX +XXX,XX @@ static void sd_ocr_powerup(void *opaque)
56
57
static void sd_set_scr(SDState *sd)
42
{
58
{
43
return address_space_access_valid(as, addr, len,
59
- sd->scr[0] = (0 << 4) /* SCR structure version 1.0 */
44
- dir == DMA_DIRECTION_FROM_DEVICE);
60
- | 1; /* Spec Version 1.10 */
45
+ dir == DMA_DIRECTION_FROM_DEVICE,
61
+ sd->scr[0] = 0 << 4; /* SCR structure version 1.0 */
46
+ MEMTXATTRS_UNSPECIFIED);
62
+ if (sd->spec_version == SD_PHY_SPECv1_10_VERS) {
63
+ sd->scr[0] |= 1; /* Spec Version 1.10 */
64
+ } else {
65
+ sd->scr[0] |= 2; /* Spec Version 2.00 */
66
+ }
67
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
68
| 0b0101; /* 1-bit or 4-bit width bus modes */
69
sd->scr[2] = 0x00; /* Extended Security is not supported. */
70
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
71
72
sd->proto_name = sd->spi ? "SPI" : "SD";
73
74
+ switch (sd->spec_version) {
75
+ case SD_PHY_SPECv1_10_VERS
76
+ ... SD_PHY_SPECv2_00_VERS:
77
+ break;
78
+ default:
79
+ error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version);
80
+ return;
81
+ }
82
+
83
if (sd->blk && blk_is_read_only(sd->blk)) {
84
error_setg(errp, "Cannot use read-only drive as SD card");
85
return;
86
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
47
}
87
}
48
88
49
static inline int dma_memory_rw_relaxed(AddressSpace *as, dma_addr_t addr,
89
static Property sd_properties[] = {
50
diff --git a/exec.c b/exec.c
90
+ DEFINE_PROP_UINT8("spec_version", SDState,
51
index XXXXXXX..XXXXXXX 100644
91
+ spec_version, SD_PHY_SPECv2_00_VERS),
52
--- a/exec.c
92
DEFINE_PROP_DRIVE("drive", SDState, blk),
53
+++ b/exec.c
93
/* We do not model the chip select pin, so allow the board to select
54
@@ -XXX,XX +XXX,XX @@ static bool flatview_access_valid(FlatView *fv, hwaddr addr, int len,
94
* whether card should be in SSI or MMC/SD mode. It is also up to the
55
}
56
57
bool address_space_access_valid(AddressSpace *as, hwaddr addr,
58
- int len, bool is_write)
59
+ int len, bool is_write,
60
+ MemTxAttrs attrs)
61
{
62
FlatView *fv;
63
bool result;
64
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/s390x/diag.c
67
+++ b/target/s390x/diag.c
68
@@ -XXX,XX +XXX,XX @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra)
69
return;
70
}
71
if (!address_space_access_valid(&address_space_memory, addr,
72
- sizeof(IplParameterBlock), false)) {
73
+ sizeof(IplParameterBlock), false,
74
+ MEMTXATTRS_UNSPECIFIED)) {
75
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
76
return;
77
}
78
@@ -XXX,XX +XXX,XX @@ out:
79
return;
80
}
81
if (!address_space_access_valid(&address_space_memory, addr,
82
- sizeof(IplParameterBlock), true)) {
83
+ sizeof(IplParameterBlock), true,
84
+ MEMTXATTRS_UNSPECIFIED)) {
85
s390_program_interrupt(env, PGM_ADDRESSING, ILEN_AUTO, ra);
86
return;
87
}
88
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
89
index XXXXXXX..XXXXXXX 100644
90
--- a/target/s390x/excp_helper.c
91
+++ b/target/s390x/excp_helper.c
92
@@ -XXX,XX +XXX,XX @@ int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr orig_vaddr, int size,
93
94
/* check out of RAM access */
95
if (!address_space_access_valid(&address_space_memory, raddr,
96
- TARGET_PAGE_SIZE, rw)) {
97
+ TARGET_PAGE_SIZE, rw,
98
+ MEMTXATTRS_UNSPECIFIED)) {
99
DPRINTF("%s: raddr %" PRIx64 " > ram_size %" PRIx64 "\n", __func__,
100
(uint64_t)raddr, (uint64_t)ram_size);
101
trigger_pgm_exception(env, PGM_ADDRESSING, ILEN_AUTO);
102
diff --git a/target/s390x/mmu_helper.c b/target/s390x/mmu_helper.c
103
index XXXXXXX..XXXXXXX 100644
104
--- a/target/s390x/mmu_helper.c
105
+++ b/target/s390x/mmu_helper.c
106
@@ -XXX,XX +XXX,XX @@ static int translate_pages(S390CPU *cpu, vaddr addr, int nr_pages,
107
return ret;
108
}
109
if (!address_space_access_valid(&address_space_memory, pages[i],
110
- TARGET_PAGE_SIZE, is_write)) {
111
+ TARGET_PAGE_SIZE, is_write,
112
+ MEMTXATTRS_UNSPECIFIED)) {
113
trigger_access_exception(env, PGM_ADDRESSING, ILEN_AUTO, 0);
114
return -EFAULT;
115
}
116
diff --git a/target/s390x/sigp.c b/target/s390x/sigp.c
117
index XXXXXXX..XXXXXXX 100644
118
--- a/target/s390x/sigp.c
119
+++ b/target/s390x/sigp.c
120
@@ -XXX,XX +XXX,XX @@ static void sigp_set_prefix(CPUState *cs, run_on_cpu_data arg)
121
cpu_synchronize_state(cs);
122
123
if (!address_space_access_valid(&address_space_memory, addr,
124
- sizeof(struct LowCore), false)) {
125
+ sizeof(struct LowCore), false,
126
+ MEMTXATTRS_UNSPECIFIED)) {
127
set_sigp_status(si, SIGP_STAT_INVALID_PARAMETER);
128
return;
129
}
130
--
95
--
131
2.17.1
96
2.17.1
132
97
133
98
diff view generated by jsdifflib
1
From: Shannon Zhao <zhaoshenglong@huawei.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
kvm_irqchip_create called by kvm_init will call kvm_init_irq_routing to
3
CMD8 is "Reserved" in Spec v1.10.
4
initialize global capability variables. If we call kvm_init_irq_routing in
5
GIC realize function, previous allocated memory will leak.
6
4
7
Fix this by deleting the unnecessary call.
5
Spec v2.00 introduces the SEND_IF_COND command:
8
6
9
Signed-off-by: Shannon Zhao <zhaoshenglong@huawei.com>
7
6.4.1 Power Up
10
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
11
Message-id: 1527750994-14360-1-git-send-email-zhaoshenglong@huawei.com
9
CMD8 is newly added in the Physical Layer Specification Version
10
2.00 to support multiple voltage ranges and used to check whether
11
the card supports supplied voltage. The version 2.00 or later host
12
shall issue CMD8 and verify voltage before card initialization.
13
The host that does not support CMD8 shall supply high voltage range.
14
15
Message-Id: 201204252110.20873.paul@codesourcery.com
16
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
17
Message-id: 20180607180641.874-5-f4bug@amsat.org
18
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
20
---
14
hw/intc/arm_gic_kvm.c | 1 -
21
hw/sd/sd.c | 4 +++-
15
hw/intc/arm_gicv3_kvm.c | 1 -
22
1 file changed, 3 insertions(+), 1 deletion(-)
16
2 files changed, 2 deletions(-)
17
23
18
diff --git a/hw/intc/arm_gic_kvm.c b/hw/intc/arm_gic_kvm.c
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
19
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/intc/arm_gic_kvm.c
26
--- a/hw/sd/sd.c
21
+++ b/hw/intc/arm_gic_kvm.c
27
+++ b/hw/sd/sd.c
22
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gic_realize(DeviceState *dev, Error **errp)
28
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
23
29
break;
24
if (kvm_has_gsi_routing()) {
30
25
/* set up irq routing */
31
case 8:    /* CMD8: SEND_IF_COND */
26
- kvm_init_irq_routing(kvm_state);
32
- /* Physical Layer Specification Version 2.00 command */
27
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
33
+ if (sd->spec_version < SD_PHY_SPECv2_00_VERS) {
28
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
34
+ break;
29
}
35
+ }
30
diff --git a/hw/intc/arm_gicv3_kvm.c b/hw/intc/arm_gicv3_kvm.c
36
if (sd->state != sd_idle_state) {
31
index XXXXXXX..XXXXXXX 100644
37
break;
32
--- a/hw/intc/arm_gicv3_kvm.c
33
+++ b/hw/intc/arm_gicv3_kvm.c
34
@@ -XXX,XX +XXX,XX @@ static void kvm_arm_gicv3_realize(DeviceState *dev, Error **errp)
35
36
if (kvm_has_gsi_routing()) {
37
/* set up irq routing */
38
- kvm_init_irq_routing(kvm_state);
39
for (i = 0; i < s->num_irq - GIC_INTERNAL; ++i) {
40
kvm_irqchip_add_irq_route(kvm_state, i, 0, i);
41
}
38
}
42
--
39
--
43
2.17.1
40
2.17.1
44
41
45
42
diff view generated by jsdifflib
1
Add more detail to the documentation for memory_region_init_iommu()
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
and other IOMMU-related functions and data structures.
3
2
3
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Message-id: 20180607180641.874-6-f4bug@amsat.org
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Eric Auger <eric.auger@redhat.com>
8
Message-id: 20180521140402.23318-2-peter.maydell@linaro.org
9
---
7
---
10
include/exec/memory.h | 105 ++++++++++++++++++++++++++++++++++++++----
8
include/hw/sd/sd.h | 1 +
11
1 file changed, 95 insertions(+), 10 deletions(-)
9
hw/sd/sd.c | 7 +++++--
10
2 files changed, 6 insertions(+), 2 deletions(-)
12
11
13
diff --git a/include/exec/memory.h b/include/exec/memory.h
12
diff --git a/include/hw/sd/sd.h b/include/hw/sd/sd.h
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/include/exec/memory.h
14
--- a/include/hw/sd/sd.h
16
+++ b/include/exec/memory.h
15
+++ b/include/hw/sd/sd.h
17
@@ -XXX,XX +XXX,XX @@ enum IOMMUMemoryRegionAttr {
16
@@ -XXX,XX +XXX,XX @@
18
IOMMU_ATTR_SPAPR_TCE_FD
17
enum SDPhySpecificationVersion {
18
SD_PHY_SPECv1_10_VERS = 1,
19
SD_PHY_SPECv2_00_VERS = 2,
20
+ SD_PHY_SPECv3_01_VERS = 3,
19
};
21
};
20
22
21
+/**
23
typedef enum {
22
+ * IOMMUMemoryRegionClass:
24
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
23
+ *
25
index XXXXXXX..XXXXXXX 100644
24
+ * All IOMMU implementations need to subclass TYPE_IOMMU_MEMORY_REGION
26
--- a/hw/sd/sd.c
25
+ * and provide an implementation of at least the @translate method here
27
+++ b/hw/sd/sd.c
26
+ * to handle requests to the memory region. Other methods are optional.
28
@@ -XXX,XX +XXX,XX @@ static void sd_set_scr(SDState *sd)
27
+ *
29
if (sd->spec_version == SD_PHY_SPECv1_10_VERS) {
28
+ * The IOMMU implementation must use the IOMMU notifier infrastructure
30
sd->scr[0] |= 1; /* Spec Version 1.10 */
29
+ * to report whenever mappings are changed, by calling
31
} else {
30
+ * memory_region_notify_iommu() (or, if necessary, by calling
32
- sd->scr[0] |= 2; /* Spec Version 2.00 */
31
+ * memory_region_notify_one() for each registered notifier).
33
+ sd->scr[0] |= 2; /* Spec Version 2.00 or Version 3.0X */
32
+ */
34
}
33
typedef struct IOMMUMemoryRegionClass {
35
sd->scr[1] = (2 << 4) /* SDSC Card (Security Version 1.01) */
34
/* private */
36
| 0b0101; /* 1-bit or 4-bit width bus modes */
35
struct DeviceClass parent_class;
37
sd->scr[2] = 0x00; /* Extended Security is not supported. */
36
38
+ if (sd->spec_version >= SD_PHY_SPECv3_01_VERS) {
37
/*
39
+ sd->scr[2] |= 1 << 7; /* Spec Version 3.0X */
38
- * Return a TLB entry that contains a given address. Flag should
40
+ }
39
- * be the access permission of this translation operation. We can
41
sd->scr[3] = 0x00;
40
- * set flag to IOMMU_NONE to mean that we don't need any
42
/* reserved for manufacturer usage */
41
- * read/write permission checks, like, when for region replay.
43
sd->scr[4] = 0x00;
42
+ * Return a TLB entry that contains a given address.
44
@@ -XXX,XX +XXX,XX @@ static void sd_realize(DeviceState *dev, Error **errp)
43
+ *
45
44
+ * The IOMMUAccessFlags indicated via @flag are optional and may
46
switch (sd->spec_version) {
45
+ * be specified as IOMMU_NONE to indicate that the caller needs
47
case SD_PHY_SPECv1_10_VERS
46
+ * the full translation information for both reads and writes. If
48
- ... SD_PHY_SPECv2_00_VERS:
47
+ * the access flags are specified then the IOMMU implementation
49
+ ... SD_PHY_SPECv3_01_VERS:
48
+ * may use this as an optimization, to stop doing a page table
50
break;
49
+ * walk as soon as it knows that the requested permissions are not
51
default:
50
+ * allowed. If IOMMU_NONE is passed then the IOMMU must do the
52
error_setg(errp, "Invalid SD card Spec version: %u", sd->spec_version);
51
+ * full page table walk and report the permissions in the returned
52
+ * IOMMUTLBEntry. (Note that this implies that an IOMMU may not
53
+ * return different mappings for reads and writes.)
54
+ *
55
+ * The returned information remains valid while the caller is
56
+ * holding the big QEMU lock or is inside an RCU critical section;
57
+ * if the caller wishes to cache the mapping beyond that it must
58
+ * register an IOMMU notifier so it can invalidate its cached
59
+ * information when the IOMMU mapping changes.
60
+ *
61
+ * @iommu: the IOMMUMemoryRegion
62
+ * @hwaddr: address to be translated within the memory region
63
+ * @flag: requested access permissions
64
*/
65
IOMMUTLBEntry (*translate)(IOMMUMemoryRegion *iommu, hwaddr addr,
66
IOMMUAccessFlags flag);
67
- /* Returns minimum supported page size */
68
+ /* Returns minimum supported page size in bytes.
69
+ * If this method is not provided then the minimum is assumed to
70
+ * be TARGET_PAGE_SIZE.
71
+ *
72
+ * @iommu: the IOMMUMemoryRegion
73
+ */
74
uint64_t (*get_min_page_size)(IOMMUMemoryRegion *iommu);
75
- /* Called when IOMMU Notifier flag changed */
76
+ /* Called when IOMMU Notifier flag changes (ie when the set of
77
+ * events which IOMMU users are requesting notification for changes).
78
+ * Optional method -- need not be provided if the IOMMU does not
79
+ * need to know exactly which events must be notified.
80
+ *
81
+ * @iommu: the IOMMUMemoryRegion
82
+ * @old_flags: events which previously needed to be notified
83
+ * @new_flags: events which now need to be notified
84
+ */
85
void (*notify_flag_changed)(IOMMUMemoryRegion *iommu,
86
IOMMUNotifierFlag old_flags,
87
IOMMUNotifierFlag new_flags);
88
- /* Set this up to provide customized IOMMU replay function */
89
+ /* Called to handle memory_region_iommu_replay().
90
+ *
91
+ * The default implementation of memory_region_iommu_replay() is to
92
+ * call the IOMMU translate method for every page in the address space
93
+ * with flag == IOMMU_NONE and then call the notifier if translate
94
+ * returns a valid mapping. If this method is implemented then it
95
+ * overrides the default behaviour, and must provide the full semantics
96
+ * of memory_region_iommu_replay(), by calling @notifier for every
97
+ * translation present in the IOMMU.
98
+ *
99
+ * Optional method -- an IOMMU only needs to provide this method
100
+ * if the default is inefficient or produces undesirable side effects.
101
+ *
102
+ * Note: this is not related to record-and-replay functionality.
103
+ */
104
void (*replay)(IOMMUMemoryRegion *iommu, IOMMUNotifier *notifier);
105
106
- /* Get IOMMU misc attributes */
107
- int (*get_attr)(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr,
108
+ /* Get IOMMU misc attributes. This is an optional method that
109
+ * can be used to allow users of the IOMMU to get implementation-specific
110
+ * information. The IOMMU implements this method to handle calls
111
+ * by IOMMU users to memory_region_iommu_get_attr() by filling in
112
+ * the arbitrary data pointer for any IOMMUMemoryRegionAttr values that
113
+ * the IOMMU supports. If the method is unimplemented then
114
+ * memory_region_iommu_get_attr() will always return -EINVAL.
115
+ *
116
+ * @iommu: the IOMMUMemoryRegion
117
+ * @attr: attribute being queried
118
+ * @data: memory to fill in with the attribute data
119
+ *
120
+ * Returns 0 on success, or a negative errno; in particular
121
+ * returns -EINVAL for unrecognized or unimplemented attribute types.
122
+ */
123
+ int (*get_attr)(IOMMUMemoryRegion *iommu, enum IOMMUMemoryRegionAttr attr,
124
void *data);
125
} IOMMUMemoryRegionClass;
126
127
@@ -XXX,XX +XXX,XX @@ static inline void memory_region_init_reservation(MemoryRegion *mr,
128
* An IOMMU region translates addresses and forwards accesses to a target
129
* memory region.
130
*
131
+ * The IOMMU implementation must define a subclass of TYPE_IOMMU_MEMORY_REGION.
132
+ * @_iommu_mr should be a pointer to enough memory for an instance of
133
+ * that subclass, @instance_size is the size of that subclass, and
134
+ * @mrtypename is its name. This function will initialize @_iommu_mr as an
135
+ * instance of the subclass, and its methods will then be called to handle
136
+ * accesses to the memory region. See the documentation of
137
+ * #IOMMUMemoryRegionClass for further details.
138
+ *
139
* @_iommu_mr: the #IOMMUMemoryRegion to be initialized
140
* @instance_size: the IOMMUMemoryRegion subclass instance size
141
* @mrtypename: the type name of the #IOMMUMemoryRegion
142
@@ -XXX,XX +XXX,XX @@ void memory_region_register_iommu_notifier(MemoryRegion *mr,
143
* a notifier with the minimum page granularity returned by
144
* mr->iommu_ops->get_page_size().
145
*
146
+ * Note: this is not related to record-and-replay functionality.
147
+ *
148
* @iommu_mr: the memory region to observe
149
* @n: the notifier to which to replay iommu mappings
150
*/
151
@@ -XXX,XX +XXX,XX @@ void memory_region_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n);
152
* memory_region_iommu_replay_all: replay existing IOMMU translations
153
* to all the notifiers registered.
154
*
155
+ * Note: this is not related to record-and-replay functionality.
156
+ *
157
* @iommu_mr: the memory region to observe
158
*/
159
void memory_region_iommu_replay_all(IOMMUMemoryRegion *iommu_mr);
160
@@ -XXX,XX +XXX,XX @@ void memory_region_unregister_iommu_notifier(MemoryRegion *mr,
161
* memory_region_iommu_get_attr: return an IOMMU attr if get_attr() is
162
* defined on the IOMMU.
163
*
164
- * Returns 0 if succeded, error code otherwise.
165
+ * Returns 0 on success, or a negative errno otherwise. In particular,
166
+ * -EINVAL indicates that the IOMMU does not support the requested
167
+ * attribute.
168
*
169
* @iommu_mr: the memory region
170
* @attr: the requested attribute
171
--
53
--
172
2.17.1
54
2.17.1
173
55
174
56
diff view generated by jsdifflib
1
From: Jan Kiszka <jan.kiszka@siemens.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
There was a nasty flip in identifying which register group an access is
3
These commands got introduced by Spec v3
4
targeting. The issue caused spuriously raised priorities of the guest
4
(see 0c3fb03f7ec and 4481bbc79d2).
5
when handing CPUs over in the Jailhouse hypervisor.
6
5
7
Cc: qemu-stable@nongnu.org
6
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
8
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
7
Message-id: 20180607180641.874-7-f4bug@amsat.org
9
Message-id: 28b927d3-da58-bce4-cc13-bfec7f9b1cb9@siemens.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
10
---
13
hw/intc/arm_gicv3_cpuif.c | 12 ++++++------
11
hw/sd/sd.c | 6 ++++++
14
1 file changed, 6 insertions(+), 6 deletions(-)
12
1 file changed, 6 insertions(+)
15
13
16
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
14
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/intc/arm_gicv3_cpuif.c
16
--- a/hw/sd/sd.c
19
+++ b/hw/intc/arm_gicv3_cpuif.c
17
+++ b/hw/sd/sd.c
20
@@ -XXX,XX +XXX,XX @@ static uint64_t icv_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
18
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
21
{
19
break;
22
GICv3CPUState *cs = icc_cs_from_env(env);
20
23
int regno = ri->opc2 & 3;
21
case 19: /* CMD19: SEND_TUNING_BLOCK (SD) */
24
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
22
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
25
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
23
+ break;
26
uint64_t value = cs->ich_apr[grp][regno];
24
+ }
27
25
if (sd->state == sd_transfer_state) {
28
trace_gicv3_icv_ap_read(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
26
sd->state = sd_sendingdata_state;
29
@@ -XXX,XX +XXX,XX @@ static void icv_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
27
sd->data_offset = 0;
30
{
28
@@ -XXX,XX +XXX,XX @@ static sd_rsp_type_t sd_normal_command(SDState *sd, SDRequest req)
31
GICv3CPUState *cs = icc_cs_from_env(env);
29
break;
32
int regno = ri->opc2 & 3;
30
33
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
31
case 23: /* CMD23: SET_BLOCK_COUNT */
34
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
32
+ if (sd->spec_version < SD_PHY_SPECv3_01_VERS) {
35
33
+ break;
36
trace_gicv3_icv_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
34
+ }
37
35
switch (sd->state) {
38
@@ -XXX,XX +XXX,XX @@ static uint64_t icc_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
36
case sd_transfer_state:
39
uint64_t value;
37
sd->multi_blk_cnt = req.arg;
40
41
int regno = ri->opc2 & 3;
42
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
43
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
44
45
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
46
return icv_ap_read(env, ri);
47
@@ -XXX,XX +XXX,XX @@ static void icc_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
48
GICv3CPUState *cs = icc_cs_from_env(env);
49
50
int regno = ri->opc2 & 3;
51
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1;
52
+ int grp = (ri->crm & 1) ? GICV3_G1 : GICV3_G0;
53
54
if (icv_access(env, grp == GICV3_G0 ? HCR_FMO : HCR_IMO)) {
55
icv_ap_write(env, ri, value);
56
@@ -XXX,XX +XXX,XX @@ static uint64_t ich_ap_read(CPUARMState *env, const ARMCPRegInfo *ri)
57
{
58
GICv3CPUState *cs = icc_cs_from_env(env);
59
int regno = ri->opc2 & 3;
60
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
61
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
62
uint64_t value;
63
64
value = cs->ich_apr[grp][regno];
65
@@ -XXX,XX +XXX,XX @@ static void ich_ap_write(CPUARMState *env, const ARMCPRegInfo *ri,
66
{
67
GICv3CPUState *cs = icc_cs_from_env(env);
68
int regno = ri->opc2 & 3;
69
- int grp = ri->crm & 1 ? GICV3_G0 : GICV3_G1NS;
70
+ int grp = (ri->crm & 1) ? GICV3_G1NS : GICV3_G0;
71
72
trace_gicv3_ich_ap_write(ri->crm & 1, regno, gicv3_redist_affid(cs), value);
73
74
--
38
--
75
2.17.1
39
2.17.1
76
40
77
41
diff view generated by jsdifflib