blob: 924be81d5768de93b0264edd3a695eab35db4495 [file] [log] [blame]
ths5fafdf22007-09-16 21:08:06 +00001/*
pbrook06338792007-05-23 19:58:11 +00002 * Arnewsh 5206 ColdFire system emulation.
3 *
4 * Copyright (c) 2007 CodeSourcery.
5 *
Matthew Fernandez8e31bf32011-06-26 12:21:35 +10006 * This code is licensed under the GPL
pbrook06338792007-05-23 19:58:11 +00007 */
8
pbrook87ecb682007-11-17 17:14:51 +00009#include "hw.h"
10#include "mcf.h"
pbrook87ecb682007-11-17 17:14:51 +000011#include "boards.h"
Blue Swirlca20cf32009-09-20 14:58:02 +000012#include "loader.h"
13#include "elf.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010014#include "exec/address-spaces.h"
pbrook06338792007-05-23 19:58:11 +000015
16#define KERNEL_LOAD_ADDR 0x10000
17#define AN5206_MBAR_ADDR 0x10000000
18#define AN5206_RAMBAR_ADDR 0x20000000
19
pbrook06338792007-05-23 19:58:11 +000020/* Board init. */
21
Eduardo Habkost5f072e12012-10-15 17:22:02 -030022static void an5206_init(QEMUMachineInitArgs *args)
pbrook06338792007-05-23 19:58:11 +000023{
Eduardo Habkost5f072e12012-10-15 17:22:02 -030024 ram_addr_t ram_size = args->ram_size;
25 const char *cpu_model = args->cpu_model;
26 const char *kernel_filename = args->kernel_filename;
Andreas Färber4025cfd2013-01-18 14:10:34 +010027 M68kCPU *cpu;
Andreas Färber7927df32012-03-14 01:38:23 +010028 CPUM68KState *env;
pbrook06338792007-05-23 19:58:11 +000029 int kernel_size;
30 uint64_t elf_entry;
Avi Kivitya8170e52012-10-23 12:30:10 +020031 hwaddr entry;
Avi Kivity72e4d252011-07-25 14:14:31 +030032 MemoryRegion *address_space_mem = get_system_memory();
33 MemoryRegion *ram = g_new(MemoryRegion, 1);
34 MemoryRegion *sram = g_new(MemoryRegion, 1);
pbrook06338792007-05-23 19:58:11 +000035
Andreas Färber4025cfd2013-01-18 14:10:34 +010036 if (!cpu_model) {
pbrook06338792007-05-23 19:58:11 +000037 cpu_model = "m5206";
Andreas Färber4025cfd2013-01-18 14:10:34 +010038 }
39 cpu = cpu_m68k_init(cpu_model);
40 if (!cpu) {
Paul Brook2ac71172009-05-08 02:35:15 +010041 hw_error("Unable to find m68k CPU definition\n");
pbrook20dcee92007-06-03 11:13:39 +000042 }
Andreas Färber4025cfd2013-01-18 14:10:34 +010043 env = &cpu->env;
pbrook06338792007-05-23 19:58:11 +000044
45 /* Initialize CPU registers. */
46 env->vbr = 0;
47 /* TODO: allow changing MBAR and RAMBAR. */
48 env->mbar = AN5206_MBAR_ADDR | 1;
49 env->rambar0 = AN5206_RAMBAR_ADDR | 1;
50
51 /* DRAM at address zero */
Avi Kivityc5705a72011-12-20 15:59:12 +020052 memory_region_init_ram(ram, "an5206.ram", ram_size);
53 vmstate_register_ram_global(ram);
Avi Kivity72e4d252011-07-25 14:14:31 +030054 memory_region_add_subregion(address_space_mem, 0, ram);
pbrook06338792007-05-23 19:58:11 +000055
56 /* Internal SRAM. */
Avi Kivityc5705a72011-12-20 15:59:12 +020057 memory_region_init_ram(sram, "an5206.sram", 512);
58 vmstate_register_ram_global(sram);
Avi Kivity72e4d252011-07-25 14:14:31 +030059 memory_region_add_subregion(address_space_mem, AN5206_RAMBAR_ADDR, sram);
pbrook06338792007-05-23 19:58:11 +000060
Andreas Färber4025cfd2013-01-18 14:10:34 +010061 mcf5206_init(address_space_mem, AN5206_MBAR_ADDR, cpu);
pbrook06338792007-05-23 19:58:11 +000062
63 /* Load kernel. */
64 if (!kernel_filename) {
65 fprintf(stderr, "Kernel image must be specified\n");
66 exit(1);
67 }
68
Aurelien Jarno409dbce2010-03-14 21:20:59 +010069 kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
70 NULL, NULL, 1, ELF_MACHINE, 0);
pbrook06338792007-05-23 19:58:11 +000071 entry = elf_entry;
72 if (kernel_size < 0) {
aliguori5a9154e2008-11-20 22:14:40 +000073 kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL);
pbrook06338792007-05-23 19:58:11 +000074 }
75 if (kernel_size < 0) {
pbrookdcac9672009-04-09 20:05:49 +000076 kernel_size = load_image_targphys(kernel_filename, KERNEL_LOAD_ADDR,
77 ram_size - KERNEL_LOAD_ADDR);
pbrook06338792007-05-23 19:58:11 +000078 entry = KERNEL_LOAD_ADDR;
79 }
80 if (kernel_size < 0) {
81 fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename);
82 exit(1);
83 }
84
85 env->pc = entry;
86}
87
Anthony Liguorif80f9ec2009-05-20 18:38:09 -050088static QEMUMachine an5206_machine = {
aliguori4b32e162008-10-07 20:34:35 +000089 .name = "an5206",
90 .desc = "Arnewsh 5206",
91 .init = an5206_init,
Avik Sile4ada292013-01-08 12:36:30 +053092 DEFAULT_MACHINE_OPTIONS,
pbrook06338792007-05-23 19:58:11 +000093};
Anthony Liguorif80f9ec2009-05-20 18:38:09 -050094
95static void an5206_machine_init(void)
96{
97 qemu_register_machine(&an5206_machine);
98}
99
100machine_init(an5206_machine_init);