1
ARM queue for 2.10 soft freeze...
1
First target-arm pullreq of the 4.0 series; most of this
2
is Mao's cleanups that finally let us drop sysbus::init;
3
the most interesting user-visible feature is RTH's patches
4
adding some v8.1 and v8.2 architecture features.
2
5
3
thanks
6
thanks
4
-- PMM
7
-- PMM
5
8
6
The following changes since commit 6632f6ff96f0537fc34cdc00c760656fc62e23c5:
9
The following changes since commit 6145a6d84b3bf0f25935b88543febe076c61b0f4:
7
10
8
Merge remote-tracking branch 'remotes/famz/tags/block-and-testing-pull-request' into staging (2017-07-17 11:46:36 +0100)
11
Merge remote-tracking branch 'remotes/cohuck/tags/s390x-20181212' into staging (2018-12-13 13:06:09 +0000)
9
12
10
are available in the git repository at:
13
are available in the Git repository at:
11
14
12
git://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20170717
15
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20181213
13
16
14
for you to fetch changes up to e5a6a6e64e82a132cebef023d867085b0a2993d7:
17
for you to fetch changes up to 2d7137c10fafefe40a0a049ff8a7bd78b66e661f:
15
18
16
MAINTAINERS: Add entries for MPS2 board (2017-07-17 13:36:09 +0100)
19
target/arm: Implement the ARMv8.1-LOR extension (2018-12-13 14:41:24 +0000)
17
20
18
----------------------------------------------------------------
21
----------------------------------------------------------------
19
target-arm queue:
22
target-arm queue:
20
* new model of the ARM MPS2/MPS2+ FPGA based development board
23
* Convert various devices from sysbus init to instance_init
21
* clean up DISAS_* exit conditions and fix various regressions
24
* Remove the now unused sysbus init support entirely
22
since commits e75449a346 8a6b28c7b5 (in particular including
25
* Allow AArch64 processors to boot from a kernel placed over 4GB
23
ones which broke OP-TEE guests)
26
* hw: arm: musicpal: drop TYPE_WM8750 in object_property_set_link()
24
* make Cortex-M3 and M4 correctly default to 8 PMSA regions
27
* versal: minor fixes to virtio-mmio instantation
28
* arm: Implement the ARMv8.1-HPD extension
29
* arm: Implement the ARMv8.2-AA32HPD extension
30
* arm: Implement the ARMv8.1-LOR extension (as the trivial
31
"no limited ordering regions provided" minimum)
25
32
26
----------------------------------------------------------------
33
----------------------------------------------------------------
27
Alex Bennée (6):
34
Edgar E. Iglesias (4):
28
include/exec/exec-all: document common exit conditions
35
hw/arm: versal: Remove bogus virtio-mmio creation
29
target/arm/translate: make DISAS_UPDATE match declared semantics
36
hw/arm: versal: Reduce number of virtio-mmio instances
30
target/arm/translate.h: expand comment on DISAS_EXIT
37
hw/arm: versal: Use IRQs 111 - 118 for virtio-mmio
31
target/arm/translate: ensure gen_goto_tb sets exit flags
38
hw/arm: versal: Correct the nr of IRQs to 192
32
target/arm: use gen_goto_tb for ISB handling
33
target/arm: use DISAS_EXIT for eret handling
34
39
35
Peter Maydell (12):
40
Li Qiang (1):
36
qdev-properties.h: Explicitly set the default value for arraylen properties
41
hw: arm: musicpal: drop TYPE_WM8750 in object_property_set_link()
37
qdev: support properties which don't set a default value
38
target/arm: Make Cortex-M3 and M4 default to 8 PMSA regions
39
hw/arm/mps2: Implement skeleton mps2-an385 and mps2-an511 board models
40
hw/char/cmsdk-apb-uart.c: Implement CMSDK APB UART
41
hw/arm/mps2: Add UARTs
42
hw/char/cmsdk-apb-timer: Implement CMSDK APB timer device
43
hw/arm/mps2: Add timers
44
hw/misc/mps2_scc: Implement MPS2 Serial Communication Controller
45
hw/arm/mps2: Add SCC
46
hw/arm/mps2: Add ethernet
47
MAINTAINERS: Add entries for MPS2 board
48
42
49
hw/arm/Makefile.objs | 1 +
43
Mao Zhongyi (21):
50
hw/char/Makefile.objs | 1 +
44
musicpal: Convert sysbus init function to realize function
51
hw/misc/Makefile.objs | 1 +
45
block/noenand: Convert sysbus init function to realize function
52
hw/timer/Makefile.objs | 1 +
46
char/grlib_apbuart: Convert sysbus init function to realize function
53
include/exec/exec-all.h | 29 ++-
47
core/empty_slot: Convert sysbus init function to realize function
54
include/hw/char/cmsdk-apb-uart.h | 78 +++++++
48
display/g364fb: Convert sysbus init function to realize function
55
include/hw/misc/mps2-scc.h | 43 ++++
49
dma/puv3_dma: Convert sysbus init function to realize function
56
include/hw/qdev-core.h | 10 +
50
gpio/puv3_gpio: Convert sysbus init function to realize function
57
include/hw/qdev-properties.h | 21 ++
51
milkymist-softusb: Convert sysbus init function to realize function
58
include/hw/timer/cmsdk-apb-timer.h | 59 ++++++
52
input/pl050: Convert sysbus init function to realize function
59
target/arm/translate.h | 5 +-
53
intc/puv3_intc: Convert sysbus init function to realize function
60
hw/arm/mps2.c | 385 +++++++++++++++++++++++++++++++++++
54
milkymist-hpdmc: Convert sysbus init function to realize function
61
hw/char/cmsdk-apb-uart.c | 403 +++++++++++++++++++++++++++++++++++++
55
milkymist-pfpu: Convert sysbus init function to realize function
62
hw/core/qdev.c | 2 +-
56
puv3_pm.c: Convert sysbus init function to realize function
63
hw/misc/mps2-scc.c | 310 ++++++++++++++++++++++++++++
57
nvram/ds1225y: Convert sysbus init function to realize function
64
hw/timer/cmsdk-apb-timer.c | 253 +++++++++++++++++++++++
58
pci-bridge/dec: Convert sysbus init function to realize function
65
target/arm/cpu.c | 12 +-
59
timer/etraxfs_timer: Convert sysbus init function to realize function
66
target/arm/translate-a64.c | 19 +-
60
timer/grlib_gptimer: Convert sysbus init function to realize function
67
target/arm/translate.c | 22 +-
61
timer/puv3_ost: Convert sysbus init function to realize function
68
MAINTAINERS | 14 +-
62
usb/tusb6010: Convert sysbus init function to realize function
69
default-configs/arm-softmmu.mak | 6 +
63
xen_backend: remove xen_sysdev_init() function
70
hw/char/trace-events | 9 +
64
core/sysbus: remove the SysBusDeviceClass::init path
71
hw/misc/trace-events | 8 +
72
hw/timer/trace-events | 5 +
73
24 files changed, 1673 insertions(+), 24 deletions(-)
74
create mode 100644 include/hw/char/cmsdk-apb-uart.h
75
create mode 100644 include/hw/misc/mps2-scc.h
76
create mode 100644 include/hw/timer/cmsdk-apb-timer.h
77
create mode 100644 hw/arm/mps2.c
78
create mode 100644 hw/char/cmsdk-apb-uart.c
79
create mode 100644 hw/misc/mps2-scc.c
80
create mode 100644 hw/timer/cmsdk-apb-timer.c
81
65
66
Peter Maydell (1):
67
target/arm: Move id_aa64mmfr* to ARMISARegisters
68
69
Ricardo Perez Blanco (1):
70
Allow AArch64 processors to boot from a kernel placed over 4GB
71
72
Richard Henderson (9):
73
target/arm: Add HCR_EL2 bits up to ARMv8.5
74
target/arm: Add SCR_EL3 bits up to ARMv8.5
75
target/arm: Fix HCR_EL2.TGE check in arm_phys_excp_target_el
76
target/arm: Tidy scr_write
77
target/arm: Implement the ARMv8.1-HPD extension
78
target/arm: Implement the ARMv8.2-AA32HPD extension
79
target/arm: Introduce arm_hcr_el2_eff
80
target/arm: Use arm_hcr_el2_eff more places
81
target/arm: Implement the ARMv8.1-LOR extension
82
83
include/hw/arm/xlnx-versal.h | 8 +-
84
include/hw/sysbus.h | 3 -
85
target/arm/cpu.h | 141 ++++++++++++++++-----------
86
target/arm/internals.h | 3 +-
87
hw/arm/boot.c | 35 ++++---
88
hw/arm/musicpal.c | 11 +--
89
hw/arm/xlnx-versal-virt.c | 7 +-
90
hw/block/onenand.c | 16 ++--
91
hw/char/grlib_apbuart.c | 12 +--
92
hw/core/empty_slot.c | 9 +-
93
hw/core/sysbus.c | 15 +--
94
hw/display/g364fb.c | 9 +-
95
hw/dma/puv3_dma.c | 10 +-
96
hw/gpio/puv3_gpio.c | 29 +++---
97
hw/input/milkymist-softusb.c | 16 ++--
98
hw/input/pl050.c | 11 +--
99
hw/intc/arm_gicv3_cpuif.c | 21 ++--
100
hw/intc/puv3_intc.c | 11 +--
101
hw/misc/milkymist-hpdmc.c | 9 +-
102
hw/misc/milkymist-pfpu.c | 12 +--
103
hw/misc/puv3_pm.c | 10 +-
104
hw/nvram/ds1225y.c | 12 +--
105
hw/pci-bridge/dec.c | 12 +--
106
hw/timer/etraxfs_timer.c | 14 +--
107
hw/timer/grlib_gptimer.c | 11 +--
108
hw/timer/puv3_ost.c | 13 ++-
109
hw/usb/tusb6010.c | 8 +-
110
hw/xen/xen_backend.c | 7 --
111
target/arm/cpu.c | 4 +
112
target/arm/cpu64.c | 11 ++-
113
target/arm/helper.c | 222 ++++++++++++++++++++++++++++++++++++-------
114
target/arm/kvm64.c | 4 +
115
target/arm/op_helper.c | 14 ++-
116
target/arm/translate-a64.c | 12 +++
117
34 files changed, 456 insertions(+), 286 deletions(-)
118
diff view generated by jsdifflib
New patch
1
From: Li Qiang <liq3ea@gmail.com>
1
2
3
The third argument of object_property_set_link() is the name of
4
property, not related with the QOM type name, using the constant
5
string instead.
6
7
Signed-off-by: Li Qiang <liq3ea@gmail.com>
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
9
Message-id: 1542880825-2604-1-git-send-email-liq3ea@gmail.com
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/arm/musicpal.c | 2 +-
14
1 file changed, 1 insertion(+), 1 deletion(-)
15
16
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/musicpal.c
19
+++ b/hw/arm/musicpal.c
20
@@ -XXX,XX +XXX,XX @@ static void musicpal_init(MachineState *machine)
21
dev = qdev_create(NULL, TYPE_MV88W8618_AUDIO);
22
s = SYS_BUS_DEVICE(dev);
23
object_property_set_link(OBJECT(dev), OBJECT(wm8750_dev),
24
- TYPE_WM8750, NULL);
25
+ "wm8750", NULL);
26
qdev_init_nofail(dev);
27
sysbus_mmio_map(s, 0, MP_AUDIO_BASE);
28
sysbus_connect_irq(s, 0, pic[MP_AUDIO_IRQ]);
29
--
30
2.19.2
31
32
diff view generated by jsdifflib
New patch
1
From: Ricardo Perez Blanco <ricardo.perez_blanco@nokia.com>
1
2
3
Architecturally, it's possible for an AArch64 machine to have
4
all of its RAM over the 4GB mark, but our kernel/initrd loading
5
code in boot.c assumes that the upper half of the addresses
6
to load these images to is always zero. Write the whole 64 bit
7
address into the bootloader code fragment, not just the low half.
8
9
Note that, currently, none of the existing QEMU machines have
10
their main memory over 4GBs, so this was not a user-visible bug.
11
12
Signed-off-by: Ricardo Perez Blanco <ricardo.perez_blanco@nokia.com>
13
[PMM: revised commit message and tweaked some long lines]
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/arm/boot.c | 35 ++++++++++++++++++++++-------------
18
1 file changed, 22 insertions(+), 13 deletions(-)
19
20
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/boot.c
23
+++ b/hw/arm/boot.c
24
@@ -XXX,XX +XXX,XX @@ typedef enum {
25
FIXUP_TERMINATOR, /* end of insns */
26
FIXUP_BOARDID, /* overwrite with board ID number */
27
FIXUP_BOARD_SETUP, /* overwrite with board specific setup code address */
28
- FIXUP_ARGPTR, /* overwrite with pointer to kernel args */
29
- FIXUP_ENTRYPOINT, /* overwrite with kernel entry point */
30
+ FIXUP_ARGPTR_LO, /* overwrite with pointer to kernel args */
31
+ FIXUP_ARGPTR_HI, /* overwrite with pointer to kernel args (high half) */
32
+ FIXUP_ENTRYPOINT_LO, /* overwrite with kernel entry point */
33
+ FIXUP_ENTRYPOINT_HI, /* overwrite with kernel entry point (high half) */
34
FIXUP_GIC_CPU_IF, /* overwrite with GIC CPU interface address */
35
FIXUP_BOOTREG, /* overwrite with boot register address */
36
FIXUP_DSB, /* overwrite with correct DSB insn for cpu */
37
@@ -XXX,XX +XXX,XX @@ static const ARMInsnFixup bootloader_aarch64[] = {
38
{ 0xaa1f03e3 }, /* mov x3, xzr */
39
{ 0x58000084 }, /* ldr x4, entry ; Load the lower 32-bits of kernel entry */
40
{ 0xd61f0080 }, /* br x4 ; Jump to the kernel entry point */
41
- { 0, FIXUP_ARGPTR }, /* arg: .word @DTB Lower 32-bits */
42
- { 0 }, /* .word @DTB Higher 32-bits */
43
- { 0, FIXUP_ENTRYPOINT }, /* entry: .word @Kernel Entry Lower 32-bits */
44
- { 0 }, /* .word @Kernel Entry Higher 32-bits */
45
+ { 0, FIXUP_ARGPTR_LO }, /* arg: .word @DTB Lower 32-bits */
46
+ { 0, FIXUP_ARGPTR_HI}, /* .word @DTB Higher 32-bits */
47
+ { 0, FIXUP_ENTRYPOINT_LO }, /* entry: .word @Kernel Entry Lower 32-bits */
48
+ { 0, FIXUP_ENTRYPOINT_HI }, /* .word @Kernel Entry Higher 32-bits */
49
{ 0, FIXUP_TERMINATOR }
50
};
51
52
@@ -XXX,XX +XXX,XX @@ static const ARMInsnFixup bootloader[] = {
53
{ 0xe59f2004 }, /* ldr r2, [pc, #4] */
54
{ 0xe59ff004 }, /* ldr pc, [pc, #4] */
55
{ 0, FIXUP_BOARDID },
56
- { 0, FIXUP_ARGPTR },
57
- { 0, FIXUP_ENTRYPOINT },
58
+ { 0, FIXUP_ARGPTR_LO },
59
+ { 0, FIXUP_ENTRYPOINT_LO },
60
{ 0, FIXUP_TERMINATOR }
61
};
62
63
@@ -XXX,XX +XXX,XX @@ static void write_bootloader(const char *name, hwaddr addr,
64
break;
65
case FIXUP_BOARDID:
66
case FIXUP_BOARD_SETUP:
67
- case FIXUP_ARGPTR:
68
- case FIXUP_ENTRYPOINT:
69
+ case FIXUP_ARGPTR_LO:
70
+ case FIXUP_ARGPTR_HI:
71
+ case FIXUP_ENTRYPOINT_LO:
72
+ case FIXUP_ENTRYPOINT_HI:
73
case FIXUP_GIC_CPU_IF:
74
case FIXUP_BOOTREG:
75
case FIXUP_DSB:
76
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
77
/* Place the DTB after the initrd in memory with alignment. */
78
info->dtb_start = QEMU_ALIGN_UP(info->initrd_start + initrd_size,
79
align);
80
- fixupcontext[FIXUP_ARGPTR] = info->dtb_start;
81
+ fixupcontext[FIXUP_ARGPTR_LO] = info->dtb_start;
82
+ fixupcontext[FIXUP_ARGPTR_HI] = info->dtb_start >> 32;
83
} else {
84
- fixupcontext[FIXUP_ARGPTR] = info->loader_start + KERNEL_ARGS_ADDR;
85
+ fixupcontext[FIXUP_ARGPTR_LO] =
86
+ info->loader_start + KERNEL_ARGS_ADDR;
87
+ fixupcontext[FIXUP_ARGPTR_HI] =
88
+ (info->loader_start + KERNEL_ARGS_ADDR) >> 32;
89
if (info->ram_size >= (1ULL << 32)) {
90
error_report("RAM size must be less than 4GB to boot"
91
" Linux kernel using ATAGS (try passing a device tree"
92
@@ -XXX,XX +XXX,XX @@ void arm_load_kernel(ARMCPU *cpu, struct arm_boot_info *info)
93
exit(1);
94
}
95
}
96
- fixupcontext[FIXUP_ENTRYPOINT] = entry;
97
+ fixupcontext[FIXUP_ENTRYPOINT_LO] = entry;
98
+ fixupcontext[FIXUP_ENTRYPOINT_HI] = entry >> 32;
99
100
write_bootloader("bootloader", info->loader_start,
101
primary_loader, fixupcontext, as);
102
--
103
2.19.2
104
105
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
mv88w8618_wlan_class_init().
5
6
Cc: jan.kiszka@web.de
7
Cc: peter.maydell@linaro.org
8
Cc: qemu-arm@nongnu.org
9
10
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
11
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20181130093852.20739-2-maozhongyi@cmss.chinamobile.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/arm/musicpal.c | 9 ++++-----
17
1 file changed, 4 insertions(+), 5 deletions(-)
18
19
diff --git a/hw/arm/musicpal.c b/hw/arm/musicpal.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/musicpal.c
22
+++ b/hw/arm/musicpal.c
23
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps mv88w8618_wlan_ops = {
24
.endianness = DEVICE_NATIVE_ENDIAN,
25
};
26
27
-static int mv88w8618_wlan_init(SysBusDevice *dev)
28
+static void mv88w8618_wlan_realize(DeviceState *dev, Error **errp)
29
{
30
MemoryRegion *iomem = g_new(MemoryRegion, 1);
31
32
memory_region_init_io(iomem, OBJECT(dev), &mv88w8618_wlan_ops, NULL,
33
"musicpal-wlan", MP_WLAN_SIZE);
34
- sysbus_init_mmio(dev, iomem);
35
- return 0;
36
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), iomem);
37
}
38
39
/* GPIO register offsets */
40
@@ -XXX,XX +XXX,XX @@ DEFINE_MACHINE("musicpal", musicpal_machine_init)
41
42
static void mv88w8618_wlan_class_init(ObjectClass *klass, void *data)
43
{
44
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
45
+ DeviceClass *dc = DEVICE_CLASS(klass);
46
47
- sdc->init = mv88w8618_wlan_init;
48
+ dc->realize = mv88w8618_wlan_realize;
49
}
50
51
static const TypeInfo mv88w8618_wlan_info = {
52
--
53
2.19.2
54
55
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
onenand_class_init().
5
6
Cc: kwolf@redhat.com
7
Cc: mreitz@redhat.com
8
Cc: qemu-block@nongnu.org
9
10
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
11
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20181130093852.20739-3-maozhongyi@cmss.chinamobile.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/block/onenand.c | 16 +++++++---------
17
1 file changed, 7 insertions(+), 9 deletions(-)
18
19
diff --git a/hw/block/onenand.c b/hw/block/onenand.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/block/onenand.c
22
+++ b/hw/block/onenand.c
23
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps onenand_ops = {
24
.endianness = DEVICE_NATIVE_ENDIAN,
25
};
26
27
-static int onenand_initfn(SysBusDevice *sbd)
28
+static void onenand_realize(DeviceState *dev, Error **errp)
29
{
30
- DeviceState *dev = DEVICE(sbd);
31
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
32
OneNANDState *s = ONE_NAND(dev);
33
uint32_t size = 1 << (24 + ((s->id.dev >> 4) & 7));
34
void *ram;
35
@@ -XXX,XX +XXX,XX @@ static int onenand_initfn(SysBusDevice *sbd)
36
0xff, size + (size >> 5));
37
} else {
38
if (blk_is_read_only(s->blk)) {
39
- error_report("Can't use a read-only drive");
40
- return -1;
41
+ error_setg(errp, "Can't use a read-only drive");
42
+ return;
43
}
44
blk_set_perm(s->blk, BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE,
45
BLK_PERM_ALL, &local_err);
46
if (local_err) {
47
- error_report_err(local_err);
48
- return -1;
49
+ error_propagate(errp, local_err);
50
+ return;
51
}
52
s->blk_cur = s->blk;
53
}
54
@@ -XXX,XX +XXX,XX @@ static int onenand_initfn(SysBusDevice *sbd)
55
| ((s->id.dev & 0xff) << 8)
56
| (s->id.ver & 0xff),
57
&vmstate_onenand, s);
58
- return 0;
59
}
60
61
static Property onenand_properties[] = {
62
@@ -XXX,XX +XXX,XX @@ static Property onenand_properties[] = {
63
static void onenand_class_init(ObjectClass *klass, void *data)
64
{
65
DeviceClass *dc = DEVICE_CLASS(klass);
66
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
67
68
- k->init = onenand_initfn;
69
+ dc->realize = onenand_realize;
70
dc->reset = onenand_system_reset;
71
dc->props = onenand_properties;
72
}
73
--
74
2.19.2
75
76
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
grlib_apbuart_class_init().
5
6
Cc: chouteau@adacore.com
7
Cc: marcandre.lureau@redhat.com
8
Cc: pbonzini@redhat.com
9
10
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
11
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
12
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
13
Message-id: 20181130093852.20739-4-maozhongyi@cmss.chinamobile.com
14
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
15
---
16
hw/char/grlib_apbuart.c | 12 +++++-------
17
1 file changed, 5 insertions(+), 7 deletions(-)
18
19
diff --git a/hw/char/grlib_apbuart.c b/hw/char/grlib_apbuart.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/char/grlib_apbuart.c
22
+++ b/hw/char/grlib_apbuart.c
23
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps grlib_apbuart_ops = {
24
.endianness = DEVICE_NATIVE_ENDIAN,
25
};
26
27
-static int grlib_apbuart_init(SysBusDevice *dev)
28
+static void grlib_apbuart_realize(DeviceState *dev, Error **errp)
29
{
30
UART *uart = GRLIB_APB_UART(dev);
31
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
32
33
qemu_chr_fe_set_handlers(&uart->chr,
34
grlib_apbuart_can_receive,
35
@@ -XXX,XX +XXX,XX @@ static int grlib_apbuart_init(SysBusDevice *dev)
36
grlib_apbuart_event,
37
NULL, uart, NULL, true);
38
39
- sysbus_init_irq(dev, &uart->irq);
40
+ sysbus_init_irq(sbd, &uart->irq);
41
42
memory_region_init_io(&uart->iomem, OBJECT(uart), &grlib_apbuart_ops, uart,
43
"uart", UART_REG_SIZE);
44
45
- sysbus_init_mmio(dev, &uart->iomem);
46
-
47
- return 0;
48
+ sysbus_init_mmio(sbd, &uart->iomem);
49
}
50
51
static void grlib_apbuart_reset(DeviceState *d)
52
@@ -XXX,XX +XXX,XX @@ static Property grlib_apbuart_properties[] = {
53
static void grlib_apbuart_class_init(ObjectClass *klass, void *data)
54
{
55
DeviceClass *dc = DEVICE_CLASS(klass);
56
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
57
58
- k->init = grlib_apbuart_init;
59
+ dc->realize = grlib_apbuart_realize;
60
dc->reset = grlib_apbuart_reset;
61
dc->props = grlib_apbuart_properties;
62
}
63
--
64
2.19.2
65
66
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
empty_slot_class_init().
5
6
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
7
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Message-id: 20181130093852.20739-5-maozhongyi@cmss.chinamobile.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
hw/core/empty_slot.c | 9 ++++-----
14
1 file changed, 4 insertions(+), 5 deletions(-)
15
16
diff --git a/hw/core/empty_slot.c b/hw/core/empty_slot.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/core/empty_slot.c
19
+++ b/hw/core/empty_slot.c
20
@@ -XXX,XX +XXX,XX @@ void empty_slot_init(hwaddr addr, uint64_t slot_size)
21
}
22
}
23
24
-static int empty_slot_init1(SysBusDevice *dev)
25
+static void empty_slot_realize(DeviceState *dev, Error **errp)
26
{
27
EmptySlot *s = EMPTY_SLOT(dev);
28
29
memory_region_init_io(&s->iomem, OBJECT(s), &empty_slot_ops, s,
30
"empty-slot", s->size);
31
- sysbus_init_mmio(dev, &s->iomem);
32
- return 0;
33
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
34
}
35
36
static void empty_slot_class_init(ObjectClass *klass, void *data)
37
{
38
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
39
+ DeviceClass *dc = DEVICE_CLASS(klass);
40
41
- k->init = empty_slot_init1;
42
+ dc->realize = empty_slot_realize;
43
}
44
45
static const TypeInfo empty_slot_info = {
46
--
47
2.19.2
48
49
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
g364fb_sysbus_class_init().
5
6
Cc: pbonzini@redhat.com
7
Cc: kraxel@redhat.com
8
Cc: f4bug@amsat.org
9
Cc: alistair.francis@wdc.com
10
11
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
12
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Message-id: 20181130093852.20739-6-maozhongyi@cmss.chinamobile.com
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/display/g364fb.c | 9 +++------
19
1 file changed, 3 insertions(+), 6 deletions(-)
20
21
diff --git a/hw/display/g364fb.c b/hw/display/g364fb.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/display/g364fb.c
24
+++ b/hw/display/g364fb.c
25
@@ -XXX,XX +XXX,XX @@ typedef struct {
26
G364State g364;
27
} G364SysBusState;
28
29
-static int g364fb_sysbus_init(SysBusDevice *sbd)
30
+static void g364fb_sysbus_realize(DeviceState *dev, Error **errp)
31
{
32
- DeviceState *dev = DEVICE(sbd);
33
G364SysBusState *sbs = G364(dev);
34
G364State *s = &sbs->g364;
35
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
36
37
g364fb_init(dev, s);
38
sysbus_init_irq(sbd, &s->irq);
39
sysbus_init_mmio(sbd, &s->mem_ctrl);
40
sysbus_init_mmio(sbd, &s->mem_vram);
41
-
42
- return 0;
43
}
44
45
static void g364fb_sysbus_reset(DeviceState *d)
46
@@ -XXX,XX +XXX,XX @@ static Property g364fb_sysbus_properties[] = {
47
static void g364fb_sysbus_class_init(ObjectClass *klass, void *data)
48
{
49
DeviceClass *dc = DEVICE_CLASS(klass);
50
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
51
52
- k->init = g364fb_sysbus_init;
53
+ dc->realize = g364fb_sysbus_realize;
54
set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories);
55
dc->desc = "G364 framebuffer";
56
dc->reset = g364fb_sysbus_reset;
57
--
58
2.19.2
59
60
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
puv3_dma_class_init().
5
6
Cc: gxt@mprc.pku.edu.cn
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-7-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/dma/puv3_dma.c | 10 ++++------
16
1 file changed, 4 insertions(+), 6 deletions(-)
17
18
diff --git a/hw/dma/puv3_dma.c b/hw/dma/puv3_dma.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/dma/puv3_dma.c
21
+++ b/hw/dma/puv3_dma.c
22
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps puv3_dma_ops = {
23
.endianness = DEVICE_NATIVE_ENDIAN,
24
};
25
26
-static int puv3_dma_init(SysBusDevice *dev)
27
+static void puv3_dma_realize(DeviceState *dev, Error **errp)
28
{
29
PUV3DMAState *s = PUV3_DMA(dev);
30
int i;
31
@@ -XXX,XX +XXX,XX @@ static int puv3_dma_init(SysBusDevice *dev)
32
33
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_dma_ops, s, "puv3_dma",
34
PUV3_REGS_OFFSET);
35
- sysbus_init_mmio(dev, &s->iomem);
36
-
37
- return 0;
38
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
39
}
40
41
static void puv3_dma_class_init(ObjectClass *klass, void *data)
42
{
43
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
44
+ DeviceClass *dc = DEVICE_CLASS(klass);
45
46
- sdc->init = puv3_dma_init;
47
+ dc->realize = puv3_dma_realize;
48
}
49
50
static const TypeInfo puv3_dma_info = {
51
--
52
2.19.2
53
54
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
puv3_gpio_class_init().
5
6
Cc: gxt@mprc.pku.edu.cn
7
Cc: peter.maydell@linaro.org
8
9
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-8-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/gpio/puv3_gpio.c | 29 ++++++++++++++---------------
16
1 file changed, 14 insertions(+), 15 deletions(-)
17
18
diff --git a/hw/gpio/puv3_gpio.c b/hw/gpio/puv3_gpio.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/gpio/puv3_gpio.c
21
+++ b/hw/gpio/puv3_gpio.c
22
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps puv3_gpio_ops = {
23
.endianness = DEVICE_NATIVE_ENDIAN,
24
};
25
26
-static int puv3_gpio_init(SysBusDevice *dev)
27
+static void puv3_gpio_realize(DeviceState *dev, Error **errp)
28
{
29
PUV3GPIOState *s = PUV3_GPIO(dev);
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
31
32
s->reg_GPLR = 0;
33
s->reg_GPDR = 0;
34
35
/* FIXME: these irqs not handled yet */
36
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW0]);
37
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW1]);
38
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW2]);
39
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW3]);
40
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW4]);
41
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW5]);
42
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW6]);
43
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOLOW7]);
44
- sysbus_init_irq(dev, &s->irq[PUV3_IRQS_GPIOHIGH]);
45
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW0]);
46
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW1]);
47
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW2]);
48
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW3]);
49
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW4]);
50
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW5]);
51
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW6]);
52
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOLOW7]);
53
+ sysbus_init_irq(sbd, &s->irq[PUV3_IRQS_GPIOHIGH]);
54
55
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_gpio_ops, s, "puv3_gpio",
56
PUV3_REGS_OFFSET);
57
- sysbus_init_mmio(dev, &s->iomem);
58
-
59
- return 0;
60
+ sysbus_init_mmio(sbd, &s->iomem);
61
}
62
63
static void puv3_gpio_class_init(ObjectClass *klass, void *data)
64
{
65
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
66
+ DeviceClass *dc = DEVICE_CLASS(klass);
67
68
- sdc->init = puv3_gpio_init;
69
+ dc->realize = puv3_gpio_realize;
70
}
71
72
static const TypeInfo puv3_gpio_info = {
73
--
74
2.19.2
75
76
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
milkymist_softusb_class_init().
5
6
Cc: michael@walle.cc
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20181130093852.20739-9-maozhongyi@cmss.chinamobile.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/input/milkymist-softusb.c | 16 +++++++---------
15
1 file changed, 7 insertions(+), 9 deletions(-)
16
17
diff --git a/hw/input/milkymist-softusb.c b/hw/input/milkymist-softusb.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/input/milkymist-softusb.c
20
+++ b/hw/input/milkymist-softusb.c
21
@@ -XXX,XX +XXX,XX @@ static void milkymist_softusb_reset(DeviceState *d)
22
s->regs[R_CTRL] = CTRL_RESET;
23
}
24
25
-static int milkymist_softusb_init(SysBusDevice *dev)
26
+static void milkymist_softusb_realize(DeviceState *dev, Error **errp)
27
{
28
MilkymistSoftUsbState *s = MILKYMIST_SOFTUSB(dev);
29
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
30
31
- sysbus_init_irq(dev, &s->irq);
32
+ sysbus_init_irq(sbd, &s->irq);
33
34
memory_region_init_io(&s->regs_region, OBJECT(s), &softusb_mmio_ops, s,
35
"milkymist-softusb", R_MAX * 4);
36
- sysbus_init_mmio(dev, &s->regs_region);
37
+ sysbus_init_mmio(sbd, &s->regs_region);
38
39
/* register pmem and dmem */
40
memory_region_init_ram_nomigrate(&s->pmem, OBJECT(s), "milkymist-softusb.pmem",
41
s->pmem_size, &error_fatal);
42
vmstate_register_ram_global(&s->pmem);
43
s->pmem_ptr = memory_region_get_ram_ptr(&s->pmem);
44
- sysbus_init_mmio(dev, &s->pmem);
45
+ sysbus_init_mmio(sbd, &s->pmem);
46
memory_region_init_ram_nomigrate(&s->dmem, OBJECT(s), "milkymist-softusb.dmem",
47
s->dmem_size, &error_fatal);
48
vmstate_register_ram_global(&s->dmem);
49
s->dmem_ptr = memory_region_get_ram_ptr(&s->dmem);
50
- sysbus_init_mmio(dev, &s->dmem);
51
+ sysbus_init_mmio(sbd, &s->dmem);
52
53
hid_init(&s->hid_kbd, HID_KEYBOARD, softusb_kbd_hid_datain);
54
hid_init(&s->hid_mouse, HID_MOUSE, softusb_mouse_hid_datain);
55
-
56
- return 0;
57
}
58
59
static const VMStateDescription vmstate_milkymist_softusb = {
60
@@ -XXX,XX +XXX,XX @@ static Property milkymist_softusb_properties[] = {
61
static void milkymist_softusb_class_init(ObjectClass *klass, void *data)
62
{
63
DeviceClass *dc = DEVICE_CLASS(klass);
64
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
65
66
- k->init = milkymist_softusb_init;
67
+ dc->realize = milkymist_softusb_realize;
68
dc->reset = milkymist_softusb_reset;
69
dc->vmsd = &vmstate_milkymist_softusb;
70
dc->props = milkymist_softusb_properties;
71
--
72
2.19.2
73
74
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
pl050_class_init().
5
6
Cc: peter.maydell@linaro.org
7
Cc: qemu-arm@nongnu.org
8
9
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-10-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/input/pl050.c | 11 +++++------
16
1 file changed, 5 insertions(+), 6 deletions(-)
17
18
diff --git a/hw/input/pl050.c b/hw/input/pl050.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/input/pl050.c
21
+++ b/hw/input/pl050.c
22
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps pl050_ops = {
23
.endianness = DEVICE_NATIVE_ENDIAN,
24
};
25
26
-static int pl050_initfn(SysBusDevice *dev)
27
+static void pl050_realize(DeviceState *dev, Error **errp)
28
{
29
PL050State *s = PL050(dev);
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
31
32
memory_region_init_io(&s->iomem, OBJECT(s), &pl050_ops, s, "pl050", 0x1000);
33
- sysbus_init_mmio(dev, &s->iomem);
34
- sysbus_init_irq(dev, &s->irq);
35
+ sysbus_init_mmio(sbd, &s->iomem);
36
+ sysbus_init_irq(sbd, &s->irq);
37
if (s->is_mouse) {
38
s->dev = ps2_mouse_init(pl050_update, s);
39
} else {
40
s->dev = ps2_kbd_init(pl050_update, s);
41
}
42
- return 0;
43
}
44
45
static void pl050_keyboard_init(Object *obj)
46
@@ -XXX,XX +XXX,XX @@ static const TypeInfo pl050_mouse_info = {
47
static void pl050_class_init(ObjectClass *oc, void *data)
48
{
49
DeviceClass *dc = DEVICE_CLASS(oc);
50
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(oc);
51
52
- sdc->init = pl050_initfn;
53
+ dc->realize = pl050_realize;
54
dc->vmsd = &vmstate_pl050;
55
}
56
57
--
58
2.19.2
59
60
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
puv3_intc_class_init().
5
6
Cc: gxt@mprc.pku.edu.cn
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20181130093852.20739-11-maozhongyi@cmss.chinamobile.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/intc/puv3_intc.c | 11 ++++-------
15
1 file changed, 4 insertions(+), 7 deletions(-)
16
17
diff --git a/hw/intc/puv3_intc.c b/hw/intc/puv3_intc.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/intc/puv3_intc.c
20
+++ b/hw/intc/puv3_intc.c
21
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps puv3_intc_ops = {
22
.endianness = DEVICE_NATIVE_ENDIAN,
23
};
24
25
-static int puv3_intc_init(SysBusDevice *sbd)
26
+static void puv3_intc_realize(DeviceState *dev, Error **errp)
27
{
28
- DeviceState *dev = DEVICE(sbd);
29
PUV3INTCState *s = PUV3_INTC(dev);
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
31
32
qdev_init_gpio_in(dev, puv3_intc_handler, PUV3_IRQS_NR);
33
sysbus_init_irq(sbd, &s->parent_irq);
34
@@ -XXX,XX +XXX,XX @@ static int puv3_intc_init(SysBusDevice *sbd)
35
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_intc_ops, s, "puv3_intc",
36
PUV3_REGS_OFFSET);
37
sysbus_init_mmio(sbd, &s->iomem);
38
-
39
- return 0;
40
}
41
42
static void puv3_intc_class_init(ObjectClass *klass, void *data)
43
{
44
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
45
-
46
- sdc->init = puv3_intc_init;
47
+ DeviceClass *dc = DEVICE_CLASS(klass);
48
+ dc->realize = puv3_intc_realize;
49
}
50
51
static const TypeInfo puv3_intc_info = {
52
--
53
2.19.2
54
55
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
milkymist_hpdmc_class_init().
5
6
Cc: gxt@mprc.pku.edu.cn
7
Cc: michael@walle.cc
8
9
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-12-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/misc/milkymist-hpdmc.c | 9 +++------
16
1 file changed, 3 insertions(+), 6 deletions(-)
17
18
diff --git a/hw/misc/milkymist-hpdmc.c b/hw/misc/milkymist-hpdmc.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/misc/milkymist-hpdmc.c
21
+++ b/hw/misc/milkymist-hpdmc.c
22
@@ -XXX,XX +XXX,XX @@ static void milkymist_hpdmc_reset(DeviceState *d)
23
| IODELAY_PLL2_LOCKED;
24
}
25
26
-static int milkymist_hpdmc_init(SysBusDevice *dev)
27
+static void milkymist_hpdmc_realize(DeviceState *dev, Error **errp)
28
{
29
MilkymistHpdmcState *s = MILKYMIST_HPDMC(dev);
30
31
memory_region_init_io(&s->regs_region, OBJECT(dev), &hpdmc_mmio_ops, s,
32
"milkymist-hpdmc", R_MAX * 4);
33
- sysbus_init_mmio(dev, &s->regs_region);
34
-
35
- return 0;
36
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->regs_region);
37
}
38
39
static const VMStateDescription vmstate_milkymist_hpdmc = {
40
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_milkymist_hpdmc = {
41
static void milkymist_hpdmc_class_init(ObjectClass *klass, void *data)
42
{
43
DeviceClass *dc = DEVICE_CLASS(klass);
44
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
45
46
- k->init = milkymist_hpdmc_init;
47
+ dc->realize = milkymist_hpdmc_realize;
48
dc->reset = milkymist_hpdmc_reset;
49
dc->vmsd = &vmstate_milkymist_hpdmc;
50
}
51
--
52
2.19.2
53
54
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
milkymist_pfpu_class_init().
5
6
Cc: michael@walle.cc
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20181130093852.20739-13-maozhongyi@cmss.chinamobile.com
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/misc/milkymist-pfpu.c | 12 +++++-------
15
1 file changed, 5 insertions(+), 7 deletions(-)
16
17
diff --git a/hw/misc/milkymist-pfpu.c b/hw/misc/milkymist-pfpu.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/misc/milkymist-pfpu.c
20
+++ b/hw/misc/milkymist-pfpu.c
21
@@ -XXX,XX +XXX,XX @@ static void milkymist_pfpu_reset(DeviceState *d)
22
}
23
}
24
25
-static int milkymist_pfpu_init(SysBusDevice *dev)
26
+static void milkymist_pfpu_realize(DeviceState *dev, Error **errp)
27
{
28
MilkymistPFPUState *s = MILKYMIST_PFPU(dev);
29
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
30
31
- sysbus_init_irq(dev, &s->irq);
32
+ sysbus_init_irq(sbd, &s->irq);
33
34
memory_region_init_io(&s->regs_region, OBJECT(dev), &pfpu_mmio_ops, s,
35
"milkymist-pfpu", MICROCODE_END * 4);
36
- sysbus_init_mmio(dev, &s->regs_region);
37
-
38
- return 0;
39
+ sysbus_init_mmio(sbd, &s->regs_region);
40
}
41
42
static const VMStateDescription vmstate_milkymist_pfpu = {
43
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_milkymist_pfpu = {
44
static void milkymist_pfpu_class_init(ObjectClass *klass, void *data)
45
{
46
DeviceClass *dc = DEVICE_CLASS(klass);
47
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
48
49
- k->init = milkymist_pfpu_init;
50
+ dc->realize = milkymist_pfpu_realize;
51
dc->reset = milkymist_pfpu_reset;
52
dc->vmsd = &vmstate_milkymist_pfpu;
53
}
54
--
55
2.19.2
56
57
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
puv3_pm_class_init().
5
6
Cc: gxt@mprc.pku.edu.cn
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-14-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/misc/puv3_pm.c | 10 ++++------
16
1 file changed, 4 insertions(+), 6 deletions(-)
17
18
diff --git a/hw/misc/puv3_pm.c b/hw/misc/puv3_pm.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/misc/puv3_pm.c
21
+++ b/hw/misc/puv3_pm.c
22
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps puv3_pm_ops = {
23
.endianness = DEVICE_NATIVE_ENDIAN,
24
};
25
26
-static int puv3_pm_init(SysBusDevice *dev)
27
+static void puv3_pm_realize(DeviceState *dev, Error **errp)
28
{
29
PUV3PMState *s = PUV3_PM(dev);
30
31
@@ -XXX,XX +XXX,XX @@ static int puv3_pm_init(SysBusDevice *dev)
32
33
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_pm_ops, s, "puv3_pm",
34
PUV3_REGS_OFFSET);
35
- sysbus_init_mmio(dev, &s->iomem);
36
-
37
- return 0;
38
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
39
}
40
41
static void puv3_pm_class_init(ObjectClass *klass, void *data)
42
{
43
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
44
+ DeviceClass *dc = DEVICE_CLASS(klass);
45
46
- sdc->init = puv3_pm_init;
47
+ dc->realize = puv3_pm_realize;
48
}
49
50
static const TypeInfo puv3_pm_info = {
51
--
52
2.19.2
53
54
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
nvram_sysbus_class_init().
5
6
Cc: pbonzini@redhat.com
7
Cc: marcandre.lureau@redhat.com
8
9
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
11
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
Message-id: 20181130093852.20739-15-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/nvram/ds1225y.c | 12 +++++-------
16
1 file changed, 5 insertions(+), 7 deletions(-)
17
18
diff --git a/hw/nvram/ds1225y.c b/hw/nvram/ds1225y.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/nvram/ds1225y.c
21
+++ b/hw/nvram/ds1225y.c
22
@@ -XXX,XX +XXX,XX @@
23
#include "qemu/osdep.h"
24
#include "hw/sysbus.h"
25
#include "trace.h"
26
+#include "qemu/error-report.h"
27
28
typedef struct {
29
MemoryRegion iomem;
30
@@ -XXX,XX +XXX,XX @@ typedef struct {
31
NvRamState nvram;
32
} SysBusNvRamState;
33
34
-static int nvram_sysbus_initfn(SysBusDevice *dev)
35
+static void nvram_sysbus_realize(DeviceState *dev, Error **errp)
36
{
37
SysBusNvRamState *sys = DS1225Y(dev);
38
NvRamState *s = &sys->nvram;
39
@@ -XXX,XX +XXX,XX @@ static int nvram_sysbus_initfn(SysBusDevice *dev)
40
41
memory_region_init_io(&s->iomem, OBJECT(s), &nvram_ops, s,
42
"nvram", s->chip_size);
43
- sysbus_init_mmio(dev, &s->iomem);
44
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
45
46
/* Read current file */
47
file = s->filename ? fopen(s->filename, "rb") : NULL;
48
if (file) {
49
/* Read nvram contents */
50
if (fread(s->contents, s->chip_size, 1, file) != 1) {
51
- printf("nvram_sysbus_initfn: short read\n");
52
+ error_report("nvram_sysbus_realize: short read");
53
}
54
fclose(file);
55
}
56
nvram_post_load(s, 0);
57
-
58
- return 0;
59
}
60
61
static Property nvram_sysbus_properties[] = {
62
@@ -XXX,XX +XXX,XX @@ static Property nvram_sysbus_properties[] = {
63
static void nvram_sysbus_class_init(ObjectClass *klass, void *data)
64
{
65
DeviceClass *dc = DEVICE_CLASS(klass);
66
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
67
68
- k->init = nvram_sysbus_initfn;
69
+ dc->realize = nvram_sysbus_realize;
70
dc->vmsd = &vmstate_nvram;
71
dc->props = nvram_sysbus_properties;
72
}
73
--
74
2.19.2
75
76
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
pci_dec_21154_device_class_init().
5
6
Cc: david@gibson.dropbear.id.au
7
Cc: mst@redhat.com
8
Cc: marcel.apfelbaum@gmail.com
9
Cc: qemu-ppc@nongnu.org
10
11
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
12
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
13
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
14
Acked-by: David Gibson <david@gibson.dropbear.id.au>
15
Message-id: 20181130093852.20739-16-maozhongyi@cmss.chinamobile.com
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
17
---
18
hw/pci-bridge/dec.c | 12 ++++++------
19
1 file changed, 6 insertions(+), 6 deletions(-)
20
21
diff --git a/hw/pci-bridge/dec.c b/hw/pci-bridge/dec.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/pci-bridge/dec.c
24
+++ b/hw/pci-bridge/dec.c
25
@@ -XXX,XX +XXX,XX @@ PCIBus *pci_dec_21154_init(PCIBus *parent_bus, int devfn)
26
return pci_bridge_get_sec_bus(br);
27
}
28
29
-static int pci_dec_21154_device_init(SysBusDevice *dev)
30
+static void pci_dec_21154_device_realize(DeviceState *dev, Error **errp)
31
{
32
PCIHostState *phb;
33
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
34
35
phb = PCI_HOST_BRIDGE(dev);
36
37
@@ -XXX,XX +XXX,XX @@ static int pci_dec_21154_device_init(SysBusDevice *dev)
38
dev, "pci-conf-idx", 0x1000);
39
memory_region_init_io(&phb->data_mem, OBJECT(dev), &pci_host_data_le_ops,
40
dev, "pci-data-idx", 0x1000);
41
- sysbus_init_mmio(dev, &phb->conf_mem);
42
- sysbus_init_mmio(dev, &phb->data_mem);
43
- return 0;
44
+ sysbus_init_mmio(sbd, &phb->conf_mem);
45
+ sysbus_init_mmio(sbd, &phb->data_mem);
46
}
47
48
static void dec_21154_pci_host_realize(PCIDevice *d, Error **errp)
49
@@ -XXX,XX +XXX,XX @@ static const TypeInfo dec_21154_pci_host_info = {
50
51
static void pci_dec_21154_device_class_init(ObjectClass *klass, void *data)
52
{
53
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
54
+ DeviceClass *dc = DEVICE_CLASS(klass);
55
56
- sdc->init = pci_dec_21154_device_init;
57
+ dc->realize = pci_dec_21154_device_realize;
58
}
59
60
static const TypeInfo pci_dec_21154_device_info = {
61
--
62
2.19.2
63
64
diff view generated by jsdifflib
New patch
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
1
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
etraxfs_timer_class_init().
5
6
Cc: edgar.iglesias@gmail.com
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
12
Message-id: 20181130093852.20739-17-maozhongyi@cmss.chinamobile.com
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
---
15
hw/timer/etraxfs_timer.c | 14 +++++++-------
16
1 file changed, 7 insertions(+), 7 deletions(-)
17
18
diff --git a/hw/timer/etraxfs_timer.c b/hw/timer/etraxfs_timer.c
19
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/timer/etraxfs_timer.c
21
+++ b/hw/timer/etraxfs_timer.c
22
@@ -XXX,XX +XXX,XX @@ static void etraxfs_timer_reset(void *opaque)
23
qemu_irq_lower(t->irq);
24
}
25
26
-static int etraxfs_timer_init(SysBusDevice *dev)
27
+static void etraxfs_timer_realize(DeviceState *dev, Error **errp)
28
{
29
ETRAXTimerState *t = ETRAX_TIMER(dev);
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
31
32
t->bh_t0 = qemu_bh_new(timer0_hit, t);
33
t->bh_t1 = qemu_bh_new(timer1_hit, t);
34
@@ -XXX,XX +XXX,XX @@ static int etraxfs_timer_init(SysBusDevice *dev)
35
t->ptimer_t1 = ptimer_init(t->bh_t1, PTIMER_POLICY_DEFAULT);
36
t->ptimer_wd = ptimer_init(t->bh_wd, PTIMER_POLICY_DEFAULT);
37
38
- sysbus_init_irq(dev, &t->irq);
39
- sysbus_init_irq(dev, &t->nmi);
40
+ sysbus_init_irq(sbd, &t->irq);
41
+ sysbus_init_irq(sbd, &t->nmi);
42
43
memory_region_init_io(&t->mmio, OBJECT(t), &timer_ops, t,
44
"etraxfs-timer", 0x5c);
45
- sysbus_init_mmio(dev, &t->mmio);
46
+ sysbus_init_mmio(sbd, &t->mmio);
47
qemu_register_reset(etraxfs_timer_reset, t);
48
- return 0;
49
}
50
51
static void etraxfs_timer_class_init(ObjectClass *klass, void *data)
52
{
53
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
54
+ DeviceClass *dc = DEVICE_CLASS(klass);
55
56
- sdc->init = etraxfs_timer_init;
57
+ dc->realize = etraxfs_timer_realize;
58
}
59
60
static const TypeInfo etraxfs_timer_info = {
61
--
62
2.19.2
63
64
diff view generated by jsdifflib
1
Add entries to the MAINTAINERS file for the new MPS2
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
board and devices.
3
2
4
Since the CMSDK devices are not specific to the MPS2 board,
3
Use DeviceClass rather than SysBusDeviceClass in
5
extend the existing 'PrimeCell' section to cover CMSDK
4
grlib_gptimer_class_init().
6
devices as well; in both cases these are devices implemented
7
by ARM and provided as RTL that may be used in multiple
8
SoCs and boards.
9
5
6
Cc: chouteau@adacore.com
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20181130093852.20739-18-maozhongyi@cmss.chinamobile.com
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-id: 1500029487-14822-10-git-send-email-peter.maydell@linaro.org
12
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
13
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
---
13
---
15
MAINTAINERS | 14 +++++++++++++-
14
hw/timer/grlib_gptimer.c | 11 +++++------
16
1 file changed, 13 insertions(+), 1 deletion(-)
15
1 file changed, 5 insertions(+), 6 deletions(-)
17
16
18
diff --git a/MAINTAINERS b/MAINTAINERS
17
diff --git a/hw/timer/grlib_gptimer.c b/hw/timer/grlib_gptimer.c
19
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
20
--- a/MAINTAINERS
19
--- a/hw/timer/grlib_gptimer.c
21
+++ b/MAINTAINERS
20
+++ b/hw/timer/grlib_gptimer.c
22
@@ -XXX,XX +XXX,XX @@ F: hw/*/allwinner*
21
@@ -XXX,XX +XXX,XX @@ static void grlib_gptimer_reset(DeviceState *d)
23
F: include/hw/*/allwinner*
22
}
24
F: hw/arm/cubieboard.c
23
}
25
24
26
-ARM PrimeCell
25
-static int grlib_gptimer_init(SysBusDevice *dev)
27
+ARM PrimeCell and CMSDK devices
26
+static void grlib_gptimer_realize(DeviceState *dev, Error **errp)
28
M: Peter Maydell <peter.maydell@linaro.org>
27
{
29
L: qemu-arm@nongnu.org
28
GPTimerUnit *unit = GRLIB_GPTIMER(dev);
30
S: Maintained
29
unsigned int i;
31
@@ -XXX,XX +XXX,XX @@ F: hw/intc/pl190.c
30
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
32
F: hw/sd/pl181.c
31
33
F: hw/timer/pl031.c
32
assert(unit->nr_timers > 0);
34
F: include/hw/arm/primecell.h
33
assert(unit->nr_timers <= GPTIMER_MAX_TIMERS);
35
+F: hw/timer/cmsdk-apb-timer.c
34
@@ -XXX,XX +XXX,XX @@ static int grlib_gptimer_init(SysBusDevice *dev)
36
+F: include/hw/timer/cmsdk-apb-timer.h
35
timer->id = i;
37
+F: hw/char/cmsdk-apb-uart.c
36
38
+F: include/hw/char/cmsdk-apb-uart.h
37
/* One IRQ line for each timer */
39
38
- sysbus_init_irq(dev, &timer->irq);
40
ARM cores
39
+ sysbus_init_irq(sbd, &timer->irq);
41
M: Peter Maydell <peter.maydell@linaro.org>
40
42
@@ -XXX,XX +XXX,XX @@ S: Maintained
41
ptimer_set_freq(timer->ptimer, unit->freq_hz);
43
F: hw/arm/integratorcp.c
42
}
44
F: hw/misc/arm_integrator_debug.c
43
@@ -XXX,XX +XXX,XX @@ static int grlib_gptimer_init(SysBusDevice *dev)
45
44
unit, "gptimer",
46
+MPS2
45
UNIT_REG_SIZE + GPTIMER_REG_SIZE * unit->nr_timers);
47
+M: Peter Maydell <peter.maydell@linaro.org>
46
48
+L: qemu-arm@nongnu.org
47
- sysbus_init_mmio(dev, &unit->iomem);
49
+S: Maintained
48
- return 0;
50
+F: hw/arm/mps2.c
49
+ sysbus_init_mmio(sbd, &unit->iomem);
51
+F: hw/misc/mps2-scc.c
50
}
52
+F: include/hw/misc/mps2-scc.h
51
53
+
52
static Property grlib_gptimer_properties[] = {
54
Musicpal
53
@@ -XXX,XX +XXX,XX @@ static Property grlib_gptimer_properties[] = {
55
M: Jan Kiszka <jan.kiszka@web.de>
54
static void grlib_gptimer_class_init(ObjectClass *klass, void *data)
56
L: qemu-arm@nongnu.org
55
{
56
DeviceClass *dc = DEVICE_CLASS(klass);
57
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
58
59
- k->init = grlib_gptimer_init;
60
+ dc->realize = grlib_gptimer_realize;
61
dc->reset = grlib_gptimer_reset;
62
dc->props = grlib_gptimer_properties;
63
}
57
--
64
--
58
2.7.4
65
2.19.2
59
66
60
67
diff view generated by jsdifflib
1
Add the SCC to the MPS2 board models.
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
2
3
Use DeviceClass rather than SysBusDeviceClass in
4
puv3_ost_class_init().
5
6
Cc: gxt@mprc.pku.edu.cn
7
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
11
Message-id: 20181130093852.20739-19-maozhongyi@cmss.chinamobile.com
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Message-id: 1500029487-14822-8-git-send-email-peter.maydell@linaro.org
6
---
13
---
7
hw/arm/mps2.c | 17 ++++++++++++++++-
14
hw/timer/puv3_ost.c | 13 ++++++-------
8
1 file changed, 16 insertions(+), 1 deletion(-)
15
1 file changed, 6 insertions(+), 7 deletions(-)
9
16
10
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
17
diff --git a/hw/timer/puv3_ost.c b/hw/timer/puv3_ost.c
11
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/arm/mps2.c
19
--- a/hw/timer/puv3_ost.c
13
+++ b/hw/arm/mps2.c
20
+++ b/hw/timer/puv3_ost.c
14
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ static void puv3_ost_tick(void *opaque)
15
#include "hw/misc/unimp.h"
22
}
16
#include "hw/char/cmsdk-apb-uart.h"
17
#include "hw/timer/cmsdk-apb-timer.h"
18
+#include "hw/misc/mps2-scc.h"
19
20
typedef enum MPS2FPGAType {
21
FPGA_AN385,
22
@@ -XXX,XX +XXX,XX @@ typedef struct {
23
MachineClass parent;
24
MPS2FPGAType fpga_type;
25
const char *cpu_model;
26
+ uint32_t scc_id;
27
} MPS2MachineClass;
28
29
typedef struct {
30
@@ -XXX,XX +XXX,XX @@ typedef struct {
31
MemoryRegion blockram_m2;
32
MemoryRegion blockram_m3;
33
MemoryRegion sram;
34
+ MPS2SCC scc;
35
} MPS2MachineState;
36
37
#define TYPE_MPS2_MACHINE "mps2"
38
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
39
MPS2MachineState *mms = MPS2_MACHINE(machine);
40
MPS2MachineClass *mmc = MPS2_MACHINE_GET_CLASS(machine);
41
MemoryRegion *system_memory = get_system_memory();
42
- DeviceState *armv7m;
43
+ DeviceState *armv7m, *sccdev;
44
45
if (!machine->cpu_model) {
46
machine->cpu_model = mmc->cpu_model;
47
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
48
cmsdk_apb_timer_create(0x40000000, qdev_get_gpio_in(armv7m, 8), SYSCLK_FRQ);
49
cmsdk_apb_timer_create(0x40001000, qdev_get_gpio_in(armv7m, 9), SYSCLK_FRQ);
50
51
+ object_initialize(&mms->scc, sizeof(mms->scc), TYPE_MPS2_SCC);
52
+ sccdev = DEVICE(&mms->scc);
53
+ qdev_set_parent_bus(armv7m, sysbus_get_default());
54
+ qdev_prop_set_uint32(sccdev, "scc-cfg4", 0x2);
55
+ qdev_prop_set_uint32(sccdev, "scc-aid", 0x02000008);
56
+ qdev_prop_set_uint32(sccdev, "scc-id", mmc->scc_id);
57
+ object_property_set_bool(OBJECT(&mms->scc), true, "realized",
58
+ &error_fatal);
59
+ sysbus_mmio_map(SYS_BUS_DEVICE(sccdev), 0, 0x4002f000);
60
+
61
system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ;
62
63
armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename,
64
@@ -XXX,XX +XXX,XX @@ static void mps2_an385_class_init(ObjectClass *oc, void *data)
65
mc->desc = "ARM MPS2 with AN385 FPGA image for Cortex-M3";
66
mmc->fpga_type = FPGA_AN385;
67
mmc->cpu_model = "cortex-m3";
68
+ mmc->scc_id = 0x41040000 | (385 << 4);
69
}
23
}
70
24
71
static void mps2_an511_class_init(ObjectClass *oc, void *data)
25
-static int puv3_ost_init(SysBusDevice *dev)
72
@@ -XXX,XX +XXX,XX @@ static void mps2_an511_class_init(ObjectClass *oc, void *data)
26
+static void puv3_ost_realize(DeviceState *dev, Error **errp)
73
mc->desc = "ARM MPS2 with AN511 DesignStart FPGA image for Cortex-M3";
27
{
74
mmc->fpga_type = FPGA_AN511;
28
PUV3OSTState *s = PUV3_OST(dev);
75
mmc->cpu_model = "cortex-m3";
29
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
76
+ mmc->scc_id = 0x4104000 | (511 << 4);
30
31
s->reg_OIER = 0;
32
s->reg_OSSR = 0;
33
s->reg_OSMR0 = 0;
34
s->reg_OSCR = 0;
35
36
- sysbus_init_irq(dev, &s->irq);
37
+ sysbus_init_irq(sbd, &s->irq);
38
39
s->bh = qemu_bh_new(puv3_ost_tick, s);
40
s->ptimer = ptimer_init(s->bh, PTIMER_POLICY_DEFAULT);
41
@@ -XXX,XX +XXX,XX @@ static int puv3_ost_init(SysBusDevice *dev)
42
43
memory_region_init_io(&s->iomem, OBJECT(s), &puv3_ost_ops, s, "puv3_ost",
44
PUV3_REGS_OFFSET);
45
- sysbus_init_mmio(dev, &s->iomem);
46
-
47
- return 0;
48
+ sysbus_init_mmio(sbd, &s->iomem);
77
}
49
}
78
50
79
static const TypeInfo mps2_info = {
51
static void puv3_ost_class_init(ObjectClass *klass, void *data)
52
{
53
- SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
54
+ DeviceClass *dc = DEVICE_CLASS(klass);
55
56
- sdc->init = puv3_ost_init;
57
+ dc->realize = puv3_ost_realize;
58
}
59
60
static const TypeInfo puv3_ost_info = {
80
--
61
--
81
2.7.4
62
2.19.2
82
63
83
64
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
2
3
As the gen_goto_tb function can do both static and dynamic jumps it
3
Use DeviceClass rather than SysBusDeviceClass in
4
should also set the is_jmp field. This matches the behaviour of the
4
tusb6010_class_init().
5
a64 code.
6
5
7
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
6
Cc: kraxel@redhat.com
8
Reviewed-by: Richard Henderson <rth@twiddle.net>
7
9
Message-id: 20170713141928.25419-5-alex.bennee@linaro.org
8
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
10
[tweak to multiline comment formatting]
9
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
10
Message-id: 20181130093852.20739-20-maozhongyi@cmss.chinamobile.com
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
12
---
13
target/arm/translate.c | 6 +++++-
13
hw/usb/tusb6010.c | 8 +++-----
14
1 file changed, 5 insertions(+), 1 deletion(-)
14
1 file changed, 3 insertions(+), 5 deletions(-)
15
15
16
diff --git a/target/arm/translate.c b/target/arm/translate.c
16
diff --git a/hw/usb/tusb6010.c b/hw/usb/tusb6010.c
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate.c
18
--- a/hw/usb/tusb6010.c
19
+++ b/target/arm/translate.c
19
+++ b/hw/usb/tusb6010.c
20
@@ -XXX,XX +XXX,XX @@ static void gen_goto_ptr(void)
20
@@ -XXX,XX +XXX,XX @@ static void tusb6010_reset(DeviceState *dev)
21
tcg_temp_free(addr);
21
musb_reset(s->musb);
22
}
22
}
23
23
24
+/* This will end the TB but doesn't guarantee we'll return to
24
-static int tusb6010_init(SysBusDevice *sbd)
25
+ * cpu_loop_exec. Any live exit_requests will be processed as we
25
+static void tusb6010_realize(DeviceState *dev, Error **errp)
26
+ * enter the next TB.
27
+ */
28
static void gen_goto_tb(DisasContext *s, int n, target_ulong dest)
29
{
26
{
30
if (use_goto_tb(s, dest)) {
27
- DeviceState *dev = DEVICE(sbd);
31
@@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *s, int n, target_ulong dest)
28
TUSBState *s = TUSB(dev);
32
gen_set_pc_im(s, dest);
29
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
33
gen_goto_ptr();
30
34
}
31
s->otg_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, tusb_otg_tick, s);
35
+ s->is_jmp = DISAS_TB_JUMP;
32
s->pwr_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, tusb_power_tick, s);
33
@@ -XXX,XX +XXX,XX @@ static int tusb6010_init(SysBusDevice *sbd)
34
sysbus_init_irq(sbd, &s->irq);
35
qdev_init_gpio_in(dev, tusb6010_irq, musb_irq_max + 1);
36
s->musb = musb_init(dev, 1);
37
- return 0;
36
}
38
}
37
39
38
static inline void gen_jmp (DisasContext *s, uint32_t dest)
40
static void tusb6010_class_init(ObjectClass *klass, void *data)
39
@@ -XXX,XX +XXX,XX @@ static inline void gen_jmp (DisasContext *s, uint32_t dest)
41
{
40
gen_bx_im(s, dest);
42
DeviceClass *dc = DEVICE_CLASS(klass);
41
} else {
43
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
42
gen_goto_tb(s, 0, dest);
44
43
- s->is_jmp = DISAS_TB_JUMP;
45
- k->init = tusb6010_init;
44
}
46
+ dc->realize = tusb6010_realize;
47
dc->reset = tusb6010_reset;
45
}
48
}
46
49
47
--
50
--
48
2.7.4
51
2.19.2
49
52
50
53
diff view generated by jsdifflib
1
In some situations it's useful to have a qdev property which doesn't
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
automatically set its default value when qdev_property_add_static is
3
called (for instance when the default value is not constant).
4
2
5
Support this by adding a flag to the Property struct indicating
3
The init function doesn't do anything at all, so we
6
whether to set the default value. This replaces the existing test
4
just omit it.
7
for whether the PropertyInfo set_default_value function pointer is
8
NULL, and we set the .set_default field to true for all those cases
9
of struct Property which use a PropertyInfo with a non-NULL
10
set_default_value, so behaviour remains the same as before.
11
5
12
This gives us the semantics of:
6
Cc: sstabellini@kernel.org
13
* if .set_default is true, then .info->set_default_value must
7
Cc: anthony.perard@citrix.com
14
be not NULL, and .defval is used as the the default value of
8
Cc: xen-devel@lists.xenproject.org
15
the property
9
Cc: peter.maydell@linaro.org
16
* otherwise, the property system does not set any default, and
17
the field will retain whatever initial value it was given by
18
the device's .instance_init method
19
10
20
We define two new macros DEFINE_PROP_SIGNED_NODEFAULT and
11
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
21
DEFINE_PROP_UNSIGNED_NODEFAULT, to cover the most plausible use cases
12
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
22
of wanting to set an integer property with no default value.
13
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
14
Message-id: 20181130093852.20739-21-maozhongyi@cmss.chinamobile.com
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
hw/xen/xen_backend.c | 7 -------
18
1 file changed, 7 deletions(-)
23
19
24
Suggested-by: Markus Armbruster <armbru@redhat.com>
20
diff --git a/hw/xen/xen_backend.c b/hw/xen/xen_backend.c
25
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
26
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
27
Reviewed-by: Markus Armbruster <armbru@redhat.com>
28
Message-id: 1499788408-10096-3-git-send-email-peter.maydell@linaro.org
29
---
30
include/hw/qdev-core.h | 10 ++++++++++
31
include/hw/qdev-properties.h | 20 ++++++++++++++++++++
32
hw/core/qdev.c | 2 +-
33
3 files changed, 31 insertions(+), 1 deletion(-)
34
35
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
36
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
37
--- a/include/hw/qdev-core.h
22
--- a/hw/xen/xen_backend.c
38
+++ b/include/hw/qdev-core.h
23
+++ b/hw/xen/xen_backend.c
39
@@ -XXX,XX +XXX,XX @@ struct BusState {
24
@@ -XXX,XX +XXX,XX @@ static const TypeInfo xensysbus_info = {
40
QLIST_ENTRY(BusState) sibling;
25
}
41
};
26
};
42
27
43
+/**
28
-static int xen_sysdev_init(SysBusDevice *dev)
44
+ * Property:
29
-{
45
+ * @set_default: true if the default value should be set from @defval,
30
- return 0;
46
+ * in which case @info->set_default_value must not be NULL
31
-}
47
+ * (if false then no default value is set by the property system
32
-
48
+ * and the field retains whatever value it was given by instance_init).
33
static Property xen_sysdev_properties[] = {
49
+ * @defval: default value for the property. This is used only if @set_default
34
{/* end of property list */},
50
+ * is true.
35
};
51
+ */
36
@@ -XXX,XX +XXX,XX @@ static Property xen_sysdev_properties[] = {
52
struct Property {
37
static void xen_sysdev_class_init(ObjectClass *klass, void *data)
53
const char *name;
38
{
54
const PropertyInfo *info;
39
DeviceClass *dc = DEVICE_CLASS(klass);
55
ptrdiff_t offset;
40
- SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
56
uint8_t bitnr;
41
57
+ bool set_default;
42
- k->init = xen_sysdev_init;
58
union {
43
dc->props = xen_sysdev_properties;
59
int64_t i;
44
dc->bus_type = TYPE_XENSYSBUS;
60
uint64_t u;
61
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
62
index XXXXXXX..XXXXXXX 100644
63
--- a/include/hw/qdev-properties.h
64
+++ b/include/hw/qdev-properties.h
65
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_link;
66
.info = &(_prop), \
67
.offset = offsetof(_state, _field) \
68
+ type_check(_type,typeof_field(_state, _field)), \
69
+ .set_default = true, \
70
.defval.i = (_type)_defval, \
71
}
72
73
+#define DEFINE_PROP_SIGNED_NODEFAULT(_name, _state, _field, _prop, _type) { \
74
+ .name = (_name), \
75
+ .info = &(_prop), \
76
+ .offset = offsetof(_state, _field) \
77
+ + type_check(_type, typeof_field(_state, _field)), \
78
+ }
79
+
80
#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \
81
.name = (_name), \
82
.info = &(qdev_prop_bit), \
83
.bitnr = (_bit), \
84
.offset = offsetof(_state, _field) \
85
+ type_check(uint32_t,typeof_field(_state, _field)), \
86
+ .set_default = true, \
87
.defval.u = (bool)_defval, \
88
}
89
90
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_link;
91
.info = &(_prop), \
92
.offset = offsetof(_state, _field) \
93
+ type_check(_type, typeof_field(_state, _field)), \
94
+ .set_default = true, \
95
.defval.u = (_type)_defval, \
96
}
97
98
+#define DEFINE_PROP_UNSIGNED_NODEFAULT(_name, _state, _field, _prop, _type) { \
99
+ .name = (_name), \
100
+ .info = &(_prop), \
101
+ .offset = offsetof(_state, _field) \
102
+ + type_check(_type, typeof_field(_state, _field)), \
103
+ }
104
+
105
#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) { \
106
.name = (_name), \
107
.info = &(qdev_prop_bit64), \
108
.bitnr = (_bit), \
109
.offset = offsetof(_state, _field) \
110
+ type_check(uint64_t, typeof_field(_state, _field)), \
111
+ .set_default = true, \
112
.defval.u = (bool)_defval, \
113
}
114
115
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_link;
116
.info = &(qdev_prop_bool), \
117
.offset = offsetof(_state, _field) \
118
+ type_check(bool, typeof_field(_state, _field)), \
119
+ .set_default = true, \
120
.defval.u = (bool)_defval, \
121
}
122
123
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_link;
124
_arrayfield, _arrayprop, _arraytype) { \
125
.name = (PROP_ARRAY_LEN_PREFIX _name), \
126
.info = &(qdev_prop_arraylen), \
127
+ .set_default = true, \
128
.defval.u = 0, \
129
.offset = offsetof(_state, _field) \
130
+ type_check(uint32_t, typeof_field(_state, _field)), \
131
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
132
index XXXXXXX..XXXXXXX 100644
133
--- a/hw/core/qdev.c
134
+++ b/hw/core/qdev.c
135
@@ -XXX,XX +XXX,XX @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
136
prop->info->description,
137
&error_abort);
138
139
- if (prop->info->set_default_value) {
140
+ if (prop->set_default) {
141
prop->info->set_default_value(obj, prop);
142
}
143
}
45
}
144
--
46
--
145
2.7.4
47
2.19.2
146
48
147
49
diff view generated by jsdifflib
1
Add the UARTs to the MPS2 board models.
1
From: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
2
2
3
Unfortunately the details of the wiring of the interrupts through
3
Currently, all sysbus devices have been converted to realize(),
4
various OR gates differ between AN511 and AN385 so this can't
4
so remove this path.
5
be purely a data-driven difference.
6
5
6
Cc: ehabkost@redhat.com
7
Cc: thuth@redhat.com
8
Cc: pbonzini@redhat.com
9
Cc: armbru@redhat.com
10
Cc: peter.maydell@linaro.org
11
Cc: richard.henderson@linaro.org
12
Cc: alistair.francis@wdc.com
13
14
Signed-off-by: Mao Zhongyi <maozhongyi@cmss.chinamobile.com>
15
Signed-off-by: Zhang Shengju <zhangshengju@cmss.chinamobile.com>
16
Message-id: 20181130093852.20739-22-maozhongyi@cmss.chinamobile.com
17
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Alistair Francis <alistair.francis@xilinx.com>
9
Message-id: 1500029487-14822-4-git-send-email-peter.maydell@linaro.org
10
---
19
---
11
hw/arm/mps2.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++
20
include/hw/sysbus.h | 3 ---
12
hw/char/cmsdk-apb-uart.c | 2 +-
21
hw/core/sysbus.c | 15 +++++----------
13
2 files changed, 89 insertions(+), 1 deletion(-)
22
2 files changed, 5 insertions(+), 13 deletions(-)
14
23
15
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
24
diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
16
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/mps2.c
26
--- a/include/hw/sysbus.h
18
+++ b/hw/arm/mps2.c
27
+++ b/include/hw/sysbus.h
19
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@ typedef struct SysBusDevice SysBusDevice;
20
#include "qemu/error-report.h"
29
typedef struct SysBusDeviceClass {
21
#include "hw/arm/arm.h"
30
/*< private >*/
22
#include "hw/arm/armv7m.h"
31
DeviceClass parent_class;
23
+#include "hw/or-irq.h"
32
- /*< public >*/
24
#include "hw/boards.h"
33
-
25
#include "exec/address-spaces.h"
34
- int (*init)(SysBusDevice *dev);
26
+#include "sysemu/sysemu.h"
35
27
#include "hw/misc/unimp.h"
36
/*
28
+#include "hw/char/cmsdk-apb-uart.h"
37
* Let the sysbus device format its own non-PIO, non-MMIO unit address.
29
38
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
30
typedef enum MPS2FPGAType {
31
FPGA_AN385,
32
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
33
create_unimplemented_device("Ethernet", 0x40200000, 0x00100000);
34
create_unimplemented_device("VGA", 0x41000000, 0x0200000);
35
36
+ switch (mmc->fpga_type) {
37
+ case FPGA_AN385:
38
+ {
39
+ /* The overflow IRQs for UARTs 0, 1 and 2 are ORed together.
40
+ * Overflow for UARTs 4 and 5 doesn't trigger any interrupt.
41
+ */
42
+ Object *orgate;
43
+ DeviceState *orgate_dev;
44
+ int i;
45
+
46
+ orgate = object_new(TYPE_OR_IRQ);
47
+ object_property_set_int(orgate, 6, "num-lines", &error_fatal);
48
+ object_property_set_bool(orgate, true, "realized", &error_fatal);
49
+ orgate_dev = DEVICE(orgate);
50
+ qdev_connect_gpio_out(orgate_dev, 0, qdev_get_gpio_in(armv7m, 12));
51
+
52
+ for (i = 0; i < 5; i++) {
53
+ static const hwaddr uartbase[] = {0x40004000, 0x40005000,
54
+ 0x40006000, 0x40007000,
55
+ 0x40009000};
56
+ Chardev *uartchr = i < MAX_SERIAL_PORTS ? serial_hds[i] : NULL;
57
+ /* RX irq number; TX irq is always one greater */
58
+ static const int uartirq[] = {0, 2, 4, 18, 20};
59
+ qemu_irq txovrint = NULL, rxovrint = NULL;
60
+
61
+ if (i < 3) {
62
+ txovrint = qdev_get_gpio_in(orgate_dev, i * 2);
63
+ rxovrint = qdev_get_gpio_in(orgate_dev, i * 2 + 1);
64
+ }
65
+
66
+ cmsdk_apb_uart_create(uartbase[i],
67
+ qdev_get_gpio_in(armv7m, uartirq[i] + 1),
68
+ qdev_get_gpio_in(armv7m, uartirq[i]),
69
+ txovrint, rxovrint,
70
+ NULL,
71
+ uartchr, SYSCLK_FRQ);
72
+ }
73
+ break;
74
+ }
75
+ case FPGA_AN511:
76
+ {
77
+ /* The overflow IRQs for all UARTs are ORed together.
78
+ * Tx and Rx IRQs for each UART are ORed together.
79
+ */
80
+ Object *orgate;
81
+ DeviceState *orgate_dev;
82
+ int i;
83
+
84
+ orgate = object_new(TYPE_OR_IRQ);
85
+ object_property_set_int(orgate, 10, "num-lines", &error_fatal);
86
+ object_property_set_bool(orgate, true, "realized", &error_fatal);
87
+ orgate_dev = DEVICE(orgate);
88
+ qdev_connect_gpio_out(orgate_dev, 0, qdev_get_gpio_in(armv7m, 12));
89
+
90
+ for (i = 0; i < 5; i++) {
91
+ /* system irq numbers for the combined tx/rx for each UART */
92
+ static const int uart_txrx_irqno[] = {0, 2, 45, 46, 56};
93
+ static const hwaddr uartbase[] = {0x40004000, 0x40005000,
94
+ 0x4002c000, 0x4002d000,
95
+ 0x4002e000};
96
+ Chardev *uartchr = i < MAX_SERIAL_PORTS ? serial_hds[i] : NULL;
97
+ Object *txrx_orgate;
98
+ DeviceState *txrx_orgate_dev;
99
+
100
+ txrx_orgate = object_new(TYPE_OR_IRQ);
101
+ object_property_set_int(txrx_orgate, 2, "num-lines", &error_fatal);
102
+ object_property_set_bool(txrx_orgate, true, "realized",
103
+ &error_fatal);
104
+ txrx_orgate_dev = DEVICE(txrx_orgate);
105
+ qdev_connect_gpio_out(txrx_orgate_dev, 0,
106
+ qdev_get_gpio_in(armv7m, uart_txrx_irqno[i]));
107
+ cmsdk_apb_uart_create(uartbase[i],
108
+ qdev_get_gpio_in(txrx_orgate_dev, 0),
109
+ qdev_get_gpio_in(txrx_orgate_dev, 1),
110
+ qdev_get_gpio_in(orgate_dev, 0),
111
+ qdev_get_gpio_in(orgate_dev, 1),
112
+ NULL,
113
+ uartchr, SYSCLK_FRQ);
114
+ }
115
+ break;
116
+ }
117
+ default:
118
+ g_assert_not_reached();
119
+ }
120
+
121
system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ;
122
123
armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename,
124
diff --git a/hw/char/cmsdk-apb-uart.c b/hw/char/cmsdk-apb-uart.c
125
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
126
--- a/hw/char/cmsdk-apb-uart.c
40
--- a/hw/core/sysbus.c
127
+++ b/hw/char/cmsdk-apb-uart.c
41
+++ b/hw/core/sysbus.c
128
@@ -XXX,XX +XXX,XX @@ static void cmsdk_apb_uart_realize(DeviceState *dev, Error **errp)
42
@@ -XXX,XX +XXX,XX @@ void sysbus_init_ioports(SysBusDevice *dev, uint32_t ioport, uint32_t size)
129
* an event handler to deal with CHR_EVENT_BREAK.
43
}
130
*/
131
qemu_chr_fe_set_handlers(&s->chr, uart_can_receive, uart_receive,
132
- NULL, s, NULL, true);
133
+ NULL, NULL, s, NULL, true);
134
}
44
}
135
45
136
static int cmsdk_apb_uart_post_load(void *opaque, int version_id)
46
-/* TODO remove once all sysbus devices have been converted to realize */
47
+/* The purpose of preserving this empty realize function
48
+ * is to prevent the parent_realize field of some subclasses
49
+ * from being set to NULL to break the normal init/realize
50
+ * of some devices.
51
+ */
52
static void sysbus_realize(DeviceState *dev, Error **errp)
53
{
54
- SysBusDevice *sd = SYS_BUS_DEVICE(dev);
55
- SysBusDeviceClass *sbc = SYS_BUS_DEVICE_GET_CLASS(sd);
56
-
57
- if (!sbc->init) {
58
- return;
59
- }
60
- if (sbc->init(sd) < 0) {
61
- error_setg(errp, "Device initialization failed");
62
- }
63
}
64
65
DeviceState *sysbus_create_varargs(const char *name,
137
--
66
--
138
2.7.4
67
2.19.2
139
68
140
69
diff view generated by jsdifflib
1
Add the CMSDK APB timers to the MPS2 board.
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
Remove bogus virtio-mmio creation. This was an accidental
4
left-over an experiment.
5
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
9
Message-id: 20181129163655.20370-2-edgar.iglesias@gmail.com
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Message-id: 1500029487-14822-6-git-send-email-peter.maydell@linaro.org
6
---
11
---
7
hw/arm/mps2.c | 4 ++++
12
hw/arm/xlnx-versal-virt.c | 1 -
8
1 file changed, 4 insertions(+)
13
1 file changed, 1 deletion(-)
9
14
10
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
15
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
11
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/arm/mps2.c
17
--- a/hw/arm/xlnx-versal-virt.c
13
+++ b/hw/arm/mps2.c
18
+++ b/hw/arm/xlnx-versal-virt.c
14
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static void create_virtio_regions(VersalVirt *s)
15
#include "sysemu/sysemu.h"
20
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, pic_irq);
16
#include "hw/misc/unimp.h"
21
mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
17
#include "hw/char/cmsdk-apb-uart.h"
22
memory_region_add_subregion(&s->soc.mr_ps, base, mr);
18
+#include "hw/timer/cmsdk-apb-timer.h"
23
- sysbus_create_simple("virtio-mmio", base, pic_irq);
19
20
typedef enum MPS2FPGAType {
21
FPGA_AN385,
22
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
23
g_assert_not_reached();
24
}
24
}
25
25
26
+ cmsdk_apb_timer_create(0x40000000, qdev_get_gpio_in(armv7m, 8), SYSCLK_FRQ);
26
for (i = 0; i < NUM_VIRTIO_TRANSPORT; i++) {
27
+ cmsdk_apb_timer_create(0x40001000, qdev_get_gpio_in(armv7m, 9), SYSCLK_FRQ);
28
+
29
system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ;
30
31
armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename,
32
--
27
--
33
2.7.4
28
2.19.2
34
29
35
30
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
2
3
Previously DISAS_JUMP did ensure this but with the optimisation of
3
Reduce number of virtio-mmio instances. This is in preparation
4
8a6b28c7 (optimize indirect branches) we might not leave the loop.
4
for correcting the interrupt setup for Versal.
5
This means if any pending interrupts are cleared by changing IRQ flags
6
we might never get around to servicing them. You usually notice this
7
by seeing the lookup_tb_ptr() helper gainfully chaining TBs together
8
while cpu->interrupt_request remains high and the exit_request has not
9
been set.
10
5
11
This breaks amongst other things the OPTEE test suite which executes
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
12
an eret from the secure world after a non-secure world IRQ has gone
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
pending which then never gets serviced.
8
Message-id: 20181129163655.20370-3-edgar.iglesias@gmail.com
14
15
Instead of using the previously implied semantics of DISAS_JUMP we use
16
DISAS_EXIT which will always exit the run-loop.
17
18
CC: Etienne Carriere <etienne.carriere@linaro.org>
19
CC: Joakim Bech <joakim.bech@linaro.org>
20
CC: Jaroslaw Pelczar <j.pelczar@samsung.com>
21
CC: Peter Maydell <peter.maydell@linaro.org>
22
CC: Emilio G. Cota <cota@braap.org>
23
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
24
Reviewed-by: Richard Henderson <rth@twiddle.net>
25
Message-id: 20170713141928.25419-7-alex.bennee@linaro.org
26
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
27
---
10
---
28
target/arm/translate-a64.c | 3 ++-
11
hw/arm/xlnx-versal-virt.c | 2 +-
29
target/arm/translate.c | 6 ++++--
12
1 file changed, 1 insertion(+), 1 deletion(-)
30
2 files changed, 6 insertions(+), 3 deletions(-)
31
13
32
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
14
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
33
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/translate-a64.c
16
--- a/hw/arm/xlnx-versal-virt.c
35
+++ b/target/arm/translate-a64.c
17
+++ b/hw/arm/xlnx-versal-virt.c
36
@@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn)
18
@@ -XXX,XX +XXX,XX @@ static void *versal_virt_get_dtb(const struct arm_boot_info *binfo,
37
return;
19
return board->fdt;
38
}
39
gen_helper_exception_return(cpu_env);
40
- s->is_jmp = DISAS_JUMP;
41
+ /* Must exit loop to check un-masked IRQs */
42
+ s->is_jmp = DISAS_EXIT;
43
return;
44
case 5: /* DRPS */
45
if (rn != 0x1f) {
46
diff --git a/target/arm/translate.c b/target/arm/translate.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/translate.c
49
+++ b/target/arm/translate.c
50
@@ -XXX,XX +XXX,XX @@ static void gen_rfe(DisasContext *s, TCGv_i32 pc, TCGv_i32 cpsr)
51
*/
52
gen_helper_cpsr_write_eret(cpu_env, cpsr);
53
tcg_temp_free_i32(cpsr);
54
- s->is_jmp = DISAS_JUMP;
55
+ /* Must exit loop to check un-masked IRQs */
56
+ s->is_jmp = DISAS_EXIT;
57
}
20
}
58
21
59
/* Generate an old-style exception return. Marks pc as dead. */
22
-#define NUM_VIRTIO_TRANSPORT 32
60
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
23
+#define NUM_VIRTIO_TRANSPORT 8
61
tmp = load_cpu_field(spsr);
24
static void create_virtio_regions(VersalVirt *s)
62
gen_helper_cpsr_write_eret(cpu_env, tmp);
25
{
63
tcg_temp_free_i32(tmp);
26
int virtio_mmio_size = 0x200;
64
- s->is_jmp = DISAS_JUMP;
65
+ /* Must exit loop to check un-masked IRQs */
66
+ s->is_jmp = DISAS_EXIT;
67
}
68
}
69
break;
70
--
27
--
71
2.7.4
28
2.19.2
72
29
73
30
diff view generated by jsdifflib
1
The MPS2 FPGA images support ethernet via a LAN9220. We use
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
QEMU's LAN9118 model, which is software compatible except
3
that it is missing the checksum-offload feature.
4
2
3
Use IRQs 111 - 118 for virtio-mmio. The interrupts we're currently
4
using 160+ are not available in the Versal GIC.
5
6
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-id: 20181129163655.20370-4-edgar.iglesias@gmail.com
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Message-id: 1500029487-14822-9-git-send-email-peter.maydell@linaro.org
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
9
---
10
---
10
hw/arm/mps2.c | 10 +++++++++-
11
include/hw/arm/xlnx-versal.h | 6 +++---
11
1 file changed, 9 insertions(+), 1 deletion(-)
12
hw/arm/xlnx-versal-virt.c | 4 ++--
13
2 files changed, 5 insertions(+), 5 deletions(-)
12
14
13
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
15
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/mps2.c
17
--- a/include/hw/arm/xlnx-versal.h
16
+++ b/hw/arm/mps2.c
18
+++ b/include/hw/arm/xlnx-versal.h
17
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ typedef struct Versal {
18
#include "hw/char/cmsdk-apb-uart.h"
20
#define VERSAL_GEM1_IRQ_0 58
19
#include "hw/timer/cmsdk-apb-timer.h"
21
#define VERSAL_GEM1_WAKE_IRQ_0 59
20
#include "hw/misc/mps2-scc.h"
22
21
+#include "hw/devices.h"
23
-/* Architecturally eserved IRQs suitable for virtualization. */
22
+#include "net/net.h"
24
-#define VERSAL_RSVD_HIGH_IRQ_FIRST 160
23
25
-#define VERSAL_RSVD_HIGH_IRQ_LAST 255
24
typedef enum MPS2FPGAType {
26
+/* Architecturally reserved IRQs suitable for virtualization. */
25
FPGA_AN385,
27
+#define VERSAL_RSVD_IRQ_FIRST 111
26
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
28
+#define VERSAL_RSVD_IRQ_LAST 118
27
create_unimplemented_device("Extra peripheral region @0x40020000",
29
28
0x40020000, 0x00010000);
30
#define MM_TOP_RSVD 0xa0000000U
29
create_unimplemented_device("RESERVED 4", 0x40030000, 0x001D0000);
31
#define MM_TOP_RSVD_SIZE 0x4000000
30
- create_unimplemented_device("Ethernet", 0x40200000, 0x00100000);
32
diff --git a/hw/arm/xlnx-versal-virt.c b/hw/arm/xlnx-versal-virt.c
31
create_unimplemented_device("VGA", 0x41000000, 0x0200000);
33
index XXXXXXX..XXXXXXX 100644
32
34
--- a/hw/arm/xlnx-versal-virt.c
33
switch (mmc->fpga_type) {
35
+++ b/hw/arm/xlnx-versal-virt.c
34
@@ -XXX,XX +XXX,XX @@ static void mps2_common_init(MachineState *machine)
36
@@ -XXX,XX +XXX,XX @@ static void create_virtio_regions(VersalVirt *s)
35
&error_fatal);
37
for (i = 0; i < NUM_VIRTIO_TRANSPORT; i++) {
36
sysbus_mmio_map(SYS_BUS_DEVICE(sccdev), 0, 0x4002f000);
38
char *name = g_strdup_printf("virtio%d", i);;
37
39
hwaddr base = MM_TOP_RSVD + i * virtio_mmio_size;
38
+ /* In hardware this is a LAN9220; the LAN9118 is software compatible
40
- int irq = VERSAL_RSVD_HIGH_IRQ_FIRST + i;
39
+ * except that it doesn't support the checksum-offload feature.
41
+ int irq = VERSAL_RSVD_IRQ_FIRST + i;
40
+ */
42
MemoryRegion *mr;
41
+ lan9118_init(&nd_table[0], 0x40200000,
43
DeviceState *dev;
42
+ qdev_get_gpio_in(armv7m,
44
qemu_irq pic_irq;
43
+ mmc->fpga_type == FPGA_AN385 ? 13 : 47));
45
@@ -XXX,XX +XXX,XX @@ static void create_virtio_regions(VersalVirt *s)
44
+
46
45
system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ;
47
for (i = 0; i < NUM_VIRTIO_TRANSPORT; i++) {
46
48
hwaddr base = MM_TOP_RSVD + i * virtio_mmio_size;
47
armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename,
49
- int irq = VERSAL_RSVD_HIGH_IRQ_FIRST + i;
50
+ int irq = VERSAL_RSVD_IRQ_FIRST + i;
51
char *name = g_strdup_printf("/virtio_mmio@%" PRIx64, base);
52
53
qemu_fdt_add_subnode(s->fdt, name);
48
--
54
--
49
2.7.4
55
2.19.2
50
56
51
57
diff view generated by jsdifflib
1
Implement a model of the simple "APB UART" provided in
1
From: "Edgar E. Iglesias" <edgar.iglesias@xilinx.com>
2
the Cortex-M System Design Kit (CMSDK).
3
2
3
Correct the nr of IRQs to 192.
4
5
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-id: 20181129163655.20370-5-edgar.iglesias@gmail.com
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Message-id: 1500029487-14822-3-git-send-email-peter.maydell@linaro.org
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
---
9
---
8
hw/char/Makefile.objs | 1 +
10
include/hw/arm/xlnx-versal.h | 2 +-
9
include/hw/char/cmsdk-apb-uart.h | 78 ++++++++
11
1 file changed, 1 insertion(+), 1 deletion(-)
10
hw/char/cmsdk-apb-uart.c | 403 +++++++++++++++++++++++++++++++++++++++
11
default-configs/arm-softmmu.mak | 2 +
12
hw/char/trace-events | 9 +
13
5 files changed, 493 insertions(+)
14
create mode 100644 include/hw/char/cmsdk-apb-uart.h
15
create mode 100644 hw/char/cmsdk-apb-uart.c
16
12
17
diff --git a/hw/char/Makefile.objs b/hw/char/Makefile.objs
13
diff --git a/include/hw/arm/xlnx-versal.h b/include/hw/arm/xlnx-versal.h
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/char/Makefile.objs
15
--- a/include/hw/arm/xlnx-versal.h
20
+++ b/hw/char/Makefile.objs
16
+++ b/include/hw/arm/xlnx-versal.h
21
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_DIGIC) += digic-uart.o
22
obj-$(CONFIG_STM32F2XX_USART) += stm32f2xx_usart.o
23
obj-$(CONFIG_RASPI) += bcm2835_aux.o
24
25
+common-obj-$(CONFIG_CMSDK_APB_UART) += cmsdk-apb-uart.o
26
common-obj-$(CONFIG_ETRAXFS) += etraxfs_ser.o
27
common-obj-$(CONFIG_ISA_DEBUG) += debugcon.o
28
common-obj-$(CONFIG_GRLIB) += grlib_apbuart.o
29
diff --git a/include/hw/char/cmsdk-apb-uart.h b/include/hw/char/cmsdk-apb-uart.h
30
new file mode 100644
31
index XXXXXXX..XXXXXXX
32
--- /dev/null
33
+++ b/include/hw/char/cmsdk-apb-uart.h
34
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@
35
+/*
18
#define XLNX_VERSAL_NR_ACPUS 2
36
+ * ARM CMSDK APB UART emulation
19
#define XLNX_VERSAL_NR_UARTS 2
37
+ *
20
#define XLNX_VERSAL_NR_GEMS 2
38
+ * Copyright (c) 2017 Linaro Limited
21
-#define XLNX_VERSAL_NR_IRQS 256
39
+ * Written by Peter Maydell
22
+#define XLNX_VERSAL_NR_IRQS 192
40
+ *
23
41
+ * This program is free software; you can redistribute it and/or modify
24
typedef struct Versal {
42
+ * it under the terms of the GNU General Public License version 2 or
25
/*< private >*/
43
+ * (at your option) any later version.
44
+ */
45
+
46
+#ifndef CMSDK_APB_UART_H
47
+#define CMSDK_APB_UART_H
48
+
49
+#include "hw/sysbus.h"
50
+#include "chardev/char-fe.h"
51
+
52
+#define TYPE_CMSDK_APB_UART "cmsdk-apb-uart"
53
+#define CMSDK_APB_UART(obj) OBJECT_CHECK(CMSDKAPBUART, (obj), \
54
+ TYPE_CMSDK_APB_UART)
55
+
56
+typedef struct {
57
+ /*< private >*/
58
+ SysBusDevice parent_obj;
59
+
60
+ /*< public >*/
61
+ MemoryRegion iomem;
62
+ CharBackend chr;
63
+ qemu_irq txint;
64
+ qemu_irq rxint;
65
+ qemu_irq txovrint;
66
+ qemu_irq rxovrint;
67
+ qemu_irq uartint;
68
+ guint watch_tag;
69
+ uint32_t pclk_frq;
70
+
71
+ uint32_t state;
72
+ uint32_t ctrl;
73
+ uint32_t intstatus;
74
+ uint32_t bauddiv;
75
+ /* This UART has no FIFO, only a 1-character buffer for each of Tx and Rx */
76
+ uint8_t txbuf;
77
+ uint8_t rxbuf;
78
+} CMSDKAPBUART;
79
+
80
+/**
81
+ * cmsdk_apb_uart_create - convenience function to create TYPE_CMSDK_APB_UART
82
+ * @addr: location in system memory to map registers
83
+ * @chr: Chardev backend to connect UART to, or NULL if no backend
84
+ * @pclk_frq: frequency in Hz of the PCLK clock (used for calculating baud rate)
85
+ */
86
+static inline DeviceState *cmsdk_apb_uart_create(hwaddr addr,
87
+ qemu_irq txint,
88
+ qemu_irq rxint,
89
+ qemu_irq txovrint,
90
+ qemu_irq rxovrint,
91
+ qemu_irq uartint,
92
+ Chardev *chr,
93
+ uint32_t pclk_frq)
94
+{
95
+ DeviceState *dev;
96
+ SysBusDevice *s;
97
+
98
+ dev = qdev_create(NULL, TYPE_CMSDK_APB_UART);
99
+ s = SYS_BUS_DEVICE(dev);
100
+ qdev_prop_set_chr(dev, "chardev", chr);
101
+ qdev_prop_set_uint32(dev, "pclk-frq", pclk_frq);
102
+ qdev_init_nofail(dev);
103
+ sysbus_mmio_map(s, 0, addr);
104
+ sysbus_connect_irq(s, 0, txint);
105
+ sysbus_connect_irq(s, 1, rxint);
106
+ sysbus_connect_irq(s, 2, txovrint);
107
+ sysbus_connect_irq(s, 3, rxovrint);
108
+ sysbus_connect_irq(s, 4, uartint);
109
+ return dev;
110
+}
111
+
112
+#endif
113
diff --git a/hw/char/cmsdk-apb-uart.c b/hw/char/cmsdk-apb-uart.c
114
new file mode 100644
115
index XXXXXXX..XXXXXXX
116
--- /dev/null
117
+++ b/hw/char/cmsdk-apb-uart.c
118
@@ -XXX,XX +XXX,XX @@
119
+/*
120
+ * ARM CMSDK APB UART emulation
121
+ *
122
+ * Copyright (c) 2017 Linaro Limited
123
+ * Written by Peter Maydell
124
+ *
125
+ * This program is free software; you can redistribute it and/or modify
126
+ * it under the terms of the GNU General Public License version 2 or
127
+ * (at your option) any later version.
128
+ */
129
+
130
+/* This is a model of the "APB UART" which is part of the Cortex-M
131
+ * System Design Kit (CMSDK) and documented in the Cortex-M System
132
+ * Design Kit Technical Reference Manual (ARM DDI0479C):
133
+ * https://developer.arm.com/products/system-design/system-design-kits/cortex-m-system-design-kit
134
+ */
135
+
136
+#include "qemu/osdep.h"
137
+#include "qemu/log.h"
138
+#include "qapi/error.h"
139
+#include "trace.h"
140
+#include "hw/sysbus.h"
141
+#include "hw/registerfields.h"
142
+#include "chardev/char-fe.h"
143
+#include "chardev/char-serial.h"
144
+#include "hw/char/cmsdk-apb-uart.h"
145
+
146
+REG32(DATA, 0)
147
+REG32(STATE, 4)
148
+ FIELD(STATE, TXFULL, 0, 1)
149
+ FIELD(STATE, RXFULL, 1, 1)
150
+ FIELD(STATE, TXOVERRUN, 2, 1)
151
+ FIELD(STATE, RXOVERRUN, 3, 1)
152
+REG32(CTRL, 8)
153
+ FIELD(CTRL, TX_EN, 0, 1)
154
+ FIELD(CTRL, RX_EN, 1, 1)
155
+ FIELD(CTRL, TX_INTEN, 2, 1)
156
+ FIELD(CTRL, RX_INTEN, 3, 1)
157
+ FIELD(CTRL, TXO_INTEN, 4, 1)
158
+ FIELD(CTRL, RXO_INTEN, 5, 1)
159
+ FIELD(CTRL, HSTEST, 6, 1)
160
+REG32(INTSTATUS, 0xc)
161
+ FIELD(INTSTATUS, TX, 0, 1)
162
+ FIELD(INTSTATUS, RX, 1, 1)
163
+ FIELD(INTSTATUS, TXO, 2, 1)
164
+ FIELD(INTSTATUS, RXO, 3, 1)
165
+REG32(BAUDDIV, 0x10)
166
+REG32(PID4, 0xFD0)
167
+REG32(PID5, 0xFD4)
168
+REG32(PID6, 0xFD8)
169
+REG32(PID7, 0xFDC)
170
+REG32(PID0, 0xFE0)
171
+REG32(PID1, 0xFE4)
172
+REG32(PID2, 0xFE8)
173
+REG32(PID3, 0xFEC)
174
+REG32(CID0, 0xFF0)
175
+REG32(CID1, 0xFF4)
176
+REG32(CID2, 0xFF8)
177
+REG32(CID3, 0xFFC)
178
+
179
+/* PID/CID values */
180
+static const int uart_id[] = {
181
+ 0x04, 0x00, 0x00, 0x00, /* PID4..PID7 */
182
+ 0x21, 0xb8, 0x1b, 0x00, /* PID0..PID3 */
183
+ 0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
184
+};
185
+
186
+static bool uart_baudrate_ok(CMSDKAPBUART *s)
187
+{
188
+ /* The minimum permitted bauddiv setting is 16, so we just ignore
189
+ * settings below that (usually this means the device has just
190
+ * been reset and not yet programmed).
191
+ */
192
+ return s->bauddiv >= 16 && s->bauddiv <= s->pclk_frq;
193
+}
194
+
195
+static void uart_update_parameters(CMSDKAPBUART *s)
196
+{
197
+ QEMUSerialSetParams ssp;
198
+
199
+ /* This UART is always 8N1 but the baud rate is programmable. */
200
+ if (!uart_baudrate_ok(s)) {
201
+ return;
202
+ }
203
+
204
+ ssp.data_bits = 8;
205
+ ssp.parity = 'N';
206
+ ssp.stop_bits = 1;
207
+ ssp.speed = s->pclk_frq / s->bauddiv;
208
+ qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
209
+ trace_cmsdk_apb_uart_set_params(ssp.speed);
210
+}
211
+
212
+static void cmsdk_apb_uart_update(CMSDKAPBUART *s)
213
+{
214
+ /* update outbound irqs, including handling the way the rxo and txo
215
+ * interrupt status bits are just logical AND of the overrun bit in
216
+ * STATE and the overrun interrupt enable bit in CTRL.
217
+ */
218
+ uint32_t omask = (R_INTSTATUS_RXO_MASK | R_INTSTATUS_TXO_MASK);
219
+ s->intstatus &= ~omask;
220
+ s->intstatus |= (s->state & (s->ctrl >> 2) & omask);
221
+
222
+ qemu_set_irq(s->txint, !!(s->intstatus & R_INTSTATUS_TX_MASK));
223
+ qemu_set_irq(s->rxint, !!(s->intstatus & R_INTSTATUS_RX_MASK));
224
+ qemu_set_irq(s->txovrint, !!(s->intstatus & R_INTSTATUS_TXO_MASK));
225
+ qemu_set_irq(s->rxovrint, !!(s->intstatus & R_INTSTATUS_RXO_MASK));
226
+ qemu_set_irq(s->uartint, !!(s->intstatus));
227
+}
228
+
229
+static int uart_can_receive(void *opaque)
230
+{
231
+ CMSDKAPBUART *s = CMSDK_APB_UART(opaque);
232
+
233
+ /* We can take a char if RX is enabled and the buffer is empty */
234
+ if (s->ctrl & R_CTRL_RX_EN_MASK && !(s->state & R_STATE_RXFULL_MASK)) {
235
+ return 1;
236
+ }
237
+ return 0;
238
+}
239
+
240
+static void uart_receive(void *opaque, const uint8_t *buf, int size)
241
+{
242
+ CMSDKAPBUART *s = CMSDK_APB_UART(opaque);
243
+
244
+ trace_cmsdk_apb_uart_receive(*buf);
245
+
246
+ /* In fact uart_can_receive() ensures that we can't be
247
+ * called unless RX is enabled and the buffer is empty,
248
+ * but we include this logic as documentation of what the
249
+ * hardware does if a character arrives in these circumstances.
250
+ */
251
+ if (!(s->ctrl & R_CTRL_RX_EN_MASK)) {
252
+ /* Just drop the character on the floor */
253
+ return;
254
+ }
255
+
256
+ if (s->state & R_STATE_RXFULL_MASK) {
257
+ s->state |= R_STATE_RXOVERRUN_MASK;
258
+ }
259
+
260
+ s->rxbuf = *buf;
261
+ s->state |= R_STATE_RXFULL_MASK;
262
+ if (s->ctrl & R_CTRL_RX_INTEN_MASK) {
263
+ s->intstatus |= R_INTSTATUS_RX_MASK;
264
+ }
265
+ cmsdk_apb_uart_update(s);
266
+}
267
+
268
+static uint64_t uart_read(void *opaque, hwaddr offset, unsigned size)
269
+{
270
+ CMSDKAPBUART *s = CMSDK_APB_UART(opaque);
271
+ uint64_t r;
272
+
273
+ switch (offset) {
274
+ case A_DATA:
275
+ r = s->rxbuf;
276
+ s->state &= ~R_STATE_RXFULL_MASK;
277
+ cmsdk_apb_uart_update(s);
278
+ break;
279
+ case A_STATE:
280
+ r = s->state;
281
+ break;
282
+ case A_CTRL:
283
+ r = s->ctrl;
284
+ break;
285
+ case A_INTSTATUS:
286
+ r = s->intstatus;
287
+ break;
288
+ case A_BAUDDIV:
289
+ r = s->bauddiv;
290
+ break;
291
+ case A_PID4 ... A_CID3:
292
+ r = uart_id[(offset - A_PID4) / 4];
293
+ break;
294
+ default:
295
+ qemu_log_mask(LOG_GUEST_ERROR,
296
+ "CMSDK APB UART read: bad offset %x\n", (int) offset);
297
+ r = 0;
298
+ break;
299
+ }
300
+ trace_cmsdk_apb_uart_read(offset, r, size);
301
+ return r;
302
+}
303
+
304
+/* Try to send tx data, and arrange to be called back later if
305
+ * we can't (ie the char backend is busy/blocking).
306
+ */
307
+static gboolean uart_transmit(GIOChannel *chan, GIOCondition cond, void *opaque)
308
+{
309
+ CMSDKAPBUART *s = CMSDK_APB_UART(opaque);
310
+ int ret;
311
+
312
+ s->watch_tag = 0;
313
+
314
+ if (!(s->ctrl & R_CTRL_TX_EN_MASK) || !(s->state & R_STATE_TXFULL_MASK)) {
315
+ return FALSE;
316
+ }
317
+
318
+ ret = qemu_chr_fe_write(&s->chr, &s->txbuf, 1);
319
+ if (ret <= 0) {
320
+ s->watch_tag = qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
321
+ uart_transmit, s);
322
+ if (!s->watch_tag) {
323
+ /* Most common reason to be here is "no chardev backend":
324
+ * just insta-drain the buffer, so the serial output
325
+ * goes into a void, rather than blocking the guest.
326
+ */
327
+ goto buffer_drained;
328
+ }
329
+ /* Transmit pending */
330
+ trace_cmsdk_apb_uart_tx_pending();
331
+ return FALSE;
332
+ }
333
+
334
+buffer_drained:
335
+ /* Character successfully sent */
336
+ trace_cmsdk_apb_uart_tx(s->txbuf);
337
+ s->state &= ~R_STATE_TXFULL_MASK;
338
+ /* Going from TXFULL set to clear triggers the tx interrupt */
339
+ if (s->ctrl & R_CTRL_TX_INTEN_MASK) {
340
+ s->intstatus |= R_INTSTATUS_TX_MASK;
341
+ }
342
+ cmsdk_apb_uart_update(s);
343
+ return FALSE;
344
+}
345
+
346
+static void uart_cancel_transmit(CMSDKAPBUART *s)
347
+{
348
+ if (s->watch_tag) {
349
+ g_source_remove(s->watch_tag);
350
+ s->watch_tag = 0;
351
+ }
352
+}
353
+
354
+static void uart_write(void *opaque, hwaddr offset, uint64_t value,
355
+ unsigned size)
356
+{
357
+ CMSDKAPBUART *s = CMSDK_APB_UART(opaque);
358
+
359
+ trace_cmsdk_apb_uart_write(offset, value, size);
360
+
361
+ switch (offset) {
362
+ case A_DATA:
363
+ s->txbuf = value;
364
+ if (s->state & R_STATE_TXFULL_MASK) {
365
+ /* Buffer already full -- note the overrun and let the
366
+ * existing pending transmit callback handle the new char.
367
+ */
368
+ s->state |= R_STATE_TXOVERRUN_MASK;
369
+ cmsdk_apb_uart_update(s);
370
+ } else {
371
+ s->state |= R_STATE_TXFULL_MASK;
372
+ uart_transmit(NULL, G_IO_OUT, s);
373
+ }
374
+ break;
375
+ case A_STATE:
376
+ /* Bits 0 and 1 are read only; bits 2 and 3 are W1C */
377
+ s->state &= ~(value &
378
+ (R_STATE_TXOVERRUN_MASK | R_STATE_RXOVERRUN_MASK));
379
+ cmsdk_apb_uart_update(s);
380
+ break;
381
+ case A_CTRL:
382
+ s->ctrl = value & 0x7f;
383
+ if ((s->ctrl & R_CTRL_TX_EN_MASK) && !uart_baudrate_ok(s)) {
384
+ qemu_log_mask(LOG_GUEST_ERROR,
385
+ "CMSDK APB UART: Tx enabled with invalid baudrate\n");
386
+ }
387
+ cmsdk_apb_uart_update(s);
388
+ break;
389
+ case A_INTSTATUS:
390
+ /* All bits are W1C. Clearing the overrun interrupt bits really
391
+ * clears the overrun status bits in the STATE register (which
392
+ * is then reflected into the intstatus value by the update function).
393
+ */
394
+ s->state &= ~(value & (R_INTSTATUS_TXO_MASK | R_INTSTATUS_RXO_MASK));
395
+ cmsdk_apb_uart_update(s);
396
+ break;
397
+ case A_BAUDDIV:
398
+ s->bauddiv = value & 0xFFFFF;
399
+ uart_update_parameters(s);
400
+ break;
401
+ case A_PID4 ... A_CID3:
402
+ qemu_log_mask(LOG_GUEST_ERROR,
403
+ "CMSDK APB UART write: write to RO offset 0x%x\n",
404
+ (int)offset);
405
+ break;
406
+ default:
407
+ qemu_log_mask(LOG_GUEST_ERROR,
408
+ "CMSDK APB UART write: bad offset 0x%x\n", (int) offset);
409
+ break;
410
+ }
411
+}
412
+
413
+static const MemoryRegionOps uart_ops = {
414
+ .read = uart_read,
415
+ .write = uart_write,
416
+ .endianness = DEVICE_LITTLE_ENDIAN,
417
+};
418
+
419
+static void cmsdk_apb_uart_reset(DeviceState *dev)
420
+{
421
+ CMSDKAPBUART *s = CMSDK_APB_UART(dev);
422
+
423
+ trace_cmsdk_apb_uart_reset();
424
+ uart_cancel_transmit(s);
425
+ s->state = 0;
426
+ s->ctrl = 0;
427
+ s->intstatus = 0;
428
+ s->bauddiv = 0;
429
+ s->txbuf = 0;
430
+ s->rxbuf = 0;
431
+}
432
+
433
+static void cmsdk_apb_uart_init(Object *obj)
434
+{
435
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
436
+ CMSDKAPBUART *s = CMSDK_APB_UART(obj);
437
+
438
+ memory_region_init_io(&s->iomem, obj, &uart_ops, s, "uart", 0x1000);
439
+ sysbus_init_mmio(sbd, &s->iomem);
440
+ sysbus_init_irq(sbd, &s->txint);
441
+ sysbus_init_irq(sbd, &s->rxint);
442
+ sysbus_init_irq(sbd, &s->txovrint);
443
+ sysbus_init_irq(sbd, &s->rxovrint);
444
+ sysbus_init_irq(sbd, &s->uartint);
445
+}
446
+
447
+static void cmsdk_apb_uart_realize(DeviceState *dev, Error **errp)
448
+{
449
+ CMSDKAPBUART *s = CMSDK_APB_UART(dev);
450
+
451
+ if (s->pclk_frq == 0) {
452
+ error_setg(errp, "CMSDK APB UART: pclk-frq property must be set");
453
+ return;
454
+ }
455
+
456
+ /* This UART has no flow control, so we do not need to register
457
+ * an event handler to deal with CHR_EVENT_BREAK.
458
+ */
459
+ qemu_chr_fe_set_handlers(&s->chr, uart_can_receive, uart_receive,
460
+ NULL, s, NULL, true);
461
+}
462
+
463
+static int cmsdk_apb_uart_post_load(void *opaque, int version_id)
464
+{
465
+ CMSDKAPBUART *s = CMSDK_APB_UART(opaque);
466
+
467
+ /* If we have a pending character, arrange to resend it. */
468
+ if (s->state & R_STATE_TXFULL_MASK) {
469
+ s->watch_tag = qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
470
+ uart_transmit, s);
471
+ }
472
+ uart_update_parameters(s);
473
+ return 0;
474
+}
475
+
476
+static const VMStateDescription cmsdk_apb_uart_vmstate = {
477
+ .name = "cmsdk-apb-uart",
478
+ .version_id = 1,
479
+ .minimum_version_id = 1,
480
+ .post_load = cmsdk_apb_uart_post_load,
481
+ .fields = (VMStateField[]) {
482
+ VMSTATE_UINT32(state, CMSDKAPBUART),
483
+ VMSTATE_UINT32(ctrl, CMSDKAPBUART),
484
+ VMSTATE_UINT32(intstatus, CMSDKAPBUART),
485
+ VMSTATE_UINT32(bauddiv, CMSDKAPBUART),
486
+ VMSTATE_UINT8(txbuf, CMSDKAPBUART),
487
+ VMSTATE_UINT8(rxbuf, CMSDKAPBUART),
488
+ VMSTATE_END_OF_LIST()
489
+ }
490
+};
491
+
492
+static Property cmsdk_apb_uart_properties[] = {
493
+ DEFINE_PROP_CHR("chardev", CMSDKAPBUART, chr),
494
+ DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBUART, pclk_frq, 0),
495
+ DEFINE_PROP_END_OF_LIST(),
496
+};
497
+
498
+static void cmsdk_apb_uart_class_init(ObjectClass *klass, void *data)
499
+{
500
+ DeviceClass *dc = DEVICE_CLASS(klass);
501
+
502
+ dc->realize = cmsdk_apb_uart_realize;
503
+ dc->vmsd = &cmsdk_apb_uart_vmstate;
504
+ dc->reset = cmsdk_apb_uart_reset;
505
+ dc->props = cmsdk_apb_uart_properties;
506
+}
507
+
508
+static const TypeInfo cmsdk_apb_uart_info = {
509
+ .name = TYPE_CMSDK_APB_UART,
510
+ .parent = TYPE_SYS_BUS_DEVICE,
511
+ .instance_size = sizeof(CMSDKAPBUART),
512
+ .instance_init = cmsdk_apb_uart_init,
513
+ .class_init = cmsdk_apb_uart_class_init,
514
+};
515
+
516
+static void cmsdk_apb_uart_register_types(void)
517
+{
518
+ type_register_static(&cmsdk_apb_uart_info);
519
+}
520
+
521
+type_init(cmsdk_apb_uart_register_types);
522
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
523
index XXXXXXX..XXXXXXX 100644
524
--- a/default-configs/arm-softmmu.mak
525
+++ b/default-configs/arm-softmmu.mak
526
@@ -XXX,XX +XXX,XX @@ CONFIG_STM32F2XX_ADC=y
527
CONFIG_STM32F2XX_SPI=y
528
CONFIG_STM32F205_SOC=y
529
530
+CONFIG_CMSDK_APB_UART=y
531
+
532
CONFIG_VERSATILE_PCI=y
533
CONFIG_VERSATILE_I2C=y
534
535
diff --git a/hw/char/trace-events b/hw/char/trace-events
536
index XXXXXXX..XXXXXXX 100644
537
--- a/hw/char/trace-events
538
+++ b/hw/char/trace-events
539
@@ -XXX,XX +XXX,XX @@ pl011_write(uint32_t addr, uint32_t value) "addr 0x%08x value 0x%08x"
540
pl011_can_receive(uint32_t lcr, int read_count, int r) "LCR %08x read_count %d returning %d"
541
pl011_put_fifo(uint32_t c, int read_count) "new char 0x%x read_count now %d"
542
pl011_put_fifo_full(void) "FIFO now full, RXFF set"
543
+
544
+# hw/char/cmsdk_apb_uart.c
545
+cmsdk_apb_uart_read(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB UART read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
546
+cmsdk_apb_uart_write(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB UART write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
547
+cmsdk_apb_uart_reset(void) "CMSDK APB UART: reset"
548
+cmsdk_apb_uart_receive(uint8_t c) "CMSDK APB UART: got character 0x%x from backend"
549
+cmsdk_apb_uart_tx_pending(void) "CMSDK APB UART: character send to backend pending"
550
+cmsdk_apb_uart_tx(uint8_t c) "CMSDK APB UART: character 0x%x sent to backend"
551
+cmsdk_apb_uart_set_params(int speed) "CMSDK APB UART: params set to %d 8N1"
552
--
26
--
553
2.7.4
27
2.19.2
554
28
555
29
diff view generated by jsdifflib
1
Model the ARM MPS2/MPS2+ FPGA based development board.
1
At the same time, define the fields for these registers,
2
and use those defines in arm_pamax().
2
3
3
The MPS2 and MPS2+ dev boards are FPGA based (the 2+ has a bigger
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
FPGA but is otherwise the same as the 2). Since the CPU itself
5
Message-id: 20181203203839.757-2-richard.henderson@linaro.org
5
and most of the devices are in the FPGA, the details of the board
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
as seen by the guest depend significantly on the FPGA image.
7
[PMM: fixed up typo (s/achf/ahcf/) belatedly spotted by RTH]
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/cpu.h | 26 ++++++++++++++++++++++++--
11
target/arm/internals.h | 3 ++-
12
target/arm/cpu64.c | 6 +++---
13
target/arm/helper.c | 4 ++--
14
target/arm/kvm64.c | 4 ++++
15
5 files changed, 35 insertions(+), 8 deletions(-)
7
16
8
We model the following FPGA images:
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
9
"mps2_an385" -- Cortex-M3 as documented in ARM Application Note AN385
10
"mps2_an511" -- Cortex-M3 'DesignStart' as documented in AN511
11
12
They are fairly similar but differ in the details for some
13
peripherals.
14
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Message-id: 1500029487-14822-2-git-send-email-peter.maydell@linaro.org
17
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
18
---
19
hw/arm/Makefile.objs | 1 +
20
hw/arm/mps2.c | 270 ++++++++++++++++++++++++++++++++++++++++
21
default-configs/arm-softmmu.mak | 1 +
22
3 files changed, 272 insertions(+)
23
create mode 100644 hw/arm/mps2.c
24
25
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
26
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/arm/Makefile.objs
19
--- a/target/arm/cpu.h
28
+++ b/hw/arm/Makefile.objs
20
+++ b/target/arm/cpu.h
29
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_FSL_IMX25) += fsl-imx25.o imx25_pdk.o
21
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
30
obj-$(CONFIG_FSL_IMX31) += fsl-imx31.o kzm.o
22
uint64_t id_aa64isar1;
31
obj-$(CONFIG_FSL_IMX6) += fsl-imx6.o sabrelite.o
23
uint64_t id_aa64pfr0;
32
obj-$(CONFIG_ASPEED_SOC) += aspeed_soc.o aspeed.o
24
uint64_t id_aa64pfr1;
33
+obj-$(CONFIG_MPS2) += mps2.o
25
+ uint64_t id_aa64mmfr0;
34
diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c
26
+ uint64_t id_aa64mmfr1;
35
new file mode 100644
27
} isar;
36
index XXXXXXX..XXXXXXX
28
uint32_t midr;
37
--- /dev/null
29
uint32_t revidr;
38
+++ b/hw/arm/mps2.c
30
@@ -XXX,XX +XXX,XX @@ struct ARMCPU {
39
@@ -XXX,XX +XXX,XX @@
31
uint64_t id_aa64dfr1;
40
+/*
32
uint64_t id_aa64afr0;
41
+ * ARM V2M MPS2 board emulation.
33
uint64_t id_aa64afr1;
42
+ *
34
- uint64_t id_aa64mmfr0;
43
+ * Copyright (c) 2017 Linaro Limited
35
- uint64_t id_aa64mmfr1;
44
+ * Written by Peter Maydell
36
uint32_t dbgdidr;
45
+ *
37
uint32_t clidr;
46
+ * This program is free software; you can redistribute it and/or modify
38
uint64_t mp_affinity; /* MP ID without feature bits */
47
+ * it under the terms of the GNU General Public License version 2 or
39
@@ -XXX,XX +XXX,XX @@ FIELD(ID_AA64PFR0, GIC, 24, 4)
48
+ * (at your option) any later version.
40
FIELD(ID_AA64PFR0, RAS, 28, 4)
49
+ */
41
FIELD(ID_AA64PFR0, SVE, 32, 4)
42
43
+FIELD(ID_AA64MMFR0, PARANGE, 0, 4)
44
+FIELD(ID_AA64MMFR0, ASIDBITS, 4, 4)
45
+FIELD(ID_AA64MMFR0, BIGEND, 8, 4)
46
+FIELD(ID_AA64MMFR0, SNSMEM, 12, 4)
47
+FIELD(ID_AA64MMFR0, BIGENDEL0, 16, 4)
48
+FIELD(ID_AA64MMFR0, TGRAN16, 20, 4)
49
+FIELD(ID_AA64MMFR0, TGRAN64, 24, 4)
50
+FIELD(ID_AA64MMFR0, TGRAN4, 28, 4)
51
+FIELD(ID_AA64MMFR0, TGRAN16_2, 32, 4)
52
+FIELD(ID_AA64MMFR0, TGRAN64_2, 36, 4)
53
+FIELD(ID_AA64MMFR0, TGRAN4_2, 40, 4)
54
+FIELD(ID_AA64MMFR0, EXS, 44, 4)
50
+
55
+
51
+/* The MPS2 and MPS2+ dev boards are FPGA based (the 2+ has a bigger
56
+FIELD(ID_AA64MMFR1, HAFDBS, 0, 4)
52
+ * FPGA but is otherwise the same as the 2). Since the CPU itself
57
+FIELD(ID_AA64MMFR1, VMIDBITS, 4, 4)
53
+ * and most of the devices are in the FPGA, the details of the board
58
+FIELD(ID_AA64MMFR1, VH, 8, 4)
54
+ * as seen by the guest depend significantly on the FPGA image.
59
+FIELD(ID_AA64MMFR1, HPDS, 12, 4)
55
+ * We model the following FPGA images:
60
+FIELD(ID_AA64MMFR1, LO, 16, 4)
56
+ * "mps2-an385" -- Cortex-M3 as documented in ARM Application Note AN385
61
+FIELD(ID_AA64MMFR1, PAN, 20, 4)
57
+ * "mps2-an511" -- Cortex-M3 'DesignStart' as documented in AN511
62
+FIELD(ID_AA64MMFR1, SPECSEI, 24, 4)
58
+ *
63
+FIELD(ID_AA64MMFR1, XNX, 28, 4)
59
+ * Links to the TRM for the board itself and to the various Application
60
+ * Notes which document the FPGA images can be found here:
61
+ * https://developer.arm.com/products/system-design/development-boards/cortex-m-prototyping-system
62
+ */
63
+
64
+
64
+#include "qemu/osdep.h"
65
QEMU_BUILD_BUG_ON(ARRAY_SIZE(((ARMCPU *)0)->ccsidr) <= R_V7M_CSSELR_INDEX_MASK);
65
+#include "qapi/error.h"
66
66
+#include "qemu/error-report.h"
67
/* If adding a feature bit which corresponds to a Linux ELF
67
+#include "hw/arm/arm.h"
68
diff --git a/target/arm/internals.h b/target/arm/internals.h
68
+#include "hw/arm/armv7m.h"
69
+#include "hw/boards.h"
70
+#include "exec/address-spaces.h"
71
+#include "hw/misc/unimp.h"
72
+
73
+typedef enum MPS2FPGAType {
74
+ FPGA_AN385,
75
+ FPGA_AN511,
76
+} MPS2FPGAType;
77
+
78
+typedef struct {
79
+ MachineClass parent;
80
+ MPS2FPGAType fpga_type;
81
+ const char *cpu_model;
82
+} MPS2MachineClass;
83
+
84
+typedef struct {
85
+ MachineState parent;
86
+
87
+ ARMv7MState armv7m;
88
+ MemoryRegion psram;
89
+ MemoryRegion ssram1;
90
+ MemoryRegion ssram1_m;
91
+ MemoryRegion ssram23;
92
+ MemoryRegion ssram23_m;
93
+ MemoryRegion blockram;
94
+ MemoryRegion blockram_m1;
95
+ MemoryRegion blockram_m2;
96
+ MemoryRegion blockram_m3;
97
+ MemoryRegion sram;
98
+} MPS2MachineState;
99
+
100
+#define TYPE_MPS2_MACHINE "mps2"
101
+#define TYPE_MPS2_AN385_MACHINE MACHINE_TYPE_NAME("mps2-an385")
102
+#define TYPE_MPS2_AN511_MACHINE MACHINE_TYPE_NAME("mps2-an511")
103
+
104
+#define MPS2_MACHINE(obj) \
105
+ OBJECT_CHECK(MPS2MachineState, obj, TYPE_MPS2_MACHINE)
106
+#define MPS2_MACHINE_GET_CLASS(obj) \
107
+ OBJECT_GET_CLASS(MPS2MachineClass, obj, TYPE_MPS2_MACHINE)
108
+#define MPS2_MACHINE_CLASS(klass) \
109
+ OBJECT_CLASS_CHECK(MPS2MachineClass, klass, TYPE_MPS2_MACHINE)
110
+
111
+/* Main SYSCLK frequency in Hz */
112
+#define SYSCLK_FRQ 25000000
113
+
114
+/* Initialize the auxiliary RAM region @mr and map it into
115
+ * the memory map at @base.
116
+ */
117
+static void make_ram(MemoryRegion *mr, const char *name,
118
+ hwaddr base, hwaddr size)
119
+{
120
+ memory_region_init_ram(mr, NULL, name, size, &error_fatal);
121
+ memory_region_add_subregion(get_system_memory(), base, mr);
122
+}
123
+
124
+/* Create an alias of an entire original MemoryRegion @orig
125
+ * located at @base in the memory map.
126
+ */
127
+static void make_ram_alias(MemoryRegion *mr, const char *name,
128
+ MemoryRegion *orig, hwaddr base)
129
+{
130
+ memory_region_init_alias(mr, NULL, name, orig, 0,
131
+ memory_region_size(orig));
132
+ memory_region_add_subregion(get_system_memory(), base, mr);
133
+}
134
+
135
+static void mps2_common_init(MachineState *machine)
136
+{
137
+ MPS2MachineState *mms = MPS2_MACHINE(machine);
138
+ MPS2MachineClass *mmc = MPS2_MACHINE_GET_CLASS(machine);
139
+ MemoryRegion *system_memory = get_system_memory();
140
+ DeviceState *armv7m;
141
+
142
+ if (!machine->cpu_model) {
143
+ machine->cpu_model = mmc->cpu_model;
144
+ }
145
+
146
+ if (strcmp(machine->cpu_model, mmc->cpu_model) != 0) {
147
+ error_report("This board can only be used with CPU %s", mmc->cpu_model);
148
+ exit(1);
149
+ }
150
+
151
+ /* The FPGA images have an odd combination of different RAMs,
152
+ * because in hardware they are different implementations and
153
+ * connected to different buses, giving varying performance/size
154
+ * tradeoffs. For QEMU they're all just RAM, though. We arbitrarily
155
+ * call the 16MB our "system memory", as it's the largest lump.
156
+ *
157
+ * Common to both boards:
158
+ * 0x21000000..0x21ffffff : PSRAM (16MB)
159
+ * AN385 only:
160
+ * 0x00000000 .. 0x003fffff : ZBT SSRAM1
161
+ * 0x00400000 .. 0x007fffff : mirror of ZBT SSRAM1
162
+ * 0x20000000 .. 0x203fffff : ZBT SSRAM 2&3
163
+ * 0x20400000 .. 0x207fffff : mirror of ZBT SSRAM 2&3
164
+ * 0x01000000 .. 0x01003fff : block RAM (16K)
165
+ * 0x01004000 .. 0x01007fff : mirror of above
166
+ * 0x01008000 .. 0x0100bfff : mirror of above
167
+ * 0x0100c000 .. 0x0100ffff : mirror of above
168
+ * AN511 only:
169
+ * 0x00000000 .. 0x0003ffff : FPGA block RAM
170
+ * 0x00400000 .. 0x007fffff : ZBT SSRAM1
171
+ * 0x20000000 .. 0x2001ffff : SRAM
172
+ * 0x20400000 .. 0x207fffff : ZBT SSRAM 2&3
173
+ *
174
+ * The AN385 has a feature where the lowest 16K can be mapped
175
+ * either to the bottom of the ZBT SSRAM1 or to the block RAM.
176
+ * This is of no use for QEMU so we don't implement it (as if
177
+ * zbt_boot_ctrl is always zero).
178
+ */
179
+ memory_region_allocate_system_memory(&mms->psram,
180
+ NULL, "mps.ram", 0x1000000);
181
+ memory_region_add_subregion(system_memory, 0x21000000, &mms->psram);
182
+
183
+ switch (mmc->fpga_type) {
184
+ case FPGA_AN385:
185
+ make_ram(&mms->ssram1, "mps.ssram1", 0x0, 0x400000);
186
+ make_ram_alias(&mms->ssram1_m, "mps.ssram1_m", &mms->ssram1, 0x400000);
187
+ make_ram(&mms->ssram23, "mps.ssram23", 0x20000000, 0x400000);
188
+ make_ram_alias(&mms->ssram23_m, "mps.ssram23_m",
189
+ &mms->ssram23, 0x20400000);
190
+ make_ram(&mms->blockram, "mps.blockram", 0x01000000, 0x4000);
191
+ make_ram_alias(&mms->blockram_m1, "mps.blockram_m1",
192
+ &mms->blockram, 0x01004000);
193
+ make_ram_alias(&mms->blockram_m2, "mps.blockram_m2",
194
+ &mms->blockram, 0x01008000);
195
+ make_ram_alias(&mms->blockram_m3, "mps.blockram_m3",
196
+ &mms->blockram, 0x0100c000);
197
+ break;
198
+ case FPGA_AN511:
199
+ make_ram(&mms->blockram, "mps.blockram", 0x0, 0x40000);
200
+ make_ram(&mms->ssram1, "mps.ssram1", 0x00400000, 0x00800000);
201
+ make_ram(&mms->sram, "mps.sram", 0x20000000, 0x20000);
202
+ make_ram(&mms->ssram23, "mps.ssram23", 0x20400000, 0x400000);
203
+ break;
204
+ default:
205
+ g_assert_not_reached();
206
+ }
207
+
208
+ object_initialize(&mms->armv7m, sizeof(mms->armv7m), TYPE_ARMV7M);
209
+ armv7m = DEVICE(&mms->armv7m);
210
+ qdev_set_parent_bus(armv7m, sysbus_get_default());
211
+ switch (mmc->fpga_type) {
212
+ case FPGA_AN385:
213
+ qdev_prop_set_uint32(armv7m, "num-irq", 32);
214
+ break;
215
+ case FPGA_AN511:
216
+ qdev_prop_set_uint32(armv7m, "num-irq", 64);
217
+ break;
218
+ default:
219
+ g_assert_not_reached();
220
+ }
221
+ qdev_prop_set_string(armv7m, "cpu-model", machine->cpu_model);
222
+ object_property_set_link(OBJECT(&mms->armv7m), OBJECT(system_memory),
223
+ "memory", &error_abort);
224
+ object_property_set_bool(OBJECT(&mms->armv7m), true, "realized",
225
+ &error_fatal);
226
+
227
+ create_unimplemented_device("zbtsmram mirror", 0x00400000, 0x00400000);
228
+ create_unimplemented_device("RESERVED 1", 0x00800000, 0x00800000);
229
+ create_unimplemented_device("Block RAM", 0x01000000, 0x00010000);
230
+ create_unimplemented_device("RESERVED 2", 0x01010000, 0x1EFF0000);
231
+ create_unimplemented_device("RESERVED 3", 0x20800000, 0x00800000);
232
+ create_unimplemented_device("PSRAM", 0x21000000, 0x01000000);
233
+ /* These three ranges all cover multiple devices; we may implement
234
+ * some of them below (in which case the real device takes precedence
235
+ * over the unimplemented-region mapping).
236
+ */
237
+ create_unimplemented_device("CMSDK APB peripheral region @0x40000000",
238
+ 0x40000000, 0x00010000);
239
+ create_unimplemented_device("CMSDK peripheral region @0x40010000",
240
+ 0x40010000, 0x00010000);
241
+ create_unimplemented_device("Extra peripheral region @0x40020000",
242
+ 0x40020000, 0x00010000);
243
+ create_unimplemented_device("RESERVED 4", 0x40030000, 0x001D0000);
244
+ create_unimplemented_device("Ethernet", 0x40200000, 0x00100000);
245
+ create_unimplemented_device("VGA", 0x41000000, 0x0200000);
246
+
247
+ system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ;
248
+
249
+ armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename,
250
+ 0x400000);
251
+}
252
+
253
+static void mps2_class_init(ObjectClass *oc, void *data)
254
+{
255
+ MachineClass *mc = MACHINE_CLASS(oc);
256
+
257
+ mc->init = mps2_common_init;
258
+ mc->max_cpus = 1;
259
+}
260
+
261
+static void mps2_an385_class_init(ObjectClass *oc, void *data)
262
+{
263
+ MachineClass *mc = MACHINE_CLASS(oc);
264
+ MPS2MachineClass *mmc = MPS2_MACHINE_CLASS(oc);
265
+
266
+ mc->desc = "ARM MPS2 with AN385 FPGA image for Cortex-M3";
267
+ mmc->fpga_type = FPGA_AN385;
268
+ mmc->cpu_model = "cortex-m3";
269
+}
270
+
271
+static void mps2_an511_class_init(ObjectClass *oc, void *data)
272
+{
273
+ MachineClass *mc = MACHINE_CLASS(oc);
274
+ MPS2MachineClass *mmc = MPS2_MACHINE_CLASS(oc);
275
+
276
+ mc->desc = "ARM MPS2 with AN511 DesignStart FPGA image for Cortex-M3";
277
+ mmc->fpga_type = FPGA_AN511;
278
+ mmc->cpu_model = "cortex-m3";
279
+}
280
+
281
+static const TypeInfo mps2_info = {
282
+ .name = TYPE_MPS2_MACHINE,
283
+ .parent = TYPE_MACHINE,
284
+ .abstract = true,
285
+ .instance_size = sizeof(MPS2MachineState),
286
+ .class_size = sizeof(MPS2MachineClass),
287
+ .class_init = mps2_class_init,
288
+};
289
+
290
+static const TypeInfo mps2_an385_info = {
291
+ .name = TYPE_MPS2_AN385_MACHINE,
292
+ .parent = TYPE_MPS2_MACHINE,
293
+ .class_init = mps2_an385_class_init,
294
+};
295
+
296
+static const TypeInfo mps2_an511_info = {
297
+ .name = TYPE_MPS2_AN511_MACHINE,
298
+ .parent = TYPE_MPS2_MACHINE,
299
+ .class_init = mps2_an511_class_init,
300
+};
301
+
302
+static void mps2_machine_init(void)
303
+{
304
+ type_register_static(&mps2_info);
305
+ type_register_static(&mps2_an385_info);
306
+ type_register_static(&mps2_an511_info);
307
+}
308
+
309
+type_init(mps2_machine_init);
310
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
311
index XXXXXXX..XXXXXXX 100644
69
index XXXXXXX..XXXXXXX 100644
312
--- a/default-configs/arm-softmmu.mak
70
--- a/target/arm/internals.h
313
+++ b/default-configs/arm-softmmu.mak
71
+++ b/target/arm/internals.h
314
@@ -XXX,XX +XXX,XX @@ CONFIG_ONENAND=y
72
@@ -XXX,XX +XXX,XX @@ static inline unsigned int arm_pamax(ARMCPU *cpu)
315
CONFIG_TUSB6010=y
73
[4] = 44,
316
CONFIG_IMX=y
74
[5] = 48,
317
CONFIG_MAINSTONE=y
75
};
318
+CONFIG_MPS2=y
76
- unsigned int parange = extract32(cpu->id_aa64mmfr0, 0, 4);
319
CONFIG_NSERIES=y
77
+ unsigned int parange =
320
CONFIG_RASPI=y
78
+ FIELD_EX64(cpu->isar.id_aa64mmfr0, ID_AA64MMFR0, PARANGE);
321
CONFIG_REALVIEW=y
79
80
/* id_aa64mmfr0 is a read-only register so values outside of the
81
* supported mappings can be considered an implementation error. */
82
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/target/arm/cpu64.c
85
+++ b/target/arm/cpu64.c
86
@@ -XXX,XX +XXX,XX @@ static void aarch64_a57_initfn(Object *obj)
87
cpu->pmceid0 = 0x00000000;
88
cpu->pmceid1 = 0x00000000;
89
cpu->isar.id_aa64isar0 = 0x00011120;
90
- cpu->id_aa64mmfr0 = 0x00001124;
91
+ cpu->isar.id_aa64mmfr0 = 0x00001124;
92
cpu->dbgdidr = 0x3516d000;
93
cpu->clidr = 0x0a200023;
94
cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
95
@@ -XXX,XX +XXX,XX @@ static void aarch64_a53_initfn(Object *obj)
96
cpu->isar.id_aa64pfr0 = 0x00002222;
97
cpu->id_aa64dfr0 = 0x10305106;
98
cpu->isar.id_aa64isar0 = 0x00011120;
99
- cpu->id_aa64mmfr0 = 0x00001122; /* 40 bit physical addr */
100
+ cpu->isar.id_aa64mmfr0 = 0x00001122; /* 40 bit physical addr */
101
cpu->dbgdidr = 0x3516d000;
102
cpu->clidr = 0x0a200023;
103
cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */
104
@@ -XXX,XX +XXX,XX @@ static void aarch64_a72_initfn(Object *obj)
105
cpu->pmceid0 = 0x00000000;
106
cpu->pmceid1 = 0x00000000;
107
cpu->isar.id_aa64isar0 = 0x00011120;
108
- cpu->id_aa64mmfr0 = 0x00001124;
109
+ cpu->isar.id_aa64mmfr0 = 0x00001124;
110
cpu->dbgdidr = 0x3516d000;
111
cpu->clidr = 0x0a200023;
112
cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
113
diff --git a/target/arm/helper.c b/target/arm/helper.c
114
index XXXXXXX..XXXXXXX 100644
115
--- a/target/arm/helper.c
116
+++ b/target/arm/helper.c
117
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
118
{ .name = "ID_AA64MMFR0_EL1", .state = ARM_CP_STATE_AA64,
119
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 0,
120
.access = PL1_R, .type = ARM_CP_CONST,
121
- .resetvalue = cpu->id_aa64mmfr0 },
122
+ .resetvalue = cpu->isar.id_aa64mmfr0 },
123
{ .name = "ID_AA64MMFR1_EL1", .state = ARM_CP_STATE_AA64,
124
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 1,
125
.access = PL1_R, .type = ARM_CP_CONST,
126
- .resetvalue = cpu->id_aa64mmfr1 },
127
+ .resetvalue = cpu->isar.id_aa64mmfr1 },
128
{ .name = "ID_AA64MMFR2_EL1_RESERVED", .state = ARM_CP_STATE_AA64,
129
.opc0 = 3, .opc1 = 0, .crn = 0, .crm = 7, .opc2 = 2,
130
.access = PL1_R, .type = ARM_CP_CONST,
131
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
132
index XXXXXXX..XXXXXXX 100644
133
--- a/target/arm/kvm64.c
134
+++ b/target/arm/kvm64.c
135
@@ -XXX,XX +XXX,XX @@ bool kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf)
136
ARM64_SYS_REG(3, 0, 0, 6, 0));
137
err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64isar1,
138
ARM64_SYS_REG(3, 0, 0, 6, 1));
139
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr0,
140
+ ARM64_SYS_REG(3, 0, 0, 7, 0));
141
+ err |= read_sys_reg64(fdarray[2], &ahcf->isar.id_aa64mmfr1,
142
+ ARM64_SYS_REG(3, 0, 0, 7, 1));
143
144
/*
145
* Note that if AArch32 support is not present in the host,
322
--
146
--
323
2.7.4
147
2.19.2
324
148
325
149
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
While an ISB will ensure any raised IRQs happen on the next
3
Post v8.3 bits taken from SysReg_v85_xml-00bet8.
4
instruction it doesn't cause any to get raised by itself. We can
5
therefore use a simple tb exit for ISB instructions and rely on the
6
exit_request check at the top of each TB to deal with exiting if
7
needed.
8
4
9
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Richard Henderson <rth@twiddle.net>
6
Message-id: 20181203203839.757-3-richard.henderson@linaro.org
11
Message-id: 20170713141928.25419-6-alex.bennee@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
9
---
14
target/arm/translate-a64.c | 2 +-
10
target/arm/cpu.h | 22 +++++++++++++++++++++-
15
target/arm/translate.c | 4 ++--
11
1 file changed, 21 insertions(+), 1 deletion(-)
16
2 files changed, 3 insertions(+), 3 deletions(-)
17
12
18
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/target/arm/translate-a64.c
15
--- a/target/arm/cpu.h
21
+++ b/target/arm/translate-a64.c
16
+++ b/target/arm/cpu.h
22
@@ -XXX,XX +XXX,XX @@ static void handle_sync(DisasContext *s, uint32_t insn,
17
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
23
* a self-modified code correctly and also to take
18
#define HCR_TIDCP (1ULL << 20)
24
* any pending interrupts immediately.
19
#define HCR_TACR (1ULL << 21)
25
*/
20
#define HCR_TSW (1ULL << 22)
26
- s->is_jmp = DISAS_UPDATE;
21
-#define HCR_TPC (1ULL << 23)
27
+ gen_goto_tb(s, 0, s->pc);
22
+#define HCR_TPCP (1ULL << 23)
28
return;
23
#define HCR_TPU (1ULL << 24)
29
default:
24
#define HCR_TTLB (1ULL << 25)
30
unallocated_encoding(s);
25
#define HCR_TVM (1ULL << 26)
31
diff --git a/target/arm/translate.c b/target/arm/translate.c
26
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
32
index XXXXXXX..XXXXXXX 100644
27
#define HCR_CD (1ULL << 32)
33
--- a/target/arm/translate.c
28
#define HCR_ID (1ULL << 33)
34
+++ b/target/arm/translate.c
29
#define HCR_E2H (1ULL << 34)
35
@@ -XXX,XX +XXX,XX @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
30
+#define HCR_TLOR (1ULL << 35)
36
* self-modifying code correctly and also to take
31
+#define HCR_TERR (1ULL << 36)
37
* any pending interrupts immediately.
32
+#define HCR_TEA (1ULL << 37)
38
*/
33
+#define HCR_MIOCNCE (1ULL << 38)
39
- gen_lookup_tb(s);
34
+#define HCR_APK (1ULL << 40)
40
+ gen_goto_tb(s, 0, s->pc & ~1);
35
+#define HCR_API (1ULL << 41)
41
return;
36
+#define HCR_NV (1ULL << 42)
42
default:
37
+#define HCR_NV1 (1ULL << 43)
43
goto illegal_op;
38
+#define HCR_AT (1ULL << 44)
44
@@ -XXX,XX +XXX,XX @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
39
+#define HCR_NV2 (1ULL << 45)
45
* and also to take any pending interrupts
40
+#define HCR_FWB (1ULL << 46)
46
* immediately.
41
+#define HCR_FIEN (1ULL << 47)
47
*/
42
+#define HCR_TID4 (1ULL << 49)
48
- gen_lookup_tb(s);
43
+#define HCR_TICAB (1ULL << 50)
49
+ gen_goto_tb(s, 0, s->pc & ~1);
44
+#define HCR_TOCU (1ULL << 52)
50
break;
45
+#define HCR_TTLBIS (1ULL << 54)
51
default:
46
+#define HCR_TTLBOS (1ULL << 55)
52
goto illegal_op;
47
+#define HCR_ATA (1ULL << 56)
48
+#define HCR_DCT (1ULL << 57)
49
+
50
/*
51
* When we actually implement ARMv8.1-VHE we should add HCR_E2H to
52
* HCR_MASK and then clear it again if the feature bit is not set in
53
--
53
--
54
2.7.4
54
2.19.2
55
55
56
56
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We already have an exit condition, DISAS_UPDATE which will exit the
3
Post v8.4 bits taken from SysReg_v85_xml-00bet8.
4
run-loop. Expand on the difference with DISAS_EXIT in the comments.
5
4
6
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Richard Henderson <rth@twiddle.net>
6
Message-id: 20181203203839.757-4-richard.henderson@linaro.org
8
Message-id: 20170713141928.25419-4-alex.bennee@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
target/arm/translate.h | 5 ++++-
10
target/arm/cpu.h | 10 ++++++++++
12
1 file changed, 4 insertions(+), 1 deletion(-)
11
1 file changed, 10 insertions(+)
13
12
14
diff --git a/target/arm/translate.h b/target/arm/translate.h
13
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate.h
15
--- a/target/arm/cpu.h
17
+++ b/target/arm/translate.h
16
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@ static void disas_set_insn_syndrome(DisasContext *s, uint32_t syn)
17
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
19
*/
18
#define SCR_ST (1U << 11)
20
#define DISAS_BX_EXCRET 11
19
#define SCR_TWI (1U << 12)
21
/* For instructions which want an immediate exit to the main loop,
20
#define SCR_TWE (1U << 13)
22
- * as opposed to attempting to use lookup_and_goto_ptr.
21
+#define SCR_TLOR (1U << 14)
23
+ * as opposed to attempting to use lookup_and_goto_ptr. Unlike
22
+#define SCR_TERR (1U << 15)
24
+ * DISAS_UPDATE this doesn't write the PC on exiting the translation
23
+#define SCR_APK (1U << 16)
25
+ * loop so you need to ensure something (gen_a64_set_pc_im or runtime
24
+#define SCR_API (1U << 17)
26
+ * helper) has done so before we reach return from cpu_tb_exec.
25
+#define SCR_EEL2 (1U << 18)
27
*/
26
+#define SCR_EASE (1U << 19)
28
#define DISAS_EXIT 12
27
+#define SCR_NMEA (1U << 20)
28
+#define SCR_FIEN (1U << 21)
29
+#define SCR_ENSCXT (1U << 25)
30
+#define SCR_ATA (1U << 26)
31
#define SCR_AARCH32_MASK (0x3fff & ~(SCR_RW | SCR_ST))
32
#define SCR_AARCH64_MASK (0x3fff & ~SCR_NET)
29
33
30
--
34
--
31
2.7.4
35
2.19.2
32
36
33
37
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
As a precursor to later patches attempt to come up with a more
3
The enable for TGE has already occurred within arm_hcr_el2_amo
4
concrete wording for what each of the common exit cases would be.
4
and friends. Moreover, when E2H is also set, the sense is
5
supposed to be reversed, which has also already occurred within
6
the helpers.
5
7
6
CC: Emilio G. Cota <cota@braap.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
CC: Richard Henderson <rth@twiddle.net>
9
Message-id: 20181203203839.757-5-richard.henderson@linaro.org
8
CC: Lluís Vilanova <vilanova@ac.upc.edu>
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Richard Henderson <rth@twiddle.net>
11
Message-id: 20170713141928.25419-2-alex.bennee@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
12
---
14
include/exec/exec-all.h | 29 ++++++++++++++++++++++++++---
13
target/arm/helper.c | 3 ---
15
1 file changed, 26 insertions(+), 3 deletions(-)
14
1 file changed, 3 deletions(-)
16
15
17
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
16
diff --git a/target/arm/helper.c b/target/arm/helper.c
18
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
19
--- a/include/exec/exec-all.h
18
--- a/target/arm/helper.c
20
+++ b/include/exec/exec-all.h
19
+++ b/target/arm/helper.c
21
@@ -XXX,XX +XXX,XX @@ typedef abi_ulong tb_page_addr_t;
20
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
22
typedef ram_addr_t tb_page_addr_t;
21
break;
23
#endif
22
};
24
23
25
-/* is_jmp field values */
24
- /* If HCR.TGE is set then HCR is treated as being 1 */
26
+/* DisasContext is_jmp field values
25
- hcr |= ((env->cp15.hcr_el2 & HCR_TGE) == HCR_TGE);
27
+ *
26
-
28
+ * is_jmp starts as DISAS_NEXT. The translator will keep processing
27
/* Perform a table-lookup for the target EL given the current state */
29
+ * instructions until an exit condition is reached. If we reach the
28
target_el = target_el_table[is64][scr][rw][hcr][secure][cur_el];
30
+ * exit condition and is_jmp is still DISAS_NEXT (because of some
31
+ * other condition) we simply "jump" to the next address.
32
+ * The remaining exit cases are:
33
+ *
34
+ * DISAS_JUMP - Only the PC was modified dynamically (e.g computed)
35
+ * DISAS_TB_JUMP - Only the PC was modified statically (e.g. branch)
36
+ *
37
+ * In these cases as long as the PC is updated we can chain to the
38
+ * next TB either by exiting the loop or looking up the next TB via
39
+ * the loookup helper.
40
+ *
41
+ * DISAS_UPDATE - CPU State was modified dynamically
42
+ *
43
+ * This covers any other CPU state which necessities us exiting the
44
+ * TCG code to the main run-loop. Typically this includes anything
45
+ * that might change the interrupt state.
46
+ *
47
+ * Individual translators may define additional exit cases to deal
48
+ * with per-target special conditions.
49
+ */
50
#define DISAS_NEXT 0 /* next instruction can be analyzed */
51
#define DISAS_JUMP 1 /* only pc was modified dynamically */
52
-#define DISAS_UPDATE 2 /* cpu state was modified dynamically */
53
-#define DISAS_TB_JUMP 3 /* only pc was modified statically */
54
+#define DISAS_TB_JUMP 2 /* only pc was modified statically */
55
+#define DISAS_UPDATE 3 /* cpu state was modified dynamically */
56
57
#include "qemu/log.h"
58
29
59
--
30
--
60
2.7.4
31
2.19.2
61
32
62
33
diff view generated by jsdifflib
1
In DEFINE_PROP_ARRAY, because we use a PropertyInfo (qdev_prop_arraylen)
1
From: Richard Henderson <richard.henderson@linaro.org>
2
which has a .set_default_value member we will set the field to a default
3
value. That default value will be zero, by the C rule that struct
4
initialization sets unmentioned members to zero if at least one member
5
is initialized. However it's clearer to state it explicitly.
6
2
3
Because EL3 has a fixed execution mode, we can properly decide
4
which of the bits are RES{0,1}.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20181203203839.757-8-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
9
Message-id: 1499788408-10096-2-git-send-email-peter.maydell@linaro.org
10
---
10
---
11
include/hw/qdev-properties.h | 1 +
11
target/arm/cpu.h | 2 --
12
1 file changed, 1 insertion(+)
12
target/arm/helper.c | 14 +++++++++-----
13
2 files changed, 9 insertions(+), 7 deletions(-)
13
14
14
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
15
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/qdev-properties.h
17
--- a/target/arm/cpu.h
17
+++ b/include/hw/qdev-properties.h
18
+++ b/target/arm/cpu.h
18
@@ -XXX,XX +XXX,XX @@ extern const PropertyInfo qdev_prop_link;
19
@@ -XXX,XX +XXX,XX @@ static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
19
_arrayfield, _arrayprop, _arraytype) { \
20
#define SCR_FIEN (1U << 21)
20
.name = (PROP_ARRAY_LEN_PREFIX _name), \
21
#define SCR_ENSCXT (1U << 25)
21
.info = &(qdev_prop_arraylen), \
22
#define SCR_ATA (1U << 26)
22
+ .defval.u = 0, \
23
-#define SCR_AARCH32_MASK (0x3fff & ~(SCR_RW | SCR_ST))
23
.offset = offsetof(_state, _field) \
24
-#define SCR_AARCH64_MASK (0x3fff & ~SCR_NET)
24
+ type_check(uint32_t, typeof_field(_state, _field)), \
25
25
.arrayinfo = &(_arrayprop), \
26
/* Return the current FPSCR value. */
27
uint32_t vfp_get_fpscr(CPUARMState *env);
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/helper.c
31
+++ b/target/arm/helper.c
32
@@ -XXX,XX +XXX,XX @@ static void vbar_write(CPUARMState *env, const ARMCPRegInfo *ri,
33
34
static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
35
{
36
- /* We only mask off bits that are RES0 both for AArch64 and AArch32.
37
- * For bits that vary between AArch32/64, code needs to check the
38
- * current execution mode before directly using the feature bit.
39
- */
40
- uint32_t valid_mask = SCR_AARCH64_MASK | SCR_AARCH32_MASK;
41
+ /* Begin with base v8.0 state. */
42
+ uint32_t valid_mask = 0x3fff;
43
+
44
+ if (arm_el_is_aa64(env, 3)) {
45
+ value |= SCR_FW | SCR_AW; /* these two bits are RES1. */
46
+ valid_mask &= ~SCR_NET;
47
+ } else {
48
+ valid_mask &= ~(SCR_RW | SCR_ST);
49
+ }
50
51
if (!arm_feature(env, ARM_FEATURE_EL2)) {
52
valid_mask &= ~SCR_HCE;
26
--
53
--
27
2.7.4
54
2.19.2
28
55
29
56
diff view generated by jsdifflib
1
Implement a model of the Serial Communication Controller (SCC) found
1
From: Richard Henderson <richard.henderson@linaro.org>
2
in MPS2 FPGA images.
3
2
4
The primary purpose of this device is to communicate with the
3
Since the TCR_*.HPD bits were RES0 in ARMv8.0, we can simply
5
Motherboard Configuration Controller (MCC) which is located on
4
interpret the bits as if ARMv8.1-HPD is present without checking.
6
the MPS board itself, outside the FPGA image. This is used
5
We will need a slightly different check for hpd for aarch32.
7
for programming the MPS clock generators. The SCC also has
8
some basic ID registers and an output for the board LEDs.
9
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181203203839.757-10-richard.henderson@linaro.org
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
12
Message-id: 1500029487-14822-7-git-send-email-peter.maydell@linaro.org
13
---
11
---
14
hw/misc/Makefile.objs | 1 +
12
target/arm/cpu64.c | 4 ++++
15
include/hw/misc/mps2-scc.h | 43 ++++++
13
target/arm/helper.c | 27 ++++++++++++++++++++-------
16
hw/misc/mps2-scc.c | 310 ++++++++++++++++++++++++++++++++++++++++
14
2 files changed, 24 insertions(+), 7 deletions(-)
17
default-configs/arm-softmmu.mak | 2 +
18
hw/misc/trace-events | 8 ++
19
5 files changed, 364 insertions(+)
20
create mode 100644 include/hw/misc/mps2-scc.h
21
create mode 100644 hw/misc/mps2-scc.c
22
15
23
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
16
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
24
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/misc/Makefile.objs
18
--- a/target/arm/cpu64.c
26
+++ b/hw/misc/Makefile.objs
19
+++ b/target/arm/cpu64.c
27
@@ -XXX,XX +XXX,XX @@ obj-$(CONFIG_STM32F2XX_SYSCFG) += stm32f2xx_syscfg.o
20
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
28
obj-$(CONFIG_MIPS_CPS) += mips_cmgcr.o
21
t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 1);
29
obj-$(CONFIG_MIPS_CPS) += mips_cpc.o
22
cpu->isar.id_aa64pfr0 = t;
30
obj-$(CONFIG_MIPS_ITU) += mips_itu.o
23
31
+obj-$(CONFIG_MPS2_SCC) += mps2-scc.o
24
+ t = cpu->isar.id_aa64mmfr1;
32
25
+ t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
33
obj-$(CONFIG_PVPANIC) += pvpanic.o
26
+ cpu->isar.id_aa64mmfr1 = t;
34
obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o
35
diff --git a/include/hw/misc/mps2-scc.h b/include/hw/misc/mps2-scc.h
36
new file mode 100644
37
index XXXXXXX..XXXXXXX
38
--- /dev/null
39
+++ b/include/hw/misc/mps2-scc.h
40
@@ -XXX,XX +XXX,XX @@
41
+/*
42
+ * ARM MPS2 SCC emulation
43
+ *
44
+ * Copyright (c) 2017 Linaro Limited
45
+ * Written by Peter Maydell
46
+ *
47
+ * This program is free software; you can redistribute it and/or modify
48
+ * it under the terms of the GNU General Public License version 2 or
49
+ * (at your option) any later version.
50
+ */
51
+
27
+
52
+#ifndef MPS2_SCC_H
28
/* Replicate the same data to the 32-bit id registers. */
53
+#define MPS2_SCC_H
29
u = cpu->isar.id_isar5;
54
+
30
u = FIELD_DP32(u, ID_ISAR5, AES, 2); /* AES + PMULL */
55
+#include "hw/sysbus.h"
31
diff --git a/target/arm/helper.c b/target/arm/helper.c
56
+
32
index XXXXXXX..XXXXXXX 100644
57
+#define TYPE_MPS2_SCC "mps2-scc"
33
--- a/target/arm/helper.c
58
+#define MPS2_SCC(obj) OBJECT_CHECK(MPS2SCC, (obj), TYPE_MPS2_SCC)
34
+++ b/target/arm/helper.c
59
+
35
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
60
+#define NUM_OSCCLK 3
36
bool ttbr1_valid = true;
61
+
37
uint64_t descaddrmask;
62
+typedef struct {
38
bool aarch64 = arm_el_is_aa64(env, el);
63
+ /*< private >*/
39
+ bool hpd = false;
64
+ SysBusDevice parent_obj;
40
65
+
41
/* TODO:
66
+ /*< public >*/
42
* This code does not handle the different format TCR for VTCR_EL2.
67
+ MemoryRegion iomem;
43
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
68
+
44
if (tg == 2) { /* 16KB pages */
69
+ uint32_t cfg0;
45
stride = 11;
70
+ uint32_t cfg1;
46
}
71
+ uint32_t cfg4;
47
+ if (aarch64) {
72
+ uint32_t cfgdata_rtn;
48
+ if (el > 1) {
73
+ uint32_t cfgdata_out;
49
+ hpd = extract64(tcr->raw_tcr, 24, 1);
74
+ uint32_t cfgctrl;
75
+ uint32_t cfgstat;
76
+ uint32_t dll;
77
+ uint32_t aid;
78
+ uint32_t id;
79
+ uint32_t oscclk[NUM_OSCCLK];
80
+ uint32_t oscclk_reset[NUM_OSCCLK];
81
+} MPS2SCC;
82
+
83
+#endif
84
diff --git a/hw/misc/mps2-scc.c b/hw/misc/mps2-scc.c
85
new file mode 100644
86
index XXXXXXX..XXXXXXX
87
--- /dev/null
88
+++ b/hw/misc/mps2-scc.c
89
@@ -XXX,XX +XXX,XX @@
90
+/*
91
+ * ARM MPS2 SCC emulation
92
+ *
93
+ * Copyright (c) 2017 Linaro Limited
94
+ * Written by Peter Maydell
95
+ *
96
+ * This program is free software; you can redistribute it and/or modify
97
+ * it under the terms of the GNU General Public License version 2 or
98
+ * (at your option) any later version.
99
+ */
100
+
101
+/* This is a model of the SCC (Serial Communication Controller)
102
+ * found in the FPGA images of MPS2 development boards.
103
+ *
104
+ * Documentation of it can be found in the MPS2 TRM:
105
+ * http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100112_0100_03_en/index.html
106
+ * and also in the Application Notes documenting individual FPGA images.
107
+ */
108
+
109
+#include "qemu/osdep.h"
110
+#include "qemu/log.h"
111
+#include "qapi/error.h"
112
+#include "trace.h"
113
+#include "hw/sysbus.h"
114
+#include "hw/registerfields.h"
115
+#include "hw/misc/mps2-scc.h"
116
+
117
+REG32(CFG0, 0)
118
+REG32(CFG1, 4)
119
+REG32(CFG3, 0xc)
120
+REG32(CFG4, 0x10)
121
+REG32(CFGDATA_RTN, 0xa0)
122
+REG32(CFGDATA_OUT, 0xa4)
123
+REG32(CFGCTRL, 0xa8)
124
+ FIELD(CFGCTRL, DEVICE, 0, 12)
125
+ FIELD(CFGCTRL, RES1, 12, 8)
126
+ FIELD(CFGCTRL, FUNCTION, 20, 6)
127
+ FIELD(CFGCTRL, RES2, 26, 4)
128
+ FIELD(CFGCTRL, WRITE, 30, 1)
129
+ FIELD(CFGCTRL, START, 31, 1)
130
+REG32(CFGSTAT, 0xac)
131
+ FIELD(CFGSTAT, DONE, 0, 1)
132
+ FIELD(CFGSTAT, ERROR, 1, 1)
133
+REG32(DLL, 0x100)
134
+REG32(AID, 0xFF8)
135
+REG32(ID, 0xFFC)
136
+
137
+/* Handle a write via the SYS_CFG channel to the specified function/device.
138
+ * Return false on error (reported to guest via SYS_CFGCTRL ERROR bit).
139
+ */
140
+static bool scc_cfg_write(MPS2SCC *s, unsigned function,
141
+ unsigned device, uint32_t value)
142
+{
143
+ trace_mps2_scc_cfg_write(function, device, value);
144
+
145
+ if (function != 1 || device >= NUM_OSCCLK) {
146
+ qemu_log_mask(LOG_GUEST_ERROR,
147
+ "MPS2 SCC config write: bad function %d device %d\n",
148
+ function, device);
149
+ return false;
150
+ }
151
+
152
+ s->oscclk[device] = value;
153
+ return true;
154
+}
155
+
156
+/* Handle a read via the SYS_CFG channel to the specified function/device.
157
+ * Return false on error (reported to guest via SYS_CFGCTRL ERROR bit),
158
+ * or set *value on success.
159
+ */
160
+static bool scc_cfg_read(MPS2SCC *s, unsigned function,
161
+ unsigned device, uint32_t *value)
162
+{
163
+ if (function != 1 || device >= NUM_OSCCLK) {
164
+ qemu_log_mask(LOG_GUEST_ERROR,
165
+ "MPS2 SCC config read: bad function %d device %d\n",
166
+ function, device);
167
+ return false;
168
+ }
169
+
170
+ *value = s->oscclk[device];
171
+
172
+ trace_mps2_scc_cfg_read(function, device, *value);
173
+ return true;
174
+}
175
+
176
+static uint64_t mps2_scc_read(void *opaque, hwaddr offset, unsigned size)
177
+{
178
+ MPS2SCC *s = MPS2_SCC(opaque);
179
+ uint64_t r;
180
+
181
+ switch (offset) {
182
+ case A_CFG0:
183
+ r = s->cfg0;
184
+ break;
185
+ case A_CFG1:
186
+ r = s->cfg1;
187
+ break;
188
+ case A_CFG3:
189
+ /* These are user-settable DIP switches on the board. We don't
190
+ * model that, so just return zeroes.
191
+ */
192
+ r = 0;
193
+ break;
194
+ case A_CFG4:
195
+ r = s->cfg4;
196
+ break;
197
+ case A_CFGDATA_RTN:
198
+ r = s->cfgdata_rtn;
199
+ break;
200
+ case A_CFGDATA_OUT:
201
+ r = s->cfgdata_out;
202
+ break;
203
+ case A_CFGCTRL:
204
+ r = s->cfgctrl;
205
+ break;
206
+ case A_CFGSTAT:
207
+ r = s->cfgstat;
208
+ break;
209
+ case A_DLL:
210
+ r = s->dll;
211
+ break;
212
+ case A_AID:
213
+ r = s->aid;
214
+ break;
215
+ case A_ID:
216
+ r = s->id;
217
+ break;
218
+ default:
219
+ qemu_log_mask(LOG_GUEST_ERROR,
220
+ "MPS2 SCC read: bad offset %x\n", (int) offset);
221
+ r = 0;
222
+ break;
223
+ }
224
+
225
+ trace_mps2_scc_read(offset, r, size);
226
+ return r;
227
+}
228
+
229
+static void mps2_scc_write(void *opaque, hwaddr offset, uint64_t value,
230
+ unsigned size)
231
+{
232
+ MPS2SCC *s = MPS2_SCC(opaque);
233
+
234
+ trace_mps2_scc_write(offset, value, size);
235
+
236
+ switch (offset) {
237
+ case A_CFG0:
238
+ /* TODO on some boards bit 0 controls RAM remapping */
239
+ s->cfg0 = value;
240
+ break;
241
+ case A_CFG1:
242
+ /* CFG1 bits [7:0] control the board LEDs. We don't currently have
243
+ * a mechanism for displaying this graphically, so use a trace event.
244
+ */
245
+ trace_mps2_scc_leds(value & 0x80 ? '*' : '.',
246
+ value & 0x40 ? '*' : '.',
247
+ value & 0x20 ? '*' : '.',
248
+ value & 0x10 ? '*' : '.',
249
+ value & 0x08 ? '*' : '.',
250
+ value & 0x04 ? '*' : '.',
251
+ value & 0x02 ? '*' : '.',
252
+ value & 0x01 ? '*' : '.');
253
+ s->cfg1 = value;
254
+ break;
255
+ case A_CFGDATA_OUT:
256
+ s->cfgdata_out = value;
257
+ break;
258
+ case A_CFGCTRL:
259
+ /* Writing to CFGCTRL clears SYS_CFGSTAT */
260
+ s->cfgstat = 0;
261
+ s->cfgctrl = value & ~(R_CFGCTRL_RES1_MASK |
262
+ R_CFGCTRL_RES2_MASK |
263
+ R_CFGCTRL_START_MASK);
264
+
265
+ if (value & R_CFGCTRL_START_MASK) {
266
+ /* Start bit set -- do a read or write (instantaneously) */
267
+ int device = extract32(s->cfgctrl, R_CFGCTRL_DEVICE_SHIFT,
268
+ R_CFGCTRL_DEVICE_LENGTH);
269
+ int function = extract32(s->cfgctrl, R_CFGCTRL_FUNCTION_SHIFT,
270
+ R_CFGCTRL_FUNCTION_LENGTH);
271
+
272
+ s->cfgstat = R_CFGSTAT_DONE_MASK;
273
+ if (s->cfgctrl & R_CFGCTRL_WRITE_MASK) {
274
+ if (!scc_cfg_write(s, function, device, s->cfgdata_out)) {
275
+ s->cfgstat |= R_CFGSTAT_ERROR_MASK;
276
+ }
277
+ } else {
50
+ } else {
278
+ uint32_t result;
51
+ hpd = extract64(tcr->raw_tcr, 41, 1);
279
+ if (!scc_cfg_read(s, function, device, &result)) {
280
+ s->cfgstat |= R_CFGSTAT_ERROR_MASK;
281
+ } else {
282
+ s->cfgdata_rtn = result;
283
+ }
284
+ }
52
+ }
285
+ }
53
+ }
286
+ break;
54
} else {
287
+ case A_DLL:
55
/* We should only be here if TTBR1 is valid */
288
+ /* DLL stands for Digital Locked Loop.
56
assert(ttbr1_valid);
289
+ * Bits [31:24] (DLL_LOCK_MASK) are writable, and indicate a
57
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
290
+ * mask of which of the DLL_LOCKED bits [16:23] should be ORed
58
if (tg == 1) { /* 16KB pages */
291
+ * together to determine the ALL_UNMASKED_DLLS_LOCKED bit [0].
59
stride = 11;
292
+ * For QEMU, our DLLs are always locked, so we can leave bit 0
60
}
293
+ * as 1 always and don't need to recalculate it.
61
+ if (aarch64) {
294
+ */
62
+ hpd = extract64(tcr->raw_tcr, 42, 1);
295
+ s->dll = deposit32(s->dll, 24, 8, extract32(value, 24, 8));
63
+ }
296
+ break;
64
}
297
+ default:
65
298
+ qemu_log_mask(LOG_GUEST_ERROR,
66
/* Here we should have set up all the parameters for the translation:
299
+ "MPS2 SCC write: bad offset 0x%x\n", (int) offset);
67
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
300
+ break;
68
descaddr = descriptor & descaddrmask;
301
+ }
69
302
+}
70
if ((descriptor & 2) && (level < 3)) {
303
+
71
- /* Table entry. The top five bits are attributes which may
304
+static const MemoryRegionOps mps2_scc_ops = {
72
+ /* Table entry. The top five bits are attributes which may
305
+ .read = mps2_scc_read,
73
* propagate down through lower levels of the table (and
306
+ .write = mps2_scc_write,
74
* which are all arranged so that 0 means "no effect", so
307
+ .endianness = DEVICE_LITTLE_ENDIAN,
75
* we can gather them up by ORing in the bits at each level).
308
+};
76
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
309
+
77
break;
310
+static void mps2_scc_reset(DeviceState *dev)
78
}
311
+{
79
/* Merge in attributes from table descriptors */
312
+ MPS2SCC *s = MPS2_SCC(dev);
80
- attrs |= extract32(tableattrs, 0, 2) << 11; /* XN, PXN */
313
+ int i;
81
- attrs |= extract32(tableattrs, 3, 1) << 5; /* APTable[1] => AP[2] */
314
+
82
+ attrs |= nstable << 3; /* NS */
315
+ trace_mps2_scc_reset();
83
+ if (hpd) {
316
+ s->cfg0 = 0;
84
+ /* HPD disables all the table attributes except NSTable. */
317
+ s->cfg1 = 0;
85
+ break;
318
+ s->cfgdata_rtn = 0;
86
+ }
319
+ s->cfgdata_out = 0;
87
+ attrs |= extract32(tableattrs, 0, 2) << 11; /* XN, PXN */
320
+ s->cfgctrl = 0x100000;
88
/* The sense of AP[1] vs APTable[0] is reversed, as APTable[0] == 1
321
+ s->cfgstat = 0;
89
* means "force PL1 access only", which means forcing AP[1] to 0.
322
+ s->dll = 0xffff0001;
90
*/
323
+ for (i = 0; i < NUM_OSCCLK; i++) {
91
- if (extract32(tableattrs, 2, 1)) {
324
+ s->oscclk[i] = s->oscclk_reset[i];
92
- attrs &= ~(1 << 4);
325
+ }
93
- }
326
+}
94
- attrs |= nstable << 3; /* NS */
327
+
95
+ attrs &= ~(extract32(tableattrs, 2, 1) << 4); /* !APT[0] => AP[1] */
328
+static void mps2_scc_init(Object *obj)
96
+ attrs |= extract32(tableattrs, 3, 1) << 5; /* APT[1] => AP[2] */
329
+{
97
break;
330
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
98
}
331
+ MPS2SCC *s = MPS2_SCC(obj);
99
/* Here descaddr is the final physical address, and attributes
332
+
333
+ memory_region_init_io(&s->iomem, obj, &mps2_scc_ops, s, "mps2-scc", 0x1000);
334
+ sysbus_init_mmio(sbd, &s->iomem);
335
+}
336
+
337
+static void mps2_scc_realize(DeviceState *dev, Error **errp)
338
+{
339
+}
340
+
341
+static const VMStateDescription mps2_scc_vmstate = {
342
+ .name = "mps2-scc",
343
+ .version_id = 1,
344
+ .minimum_version_id = 1,
345
+ .fields = (VMStateField[]) {
346
+ VMSTATE_UINT32(cfg0, MPS2SCC),
347
+ VMSTATE_UINT32(cfg1, MPS2SCC),
348
+ VMSTATE_UINT32(cfgdata_rtn, MPS2SCC),
349
+ VMSTATE_UINT32(cfgdata_out, MPS2SCC),
350
+ VMSTATE_UINT32(cfgctrl, MPS2SCC),
351
+ VMSTATE_UINT32(cfgstat, MPS2SCC),
352
+ VMSTATE_UINT32(dll, MPS2SCC),
353
+ VMSTATE_UINT32_ARRAY(oscclk, MPS2SCC, NUM_OSCCLK),
354
+ VMSTATE_END_OF_LIST()
355
+ }
356
+};
357
+
358
+static Property mps2_scc_properties[] = {
359
+ /* Values for various read-only ID registers (which are specific
360
+ * to the board model or FPGA image)
361
+ */
362
+ DEFINE_PROP_UINT32("scc-cfg4", MPS2SCC, aid, 0),
363
+ DEFINE_PROP_UINT32("scc-aid", MPS2SCC, aid, 0),
364
+ DEFINE_PROP_UINT32("scc-id", MPS2SCC, aid, 0),
365
+ /* These are the initial settings for the source clocks on the board.
366
+ * In hardware they can be configured via a config file read by the
367
+ * motherboard configuration controller to suit the FPGA image.
368
+ * These default values are used by most of the standard FPGA images.
369
+ */
370
+ DEFINE_PROP_UINT32("oscclk0", MPS2SCC, oscclk_reset[0], 50000000),
371
+ DEFINE_PROP_UINT32("oscclk1", MPS2SCC, oscclk_reset[1], 24576000),
372
+ DEFINE_PROP_UINT32("oscclk2", MPS2SCC, oscclk_reset[2], 25000000),
373
+ DEFINE_PROP_END_OF_LIST(),
374
+};
375
+
376
+static void mps2_scc_class_init(ObjectClass *klass, void *data)
377
+{
378
+ DeviceClass *dc = DEVICE_CLASS(klass);
379
+
380
+ dc->realize = mps2_scc_realize;
381
+ dc->vmsd = &mps2_scc_vmstate;
382
+ dc->reset = mps2_scc_reset;
383
+ dc->props = mps2_scc_properties;
384
+}
385
+
386
+static const TypeInfo mps2_scc_info = {
387
+ .name = TYPE_MPS2_SCC,
388
+ .parent = TYPE_SYS_BUS_DEVICE,
389
+ .instance_size = sizeof(MPS2SCC),
390
+ .instance_init = mps2_scc_init,
391
+ .class_init = mps2_scc_class_init,
392
+};
393
+
394
+static void mps2_scc_register_types(void)
395
+{
396
+ type_register_static(&mps2_scc_info);
397
+}
398
+
399
+type_init(mps2_scc_register_types);
400
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
401
index XXXXXXX..XXXXXXX 100644
402
--- a/default-configs/arm-softmmu.mak
403
+++ b/default-configs/arm-softmmu.mak
404
@@ -XXX,XX +XXX,XX @@ CONFIG_STM32F205_SOC=y
405
CONFIG_CMSDK_APB_TIMER=y
406
CONFIG_CMSDK_APB_UART=y
407
408
+CONFIG_MPS2_SCC=y
409
+
410
CONFIG_VERSATILE_PCI=y
411
CONFIG_VERSATILE_I2C=y
412
413
diff --git a/hw/misc/trace-events b/hw/misc/trace-events
414
index XXXXXXX..XXXXXXX 100644
415
--- a/hw/misc/trace-events
416
+++ b/hw/misc/trace-events
417
@@ -XXX,XX +XXX,XX @@ milkymist_pfpu_pulse_irq(void) "Pulse IRQ"
418
419
# hw/misc/aspeed_scu.c
420
aspeed_scu_write(uint64_t offset, unsigned size, uint32_t data) "To 0x%" PRIx64 " of size %u: 0x%" PRIx32
421
+
422
+# hw/misc/mps2_scc.c
423
+mps2_scc_read(uint64_t offset, uint64_t data, unsigned size) "MPS2 SCC read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
424
+mps2_scc_write(uint64_t offset, uint64_t data, unsigned size) "MPS2 SCC write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
425
+mps2_scc_reset(void) "MPS2 SCC: reset"
426
+mps2_scc_leds(char led7, char led6, char led5, char led4, char led3, char led2, char led1, char led0) "MPS2 SCC LEDs: %c%c%c%c%c%c%c%c"
427
+mps2_scc_cfg_write(unsigned function, unsigned device, uint32_t value) "MPS2 SCC config write: function %d device %d data 0x%" PRIx32
428
+mps2_scc_cfg_read(unsigned function, unsigned device, uint32_t value) "MPS2 SCC config read: function %d device %d data 0x%" PRIx32
429
--
100
--
430
2.7.4
101
2.19.2
431
102
432
103
diff view generated by jsdifflib
1
The Cortex-M3 and M4 CPUs always have 8 PMSA MPU regions (this isn't
1
From: Richard Henderson <richard.henderson@linaro.org>
2
a configurable option for the hardware). Make the default value of
3
the pmsav7-dregion property be set per-cpu, so we don't need to have
4
every user of these CPUs set it manually. (The existing default of
5
16 is correct for the other PMSAv7 core, the Cortex-R5.)
6
2
7
This fixes a bug where we were creating the M3 and M4 with
3
The bulk of the work here, beyond base HPD, is defining the
8
too many regions; most guest software would not notice or
4
TTBCR2 register. In addition we must check TTBCR.T2E, which
9
care, though, since it would just not use the registers
5
is not present (RES0) for AArch64.
10
associated with the unexpected extra regions.
11
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181203203839.757-11-richard.henderson@linaro.org
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
14
Message-id: 1499788408-10096-4-git-send-email-peter.maydell@linaro.org
15
---
11
---
16
target/arm/cpu.c | 12 +++++++++++-
12
target/arm/cpu.h | 9 +++++++++
17
1 file changed, 11 insertions(+), 1 deletion(-)
13
target/arm/cpu.c | 4 ++++
14
target/arm/helper.c | 37 +++++++++++++++++++++++++++++--------
15
3 files changed, 42 insertions(+), 8 deletions(-)
18
16
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ FIELD(ID_ISAR6, FHM, 8, 4)
22
FIELD(ID_ISAR6, SB, 12, 4)
23
FIELD(ID_ISAR6, SPECRES, 16, 4)
24
25
+FIELD(ID_MMFR4, SPECSEI, 0, 4)
26
+FIELD(ID_MMFR4, AC2, 4, 4)
27
+FIELD(ID_MMFR4, XNX, 8, 4)
28
+FIELD(ID_MMFR4, CNP, 12, 4)
29
+FIELD(ID_MMFR4, HPDS, 16, 4)
30
+FIELD(ID_MMFR4, LSM, 20, 4)
31
+FIELD(ID_MMFR4, CCIDX, 24, 4)
32
+FIELD(ID_MMFR4, EVT, 28, 4)
33
+
34
FIELD(ID_AA64ISAR0, AES, 4, 4)
35
FIELD(ID_AA64ISAR0, SHA1, 8, 4)
36
FIELD(ID_AA64ISAR0, SHA2, 12, 4)
19
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
37
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
20
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/cpu.c
39
--- a/target/arm/cpu.c
22
+++ b/target/arm/cpu.c
40
+++ b/target/arm/cpu.c
23
@@ -XXX,XX +XXX,XX @@ static Property arm_cpu_has_pmu_property =
41
@@ -XXX,XX +XXX,XX @@ static void arm_max_initfn(Object *obj)
24
static Property arm_cpu_has_mpu_property =
42
t = cpu->isar.id_isar6;
25
DEFINE_PROP_BOOL("has-mpu", ARMCPU, has_mpu, true);
43
t = FIELD_DP32(t, ID_ISAR6, DP, 1);
26
44
cpu->isar.id_isar6 = t;
27
+/* This is like DEFINE_PROP_UINT32 but it doesn't set the default value,
45
+
28
+ * because the CPU initfn will have already set cpu->pmsav7_dregion to
46
+ t = cpu->id_mmfr4;
29
+ * the right value for that particular CPU type, and we don't want
47
+ t = FIELD_DP32(t, ID_MMFR4, HPDS, 1); /* AA32HPD */
30
+ * to override that with an incorrect constant value.
48
+ cpu->id_mmfr4 = t;
49
}
50
#endif
51
}
52
diff --git a/target/arm/helper.c b/target/arm/helper.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/target/arm/helper.c
55
+++ b/target/arm/helper.c
56
@@ -XXX,XX +XXX,XX @@ static void vmsa_ttbcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
57
uint64_t value)
58
{
59
ARMCPU *cpu = arm_env_get_cpu(env);
60
+ TCR *tcr = raw_ptr(env, ri);
61
62
if (arm_feature(env, ARM_FEATURE_LPAE)) {
63
/* With LPAE the TTBCR could result in a change of ASID
64
@@ -XXX,XX +XXX,XX @@ static void vmsa_ttbcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
65
*/
66
tlb_flush(CPU(cpu));
67
}
68
+ /* Preserve the high half of TCR_EL1, set via TTBCR2. */
69
+ value = deposit64(tcr->raw_tcr, 0, 32, value);
70
vmsa_ttbcr_raw_write(env, ri, value);
71
}
72
73
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo vmsa_cp_reginfo[] = {
74
REGINFO_SENTINEL
75
};
76
77
+/* Note that unlike TTBCR, writing to TTBCR2 does not require flushing
78
+ * qemu tlbs nor adjusting cached masks.
31
+ */
79
+ */
32
static Property arm_cpu_pmsav7_dregion_property =
80
+static const ARMCPRegInfo ttbcr2_reginfo = {
33
- DEFINE_PROP_UINT32("pmsav7-dregion", ARMCPU, pmsav7_dregion, 16);
81
+ .name = "TTBCR2", .cp = 15, .opc1 = 0, .crn = 2, .crm = 0, .opc2 = 3,
34
+ DEFINE_PROP_UNSIGNED_NODEFAULT("pmsav7-dregion", ARMCPU,
82
+ .access = PL1_RW, .type = ARM_CP_ALIAS,
35
+ pmsav7_dregion,
83
+ .bank_fieldoffsets = { offsetofhigh32(CPUARMState, cp15.tcr_el[3]),
36
+ qdev_prop_uint32, uint32_t);
84
+ offsetofhigh32(CPUARMState, cp15.tcr_el[1]) },
37
85
+};
38
static void arm_cpu_post_init(Object *obj)
86
+
87
static void omap_ticonfig_write(CPUARMState *env, const ARMCPRegInfo *ri,
88
uint64_t value)
39
{
89
{
40
@@ -XXX,XX +XXX,XX @@ static void cortex_m3_initfn(Object *obj)
90
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
41
set_feature(&cpu->env, ARM_FEATURE_V7);
91
} else {
42
set_feature(&cpu->env, ARM_FEATURE_M);
92
define_arm_cp_regs(cpu, vmsa_pmsa_cp_reginfo);
43
cpu->midr = 0x410fc231;
93
define_arm_cp_regs(cpu, vmsa_cp_reginfo);
44
+ cpu->pmsav7_dregion = 8;
94
+ /* TTCBR2 is introduced with ARMv8.2-A32HPD. */
45
}
95
+ if (FIELD_EX32(cpu->id_mmfr4, ID_MMFR4, HPDS) != 0) {
46
96
+ define_one_arm_cp_reg(cpu, &ttbcr2_reginfo);
47
static void cortex_m4_initfn(Object *obj)
97
+ }
48
@@ -XXX,XX +XXX,XX @@ static void cortex_m4_initfn(Object *obj)
98
}
49
set_feature(&cpu->env, ARM_FEATURE_M);
99
if (arm_feature(env, ARM_FEATURE_THUMB2EE)) {
50
set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
100
define_arm_cp_regs(cpu, t2ee_cp_reginfo);
51
cpu->midr = 0x410fc240; /* r0p0 */
101
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
52
+ cpu->pmsav7_dregion = 8;
102
if (tg == 2) { /* 16KB pages */
53
}
103
stride = 11;
54
static void arm_v7m_class_init(ObjectClass *oc, void *data)
104
}
55
{
105
- if (aarch64) {
56
@@ -XXX,XX +XXX,XX @@ static void cortex_r5_initfn(Object *obj)
106
- if (el > 1) {
57
cpu->id_isar4 = 0x0010142;
107
- hpd = extract64(tcr->raw_tcr, 24, 1);
58
cpu->id_isar5 = 0x0;
108
- } else {
59
cpu->mp_is_up = true;
109
- hpd = extract64(tcr->raw_tcr, 41, 1);
60
+ cpu->pmsav7_dregion = 16;
110
- }
61
define_arm_cp_regs(cpu, cortexr5_cp_reginfo);
111
+ if (aarch64 && el > 1) {
62
}
112
+ hpd = extract64(tcr->raw_tcr, 24, 1);
113
+ } else {
114
+ hpd = extract64(tcr->raw_tcr, 41, 1);
115
+ }
116
+ if (!aarch64) {
117
+ /* For aarch32, hpd0 is not enabled without t2e as well. */
118
+ hpd &= extract64(tcr->raw_tcr, 6, 1);
119
}
120
} else {
121
/* We should only be here if TTBR1 is valid */
122
@@ -XXX,XX +XXX,XX @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
123
if (tg == 1) { /* 16KB pages */
124
stride = 11;
125
}
126
- if (aarch64) {
127
- hpd = extract64(tcr->raw_tcr, 42, 1);
128
+ hpd = extract64(tcr->raw_tcr, 42, 1);
129
+ if (!aarch64) {
130
+ /* For aarch32, hpd1 is not enabled without t2e as well. */
131
+ hpd &= extract64(tcr->raw_tcr, 6, 1);
132
}
133
}
63
134
64
--
135
--
65
2.7.4
136
2.19.2
66
137
67
138
diff view generated by jsdifflib
New patch
1
1
From: Richard Henderson <richard.henderson@linaro.org>
2
3
Replace arm_hcr_el2_{fmo,imo,amo} with a more general routine
4
that also takes SCR_EL3.NS (aka arm_is_secure_below_el3) into
5
account, as documented for the plethora of bits in HCR_EL2.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20181210150501.7990-2-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/cpu.h | 67 +++++++++------------------------------
13
hw/intc/arm_gicv3_cpuif.c | 21 ++++++------
14
target/arm/helper.c | 66 ++++++++++++++++++++++++++++++++------
15
3 files changed, 83 insertions(+), 71 deletions(-)
16
17
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/cpu.h
20
+++ b/target/arm/cpu.h
21
@@ -XXX,XX +XXX,XX @@ static inline bool arm_is_secure(CPUARMState *env)
22
}
23
#endif
24
25
+/**
26
+ * arm_hcr_el2_eff(): Return the effective value of HCR_EL2.
27
+ * E.g. when in secure state, fields in HCR_EL2 are suppressed,
28
+ * "for all purposes other than a direct read or write access of HCR_EL2."
29
+ * Not included here is HCR_RW.
30
+ */
31
+uint64_t arm_hcr_el2_eff(CPUARMState *env);
32
+
33
/* Return true if the specified exception level is running in AArch64 state. */
34
static inline bool arm_el_is_aa64(CPUARMState *env, int el)
35
{
36
@@ -XXX,XX +XXX,XX @@ bool write_cpustate_to_list(ARMCPU *cpu);
37
# define TARGET_VIRT_ADDR_SPACE_BITS 32
38
#endif
39
40
-/**
41
- * arm_hcr_el2_imo(): Return the effective value of HCR_EL2.IMO.
42
- * Depending on the values of HCR_EL2.E2H and TGE, this may be
43
- * "behaves as 1 for all purposes other than direct read/write" or
44
- * "behaves as 0 for all purposes other than direct read/write"
45
- */
46
-static inline bool arm_hcr_el2_imo(CPUARMState *env)
47
-{
48
- switch (env->cp15.hcr_el2 & (HCR_TGE | HCR_E2H)) {
49
- case HCR_TGE:
50
- return true;
51
- case HCR_TGE | HCR_E2H:
52
- return false;
53
- default:
54
- return env->cp15.hcr_el2 & HCR_IMO;
55
- }
56
-}
57
-
58
-/**
59
- * arm_hcr_el2_fmo(): Return the effective value of HCR_EL2.FMO.
60
- */
61
-static inline bool arm_hcr_el2_fmo(CPUARMState *env)
62
-{
63
- switch (env->cp15.hcr_el2 & (HCR_TGE | HCR_E2H)) {
64
- case HCR_TGE:
65
- return true;
66
- case HCR_TGE | HCR_E2H:
67
- return false;
68
- default:
69
- return env->cp15.hcr_el2 & HCR_FMO;
70
- }
71
-}
72
-
73
-/**
74
- * arm_hcr_el2_amo(): Return the effective value of HCR_EL2.AMO.
75
- */
76
-static inline bool arm_hcr_el2_amo(CPUARMState *env)
77
-{
78
- switch (env->cp15.hcr_el2 & (HCR_TGE | HCR_E2H)) {
79
- case HCR_TGE:
80
- return true;
81
- case HCR_TGE | HCR_E2H:
82
- return false;
83
- default:
84
- return env->cp15.hcr_el2 & HCR_AMO;
85
- }
86
-}
87
-
88
static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
89
unsigned int target_el)
90
{
91
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
92
bool secure = arm_is_secure(env);
93
bool pstate_unmasked;
94
int8_t unmasked = 0;
95
+ uint64_t hcr_el2;
96
97
/* Don't take exceptions if they target a lower EL.
98
* This check should catch any exceptions that would not be taken but left
99
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
100
return false;
101
}
102
103
+ hcr_el2 = arm_hcr_el2_eff(env);
104
+
105
switch (excp_idx) {
106
case EXCP_FIQ:
107
pstate_unmasked = !(env->daif & PSTATE_F);
108
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
109
break;
110
111
case EXCP_VFIQ:
112
- if (secure || !arm_hcr_el2_fmo(env) || (env->cp15.hcr_el2 & HCR_TGE)) {
113
+ if (secure || !(hcr_el2 & HCR_FMO) || (hcr_el2 & HCR_TGE)) {
114
/* VFIQs are only taken when hypervized and non-secure. */
115
return false;
116
}
117
return !(env->daif & PSTATE_F);
118
case EXCP_VIRQ:
119
- if (secure || !arm_hcr_el2_imo(env) || (env->cp15.hcr_el2 & HCR_TGE)) {
120
+ if (secure || !(hcr_el2 & HCR_IMO) || (hcr_el2 & HCR_TGE)) {
121
/* VIRQs are only taken when hypervized and non-secure. */
122
return false;
123
}
124
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
125
* to the CPSR.F setting otherwise we further assess the state
126
* below.
127
*/
128
- hcr = arm_hcr_el2_fmo(env);
129
+ hcr = hcr_el2 & HCR_FMO;
130
scr = (env->cp15.scr_el3 & SCR_FIQ);
131
132
/* When EL3 is 32-bit, the SCR.FW bit controls whether the
133
@@ -XXX,XX +XXX,XX @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
134
* when setting the target EL, so it does not have a further
135
* affect here.
136
*/
137
- hcr = arm_hcr_el2_imo(env);
138
+ hcr = hcr_el2 & HCR_IMO;
139
scr = false;
140
break;
141
default:
142
diff --git a/hw/intc/arm_gicv3_cpuif.c b/hw/intc/arm_gicv3_cpuif.c
143
index XXXXXXX..XXXXXXX 100644
144
--- a/hw/intc/arm_gicv3_cpuif.c
145
+++ b/hw/intc/arm_gicv3_cpuif.c
146
@@ -XXX,XX +XXX,XX @@ static bool icv_access(CPUARMState *env, int hcr_flags)
147
* * access if NS EL1 and either IMO or FMO == 1:
148
* CTLR, DIR, PMR, RPR
149
*/
150
- bool flagmatch = ((hcr_flags & HCR_IMO) && arm_hcr_el2_imo(env)) ||
151
- ((hcr_flags & HCR_FMO) && arm_hcr_el2_fmo(env));
152
+ uint64_t hcr_el2 = arm_hcr_el2_eff(env);
153
+ bool flagmatch = hcr_el2 & hcr_flags & (HCR_IMO | HCR_FMO);
154
155
return flagmatch && arm_current_el(env) == 1
156
&& !arm_is_secure_below_el3(env);
157
@@ -XXX,XX +XXX,XX @@ static void icc_dir_write(CPUARMState *env, const ARMCPRegInfo *ri,
158
/* No need to include !IsSecure in route_*_to_el2 as it's only
159
* tested in cases where we know !IsSecure is true.
160
*/
161
- route_fiq_to_el2 = arm_hcr_el2_fmo(env);
162
- route_irq_to_el2 = arm_hcr_el2_imo(env);
163
+ uint64_t hcr_el2 = arm_hcr_el2_eff(env);
164
+ route_fiq_to_el2 = hcr_el2 & HCR_FMO;
165
+ route_irq_to_el2 = hcr_el2 & HCR_IMO;
166
167
switch (arm_current_el(env)) {
168
case 3:
169
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gicv3_irqfiq_access(CPUARMState *env,
170
if ((env->cp15.scr_el3 & (SCR_FIQ | SCR_IRQ)) == (SCR_FIQ | SCR_IRQ)) {
171
switch (el) {
172
case 1:
173
- if (arm_is_secure_below_el3(env) ||
174
- (arm_hcr_el2_imo(env) == 0 && arm_hcr_el2_fmo(env) == 0)) {
175
+ /* Note that arm_hcr_el2_eff takes secure state into account. */
176
+ if ((arm_hcr_el2_eff(env) & (HCR_IMO | HCR_FMO)) == 0) {
177
r = CP_ACCESS_TRAP_EL3;
178
}
179
break;
180
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gicv3_dir_access(CPUARMState *env,
181
static CPAccessResult gicv3_sgi_access(CPUARMState *env,
182
const ARMCPRegInfo *ri, bool isread)
183
{
184
- if ((arm_hcr_el2_imo(env) || arm_hcr_el2_fmo(env)) &&
185
- arm_current_el(env) == 1 && !arm_is_secure_below_el3(env)) {
186
+ if (arm_current_el(env) == 1 &&
187
+ (arm_hcr_el2_eff(env) & (HCR_IMO | HCR_FMO)) != 0) {
188
/* Takes priority over a possible EL3 trap */
189
return CP_ACCESS_TRAP_EL2;
190
}
191
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gicv3_fiq_access(CPUARMState *env,
192
if (env->cp15.scr_el3 & SCR_FIQ) {
193
switch (el) {
194
case 1:
195
- if (arm_is_secure_below_el3(env) || !arm_hcr_el2_fmo(env)) {
196
+ if ((arm_hcr_el2_eff(env) & HCR_FMO) == 0) {
197
r = CP_ACCESS_TRAP_EL3;
198
}
199
break;
200
@@ -XXX,XX +XXX,XX @@ static CPAccessResult gicv3_irq_access(CPUARMState *env,
201
if (env->cp15.scr_el3 & SCR_IRQ) {
202
switch (el) {
203
case 1:
204
- if (arm_is_secure_below_el3(env) || !arm_hcr_el2_imo(env)) {
205
+ if ((arm_hcr_el2_eff(env) & HCR_IMO) == 0) {
206
r = CP_ACCESS_TRAP_EL3;
207
}
208
break;
209
diff --git a/target/arm/helper.c b/target/arm/helper.c
210
index XXXXXXX..XXXXXXX 100644
211
--- a/target/arm/helper.c
212
+++ b/target/arm/helper.c
213
@@ -XXX,XX +XXX,XX @@ static void csselr_write(CPUARMState *env, const ARMCPRegInfo *ri,
214
static uint64_t isr_read(CPUARMState *env, const ARMCPRegInfo *ri)
215
{
216
CPUState *cs = ENV_GET_CPU(env);
217
+ uint64_t hcr_el2 = arm_hcr_el2_eff(env);
218
uint64_t ret = 0;
219
220
- if (arm_hcr_el2_imo(env)) {
221
+ if (hcr_el2 & HCR_IMO) {
222
if (cs->interrupt_request & CPU_INTERRUPT_VIRQ) {
223
ret |= CPSR_I;
224
}
225
@@ -XXX,XX +XXX,XX @@ static uint64_t isr_read(CPUARMState *env, const ARMCPRegInfo *ri)
226
}
227
}
228
229
- if (arm_hcr_el2_fmo(env)) {
230
+ if (hcr_el2 & HCR_FMO) {
231
if (cs->interrupt_request & CPU_INTERRUPT_VFIQ) {
232
ret |= CPSR_F;
233
}
234
@@ -XXX,XX +XXX,XX @@ static void hcr_writelow(CPUARMState *env, const ARMCPRegInfo *ri,
235
hcr_write(env, NULL, value);
236
}
237
238
+/*
239
+ * Return the effective value of HCR_EL2.
240
+ * Bits that are not included here:
241
+ * RW (read from SCR_EL3.RW as needed)
242
+ */
243
+uint64_t arm_hcr_el2_eff(CPUARMState *env)
244
+{
245
+ uint64_t ret = env->cp15.hcr_el2;
246
+
247
+ if (arm_is_secure_below_el3(env)) {
248
+ /*
249
+ * "This register has no effect if EL2 is not enabled in the
250
+ * current Security state". This is ARMv8.4-SecEL2 speak for
251
+ * !(SCR_EL3.NS==1 || SCR_EL3.EEL2==1).
252
+ *
253
+ * Prior to that, the language was "In an implementation that
254
+ * includes EL3, when the value of SCR_EL3.NS is 0 the PE behaves
255
+ * as if this field is 0 for all purposes other than a direct
256
+ * read or write access of HCR_EL2". With lots of enumeration
257
+ * on a per-field basis. In current QEMU, this is condition
258
+ * is arm_is_secure_below_el3.
259
+ *
260
+ * Since the v8.4 language applies to the entire register, and
261
+ * appears to be backward compatible, use that.
262
+ */
263
+ ret = 0;
264
+ } else if (ret & HCR_TGE) {
265
+ /* These bits are up-to-date as of ARMv8.4. */
266
+ if (ret & HCR_E2H) {
267
+ ret &= ~(HCR_VM | HCR_FMO | HCR_IMO | HCR_AMO |
268
+ HCR_BSU_MASK | HCR_DC | HCR_TWI | HCR_TWE |
269
+ HCR_TID0 | HCR_TID2 | HCR_TPCP | HCR_TPU |
270
+ HCR_TDZ | HCR_CD | HCR_ID | HCR_MIOCNCE);
271
+ } else {
272
+ ret |= HCR_FMO | HCR_IMO | HCR_AMO;
273
+ }
274
+ ret &= ~(HCR_SWIO | HCR_PTW | HCR_VF | HCR_VI | HCR_VSE |
275
+ HCR_FB | HCR_TID1 | HCR_TID3 | HCR_TSC | HCR_TACR |
276
+ HCR_TSW | HCR_TTLB | HCR_TVM | HCR_HCD | HCR_TRVM |
277
+ HCR_TLOR);
278
+ }
279
+
280
+ return ret;
281
+}
282
+
283
static const ARMCPRegInfo el2_cp_reginfo[] = {
284
{ .name = "HCR_EL2", .state = ARM_CP_STATE_AA64,
285
.type = ARM_CP_IO,
286
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
287
uint32_t cur_el, bool secure)
288
{
289
CPUARMState *env = cs->env_ptr;
290
- int rw;
291
- int scr;
292
- int hcr;
293
+ bool rw;
294
+ bool scr;
295
+ bool hcr;
296
int target_el;
297
/* Is the highest EL AArch64? */
298
- int is64 = arm_feature(env, ARM_FEATURE_AARCH64);
299
+ bool is64 = arm_feature(env, ARM_FEATURE_AARCH64);
300
+ uint64_t hcr_el2;
301
302
if (arm_feature(env, ARM_FEATURE_EL3)) {
303
rw = ((env->cp15.scr_el3 & SCR_RW) == SCR_RW);
304
@@ -XXX,XX +XXX,XX @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
305
rw = is64;
306
}
307
308
+ hcr_el2 = arm_hcr_el2_eff(env);
309
switch (excp_idx) {
310
case EXCP_IRQ:
311
scr = ((env->cp15.scr_el3 & SCR_IRQ) == SCR_IRQ);
312
- hcr = arm_hcr_el2_imo(env);
313
+ hcr = hcr_el2 & HCR_IMO;
314
break;
315
case EXCP_FIQ:
316
scr = ((env->cp15.scr_el3 & SCR_FIQ) == SCR_FIQ);
317
- hcr = arm_hcr_el2_fmo(env);
318
+ hcr = hcr_el2 & HCR_FMO;
319
break;
320
default:
321
scr = ((env->cp15.scr_el3 & SCR_EA) == SCR_EA);
322
- hcr = arm_hcr_el2_amo(env);
323
+ hcr = hcr_el2 & HCR_AMO;
324
break;
325
};
326
327
--
328
2.19.2
329
330
diff view generated by jsdifflib
1
From: Alex Bennée <alex.bennee@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
DISAS_UPDATE should be used when the wider CPU state other than just
3
Since arm_hcr_el2_eff includes a check against
4
the PC has been updated and we should therefore exit the TCG runtime
4
arm_is_secure_below_el3, we can often remove a
5
and return to the main execution loop rather assuming DISAS_JUMP would
5
nearby check against secure state.
6
do that.
7
6
8
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
7
In some cases, sort the call to arm_hcr_el2_eff
9
Reviewed-by: Richard Henderson <rth@twiddle.net>
8
to the end of a short-circuit logical sequence.
10
Message-id: 20170713141928.25419-3-alex.bennee@linaro.org
9
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-id: 20181210150501.7990-3-richard.henderson@linaro.org
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
14
---
13
target/arm/translate-a64.c | 14 +++++++-------
15
target/arm/helper.c | 12 +++++-------
14
target/arm/translate.c | 6 +++---
16
target/arm/op_helper.c | 14 ++++++--------
15
2 files changed, 10 insertions(+), 10 deletions(-)
17
2 files changed, 11 insertions(+), 15 deletions(-)
16
18
17
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
19
diff --git a/target/arm/helper.c b/target/arm/helper.c
18
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/translate-a64.c
21
--- a/target/arm/helper.c
20
+++ b/target/arm/translate-a64.c
22
+++ b/target/arm/helper.c
21
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code_a64(ARMCPU *cpu, TranslationBlock *tb)
23
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tdosa(CPUARMState *env, const ARMCPRegInfo *ri,
22
case DISAS_NEXT:
24
int el = arm_current_el(env);
23
gen_goto_tb(dc, 1, dc->pc);
25
bool mdcr_el2_tdosa = (env->cp15.mdcr_el2 & MDCR_TDOSA) ||
24
break;
26
(env->cp15.mdcr_el2 & MDCR_TDE) ||
25
- default:
27
- (env->cp15.hcr_el2 & HCR_TGE);
26
- case DISAS_UPDATE:
28
+ (arm_hcr_el2_eff(env) & HCR_TGE);
27
- gen_a64_set_pc_im(dc->pc);
29
28
- /* fall through */
30
if (el < 2 && mdcr_el2_tdosa && !arm_is_secure_below_el3(env)) {
29
case DISAS_JUMP:
31
return CP_ACCESS_TRAP_EL2;
30
tcg_gen_lookup_and_goto_ptr(cpu_pc);
32
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tdra(CPUARMState *env, const ARMCPRegInfo *ri,
31
break;
33
int el = arm_current_el(env);
32
- case DISAS_EXIT:
34
bool mdcr_el2_tdra = (env->cp15.mdcr_el2 & MDCR_TDRA) ||
33
- tcg_gen_exit_tb(0);
35
(env->cp15.mdcr_el2 & MDCR_TDE) ||
34
- break;
36
- (env->cp15.hcr_el2 & HCR_TGE);
35
case DISAS_TB_JUMP:
37
+ (arm_hcr_el2_eff(env) & HCR_TGE);
36
case DISAS_EXC:
38
37
case DISAS_SWI:
39
if (el < 2 && mdcr_el2_tdra && !arm_is_secure_below_el3(env)) {
38
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code_a64(ARMCPU *cpu, TranslationBlock *tb)
40
return CP_ACCESS_TRAP_EL2;
39
*/
41
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tda(CPUARMState *env, const ARMCPRegInfo *ri,
40
tcg_gen_exit_tb(0);
42
int el = arm_current_el(env);
41
break;
43
bool mdcr_el2_tda = (env->cp15.mdcr_el2 & MDCR_TDA) ||
42
+ case DISAS_UPDATE:
44
(env->cp15.mdcr_el2 & MDCR_TDE) ||
43
+ gen_a64_set_pc_im(dc->pc);
45
- (env->cp15.hcr_el2 & HCR_TGE);
44
+ /* fall through */
46
+ (arm_hcr_el2_eff(env) & HCR_TGE);
45
+ case DISAS_EXIT:
47
46
+ default:
48
if (el < 2 && mdcr_el2_tda && !arm_is_secure_below_el3(env)) {
47
+ tcg_gen_exit_tb(0);
49
return CP_ACCESS_TRAP_EL2;
48
+ break;
50
@@ -XXX,XX +XXX,XX @@ int sve_exception_el(CPUARMState *env, int el)
51
if (disabled) {
52
/* route_to_el2 */
53
return (arm_feature(env, ARM_FEATURE_EL2)
54
- && !arm_is_secure(env)
55
- && (env->cp15.hcr_el2 & HCR_TGE) ? 2 : 1);
56
+ && (arm_hcr_el2_eff(env) & HCR_TGE) ? 2 : 1);
57
}
58
59
/* Check CPACR.FPEN. */
60
@@ -XXX,XX +XXX,XX @@ static int bad_mode_switch(CPUARMState *env, int mode, CPSRWriteType write_type)
61
* and CPS are treated as illegal mode changes.
62
*/
63
if (write_type == CPSRWriteByInstr &&
64
- (env->cp15.hcr_el2 & HCR_TGE) &&
65
(env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_MON &&
66
- !arm_is_secure_below_el3(env)) {
67
+ (arm_hcr_el2_eff(env) & HCR_TGE)) {
68
return 1;
69
}
70
return 0;
71
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/arm/op_helper.c
74
+++ b/target/arm/op_helper.c
75
@@ -XXX,XX +XXX,XX @@ void raise_exception(CPUARMState *env, uint32_t excp,
76
{
77
CPUState *cs = CPU(arm_env_get_cpu(env));
78
79
- if ((env->cp15.hcr_el2 & HCR_TGE) &&
80
- target_el == 1 && !arm_is_secure(env)) {
81
+ if (target_el == 1 && (arm_hcr_el2_eff(env) & HCR_TGE)) {
82
/*
83
* Redirect NS EL1 exceptions to NS EL2. These are reported with
84
* their original syndrome register value, with the exception of
85
@@ -XXX,XX +XXX,XX @@ static inline int check_wfx_trap(CPUARMState *env, bool is_wfe)
86
* No need for ARM_FEATURE check as if HCR_EL2 doesn't exist the
87
* bits will be zero indicating no trap.
88
*/
89
- if (cur_el < 2 && !arm_is_secure(env)) {
90
- mask = (is_wfe) ? HCR_TWE : HCR_TWI;
91
- if (env->cp15.hcr_el2 & mask) {
92
+ if (cur_el < 2) {
93
+ mask = is_wfe ? HCR_TWE : HCR_TWI;
94
+ if (arm_hcr_el2_eff(env) & mask) {
95
return 2;
49
}
96
}
50
}
97
}
51
98
@@ -XXX,XX +XXX,XX @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome)
52
diff --git a/target/arm/translate.c b/target/arm/translate.c
99
exception_target_el(env));
53
index XXXXXXX..XXXXXXX 100644
100
}
54
--- a/target/arm/translate.c
101
55
+++ b/target/arm/translate.c
102
- if (!secure && cur_el == 1 && (env->cp15.hcr_el2 & HCR_TSC)) {
56
@@ -XXX,XX +XXX,XX @@ void gen_intermediate_code(CPUARMState *env, TranslationBlock *tb)
103
+ if (cur_el == 1 && (arm_hcr_el2_eff(env) & HCR_TSC)) {
57
case DISAS_NEXT:
104
/* In NS EL1, HCR controlled routing to EL2 has priority over SMD.
58
gen_goto_tb(dc, 1, dc->pc);
105
* We also want an EL2 guest to be able to forbid its EL1 from
59
break;
106
* making PSCI calls into QEMU's "firmware" via HCR.TSC.
60
- case DISAS_UPDATE:
107
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env)
61
- gen_set_pc_im(dc, dc->pc);
108
goto illegal_return;
62
- /* fall through */
109
}
63
case DISAS_JUMP:
110
64
gen_goto_ptr();
111
- if (new_el == 1 && (env->cp15.hcr_el2 & HCR_TGE)
65
break;
112
- && !arm_is_secure_below_el3(env)) {
66
+ case DISAS_UPDATE:
113
+ if (new_el == 1 && (arm_hcr_el2_eff(env) & HCR_TGE)) {
67
+ gen_set_pc_im(dc, dc->pc);
114
goto illegal_return;
68
+ /* fall through */
115
}
69
default:
116
70
/* indicate that the hash table must be used to find the next TB */
71
tcg_gen_exit_tb(0);
72
--
117
--
73
2.7.4
118
2.19.2
74
119
75
120
diff view generated by jsdifflib
1
Implement a model of the simple timer device found in the CMSDK.
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Provide a trivial implementation with zero limited ordering regions,
4
which causes the LDLAR and STLLR instructions to devolve into the
5
LDAR and STLR instructions from the base ARMv8.0 instruction set.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20181210150501.7990-4-richard.henderson@linaro.org
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
5
Message-id: 1500029487-14822-5-git-send-email-peter.maydell@linaro.org
6
---
11
---
7
hw/timer/Makefile.objs | 1 +
12
target/arm/cpu.h | 5 +++
8
include/hw/timer/cmsdk-apb-timer.h | 59 +++++++++
13
target/arm/cpu64.c | 1 +
9
hw/timer/cmsdk-apb-timer.c | 253 +++++++++++++++++++++++++++++++++++++
14
target/arm/helper.c | 75 ++++++++++++++++++++++++++++++++++++++
10
default-configs/arm-softmmu.mak | 1 +
15
target/arm/translate-a64.c | 12 ++++++
11
hw/timer/trace-events | 5 +
16
4 files changed, 93 insertions(+)
12
5 files changed, 319 insertions(+)
13
create mode 100644 include/hw/timer/cmsdk-apb-timer.h
14
create mode 100644 hw/timer/cmsdk-apb-timer.c
15
17
16
diff --git a/hw/timer/Makefile.objs b/hw/timer/Makefile.objs
18
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
17
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/timer/Makefile.objs
20
--- a/target/arm/cpu.h
19
+++ b/hw/timer/Makefile.objs
21
+++ b/target/arm/cpu.h
20
@@ -XXX,XX +XXX,XX @@ common-obj-$(CONFIG_STM32F2XX_TIMER) += stm32f2xx_timer.o
22
@@ -XXX,XX +XXX,XX @@ static inline bool isar_feature_aa64_sve(const ARMISARegisters *id)
21
common-obj-$(CONFIG_ASPEED_SOC) += aspeed_timer.o
23
return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, SVE) != 0;
22
24
}
23
common-obj-$(CONFIG_SUN4V_RTC) += sun4v-rtc.o
25
24
+common-obj-$(CONFIG_CMSDK_APB_TIMER) += cmsdk-apb-timer.o
26
+static inline bool isar_feature_aa64_lor(const ARMISARegisters *id)
25
diff --git a/include/hw/timer/cmsdk-apb-timer.h b/include/hw/timer/cmsdk-apb-timer.h
26
new file mode 100644
27
index XXXXXXX..XXXXXXX
28
--- /dev/null
29
+++ b/include/hw/timer/cmsdk-apb-timer.h
30
@@ -XXX,XX +XXX,XX @@
31
+/*
32
+ * ARM CMSDK APB timer emulation
33
+ *
34
+ * Copyright (c) 2017 Linaro Limited
35
+ * Written by Peter Maydell
36
+ *
37
+ * This program is free software; you can redistribute it and/or modify
38
+ * it under the terms of the GNU General Public License version 2 or
39
+ * (at your option) any later version.
40
+ */
41
+
42
+#ifndef CMSDK_APB_TIMER_H
43
+#define CMSDK_APB_TIMER_H
44
+
45
+#include "hw/sysbus.h"
46
+#include "hw/ptimer.h"
47
+
48
+#define TYPE_CMSDK_APB_TIMER "cmsdk-apb-timer"
49
+#define CMSDK_APB_TIMER(obj) OBJECT_CHECK(CMSDKAPBTIMER, (obj), \
50
+ TYPE_CMSDK_APB_TIMER)
51
+
52
+typedef struct {
53
+ /*< private >*/
54
+ SysBusDevice parent_obj;
55
+
56
+ /*< public >*/
57
+ MemoryRegion iomem;
58
+ qemu_irq timerint;
59
+ uint32_t pclk_frq;
60
+ struct ptimer_state *timer;
61
+
62
+ uint32_t ctrl;
63
+ uint32_t value;
64
+ uint32_t reload;
65
+ uint32_t intstatus;
66
+} CMSDKAPBTIMER;
67
+
68
+/**
69
+ * cmsdk_apb_timer_create - convenience function to create TYPE_CMSDK_APB_TIMER
70
+ * @addr: location in system memory to map registers
71
+ * @pclk_frq: frequency in Hz of the PCLK clock (used for calculating baud rate)
72
+ */
73
+static inline DeviceState *cmsdk_apb_timer_create(hwaddr addr,
74
+ qemu_irq timerint,
75
+ uint32_t pclk_frq)
76
+{
27
+{
77
+ DeviceState *dev;
28
+ return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, LO) != 0;
78
+ SysBusDevice *s;
79
+
80
+ dev = qdev_create(NULL, TYPE_CMSDK_APB_TIMER);
81
+ s = SYS_BUS_DEVICE(dev);
82
+ qdev_prop_set_uint32(dev, "pclk-frq", pclk_frq);
83
+ qdev_init_nofail(dev);
84
+ sysbus_mmio_map(s, 0, addr);
85
+ sysbus_connect_irq(s, 0, timerint);
86
+ return dev;
87
+}
29
+}
88
+
30
+
89
+#endif
31
/*
90
diff --git a/hw/timer/cmsdk-apb-timer.c b/hw/timer/cmsdk-apb-timer.c
32
* Forward to the above feature tests given an ARMCPU pointer.
91
new file mode 100644
33
*/
92
index XXXXXXX..XXXXXXX
34
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
93
--- /dev/null
35
index XXXXXXX..XXXXXXX 100644
94
+++ b/hw/timer/cmsdk-apb-timer.c
36
--- a/target/arm/cpu64.c
95
@@ -XXX,XX +XXX,XX @@
37
+++ b/target/arm/cpu64.c
96
+/*
38
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
97
+ * ARM CMSDK APB timer emulation
39
98
+ *
40
t = cpu->isar.id_aa64mmfr1;
99
+ * Copyright (c) 2017 Linaro Limited
41
t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 1); /* HPD */
100
+ * Written by Peter Maydell
42
+ t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1);
101
+ *
43
cpu->isar.id_aa64mmfr1 = t;
102
+ * This program is free software; you can redistribute it and/or modify
44
103
+ * it under the terms of the GNU General Public License version 2 or
45
/* Replicate the same data to the 32-bit id registers. */
104
+ * (at your option) any later version.
46
diff --git a/target/arm/helper.c b/target/arm/helper.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/helper.c
49
+++ b/target/arm/helper.c
50
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
51
{
52
/* Begin with base v8.0 state. */
53
uint32_t valid_mask = 0x3fff;
54
+ ARMCPU *cpu = arm_env_get_cpu(env);
55
56
if (arm_el_is_aa64(env, 3)) {
57
value |= SCR_FW | SCR_AW; /* these two bits are RES1. */
58
@@ -XXX,XX +XXX,XX @@ static void scr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
59
valid_mask &= ~SCR_SMD;
60
}
61
}
62
+ if (cpu_isar_feature(aa64_lor, cpu)) {
63
+ valid_mask |= SCR_TLOR;
64
+ }
65
66
/* Clear all-context RES0 bits. */
67
value &= valid_mask;
68
@@ -XXX,XX +XXX,XX @@ static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
69
*/
70
valid_mask &= ~HCR_TSC;
71
}
72
+ if (cpu_isar_feature(aa64_lor, cpu)) {
73
+ valid_mask |= HCR_TLOR;
74
+ }
75
76
/* Clear RES0 bits. */
77
value &= valid_mask;
78
@@ -XXX,XX +XXX,XX @@ static uint64_t id_aa64pfr0_read(CPUARMState *env, const ARMCPRegInfo *ri)
79
return pfr0;
80
}
81
82
+/* Shared logic between LORID and the rest of the LOR* registers.
83
+ * Secure state has already been delt with.
105
+ */
84
+ */
85
+static CPAccessResult access_lor_ns(CPUARMState *env)
86
+{
87
+ int el = arm_current_el(env);
106
+
88
+
107
+/* This is a model of the "APB timer" which is part of the Cortex-M
89
+ if (el < 2 && (arm_hcr_el2_eff(env) & HCR_TLOR)) {
108
+ * System Design Kit (CMSDK) and documented in the Cortex-M System
90
+ return CP_ACCESS_TRAP_EL2;
109
+ * Design Kit Technical Reference Manual (ARM DDI0479C):
91
+ }
110
+ * https://developer.arm.com/products/system-design/system-design-kits/cortex-m-system-design-kit
92
+ if (el < 3 && (env->cp15.scr_el3 & SCR_TLOR)) {
111
+ *
93
+ return CP_ACCESS_TRAP_EL3;
112
+ * The hardware has an EXTIN input wire, which can be configured
94
+ }
113
+ * by the guest to act either as a 'timer enable' (timer does not run
95
+ return CP_ACCESS_OK;
114
+ * when EXTIN is low), or as a 'timer clock' (timer runs at frequency
115
+ * of EXTIN clock, not PCLK frequency). We don't model this.
116
+ *
117
+ * The documentation is not very clear about the exact behaviour;
118
+ * we choose to implement that the interrupt is triggered when
119
+ * the counter goes from 1 to 0, that the counter then holds at 0
120
+ * for one clock cycle before reloading from the RELOAD register,
121
+ * and that if the RELOAD register is 0 this does not cause an
122
+ * interrupt (as there is no further 1->0 transition).
123
+ */
124
+
125
+#include "qemu/osdep.h"
126
+#include "qemu/log.h"
127
+#include "qemu/main-loop.h"
128
+#include "qapi/error.h"
129
+#include "trace.h"
130
+#include "hw/sysbus.h"
131
+#include "hw/registerfields.h"
132
+#include "hw/timer/cmsdk-apb-timer.h"
133
+
134
+REG32(CTRL, 0)
135
+ FIELD(CTRL, EN, 0, 1)
136
+ FIELD(CTRL, SELEXTEN, 1, 1)
137
+ FIELD(CTRL, SELEXTCLK, 2, 1)
138
+ FIELD(CTRL, IRQEN, 3, 1)
139
+REG32(VALUE, 4)
140
+REG32(RELOAD, 8)
141
+REG32(INTSTATUS, 0xc)
142
+ FIELD(INTSTATUS, IRQ, 0, 1)
143
+REG32(PID4, 0xFD0)
144
+REG32(PID5, 0xFD4)
145
+REG32(PID6, 0xFD8)
146
+REG32(PID7, 0xFDC)
147
+REG32(PID0, 0xFE0)
148
+REG32(PID1, 0xFE4)
149
+REG32(PID2, 0xFE8)
150
+REG32(PID3, 0xFEC)
151
+REG32(CID0, 0xFF0)
152
+REG32(CID1, 0xFF4)
153
+REG32(CID2, 0xFF8)
154
+REG32(CID3, 0xFFC)
155
+
156
+/* PID/CID values */
157
+static const int timer_id[] = {
158
+ 0x04, 0x00, 0x00, 0x00, /* PID4..PID7 */
159
+ 0x22, 0xb8, 0x1b, 0x00, /* PID0..PID3 */
160
+ 0x0d, 0xf0, 0x05, 0xb1, /* CID0..CID3 */
161
+};
162
+
163
+static void cmsdk_apb_timer_update(CMSDKAPBTIMER *s)
164
+{
165
+ qemu_set_irq(s->timerint, !!(s->intstatus & R_INTSTATUS_IRQ_MASK));
166
+}
96
+}
167
+
97
+
168
+static uint64_t cmsdk_apb_timer_read(void *opaque, hwaddr offset, unsigned size)
98
+static CPAccessResult access_lorid(CPUARMState *env, const ARMCPRegInfo *ri,
99
+ bool isread)
169
+{
100
+{
170
+ CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
101
+ if (arm_is_secure_below_el3(env)) {
171
+ uint64_t r;
102
+ /* Access ok in secure mode. */
172
+
103
+ return CP_ACCESS_OK;
173
+ switch (offset) {
174
+ case A_CTRL:
175
+ r = s->ctrl;
176
+ break;
177
+ case A_VALUE:
178
+ r = ptimer_get_count(s->timer);
179
+ break;
180
+ case A_RELOAD:
181
+ r = ptimer_get_limit(s->timer);
182
+ break;
183
+ case A_INTSTATUS:
184
+ r = s->intstatus;
185
+ break;
186
+ case A_PID4 ... A_CID3:
187
+ r = timer_id[(offset - A_PID4) / 4];
188
+ break;
189
+ default:
190
+ qemu_log_mask(LOG_GUEST_ERROR,
191
+ "CMSDK APB timer read: bad offset %x\n", (int) offset);
192
+ r = 0;
193
+ break;
194
+ }
104
+ }
195
+ trace_cmsdk_apb_timer_read(offset, r, size);
105
+ return access_lor_ns(env);
196
+ return r;
197
+}
106
+}
198
+
107
+
199
+static void cmsdk_apb_timer_write(void *opaque, hwaddr offset, uint64_t value,
108
+static CPAccessResult access_lor_other(CPUARMState *env,
200
+ unsigned size)
109
+ const ARMCPRegInfo *ri, bool isread)
201
+{
110
+{
202
+ CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
111
+ if (arm_is_secure_below_el3(env)) {
203
+
112
+ /* Access denied in secure mode. */
204
+ trace_cmsdk_apb_timer_write(offset, value, size);
113
+ return CP_ACCESS_TRAP;
205
+
206
+ switch (offset) {
207
+ case A_CTRL:
208
+ if (value & 6) {
209
+ /* Bits [1] and [2] enable using EXTIN as either clock or
210
+ * an enable line. We don't model this.
211
+ */
212
+ qemu_log_mask(LOG_UNIMP,
213
+ "CMSDK APB timer: EXTIN input not supported\n");
214
+ }
215
+ s->ctrl = value & 0xf;
216
+ if (s->ctrl & R_CTRL_EN_MASK) {
217
+ ptimer_run(s->timer, 0);
218
+ } else {
219
+ ptimer_stop(s->timer);
220
+ }
221
+ break;
222
+ case A_RELOAD:
223
+ /* Writing to reload also sets the current timer value */
224
+ ptimer_set_limit(s->timer, value, 1);
225
+ break;
226
+ case A_VALUE:
227
+ ptimer_set_count(s->timer, value);
228
+ break;
229
+ case A_INTSTATUS:
230
+ /* Just one bit, which is W1C. */
231
+ value &= 1;
232
+ s->intstatus &= ~value;
233
+ cmsdk_apb_timer_update(s);
234
+ break;
235
+ case A_PID4 ... A_CID3:
236
+ qemu_log_mask(LOG_GUEST_ERROR,
237
+ "CMSDK APB timer write: write to RO offset 0x%x\n",
238
+ (int)offset);
239
+ break;
240
+ default:
241
+ qemu_log_mask(LOG_GUEST_ERROR,
242
+ "CMSDK APB timer write: bad offset 0x%x\n", (int) offset);
243
+ break;
244
+ }
114
+ }
115
+ return access_lor_ns(env);
245
+}
116
+}
246
+
117
+
247
+static const MemoryRegionOps cmsdk_apb_timer_ops = {
118
void register_cp_regs_for_features(ARMCPU *cpu)
248
+ .read = cmsdk_apb_timer_read,
119
{
249
+ .write = cmsdk_apb_timer_write,
120
/* Register all the coprocessor registers based on feature bits */
250
+ .endianness = DEVICE_LITTLE_ENDIAN,
121
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
251
+};
122
define_one_arm_cp_reg(cpu, &sctlr);
252
+
123
}
253
+static void cmsdk_apb_timer_tick(void *opaque)
124
254
+{
125
+ if (cpu_isar_feature(aa64_lor, cpu)) {
255
+ CMSDKAPBTIMER *s = CMSDK_APB_TIMER(opaque);
126
+ /*
256
+
127
+ * A trivial implementation of ARMv8.1-LOR leaves all of these
257
+ if (s->ctrl & R_CTRL_IRQEN_MASK) {
128
+ * registers fixed at 0, which indicates that there are zero
258
+ s->intstatus |= R_INTSTATUS_IRQ_MASK;
129
+ * supported Limited Ordering regions.
259
+ cmsdk_apb_timer_update(s);
130
+ */
260
+ }
131
+ static const ARMCPRegInfo lor_reginfo[] = {
261
+}
132
+ { .name = "LORSA_EL1", .state = ARM_CP_STATE_AA64,
262
+
133
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 0,
263
+static void cmsdk_apb_timer_reset(DeviceState *dev)
134
+ .access = PL1_RW, .accessfn = access_lor_other,
264
+{
135
+ .type = ARM_CP_CONST, .resetvalue = 0 },
265
+ CMSDKAPBTIMER *s = CMSDK_APB_TIMER(dev);
136
+ { .name = "LOREA_EL1", .state = ARM_CP_STATE_AA64,
266
+
137
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 1,
267
+ trace_cmsdk_apb_timer_reset();
138
+ .access = PL1_RW, .accessfn = access_lor_other,
268
+ s->ctrl = 0;
139
+ .type = ARM_CP_CONST, .resetvalue = 0 },
269
+ s->intstatus = 0;
140
+ { .name = "LORN_EL1", .state = ARM_CP_STATE_AA64,
270
+ ptimer_stop(s->timer);
141
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 2,
271
+ /* Set the limit and the count */
142
+ .access = PL1_RW, .accessfn = access_lor_other,
272
+ ptimer_set_limit(s->timer, 0, 1);
143
+ .type = ARM_CP_CONST, .resetvalue = 0 },
273
+}
144
+ { .name = "LORC_EL1", .state = ARM_CP_STATE_AA64,
274
+
145
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 3,
275
+static void cmsdk_apb_timer_init(Object *obj)
146
+ .access = PL1_RW, .accessfn = access_lor_other,
276
+{
147
+ .type = ARM_CP_CONST, .resetvalue = 0 },
277
+ SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
148
+ { .name = "LORID_EL1", .state = ARM_CP_STATE_AA64,
278
+ CMSDKAPBTIMER *s = CMSDK_APB_TIMER(obj);
149
+ .opc0 = 3, .opc1 = 0, .crn = 10, .crm = 4, .opc2 = 7,
279
+
150
+ .access = PL1_R, .accessfn = access_lorid,
280
+ memory_region_init_io(&s->iomem, obj, &cmsdk_apb_timer_ops,
151
+ .type = ARM_CP_CONST, .resetvalue = 0 },
281
+ s, "cmsdk-apb-timer", 0x1000);
152
+ REGINFO_SENTINEL
282
+ sysbus_init_mmio(sbd, &s->iomem);
153
+ };
283
+ sysbus_init_irq(sbd, &s->timerint);
154
+ define_arm_cp_regs(cpu, lor_reginfo);
284
+}
285
+
286
+static void cmsdk_apb_timer_realize(DeviceState *dev, Error **errp)
287
+{
288
+ CMSDKAPBTIMER *s = CMSDK_APB_TIMER(dev);
289
+ QEMUBH *bh;
290
+
291
+ if (s->pclk_frq == 0) {
292
+ error_setg(errp, "CMSDK APB timer: pclk-frq property must be set");
293
+ return;
294
+ }
155
+ }
295
+
156
+
296
+ bh = qemu_bh_new(cmsdk_apb_timer_tick, s);
157
if (cpu_isar_feature(aa64_sve, cpu)) {
297
+ s->timer = ptimer_init(bh,
158
define_one_arm_cp_reg(cpu, &zcr_el1_reginfo);
298
+ PTIMER_POLICY_WRAP_AFTER_ONE_PERIOD |
159
if (arm_feature(env, ARM_FEATURE_EL2)) {
299
+ PTIMER_POLICY_NO_IMMEDIATE_TRIGGER |
160
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
300
+ PTIMER_POLICY_NO_IMMEDIATE_RELOAD |
301
+ PTIMER_POLICY_NO_COUNTER_ROUND_DOWN);
302
+
303
+ ptimer_set_freq(s->timer, s->pclk_frq);
304
+}
305
+
306
+static const VMStateDescription cmsdk_apb_timer_vmstate = {
307
+ .name = "cmsdk-apb-timer",
308
+ .version_id = 1,
309
+ .minimum_version_id = 1,
310
+ .fields = (VMStateField[]) {
311
+ VMSTATE_PTIMER(timer, CMSDKAPBTIMER),
312
+ VMSTATE_UINT32(ctrl, CMSDKAPBTIMER),
313
+ VMSTATE_UINT32(value, CMSDKAPBTIMER),
314
+ VMSTATE_UINT32(reload, CMSDKAPBTIMER),
315
+ VMSTATE_UINT32(intstatus, CMSDKAPBTIMER),
316
+ VMSTATE_END_OF_LIST()
317
+ }
318
+};
319
+
320
+static Property cmsdk_apb_timer_properties[] = {
321
+ DEFINE_PROP_UINT32("pclk-frq", CMSDKAPBTIMER, pclk_frq, 0),
322
+ DEFINE_PROP_END_OF_LIST(),
323
+};
324
+
325
+static void cmsdk_apb_timer_class_init(ObjectClass *klass, void *data)
326
+{
327
+ DeviceClass *dc = DEVICE_CLASS(klass);
328
+
329
+ dc->realize = cmsdk_apb_timer_realize;
330
+ dc->vmsd = &cmsdk_apb_timer_vmstate;
331
+ dc->reset = cmsdk_apb_timer_reset;
332
+ dc->props = cmsdk_apb_timer_properties;
333
+}
334
+
335
+static const TypeInfo cmsdk_apb_timer_info = {
336
+ .name = TYPE_CMSDK_APB_TIMER,
337
+ .parent = TYPE_SYS_BUS_DEVICE,
338
+ .instance_size = sizeof(CMSDKAPBTIMER),
339
+ .instance_init = cmsdk_apb_timer_init,
340
+ .class_init = cmsdk_apb_timer_class_init,
341
+};
342
+
343
+static void cmsdk_apb_timer_register_types(void)
344
+{
345
+ type_register_static(&cmsdk_apb_timer_info);
346
+}
347
+
348
+type_init(cmsdk_apb_timer_register_types);
349
diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
350
index XXXXXXX..XXXXXXX 100644
161
index XXXXXXX..XXXXXXX 100644
351
--- a/default-configs/arm-softmmu.mak
162
--- a/target/arm/translate-a64.c
352
+++ b/default-configs/arm-softmmu.mak
163
+++ b/target/arm/translate-a64.c
353
@@ -XXX,XX +XXX,XX @@ CONFIG_STM32F2XX_ADC=y
164
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn)
354
CONFIG_STM32F2XX_SPI=y
165
}
355
CONFIG_STM32F205_SOC=y
166
return;
356
167
357
+CONFIG_CMSDK_APB_TIMER=y
168
+ case 0x8: /* STLLR */
358
CONFIG_CMSDK_APB_UART=y
169
+ if (!dc_isar_feature(aa64_lor, s)) {
359
170
+ break;
360
CONFIG_VERSATILE_PCI=y
171
+ }
361
diff --git a/hw/timer/trace-events b/hw/timer/trace-events
172
+ /* StoreLORelease is the same as Store-Release for QEMU. */
362
index XXXXXXX..XXXXXXX 100644
173
+ /* fall through */
363
--- a/hw/timer/trace-events
174
case 0x9: /* STLR */
364
+++ b/hw/timer/trace-events
175
/* Generate ISS for non-exclusive accesses including LASR. */
365
@@ -XXX,XX +XXX,XX @@ systick_reload(void) "systick reload"
176
if (rn == 31) {
366
systick_timer_tick(void) "systick reload"
177
@@ -XXX,XX +XXX,XX @@ static void disas_ldst_excl(DisasContext *s, uint32_t insn)
367
systick_read(uint64_t addr, uint32_t value, unsigned size) "systick read addr 0x%" PRIx64 " data 0x%" PRIx32 " size %u"
178
disas_ldst_compute_iss_sf(size, false, 0), is_lasr);
368
systick_write(uint64_t addr, uint32_t value, unsigned size) "systick write addr 0x%" PRIx64 " data 0x%" PRIx32 " size %u"
179
return;
369
+
180
370
+# hw/char/cmsdk_apb_timer.c
181
+ case 0xc: /* LDLAR */
371
+cmsdk_apb_timer_read(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB timer read: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
182
+ if (!dc_isar_feature(aa64_lor, s)) {
372
+cmsdk_apb_timer_write(uint64_t offset, uint64_t data, unsigned size) "CMSDK APB timer write: offset 0x%" PRIx64 " data 0x%" PRIx64 " size %u"
183
+ break;
373
+cmsdk_apb_timer_reset(void) "CMSDK APB timer: reset"
184
+ }
185
+ /* LoadLOAcquire is the same as Load-Acquire for QEMU. */
186
+ /* fall through */
187
case 0xd: /* LDAR */
188
/* Generate ISS for non-exclusive accesses including LASR. */
189
if (rn == 31) {
374
--
190
--
375
2.7.4
191
2.19.2
376
192
377
193
diff view generated by jsdifflib