diff options
Diffstat (limited to 'hw/versatilepb.c')
-rw-r--r-- | hw/versatilepb.c | 124 |
1 files changed, 37 insertions, 87 deletions
diff --git a/hw/versatilepb.c b/hw/versatilepb.c index 6d2e2dcfea..e198a518ea 100644 --- a/hw/versatilepb.c +++ b/hw/versatilepb.c @@ -1,5 +1,5 @@ /* - * ARM Versatile Platform Baseboard System emulation. + * ARM Versatile Platform/Application Baseboard System emulation. * * Copyright (c) 2005-2006 CodeSourcery. * Written by Paul Brook @@ -10,10 +10,6 @@ #include "vl.h" #include "arm_pic.h" -#define KERNEL_ARGS_ADDR 0x100 -#define KERNEL_LOAD_ADDR 0x00010000 -#define INITRD_LOAD_ADDR 0x00800000 - /* Primary interrupt controller. */ typedef struct vpb_sic_state @@ -151,66 +147,16 @@ static vpb_sic_state *vpb_sic_init(uint32_t base, void *parent, int irq) /* Board init. */ -/* The worlds second smallest bootloader. Set r0-r2, then jump to kernel. */ -static uint32_t bootloader[] = { - 0xe3a00000, /* mov r0, #0 */ - 0xe3a01083, /* mov r1, #0x83 */ - 0xe3811c01, /* orr r1, r1, #0x100 */ - 0xe59f2000, /* ldr r2, [pc, #0] */ - 0xe59ff000, /* ldr pc, [pc, #0] */ - 0, /* Address of kernel args. Set by integratorcp_init. */ - 0 /* Kernel entry point. Set by integratorcp_init. */ -}; - -static void set_kernel_args(uint32_t ram_size, int initrd_size, - const char *kernel_cmdline) -{ - uint32_t *p; - - p = (uint32_t *)(phys_ram_base + KERNEL_ARGS_ADDR); - /* ATAG_CORE */ - stl_raw(p++, 5); - stl_raw(p++, 0x54410001); - stl_raw(p++, 1); - stl_raw(p++, 0x1000); - stl_raw(p++, 0); - /* ATAG_MEM */ - stl_raw(p++, 4); - stl_raw(p++, 0x54410002); - stl_raw(p++, ram_size); - stl_raw(p++, 0); - if (initrd_size) { - /* ATAG_INITRD2 */ - stl_raw(p++, 4); - stl_raw(p++, 0x54420005); - stl_raw(p++, INITRD_LOAD_ADDR); - stl_raw(p++, initrd_size); - } - if (kernel_cmdline && *kernel_cmdline) { - /* ATAG_CMDLINE */ - int cmdline_size; +/* The AB and PB boards both use the same core, just with different + peripherans and expansion busses. For now we emulate a subset of the + PB peripherals and just change the board ID. */ - cmdline_size = strlen(kernel_cmdline); - memcpy (p + 2, kernel_cmdline, cmdline_size + 1); - cmdline_size = (cmdline_size >> 2) + 1; - stl_raw(p++, cmdline_size + 2); - stl_raw(p++, 0x54410009); - p += cmdline_size; - } - /* ATAG_END */ - stl_raw(p++, 0); - stl_raw(p++, 0); -} - -static void vpb_init(int ram_size, int vga_ram_size, int boot_device, +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) + const char *initrd_filename, int board_id) { CPUState *env; - int kernel_size; - int initrd_size; - int n; void *pic; void *sic; @@ -250,6 +196,7 @@ static void vpb_init(int ram_size, int vga_ram_size, int boot_device, that includes hardware cursor support from the PL111. */ pl110_init(ds, 0x10120000, pic, 16, 1); + /* Memory map for Versatile/PB: */ /* 0x10000000 System registers. */ /* 0x10001000 PCI controller config registers. */ /* 0x10002000 Serial bus interface. */ @@ -285,33 +232,30 @@ static void vpb_init(int ram_size, int vga_ram_size, int boot_device, /* 0x101f3000 UART2. */ /* 0x101f4000 SSPI. */ - /* Load the kernel. */ - if (!kernel_filename) { - fprintf(stderr, "Kernel image must be specified\n"); - exit(1); - } - kernel_size = load_image(kernel_filename, - phys_ram_base + KERNEL_LOAD_ADDR); - if (kernel_size < 0) { - fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); - exit(1); - } - if (initrd_filename) { - initrd_size = load_image(initrd_filename, - phys_ram_base + INITRD_LOAD_ADDR); - if (initrd_size < 0) { - fprintf(stderr, "qemu: could not load initrd '%s'\n", - initrd_filename); - exit(1); - } - } else { - initrd_size = 0; - } - bootloader[5] = KERNEL_ARGS_ADDR; - bootloader[6] = KERNEL_LOAD_ADDR; - for (n = 0; n < sizeof(bootloader) / 4; n++) - stl_raw(phys_ram_base + (n * 4), bootloader[n]); - set_kernel_args(ram_size, initrd_size, kernel_cmdline); + arm_load_kernel(ram_size, kernel_filename, kernel_cmdline, + initrd_filename, board_id); +} + +static void vpb_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) +{ + versatile_init(ram_size, vga_ram_size, boot_device, + ds, fd_filename, snapshot, + kernel_filename, kernel_cmdline, + initrd_filename, 0x183); +} + +static void vab_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) +{ + versatile_init(ram_size, vga_ram_size, boot_device, + ds, fd_filename, snapshot, + kernel_filename, kernel_cmdline, + initrd_filename, 0x25e); } QEMUMachine versatilepb_machine = { @@ -319,3 +263,9 @@ QEMUMachine versatilepb_machine = { "ARM Versatile/PB (ARM926EJ-S)", vpb_init, }; + +QEMUMachine versatileab_machine = { + "versatileab", + "ARM Versatile/AB (ARM926EJ-S)", + vab_init, +}; |