blob: 54ccbe1a822e5d3d028f1554a808c3c305f00ff0 [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
Peter Maydelld8416662016-01-26 18:17:23 +00009#include "qemu/osdep.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010010#include "qapi/error.h"
Paolo Bonzini4771d752016-01-19 21:51:44 +010011#include "cpu.h"
Paolo Bonzini0d09e412013-02-05 17:06:20 +010012#include "hw/m68k/mcf.h"
Paolo Bonzini83c9f4c2013-02-04 15:40:22 +010013#include "hw/boards.h"
14#include "hw/loader.h"
Blue Swirlca20cf32009-09-20 14:58:02 +000015#include "elf.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010016#include "exec/address-spaces.h"
Markus Armbrusterc5254362015-12-17 17:35:09 +010017#include "qemu/error-report.h"
Andreas Färber19c82aa2013-07-29 18:48:58 +020018#include "sysemu/qtest.h"
pbrook06338792007-05-23 19:58:11 +000019
20#define KERNEL_LOAD_ADDR 0x10000
21#define AN5206_MBAR_ADDR 0x10000000
22#define AN5206_RAMBAR_ADDR 0x20000000
23
pbrook06338792007-05-23 19:58:11 +000024/* Board init. */
25
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +030026static void an5206_init(MachineState *machine)
pbrook06338792007-05-23 19:58:11 +000027{
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +030028 ram_addr_t ram_size = machine->ram_size;
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +030029 const char *kernel_filename = machine->kernel_filename;
Andreas Färber4025cfd2013-01-18 14:10:34 +010030 M68kCPU *cpu;
Andreas Färber7927df32012-03-14 01:38:23 +010031 CPUM68KState *env;
pbrook06338792007-05-23 19:58:11 +000032 int kernel_size;
33 uint64_t elf_entry;
Avi Kivitya8170e52012-10-23 12:30:10 +020034 hwaddr entry;
Avi Kivity72e4d252011-07-25 14:14:31 +030035 MemoryRegion *address_space_mem = get_system_memory();
36 MemoryRegion *ram = g_new(MemoryRegion, 1);
37 MemoryRegion *sram = g_new(MemoryRegion, 1);
pbrook06338792007-05-23 19:58:11 +000038
Igor Mammedov25a20b32017-10-05 15:50:46 +020039 cpu = M68K_CPU(cpu_create(machine->cpu_type));
Andreas Färber4025cfd2013-01-18 14:10:34 +010040 env = &cpu->env;
pbrook06338792007-05-23 19:58:11 +000041
42 /* Initialize CPU registers. */
43 env->vbr = 0;
44 /* TODO: allow changing MBAR and RAMBAR. */
45 env->mbar = AN5206_MBAR_ADDR | 1;
46 env->rambar0 = AN5206_RAMBAR_ADDR | 1;
47
48 /* DRAM at address zero */
Dirk Müller1d5bfde2015-03-24 23:11:03 +010049 memory_region_allocate_system_memory(ram, NULL, "an5206.ram", ram_size);
Avi Kivity72e4d252011-07-25 14:14:31 +030050 memory_region_add_subregion(address_space_mem, 0, ram);
pbrook06338792007-05-23 19:58:11 +000051
52 /* Internal SRAM. */
Peter Maydell98a99ce2017-07-07 15:42:53 +010053 memory_region_init_ram(sram, NULL, "an5206.sram", 512, &error_fatal);
Avi Kivity72e4d252011-07-25 14:14:31 +030054 memory_region_add_subregion(address_space_mem, AN5206_RAMBAR_ADDR, sram);
pbrook06338792007-05-23 19:58:11 +000055
Andreas Färber4025cfd2013-01-18 14:10:34 +010056 mcf5206_init(address_space_mem, AN5206_MBAR_ADDR, cpu);
pbrook06338792007-05-23 19:58:11 +000057
58 /* Load kernel. */
59 if (!kernel_filename) {
Andreas Färber19c82aa2013-07-29 18:48:58 +020060 if (qtest_enabled()) {
61 return;
62 }
Alistair Francis45876e92017-09-29 17:16:06 -070063 error_report("Kernel image must be specified");
pbrook06338792007-05-23 19:58:11 +000064 exit(1);
65 }
66
Liam Merwick4366e1d2019-01-15 12:18:03 +000067 kernel_size = load_elf(kernel_filename, NULL, NULL, NULL, &elf_entry,
Peter Crosthwaite7ef295e2016-03-04 11:30:21 +000068 NULL, NULL, 1, EM_68K, 0, 0);
pbrook06338792007-05-23 19:58:11 +000069 entry = elf_entry;
70 if (kernel_size < 0) {
Max Filippov25bda502014-10-19 07:42:22 +040071 kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL,
72 NULL, NULL);
pbrook06338792007-05-23 19:58:11 +000073 }
74 if (kernel_size < 0) {
pbrookdcac9672009-04-09 20:05:49 +000075 kernel_size = load_image_targphys(kernel_filename, KERNEL_LOAD_ADDR,
76 ram_size - KERNEL_LOAD_ADDR);
pbrook06338792007-05-23 19:58:11 +000077 entry = KERNEL_LOAD_ADDR;
78 }
79 if (kernel_size < 0) {
Alistair Francis45876e92017-09-29 17:16:06 -070080 error_report("Could not load kernel '%s'", kernel_filename);
pbrook06338792007-05-23 19:58:11 +000081 exit(1);
82 }
83
84 env->pc = entry;
85}
86
Eduardo Habkoste264d292015-09-04 15:37:08 -030087static void an5206_machine_init(MachineClass *mc)
Anthony Liguorif80f9ec2009-05-20 18:38:09 -050088{
Eduardo Habkoste264d292015-09-04 15:37:08 -030089 mc->desc = "Arnewsh 5206";
90 mc->init = an5206_init;
Igor Mammedov25a20b32017-10-05 15:50:46 +020091 mc->default_cpu_type = M68K_CPU_TYPE_NAME("m5206");
Anthony Liguorif80f9ec2009-05-20 18:38:09 -050092}
93
Eduardo Habkoste264d292015-09-04 15:37:08 -030094DEFINE_MACHINE("an5206", an5206_machine_init)