Statistics
| Branch: | Revision:

root / hw / dummy_m68k.c @ a1bc20df

History | View | Annotate | Download (2.2 kB)

1
/*
2
 * Dummy board with just RAM and CPU for use as an ISS.
3
 *
4
 * Copyright (c) 2007 CodeSourcery.
5
 *
6
 * This code is licensed under the GPL
7
 */
8

    
9
#include "hw.h"
10
#include "boards.h"
11
#include "loader.h"
12
#include "elf.h"
13
#include "exec-memory.h"
14

    
15
#define KERNEL_LOAD_ADDR 0x10000
16

    
17
/* Board init.  */
18

    
19
static void dummy_m68k_init(QEMUMachineInitArgs *args)
20
{
21
    ram_addr_t ram_size = args->ram_size;
22
    const char *cpu_model = args->cpu_model;
23
    const char *kernel_filename = args->kernel_filename;
24
    CPUM68KState *env;
25
    MemoryRegion *address_space_mem =  get_system_memory();
26
    MemoryRegion *ram = g_new(MemoryRegion, 1);
27
    int kernel_size;
28
    uint64_t elf_entry;
29
    hwaddr entry;
30

    
31
    if (!cpu_model)
32
        cpu_model = "cfv4e";
33
    env = cpu_init(cpu_model);
34
    if (!env) {
35
        fprintf(stderr, "Unable to find m68k CPU definition\n");
36
        exit(1);
37
    }
38

    
39
    /* Initialize CPU registers.  */
40
    env->vbr = 0;
41

    
42
    /* RAM at address zero */
43
    memory_region_init_ram(ram, "dummy_m68k.ram", ram_size);
44
    vmstate_register_ram_global(ram);
45
    memory_region_add_subregion(address_space_mem, 0, ram);
46

    
47
    /* Load kernel.  */
48
    if (kernel_filename) {
49
        kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
50
                               NULL, NULL, 1, ELF_MACHINE, 0);
51
        entry = elf_entry;
52
        if (kernel_size < 0) {
53
            kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL);
54
        }
55
        if (kernel_size < 0) {
56
            kernel_size = load_image_targphys(kernel_filename,
57
                                              KERNEL_LOAD_ADDR,
58
                                              ram_size - KERNEL_LOAD_ADDR);
59
            entry = KERNEL_LOAD_ADDR;
60
        }
61
        if (kernel_size < 0) {
62
            fprintf(stderr, "qemu: could not load kernel '%s'\n",
63
                    kernel_filename);
64
            exit(1);
65
        }
66
    } else {
67
        entry = 0;
68
    }
69
    env->pc = entry;
70
}
71

    
72
static QEMUMachine dummy_m68k_machine = {
73
    .name = "dummy",
74
    .desc = "Dummy board",
75
    .init = dummy_m68k_init,
76
};
77

    
78
static void dummy_m68k_machine_init(void)
79
{
80
    qemu_register_machine(&dummy_m68k_machine);
81
}
82

    
83
machine_init(dummy_m68k_machine_init);