28
#include "qemu/osdep.h"
29
#include "qapi/error.h"
30
#include "qemu/datadir.h"
31
#include "exec/address-spaces.h"
33
#include "hw/mips/mips.h"
34
#include "hw/char/serial.h"
36
#include "sysemu/sysemu.h"
41
#include "hw/qdev-properties.h"
42
#include "qemu/error-report.h"
43
#include "sysemu/qtest.h"
44
#include "sysemu/reset.h"
47
#define BIOS_SIZE (4 * MiB)
50
#define BIOS_FILENAME "mips_bios.bin"
52
#define BIOS_FILENAME "mipsel_bios.bin"
55
static struct _loaderparams {
57
const char *kernel_filename;
58
const char *kernel_cmdline;
59
const char *initrd_filename;
62
typedef struct ResetData {
67
static uint64_t load_kernel(void)
69
uint64_t entry, kernel_high, initrd_size;
71
ram_addr_t initrd_offset;
73
kernel_size = load_elf(loaderparams.kernel_filename, NULL,
74
cpu_mips_kseg0_to_phys, NULL,
76
&kernel_high, NULL, TARGET_BIG_ENDIAN,
78
if (kernel_size < 0) {
79
error_report("could not load kernel '%s': %s",
80
loaderparams.kernel_filename,
81
load_elf_strerror(kernel_size));
88
if (loaderparams.initrd_filename) {
89
initrd_size = get_image_size(loaderparams.initrd_filename);
90
if (initrd_size > 0) {
91
initrd_offset = ROUND_UP(kernel_high, INITRD_PAGE_SIZE);
92
if (initrd_offset + initrd_size > loaderparams.ram_size) {
93
error_report("memory too small for initial ram disk '%s'",
94
loaderparams.initrd_filename);
97
initrd_size = load_image_targphys(loaderparams.initrd_filename,
98
initrd_offset, loaderparams.ram_size - initrd_offset);
100
if (initrd_size == (target_ulong) -1) {
101
error_report("could not load initial ram disk '%s'",
102
loaderparams.initrd_filename);
109
static void main_cpu_reset(void *opaque)
111
ResetData *s = (ResetData *)opaque;
112
CPUMIPSState *env = &s->cpu->env;
114
cpu_reset(CPU(s->cpu));
115
env->active_tc.PC = s->vector & ~(target_ulong)1;
117
env->hflags |= MIPS_HFLAG_M16;
121
static void mipsnet_init(int base, qemu_irq irq)
126
dev = qemu_create_nic_device("mipsnet", true, NULL);
131
s = SYS_BUS_DEVICE(dev);
132
sysbus_realize_and_unref(s, &error_fatal);
133
sysbus_connect_irq(s, 0, irq);
134
memory_region_add_subregion(get_system_io(),
136
sysbus_mmio_get_region(s, 0));
140
mips_mipssim_init(MachineState *machine)
142
const char *kernel_filename = machine->kernel_filename;
143
const char *kernel_cmdline = machine->kernel_cmdline;
144
const char *initrd_filename = machine->initrd_filename;
146
MemoryRegion *address_space_mem = get_system_memory();
147
MemoryRegion *isa = g_new(MemoryRegion, 1);
148
MemoryRegion *bios = g_new(MemoryRegion, 1);
152
ResetData *reset_info;
155
cpuclk = clock_new(OBJECT(machine), "cpu-refclk");
157
clock_set_hz(cpuclk, 6000000);
159
clock_set_hz(cpuclk, 12000000);
163
cpu = mips_cpu_create_with_clock(machine->cpu_type, cpuclk);
166
reset_info = g_new0(ResetData, 1);
167
reset_info->cpu = cpu;
168
reset_info->vector = env->active_tc.PC;
169
qemu_register_reset(main_cpu_reset, reset_info);
172
memory_region_init_rom(bios, NULL, "mips_mipssim.bios", BIOS_SIZE,
175
memory_region_add_subregion(address_space_mem, 0, machine->ram);
178
memory_region_add_subregion(address_space_mem, 0x1fc00000LL, bios);
180
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, machine->firmware ?: BIOS_FILENAME);
182
bios_size = load_image_targphys(filename, 0x1fc00000LL, BIOS_SIZE);
187
if ((bios_size < 0 || bios_size > BIOS_SIZE) &&
188
machine->firmware && !qtest_enabled()) {
190
error_report("Could not load MIPS bios '%s'", machine->firmware);
194
env->active_tc.PC = (target_long)(int32_t)0xbfc00000;
197
if (kernel_filename) {
198
loaderparams.ram_size = machine->ram_size;
199
loaderparams.kernel_filename = kernel_filename;
200
loaderparams.kernel_cmdline = kernel_cmdline;
201
loaderparams.initrd_filename = initrd_filename;
202
reset_info->vector = load_kernel();
206
cpu_mips_irq_init_cpu(cpu);
207
cpu_mips_clock_init(cpu);
214
memory_region_init_alias(isa, NULL, "isa_mmio",
215
get_system_io(), 0, 0x00010000);
216
memory_region_add_subregion(get_system_memory(), 0x1fd00000, isa);
223
DeviceState *dev = qdev_new(TYPE_SERIAL_MM);
225
qdev_prop_set_chr(dev, "chardev", serial_hd(0));
226
qdev_prop_set_uint8(dev, "regshift", 0);
227
qdev_prop_set_uint8(dev, "endianness", DEVICE_LITTLE_ENDIAN);
228
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
229
sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, env->irq[4]);
230
memory_region_add_subregion(get_system_io(), 0x3f8,
231
sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0));
235
mipsnet_init(0x4200, env->irq[2]);
238
static void mips_mipssim_machine_init(MachineClass *mc)
240
mc->desc = "MIPS MIPSsim platform";
241
mc->init = mips_mipssim_init;
243
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("5Kf");
245
mc->default_cpu_type = MIPS_CPU_TYPE_NAME("24Kf");
247
mc->default_ram_id = "mips_mipssim.ram";
250
DEFINE_MACHINE("mipssim", mips_mipssim_machine_init)