spike.c (9d3f7108bc43e93ceef7faa27c87eea8295c33ed) | spike.c (71d68c48be96366fb89f7a2dd9d82dd86bcbe542) |
---|---|
1/* 2 * QEMU RISC-V Spike Board 3 * 4 * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu 5 * Copyright (c) 2017-2018 SiFive, Inc. 6 * 7 * This provides a RISC-V Board with the following devices: 8 * --- 35 unchanged lines hidden (view full) --- 44static const MemMapEntry spike_memmap[] = { 45 [SPIKE_MROM] = { 0x1000, 0xf000 }, 46 [SPIKE_HTIF] = { 0x1000000, 0x1000 }, 47 [SPIKE_CLINT] = { 0x2000000, 0x10000 }, 48 [SPIKE_DRAM] = { 0x80000000, 0x0 }, 49}; 50 51static void create_fdt(SpikeState *s, const MemMapEntry *memmap, | 1/* 2 * QEMU RISC-V Spike Board 3 * 4 * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu 5 * Copyright (c) 2017-2018 SiFive, Inc. 6 * 7 * This provides a RISC-V Board with the following devices: 8 * --- 35 unchanged lines hidden (view full) --- 44static const MemMapEntry spike_memmap[] = { 45 [SPIKE_MROM] = { 0x1000, 0xf000 }, 46 [SPIKE_HTIF] = { 0x1000000, 0x1000 }, 47 [SPIKE_CLINT] = { 0x2000000, 0x10000 }, 48 [SPIKE_DRAM] = { 0x80000000, 0x0 }, 49}; 50 51static void create_fdt(SpikeState *s, const MemMapEntry *memmap, |
52 uint64_t mem_size, const char *cmdline, bool is_32_bit) | 52 uint64_t mem_size, const char *cmdline, 53 bool is_32_bit, bool htif_custom_base) |
53{ 54 void *fdt; 55 uint64_t addr, size; 56 unsigned long clint_addr; 57 int cpu, socket; 58 MachineState *mc = MACHINE(s); 59 uint32_t *clint_cells; 60 uint32_t cpu_phandle, intc_phandle, phandle = 1; --- 11 unchanged lines hidden (view full) --- 72 73 qemu_fdt_setprop_string(fdt, "/", "model", "ucbbar,spike-bare,qemu"); 74 qemu_fdt_setprop_string(fdt, "/", "compatible", "ucbbar,spike-bare-dev"); 75 qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2); 76 qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2); 77 78 qemu_fdt_add_subnode(fdt, "/htif"); 79 qemu_fdt_setprop_string(fdt, "/htif", "compatible", "ucb,htif0"); | 54{ 55 void *fdt; 56 uint64_t addr, size; 57 unsigned long clint_addr; 58 int cpu, socket; 59 MachineState *mc = MACHINE(s); 60 uint32_t *clint_cells; 61 uint32_t cpu_phandle, intc_phandle, phandle = 1; --- 11 unchanged lines hidden (view full) --- 73 74 qemu_fdt_setprop_string(fdt, "/", "model", "ucbbar,spike-bare,qemu"); 75 qemu_fdt_setprop_string(fdt, "/", "compatible", "ucbbar,spike-bare-dev"); 76 qemu_fdt_setprop_cell(fdt, "/", "#size-cells", 0x2); 77 qemu_fdt_setprop_cell(fdt, "/", "#address-cells", 0x2); 78 79 qemu_fdt_add_subnode(fdt, "/htif"); 80 qemu_fdt_setprop_string(fdt, "/htif", "compatible", "ucb,htif0"); |
80 if (!htif_uses_elf_symbols()) { | 81 if (htif_custom_base) { |
81 qemu_fdt_setprop_cells(fdt, "/htif", "reg", 82 0x0, memmap[SPIKE_HTIF].base, 0x0, memmap[SPIKE_HTIF].size); 83 } 84 85 qemu_fdt_add_subnode(fdt, "/soc"); 86 qemu_fdt_setprop(fdt, "/soc", "ranges", NULL, 0); 87 qemu_fdt_setprop_string(fdt, "/soc", "compatible", "simple-bus"); 88 qemu_fdt_setprop_cell(fdt, "/soc", "#size-cells", 0x2); --- 89 unchanged lines hidden (view full) --- 178 qemu_fdt_add_subnode(fdt, "/chosen"); 179 qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", "/htif"); 180 181 if (cmdline && *cmdline) { 182 qemu_fdt_setprop_string(fdt, "/chosen", "bootargs", cmdline); 183 } 184} 185 | 82 qemu_fdt_setprop_cells(fdt, "/htif", "reg", 83 0x0, memmap[SPIKE_HTIF].base, 0x0, memmap[SPIKE_HTIF].size); 84 } 85 86 qemu_fdt_add_subnode(fdt, "/soc"); 87 qemu_fdt_setprop(fdt, "/soc", "ranges", NULL, 0); 88 qemu_fdt_setprop_string(fdt, "/soc", "compatible", "simple-bus"); 89 qemu_fdt_setprop_cell(fdt, "/soc", "#size-cells", 0x2); --- 89 unchanged lines hidden (view full) --- 179 qemu_fdt_add_subnode(fdt, "/chosen"); 180 qemu_fdt_setprop_string(fdt, "/chosen", "stdout-path", "/htif"); 181 182 if (cmdline && *cmdline) { 183 qemu_fdt_setprop_string(fdt, "/chosen", "bootargs", cmdline); 184 } 185} 186 |
187static bool spike_test_elf_image(char *filename) 188{ 189 Error *err = NULL; 190 191 load_elf_hdr(filename, NULL, NULL, &err); 192 if (err) { 193 error_free(err); 194 return false; 195 } else { 196 return true; 197 } 198} 199 |
|
186static void spike_board_init(MachineState *machine) 187{ 188 const MemMapEntry *memmap = spike_memmap; 189 SpikeState *s = SPIKE_MACHINE(machine); 190 MemoryRegion *system_memory = get_system_memory(); 191 MemoryRegion *mask_rom = g_new(MemoryRegion, 1); | 200static void spike_board_init(MachineState *machine) 201{ 202 const MemMapEntry *memmap = spike_memmap; 203 SpikeState *s = SPIKE_MACHINE(machine); 204 MemoryRegion *system_memory = get_system_memory(); 205 MemoryRegion *mask_rom = g_new(MemoryRegion, 1); |
192 target_ulong firmware_end_addr, kernel_start_addr; 193 const char *firmware_name; | 206 target_ulong firmware_end_addr = memmap[SPIKE_DRAM].base; 207 target_ulong kernel_start_addr; 208 char *firmware_name; |
194 uint32_t fdt_load_addr; 195 uint64_t kernel_entry; 196 char *soc_name; 197 int i, base_hartid, hart_count; | 209 uint32_t fdt_load_addr; 210 uint64_t kernel_entry; 211 char *soc_name; 212 int i, base_hartid, hart_count; |
213 bool htif_custom_base = false; |
|
198 199 /* Check socket count limit */ 200 if (SPIKE_SOCKETS_MAX < riscv_socket_count(machine)) { 201 error_report("number of sockets/nodes should be less than %d", 202 SPIKE_SOCKETS_MAX); 203 exit(1); 204 } 205 --- 45 unchanged lines hidden (view full) --- 251 machine->ram); 252 253 /* boot rom */ 254 memory_region_init_rom(mask_rom, NULL, "riscv.spike.mrom", 255 memmap[SPIKE_MROM].size, &error_fatal); 256 memory_region_add_subregion(system_memory, memmap[SPIKE_MROM].base, 257 mask_rom); 258 | 214 215 /* Check socket count limit */ 216 if (SPIKE_SOCKETS_MAX < riscv_socket_count(machine)) { 217 error_report("number of sockets/nodes should be less than %d", 218 SPIKE_SOCKETS_MAX); 219 exit(1); 220 } 221 --- 45 unchanged lines hidden (view full) --- 267 machine->ram); 268 269 /* boot rom */ 270 memory_region_init_rom(mask_rom, NULL, "riscv.spike.mrom", 271 memmap[SPIKE_MROM].size, &error_fatal); 272 memory_region_add_subregion(system_memory, memmap[SPIKE_MROM].base, 273 mask_rom); 274 |
259 firmware_name = riscv_default_firmware_name(&s->soc[0]); 260 firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name, 261 memmap[SPIKE_DRAM].base, 262 htif_symbol_callback); | 275 /* Find firmware */ 276 firmware_name = riscv_find_firmware(machine->firmware, 277 riscv_default_firmware_name(&s->soc[0])); |
263 | 278 |
279 /* 280 * Test the given firmware or kernel file to see if it is an ELF image. 281 * If it is an ELF, we assume it contains the symbols required for 282 * the HTIF console, otherwise we fall back to use the custom base 283 * passed from device tree for the HTIF console. 284 */ 285 if (!firmware_name && !machine->kernel_filename) { 286 htif_custom_base = true; 287 } else { 288 if (firmware_name) { 289 htif_custom_base = !spike_test_elf_image(firmware_name); 290 } 291 if (!htif_custom_base && machine->kernel_filename) { 292 htif_custom_base = !spike_test_elf_image(machine->kernel_filename); 293 } 294 } 295 296 /* Load firmware */ 297 if (firmware_name) { 298 firmware_end_addr = riscv_load_firmware(firmware_name, 299 memmap[SPIKE_DRAM].base, 300 htif_symbol_callback); 301 g_free(firmware_name); 302 } 303 |
|
264 /* Load kernel */ 265 if (machine->kernel_filename) { 266 kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0], 267 firmware_end_addr); 268 269 kernel_entry = riscv_load_kernel(machine->kernel_filename, 270 kernel_start_addr, 271 htif_symbol_callback); 272 } else { 273 /* 274 * If dynamic firmware is used, it doesn't know where is the next mode 275 * if kernel argument is not set. 276 */ 277 kernel_entry = 0; 278 } 279 280 /* Create device tree */ 281 create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline, | 304 /* Load kernel */ 305 if (machine->kernel_filename) { 306 kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0], 307 firmware_end_addr); 308 309 kernel_entry = riscv_load_kernel(machine->kernel_filename, 310 kernel_start_addr, 311 htif_symbol_callback); 312 } else { 313 /* 314 * If dynamic firmware is used, it doesn't know where is the next mode 315 * if kernel argument is not set. 316 */ 317 kernel_entry = 0; 318 } 319 320 /* Create device tree */ 321 create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline, |
282 riscv_is_32bit(&s->soc[0])); | 322 riscv_is_32bit(&s->soc[0]), htif_custom_base); |
283 284 /* Load initrd */ 285 if (machine->kernel_filename && machine->initrd_filename) { 286 hwaddr start; 287 hwaddr end = riscv_load_initrd(machine->initrd_filename, 288 machine->ram_size, kernel_entry, 289 &start); 290 qemu_fdt_setprop_cell(s->fdt, "/chosen", --- 11 unchanged lines hidden (view full) --- 302 303 /* load the reset vector */ 304 riscv_setup_rom_reset_vec(machine, &s->soc[0], memmap[SPIKE_DRAM].base, 305 memmap[SPIKE_MROM].base, 306 memmap[SPIKE_MROM].size, kernel_entry, 307 fdt_load_addr); 308 309 /* initialize HTIF using symbols found in load_kernel */ | 323 324 /* Load initrd */ 325 if (machine->kernel_filename && machine->initrd_filename) { 326 hwaddr start; 327 hwaddr end = riscv_load_initrd(machine->initrd_filename, 328 machine->ram_size, kernel_entry, 329 &start); 330 qemu_fdt_setprop_cell(s->fdt, "/chosen", --- 11 unchanged lines hidden (view full) --- 342 343 /* load the reset vector */ 344 riscv_setup_rom_reset_vec(machine, &s->soc[0], memmap[SPIKE_DRAM].base, 345 memmap[SPIKE_MROM].base, 346 memmap[SPIKE_MROM].size, kernel_entry, 347 fdt_load_addr); 348 349 /* initialize HTIF using symbols found in load_kernel */ |
310 htif_mm_init(system_memory, serial_hd(0), memmap[SPIKE_HTIF].base); | 350 htif_mm_init(system_memory, serial_hd(0), memmap[SPIKE_HTIF].base, 351 htif_custom_base); |
311} 312 313static void spike_machine_instance_init(Object *obj) 314{ 315} 316 317static void spike_machine_class_init(ObjectClass *oc, void *data) 318{ --- 28 unchanged lines hidden --- | 352} 353 354static void spike_machine_instance_init(Object *obj) 355{ 356} 357 358static void spike_machine_class_init(ObjectClass *oc, void *data) 359{ --- 28 unchanged lines hidden --- |