armv7m: convert to memory API
Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
		
							parent
							
								
									72e4d2554d
								
							
						
					
					
						commit
						7d6f78cfac
					
				| 
						 | 
				
			
			@ -11,13 +11,16 @@
 | 
			
		|||
#ifndef ARM_MISC_H
 | 
			
		||||
#define ARM_MISC_H 1
 | 
			
		||||
 | 
			
		||||
#include "memory.h"
 | 
			
		||||
 | 
			
		||||
/* The CPU is also modeled as an interrupt controller.  */
 | 
			
		||||
#define ARM_PIC_CPU_IRQ 0
 | 
			
		||||
#define ARM_PIC_CPU_FIQ 1
 | 
			
		||||
qemu_irq *arm_pic_init_cpu(CPUState *env);
 | 
			
		||||
 | 
			
		||||
/* armv7m.c */
 | 
			
		||||
qemu_irq *armv7m_init(int flash_size, int sram_size,
 | 
			
		||||
qemu_irq *armv7m_init(MemoryRegion *address_space_mem,
 | 
			
		||||
                      int flash_size, int sram_size,
 | 
			
		||||
                      const char *kernel_filename, const char *cpu_model);
 | 
			
		||||
 | 
			
		||||
/* arm_boot.c */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										22
									
								
								hw/armv7m.c
								
								
								
								
							
							
						
						
									
										22
									
								
								hw/armv7m.c
								
								
								
								
							| 
						 | 
				
			
			@ -156,7 +156,8 @@ static void armv7m_reset(void *opaque)
 | 
			
		|||
   flash_size and sram_size are in kb.
 | 
			
		||||
   Returns the NVIC array.  */
 | 
			
		||||
 | 
			
		||||
qemu_irq *armv7m_init(int flash_size, int sram_size,
 | 
			
		||||
qemu_irq *armv7m_init(MemoryRegion *address_space_mem,
 | 
			
		||||
                      int flash_size, int sram_size,
 | 
			
		||||
                      const char *kernel_filename, const char *cpu_model)
 | 
			
		||||
{
 | 
			
		||||
    CPUState *env;
 | 
			
		||||
| 
						 | 
				
			
			@ -169,6 +170,9 @@ qemu_irq *armv7m_init(int flash_size, int sram_size,
 | 
			
		|||
    uint64_t lowaddr;
 | 
			
		||||
    int i;
 | 
			
		||||
    int big_endian;
 | 
			
		||||
    MemoryRegion *sram = g_new(MemoryRegion, 1);
 | 
			
		||||
    MemoryRegion *flash = g_new(MemoryRegion, 1);
 | 
			
		||||
    MemoryRegion *hack = g_new(MemoryRegion, 1);
 | 
			
		||||
 | 
			
		||||
    flash_size *= 1024;
 | 
			
		||||
    sram_size *= 1024;
 | 
			
		||||
| 
						 | 
				
			
			@ -194,12 +198,11 @@ qemu_irq *armv7m_init(int flash_size, int sram_size,
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
    /* Flash programming is done via the SCU, so pretend it is ROM.  */
 | 
			
		||||
    cpu_register_physical_memory(0, flash_size,
 | 
			
		||||
                                 qemu_ram_alloc(NULL, "armv7m.flash",
 | 
			
		||||
                                                flash_size) | IO_MEM_ROM);
 | 
			
		||||
    cpu_register_physical_memory(0x20000000, sram_size,
 | 
			
		||||
                                 qemu_ram_alloc(NULL, "armv7m.sram",
 | 
			
		||||
                                                sram_size) | IO_MEM_RAM);
 | 
			
		||||
    memory_region_init_ram(flash, NULL, "armv7m.flash", flash_size);
 | 
			
		||||
    memory_region_set_readonly(flash, true);
 | 
			
		||||
    memory_region_add_subregion(address_space_mem, 0, flash);
 | 
			
		||||
    memory_region_init_ram(sram, NULL, "armv7m.sram", sram_size);
 | 
			
		||||
    memory_region_add_subregion(address_space_mem, 0x20000000, sram);
 | 
			
		||||
    armv7m_bitband_init();
 | 
			
		||||
 | 
			
		||||
    nvic = qdev_create(NULL, "armv7m_nvic");
 | 
			
		||||
| 
						 | 
				
			
			@ -232,9 +235,8 @@ qemu_irq *armv7m_init(int flash_size, int sram_size,
 | 
			
		|||
    /* Hack to map an additional page of ram at the top of the address
 | 
			
		||||
       space.  This stops qemu complaining about executing code outside RAM
 | 
			
		||||
       when returning from an exception.  */
 | 
			
		||||
    cpu_register_physical_memory(0xfffff000, 0x1000,
 | 
			
		||||
                                 qemu_ram_alloc(NULL, "armv7m.hack", 
 | 
			
		||||
                                                0x1000) | IO_MEM_RAM);
 | 
			
		||||
    memory_region_init_ram(hack, NULL, "armv7m.hack", 0x1000);
 | 
			
		||||
    memory_region_add_subregion(address_space_mem, 0xfffff000, hack);
 | 
			
		||||
 | 
			
		||||
    qemu_register_reset(armv7m_reset, env);
 | 
			
		||||
    return pic;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,7 @@
 | 
			
		|||
#include "i2c.h"
 | 
			
		||||
#include "net.h"
 | 
			
		||||
#include "boards.h"
 | 
			
		||||
#include "exec-memory.h"
 | 
			
		||||
 | 
			
		||||
#define GPIO_A 0
 | 
			
		||||
#define GPIO_B 1
 | 
			
		||||
| 
						 | 
				
			
			@ -1260,6 +1261,7 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
 | 
			
		|||
        0x40024000, 0x40025000, 0x40026000};
 | 
			
		||||
    static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31};
 | 
			
		||||
 | 
			
		||||
    MemoryRegion *address_space_mem = get_system_memory();
 | 
			
		||||
    qemu_irq *pic;
 | 
			
		||||
    DeviceState *gpio_dev[7];
 | 
			
		||||
    qemu_irq gpio_in[7][8];
 | 
			
		||||
| 
						 | 
				
			
			@ -1274,7 +1276,8 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
 | 
			
		|||
 | 
			
		||||
    flash_size = ((board->dc0 & 0xffff) + 1) << 1;
 | 
			
		||||
    sram_size = (board->dc0 >> 18) + 1;
 | 
			
		||||
    pic = armv7m_init(flash_size, sram_size, kernel_filename, cpu_model);
 | 
			
		||||
    pic = armv7m_init(address_space_mem,
 | 
			
		||||
                      flash_size, sram_size, kernel_filename, cpu_model);
 | 
			
		||||
 | 
			
		||||
    if (board->dc1 & (1 << 16)) {
 | 
			
		||||
        dev = sysbus_create_varargs("stellaris-adc", 0x40038000,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue