root / hw / xtensa_sim.c @ 795928f6
History | View | Annotate | Download (4 kB)
1 | 47d05a86 | Max Filippov | /*
|
---|---|---|---|
2 | 47d05a86 | Max Filippov | * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab.
|
3 | 47d05a86 | Max Filippov | * All rights reserved.
|
4 | 47d05a86 | Max Filippov | *
|
5 | 47d05a86 | Max Filippov | * Redistribution and use in source and binary forms, with or without
|
6 | 47d05a86 | Max Filippov | * modification, are permitted provided that the following conditions are met:
|
7 | 47d05a86 | Max Filippov | * * Redistributions of source code must retain the above copyright
|
8 | 47d05a86 | Max Filippov | * notice, this list of conditions and the following disclaimer.
|
9 | 47d05a86 | Max Filippov | * * Redistributions in binary form must reproduce the above copyright
|
10 | 47d05a86 | Max Filippov | * notice, this list of conditions and the following disclaimer in the
|
11 | 47d05a86 | Max Filippov | * documentation and/or other materials provided with the distribution.
|
12 | 47d05a86 | Max Filippov | * * Neither the name of the Open Source and Linux Lab nor the
|
13 | 47d05a86 | Max Filippov | * names of its contributors may be used to endorse or promote products
|
14 | 47d05a86 | Max Filippov | * derived from this software without specific prior written permission.
|
15 | 47d05a86 | Max Filippov | *
|
16 | 47d05a86 | Max Filippov | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17 | 47d05a86 | Max Filippov | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18 | 47d05a86 | Max Filippov | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19 | 47d05a86 | Max Filippov | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
20 | 47d05a86 | Max Filippov | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
21 | 47d05a86 | Max Filippov | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
22 | 47d05a86 | Max Filippov | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
23 | 47d05a86 | Max Filippov | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
24 | 47d05a86 | Max Filippov | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25 | 47d05a86 | Max Filippov | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26 | 47d05a86 | Max Filippov | */
|
27 | 47d05a86 | Max Filippov | |
28 | 47d05a86 | Max Filippov | #include "sysemu.h" |
29 | 47d05a86 | Max Filippov | #include "boards.h" |
30 | 47d05a86 | Max Filippov | #include "loader.h" |
31 | 47d05a86 | Max Filippov | #include "elf.h" |
32 | 47d05a86 | Max Filippov | #include "memory.h" |
33 | 47d05a86 | Max Filippov | #include "exec-memory.h" |
34 | 47d05a86 | Max Filippov | |
35 | 47d05a86 | Max Filippov | static uint64_t translate_phys_addr(void *env, uint64_t addr) |
36 | 47d05a86 | Max Filippov | { |
37 | 47d05a86 | Max Filippov | return cpu_get_phys_page_debug(env, addr);
|
38 | 47d05a86 | Max Filippov | } |
39 | 47d05a86 | Max Filippov | |
40 | 5e408573 | Max Filippov | static void sim_reset(void *env) |
41 | 47d05a86 | Max Filippov | { |
42 | 47d05a86 | Max Filippov | cpu_reset(env); |
43 | 47d05a86 | Max Filippov | } |
44 | 47d05a86 | Max Filippov | |
45 | 5e408573 | Max Filippov | static void sim_init(ram_addr_t ram_size, |
46 | 47d05a86 | Max Filippov | const char *boot_device, |
47 | 47d05a86 | Max Filippov | const char *kernel_filename, const char *kernel_cmdline, |
48 | 47d05a86 | Max Filippov | const char *initrd_filename, const char *cpu_model) |
49 | 47d05a86 | Max Filippov | { |
50 | 47d05a86 | Max Filippov | CPUState *env = NULL;
|
51 | 47d05a86 | Max Filippov | MemoryRegion *ram, *rom; |
52 | 47d05a86 | Max Filippov | int n;
|
53 | 47d05a86 | Max Filippov | |
54 | 47d05a86 | Max Filippov | for (n = 0; n < smp_cpus; n++) { |
55 | 47d05a86 | Max Filippov | env = cpu_init(cpu_model); |
56 | 47d05a86 | Max Filippov | if (!env) {
|
57 | 47d05a86 | Max Filippov | fprintf(stderr, "Unable to find CPU definition\n");
|
58 | 47d05a86 | Max Filippov | exit(1);
|
59 | 47d05a86 | Max Filippov | } |
60 | 47d05a86 | Max Filippov | env->sregs[PRID] = n; |
61 | 5e408573 | Max Filippov | qemu_register_reset(sim_reset, env); |
62 | 47d05a86 | Max Filippov | /* Need MMU initialized prior to ELF loading,
|
63 | 47d05a86 | Max Filippov | * so that ELF gets loaded into virtual addresses
|
64 | 47d05a86 | Max Filippov | */
|
65 | 5e408573 | Max Filippov | sim_reset(env); |
66 | 47d05a86 | Max Filippov | } |
67 | 47d05a86 | Max Filippov | |
68 | 47d05a86 | Max Filippov | ram = g_malloc(sizeof(*ram));
|
69 | 47d05a86 | Max Filippov | memory_region_init_ram(ram, NULL, "xtensa.sram", ram_size); |
70 | 47d05a86 | Max Filippov | memory_region_add_subregion(get_system_memory(), 0, ram);
|
71 | 47d05a86 | Max Filippov | |
72 | 47d05a86 | Max Filippov | rom = g_malloc(sizeof(*rom));
|
73 | 47d05a86 | Max Filippov | memory_region_init_ram(rom, NULL, "xtensa.rom", 0x1000); |
74 | 47d05a86 | Max Filippov | memory_region_add_subregion(get_system_memory(), 0xfe000000, rom);
|
75 | 47d05a86 | Max Filippov | |
76 | 47d05a86 | Max Filippov | if (kernel_filename) {
|
77 | 47d05a86 | Max Filippov | uint64_t elf_entry; |
78 | 47d05a86 | Max Filippov | uint64_t elf_lowaddr; |
79 | 47d05a86 | Max Filippov | #ifdef TARGET_WORDS_BIGENDIAN
|
80 | 47d05a86 | Max Filippov | int success = load_elf(kernel_filename, translate_phys_addr, env,
|
81 | 47d05a86 | Max Filippov | &elf_entry, &elf_lowaddr, NULL, 1, ELF_MACHINE, 0); |
82 | 47d05a86 | Max Filippov | #else
|
83 | 47d05a86 | Max Filippov | int success = load_elf(kernel_filename, translate_phys_addr, env,
|
84 | 47d05a86 | Max Filippov | &elf_entry, &elf_lowaddr, NULL, 0, ELF_MACHINE, 0); |
85 | 47d05a86 | Max Filippov | #endif
|
86 | 47d05a86 | Max Filippov | if (success > 0) { |
87 | 47d05a86 | Max Filippov | env->pc = elf_entry; |
88 | 47d05a86 | Max Filippov | } |
89 | 47d05a86 | Max Filippov | } |
90 | 47d05a86 | Max Filippov | } |
91 | 47d05a86 | Max Filippov | |
92 | 5e408573 | Max Filippov | static void xtensa_sim_init(ram_addr_t ram_size, |
93 | 47d05a86 | Max Filippov | const char *boot_device, |
94 | 47d05a86 | Max Filippov | const char *kernel_filename, const char *kernel_cmdline, |
95 | 47d05a86 | Max Filippov | const char *initrd_filename, const char *cpu_model) |
96 | 47d05a86 | Max Filippov | { |
97 | 47d05a86 | Max Filippov | if (!cpu_model) {
|
98 | 47d05a86 | Max Filippov | cpu_model = "dc232b";
|
99 | 47d05a86 | Max Filippov | } |
100 | 5e408573 | Max Filippov | sim_init(ram_size, boot_device, kernel_filename, kernel_cmdline, |
101 | 47d05a86 | Max Filippov | initrd_filename, cpu_model); |
102 | 47d05a86 | Max Filippov | } |
103 | 47d05a86 | Max Filippov | |
104 | 5e408573 | Max Filippov | static QEMUMachine xtensa_sim_machine = {
|
105 | 5e408573 | Max Filippov | .name = "sim",
|
106 | 5e408573 | Max Filippov | .desc = "sim machine (dc232b)",
|
107 | 5e408573 | Max Filippov | .init = xtensa_sim_init, |
108 | 47d05a86 | Max Filippov | .max_cpus = 4,
|
109 | 47d05a86 | Max Filippov | }; |
110 | 47d05a86 | Max Filippov | |
111 | 5e408573 | Max Filippov | static void xtensa_sim_machine_init(void) |
112 | 47d05a86 | Max Filippov | { |
113 | 5e408573 | Max Filippov | qemu_register_machine(&xtensa_sim_machine); |
114 | 47d05a86 | Max Filippov | } |
115 | 47d05a86 | Max Filippov | |
116 | 5e408573 | Max Filippov | machine_init(xtensa_sim_machine_init); |