From 3371d27293dc40159069d6593da22ba77ac8513c Mon Sep 17 00:00:00 2001 From: pbrook Date: Thu, 8 Mar 2007 03:04:12 +0000 Subject: [PATCH] Implement --cpu for ARM. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2474 c046a42c-6fe2-441c-8c8c-71466251a162 --- hw/integratorcp.c | 38 +++++++------------------------------- hw/realview.c | 5 +++-- hw/versatilepb.c | 11 +++++++---- linux-user/main.c | 2 +- target-arm/cpu.h | 2 +- target-arm/helper.c | 29 ++++++++++++++++++++++++++++- vl.c | 3 +-- vl.h | 3 +-- 8 files changed, 49 insertions(+), 44 deletions(-) diff --git a/hw/integratorcp.c b/hw/integratorcp.c index fd1675b40b..5e4c636f04 100644 --- a/hw/integratorcp.c +++ b/hw/integratorcp.c @@ -471,7 +471,7 @@ static void icp_control_init(uint32_t base) static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename, uint32_t cpuid) + const char *initrd_filename, const char *cpu_model) { CPUState *env; uint32_t bios_offset; @@ -479,7 +479,9 @@ static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device, void *cpu_pic; env = cpu_init(); - cpu_arm_set_model(env, cpuid); + if (!cpu_model) + cpu_model = "arm926"; + cpu_arm_set_model(env, cpu_model); bios_offset = ram_size + vga_ram_size; /* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash. */ /* ??? RAM shoud repeat to fill physical memory space. */ @@ -513,34 +515,8 @@ static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device, initrd_filename, 0x113); } -static void integratorcp926_init(int ram_size, int vga_ram_size, - int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, - const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename, const char *cpu_model) -{ - integratorcp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, - snapshot, kernel_filename, kernel_cmdline, - initrd_filename, ARM_CPUID_ARM926); -} - -static void integratorcp1026_init(int ram_size, int vga_ram_size, - int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, - const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename, const char *cpu_model) -{ - integratorcp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, - snapshot, kernel_filename, kernel_cmdline, - initrd_filename, ARM_CPUID_ARM1026); -} - -QEMUMachine integratorcp926_machine = { - "integratorcp926", +QEMUMachine integratorcp_machine = { + "integratorcp", "ARM Integrator/CP (ARM926EJ-S)", - integratorcp926_init, -}; - -QEMUMachine integratorcp1026_machine = { - "integratorcp1026", - "ARM Integrator/CP (ARM1026EJ-S)", - integratorcp1026_init, + integratorcp_init, }; diff --git a/hw/realview.c b/hw/realview.c index 325b3d1ab3..619739c11c 100644 --- a/hw/realview.c +++ b/hw/realview.c @@ -26,8 +26,9 @@ static void realview_init(int ram_size, int vga_ram_size, int boot_device, int done_smc = 0; env = cpu_init(); - cpu_arm_set_model(env, ARM_CPUID_ARM926); - //cpu_arm_set_model(env, ARM_CPUID_ARM11MPCORE); + if (!cpu_model) + cpu_model = "arm926"; + cpu_arm_set_model(env, cpu_model); /* ??? RAM shoud repeat to fill physical memory space. */ /* SDRAM at address zero. */ cpu_register_physical_memory(0, ram_size, IO_MEM_RAM); diff --git a/hw/versatilepb.c b/hw/versatilepb.c index 1bcc160b33..050878d50a 100644 --- a/hw/versatilepb.c +++ b/hw/versatilepb.c @@ -154,7 +154,8 @@ static vpb_sic_state *vpb_sic_init(uint32_t base, void *parent, int irq) static void versatile_init(int ram_size, int vga_ram_size, int boot_device, DisplayState *ds, const char **fd_filename, int snapshot, const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename, int board_id) + const char *initrd_filename, const char *cpu_model, + int board_id) { CPUState *env; void *pic; @@ -166,7 +167,9 @@ static void versatile_init(int ram_size, int vga_ram_size, int boot_device, int done_smc = 0; env = cpu_init(); - cpu_arm_set_model(env, ARM_CPUID_ARM926); + if (!cpu_model) + cpu_model = "arm926"; + cpu_arm_set_model(env, cpu_model); /* ??? RAM shoud repeat to fill physical memory space. */ /* SDRAM at address zero. */ cpu_register_physical_memory(0, ram_size, IO_MEM_RAM); @@ -262,7 +265,7 @@ static void vpb_init(int ram_size, int vga_ram_size, int boot_device, versatile_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, kernel_filename, kernel_cmdline, - initrd_filename, 0x183); + initrd_filename, cpu_model, 0x183); } static void vab_init(int ram_size, int vga_ram_size, int boot_device, @@ -273,7 +276,7 @@ static void vab_init(int ram_size, int vga_ram_size, int boot_device, versatile_init(ram_size, vga_ram_size, boot_device, ds, fd_filename, snapshot, kernel_filename, kernel_cmdline, - initrd_filename, 0x25e); + initrd_filename, cpu_model, 0x25e); } QEMUMachine versatilepb_machine = { diff --git a/linux-user/main.c b/linux-user/main.c index 702c3b955c..f96f96f6ad 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -1756,7 +1756,7 @@ int main(int argc, char **argv) #elif defined(TARGET_ARM) { int i; - cpu_arm_set_model(env, ARM_CPUID_ARM1026); + cpu_arm_set_model(env, "arm926"); cpsr_write(env, regs->uregs[16], 0xffffffff); for(i = 0; i < 16; i++) { env->regs[i] = regs->uregs[i]; diff --git a/target-arm/cpu.h b/target-arm/cpu.h index 3208c138b5..b3b37ebbe5 100644 --- a/target-arm/cpu.h +++ b/target-arm/cpu.h @@ -209,7 +209,7 @@ static inline int arm_feature(CPUARMState *env, int feature) return (env->features & (1u << feature)) != 0; } -void cpu_arm_set_model(CPUARMState *env, uint32_t id); +void cpu_arm_set_model(CPUARMState *env, const char *name); #define ARM_CPUID_ARM1026 0x4106a262 #define ARM_CPUID_ARM926 0x41069265 diff --git a/target-arm/helper.c b/target-arm/helper.c index 5b4cd13933..093acc9af4 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -36,8 +36,35 @@ static inline void set_feature(CPUARMState *env, int feature) env->features |= 1u << feature; } -void cpu_arm_set_model(CPUARMState *env, uint32_t id) +struct arm_cpu_t { + uint32_t id; + const char *name; +}; + +static const struct arm_cpu_t arm_cpu_names[] = { + { ARM_CPUID_ARM926, "arm926"}, + { ARM_CPUID_ARM1026, "arm1026"}, + { 0, NULL} +}; + +void cpu_arm_set_model(CPUARMState *env, const char *name) { + int i; + uint32_t id; + + id = 0; + i = 0; + for (i = 0; arm_cpu_names[i].name; i++) { + if (strcmp(name, arm_cpu_names[i].name) == 0) { + id = arm_cpu_names[i].id; + break; + } + } + if (!id) { + cpu_abort(env, "Unknown CPU '%s'", name); + return; + } + env->cp15.c0_cpuid = id; switch (id) { case ARM_CPUID_ARM926: diff --git a/vl.c b/vl.c index 99d4766b91..09d7baf88e 100644 --- a/vl.c +++ b/vl.c @@ -6710,8 +6710,7 @@ void register_machines(void) qemu_register_machine(&sun4m_machine); #endif #elif defined(TARGET_ARM) - qemu_register_machine(&integratorcp926_machine); - qemu_register_machine(&integratorcp1026_machine); + qemu_register_machine(&integratorcp_machine); qemu_register_machine(&versatilepb_machine); qemu_register_machine(&versatileab_machine); qemu_register_machine(&realview_machine); diff --git a/vl.h b/vl.h index 26b2741757..c7c7d73a0d 100644 --- a/vl.h +++ b/vl.h @@ -1304,8 +1304,7 @@ void lsi_scsi_attach(void *opaque, BlockDriverState *bd, int id); void *lsi_scsi_init(PCIBus *bus, int devfn); /* integratorcp.c */ -extern QEMUMachine integratorcp926_machine; -extern QEMUMachine integratorcp1026_machine; +extern QEMUMachine integratorcp_machine; /* versatilepb.c */ extern QEMUMachine versatilepb_machine; -- 2.11.0