| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * ARMV7M System emulation. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2006-2007 CodeSourcery. | 
					
						
							|  |  |  |  * Written by Paul Brook | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2011-06-23 10:59:26 +10:00
										 |  |  |  * This code is licensed under the GPL. | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-07 16:23:45 +00:00
										 |  |  | #include "qemu/osdep.h"
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  | #include "hw/arm/armv7m.h"
 | 
					
						
							| 
									
										
											  
											
												include/qemu/osdep.h: Don't include qapi/error.h
Commit 57cb38b included qapi/error.h into qemu/osdep.h to get the
Error typedef.  Since then, we've moved to include qemu/osdep.h
everywhere.  Its file comment explains: "To avoid getting into
possible circular include dependencies, this file should not include
any other QEMU headers, with the exceptions of config-host.h,
compiler.h, os-posix.h and os-win32.h, all of which are doing a
similar job to this file and are under similar constraints."
qapi/error.h doesn't do a similar job, and it doesn't adhere to
similar constraints: it includes qapi-types.h.  That's in excess of
100KiB of crap most .c files don't actually need.
Add the typedef to qemu/typedefs.h, and include that instead of
qapi/error.h.  Include qapi/error.h in .c files that need it and don't
get it now.  Include qapi-types.h in qom/object.h for uint16List.
Update scripts/clean-includes accordingly.  Update it further to match
reality: replace config.h by config-target.h, add sysemu/os-posix.h,
sysemu/os-win32.h.  Update the list of includes in the qemu/osdep.h
comment quoted above similarly.
This reduces the number of objects depending on qapi/error.h from "all
of them" to less than a third.  Unfortunately, the number depending on
qapi-types.h shrinks only a little.  More work is needed for that one.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
[Fix compilation without the spice devel packages. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
											
										 
											2016-03-14 09:01:28 +01:00
										 |  |  | #include "qapi/error.h"
 | 
					
						
							| 
									
										
										
										
											2016-01-19 21:51:44 +01:00
										 |  |  | #include "qemu-common.h"
 | 
					
						
							|  |  |  | #include "cpu.h"
 | 
					
						
							| 
									
										
										
										
											2013-02-04 15:40:22 +01:00
										 |  |  | #include "hw/sysbus.h"
 | 
					
						
							| 
									
										
										
										
											2013-04-09 15:26:55 +01:00
										 |  |  | #include "hw/arm/arm.h"
 | 
					
						
							| 
									
										
										
										
											2013-02-04 15:40:22 +01:00
										 |  |  | #include "hw/loader.h"
 | 
					
						
							| 
									
										
										
										
											2009-09-20 14:58:02 +00:00
										 |  |  | #include "elf.h"
 | 
					
						
							| 
									
										
										
										
											2013-07-29 18:36:59 +02:00
										 |  |  | #include "sysemu/qtest.h"
 | 
					
						
							|  |  |  | #include "qemu/error-report.h"
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:59 +00:00
										 |  |  | #include "exec/address-spaces.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:36 +00:00
										 |  |  | #include "target/arm/idau.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Bitbanded IO.  Each word corresponds to a single bit.  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-23 10:59:26 +10:00
										 |  |  | /* Get the byte address of the real memory for a bitband access.  */ | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  | static inline hwaddr bitband_addr(BitBandState *s, hwaddr offset) | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     return s->base | (offset & 0x1ffffff) >> 5; | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  | static MemTxResult bitband_read(void *opaque, hwaddr offset, | 
					
						
							|  |  |  |                                 uint64_t *data, unsigned size, MemTxAttrs attrs) | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     BitBandState *s = opaque; | 
					
						
							|  |  |  |     uint8_t buf[4]; | 
					
						
							|  |  |  |     MemTxResult res; | 
					
						
							|  |  |  |     int bitpos, bit; | 
					
						
							|  |  |  |     hwaddr addr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert(size <= 4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Find address in underlying memory and round down to multiple of size */ | 
					
						
							|  |  |  |     addr = bitband_addr(s, offset) & (-size); | 
					
						
							| 
									
										
										
										
											2017-09-21 18:51:08 +10:00
										 |  |  |     res = address_space_read(&s->source_as, addr, attrs, buf, size); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     if (res) { | 
					
						
							|  |  |  |         return res; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* Bit position in the N bytes read... */ | 
					
						
							|  |  |  |     bitpos = (offset >> 2) & ((size * 8) - 1); | 
					
						
							|  |  |  |     /* ...converted to byte in buffer and bit in byte */ | 
					
						
							|  |  |  |     bit = (buf[bitpos >> 3] >> (bitpos & 7)) & 1; | 
					
						
							|  |  |  |     *data = bit; | 
					
						
							|  |  |  |     return MEMTX_OK; | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  | static MemTxResult bitband_write(void *opaque, hwaddr offset, uint64_t value, | 
					
						
							|  |  |  |                                  unsigned size, MemTxAttrs attrs) | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     BitBandState *s = opaque; | 
					
						
							|  |  |  |     uint8_t buf[4]; | 
					
						
							|  |  |  |     MemTxResult res; | 
					
						
							|  |  |  |     int bitpos, bit; | 
					
						
							|  |  |  |     hwaddr addr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert(size <= 4); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Find address in underlying memory and round down to multiple of size */ | 
					
						
							|  |  |  |     addr = bitband_addr(s, offset) & (-size); | 
					
						
							| 
									
										
										
										
											2017-09-21 18:51:08 +10:00
										 |  |  |     res = address_space_read(&s->source_as, addr, attrs, buf, size); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     if (res) { | 
					
						
							|  |  |  |         return res; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* Bit position in the N bytes read... */ | 
					
						
							|  |  |  |     bitpos = (offset >> 2) & ((size * 8) - 1); | 
					
						
							|  |  |  |     /* ...converted to byte in buffer and bit in byte */ | 
					
						
							|  |  |  |     bit = 1 << (bitpos & 7); | 
					
						
							|  |  |  |     if (value & 1) { | 
					
						
							|  |  |  |         buf[bitpos >> 3] |= bit; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         buf[bitpos >> 3] &= ~bit; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-09-21 18:51:08 +10:00
										 |  |  |     return address_space_write(&s->source_as, addr, attrs, buf, size); | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-15 17:17:20 +03:00
										 |  |  | static const MemoryRegionOps bitband_ops = { | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     .read_with_attrs = bitband_read, | 
					
						
							|  |  |  |     .write_with_attrs = bitband_write, | 
					
						
							| 
									
										
										
										
											2011-08-15 17:17:20 +03:00
										 |  |  |     .endianness = DEVICE_NATIVE_ENDIAN, | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     .impl.min_access_size = 1, | 
					
						
							|  |  |  |     .impl.max_access_size = 4, | 
					
						
							|  |  |  |     .valid.min_access_size = 1, | 
					
						
							|  |  |  |     .valid.max_access_size = 4, | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-07 15:05:42 +08:00
										 |  |  | static void bitband_init(Object *obj) | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-07 15:05:42 +08:00
										 |  |  |     BitBandState *s = BITBAND(obj); | 
					
						
							|  |  |  |     SysBusDevice *dev = SYS_BUS_DEVICE(obj); | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     memory_region_init_io(&s->iomem, obj, &bitband_ops, s, | 
					
						
							| 
									
										
										
										
											2013-06-06 21:25:08 -04:00
										 |  |  |                           "bitband", 0x02000000); | 
					
						
							| 
									
										
										
										
											2011-11-27 11:38:10 +02:00
										 |  |  |     sysbus_init_mmio(dev, &s->iomem); | 
					
						
							| 
									
										
										
										
											2009-06-03 15:16:49 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  | static void bitband_realize(DeviceState *dev, Error **errp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     BitBandState *s = BITBAND(dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!s->source_memory) { | 
					
						
							|  |  |  |         error_setg(errp, "source-memory property not set"); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-21 18:51:08 +10:00
										 |  |  |     address_space_init(&s->source_as, s->source_memory, "bitband-source"); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | /* Board init.  */ | 
					
						
							| 
									
										
										
										
											2010-04-05 19:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  | static const hwaddr bitband_input_addr[ARMV7M_NUM_BITBANDS] = { | 
					
						
							|  |  |  |     0x20000000, 0x40000000 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const hwaddr bitband_output_addr[ARMV7M_NUM_BITBANDS] = { | 
					
						
							|  |  |  |     0x22000000, 0x42000000 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void armv7m_instance_init(Object *obj) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ARMv7MState *s = ARMV7M(obj); | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Can't init the cpu here, we don't yet know which model to use */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:59 +00:00
										 |  |  |     memory_region_init(&s->container, obj, "armv7m-container", UINT64_MAX); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-16 14:59:21 +02:00
										 |  |  |     sysbus_init_child_obj(obj, "nvnic", &s->nvic, sizeof(s->nvic), TYPE_NVIC); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  |     object_property_add_alias(obj, "num-irq", | 
					
						
							|  |  |  |                               OBJECT(&s->nvic), "num-irq", &error_abort); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (i = 0; i < ARRAY_SIZE(s->bitband); i++) { | 
					
						
							| 
									
										
										
										
											2018-07-16 14:59:21 +02:00
										 |  |  |         sysbus_init_child_obj(obj, "bitband[*]", &s->bitband[i], | 
					
						
							|  |  |  |                               sizeof(s->bitband[i]), TYPE_BITBAND); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void armv7m_realize(DeviceState *dev, Error **errp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ARMv7MState *s = ARMV7M(dev); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:00 +00:00
										 |  |  |     SysBusDevice *sbd; | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  |     Error *err = NULL; | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:59 +00:00
										 |  |  |     if (!s->board_memory) { | 
					
						
							|  |  |  |         error_setg(errp, "memory property was not set"); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-13 18:04:57 +02:00
										 |  |  |     s->cpu = ARM_CPU(object_new(s->cpu_type)); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:59 +00:00
										 |  |  |     object_property_set_link(OBJECT(s->cpu), OBJECT(&s->container), "memory", | 
					
						
							|  |  |  |                              &error_abort); | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:36 +00:00
										 |  |  |     if (object_property_find(OBJECT(s->cpu), "idau", NULL)) { | 
					
						
							|  |  |  |         object_property_set_link(OBJECT(s->cpu), s->idau, "idau", &err); | 
					
						
							|  |  |  |         if (err != NULL) { | 
					
						
							|  |  |  |             error_propagate(errp, err); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:37 +00:00
										 |  |  |     if (object_property_find(OBJECT(s->cpu), "init-svtor", NULL)) { | 
					
						
							|  |  |  |         object_property_set_uint(OBJECT(s->cpu), s->init_svtor, | 
					
						
							|  |  |  |                                  "init-svtor", &err); | 
					
						
							|  |  |  |         if (err != NULL) { | 
					
						
							|  |  |  |             error_propagate(errp, err); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-06-15 14:57:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Tell the CPU where the NVIC is; it will fail realize if it doesn't
 | 
					
						
							|  |  |  |      * have one. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     s->cpu->env.nvic = &s->nvic; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  |     object_property_set_bool(OBJECT(s->cpu), true, "realized", &err); | 
					
						
							|  |  |  |     if (err != NULL) { | 
					
						
							|  |  |  |         error_propagate(errp, err); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Note that we must realize the NVIC after the CPU */ | 
					
						
							|  |  |  |     object_property_set_bool(OBJECT(&s->nvic), true, "realized", &err); | 
					
						
							|  |  |  |     if (err != NULL) { | 
					
						
							|  |  |  |         error_propagate(errp, err); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Alias the NVIC's input and output GPIOs as our own so the board
 | 
					
						
							|  |  |  |      * code can wire them up. (We do this in realize because the | 
					
						
							|  |  |  |      * NVIC doesn't create the input GPIO array until realize.) | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     qdev_pass_gpios(DEVICE(&s->nvic), dev, NULL); | 
					
						
							|  |  |  |     qdev_pass_gpios(DEVICE(&s->nvic), dev, "SYSRESETREQ"); | 
					
						
							| 
									
										
										
										
											2018-08-20 11:24:33 +01:00
										 |  |  |     qdev_pass_gpios(DEVICE(&s->nvic), dev, "NMI"); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Wire the NVIC up to the CPU */ | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:00 +00:00
										 |  |  |     sbd = SYS_BUS_DEVICE(&s->nvic); | 
					
						
							|  |  |  |     sysbus_connect_irq(sbd, 0, | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  |                        qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_IRQ)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:00 +00:00
										 |  |  |     memory_region_add_subregion(&s->container, 0xe000e000, | 
					
						
							|  |  |  |                                 sysbus_mmio_get_region(sbd, 0)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-16 14:05:28 +01:00
										 |  |  |     if (s->enable_bitband) { | 
					
						
							|  |  |  |         for (i = 0; i < ARRAY_SIZE(s->bitband); i++) { | 
					
						
							|  |  |  |             Object *obj = OBJECT(&s->bitband[i]); | 
					
						
							|  |  |  |             SysBusDevice *sbd = SYS_BUS_DEVICE(&s->bitband[i]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             object_property_set_int(obj, bitband_input_addr[i], "base", &err); | 
					
						
							|  |  |  |             if (err != NULL) { | 
					
						
							|  |  |  |                 error_propagate(errp, err); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             object_property_set_link(obj, OBJECT(s->board_memory), | 
					
						
							|  |  |  |                                      "source-memory", &error_abort); | 
					
						
							|  |  |  |             object_property_set_bool(obj, true, "realized", &err); | 
					
						
							|  |  |  |             if (err != NULL) { | 
					
						
							|  |  |  |                 error_propagate(errp, err); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             memory_region_add_subregion(&s->container, bitband_output_addr[i], | 
					
						
							|  |  |  |                                         sysbus_mmio_get_region(sbd, 0)); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static Property armv7m_properties[] = { | 
					
						
							| 
									
										
										
										
											2017-09-13 18:04:57 +02:00
										 |  |  |     DEFINE_PROP_STRING("cpu-type", ARMv7MState, cpu_type), | 
					
						
							| 
									
										
										
										
											2017-09-07 13:54:51 +01:00
										 |  |  |     DEFINE_PROP_LINK("memory", ARMv7MState, board_memory, TYPE_MEMORY_REGION, | 
					
						
							|  |  |  |                      MemoryRegion *), | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:36 +00:00
										 |  |  |     DEFINE_PROP_LINK("idau", ARMv7MState, idau, TYPE_IDAU_INTERFACE, Object *), | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:37 +00:00
										 |  |  |     DEFINE_PROP_UINT32("init-svtor", ARMv7MState, init_svtor, 0), | 
					
						
							| 
									
										
										
										
											2018-08-16 14:05:28 +01:00
										 |  |  |     DEFINE_PROP_BOOL("enable-bitband", ARMv7MState, enable_bitband, false), | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  |     DEFINE_PROP_END_OF_LIST(), | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void armv7m_class_init(ObjectClass *klass, void *data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     DeviceClass *dc = DEVICE_CLASS(klass); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dc->realize = armv7m_realize; | 
					
						
							|  |  |  |     dc->props = armv7m_properties; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const TypeInfo armv7m_info = { | 
					
						
							|  |  |  |     .name = TYPE_ARMV7M, | 
					
						
							|  |  |  |     .parent = TYPE_SYS_BUS_DEVICE, | 
					
						
							|  |  |  |     .instance_size = sizeof(ARMv7MState), | 
					
						
							|  |  |  |     .instance_init = armv7m_instance_init, | 
					
						
							|  |  |  |     .class_init = armv7m_class_init, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-05 19:34:51 +01:00
										 |  |  | static void armv7m_reset(void *opaque) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-05-04 16:11:34 +02:00
										 |  |  |     ARMCPU *cpu = opaque; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cpu_reset(CPU(cpu)); | 
					
						
							| 
									
										
										
										
											2010-04-05 19:34:51 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:55 +00:00
										 |  |  | void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int image_size; | 
					
						
							|  |  |  |     uint64_t entry; | 
					
						
							|  |  |  |     uint64_t lowaddr; | 
					
						
							|  |  |  |     int big_endian; | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:36 +00:00
										 |  |  |     AddressSpace *as; | 
					
						
							|  |  |  |     int asidx; | 
					
						
							|  |  |  |     CPUState *cs = CPU(cpu); | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-20 14:58:02 +00:00
										 |  |  | #ifdef TARGET_WORDS_BIGENDIAN
 | 
					
						
							|  |  |  |     big_endian = 1; | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  |     big_endian = 0; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-29 18:36:59 +02:00
										 |  |  |     if (!kernel_filename && !qtest_enabled()) { | 
					
						
							| 
									
										
											  
											
												hw/arm: Replace fprintf(stderr, "*\n" with error_report()
Replace a large number of the fprintf(stderr, "*\n" calls with
error_report(). The functions were renamed with these commands and then
compiler issues where manually fixed.
find ./* -type f -exec sed -i \
    'N;N;N;N;N;N;N;N;N;N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N;N;N;N;N;N;N;N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N;N;N;N;N;N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N;N;N;N;N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N;N;N;N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N;N;N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N;N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N;N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
find ./* -type f -exec sed -i \
    'N; {s|fprintf(stderr, "\(.*\)\\n"\(.*\));|error_report("\1"\2);|Ig}' \
    {} +
Some lines where then manually tweaked to pass checkpatch.
The 'qemu: ' prefix was manually removed from the hw/arm/boot.c file.
Signed-off-by: Alistair Francis <alistair.francis@xilinx.com>
Cc: qemu-arm@nongnu.org
Conversions that aren't followed by exit() dropped, because they might
be inappropriate.
Also trim trailing punctuation from error messages.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20180203084315.20497-3-armbru@redhat.com>
											
										 
											2018-02-03 09:43:03 +01:00
										 |  |  |         error_report("Guest image must be specified (using -kernel)"); | 
					
						
							| 
									
										
										
										
											2012-08-13 11:04:05 +01:00
										 |  |  |         exit(1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:36 +00:00
										 |  |  |     if (arm_feature(&cpu->env, ARM_FEATURE_EL3)) { | 
					
						
							|  |  |  |         asidx = ARMASIdx_S; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         asidx = ARMASIdx_NS; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     as = cpu_get_address_space(cs, asidx); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-29 18:36:59 +02:00
										 |  |  |     if (kernel_filename) { | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:36 +00:00
										 |  |  |         image_size = load_elf_as(kernel_filename, NULL, NULL, &entry, &lowaddr, | 
					
						
							|  |  |  |                                  NULL, big_endian, EM_ARM, 1, 0, as); | 
					
						
							| 
									
										
										
										
											2013-07-29 18:36:59 +02:00
										 |  |  |         if (image_size < 0) { | 
					
						
							| 
									
										
										
										
											2018-03-02 10:45:36 +00:00
										 |  |  |             image_size = load_image_targphys_as(kernel_filename, 0, | 
					
						
							|  |  |  |                                                 mem_size, as); | 
					
						
							| 
									
										
										
										
											2013-07-29 18:36:59 +02:00
										 |  |  |             lowaddr = 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (image_size < 0) { | 
					
						
							|  |  |  |             error_report("Could not load kernel '%s'", kernel_filename); | 
					
						
							|  |  |  |             exit(1); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:55 +00:00
										 |  |  |     /* CPU objects (unlike devices) are not automatically reset on system
 | 
					
						
							|  |  |  |      * reset, so we must always register a handler to do so. Unlike | 
					
						
							|  |  |  |      * A-profile CPUs, we don't need to do anything special in the | 
					
						
							|  |  |  |      * handler to arrange that it starts correctly. | 
					
						
							|  |  |  |      * This is arguably the wrong place to do this, but it matches the | 
					
						
							|  |  |  |      * way A-profile does it. Note that this means that every M profile | 
					
						
							|  |  |  |      * board must call this function! | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2012-05-04 16:11:34 +02:00
										 |  |  |     qemu_register_reset(armv7m_reset, cpu); | 
					
						
							| 
									
										
										
										
											2007-11-11 00:04:49 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-06-03 15:16:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-24 13:12:29 -06:00
										 |  |  | static Property bitband_properties[] = { | 
					
						
							|  |  |  |     DEFINE_PROP_UINT32("base", BitBandState, base, 0), | 
					
						
							| 
									
										
										
										
											2017-09-07 13:54:50 +01:00
										 |  |  |     DEFINE_PROP_LINK("source-memory", BitBandState, source_memory, | 
					
						
							|  |  |  |                      TYPE_MEMORY_REGION, MemoryRegion *), | 
					
						
							| 
									
										
										
										
											2012-01-24 13:12:29 -06:00
										 |  |  |     DEFINE_PROP_END_OF_LIST(), | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void bitband_class_init(ObjectClass *klass, void *data) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-12-07 21:34:16 -06:00
										 |  |  |     DeviceClass *dc = DEVICE_CLASS(klass); | 
					
						
							| 
									
										
										
										
											2012-01-24 13:12:29 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-20 15:36:01 +00:00
										 |  |  |     dc->realize = bitband_realize; | 
					
						
							| 
									
										
										
										
											2011-12-07 21:34:16 -06:00
										 |  |  |     dc->props = bitband_properties; | 
					
						
							| 
									
										
										
										
											2012-01-24 13:12:29 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-10 16:19:07 +01:00
										 |  |  | static const TypeInfo bitband_info = { | 
					
						
							| 
									
										
										
										
											2013-07-24 00:46:43 +02:00
										 |  |  |     .name          = TYPE_BITBAND, | 
					
						
							| 
									
										
										
										
											2011-12-07 21:34:16 -06:00
										 |  |  |     .parent        = TYPE_SYS_BUS_DEVICE, | 
					
						
							|  |  |  |     .instance_size = sizeof(BitBandState), | 
					
						
							| 
									
										
										
										
											2016-03-07 15:05:42 +08:00
										 |  |  |     .instance_init = bitband_init, | 
					
						
							| 
									
										
										
										
											2011-12-07 21:34:16 -06:00
										 |  |  |     .class_init    = bitband_class_init, | 
					
						
							| 
									
										
										
										
											2009-07-15 13:43:31 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-09 15:20:55 +01:00
										 |  |  | static void armv7m_register_types(void) | 
					
						
							| 
									
										
										
										
											2009-06-03 15:16:49 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-12-07 21:34:16 -06:00
										 |  |  |     type_register_static(&bitband_info); | 
					
						
							| 
									
										
										
										
											2017-02-20 15:35:57 +00:00
										 |  |  |     type_register_static(&armv7m_info); | 
					
						
							| 
									
										
										
										
											2009-06-03 15:16:49 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-09 15:20:55 +01:00
										 |  |  | type_init(armv7m_register_types) |