miscellaneous patches:
* checkpatch.pl: Enforce multiline comment syntax * Rename cpu_physical_memory_write_rom() to address_space_write_rom() * disas, monitor, elf_ops: Use address_space_read() to read memory * Remove load_image() in favour of load_image_size() * Fix some minor memory leaks in arm boards/devices * virt: fix broken indentation -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJcE8EQAAoJEDwlJe0UNgze1iAP/3HAQI4Z5A3pX3I2YnVBDrS3 hOsPXNUNs2asDqoijkq4cxaqhTv1bio7CPLTg8uvkyWiCOS6pbKjtlE+A/VKGjKZ 7rH9GBNxlH7h/ZIRJTPfX38YiAWI//eIRY4JqUgKpmprE6Y7cGf5/uzmE0OwBwur HlKKkox6oH4WEk6rTIqP92xMhJNuTC2j1s7qQ2dCQKZdNAAYh++cHuiR1JtEjeQ8 O1/O4u6lumnqQMFtqhlt5++QxWvBU5IbdyJblBV+hCQekNSkj5fUIequBsjGrJru aZGxO828EEM7dS9/fFnT+YU25/rJ43RSs8aSBLqI/WWRALGQKU88POS5T7zfpzq/ 3qzSPWrOhgMFxl/APrGi13DdXTZ5J9UA0qypL8RiwdWj6WWJOo1OcRqzMGQhv1HS Fe22cWDDuXimQhUuyXM/XY234iPxFJkkq89ANHHfeCNFurzNV9WVN1mV2pfqwdX0 khh3DZyXRDa/UazLY0QyJHStyop76Ox8P8tCAvQbhZWr33Ns+uTr1YBHibimx3iG 6FOpH0FcpAE9oab9xUIdtMJCtx0YEWQ0ap/xMLlnmS8/bL7PX8HY0SIT2WwAiybg ibwen23Aah5LPpvd5BjGi1MAQEQwZvX8Ab7G+h1F4yzSfOchQt3eZN4fhwOkgjQA Bbb3bFUkIcXZ8BqabHA8 =ehNF -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/pmaydell/tags/pull-misc-20181214' into staging miscellaneous patches: * checkpatch.pl: Enforce multiline comment syntax * Rename cpu_physical_memory_write_rom() to address_space_write_rom() * disas, monitor, elf_ops: Use address_space_read() to read memory * Remove load_image() in favour of load_image_size() * Fix some minor memory leaks in arm boards/devices * virt: fix broken indentation # gpg: Signature made Fri 14 Dec 2018 14:41:20 GMT # gpg: using RSA key 3C2525ED14360CDE # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" # gpg: aka "Peter Maydell <pmaydell@gmail.com>" # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * remotes/pmaydell/tags/pull-misc-20181214: (22 commits) virt: Fix broken indentation target/arm: Create timers in realize, not init tests/test-arm-mptimer: Don't leak string memory hw/sd/sdhci: Don't leak memory region in sdhci_sysbus_realize() hw/arm/mps2-tz.c: Free mscname string in make_dma() target/arm: Free name string in ARMCPRegInfo hashtable entries include/hw/loader.h: Document load_image_size() hw/core/loader.c: Remove load_image() device_tree.c: Don't use load_image() hw/block/tc58128.c: Don't use load_image() hw/i386/multiboot.c: Don't use load_image() hw/i386/pc.c: Don't use load_image() hw/pci/pci.c: Don't use load_image() hw/smbios/smbios.c: Don't use load_image() hw/ppc/ppc405_boards: Don't use load_image() hw/ppc/mac_newworld, mac_oldworld: Don't use load_image() elf_ops.h: Use address_space_write() to write memory monitor: Use address_space_read() to read memory disas.c: Use address_space_read() to read memory Rename cpu_physical_memory_write_rom() to address_space_write_rom() ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
						commit
						b019f5e537
					
				@ -91,7 +91,7 @@ void *load_device_tree(const char *filename_path, int *sizep)
 | 
				
			|||||||
    /* First allocate space in qemu for device tree */
 | 
					    /* First allocate space in qemu for device tree */
 | 
				
			||||||
    fdt = g_malloc0(dt_size);
 | 
					    fdt = g_malloc0(dt_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dt_file_load_size = load_image(filename_path, fdt);
 | 
					    dt_file_load_size = load_image_size(filename_path, fdt, dt_size);
 | 
				
			||||||
    if (dt_file_load_size < 0) {
 | 
					    if (dt_file_load_size < 0) {
 | 
				
			||||||
        error_report("Unable to open device tree file '%s'",
 | 
					        error_report("Unable to open device tree file '%s'",
 | 
				
			||||||
                     filename_path);
 | 
					                     filename_path);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										5
									
								
								disas.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								disas.c
									
									
									
									
									
								
							@ -588,7 +588,10 @@ static int
 | 
				
			|||||||
physical_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
 | 
					physical_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
 | 
				
			||||||
                     struct disassemble_info *info)
 | 
					                     struct disassemble_info *info)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    cpu_physical_memory_read(memaddr, myaddr, length);
 | 
					    CPUDebug *s = container_of(info, CPUDebug, info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    address_space_read(s->cpu->as, memaddr, MEMTXATTRS_UNSPECIFIED,
 | 
				
			||||||
 | 
					                       myaddr, length);
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -253,6 +253,22 @@ Regexes for git grep
 | 
				
			|||||||
 - ``\<address_space_ldu\?[bwql]\(_[lb]e\)\?\>``
 | 
					 - ``\<address_space_ldu\?[bwql]\(_[lb]e\)\?\>``
 | 
				
			||||||
 - ``\<address_space_st[bwql]\(_[lb]e\)\?\>``
 | 
					 - ``\<address_space_st[bwql]\(_[lb]e\)\?\>``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					``address_space_write_rom``
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This function performs a write by physical address like
 | 
				
			||||||
 | 
					``address_space_write``, except that if the write is to a ROM then
 | 
				
			||||||
 | 
					the ROM contents will be modified, even though a write by the guest
 | 
				
			||||||
 | 
					CPU to the ROM would be ignored. This is used for non-guest writes
 | 
				
			||||||
 | 
					like writes from the gdb debug stub or initial loading of ROM contents.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note that portions of the write which attempt to write data to a
 | 
				
			||||||
 | 
					device will be silently ignored -- only real RAM and ROM will
 | 
				
			||||||
 | 
					be written to.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Regexes for git grep
 | 
				
			||||||
 | 
					 - ``address_space_write_rom``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
``{ld,st}*_phys``
 | 
					``{ld,st}*_phys``
 | 
				
			||||||
~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -315,25 +331,6 @@ For new code they are better avoided:
 | 
				
			|||||||
Regexes for git grep
 | 
					Regexes for git grep
 | 
				
			||||||
 - ``\<cpu_physical_memory_\(read\|write\|rw\)\>``
 | 
					 - ``\<cpu_physical_memory_\(read\|write\|rw\)\>``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
``cpu_physical_memory_write_rom``
 | 
					 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This function performs a write by physical address like
 | 
					 | 
				
			||||||
``address_space_write``, except that if the write is to a ROM then
 | 
					 | 
				
			||||||
the ROM contents will be modified, even though a write by the guest
 | 
					 | 
				
			||||||
CPU to the ROM would be ignored.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Note that unlike ``cpu_physical_memory_write()`` this function takes
 | 
					 | 
				
			||||||
an AddressSpace argument, but unlike ``address_space_write()`` this
 | 
					 | 
				
			||||||
function does not take a ``MemTxAttrs`` or return a ``MemTxResult``.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
**TODO**: we should probably clean up this inconsistency and
 | 
					 | 
				
			||||||
turn the function into ``address_space_write_rom`` with an API
 | 
					 | 
				
			||||||
matching ``address_space_write``.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
``cpu_physical_memory_write_rom``
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
``cpu_memory_rw_debug``
 | 
					``cpu_memory_rw_debug``
 | 
				
			||||||
~~~~~~~~~~~~~~~~~~~~~~~
 | 
					~~~~~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										28
									
								
								exec.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								exec.c
									
									
									
									
									
								
							@ -3388,8 +3388,12 @@ enum write_rom_type {
 | 
				
			|||||||
    FLUSH_CACHE,
 | 
					    FLUSH_CACHE,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
 | 
					static inline MemTxResult address_space_write_rom_internal(AddressSpace *as,
 | 
				
			||||||
    hwaddr addr, const uint8_t *buf, int len, enum write_rom_type type)
 | 
					                                                           hwaddr addr,
 | 
				
			||||||
 | 
					                                                           MemTxAttrs attrs,
 | 
				
			||||||
 | 
					                                                           const uint8_t *buf,
 | 
				
			||||||
 | 
					                                                           int len,
 | 
				
			||||||
 | 
					                                                           enum write_rom_type type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    hwaddr l;
 | 
					    hwaddr l;
 | 
				
			||||||
    uint8_t *ptr;
 | 
					    uint8_t *ptr;
 | 
				
			||||||
@ -3399,8 +3403,7 @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
 | 
				
			|||||||
    rcu_read_lock();
 | 
					    rcu_read_lock();
 | 
				
			||||||
    while (len > 0) {
 | 
					    while (len > 0) {
 | 
				
			||||||
        l = len;
 | 
					        l = len;
 | 
				
			||||||
        mr = address_space_translate(as, addr, &addr1, &l, true,
 | 
					        mr = address_space_translate(as, addr, &addr1, &l, true, attrs);
 | 
				
			||||||
                                     MEMTXATTRS_UNSPECIFIED);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!(memory_region_is_ram(mr) ||
 | 
					        if (!(memory_region_is_ram(mr) ||
 | 
				
			||||||
              memory_region_is_romd(mr))) {
 | 
					              memory_region_is_romd(mr))) {
 | 
				
			||||||
@ -3423,13 +3426,16 @@ static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
 | 
				
			|||||||
        addr += l;
 | 
					        addr += l;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    rcu_read_unlock();
 | 
					    rcu_read_unlock();
 | 
				
			||||||
 | 
					    return MEMTX_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* used for ROM loading : can write in RAM and ROM */
 | 
					/* used for ROM loading : can write in RAM and ROM */
 | 
				
			||||||
void cpu_physical_memory_write_rom(AddressSpace *as, hwaddr addr,
 | 
					MemTxResult address_space_write_rom(AddressSpace *as, hwaddr addr,
 | 
				
			||||||
 | 
					                                    MemTxAttrs attrs,
 | 
				
			||||||
                                    const uint8_t *buf, int len)
 | 
					                                    const uint8_t *buf, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    cpu_physical_memory_write_rom_internal(as, addr, buf, len, WRITE_DATA);
 | 
					    return address_space_write_rom_internal(as, addr, attrs,
 | 
				
			||||||
 | 
					                                            buf, len, WRITE_DATA);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void cpu_flush_icache_range(hwaddr start, int len)
 | 
					void cpu_flush_icache_range(hwaddr start, int len)
 | 
				
			||||||
@ -3444,8 +3450,9 @@ void cpu_flush_icache_range(hwaddr start, int len)
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cpu_physical_memory_write_rom_internal(&address_space_memory,
 | 
					    address_space_write_rom_internal(&address_space_memory,
 | 
				
			||||||
                                           start, NULL, len, FLUSH_CACHE);
 | 
					                                     start, MEMTXATTRS_UNSPECIFIED,
 | 
				
			||||||
 | 
					                                     NULL, len, FLUSH_CACHE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
@ -3873,8 +3880,9 @@ int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
 | 
				
			|||||||
            l = len;
 | 
					            l = len;
 | 
				
			||||||
        phys_addr += (addr & ~TARGET_PAGE_MASK);
 | 
					        phys_addr += (addr & ~TARGET_PAGE_MASK);
 | 
				
			||||||
        if (is_write) {
 | 
					        if (is_write) {
 | 
				
			||||||
            cpu_physical_memory_write_rom(cpu->cpu_ases[asidx].as,
 | 
					            address_space_write_rom(cpu->cpu_ases[asidx].as, phys_addr,
 | 
				
			||||||
                                          phys_addr, buf, l);
 | 
					                                    MEMTXATTRS_UNSPECIFIED,
 | 
				
			||||||
 | 
					                                    buf, l);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            address_space_rw(cpu->cpu_ases[asidx].as, phys_addr,
 | 
					            address_space_rw(cpu->cpu_ases[asidx].as, phys_addr,
 | 
				
			||||||
                             MEMTXATTRS_UNSPECIFIED,
 | 
					                             MEMTXATTRS_UNSPECIFIED,
 | 
				
			||||||
 | 
				
			|||||||
@ -322,6 +322,7 @@ static MemoryRegion *make_dma(MPS2TZMachineState *mms, void *opaque,
 | 
				
			|||||||
    sysbus_connect_irq(s, 2, qdev_get_gpio_in_named(iotkitdev,
 | 
					    sysbus_connect_irq(s, 2, qdev_get_gpio_in_named(iotkitdev,
 | 
				
			||||||
                                                    "EXP_IRQ", 57 + i * 3));
 | 
					                                                    "EXP_IRQ", 57 + i * 3));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_free(mscname);
 | 
				
			||||||
    return sysbus_mmio_get_region(s, 0);
 | 
					    return sysbus_mmio_get_region(s, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -38,7 +38,8 @@ static void init_dev(tc58128_dev * dev, const char *filename)
 | 
				
			|||||||
    memset(dev->flash_contents, 0xff, FLASH_SIZE);
 | 
					    memset(dev->flash_contents, 0xff, FLASH_SIZE);
 | 
				
			||||||
    if (filename) {
 | 
					    if (filename) {
 | 
				
			||||||
	/* Load flash image skipping the first block */
 | 
						/* Load flash image skipping the first block */
 | 
				
			||||||
	ret = load_image(filename, dev->flash_contents + 528 * 32);
 | 
					        ret = load_image_size(filename, dev->flash_contents + 528 * 32,
 | 
				
			||||||
 | 
					                              FLASH_SIZE - 528 * 32);
 | 
				
			||||||
	if (ret < 0) {
 | 
						if (ret < 0) {
 | 
				
			||||||
            if (!qtest_enabled()) {
 | 
					            if (!qtest_enabled()) {
 | 
				
			||||||
                error_report("Could not load flash image %s", filename);
 | 
					                error_report("Could not load flash image %s", filename);
 | 
				
			||||||
 | 
				
			|||||||
@ -73,31 +73,6 @@ int64_t get_image_size(const char *filename)
 | 
				
			|||||||
    return size;
 | 
					    return size;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* return the size or -1 if error */
 | 
					 | 
				
			||||||
/* deprecated, because caller does not specify buffer size! */
 | 
					 | 
				
			||||||
int load_image(const char *filename, uint8_t *addr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int fd, size;
 | 
					 | 
				
			||||||
    fd = open(filename, O_RDONLY | O_BINARY);
 | 
					 | 
				
			||||||
    if (fd < 0)
 | 
					 | 
				
			||||||
        return -1;
 | 
					 | 
				
			||||||
    size = lseek(fd, 0, SEEK_END);
 | 
					 | 
				
			||||||
    if (size == -1) {
 | 
					 | 
				
			||||||
        fprintf(stderr, "file %-20s: get size error: %s\n",
 | 
					 | 
				
			||||||
                filename, strerror(errno));
 | 
					 | 
				
			||||||
        close(fd);
 | 
					 | 
				
			||||||
        return -1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    lseek(fd, 0, SEEK_SET);
 | 
					 | 
				
			||||||
    if (read(fd, addr, size) != size) {
 | 
					 | 
				
			||||||
        close(fd);
 | 
					 | 
				
			||||||
        return -1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    close(fd);
 | 
					 | 
				
			||||||
    return size;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* return the size or -1 if error */
 | 
					/* return the size or -1 if error */
 | 
				
			||||||
ssize_t load_image_size(const char *filename, void *addr, size_t size)
 | 
					ssize_t load_image_size(const char *filename, void *addr, size_t size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -1103,8 +1078,8 @@ static void rom_reset(void *unused)
 | 
				
			|||||||
            void *host = memory_region_get_ram_ptr(rom->mr);
 | 
					            void *host = memory_region_get_ram_ptr(rom->mr);
 | 
				
			||||||
            memcpy(host, rom->data, rom->datasize);
 | 
					            memcpy(host, rom->data, rom->datasize);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            cpu_physical_memory_write_rom(rom->as, rom->addr, rom->data,
 | 
					            address_space_write_rom(rom->as, rom->addr, MEMTXATTRS_UNSPECIFIED,
 | 
				
			||||||
                                          rom->datasize);
 | 
					                                    rom->data, rom->datasize);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (rom->isrom) {
 | 
					        if (rom->isrom) {
 | 
				
			||||||
            /* rom needs to be written only once */
 | 
					            /* rom needs to be written only once */
 | 
				
			||||||
 | 
				
			|||||||
@ -343,7 +343,11 @@ int load_multiboot(FWCfgState *fw_cfg,
 | 
				
			|||||||
            mbs.mb_buf_size = TARGET_PAGE_ALIGN(mb_mod_length + mbs.mb_buf_size);
 | 
					            mbs.mb_buf_size = TARGET_PAGE_ALIGN(mb_mod_length + mbs.mb_buf_size);
 | 
				
			||||||
            mbs.mb_buf = g_realloc(mbs.mb_buf, mbs.mb_buf_size);
 | 
					            mbs.mb_buf = g_realloc(mbs.mb_buf, mbs.mb_buf_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            load_image(one_file, (unsigned char *)mbs.mb_buf + offs);
 | 
					            if (load_image_size(one_file, (unsigned char *)mbs.mb_buf + offs,
 | 
				
			||||||
 | 
					                                mbs.mb_buf_size - offs) < 0) {
 | 
				
			||||||
 | 
					                error_report("Error loading file '%s'", one_file);
 | 
				
			||||||
 | 
					                exit(1);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            mb_add_mod(&mbs, mbs.mb_buf_phys + offs,
 | 
					            mb_add_mod(&mbs, mbs.mb_buf_phys + offs,
 | 
				
			||||||
                       mbs.mb_buf_phys + offs + mb_mod_length, c);
 | 
					                       mbs.mb_buf_phys + offs + mb_mod_length, c);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										22
									
								
								hw/i386/pc.c
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								hw/i386/pc.c
									
									
									
									
									
								
							@ -839,10 +839,9 @@ static void load_linux(PCMachineState *pcms,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    uint16_t protocol;
 | 
					    uint16_t protocol;
 | 
				
			||||||
    int setup_size, kernel_size, cmdline_size;
 | 
					    int setup_size, kernel_size, cmdline_size;
 | 
				
			||||||
    int64_t initrd_size = 0;
 | 
					 | 
				
			||||||
    int dtb_size, setup_data_offset;
 | 
					    int dtb_size, setup_data_offset;
 | 
				
			||||||
    uint32_t initrd_max;
 | 
					    uint32_t initrd_max;
 | 
				
			||||||
    uint8_t header[8192], *setup, *kernel, *initrd_data;
 | 
					    uint8_t header[8192], *setup, *kernel;
 | 
				
			||||||
    hwaddr real_addr, prot_addr, cmdline_addr, initrd_addr = 0;
 | 
					    hwaddr real_addr, prot_addr, cmdline_addr, initrd_addr = 0;
 | 
				
			||||||
    FILE *f;
 | 
					    FILE *f;
 | 
				
			||||||
    char *vmode;
 | 
					    char *vmode;
 | 
				
			||||||
@ -965,27 +964,30 @@ static void load_linux(PCMachineState *pcms,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* load initrd */
 | 
					    /* load initrd */
 | 
				
			||||||
    if (initrd_filename) {
 | 
					    if (initrd_filename) {
 | 
				
			||||||
 | 
					        gsize initrd_size;
 | 
				
			||||||
 | 
					        gchar *initrd_data;
 | 
				
			||||||
 | 
					        GError *gerr = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (protocol < 0x200) {
 | 
					        if (protocol < 0x200) {
 | 
				
			||||||
            fprintf(stderr, "qemu: linux kernel too old to load a ram disk\n");
 | 
					            fprintf(stderr, "qemu: linux kernel too old to load a ram disk\n");
 | 
				
			||||||
            exit(1);
 | 
					            exit(1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        initrd_size = get_image_size(initrd_filename);
 | 
					        if (!g_file_get_contents(initrd_filename, &initrd_data,
 | 
				
			||||||
        if (initrd_size < 0) {
 | 
					                                 &initrd_size, &gerr)) {
 | 
				
			||||||
            fprintf(stderr, "qemu: error reading initrd %s: %s\n",
 | 
					            fprintf(stderr, "qemu: error reading initrd %s: %s\n",
 | 
				
			||||||
                    initrd_filename, strerror(errno));
 | 
					                    initrd_filename, gerr->message);
 | 
				
			||||||
            exit(1);
 | 
					            exit(1);
 | 
				
			||||||
        } else if (initrd_size >= initrd_max) {
 | 
					        }
 | 
				
			||||||
 | 
					        if (initrd_size >= initrd_max) {
 | 
				
			||||||
            fprintf(stderr, "qemu: initrd is too large, cannot support."
 | 
					            fprintf(stderr, "qemu: initrd is too large, cannot support."
 | 
				
			||||||
                    "(max: %"PRIu32", need %"PRId64")\n", initrd_max, initrd_size);
 | 
					                    "(max: %"PRIu32", need %"PRId64")\n",
 | 
				
			||||||
 | 
					                    initrd_max, (uint64_t)initrd_size);
 | 
				
			||||||
            exit(1);
 | 
					            exit(1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        initrd_addr = (initrd_max-initrd_size) & ~4095;
 | 
					        initrd_addr = (initrd_max-initrd_size) & ~4095;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        initrd_data = g_malloc(initrd_size);
 | 
					 | 
				
			||||||
        load_image(initrd_filename, initrd_data);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr);
 | 
					        fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr);
 | 
				
			||||||
        fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size);
 | 
					        fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size);
 | 
				
			||||||
        fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, initrd_data, initrd_size);
 | 
					        fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, initrd_data, initrd_size);
 | 
				
			||||||
 | 
				
			|||||||
@ -122,8 +122,9 @@ static void apic_sync_vapic(APICCommonState *s, int sync_type)
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        vapic_state.irr = vector & 0xff;
 | 
					        vapic_state.irr = vector & 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cpu_physical_memory_write_rom(&address_space_memory,
 | 
					        address_space_write_rom(&address_space_memory,
 | 
				
			||||||
                                s->vapic_paddr + start,
 | 
					                                s->vapic_paddr + start,
 | 
				
			||||||
 | 
					                                MEMTXATTRS_UNSPECIFIED,
 | 
				
			||||||
                                ((void *)&vapic_state) + start, length);
 | 
					                                ((void *)&vapic_state) + start, length);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -448,7 +448,7 @@ static int tz_mpc_attrs_to_index(IOMMUMemoryRegion *iommu, MemTxAttrs attrs)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    /* We treat unspecified attributes like secure. Transactions with
 | 
					    /* We treat unspecified attributes like secure. Transactions with
 | 
				
			||||||
     * unspecified attributes come from places like
 | 
					     * unspecified attributes come from places like
 | 
				
			||||||
     * cpu_physical_memory_write_rom() for initial image load, and we want
 | 
					     * rom_reset() for initial image load, and we want
 | 
				
			||||||
     * those to pass through the from-reset "everything is secure" config.
 | 
					     * those to pass through the from-reset "everything is secure" config.
 | 
				
			||||||
     * All the real during-emulation transactions from the CPU will
 | 
					     * All the real during-emulation transactions from the CPU will
 | 
				
			||||||
     * specify attributes.
 | 
					     * specify attributes.
 | 
				
			||||||
 | 
				
			|||||||
@ -2261,7 +2261,11 @@ static void pci_add_option_rom(PCIDevice *pdev, bool is_default_rom,
 | 
				
			|||||||
    pdev->has_rom = true;
 | 
					    pdev->has_rom = true;
 | 
				
			||||||
    memory_region_init_rom(&pdev->rom, OBJECT(pdev), name, size, &error_fatal);
 | 
					    memory_region_init_rom(&pdev->rom, OBJECT(pdev), name, size, &error_fatal);
 | 
				
			||||||
    ptr = memory_region_get_ram_ptr(&pdev->rom);
 | 
					    ptr = memory_region_get_ram_ptr(&pdev->rom);
 | 
				
			||||||
    load_image(path, ptr);
 | 
					    if (load_image_size(path, ptr, size) < 0) {
 | 
				
			||||||
 | 
					        error_setg(errp, "failed to load romfile \"%s\"", pdev->romfile);
 | 
				
			||||||
 | 
					        g_free(path);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    g_free(path);
 | 
					    g_free(path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (is_default_rom) {
 | 
					    if (is_default_rom) {
 | 
				
			||||||
 | 
				
			|||||||
@ -127,8 +127,7 @@ static void ppc_core99_init(MachineState *machine)
 | 
				
			|||||||
    MACIOIDEState *macio_ide;
 | 
					    MACIOIDEState *macio_ide;
 | 
				
			||||||
    BusState *adb_bus;
 | 
					    BusState *adb_bus;
 | 
				
			||||||
    MacIONVRAMState *nvr;
 | 
					    MacIONVRAMState *nvr;
 | 
				
			||||||
    int bios_size, ndrv_size;
 | 
					    int bios_size;
 | 
				
			||||||
    uint8_t *ndrv_file;
 | 
					 | 
				
			||||||
    int ppc_boot_device;
 | 
					    int ppc_boot_device;
 | 
				
			||||||
    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
 | 
					    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
 | 
				
			||||||
    void *fw_cfg;
 | 
					    void *fw_cfg;
 | 
				
			||||||
@ -510,11 +509,10 @@ static void ppc_core99_init(MachineState *machine)
 | 
				
			|||||||
    /* MacOS NDRV VGA driver */
 | 
					    /* MacOS NDRV VGA driver */
 | 
				
			||||||
    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, NDRV_VGA_FILENAME);
 | 
					    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, NDRV_VGA_FILENAME);
 | 
				
			||||||
    if (filename) {
 | 
					    if (filename) {
 | 
				
			||||||
        ndrv_size = get_image_size(filename);
 | 
					        gchar *ndrv_file;
 | 
				
			||||||
        if (ndrv_size != -1) {
 | 
					        gsize ndrv_size;
 | 
				
			||||||
            ndrv_file = g_malloc(ndrv_size);
 | 
					 | 
				
			||||||
            ndrv_size = load_image(filename, ndrv_file);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (g_file_get_contents(filename, &ndrv_file, &ndrv_size, NULL)) {
 | 
				
			||||||
            fw_cfg_add_file(fw_cfg, "ndrv/qemu_vga.ndrv", ndrv_file, ndrv_size);
 | 
					            fw_cfg_add_file(fw_cfg, "ndrv/qemu_vga.ndrv", ndrv_file, ndrv_size);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        g_free(filename);
 | 
					        g_free(filename);
 | 
				
			||||||
 | 
				
			|||||||
@ -99,8 +99,7 @@ static void ppc_heathrow_init(MachineState *machine)
 | 
				
			|||||||
    SysBusDevice *s;
 | 
					    SysBusDevice *s;
 | 
				
			||||||
    DeviceState *dev, *pic_dev;
 | 
					    DeviceState *dev, *pic_dev;
 | 
				
			||||||
    BusState *adb_bus;
 | 
					    BusState *adb_bus;
 | 
				
			||||||
    int bios_size, ndrv_size;
 | 
					    int bios_size;
 | 
				
			||||||
    uint8_t *ndrv_file;
 | 
					 | 
				
			||||||
    uint16_t ppc_boot_device;
 | 
					    uint16_t ppc_boot_device;
 | 
				
			||||||
    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
 | 
					    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
 | 
				
			||||||
    void *fw_cfg;
 | 
					    void *fw_cfg;
 | 
				
			||||||
@ -361,11 +360,10 @@ static void ppc_heathrow_init(MachineState *machine)
 | 
				
			|||||||
    /* MacOS NDRV VGA driver */
 | 
					    /* MacOS NDRV VGA driver */
 | 
				
			||||||
    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, NDRV_VGA_FILENAME);
 | 
					    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, NDRV_VGA_FILENAME);
 | 
				
			||||||
    if (filename) {
 | 
					    if (filename) {
 | 
				
			||||||
        ndrv_size = get_image_size(filename);
 | 
					        gchar *ndrv_file;
 | 
				
			||||||
        if (ndrv_size != -1) {
 | 
					        gsize ndrv_size;
 | 
				
			||||||
            ndrv_file = g_malloc(ndrv_size);
 | 
					 | 
				
			||||||
            ndrv_size = load_image(filename, ndrv_file);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (g_file_get_contents(filename, &ndrv_file, &ndrv_size, NULL)) {
 | 
				
			||||||
            fw_cfg_add_file(fw_cfg, "ndrv/qemu_vga.ndrv", ndrv_file, ndrv_size);
 | 
					            fw_cfg_add_file(fw_cfg, "ndrv/qemu_vga.ndrv", ndrv_file, ndrv_size);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        g_free(filename);
 | 
					        g_free(filename);
 | 
				
			||||||
 | 
				
			|||||||
@ -219,9 +219,11 @@ static void ref405ep_init(MachineState *machine)
 | 
				
			|||||||
            bios_name = BIOS_FILENAME;
 | 
					            bios_name = BIOS_FILENAME;
 | 
				
			||||||
        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
 | 
					        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
 | 
				
			||||||
        if (filename) {
 | 
					        if (filename) {
 | 
				
			||||||
            bios_size = load_image(filename, memory_region_get_ram_ptr(bios));
 | 
					            bios_size = load_image_size(filename,
 | 
				
			||||||
 | 
					                                        memory_region_get_ram_ptr(bios),
 | 
				
			||||||
 | 
					                                        BIOS_SIZE);
 | 
				
			||||||
            g_free(filename);
 | 
					            g_free(filename);
 | 
				
			||||||
            if (bios_size < 0 || bios_size > BIOS_SIZE) {
 | 
					            if (bios_size < 0) {
 | 
				
			||||||
                error_report("Could not load PowerPC BIOS '%s'", bios_name);
 | 
					                error_report("Could not load PowerPC BIOS '%s'", bios_name);
 | 
				
			||||||
                exit(1);
 | 
					                exit(1);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -515,9 +517,11 @@ static void taihu_405ep_init(MachineState *machine)
 | 
				
			|||||||
                               &error_fatal);
 | 
					                               &error_fatal);
 | 
				
			||||||
        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
 | 
					        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
 | 
				
			||||||
        if (filename) {
 | 
					        if (filename) {
 | 
				
			||||||
            bios_size = load_image(filename, memory_region_get_ram_ptr(bios));
 | 
					            bios_size = load_image_size(filename,
 | 
				
			||||||
 | 
					                                        memory_region_get_ram_ptr(bios),
 | 
				
			||||||
 | 
					                                        BIOS_SIZE);
 | 
				
			||||||
            g_free(filename);
 | 
					            g_free(filename);
 | 
				
			||||||
            if (bios_size < 0 || bios_size > BIOS_SIZE) {
 | 
					            if (bios_size < 0) {
 | 
				
			||||||
                error_report("Could not load PowerPC BIOS '%s'", bios_name);
 | 
					                error_report("Could not load PowerPC BIOS '%s'", bios_name);
 | 
				
			||||||
                exit(1);
 | 
					                exit(1);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -1371,7 +1371,7 @@ static void sdhci_common_realize(SDHCIState *s, Error **errp)
 | 
				
			|||||||
    s->buf_maxsz = sdhci_get_fifolen(s);
 | 
					    s->buf_maxsz = sdhci_get_fifolen(s);
 | 
				
			||||||
    s->fifo_buffer = g_malloc0(s->buf_maxsz);
 | 
					    s->fifo_buffer = g_malloc0(s->buf_maxsz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memory_region_init_io(&s->iomem, OBJECT(s), &sdhci_mmio_ops, s, "sdhci",
 | 
					    memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, "sdhci",
 | 
				
			||||||
                          SDHC_REGISTERS_MAP_SIZE);
 | 
					                          SDHC_REGISTERS_MAP_SIZE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1565,9 +1565,6 @@ static void sdhci_sysbus_realize(DeviceState *dev, Error ** errp)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    sysbus_init_irq(sbd, &s->irq);
 | 
					    sysbus_init_irq(sbd, &s->irq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memory_region_init_io(&s->iomem, OBJECT(s), s->io_ops, s, "sdhci",
 | 
					 | 
				
			||||||
            SDHC_REGISTERS_MAP_SIZE);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sysbus_init_mmio(sbd, &s->iomem);
 | 
					    sysbus_init_mmio(sbd, &s->iomem);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -982,7 +982,7 @@ void smbios_entry_add(QemuOpts *opts, Error **errp)
 | 
				
			|||||||
        header = (struct smbios_structure_header *)(smbios_tables +
 | 
					        header = (struct smbios_structure_header *)(smbios_tables +
 | 
				
			||||||
                                                    smbios_tables_len);
 | 
					                                                    smbios_tables_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (load_image(val, (uint8_t *)header) != size) {
 | 
					        if (load_image_size(val, (uint8_t *)header, size) != size) {
 | 
				
			||||||
            error_setg(errp, "Failed to load SMBIOS file %s", val);
 | 
					            error_setg(errp, "Failed to load SMBIOS file %s", val);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -559,8 +559,9 @@ static void idreg_init(hwaddr addr)
 | 
				
			|||||||
    s = SYS_BUS_DEVICE(dev);
 | 
					    s = SYS_BUS_DEVICE(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sysbus_mmio_map(s, 0, addr);
 | 
					    sysbus_mmio_map(s, 0, addr);
 | 
				
			||||||
    cpu_physical_memory_write_rom(&address_space_memory,
 | 
					    address_space_write_rom(&address_space_memory, addr,
 | 
				
			||||||
                                  addr, idreg_data, sizeof(idreg_data));
 | 
					                            MEMTXATTRS_UNSPECIFIED,
 | 
				
			||||||
 | 
					                            idreg_data, sizeof(idreg_data));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MACIO_ID_REGISTER(obj) \
 | 
					#define MACIO_ID_REGISTER(obj) \
 | 
				
			||||||
 | 
				
			|||||||
@ -111,8 +111,6 @@ bool cpu_physical_memory_is_io(hwaddr phys_addr);
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
void qemu_flush_coalesced_mmio_buffer(void);
 | 
					void qemu_flush_coalesced_mmio_buffer(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void cpu_physical_memory_write_rom(AddressSpace *as, hwaddr addr,
 | 
					 | 
				
			||||||
                                   const uint8_t *buf, int len);
 | 
					 | 
				
			||||||
void cpu_flush_icache_range(hwaddr start, int len);
 | 
					void cpu_flush_icache_range(hwaddr start, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct MemoryRegion io_mem_rom;
 | 
					extern struct MemoryRegion io_mem_rom;
 | 
				
			||||||
 | 
				
			|||||||
@ -1792,6 +1792,32 @@ MemTxResult address_space_write(AddressSpace *as, hwaddr addr,
 | 
				
			|||||||
                                MemTxAttrs attrs,
 | 
					                                MemTxAttrs attrs,
 | 
				
			||||||
                                const uint8_t *buf, int len);
 | 
					                                const uint8_t *buf, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * address_space_write_rom: write to address space, including ROM.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This function writes to the specified address space, but will
 | 
				
			||||||
 | 
					 * write data to both ROM and RAM. This is used for non-guest
 | 
				
			||||||
 | 
					 * writes like writes from the gdb debug stub or initial loading
 | 
				
			||||||
 | 
					 * of ROM contents.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Note that portions of the write which attempt to write data to
 | 
				
			||||||
 | 
					 * a device will be silently ignored -- only real RAM and ROM will
 | 
				
			||||||
 | 
					 * be written to.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Return a MemTxResult indicating whether the operation succeeded
 | 
				
			||||||
 | 
					 * or failed (eg unassigned memory, device rejected the transaction,
 | 
				
			||||||
 | 
					 * IOMMU fault).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @as: #AddressSpace to be accessed
 | 
				
			||||||
 | 
					 * @addr: address within that address space
 | 
				
			||||||
 | 
					 * @attrs: memory transaction attributes
 | 
				
			||||||
 | 
					 * @buf: buffer with the data transferred
 | 
				
			||||||
 | 
					 * @len: the number of bytes to write
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					MemTxResult address_space_write_rom(AddressSpace *as, hwaddr addr,
 | 
				
			||||||
 | 
					                                    MemTxAttrs attrs,
 | 
				
			||||||
 | 
					                                    const uint8_t *buf, int len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* address_space_ld*: load from an address space
 | 
					/* address_space_ld*: load from an address space
 | 
				
			||||||
 * address_space_st*: store to an address space
 | 
					 * address_space_st*: store to an address space
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 | 
				
			|||||||
@ -482,7 +482,9 @@ static int glue(load_elf, SZ)(const char *name, int fd,
 | 
				
			|||||||
                    rom_add_elf_program(label, data, file_size, mem_size,
 | 
					                    rom_add_elf_program(label, data, file_size, mem_size,
 | 
				
			||||||
                                        addr, as);
 | 
					                                        addr, as);
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    cpu_physical_memory_write(addr, data, file_size);
 | 
					                    address_space_write(as ? as : &address_space_memory,
 | 
				
			||||||
 | 
					                                        addr, MEMTXATTRS_UNSPECIFIED,
 | 
				
			||||||
 | 
					                                        data, file_size);
 | 
				
			||||||
                    g_free(data);
 | 
					                    g_free(data);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -11,7 +11,22 @@
 | 
				
			|||||||
 * On error, errno is also set as appropriate.
 | 
					 * On error, errno is also set as appropriate.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int64_t get_image_size(const char *filename);
 | 
					int64_t get_image_size(const char *filename);
 | 
				
			||||||
int load_image(const char *filename, uint8_t *addr); /* deprecated */
 | 
					/**
 | 
				
			||||||
 | 
					 * load_image_size: load an image file into specified buffer
 | 
				
			||||||
 | 
					 * @filename: Path to the image file
 | 
				
			||||||
 | 
					 * @addr: Buffer to load image into
 | 
				
			||||||
 | 
					 * @size: Size of buffer in bytes
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Load an image file from disk into the specified buffer.
 | 
				
			||||||
 | 
					 * If the image is larger than the specified buffer, only
 | 
				
			||||||
 | 
					 * @size bytes are read (this is not considered an error).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Prefer to use the GLib function g_file_get_contents() rather
 | 
				
			||||||
 | 
					 * than a "get_image_size()/g_malloc()/load_image_size()" sequence.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Returns the number of bytes read, or -1 on error. On error,
 | 
				
			||||||
 | 
					 * errno is also set as appropriate.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
ssize_t load_image_size(const char *filename, void *addr, size_t size);
 | 
					ssize_t load_image_size(const char *filename, void *addr, size_t size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**load_image_targphys_as:
 | 
					/**load_image_targphys_as:
 | 
				
			||||||
 | 
				
			|||||||
@ -1600,7 +1600,13 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
 | 
				
			|||||||
        if (l > line_size)
 | 
					        if (l > line_size)
 | 
				
			||||||
            l = line_size;
 | 
					            l = line_size;
 | 
				
			||||||
        if (is_physical) {
 | 
					        if (is_physical) {
 | 
				
			||||||
            cpu_physical_memory_read(addr, buf, l);
 | 
					            AddressSpace *as = cs ? cs->as : &address_space_memory;
 | 
				
			||||||
 | 
					            MemTxResult r = address_space_read(as, addr,
 | 
				
			||||||
 | 
					                                               MEMTXATTRS_UNSPECIFIED, buf, l);
 | 
				
			||||||
 | 
					            if (r != MEMTX_OK) {
 | 
				
			||||||
 | 
					                monitor_printf(mon, " Cannot access memory\n");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            if (cpu_memory_rw_debug(cs, addr, buf, l, 0) < 0) {
 | 
					            if (cpu_memory_rw_debug(cs, addr, buf, l, 0) < 0) {
 | 
				
			||||||
                monitor_printf(mon, " Cannot access memory\n");
 | 
					                monitor_printf(mon, " Cannot access memory\n");
 | 
				
			||||||
 | 
				
			|||||||
@ -1569,6 +1569,54 @@ sub process {
 | 
				
			|||||||
# check we are in a valid C source file if not then ignore this hunk
 | 
					# check we are in a valid C source file if not then ignore this hunk
 | 
				
			||||||
		next if ($realfile !~ /\.(h|c|cpp)$/);
 | 
							next if ($realfile !~ /\.(h|c|cpp)$/);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Block comment styles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# Block comments use /* on a line of its own
 | 
				
			||||||
 | 
							if ($rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
 | 
				
			||||||
 | 
							    $rawline =~ m@^\+.*/\*\*?[ \t]*.+[ \t]*$@) { # /* or /** non-blank
 | 
				
			||||||
 | 
								WARN("Block comments use a leading /* on a separate line\n" . $herecurr);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Block comments use * on subsequent lines
 | 
				
			||||||
 | 
							if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
 | 
				
			||||||
 | 
							    $prevrawline =~ /^\+.*?\/\*/ &&		#starting /*
 | 
				
			||||||
 | 
							    $prevrawline !~ /\*\/[ \t]*$/ &&		#no trailing */
 | 
				
			||||||
 | 
							    $rawline =~ /^\+/ &&			#line is new
 | 
				
			||||||
 | 
							    $rawline !~ /^\+[ \t]*\*/) {		#no leading *
 | 
				
			||||||
 | 
								WARN("Block comments use * on subsequent lines\n" . $hereprev);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Block comments use */ on trailing lines
 | 
				
			||||||
 | 
							if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ &&	#trailing */
 | 
				
			||||||
 | 
							    $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&	#inline /*...*/
 | 
				
			||||||
 | 
							    $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&	#trailing **/
 | 
				
			||||||
 | 
							    $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {	#non blank */
 | 
				
			||||||
 | 
								WARN("Block comments use a trailing */ on a separate line\n" . $herecurr);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Block comment * alignment
 | 
				
			||||||
 | 
							if ($prevline =~ /$;[ \t]*$/ &&			#ends in comment
 | 
				
			||||||
 | 
							    $line =~ /^\+[ \t]*$;/ &&			#leading comment
 | 
				
			||||||
 | 
							    $rawline =~ /^\+[ \t]*\*/ &&		#leading *
 | 
				
			||||||
 | 
							    (($prevrawline =~ /^\+.*?\/\*/ &&		#leading /*
 | 
				
			||||||
 | 
							      $prevrawline !~ /\*\/[ \t]*$/) ||		#no trailing */
 | 
				
			||||||
 | 
							     $prevrawline =~ /^\+[ \t]*\*/)) {		#leading *
 | 
				
			||||||
 | 
								my $oldindent;
 | 
				
			||||||
 | 
								$prevrawline =~ m@^\+([ \t]*/?)\*@;
 | 
				
			||||||
 | 
								if (defined($1)) {
 | 
				
			||||||
 | 
									$oldindent = expand_tabs($1);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									$prevrawline =~ m@^\+(.*/?)\*@;
 | 
				
			||||||
 | 
									$oldindent = expand_tabs($1);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$rawline =~ m@^\+([ \t]*)\*@;
 | 
				
			||||||
 | 
								my $newindent = $1;
 | 
				
			||||||
 | 
								$newindent = expand_tabs($newindent);
 | 
				
			||||||
 | 
								if (length($oldindent) ne length($newindent)) {
 | 
				
			||||||
 | 
									WARN("Block comments should align the * on each line\n" . $hereprev);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Check for potential 'bare' types
 | 
					# Check for potential 'bare' types
 | 
				
			||||||
		my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
 | 
							my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
 | 
				
			||||||
		    $realline_next);
 | 
							    $realline_next);
 | 
				
			||||||
 | 
				
			|||||||
@ -642,6 +642,20 @@ uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz)
 | 
				
			|||||||
    return (Aff1 << ARM_AFF1_SHIFT) | Aff0;
 | 
					    return (Aff1 << ARM_AFF1_SHIFT) | Aff0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void cpreg_hashtable_data_destroy(gpointer data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					     * Destroy function for cpu->cp_regs hashtable data entries.
 | 
				
			||||||
 | 
					     * We must free the name string because it was g_strdup()ed in
 | 
				
			||||||
 | 
					     * add_cpreg_to_hashtable(). It's OK to cast away the 'const'
 | 
				
			||||||
 | 
					     * from r->name because we know we definitely allocated it.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ARMCPRegInfo *r = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_free((void *)r->name);
 | 
				
			||||||
 | 
					    g_free(r);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void arm_cpu_initfn(Object *obj)
 | 
					static void arm_cpu_initfn(Object *obj)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    CPUState *cs = CPU(obj);
 | 
					    CPUState *cs = CPU(obj);
 | 
				
			||||||
@ -649,7 +663,7 @@ static void arm_cpu_initfn(Object *obj)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    cs->env_ptr = &cpu->env;
 | 
					    cs->env_ptr = &cpu->env;
 | 
				
			||||||
    cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal,
 | 
					    cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal,
 | 
				
			||||||
                                         g_free, g_free);
 | 
					                                         g_free, cpreg_hashtable_data_destroy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QLIST_INIT(&cpu->pre_el_change_hooks);
 | 
					    QLIST_INIT(&cpu->pre_el_change_hooks);
 | 
				
			||||||
    QLIST_INIT(&cpu->el_change_hooks);
 | 
					    QLIST_INIT(&cpu->el_change_hooks);
 | 
				
			||||||
@ -665,14 +679,6 @@ static void arm_cpu_initfn(Object *obj)
 | 
				
			|||||||
        qdev_init_gpio_in(DEVICE(cpu), arm_cpu_set_irq, 4);
 | 
					        qdev_init_gpio_in(DEVICE(cpu), arm_cpu_set_irq, 4);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cpu->gt_timer[GTIMER_PHYS] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
 | 
					 | 
				
			||||||
                                                arm_gt_ptimer_cb, cpu);
 | 
					 | 
				
			||||||
    cpu->gt_timer[GTIMER_VIRT] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
 | 
					 | 
				
			||||||
                                                arm_gt_vtimer_cb, cpu);
 | 
					 | 
				
			||||||
    cpu->gt_timer[GTIMER_HYP] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
 | 
					 | 
				
			||||||
                                                arm_gt_htimer_cb, cpu);
 | 
					 | 
				
			||||||
    cpu->gt_timer[GTIMER_SEC] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
 | 
					 | 
				
			||||||
                                                arm_gt_stimer_cb, cpu);
 | 
					 | 
				
			||||||
    qdev_init_gpio_out(DEVICE(cpu), cpu->gt_timer_outputs,
 | 
					    qdev_init_gpio_out(DEVICE(cpu), cpu->gt_timer_outputs,
 | 
				
			||||||
                       ARRAY_SIZE(cpu->gt_timer_outputs));
 | 
					                       ARRAY_SIZE(cpu->gt_timer_outputs));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -868,6 +874,15 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cpu->gt_timer[GTIMER_PHYS] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
 | 
				
			||||||
 | 
					                                           arm_gt_ptimer_cb, cpu);
 | 
				
			||||||
 | 
					    cpu->gt_timer[GTIMER_VIRT] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
 | 
				
			||||||
 | 
					                                           arm_gt_vtimer_cb, cpu);
 | 
				
			||||||
 | 
					    cpu->gt_timer[GTIMER_HYP] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
 | 
				
			||||||
 | 
					                                          arm_gt_htimer_cb, cpu);
 | 
				
			||||||
 | 
					    cpu->gt_timer[GTIMER_SEC] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
 | 
				
			||||||
 | 
					                                          arm_gt_stimer_cb, cpu);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cpu_exec_realizefn(cs, &local_err);
 | 
					    cpu_exec_realizefn(cs, &local_err);
 | 
				
			||||||
 | 
				
			|||||||
@ -991,10 +991,25 @@ static void test_timer_zero_load_nonscaled_periodic_to_prescaled_oneshot(void)
 | 
				
			|||||||
    g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
 | 
					    g_assert_cmpuint(timer_get_and_clr_int_sts(), ==, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Add a qtest test that comes in two versions: one with
 | 
				
			||||||
 | 
					 * a timer scaler setting, and one with the timer nonscaled.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void add_scaler_test(const char *str, bool scale,
 | 
				
			||||||
 | 
					                            void (*fn)(const void *))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    char *name;
 | 
				
			||||||
 | 
					    int *scaler = scale ? &scaled : &nonscaled;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    name = g_strdup_printf("%s=%d", str, *scaler);
 | 
				
			||||||
 | 
					    qtest_add_data_func(name, scaler, fn);
 | 
				
			||||||
 | 
					    g_free(name);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char **argv)
 | 
					int main(int argc, char **argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int *scaler = &nonscaled;
 | 
					 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
 | 
					    int scale;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_test_init(&argc, &argv, NULL);
 | 
					    g_test_init(&argc, &argv, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1012,89 +1027,59 @@ int main(int argc, char **argv)
 | 
				
			|||||||
    qtest_add_func("mptimer/prescaler", test_timer_prescaler);
 | 
					    qtest_add_func("mptimer/prescaler", test_timer_prescaler);
 | 
				
			||||||
    qtest_add_func("mptimer/prescaler_on_the_fly", test_timer_prescaler_on_the_fly);
 | 
					    qtest_add_func("mptimer/prescaler_on_the_fly", test_timer_prescaler_on_the_fly);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tests_with_prescaler_arg:
 | 
					    for (scale = 0; scale < 2; scale++) {
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/oneshot scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/oneshot scaler=%d", *scaler),
 | 
					                        scale, test_timer_oneshot);
 | 
				
			||||||
                        scaler, test_timer_oneshot);
 | 
					        add_scaler_test("mptimer/pause scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_pause);
 | 
				
			||||||
        g_strdup_printf("mptimer/pause scaler=%d", *scaler),
 | 
					        add_scaler_test("mptimer/reload scaler",
 | 
				
			||||||
                        scaler, test_timer_pause);
 | 
					                        scale, test_timer_reload);
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/periodic scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/reload scaler=%d", *scaler),
 | 
					                        scale, test_timer_periodic);
 | 
				
			||||||
                        scaler, test_timer_reload);
 | 
					        add_scaler_test("mptimer/oneshot_to_periodic scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_oneshot_to_periodic);
 | 
				
			||||||
        g_strdup_printf("mptimer/periodic scaler=%d", *scaler),
 | 
					        add_scaler_test("mptimer/periodic_to_oneshot scaler",
 | 
				
			||||||
                        scaler, test_timer_periodic);
 | 
					                        scale, test_timer_periodic_to_oneshot);
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/set_oneshot_counter_to_0 scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/oneshot_to_periodic scaler=%d", *scaler),
 | 
					                        scale, test_timer_set_oneshot_counter_to_0);
 | 
				
			||||||
                        scaler, test_timer_oneshot_to_periodic);
 | 
					        add_scaler_test("mptimer/set_periodic_counter_to_0 scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_set_periodic_counter_to_0);
 | 
				
			||||||
        g_strdup_printf("mptimer/periodic_to_oneshot scaler=%d", *scaler),
 | 
					        add_scaler_test("mptimer/noload_oneshot scaler",
 | 
				
			||||||
                        scaler, test_timer_periodic_to_oneshot);
 | 
					                        scale, test_timer_noload_oneshot);
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/noload_periodic scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/set_oneshot_counter_to_0 scaler=%d", *scaler),
 | 
					                        scale, test_timer_noload_periodic);
 | 
				
			||||||
                        scaler, test_timer_set_oneshot_counter_to_0);
 | 
					        add_scaler_test("mptimer/zero_load_oneshot scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_zero_load_oneshot);
 | 
				
			||||||
        g_strdup_printf("mptimer/set_periodic_counter_to_0 scaler=%d", *scaler),
 | 
					        add_scaler_test("mptimer/zero_load_periodic scaler",
 | 
				
			||||||
                        scaler, test_timer_set_periodic_counter_to_0);
 | 
					                        scale, test_timer_zero_load_periodic);
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/zero_load_oneshot_to_nonzero scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/noload_oneshot scaler=%d", *scaler),
 | 
					                        scale, test_timer_zero_load_oneshot_to_nonzero);
 | 
				
			||||||
                        scaler, test_timer_noload_oneshot);
 | 
					        add_scaler_test("mptimer/zero_load_periodic_to_nonzero scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_zero_load_periodic_to_nonzero);
 | 
				
			||||||
        g_strdup_printf("mptimer/noload_periodic scaler=%d", *scaler),
 | 
					        add_scaler_test("mptimer/nonzero_load_oneshot_to_zero scaler",
 | 
				
			||||||
                        scaler, test_timer_noload_periodic);
 | 
					                        scale, test_timer_nonzero_load_oneshot_to_zero);
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/nonzero_load_periodic_to_zero scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/zero_load_oneshot scaler=%d", *scaler),
 | 
					                        scale, test_timer_nonzero_load_periodic_to_zero);
 | 
				
			||||||
                        scaler, test_timer_zero_load_oneshot);
 | 
					        add_scaler_test("mptimer/set_periodic_counter_on_the_fly scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_set_periodic_counter_on_the_fly);
 | 
				
			||||||
        g_strdup_printf("mptimer/zero_load_periodic scaler=%d", *scaler),
 | 
					        add_scaler_test("mptimer/enable_and_set_counter scaler",
 | 
				
			||||||
                        scaler, test_timer_zero_load_periodic);
 | 
					                        scale, test_timer_enable_and_set_counter);
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/set_counter_and_enable scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/zero_load_oneshot_to_nonzero scaler=%d", *scaler),
 | 
					                        scale, test_timer_set_counter_and_enable);
 | 
				
			||||||
                        scaler, test_timer_zero_load_oneshot_to_nonzero);
 | 
					        add_scaler_test("mptimer/oneshot_with_counter_0_on_start scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_oneshot_with_counter_0_on_start);
 | 
				
			||||||
        g_strdup_printf("mptimer/zero_load_periodic_to_nonzero scaler=%d", *scaler),
 | 
					        add_scaler_test("mptimer/periodic_with_counter_0_on_start scaler",
 | 
				
			||||||
                        scaler, test_timer_zero_load_periodic_to_nonzero);
 | 
					                        scale, test_timer_periodic_with_counter_0_on_start);
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/periodic_counter scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/nonzero_load_oneshot_to_zero scaler=%d", *scaler),
 | 
					                        scale, test_periodic_counter);
 | 
				
			||||||
                        scaler, test_timer_nonzero_load_oneshot_to_zero);
 | 
					        add_scaler_test("mptimer/set_counter_periodic_with_zero_load scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_set_counter_periodic_with_zero_load);
 | 
				
			||||||
        g_strdup_printf("mptimer/nonzero_load_periodic_to_zero scaler=%d", *scaler),
 | 
					        add_scaler_test("mptimer/set_oneshot_load_to_0 scaler",
 | 
				
			||||||
                        scaler, test_timer_nonzero_load_periodic_to_zero);
 | 
					                        scale, test_timer_set_oneshot_load_to_0);
 | 
				
			||||||
    qtest_add_data_func(
 | 
					        add_scaler_test("mptimer/set_periodic_load_to_0 scaler",
 | 
				
			||||||
        g_strdup_printf("mptimer/set_periodic_counter_on_the_fly scaler=%d", *scaler),
 | 
					                        scale, test_timer_set_periodic_load_to_0);
 | 
				
			||||||
                        scaler, test_timer_set_periodic_counter_on_the_fly);
 | 
					        add_scaler_test("mptimer/zero_load_mode_switch scaler",
 | 
				
			||||||
    qtest_add_data_func(
 | 
					                        scale, test_timer_zero_load_mode_switch);
 | 
				
			||||||
        g_strdup_printf("mptimer/enable_and_set_counter scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_timer_enable_and_set_counter);
 | 
					 | 
				
			||||||
    qtest_add_data_func(
 | 
					 | 
				
			||||||
        g_strdup_printf("mptimer/set_counter_and_enable scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_timer_set_counter_and_enable);
 | 
					 | 
				
			||||||
    qtest_add_data_func(
 | 
					 | 
				
			||||||
        g_strdup_printf("mptimer/oneshot_with_counter_0_on_start scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_timer_oneshot_with_counter_0_on_start);
 | 
					 | 
				
			||||||
    qtest_add_data_func(
 | 
					 | 
				
			||||||
        g_strdup_printf("mptimer/periodic_with_counter_0_on_start scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_timer_periodic_with_counter_0_on_start);
 | 
					 | 
				
			||||||
    qtest_add_data_func(
 | 
					 | 
				
			||||||
        g_strdup_printf("mptimer/periodic_counter scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_periodic_counter);
 | 
					 | 
				
			||||||
    qtest_add_data_func(
 | 
					 | 
				
			||||||
        g_strdup_printf("mptimer/set_counter_periodic_with_zero_load scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_timer_set_counter_periodic_with_zero_load);
 | 
					 | 
				
			||||||
    qtest_add_data_func(
 | 
					 | 
				
			||||||
        g_strdup_printf("mptimer/set_oneshot_load_to_0 scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_timer_set_oneshot_load_to_0);
 | 
					 | 
				
			||||||
    qtest_add_data_func(
 | 
					 | 
				
			||||||
        g_strdup_printf("mptimer/set_periodic_load_to_0 scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_timer_set_periodic_load_to_0);
 | 
					 | 
				
			||||||
    qtest_add_data_func(
 | 
					 | 
				
			||||||
        g_strdup_printf("mptimer/zero_load_mode_switch scaler=%d", *scaler),
 | 
					 | 
				
			||||||
                        scaler, test_timer_zero_load_mode_switch);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (scaler == &nonscaled) {
 | 
					 | 
				
			||||||
        scaler = &scaled;
 | 
					 | 
				
			||||||
        goto tests_with_prescaler_arg;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    qtest_start("-machine vexpress-a9");
 | 
					    qtest_start("-machine vexpress-a9");
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user