Fix typo that leads to out of bounds array access on big endian systems
[qemu/mini2440.git] / hw / sun4m.c
blob1f1efd0733074dcb4e256e3eab2feb285fab8d44
1 /*
2 * QEMU Sun4m & Sun4d & Sun4c System Emulator
4 * Copyright (c) 2003-2005 Fabrice Bellard
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
24 #include "hw.h"
25 #include "qemu-timer.h"
26 #include "sun4m.h"
27 #include "nvram.h"
28 #include "sparc32_dma.h"
29 #include "fdc.h"
30 #include "sysemu.h"
31 #include "net.h"
32 #include "boards.h"
33 #include "firmware_abi.h"
34 #include "scsi.h"
35 #include "pc.h"
36 #include "isa.h"
37 #include "fw_cfg.h"
38 #include "escc.h"
40 //#define DEBUG_IRQ
43 * Sun4m architecture was used in the following machines:
45 * SPARCserver 6xxMP/xx
46 * SPARCclassic (SPARCclassic Server)(SPARCstation LC) (4/15),
47 * SPARCclassic X (4/10)
48 * SPARCstation LX/ZX (4/30)
49 * SPARCstation Voyager
50 * SPARCstation 10/xx, SPARCserver 10/xx
51 * SPARCstation 5, SPARCserver 5
52 * SPARCstation 20/xx, SPARCserver 20
53 * SPARCstation 4
55 * Sun4d architecture was used in the following machines:
57 * SPARCcenter 2000
58 * SPARCserver 1000
60 * Sun4c architecture was used in the following machines:
61 * SPARCstation 1/1+, SPARCserver 1/1+
62 * SPARCstation SLC
63 * SPARCstation IPC
64 * SPARCstation ELC
65 * SPARCstation IPX
67 * See for example: http://www.sunhelp.org/faq/sunref1.html
70 #ifdef DEBUG_IRQ
71 #define DPRINTF(fmt, args...) \
72 do { printf("CPUIRQ: " fmt , ##args); } while (0)
73 #else
74 #define DPRINTF(fmt, args...)
75 #endif
77 #define KERNEL_LOAD_ADDR 0x00004000
78 #define CMDLINE_ADDR 0x007ff000
79 #define INITRD_LOAD_ADDR 0x00800000
80 #define PROM_SIZE_MAX (1024 * 1024)
81 #define PROM_VADDR 0xffd00000
82 #define PROM_FILENAME "openbios-sparc32"
83 #define CFG_ADDR 0xd00000510ULL
84 #define FW_CFG_SUN4M_DEPTH (FW_CFG_ARCH_LOCAL + 0x00)
86 #define MAX_CPUS 16
87 #define MAX_PILS 16
89 #define ESCC_CLOCK 4915200
91 struct sun4m_hwdef {
92 target_phys_addr_t iommu_base, slavio_base;
93 target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base;
94 target_phys_addr_t serial_base, fd_base;
95 target_phys_addr_t idreg_base, dma_base, esp_base, le_base;
96 target_phys_addr_t tcx_base, cs_base, apc_base, aux1_base, aux2_base;
97 target_phys_addr_t ecc_base;
98 uint32_t ecc_version;
99 long vram_size, nvram_size;
100 // IRQ numbers are not PIL ones, but master interrupt controller
101 // register bit numbers
102 int esp_irq, le_irq, clock_irq, clock1_irq;
103 int ser_irq, ms_kb_irq, fd_irq, me_irq, cs_irq, ecc_irq;
104 uint8_t nvram_machine_id;
105 uint16_t machine_id;
106 uint32_t iommu_version;
107 uint32_t intbit_to_level[32];
108 uint64_t max_mem;
109 const char * const default_cpu_model;
112 #define MAX_IOUNITS 5
114 struct sun4d_hwdef {
115 target_phys_addr_t iounit_bases[MAX_IOUNITS], slavio_base;
116 target_phys_addr_t counter_base, nvram_base, ms_kb_base;
117 target_phys_addr_t serial_base;
118 target_phys_addr_t espdma_base, esp_base;
119 target_phys_addr_t ledma_base, le_base;
120 target_phys_addr_t tcx_base;
121 target_phys_addr_t sbi_base;
122 unsigned long vram_size, nvram_size;
123 // IRQ numbers are not PIL ones, but SBI register bit numbers
124 int esp_irq, le_irq, clock_irq, clock1_irq;
125 int ser_irq, ms_kb_irq, me_irq;
126 uint8_t nvram_machine_id;
127 uint16_t machine_id;
128 uint32_t iounit_version;
129 uint64_t max_mem;
130 const char * const default_cpu_model;
133 struct sun4c_hwdef {
134 target_phys_addr_t iommu_base, slavio_base;
135 target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base;
136 target_phys_addr_t serial_base, fd_base;
137 target_phys_addr_t idreg_base, dma_base, esp_base, le_base;
138 target_phys_addr_t tcx_base, aux1_base;
139 long vram_size, nvram_size;
140 // IRQ numbers are not PIL ones, but master interrupt controller
141 // register bit numbers
142 int esp_irq, le_irq, clock_irq, clock1_irq;
143 int ser_irq, ms_kb_irq, fd_irq, me_irq;
144 uint8_t nvram_machine_id;
145 uint16_t machine_id;
146 uint32_t iommu_version;
147 uint32_t intbit_to_level[32];
148 uint64_t max_mem;
149 const char * const default_cpu_model;
152 int DMA_get_channel_mode (int nchan)
154 return 0;
156 int DMA_read_memory (int nchan, void *buf, int pos, int size)
158 return 0;
160 int DMA_write_memory (int nchan, void *buf, int pos, int size)
162 return 0;
164 void DMA_hold_DREQ (int nchan) {}
165 void DMA_release_DREQ (int nchan) {}
166 void DMA_schedule(int nchan) {}
167 void DMA_init (int high_page_enable) {}
168 void DMA_register_channel (int nchan,
169 DMA_transfer_handler transfer_handler,
170 void *opaque)
174 static int fw_cfg_boot_set(void *opaque, const char *boot_device)
176 fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
177 return 0;
180 static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline,
181 const char *boot_devices, ram_addr_t RAM_size,
182 uint32_t kernel_size,
183 int width, int height, int depth,
184 int nvram_machine_id, const char *arch)
186 unsigned int i;
187 uint32_t start, end;
188 uint8_t image[0x1ff0];
189 struct OpenBIOS_nvpart_v1 *part_header;
191 memset(image, '\0', sizeof(image));
193 start = 0;
195 // OpenBIOS nvram variables
196 // Variable partition
197 part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
198 part_header->signature = OPENBIOS_PART_SYSTEM;
199 pstrcpy(part_header->name, sizeof(part_header->name), "system");
201 end = start + sizeof(struct OpenBIOS_nvpart_v1);
202 for (i = 0; i < nb_prom_envs; i++)
203 end = OpenBIOS_set_var(image, end, prom_envs[i]);
205 // End marker
206 image[end++] = '\0';
208 end = start + ((end - start + 15) & ~15);
209 OpenBIOS_finish_partition(part_header, end - start);
211 // free partition
212 start = end;
213 part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
214 part_header->signature = OPENBIOS_PART_FREE;
215 pstrcpy(part_header->name, sizeof(part_header->name), "free");
217 end = 0x1fd0;
218 OpenBIOS_finish_partition(part_header, end - start);
220 Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr,
221 nvram_machine_id);
223 for (i = 0; i < sizeof(image); i++)
224 m48t59_write(nvram, i, image[i]);
227 static void *slavio_intctl;
229 void pic_info(Monitor *mon)
231 if (slavio_intctl)
232 slavio_pic_info(mon, slavio_intctl);
235 void irq_info(Monitor *mon)
237 if (slavio_intctl)
238 slavio_irq_info(mon, slavio_intctl);
241 void cpu_check_irqs(CPUState *env)
243 if (env->pil_in && (env->interrupt_index == 0 ||
244 (env->interrupt_index & ~15) == TT_EXTINT)) {
245 unsigned int i;
247 for (i = 15; i > 0; i--) {
248 if (env->pil_in & (1 << i)) {
249 int old_interrupt = env->interrupt_index;
251 env->interrupt_index = TT_EXTINT | i;
252 if (old_interrupt != env->interrupt_index) {
253 DPRINTF("Set CPU IRQ %d\n", i);
254 cpu_interrupt(env, CPU_INTERRUPT_HARD);
256 break;
259 } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) {
260 DPRINTF("Reset CPU IRQ %d\n", env->interrupt_index & 15);
261 env->interrupt_index = 0;
262 cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
266 static void cpu_set_irq(void *opaque, int irq, int level)
268 CPUState *env = opaque;
270 if (level) {
271 DPRINTF("Raise CPU IRQ %d\n", irq);
272 env->halted = 0;
273 env->pil_in |= 1 << irq;
274 cpu_check_irqs(env);
275 } else {
276 DPRINTF("Lower CPU IRQ %d\n", irq);
277 env->pil_in &= ~(1 << irq);
278 cpu_check_irqs(env);
282 static void dummy_cpu_set_irq(void *opaque, int irq, int level)
286 static void *slavio_misc;
288 void qemu_system_powerdown(void)
290 slavio_set_power_fail(slavio_misc, 1);
293 static void main_cpu_reset(void *opaque)
295 CPUState *env = opaque;
297 cpu_reset(env);
298 env->halted = 0;
301 static void secondary_cpu_reset(void *opaque)
303 CPUState *env = opaque;
305 cpu_reset(env);
306 env->halted = 1;
309 static void cpu_halt_signal(void *opaque, int irq, int level)
311 if (level && cpu_single_env)
312 cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT);
315 static unsigned long sun4m_load_kernel(const char *kernel_filename,
316 const char *initrd_filename,
317 ram_addr_t RAM_size)
319 int linux_boot;
320 unsigned int i;
321 long initrd_size, kernel_size;
323 linux_boot = (kernel_filename != NULL);
325 kernel_size = 0;
326 if (linux_boot) {
327 kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
328 NULL);
329 if (kernel_size < 0)
330 kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR,
331 RAM_size - KERNEL_LOAD_ADDR);
332 if (kernel_size < 0)
333 kernel_size = load_image_targphys(kernel_filename,
334 KERNEL_LOAD_ADDR,
335 RAM_size - KERNEL_LOAD_ADDR);
336 if (kernel_size < 0) {
337 fprintf(stderr, "qemu: could not load kernel '%s'\n",
338 kernel_filename);
339 exit(1);
342 /* load initrd */
343 initrd_size = 0;
344 if (initrd_filename) {
345 initrd_size = load_image_targphys(initrd_filename,
346 INITRD_LOAD_ADDR,
347 RAM_size - INITRD_LOAD_ADDR);
348 if (initrd_size < 0) {
349 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
350 initrd_filename);
351 exit(1);
354 if (initrd_size > 0) {
355 for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) {
356 if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS
357 stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR);
358 stl_phys(KERNEL_LOAD_ADDR + i + 20, initrd_size);
359 break;
364 return kernel_size;
367 static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
368 const char *boot_device,
369 const char *kernel_filename,
370 const char *kernel_cmdline,
371 const char *initrd_filename, const char *cpu_model)
374 CPUState *env, *envs[MAX_CPUS];
375 unsigned int i;
376 void *iommu, *espdma, *ledma, *main_esp, *nvram;
377 qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq,
378 *espdma_irq, *ledma_irq;
379 qemu_irq *esp_reset, *le_reset;
380 qemu_irq *fdc_tc;
381 qemu_irq *cpu_halt;
382 ram_addr_t ram_offset, prom_offset, idreg_offset;
383 unsigned long kernel_size;
384 int ret;
385 char buf[1024];
386 BlockDriverState *fd[MAX_FD];
387 int drive_index;
388 void *fw_cfg;
390 /* init CPUs */
391 if (!cpu_model)
392 cpu_model = hwdef->default_cpu_model;
394 for(i = 0; i < smp_cpus; i++) {
395 env = cpu_init(cpu_model);
396 if (!env) {
397 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
398 exit(1);
400 cpu_sparc_set_id(env, i);
401 envs[i] = env;
402 if (i == 0) {
403 qemu_register_reset(main_cpu_reset, env);
404 } else {
405 qemu_register_reset(secondary_cpu_reset, env);
406 env->halted = 1;
408 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
409 env->prom_addr = hwdef->slavio_base;
412 for (i = smp_cpus; i < MAX_CPUS; i++)
413 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
416 /* allocate RAM */
417 if ((uint64_t)RAM_size > hwdef->max_mem) {
418 fprintf(stderr,
419 "qemu: Too much memory for this machine: %d, maximum %d\n",
420 (unsigned int)(RAM_size / (1024 * 1024)),
421 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
422 exit(1);
424 ram_offset = qemu_ram_alloc(RAM_size);
425 cpu_register_physical_memory(0, RAM_size, ram_offset);
427 /* load boot prom */
428 prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);
429 cpu_register_physical_memory(hwdef->slavio_base,
430 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
431 TARGET_PAGE_MASK,
432 prom_offset | IO_MEM_ROM);
434 if (bios_name == NULL)
435 bios_name = PROM_FILENAME;
436 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
437 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
438 if (ret < 0 || ret > PROM_SIZE_MAX)
439 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
440 if (ret < 0 || ret > PROM_SIZE_MAX) {
441 fprintf(stderr, "qemu: could not load prom '%s'\n",
442 buf);
443 exit(1);
446 /* set up devices */
447 slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
448 hwdef->intctl_base + 0x10000ULL,
449 &hwdef->intbit_to_level[0],
450 &slavio_irq, &slavio_cpu_irq,
451 cpu_irqs,
452 hwdef->clock_irq);
454 if (hwdef->idreg_base) {
455 static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
457 idreg_offset = qemu_ram_alloc(sizeof(idreg_data));
458 cpu_register_physical_memory(hwdef->idreg_base, sizeof(idreg_data),
459 idreg_offset | IO_MEM_ROM);
460 cpu_physical_memory_write_rom(hwdef->idreg_base, idreg_data,
461 sizeof(idreg_data));
464 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
465 slavio_irq[hwdef->me_irq]);
467 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
468 iommu, &espdma_irq, &esp_reset);
470 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
471 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
472 &le_reset);
474 if (graphic_depth != 8 && graphic_depth != 24) {
475 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
476 exit (1);
478 tcx_init(hwdef->tcx_base, hwdef->vram_size, graphic_width, graphic_height,
479 graphic_depth);
481 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
483 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
484 hwdef->nvram_size, 8);
486 slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq],
487 slavio_cpu_irq, smp_cpus);
489 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
490 nographic, ESCC_CLOCK, 1);
491 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
492 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
493 escc_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], slavio_irq[hwdef->ser_irq],
494 serial_hds[0], serial_hds[1], ESCC_CLOCK, 1);
496 cpu_halt = qemu_allocate_irqs(cpu_halt_signal, NULL, 1);
497 slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base,
498 hwdef->aux1_base, hwdef->aux2_base,
499 slavio_irq[hwdef->me_irq], cpu_halt[0],
500 &fdc_tc);
502 if (hwdef->fd_base) {
503 /* there is zero or one floppy drive */
504 memset(fd, 0, sizeof(fd));
505 drive_index = drive_get_index(IF_FLOPPY, 0, 0);
506 if (drive_index != -1)
507 fd[0] = drives_table[drive_index].bdrv;
509 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
510 fdc_tc);
513 if (drive_get_max_bus(IF_SCSI) > 0) {
514 fprintf(stderr, "qemu: too many SCSI bus\n");
515 exit(1);
518 main_esp = esp_init(hwdef->esp_base, 2,
519 espdma_memory_read, espdma_memory_write,
520 espdma, *espdma_irq, esp_reset);
522 for (i = 0; i < ESP_MAX_DEVS; i++) {
523 drive_index = drive_get_index(IF_SCSI, 0, i);
524 if (drive_index == -1)
525 continue;
526 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
529 if (hwdef->cs_base)
530 cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
532 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
533 RAM_size);
535 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
536 boot_device, RAM_size, kernel_size, graphic_width,
537 graphic_height, graphic_depth, hwdef->nvram_machine_id,
538 "Sun4m");
540 if (hwdef->ecc_base)
541 ecc_init(hwdef->ecc_base, slavio_irq[hwdef->ecc_irq],
542 hwdef->ecc_version);
544 fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
545 fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
546 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
547 fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
548 fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
549 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
550 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
551 if (kernel_cmdline) {
552 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
553 pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
554 } else {
555 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
557 fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
558 fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
559 fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
560 qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
563 enum {
564 ss2_id = 0,
565 ss5_id = 32,
566 vger_id,
567 lx_id,
568 ss4_id,
569 scls_id,
570 sbook_id,
571 ss10_id = 64,
572 ss20_id,
573 ss600mp_id,
574 ss1000_id = 96,
575 ss2000_id,
578 static const struct sun4m_hwdef sun4m_hwdefs[] = {
579 /* SS-5 */
581 .iommu_base = 0x10000000,
582 .tcx_base = 0x50000000,
583 .cs_base = 0x6c000000,
584 .slavio_base = 0x70000000,
585 .ms_kb_base = 0x71000000,
586 .serial_base = 0x71100000,
587 .nvram_base = 0x71200000,
588 .fd_base = 0x71400000,
589 .counter_base = 0x71d00000,
590 .intctl_base = 0x71e00000,
591 .idreg_base = 0x78000000,
592 .dma_base = 0x78400000,
593 .esp_base = 0x78800000,
594 .le_base = 0x78c00000,
595 .apc_base = 0x6a000000,
596 .aux1_base = 0x71900000,
597 .aux2_base = 0x71910000,
598 .vram_size = 0x00100000,
599 .nvram_size = 0x2000,
600 .esp_irq = 18,
601 .le_irq = 16,
602 .clock_irq = 7,
603 .clock1_irq = 19,
604 .ms_kb_irq = 14,
605 .ser_irq = 15,
606 .fd_irq = 22,
607 .me_irq = 30,
608 .cs_irq = 5,
609 .nvram_machine_id = 0x80,
610 .machine_id = ss5_id,
611 .iommu_version = 0x05000000,
612 .intbit_to_level = {
613 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
614 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
616 .max_mem = 0x10000000,
617 .default_cpu_model = "Fujitsu MB86904",
619 /* SS-10 */
621 .iommu_base = 0xfe0000000ULL,
622 .tcx_base = 0xe20000000ULL,
623 .slavio_base = 0xff0000000ULL,
624 .ms_kb_base = 0xff1000000ULL,
625 .serial_base = 0xff1100000ULL,
626 .nvram_base = 0xff1200000ULL,
627 .fd_base = 0xff1700000ULL,
628 .counter_base = 0xff1300000ULL,
629 .intctl_base = 0xff1400000ULL,
630 .idreg_base = 0xef0000000ULL,
631 .dma_base = 0xef0400000ULL,
632 .esp_base = 0xef0800000ULL,
633 .le_base = 0xef0c00000ULL,
634 .apc_base = 0xefa000000ULL, // XXX should not exist
635 .aux1_base = 0xff1800000ULL,
636 .aux2_base = 0xff1a01000ULL,
637 .ecc_base = 0xf00000000ULL,
638 .ecc_version = 0x10000000, // version 0, implementation 1
639 .vram_size = 0x00100000,
640 .nvram_size = 0x2000,
641 .esp_irq = 18,
642 .le_irq = 16,
643 .clock_irq = 7,
644 .clock1_irq = 19,
645 .ms_kb_irq = 14,
646 .ser_irq = 15,
647 .fd_irq = 22,
648 .me_irq = 30,
649 .ecc_irq = 28,
650 .nvram_machine_id = 0x72,
651 .machine_id = ss10_id,
652 .iommu_version = 0x03000000,
653 .intbit_to_level = {
654 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
655 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
657 .max_mem = 0xf00000000ULL,
658 .default_cpu_model = "TI SuperSparc II",
660 /* SS-600MP */
662 .iommu_base = 0xfe0000000ULL,
663 .tcx_base = 0xe20000000ULL,
664 .slavio_base = 0xff0000000ULL,
665 .ms_kb_base = 0xff1000000ULL,
666 .serial_base = 0xff1100000ULL,
667 .nvram_base = 0xff1200000ULL,
668 .counter_base = 0xff1300000ULL,
669 .intctl_base = 0xff1400000ULL,
670 .dma_base = 0xef0081000ULL,
671 .esp_base = 0xef0080000ULL,
672 .le_base = 0xef0060000ULL,
673 .apc_base = 0xefa000000ULL, // XXX should not exist
674 .aux1_base = 0xff1800000ULL,
675 .aux2_base = 0xff1a01000ULL, // XXX should not exist
676 .ecc_base = 0xf00000000ULL,
677 .ecc_version = 0x00000000, // version 0, implementation 0
678 .vram_size = 0x00100000,
679 .nvram_size = 0x2000,
680 .esp_irq = 18,
681 .le_irq = 16,
682 .clock_irq = 7,
683 .clock1_irq = 19,
684 .ms_kb_irq = 14,
685 .ser_irq = 15,
686 .fd_irq = 22,
687 .me_irq = 30,
688 .ecc_irq = 28,
689 .nvram_machine_id = 0x71,
690 .machine_id = ss600mp_id,
691 .iommu_version = 0x01000000,
692 .intbit_to_level = {
693 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
694 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
696 .max_mem = 0xf00000000ULL,
697 .default_cpu_model = "TI SuperSparc II",
699 /* SS-20 */
701 .iommu_base = 0xfe0000000ULL,
702 .tcx_base = 0xe20000000ULL,
703 .slavio_base = 0xff0000000ULL,
704 .ms_kb_base = 0xff1000000ULL,
705 .serial_base = 0xff1100000ULL,
706 .nvram_base = 0xff1200000ULL,
707 .fd_base = 0xff1700000ULL,
708 .counter_base = 0xff1300000ULL,
709 .intctl_base = 0xff1400000ULL,
710 .idreg_base = 0xef0000000ULL,
711 .dma_base = 0xef0400000ULL,
712 .esp_base = 0xef0800000ULL,
713 .le_base = 0xef0c00000ULL,
714 .apc_base = 0xefa000000ULL, // XXX should not exist
715 .aux1_base = 0xff1800000ULL,
716 .aux2_base = 0xff1a01000ULL,
717 .ecc_base = 0xf00000000ULL,
718 .ecc_version = 0x20000000, // version 0, implementation 2
719 .vram_size = 0x00100000,
720 .nvram_size = 0x2000,
721 .esp_irq = 18,
722 .le_irq = 16,
723 .clock_irq = 7,
724 .clock1_irq = 19,
725 .ms_kb_irq = 14,
726 .ser_irq = 15,
727 .fd_irq = 22,
728 .me_irq = 30,
729 .ecc_irq = 28,
730 .nvram_machine_id = 0x72,
731 .machine_id = ss20_id,
732 .iommu_version = 0x13000000,
733 .intbit_to_level = {
734 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
735 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
737 .max_mem = 0xf00000000ULL,
738 .default_cpu_model = "TI SuperSparc II",
740 /* Voyager */
742 .iommu_base = 0x10000000,
743 .tcx_base = 0x50000000,
744 .slavio_base = 0x70000000,
745 .ms_kb_base = 0x71000000,
746 .serial_base = 0x71100000,
747 .nvram_base = 0x71200000,
748 .fd_base = 0x71400000,
749 .counter_base = 0x71d00000,
750 .intctl_base = 0x71e00000,
751 .idreg_base = 0x78000000,
752 .dma_base = 0x78400000,
753 .esp_base = 0x78800000,
754 .le_base = 0x78c00000,
755 .apc_base = 0x71300000, // pmc
756 .aux1_base = 0x71900000,
757 .aux2_base = 0x71910000,
758 .vram_size = 0x00100000,
759 .nvram_size = 0x2000,
760 .esp_irq = 18,
761 .le_irq = 16,
762 .clock_irq = 7,
763 .clock1_irq = 19,
764 .ms_kb_irq = 14,
765 .ser_irq = 15,
766 .fd_irq = 22,
767 .me_irq = 30,
768 .nvram_machine_id = 0x80,
769 .machine_id = vger_id,
770 .iommu_version = 0x05000000,
771 .intbit_to_level = {
772 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
773 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
775 .max_mem = 0x10000000,
776 .default_cpu_model = "Fujitsu MB86904",
778 /* LX */
780 .iommu_base = 0x10000000,
781 .tcx_base = 0x50000000,
782 .slavio_base = 0x70000000,
783 .ms_kb_base = 0x71000000,
784 .serial_base = 0x71100000,
785 .nvram_base = 0x71200000,
786 .fd_base = 0x71400000,
787 .counter_base = 0x71d00000,
788 .intctl_base = 0x71e00000,
789 .idreg_base = 0x78000000,
790 .dma_base = 0x78400000,
791 .esp_base = 0x78800000,
792 .le_base = 0x78c00000,
793 .aux1_base = 0x71900000,
794 .aux2_base = 0x71910000,
795 .vram_size = 0x00100000,
796 .nvram_size = 0x2000,
797 .esp_irq = 18,
798 .le_irq = 16,
799 .clock_irq = 7,
800 .clock1_irq = 19,
801 .ms_kb_irq = 14,
802 .ser_irq = 15,
803 .fd_irq = 22,
804 .me_irq = 30,
805 .nvram_machine_id = 0x80,
806 .machine_id = lx_id,
807 .iommu_version = 0x04000000,
808 .intbit_to_level = {
809 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
810 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
812 .max_mem = 0x10000000,
813 .default_cpu_model = "TI MicroSparc I",
815 /* SS-4 */
817 .iommu_base = 0x10000000,
818 .tcx_base = 0x50000000,
819 .cs_base = 0x6c000000,
820 .slavio_base = 0x70000000,
821 .ms_kb_base = 0x71000000,
822 .serial_base = 0x71100000,
823 .nvram_base = 0x71200000,
824 .fd_base = 0x71400000,
825 .counter_base = 0x71d00000,
826 .intctl_base = 0x71e00000,
827 .idreg_base = 0x78000000,
828 .dma_base = 0x78400000,
829 .esp_base = 0x78800000,
830 .le_base = 0x78c00000,
831 .apc_base = 0x6a000000,
832 .aux1_base = 0x71900000,
833 .aux2_base = 0x71910000,
834 .vram_size = 0x00100000,
835 .nvram_size = 0x2000,
836 .esp_irq = 18,
837 .le_irq = 16,
838 .clock_irq = 7,
839 .clock1_irq = 19,
840 .ms_kb_irq = 14,
841 .ser_irq = 15,
842 .fd_irq = 22,
843 .me_irq = 30,
844 .cs_irq = 5,
845 .nvram_machine_id = 0x80,
846 .machine_id = ss4_id,
847 .iommu_version = 0x05000000,
848 .intbit_to_level = {
849 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
850 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
852 .max_mem = 0x10000000,
853 .default_cpu_model = "Fujitsu MB86904",
855 /* SPARCClassic */
857 .iommu_base = 0x10000000,
858 .tcx_base = 0x50000000,
859 .slavio_base = 0x70000000,
860 .ms_kb_base = 0x71000000,
861 .serial_base = 0x71100000,
862 .nvram_base = 0x71200000,
863 .fd_base = 0x71400000,
864 .counter_base = 0x71d00000,
865 .intctl_base = 0x71e00000,
866 .idreg_base = 0x78000000,
867 .dma_base = 0x78400000,
868 .esp_base = 0x78800000,
869 .le_base = 0x78c00000,
870 .apc_base = 0x6a000000,
871 .aux1_base = 0x71900000,
872 .aux2_base = 0x71910000,
873 .vram_size = 0x00100000,
874 .nvram_size = 0x2000,
875 .esp_irq = 18,
876 .le_irq = 16,
877 .clock_irq = 7,
878 .clock1_irq = 19,
879 .ms_kb_irq = 14,
880 .ser_irq = 15,
881 .fd_irq = 22,
882 .me_irq = 30,
883 .nvram_machine_id = 0x80,
884 .machine_id = scls_id,
885 .iommu_version = 0x05000000,
886 .intbit_to_level = {
887 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
888 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
890 .max_mem = 0x10000000,
891 .default_cpu_model = "TI MicroSparc I",
893 /* SPARCbook */
895 .iommu_base = 0x10000000,
896 .tcx_base = 0x50000000, // XXX
897 .slavio_base = 0x70000000,
898 .ms_kb_base = 0x71000000,
899 .serial_base = 0x71100000,
900 .nvram_base = 0x71200000,
901 .fd_base = 0x71400000,
902 .counter_base = 0x71d00000,
903 .intctl_base = 0x71e00000,
904 .idreg_base = 0x78000000,
905 .dma_base = 0x78400000,
906 .esp_base = 0x78800000,
907 .le_base = 0x78c00000,
908 .apc_base = 0x6a000000,
909 .aux1_base = 0x71900000,
910 .aux2_base = 0x71910000,
911 .vram_size = 0x00100000,
912 .nvram_size = 0x2000,
913 .esp_irq = 18,
914 .le_irq = 16,
915 .clock_irq = 7,
916 .clock1_irq = 19,
917 .ms_kb_irq = 14,
918 .ser_irq = 15,
919 .fd_irq = 22,
920 .me_irq = 30,
921 .nvram_machine_id = 0x80,
922 .machine_id = sbook_id,
923 .iommu_version = 0x05000000,
924 .intbit_to_level = {
925 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
926 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
928 .max_mem = 0x10000000,
929 .default_cpu_model = "TI MicroSparc I",
933 /* SPARCstation 5 hardware initialisation */
934 static void ss5_init(ram_addr_t RAM_size, int vga_ram_size,
935 const char *boot_device,
936 const char *kernel_filename, const char *kernel_cmdline,
937 const char *initrd_filename, const char *cpu_model)
939 sun4m_hw_init(&sun4m_hwdefs[0], RAM_size, boot_device, kernel_filename,
940 kernel_cmdline, initrd_filename, cpu_model);
943 /* SPARCstation 10 hardware initialisation */
944 static void ss10_init(ram_addr_t RAM_size, int vga_ram_size,
945 const char *boot_device,
946 const char *kernel_filename, const char *kernel_cmdline,
947 const char *initrd_filename, const char *cpu_model)
949 sun4m_hw_init(&sun4m_hwdefs[1], RAM_size, boot_device, kernel_filename,
950 kernel_cmdline, initrd_filename, cpu_model);
953 /* SPARCserver 600MP hardware initialisation */
954 static void ss600mp_init(ram_addr_t RAM_size, int vga_ram_size,
955 const char *boot_device,
956 const char *kernel_filename,
957 const char *kernel_cmdline,
958 const char *initrd_filename, const char *cpu_model)
960 sun4m_hw_init(&sun4m_hwdefs[2], RAM_size, boot_device, kernel_filename,
961 kernel_cmdline, initrd_filename, cpu_model);
964 /* SPARCstation 20 hardware initialisation */
965 static void ss20_init(ram_addr_t RAM_size, int vga_ram_size,
966 const char *boot_device,
967 const char *kernel_filename, const char *kernel_cmdline,
968 const char *initrd_filename, const char *cpu_model)
970 sun4m_hw_init(&sun4m_hwdefs[3], RAM_size, boot_device, kernel_filename,
971 kernel_cmdline, initrd_filename, cpu_model);
974 /* SPARCstation Voyager hardware initialisation */
975 static void vger_init(ram_addr_t RAM_size, int vga_ram_size,
976 const char *boot_device,
977 const char *kernel_filename, const char *kernel_cmdline,
978 const char *initrd_filename, const char *cpu_model)
980 sun4m_hw_init(&sun4m_hwdefs[4], RAM_size, boot_device, kernel_filename,
981 kernel_cmdline, initrd_filename, cpu_model);
984 /* SPARCstation LX hardware initialisation */
985 static void ss_lx_init(ram_addr_t RAM_size, int vga_ram_size,
986 const char *boot_device,
987 const char *kernel_filename, const char *kernel_cmdline,
988 const char *initrd_filename, const char *cpu_model)
990 sun4m_hw_init(&sun4m_hwdefs[5], RAM_size, boot_device, kernel_filename,
991 kernel_cmdline, initrd_filename, cpu_model);
994 /* SPARCstation 4 hardware initialisation */
995 static void ss4_init(ram_addr_t RAM_size, int vga_ram_size,
996 const char *boot_device,
997 const char *kernel_filename, const char *kernel_cmdline,
998 const char *initrd_filename, const char *cpu_model)
1000 sun4m_hw_init(&sun4m_hwdefs[6], RAM_size, boot_device, kernel_filename,
1001 kernel_cmdline, initrd_filename, cpu_model);
1004 /* SPARCClassic hardware initialisation */
1005 static void scls_init(ram_addr_t RAM_size, int vga_ram_size,
1006 const char *boot_device,
1007 const char *kernel_filename, const char *kernel_cmdline,
1008 const char *initrd_filename, const char *cpu_model)
1010 sun4m_hw_init(&sun4m_hwdefs[7], RAM_size, boot_device, kernel_filename,
1011 kernel_cmdline, initrd_filename, cpu_model);
1014 /* SPARCbook hardware initialisation */
1015 static void sbook_init(ram_addr_t RAM_size, int vga_ram_size,
1016 const char *boot_device,
1017 const char *kernel_filename, const char *kernel_cmdline,
1018 const char *initrd_filename, const char *cpu_model)
1020 sun4m_hw_init(&sun4m_hwdefs[8], RAM_size, boot_device, kernel_filename,
1021 kernel_cmdline, initrd_filename, cpu_model);
1024 QEMUMachine ss5_machine = {
1025 .name = "SS-5",
1026 .desc = "Sun4m platform, SPARCstation 5",
1027 .init = ss5_init,
1028 .use_scsi = 1,
1031 QEMUMachine ss10_machine = {
1032 .name = "SS-10",
1033 .desc = "Sun4m platform, SPARCstation 10",
1034 .init = ss10_init,
1035 .use_scsi = 1,
1036 .max_cpus = 4,
1039 QEMUMachine ss600mp_machine = {
1040 .name = "SS-600MP",
1041 .desc = "Sun4m platform, SPARCserver 600MP",
1042 .init = ss600mp_init,
1043 .use_scsi = 1,
1044 .max_cpus = 4,
1047 QEMUMachine ss20_machine = {
1048 .name = "SS-20",
1049 .desc = "Sun4m platform, SPARCstation 20",
1050 .init = ss20_init,
1051 .use_scsi = 1,
1052 .max_cpus = 4,
1055 QEMUMachine voyager_machine = {
1056 .name = "Voyager",
1057 .desc = "Sun4m platform, SPARCstation Voyager",
1058 .init = vger_init,
1059 .use_scsi = 1,
1062 QEMUMachine ss_lx_machine = {
1063 .name = "LX",
1064 .desc = "Sun4m platform, SPARCstation LX",
1065 .init = ss_lx_init,
1066 .use_scsi = 1,
1069 QEMUMachine ss4_machine = {
1070 .name = "SS-4",
1071 .desc = "Sun4m platform, SPARCstation 4",
1072 .init = ss4_init,
1073 .use_scsi = 1,
1076 QEMUMachine scls_machine = {
1077 .name = "SPARCClassic",
1078 .desc = "Sun4m platform, SPARCClassic",
1079 .init = scls_init,
1080 .use_scsi = 1,
1083 QEMUMachine sbook_machine = {
1084 .name = "SPARCbook",
1085 .desc = "Sun4m platform, SPARCbook",
1086 .init = sbook_init,
1087 .use_scsi = 1,
1090 static const struct sun4d_hwdef sun4d_hwdefs[] = {
1091 /* SS-1000 */
1093 .iounit_bases = {
1094 0xfe0200000ULL,
1095 0xfe1200000ULL,
1096 0xfe2200000ULL,
1097 0xfe3200000ULL,
1100 .tcx_base = 0x820000000ULL,
1101 .slavio_base = 0xf00000000ULL,
1102 .ms_kb_base = 0xf00240000ULL,
1103 .serial_base = 0xf00200000ULL,
1104 .nvram_base = 0xf00280000ULL,
1105 .counter_base = 0xf00300000ULL,
1106 .espdma_base = 0x800081000ULL,
1107 .esp_base = 0x800080000ULL,
1108 .ledma_base = 0x800040000ULL,
1109 .le_base = 0x800060000ULL,
1110 .sbi_base = 0xf02800000ULL,
1111 .vram_size = 0x00100000,
1112 .nvram_size = 0x2000,
1113 .esp_irq = 3,
1114 .le_irq = 4,
1115 .clock_irq = 14,
1116 .clock1_irq = 10,
1117 .ms_kb_irq = 12,
1118 .ser_irq = 12,
1119 .nvram_machine_id = 0x80,
1120 .machine_id = ss1000_id,
1121 .iounit_version = 0x03000000,
1122 .max_mem = 0xf00000000ULL,
1123 .default_cpu_model = "TI SuperSparc II",
1125 /* SS-2000 */
1127 .iounit_bases = {
1128 0xfe0200000ULL,
1129 0xfe1200000ULL,
1130 0xfe2200000ULL,
1131 0xfe3200000ULL,
1132 0xfe4200000ULL,
1134 .tcx_base = 0x820000000ULL,
1135 .slavio_base = 0xf00000000ULL,
1136 .ms_kb_base = 0xf00240000ULL,
1137 .serial_base = 0xf00200000ULL,
1138 .nvram_base = 0xf00280000ULL,
1139 .counter_base = 0xf00300000ULL,
1140 .espdma_base = 0x800081000ULL,
1141 .esp_base = 0x800080000ULL,
1142 .ledma_base = 0x800040000ULL,
1143 .le_base = 0x800060000ULL,
1144 .sbi_base = 0xf02800000ULL,
1145 .vram_size = 0x00100000,
1146 .nvram_size = 0x2000,
1147 .esp_irq = 3,
1148 .le_irq = 4,
1149 .clock_irq = 14,
1150 .clock1_irq = 10,
1151 .ms_kb_irq = 12,
1152 .ser_irq = 12,
1153 .nvram_machine_id = 0x80,
1154 .machine_id = ss2000_id,
1155 .iounit_version = 0x03000000,
1156 .max_mem = 0xf00000000ULL,
1157 .default_cpu_model = "TI SuperSparc II",
1161 static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1162 const char *boot_device,
1163 const char *kernel_filename,
1164 const char *kernel_cmdline,
1165 const char *initrd_filename, const char *cpu_model)
1167 CPUState *env, *envs[MAX_CPUS];
1168 unsigned int i;
1169 void *iounits[MAX_IOUNITS], *espdma, *ledma, *main_esp, *nvram, *sbi;
1170 qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq,
1171 *espdma_irq, *ledma_irq;
1172 qemu_irq *esp_reset, *le_reset;
1173 ram_addr_t ram_offset, prom_offset;
1174 unsigned long kernel_size;
1175 int ret;
1176 char buf[1024];
1177 int drive_index;
1178 void *fw_cfg;
1180 /* init CPUs */
1181 if (!cpu_model)
1182 cpu_model = hwdef->default_cpu_model;
1184 for (i = 0; i < smp_cpus; i++) {
1185 env = cpu_init(cpu_model);
1186 if (!env) {
1187 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
1188 exit(1);
1190 cpu_sparc_set_id(env, i);
1191 envs[i] = env;
1192 if (i == 0) {
1193 qemu_register_reset(main_cpu_reset, env);
1194 } else {
1195 qemu_register_reset(secondary_cpu_reset, env);
1196 env->halted = 1;
1198 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
1199 env->prom_addr = hwdef->slavio_base;
1202 for (i = smp_cpus; i < MAX_CPUS; i++)
1203 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
1205 /* allocate RAM */
1206 if ((uint64_t)RAM_size > hwdef->max_mem) {
1207 fprintf(stderr,
1208 "qemu: Too much memory for this machine: %d, maximum %d\n",
1209 (unsigned int)(RAM_size / (1024 * 1024)),
1210 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
1211 exit(1);
1213 ram_offset = qemu_ram_alloc(RAM_size);
1214 cpu_register_physical_memory(0, RAM_size, ram_offset);
1216 /* load boot prom */
1217 prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);
1218 cpu_register_physical_memory(hwdef->slavio_base,
1219 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
1220 TARGET_PAGE_MASK,
1221 prom_offset | IO_MEM_ROM);
1223 if (bios_name == NULL)
1224 bios_name = PROM_FILENAME;
1225 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
1226 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
1227 if (ret < 0 || ret > PROM_SIZE_MAX)
1228 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
1229 if (ret < 0 || ret > PROM_SIZE_MAX) {
1230 fprintf(stderr, "qemu: could not load prom '%s'\n",
1231 buf);
1232 exit(1);
1235 /* set up devices */
1236 sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs);
1238 for (i = 0; i < MAX_IOUNITS; i++)
1239 if (hwdef->iounit_bases[i] != (target_phys_addr_t)-1)
1240 iounits[i] = iommu_init(hwdef->iounit_bases[i],
1241 hwdef->iounit_version,
1242 sbi_irq[hwdef->me_irq]);
1244 espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[hwdef->esp_irq],
1245 iounits[0], &espdma_irq, &esp_reset);
1247 ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[hwdef->le_irq],
1248 iounits[0], &ledma_irq, &le_reset);
1250 if (graphic_depth != 8 && graphic_depth != 24) {
1251 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
1252 exit (1);
1254 tcx_init(hwdef->tcx_base, hwdef->vram_size, graphic_width, graphic_height,
1255 graphic_depth);
1257 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
1259 nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0,
1260 hwdef->nvram_size, 8);
1262 slavio_timer_init_all(hwdef->counter_base, sbi_irq[hwdef->clock1_irq],
1263 sbi_cpu_irq, smp_cpus);
1265 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[hwdef->ms_kb_irq],
1266 nographic, ESCC_CLOCK, 1);
1267 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1268 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1269 escc_init(hwdef->serial_base, sbi_irq[hwdef->ser_irq], sbi_irq[hwdef->ser_irq],
1270 serial_hds[0], serial_hds[1], ESCC_CLOCK, 1);
1272 if (drive_get_max_bus(IF_SCSI) > 0) {
1273 fprintf(stderr, "qemu: too many SCSI bus\n");
1274 exit(1);
1277 main_esp = esp_init(hwdef->esp_base, 2,
1278 espdma_memory_read, espdma_memory_write,
1279 espdma, *espdma_irq, esp_reset);
1281 for (i = 0; i < ESP_MAX_DEVS; i++) {
1282 drive_index = drive_get_index(IF_SCSI, 0, i);
1283 if (drive_index == -1)
1284 continue;
1285 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
1288 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
1289 RAM_size);
1291 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
1292 boot_device, RAM_size, kernel_size, graphic_width,
1293 graphic_height, graphic_depth, hwdef->nvram_machine_id,
1294 "Sun4d");
1296 fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
1297 fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
1298 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
1299 fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
1300 fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
1301 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
1302 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
1303 if (kernel_cmdline) {
1304 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
1305 pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
1306 } else {
1307 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
1309 fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
1310 fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
1311 fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
1312 qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
1315 /* SPARCserver 1000 hardware initialisation */
1316 static void ss1000_init(ram_addr_t RAM_size, int vga_ram_size,
1317 const char *boot_device,
1318 const char *kernel_filename, const char *kernel_cmdline,
1319 const char *initrd_filename, const char *cpu_model)
1321 sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, kernel_filename,
1322 kernel_cmdline, initrd_filename, cpu_model);
1325 /* SPARCcenter 2000 hardware initialisation */
1326 static void ss2000_init(ram_addr_t RAM_size, int vga_ram_size,
1327 const char *boot_device,
1328 const char *kernel_filename, const char *kernel_cmdline,
1329 const char *initrd_filename, const char *cpu_model)
1331 sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, kernel_filename,
1332 kernel_cmdline, initrd_filename, cpu_model);
1335 QEMUMachine ss1000_machine = {
1336 .name = "SS-1000",
1337 .desc = "Sun4d platform, SPARCserver 1000",
1338 .init = ss1000_init,
1339 .use_scsi = 1,
1340 .max_cpus = 8,
1343 QEMUMachine ss2000_machine = {
1344 .name = "SS-2000",
1345 .desc = "Sun4d platform, SPARCcenter 2000",
1346 .init = ss2000_init,
1347 .use_scsi = 1,
1348 .max_cpus = 20,
1351 static const struct sun4c_hwdef sun4c_hwdefs[] = {
1352 /* SS-2 */
1354 .iommu_base = 0xf8000000,
1355 .tcx_base = 0xfe000000,
1356 .slavio_base = 0xf6000000,
1357 .intctl_base = 0xf5000000,
1358 .counter_base = 0xf3000000,
1359 .ms_kb_base = 0xf0000000,
1360 .serial_base = 0xf1000000,
1361 .nvram_base = 0xf2000000,
1362 .fd_base = 0xf7200000,
1363 .dma_base = 0xf8400000,
1364 .esp_base = 0xf8800000,
1365 .le_base = 0xf8c00000,
1366 .aux1_base = 0xf7400003,
1367 .vram_size = 0x00100000,
1368 .nvram_size = 0x800,
1369 .esp_irq = 2,
1370 .le_irq = 3,
1371 .clock_irq = 5,
1372 .clock1_irq = 7,
1373 .ms_kb_irq = 1,
1374 .ser_irq = 1,
1375 .fd_irq = 1,
1376 .me_irq = 1,
1377 .nvram_machine_id = 0x55,
1378 .machine_id = ss2_id,
1379 .max_mem = 0x10000000,
1380 .default_cpu_model = "Cypress CY7C601",
1384 static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1385 const char *boot_device,
1386 const char *kernel_filename,
1387 const char *kernel_cmdline,
1388 const char *initrd_filename, const char *cpu_model)
1390 CPUState *env;
1391 unsigned int i;
1392 void *iommu, *espdma, *ledma, *main_esp, *nvram;
1393 qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq;
1394 qemu_irq *esp_reset, *le_reset;
1395 qemu_irq *fdc_tc;
1396 ram_addr_t ram_offset, prom_offset;
1397 unsigned long kernel_size;
1398 int ret;
1399 char buf[1024];
1400 BlockDriverState *fd[MAX_FD];
1401 int drive_index;
1402 void *fw_cfg;
1404 /* init CPU */
1405 if (!cpu_model)
1406 cpu_model = hwdef->default_cpu_model;
1408 env = cpu_init(cpu_model);
1409 if (!env) {
1410 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
1411 exit(1);
1414 cpu_sparc_set_id(env, 0);
1416 qemu_register_reset(main_cpu_reset, env);
1417 cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS);
1418 env->prom_addr = hwdef->slavio_base;
1420 /* allocate RAM */
1421 if ((uint64_t)RAM_size > hwdef->max_mem) {
1422 fprintf(stderr,
1423 "qemu: Too much memory for this machine: %d, maximum %d\n",
1424 (unsigned int)(RAM_size / (1024 * 1024)),
1425 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
1426 exit(1);
1428 ram_offset = qemu_ram_alloc(RAM_size);
1429 cpu_register_physical_memory(0, RAM_size, ram_offset);
1431 /* load boot prom */
1432 prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);
1433 cpu_register_physical_memory(hwdef->slavio_base,
1434 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
1435 TARGET_PAGE_MASK,
1436 prom_offset | IO_MEM_ROM);
1438 if (bios_name == NULL)
1439 bios_name = PROM_FILENAME;
1440 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
1441 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
1442 if (ret < 0 || ret > PROM_SIZE_MAX)
1443 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
1444 if (ret < 0 || ret > PROM_SIZE_MAX) {
1445 fprintf(stderr, "qemu: could not load prom '%s'\n",
1446 buf);
1447 exit(1);
1450 /* set up devices */
1451 slavio_intctl = sun4c_intctl_init(hwdef->intctl_base,
1452 &slavio_irq, cpu_irqs);
1454 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
1455 slavio_irq[hwdef->me_irq]);
1457 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
1458 iommu, &espdma_irq, &esp_reset);
1460 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
1461 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
1462 &le_reset);
1464 if (graphic_depth != 8 && graphic_depth != 24) {
1465 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
1466 exit (1);
1468 tcx_init(hwdef->tcx_base, hwdef->vram_size, graphic_width, graphic_height,
1469 graphic_depth);
1471 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
1473 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
1474 hwdef->nvram_size, 2);
1476 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
1477 nographic, ESCC_CLOCK, 1);
1478 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1479 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1480 escc_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
1481 slavio_irq[hwdef->ser_irq], serial_hds[0], serial_hds[1],
1482 ESCC_CLOCK, 1);
1484 slavio_misc = slavio_misc_init(0, 0, hwdef->aux1_base, 0,
1485 slavio_irq[hwdef->me_irq], NULL, &fdc_tc);
1487 if (hwdef->fd_base != (target_phys_addr_t)-1) {
1488 /* there is zero or one floppy drive */
1489 memset(fd, 0, sizeof(fd));
1490 drive_index = drive_get_index(IF_FLOPPY, 0, 0);
1491 if (drive_index != -1)
1492 fd[0] = drives_table[drive_index].bdrv;
1494 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
1495 fdc_tc);
1498 if (drive_get_max_bus(IF_SCSI) > 0) {
1499 fprintf(stderr, "qemu: too many SCSI bus\n");
1500 exit(1);
1503 main_esp = esp_init(hwdef->esp_base, 2,
1504 espdma_memory_read, espdma_memory_write,
1505 espdma, *espdma_irq, esp_reset);
1507 for (i = 0; i < ESP_MAX_DEVS; i++) {
1508 drive_index = drive_get_index(IF_SCSI, 0, i);
1509 if (drive_index == -1)
1510 continue;
1511 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
1514 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
1515 RAM_size);
1517 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
1518 boot_device, RAM_size, kernel_size, graphic_width,
1519 graphic_height, graphic_depth, hwdef->nvram_machine_id,
1520 "Sun4c");
1522 fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
1523 fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
1524 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
1525 fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
1526 fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
1527 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
1528 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
1529 if (kernel_cmdline) {
1530 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
1531 pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
1532 } else {
1533 fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
1535 fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
1536 fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
1537 fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
1538 qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
1541 /* SPARCstation 2 hardware initialisation */
1542 static void ss2_init(ram_addr_t RAM_size, int vga_ram_size,
1543 const char *boot_device,
1544 const char *kernel_filename, const char *kernel_cmdline,
1545 const char *initrd_filename, const char *cpu_model)
1547 sun4c_hw_init(&sun4c_hwdefs[0], RAM_size, boot_device, kernel_filename,
1548 kernel_cmdline, initrd_filename, cpu_model);
1551 QEMUMachine ss2_machine = {
1552 .name = "SS-2",
1553 .desc = "Sun4c platform, SPARCstation 2",
1554 .init = ss2_init,
1555 .use_scsi = 1,