armv7m: convert to memory API

Reviewed-by: Richard Henderson  <rth@twiddle.net>
Signed-off-by: Avi Kivity <avi@redhat.com>
master
Avi Kivity 2011-07-25 14:27:01 +03:00
parent 72e4d2554d
commit 7d6f78cfac
3 changed files with 20 additions and 12 deletions

View File

@ -11,13 +11,16 @@
#ifndef ARM_MISC_H #ifndef ARM_MISC_H
#define ARM_MISC_H 1 #define ARM_MISC_H 1
#include "memory.h"
/* The CPU is also modeled as an interrupt controller. */ /* The CPU is also modeled as an interrupt controller. */
#define ARM_PIC_CPU_IRQ 0 #define ARM_PIC_CPU_IRQ 0
#define ARM_PIC_CPU_FIQ 1 #define ARM_PIC_CPU_FIQ 1
qemu_irq *arm_pic_init_cpu(CPUState *env); qemu_irq *arm_pic_init_cpu(CPUState *env);
/* armv7m.c */ /* 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); const char *kernel_filename, const char *cpu_model);
/* arm_boot.c */ /* arm_boot.c */

View File

@ -156,7 +156,8 @@ static void armv7m_reset(void *opaque)
flash_size and sram_size are in kb. flash_size and sram_size are in kb.
Returns the NVIC array. */ 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) const char *kernel_filename, const char *cpu_model)
{ {
CPUState *env; CPUState *env;
@ -169,6 +170,9 @@ qemu_irq *armv7m_init(int flash_size, int sram_size,
uint64_t lowaddr; uint64_t lowaddr;
int i; int i;
int big_endian; int big_endian;
MemoryRegion *sram = g_new(MemoryRegion, 1);
MemoryRegion *flash = g_new(MemoryRegion, 1);
MemoryRegion *hack = g_new(MemoryRegion, 1);
flash_size *= 1024; flash_size *= 1024;
sram_size *= 1024; sram_size *= 1024;
@ -194,12 +198,11 @@ qemu_irq *armv7m_init(int flash_size, int sram_size,
#endif #endif
/* Flash programming is done via the SCU, so pretend it is ROM. */ /* Flash programming is done via the SCU, so pretend it is ROM. */
cpu_register_physical_memory(0, flash_size, memory_region_init_ram(flash, NULL, "armv7m.flash", flash_size);
qemu_ram_alloc(NULL, "armv7m.flash", memory_region_set_readonly(flash, true);
flash_size) | IO_MEM_ROM); memory_region_add_subregion(address_space_mem, 0, flash);
cpu_register_physical_memory(0x20000000, sram_size, memory_region_init_ram(sram, NULL, "armv7m.sram", sram_size);
qemu_ram_alloc(NULL, "armv7m.sram", memory_region_add_subregion(address_space_mem, 0x20000000, sram);
sram_size) | IO_MEM_RAM);
armv7m_bitband_init(); armv7m_bitband_init();
nvic = qdev_create(NULL, "armv7m_nvic"); 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 /* Hack to map an additional page of ram at the top of the address
space. This stops qemu complaining about executing code outside RAM space. This stops qemu complaining about executing code outside RAM
when returning from an exception. */ when returning from an exception. */
cpu_register_physical_memory(0xfffff000, 0x1000, memory_region_init_ram(hack, NULL, "armv7m.hack", 0x1000);
qemu_ram_alloc(NULL, "armv7m.hack", memory_region_add_subregion(address_space_mem, 0xfffff000, hack);
0x1000) | IO_MEM_RAM);
qemu_register_reset(armv7m_reset, env); qemu_register_reset(armv7m_reset, env);
return pic; return pic;

View File

@ -15,6 +15,7 @@
#include "i2c.h" #include "i2c.h"
#include "net.h" #include "net.h"
#include "boards.h" #include "boards.h"
#include "exec-memory.h"
#define GPIO_A 0 #define GPIO_A 0
#define GPIO_B 1 #define GPIO_B 1
@ -1260,6 +1261,7 @@ static void stellaris_init(const char *kernel_filename, const char *cpu_model,
0x40024000, 0x40025000, 0x40026000}; 0x40024000, 0x40025000, 0x40026000};
static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31}; static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31};
MemoryRegion *address_space_mem = get_system_memory();
qemu_irq *pic; qemu_irq *pic;
DeviceState *gpio_dev[7]; DeviceState *gpio_dev[7];
qemu_irq gpio_in[7][8]; 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; flash_size = ((board->dc0 & 0xffff) + 1) << 1;
sram_size = (board->dc0 >> 18) + 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)) { if (board->dc1 & (1 << 16)) {
dev = sysbus_create_varargs("stellaris-adc", 0x40038000, dev = sysbus_create_varargs("stellaris-adc", 0x40038000,