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
25 #include "qemu-timer.h"
28 #include "sparc32_dma.h"
33 #include "firmware_abi.h"
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
55 * Sun4d architecture was used in the following machines:
60 * Sun4c architecture was used in the following machines:
61 * SPARCstation 1/1+, SPARCserver 1/1+
67 * See for example: http://www.sunhelp.org/faq/sunref1.html
71 #define DPRINTF(fmt, ...) \
72 do { printf("CPUIRQ: " fmt , ## __VA_ARGS__); } while (0)
74 #define DPRINTF(fmt, ...)
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)
89 #define ESCC_CLOCK 4915200
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
;
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
;
106 uint32_t iommu_version
;
107 uint32_t intbit_to_level
[32];
109 const char * const default_cpu_model
;
112 #define MAX_IOUNITS 5
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
;
128 uint32_t iounit_version
;
130 const char * const default_cpu_model
;
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
;
146 uint32_t iommu_version
;
147 uint32_t intbit_to_level
[32];
149 const char * const default_cpu_model
;
152 int DMA_get_channel_mode (int nchan
)
156 int DMA_read_memory (int nchan
, void *buf
, int pos
, int size
)
160 int DMA_write_memory (int nchan
, void *buf
, int pos
, int size
)
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
,
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]);
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
)
188 uint8_t image
[0x1ff0];
189 struct OpenBIOS_nvpart_v1
*part_header
;
191 memset(image
, '\0', sizeof(image
));
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
]);
208 end
= start
+ ((end
- start
+ 15) & ~15);
209 OpenBIOS_finish_partition(part_header
, end
- start
);
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");
218 OpenBIOS_finish_partition(part_header
, end
- start
);
220 Sun_init_header((struct Sun_nvram
*)&image
[0x1fd8], macaddr
,
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
)
232 slavio_pic_info(mon
, slavio_intctl
);
235 void irq_info(Monitor
*mon
)
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
)) {
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
);
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
;
271 DPRINTF("Raise CPU IRQ %d\n", irq
);
273 env
->pil_in
|= 1 << irq
;
276 DPRINTF("Lower CPU IRQ %d\n", irq
);
277 env
->pil_in
&= ~(1 << irq
);
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
;
301 static void secondary_cpu_reset(void *opaque
)
303 CPUState
*env
= opaque
;
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
,
321 long initrd_size
, kernel_size
;
323 linux_boot
= (kernel_filename
!= NULL
);
327 kernel_size
= load_elf(kernel_filename
, -0xf0000000ULL
, NULL
, NULL
,
330 kernel_size
= load_aout(kernel_filename
, KERNEL_LOAD_ADDR
,
331 RAM_size
- KERNEL_LOAD_ADDR
);
333 kernel_size
= load_image_targphys(kernel_filename
,
335 RAM_size
- KERNEL_LOAD_ADDR
);
336 if (kernel_size
< 0) {
337 fprintf(stderr
, "qemu: could not load kernel '%s'\n",
344 if (initrd_filename
) {
345 initrd_size
= load_image_targphys(initrd_filename
,
347 RAM_size
- INITRD_LOAD_ADDR
);
348 if (initrd_size
< 0) {
349 fprintf(stderr
, "qemu: could not load initial ram disk '%s'\n",
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
);
367 static void lance_init(NICInfo
*nd
, target_phys_addr_t leaddr
,
368 void *dma_opaque
, qemu_irq irq
, qemu_irq
*reset
)
373 qemu_check_nic_model(&nd_table
[0], "lance");
375 dev
= qdev_create(NULL
, "lance");
376 qdev_set_netdev(dev
, nd
);
377 qdev_set_prop_ptr(dev
, "dma", dma_opaque
);
379 s
= sysbus_from_qdev(dev
);
380 sysbus_mmio_map(s
, 0, leaddr
);
381 sysbus_connect_irq(s
, 0, irq
);
382 *reset
= qdev_get_gpio_in(dev
, 0);
385 static void sun4m_hw_init(const struct sun4m_hwdef
*hwdef
, ram_addr_t RAM_size
,
386 const char *boot_device
,
387 const char *kernel_filename
,
388 const char *kernel_cmdline
,
389 const char *initrd_filename
, const char *cpu_model
)
392 CPUState
*env
, *envs
[MAX_CPUS
];
394 void *iommu
, *espdma
, *ledma
, *nvram
;
395 qemu_irq
*cpu_irqs
[MAX_CPUS
], *slavio_irq
, *slavio_cpu_irq
,
396 *espdma_irq
, *ledma_irq
;
397 qemu_irq
*esp_reset
, *le_reset
;
400 ram_addr_t ram_offset
, prom_offset
, idreg_offset
;
401 unsigned long kernel_size
;
404 BlockDriverState
*fd
[MAX_FD
];
410 cpu_model
= hwdef
->default_cpu_model
;
412 for(i
= 0; i
< smp_cpus
; i
++) {
413 env
= cpu_init(cpu_model
);
415 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
418 cpu_sparc_set_id(env
, i
);
421 qemu_register_reset(main_cpu_reset
, 0, env
);
423 qemu_register_reset(secondary_cpu_reset
, 0, env
);
426 cpu_irqs
[i
] = qemu_allocate_irqs(cpu_set_irq
, envs
[i
], MAX_PILS
);
427 env
->prom_addr
= hwdef
->slavio_base
;
430 for (i
= smp_cpus
; i
< MAX_CPUS
; i
++)
431 cpu_irqs
[i
] = qemu_allocate_irqs(dummy_cpu_set_irq
, NULL
, MAX_PILS
);
435 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
437 "qemu: Too much memory for this machine: %d, maximum %d\n",
438 (unsigned int)(RAM_size
/ (1024 * 1024)),
439 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
442 ram_offset
= qemu_ram_alloc(RAM_size
);
443 cpu_register_physical_memory(0, RAM_size
, ram_offset
);
446 prom_offset
= qemu_ram_alloc(PROM_SIZE_MAX
);
447 cpu_register_physical_memory(hwdef
->slavio_base
,
448 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
450 prom_offset
| IO_MEM_ROM
);
452 if (bios_name
== NULL
)
453 bios_name
= PROM_FILENAME
;
454 filename
= qemu_find_file(QEMU_FILE_TYPE_BIOS
, bios_name
);
456 ret
= load_elf(filename
, hwdef
->slavio_base
- PROM_VADDR
,
458 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
459 ret
= load_image_targphys(filename
, hwdef
->slavio_base
,
465 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
466 fprintf(stderr
, "qemu: could not load prom '%s'\n",
472 slavio_intctl
= slavio_intctl_init(hwdef
->intctl_base
,
473 hwdef
->intctl_base
+ 0x10000ULL
,
474 &hwdef
->intbit_to_level
[0],
475 &slavio_irq
, &slavio_cpu_irq
,
479 if (hwdef
->idreg_base
) {
480 static const uint8_t idreg_data
[] = { 0xfe, 0x81, 0x01, 0x03 };
482 idreg_offset
= qemu_ram_alloc(sizeof(idreg_data
));
483 cpu_register_physical_memory(hwdef
->idreg_base
, sizeof(idreg_data
),
484 idreg_offset
| IO_MEM_ROM
);
485 cpu_physical_memory_write_rom(hwdef
->idreg_base
, idreg_data
,
489 iommu
= iommu_init(hwdef
->iommu_base
, hwdef
->iommu_version
,
490 slavio_irq
[hwdef
->me_irq
]);
492 espdma
= sparc32_dma_init(hwdef
->dma_base
, slavio_irq
[hwdef
->esp_irq
],
493 iommu
, &espdma_irq
, &esp_reset
);
495 ledma
= sparc32_dma_init(hwdef
->dma_base
+ 16ULL,
496 slavio_irq
[hwdef
->le_irq
], iommu
, &ledma_irq
,
499 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
500 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
503 tcx_init(hwdef
->tcx_base
, hwdef
->vram_size
, graphic_width
, graphic_height
,
506 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
508 nvram
= m48t59_init(slavio_irq
[0], hwdef
->nvram_base
, 0,
509 hwdef
->nvram_size
, 8);
511 slavio_timer_init_all(hwdef
->counter_base
, slavio_irq
[hwdef
->clock1_irq
],
512 slavio_cpu_irq
, smp_cpus
);
514 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, slavio_irq
[hwdef
->ms_kb_irq
],
515 display_type
== DT_NOGRAPHIC
, ESCC_CLOCK
, 1);
516 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
517 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
518 escc_init(hwdef
->serial_base
, slavio_irq
[hwdef
->ser_irq
], slavio_irq
[hwdef
->ser_irq
],
519 serial_hds
[0], serial_hds
[1], ESCC_CLOCK
, 1);
521 cpu_halt
= qemu_allocate_irqs(cpu_halt_signal
, NULL
, 1);
522 slavio_misc
= slavio_misc_init(hwdef
->slavio_base
, hwdef
->apc_base
,
523 hwdef
->aux1_base
, hwdef
->aux2_base
,
524 slavio_irq
[hwdef
->me_irq
], cpu_halt
[0],
527 if (hwdef
->fd_base
) {
528 /* there is zero or one floppy drive */
529 memset(fd
, 0, sizeof(fd
));
530 drive_index
= drive_get_index(IF_FLOPPY
, 0, 0);
531 if (drive_index
!= -1)
532 fd
[0] = drives_table
[drive_index
].bdrv
;
534 sun4m_fdctrl_init(slavio_irq
[hwdef
->fd_irq
], hwdef
->fd_base
, fd
,
538 if (drive_get_max_bus(IF_SCSI
) > 0) {
539 fprintf(stderr
, "qemu: too many SCSI bus\n");
543 esp_init(hwdef
->esp_base
, 2,
544 espdma_memory_read
, espdma_memory_write
,
545 espdma
, *espdma_irq
, esp_reset
);
548 cs_init(hwdef
->cs_base
, hwdef
->cs_irq
, slavio_intctl
);
550 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
553 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
554 boot_device
, RAM_size
, kernel_size
, graphic_width
,
555 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
559 ecc_init(hwdef
->ecc_base
, slavio_irq
[hwdef
->ecc_irq
],
562 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
563 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
564 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
565 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
566 fw_cfg_add_i16(fw_cfg
, FW_CFG_SUN4M_DEPTH
, graphic_depth
);
567 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_ADDR
, KERNEL_LOAD_ADDR
);
568 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_SIZE
, kernel_size
);
569 if (kernel_cmdline
) {
570 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_CMDLINE
, CMDLINE_ADDR
);
571 pstrcpy_targphys(CMDLINE_ADDR
, TARGET_PAGE_SIZE
, kernel_cmdline
);
573 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_CMDLINE
, 0);
575 fw_cfg_add_i32(fw_cfg
, FW_CFG_INITRD_ADDR
, INITRD_LOAD_ADDR
);
576 fw_cfg_add_i32(fw_cfg
, FW_CFG_INITRD_SIZE
, 0); // not used
577 fw_cfg_add_i16(fw_cfg
, FW_CFG_BOOT_DEVICE
, boot_device
[0]);
578 qemu_register_boot_set(fw_cfg_boot_set
, fw_cfg
);
596 static const struct sun4m_hwdef sun4m_hwdefs
[] = {
599 .iommu_base
= 0x10000000,
600 .tcx_base
= 0x50000000,
601 .cs_base
= 0x6c000000,
602 .slavio_base
= 0x70000000,
603 .ms_kb_base
= 0x71000000,
604 .serial_base
= 0x71100000,
605 .nvram_base
= 0x71200000,
606 .fd_base
= 0x71400000,
607 .counter_base
= 0x71d00000,
608 .intctl_base
= 0x71e00000,
609 .idreg_base
= 0x78000000,
610 .dma_base
= 0x78400000,
611 .esp_base
= 0x78800000,
612 .le_base
= 0x78c00000,
613 .apc_base
= 0x6a000000,
614 .aux1_base
= 0x71900000,
615 .aux2_base
= 0x71910000,
616 .vram_size
= 0x00100000,
617 .nvram_size
= 0x2000,
627 .nvram_machine_id
= 0x80,
628 .machine_id
= ss5_id
,
629 .iommu_version
= 0x05000000,
631 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
632 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
634 .max_mem
= 0x10000000,
635 .default_cpu_model
= "Fujitsu MB86904",
639 .iommu_base
= 0xfe0000000ULL
,
640 .tcx_base
= 0xe20000000ULL
,
641 .slavio_base
= 0xff0000000ULL
,
642 .ms_kb_base
= 0xff1000000ULL
,
643 .serial_base
= 0xff1100000ULL
,
644 .nvram_base
= 0xff1200000ULL
,
645 .fd_base
= 0xff1700000ULL
,
646 .counter_base
= 0xff1300000ULL
,
647 .intctl_base
= 0xff1400000ULL
,
648 .idreg_base
= 0xef0000000ULL
,
649 .dma_base
= 0xef0400000ULL
,
650 .esp_base
= 0xef0800000ULL
,
651 .le_base
= 0xef0c00000ULL
,
652 .apc_base
= 0xefa000000ULL
, // XXX should not exist
653 .aux1_base
= 0xff1800000ULL
,
654 .aux2_base
= 0xff1a01000ULL
,
655 .ecc_base
= 0xf00000000ULL
,
656 .ecc_version
= 0x10000000, // version 0, implementation 1
657 .vram_size
= 0x00100000,
658 .nvram_size
= 0x2000,
668 .nvram_machine_id
= 0x72,
669 .machine_id
= ss10_id
,
670 .iommu_version
= 0x03000000,
672 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
673 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
675 .max_mem
= 0xf00000000ULL
,
676 .default_cpu_model
= "TI SuperSparc II",
680 .iommu_base
= 0xfe0000000ULL
,
681 .tcx_base
= 0xe20000000ULL
,
682 .slavio_base
= 0xff0000000ULL
,
683 .ms_kb_base
= 0xff1000000ULL
,
684 .serial_base
= 0xff1100000ULL
,
685 .nvram_base
= 0xff1200000ULL
,
686 .counter_base
= 0xff1300000ULL
,
687 .intctl_base
= 0xff1400000ULL
,
688 .dma_base
= 0xef0081000ULL
,
689 .esp_base
= 0xef0080000ULL
,
690 .le_base
= 0xef0060000ULL
,
691 .apc_base
= 0xefa000000ULL
, // XXX should not exist
692 .aux1_base
= 0xff1800000ULL
,
693 .aux2_base
= 0xff1a01000ULL
, // XXX should not exist
694 .ecc_base
= 0xf00000000ULL
,
695 .ecc_version
= 0x00000000, // version 0, implementation 0
696 .vram_size
= 0x00100000,
697 .nvram_size
= 0x2000,
707 .nvram_machine_id
= 0x71,
708 .machine_id
= ss600mp_id
,
709 .iommu_version
= 0x01000000,
711 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
712 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
714 .max_mem
= 0xf00000000ULL
,
715 .default_cpu_model
= "TI SuperSparc II",
719 .iommu_base
= 0xfe0000000ULL
,
720 .tcx_base
= 0xe20000000ULL
,
721 .slavio_base
= 0xff0000000ULL
,
722 .ms_kb_base
= 0xff1000000ULL
,
723 .serial_base
= 0xff1100000ULL
,
724 .nvram_base
= 0xff1200000ULL
,
725 .fd_base
= 0xff1700000ULL
,
726 .counter_base
= 0xff1300000ULL
,
727 .intctl_base
= 0xff1400000ULL
,
728 .idreg_base
= 0xef0000000ULL
,
729 .dma_base
= 0xef0400000ULL
,
730 .esp_base
= 0xef0800000ULL
,
731 .le_base
= 0xef0c00000ULL
,
732 .apc_base
= 0xefa000000ULL
, // XXX should not exist
733 .aux1_base
= 0xff1800000ULL
,
734 .aux2_base
= 0xff1a01000ULL
,
735 .ecc_base
= 0xf00000000ULL
,
736 .ecc_version
= 0x20000000, // version 0, implementation 2
737 .vram_size
= 0x00100000,
738 .nvram_size
= 0x2000,
748 .nvram_machine_id
= 0x72,
749 .machine_id
= ss20_id
,
750 .iommu_version
= 0x13000000,
752 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
753 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
755 .max_mem
= 0xf00000000ULL
,
756 .default_cpu_model
= "TI SuperSparc II",
760 .iommu_base
= 0x10000000,
761 .tcx_base
= 0x50000000,
762 .slavio_base
= 0x70000000,
763 .ms_kb_base
= 0x71000000,
764 .serial_base
= 0x71100000,
765 .nvram_base
= 0x71200000,
766 .fd_base
= 0x71400000,
767 .counter_base
= 0x71d00000,
768 .intctl_base
= 0x71e00000,
769 .idreg_base
= 0x78000000,
770 .dma_base
= 0x78400000,
771 .esp_base
= 0x78800000,
772 .le_base
= 0x78c00000,
773 .apc_base
= 0x71300000, // pmc
774 .aux1_base
= 0x71900000,
775 .aux2_base
= 0x71910000,
776 .vram_size
= 0x00100000,
777 .nvram_size
= 0x2000,
786 .nvram_machine_id
= 0x80,
787 .machine_id
= vger_id
,
788 .iommu_version
= 0x05000000,
790 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
791 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
793 .max_mem
= 0x10000000,
794 .default_cpu_model
= "Fujitsu MB86904",
798 .iommu_base
= 0x10000000,
799 .tcx_base
= 0x50000000,
800 .slavio_base
= 0x70000000,
801 .ms_kb_base
= 0x71000000,
802 .serial_base
= 0x71100000,
803 .nvram_base
= 0x71200000,
804 .fd_base
= 0x71400000,
805 .counter_base
= 0x71d00000,
806 .intctl_base
= 0x71e00000,
807 .idreg_base
= 0x78000000,
808 .dma_base
= 0x78400000,
809 .esp_base
= 0x78800000,
810 .le_base
= 0x78c00000,
811 .aux1_base
= 0x71900000,
812 .aux2_base
= 0x71910000,
813 .vram_size
= 0x00100000,
814 .nvram_size
= 0x2000,
823 .nvram_machine_id
= 0x80,
825 .iommu_version
= 0x04000000,
827 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
828 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
830 .max_mem
= 0x10000000,
831 .default_cpu_model
= "TI MicroSparc I",
835 .iommu_base
= 0x10000000,
836 .tcx_base
= 0x50000000,
837 .cs_base
= 0x6c000000,
838 .slavio_base
= 0x70000000,
839 .ms_kb_base
= 0x71000000,
840 .serial_base
= 0x71100000,
841 .nvram_base
= 0x71200000,
842 .fd_base
= 0x71400000,
843 .counter_base
= 0x71d00000,
844 .intctl_base
= 0x71e00000,
845 .idreg_base
= 0x78000000,
846 .dma_base
= 0x78400000,
847 .esp_base
= 0x78800000,
848 .le_base
= 0x78c00000,
849 .apc_base
= 0x6a000000,
850 .aux1_base
= 0x71900000,
851 .aux2_base
= 0x71910000,
852 .vram_size
= 0x00100000,
853 .nvram_size
= 0x2000,
863 .nvram_machine_id
= 0x80,
864 .machine_id
= ss4_id
,
865 .iommu_version
= 0x05000000,
867 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
868 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
870 .max_mem
= 0x10000000,
871 .default_cpu_model
= "Fujitsu MB86904",
875 .iommu_base
= 0x10000000,
876 .tcx_base
= 0x50000000,
877 .slavio_base
= 0x70000000,
878 .ms_kb_base
= 0x71000000,
879 .serial_base
= 0x71100000,
880 .nvram_base
= 0x71200000,
881 .fd_base
= 0x71400000,
882 .counter_base
= 0x71d00000,
883 .intctl_base
= 0x71e00000,
884 .idreg_base
= 0x78000000,
885 .dma_base
= 0x78400000,
886 .esp_base
= 0x78800000,
887 .le_base
= 0x78c00000,
888 .apc_base
= 0x6a000000,
889 .aux1_base
= 0x71900000,
890 .aux2_base
= 0x71910000,
891 .vram_size
= 0x00100000,
892 .nvram_size
= 0x2000,
901 .nvram_machine_id
= 0x80,
902 .machine_id
= scls_id
,
903 .iommu_version
= 0x05000000,
905 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
906 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
908 .max_mem
= 0x10000000,
909 .default_cpu_model
= "TI MicroSparc I",
913 .iommu_base
= 0x10000000,
914 .tcx_base
= 0x50000000, // XXX
915 .slavio_base
= 0x70000000,
916 .ms_kb_base
= 0x71000000,
917 .serial_base
= 0x71100000,
918 .nvram_base
= 0x71200000,
919 .fd_base
= 0x71400000,
920 .counter_base
= 0x71d00000,
921 .intctl_base
= 0x71e00000,
922 .idreg_base
= 0x78000000,
923 .dma_base
= 0x78400000,
924 .esp_base
= 0x78800000,
925 .le_base
= 0x78c00000,
926 .apc_base
= 0x6a000000,
927 .aux1_base
= 0x71900000,
928 .aux2_base
= 0x71910000,
929 .vram_size
= 0x00100000,
930 .nvram_size
= 0x2000,
939 .nvram_machine_id
= 0x80,
940 .machine_id
= sbook_id
,
941 .iommu_version
= 0x05000000,
943 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
944 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
946 .max_mem
= 0x10000000,
947 .default_cpu_model
= "TI MicroSparc I",
951 /* SPARCstation 5 hardware initialisation */
952 static void ss5_init(ram_addr_t RAM_size
,
953 const char *boot_device
,
954 const char *kernel_filename
, const char *kernel_cmdline
,
955 const char *initrd_filename
, const char *cpu_model
)
957 sun4m_hw_init(&sun4m_hwdefs
[0], RAM_size
, boot_device
, kernel_filename
,
958 kernel_cmdline
, initrd_filename
, cpu_model
);
961 /* SPARCstation 10 hardware initialisation */
962 static void ss10_init(ram_addr_t RAM_size
,
963 const char *boot_device
,
964 const char *kernel_filename
, const char *kernel_cmdline
,
965 const char *initrd_filename
, const char *cpu_model
)
967 sun4m_hw_init(&sun4m_hwdefs
[1], RAM_size
, boot_device
, kernel_filename
,
968 kernel_cmdline
, initrd_filename
, cpu_model
);
971 /* SPARCserver 600MP hardware initialisation */
972 static void ss600mp_init(ram_addr_t RAM_size
,
973 const char *boot_device
,
974 const char *kernel_filename
,
975 const char *kernel_cmdline
,
976 const char *initrd_filename
, const char *cpu_model
)
978 sun4m_hw_init(&sun4m_hwdefs
[2], RAM_size
, boot_device
, kernel_filename
,
979 kernel_cmdline
, initrd_filename
, cpu_model
);
982 /* SPARCstation 20 hardware initialisation */
983 static void ss20_init(ram_addr_t RAM_size
,
984 const char *boot_device
,
985 const char *kernel_filename
, const char *kernel_cmdline
,
986 const char *initrd_filename
, const char *cpu_model
)
988 sun4m_hw_init(&sun4m_hwdefs
[3], RAM_size
, boot_device
, kernel_filename
,
989 kernel_cmdline
, initrd_filename
, cpu_model
);
992 /* SPARCstation Voyager hardware initialisation */
993 static void vger_init(ram_addr_t RAM_size
,
994 const char *boot_device
,
995 const char *kernel_filename
, const char *kernel_cmdline
,
996 const char *initrd_filename
, const char *cpu_model
)
998 sun4m_hw_init(&sun4m_hwdefs
[4], RAM_size
, boot_device
, kernel_filename
,
999 kernel_cmdline
, initrd_filename
, cpu_model
);
1002 /* SPARCstation LX hardware initialisation */
1003 static void ss_lx_init(ram_addr_t RAM_size
,
1004 const char *boot_device
,
1005 const char *kernel_filename
, const char *kernel_cmdline
,
1006 const char *initrd_filename
, const char *cpu_model
)
1008 sun4m_hw_init(&sun4m_hwdefs
[5], RAM_size
, boot_device
, kernel_filename
,
1009 kernel_cmdline
, initrd_filename
, cpu_model
);
1012 /* SPARCstation 4 hardware initialisation */
1013 static void ss4_init(ram_addr_t RAM_size
,
1014 const char *boot_device
,
1015 const char *kernel_filename
, const char *kernel_cmdline
,
1016 const char *initrd_filename
, const char *cpu_model
)
1018 sun4m_hw_init(&sun4m_hwdefs
[6], RAM_size
, boot_device
, kernel_filename
,
1019 kernel_cmdline
, initrd_filename
, cpu_model
);
1022 /* SPARCClassic hardware initialisation */
1023 static void scls_init(ram_addr_t RAM_size
,
1024 const char *boot_device
,
1025 const char *kernel_filename
, const char *kernel_cmdline
,
1026 const char *initrd_filename
, const char *cpu_model
)
1028 sun4m_hw_init(&sun4m_hwdefs
[7], RAM_size
, boot_device
, kernel_filename
,
1029 kernel_cmdline
, initrd_filename
, cpu_model
);
1032 /* SPARCbook hardware initialisation */
1033 static void sbook_init(ram_addr_t RAM_size
,
1034 const char *boot_device
,
1035 const char *kernel_filename
, const char *kernel_cmdline
,
1036 const char *initrd_filename
, const char *cpu_model
)
1038 sun4m_hw_init(&sun4m_hwdefs
[8], RAM_size
, boot_device
, kernel_filename
,
1039 kernel_cmdline
, initrd_filename
, cpu_model
);
1042 static QEMUMachine ss5_machine
= {
1044 .desc
= "Sun4m platform, SPARCstation 5",
1050 static QEMUMachine ss10_machine
= {
1052 .desc
= "Sun4m platform, SPARCstation 10",
1058 static QEMUMachine ss600mp_machine
= {
1060 .desc
= "Sun4m platform, SPARCserver 600MP",
1061 .init
= ss600mp_init
,
1066 static QEMUMachine ss20_machine
= {
1068 .desc
= "Sun4m platform, SPARCstation 20",
1074 static QEMUMachine voyager_machine
= {
1076 .desc
= "Sun4m platform, SPARCstation Voyager",
1081 static QEMUMachine ss_lx_machine
= {
1083 .desc
= "Sun4m platform, SPARCstation LX",
1088 static QEMUMachine ss4_machine
= {
1090 .desc
= "Sun4m platform, SPARCstation 4",
1095 static QEMUMachine scls_machine
= {
1096 .name
= "SPARCClassic",
1097 .desc
= "Sun4m platform, SPARCClassic",
1102 static QEMUMachine sbook_machine
= {
1103 .name
= "SPARCbook",
1104 .desc
= "Sun4m platform, SPARCbook",
1109 static const struct sun4d_hwdef sun4d_hwdefs
[] = {
1119 .tcx_base
= 0x820000000ULL
,
1120 .slavio_base
= 0xf00000000ULL
,
1121 .ms_kb_base
= 0xf00240000ULL
,
1122 .serial_base
= 0xf00200000ULL
,
1123 .nvram_base
= 0xf00280000ULL
,
1124 .counter_base
= 0xf00300000ULL
,
1125 .espdma_base
= 0x800081000ULL
,
1126 .esp_base
= 0x800080000ULL
,
1127 .ledma_base
= 0x800040000ULL
,
1128 .le_base
= 0x800060000ULL
,
1129 .sbi_base
= 0xf02800000ULL
,
1130 .vram_size
= 0x00100000,
1131 .nvram_size
= 0x2000,
1138 .nvram_machine_id
= 0x80,
1139 .machine_id
= ss1000_id
,
1140 .iounit_version
= 0x03000000,
1141 .max_mem
= 0xf00000000ULL
,
1142 .default_cpu_model
= "TI SuperSparc II",
1153 .tcx_base
= 0x820000000ULL
,
1154 .slavio_base
= 0xf00000000ULL
,
1155 .ms_kb_base
= 0xf00240000ULL
,
1156 .serial_base
= 0xf00200000ULL
,
1157 .nvram_base
= 0xf00280000ULL
,
1158 .counter_base
= 0xf00300000ULL
,
1159 .espdma_base
= 0x800081000ULL
,
1160 .esp_base
= 0x800080000ULL
,
1161 .ledma_base
= 0x800040000ULL
,
1162 .le_base
= 0x800060000ULL
,
1163 .sbi_base
= 0xf02800000ULL
,
1164 .vram_size
= 0x00100000,
1165 .nvram_size
= 0x2000,
1172 .nvram_machine_id
= 0x80,
1173 .machine_id
= ss2000_id
,
1174 .iounit_version
= 0x03000000,
1175 .max_mem
= 0xf00000000ULL
,
1176 .default_cpu_model
= "TI SuperSparc II",
1180 static void sun4d_hw_init(const struct sun4d_hwdef
*hwdef
, ram_addr_t RAM_size
,
1181 const char *boot_device
,
1182 const char *kernel_filename
,
1183 const char *kernel_cmdline
,
1184 const char *initrd_filename
, const char *cpu_model
)
1186 CPUState
*env
, *envs
[MAX_CPUS
];
1188 void *iounits
[MAX_IOUNITS
], *espdma
, *ledma
, *nvram
, *sbi
;
1189 qemu_irq
*cpu_irqs
[MAX_CPUS
], *sbi_irq
, *sbi_cpu_irq
,
1190 *espdma_irq
, *ledma_irq
;
1191 qemu_irq
*esp_reset
, *le_reset
;
1192 ram_addr_t ram_offset
, prom_offset
;
1193 unsigned long kernel_size
;
1200 cpu_model
= hwdef
->default_cpu_model
;
1202 for (i
= 0; i
< smp_cpus
; i
++) {
1203 env
= cpu_init(cpu_model
);
1205 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
1208 cpu_sparc_set_id(env
, i
);
1211 qemu_register_reset(main_cpu_reset
, 0, env
);
1213 qemu_register_reset(secondary_cpu_reset
, 0, env
);
1216 cpu_irqs
[i
] = qemu_allocate_irqs(cpu_set_irq
, envs
[i
], MAX_PILS
);
1217 env
->prom_addr
= hwdef
->slavio_base
;
1220 for (i
= smp_cpus
; i
< MAX_CPUS
; i
++)
1221 cpu_irqs
[i
] = qemu_allocate_irqs(dummy_cpu_set_irq
, NULL
, MAX_PILS
);
1224 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
1226 "qemu: Too much memory for this machine: %d, maximum %d\n",
1227 (unsigned int)(RAM_size
/ (1024 * 1024)),
1228 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
1231 ram_offset
= qemu_ram_alloc(RAM_size
);
1232 cpu_register_physical_memory(0, RAM_size
, ram_offset
);
1234 /* load boot prom */
1235 prom_offset
= qemu_ram_alloc(PROM_SIZE_MAX
);
1236 cpu_register_physical_memory(hwdef
->slavio_base
,
1237 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
1239 prom_offset
| IO_MEM_ROM
);
1241 if (bios_name
== NULL
)
1242 bios_name
= PROM_FILENAME
;
1243 filename
= qemu_find_file(QEMU_FILE_TYPE_BIOS
, bios_name
);
1245 ret
= load_elf(filename
, hwdef
->slavio_base
- PROM_VADDR
,
1247 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
1248 ret
= load_image_targphys(filename
, hwdef
->slavio_base
,
1250 qemu_free(filename
);
1254 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
1255 fprintf(stderr
, "qemu: could not load prom '%s'\n",
1260 /* set up devices */
1261 sbi
= sbi_init(hwdef
->sbi_base
, &sbi_irq
, &sbi_cpu_irq
, cpu_irqs
);
1263 for (i
= 0; i
< MAX_IOUNITS
; i
++)
1264 if (hwdef
->iounit_bases
[i
] != (target_phys_addr_t
)-1)
1265 iounits
[i
] = iommu_init(hwdef
->iounit_bases
[i
],
1266 hwdef
->iounit_version
,
1267 sbi_irq
[hwdef
->me_irq
]);
1269 espdma
= sparc32_dma_init(hwdef
->espdma_base
, sbi_irq
[hwdef
->esp_irq
],
1270 iounits
[0], &espdma_irq
, &esp_reset
);
1272 ledma
= sparc32_dma_init(hwdef
->ledma_base
, sbi_irq
[hwdef
->le_irq
],
1273 iounits
[0], &ledma_irq
, &le_reset
);
1275 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
1276 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
1279 tcx_init(hwdef
->tcx_base
, hwdef
->vram_size
, graphic_width
, graphic_height
,
1282 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
1284 nvram
= m48t59_init(sbi_irq
[0], hwdef
->nvram_base
, 0,
1285 hwdef
->nvram_size
, 8);
1287 slavio_timer_init_all(hwdef
->counter_base
, sbi_irq
[hwdef
->clock1_irq
],
1288 sbi_cpu_irq
, smp_cpus
);
1290 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, sbi_irq
[hwdef
->ms_kb_irq
],
1291 display_type
== DT_NOGRAPHIC
, ESCC_CLOCK
, 1);
1292 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1293 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1294 escc_init(hwdef
->serial_base
, sbi_irq
[hwdef
->ser_irq
], sbi_irq
[hwdef
->ser_irq
],
1295 serial_hds
[0], serial_hds
[1], ESCC_CLOCK
, 1);
1297 if (drive_get_max_bus(IF_SCSI
) > 0) {
1298 fprintf(stderr
, "qemu: too many SCSI bus\n");
1302 esp_init(hwdef
->esp_base
, 2,
1303 espdma_memory_read
, espdma_memory_write
,
1304 espdma
, *espdma_irq
, esp_reset
);
1306 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
1309 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
1310 boot_device
, RAM_size
, kernel_size
, graphic_width
,
1311 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
1314 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
1315 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
1316 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
1317 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
1318 fw_cfg_add_i16(fw_cfg
, FW_CFG_SUN4M_DEPTH
, graphic_depth
);
1319 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_ADDR
, KERNEL_LOAD_ADDR
);
1320 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_SIZE
, kernel_size
);
1321 if (kernel_cmdline
) {
1322 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_CMDLINE
, CMDLINE_ADDR
);
1323 pstrcpy_targphys(CMDLINE_ADDR
, TARGET_PAGE_SIZE
, kernel_cmdline
);
1325 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_CMDLINE
, 0);
1327 fw_cfg_add_i32(fw_cfg
, FW_CFG_INITRD_ADDR
, INITRD_LOAD_ADDR
);
1328 fw_cfg_add_i32(fw_cfg
, FW_CFG_INITRD_SIZE
, 0); // not used
1329 fw_cfg_add_i16(fw_cfg
, FW_CFG_BOOT_DEVICE
, boot_device
[0]);
1330 qemu_register_boot_set(fw_cfg_boot_set
, fw_cfg
);
1333 /* SPARCserver 1000 hardware initialisation */
1334 static void ss1000_init(ram_addr_t RAM_size
,
1335 const char *boot_device
,
1336 const char *kernel_filename
, const char *kernel_cmdline
,
1337 const char *initrd_filename
, const char *cpu_model
)
1339 sun4d_hw_init(&sun4d_hwdefs
[0], RAM_size
, boot_device
, kernel_filename
,
1340 kernel_cmdline
, initrd_filename
, cpu_model
);
1343 /* SPARCcenter 2000 hardware initialisation */
1344 static void ss2000_init(ram_addr_t RAM_size
,
1345 const char *boot_device
,
1346 const char *kernel_filename
, const char *kernel_cmdline
,
1347 const char *initrd_filename
, const char *cpu_model
)
1349 sun4d_hw_init(&sun4d_hwdefs
[1], RAM_size
, boot_device
, kernel_filename
,
1350 kernel_cmdline
, initrd_filename
, cpu_model
);
1353 static QEMUMachine ss1000_machine
= {
1355 .desc
= "Sun4d platform, SPARCserver 1000",
1356 .init
= ss1000_init
,
1361 static QEMUMachine ss2000_machine
= {
1363 .desc
= "Sun4d platform, SPARCcenter 2000",
1364 .init
= ss2000_init
,
1369 static const struct sun4c_hwdef sun4c_hwdefs
[] = {
1372 .iommu_base
= 0xf8000000,
1373 .tcx_base
= 0xfe000000,
1374 .slavio_base
= 0xf6000000,
1375 .intctl_base
= 0xf5000000,
1376 .counter_base
= 0xf3000000,
1377 .ms_kb_base
= 0xf0000000,
1378 .serial_base
= 0xf1000000,
1379 .nvram_base
= 0xf2000000,
1380 .fd_base
= 0xf7200000,
1381 .dma_base
= 0xf8400000,
1382 .esp_base
= 0xf8800000,
1383 .le_base
= 0xf8c00000,
1384 .aux1_base
= 0xf7400003,
1385 .vram_size
= 0x00100000,
1386 .nvram_size
= 0x800,
1395 .nvram_machine_id
= 0x55,
1396 .machine_id
= ss2_id
,
1397 .max_mem
= 0x10000000,
1398 .default_cpu_model
= "Cypress CY7C601",
1402 static void sun4c_hw_init(const struct sun4c_hwdef
*hwdef
, ram_addr_t RAM_size
,
1403 const char *boot_device
,
1404 const char *kernel_filename
,
1405 const char *kernel_cmdline
,
1406 const char *initrd_filename
, const char *cpu_model
)
1409 void *iommu
, *espdma
, *ledma
, *nvram
;
1410 qemu_irq
*cpu_irqs
, *slavio_irq
, *espdma_irq
, *ledma_irq
;
1411 qemu_irq
*esp_reset
, *le_reset
;
1413 ram_addr_t ram_offset
, prom_offset
;
1414 unsigned long kernel_size
;
1417 BlockDriverState
*fd
[MAX_FD
];
1423 cpu_model
= hwdef
->default_cpu_model
;
1425 env
= cpu_init(cpu_model
);
1427 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
1431 cpu_sparc_set_id(env
, 0);
1433 qemu_register_reset(main_cpu_reset
, 0, env
);
1434 cpu_irqs
= qemu_allocate_irqs(cpu_set_irq
, env
, MAX_PILS
);
1435 env
->prom_addr
= hwdef
->slavio_base
;
1438 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
1440 "qemu: Too much memory for this machine: %d, maximum %d\n",
1441 (unsigned int)(RAM_size
/ (1024 * 1024)),
1442 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
1445 ram_offset
= qemu_ram_alloc(RAM_size
);
1446 cpu_register_physical_memory(0, RAM_size
, ram_offset
);
1448 /* load boot prom */
1449 prom_offset
= qemu_ram_alloc(PROM_SIZE_MAX
);
1450 cpu_register_physical_memory(hwdef
->slavio_base
,
1451 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
1453 prom_offset
| IO_MEM_ROM
);
1455 if (bios_name
== NULL
)
1456 bios_name
= PROM_FILENAME
;
1457 filename
= qemu_find_file(QEMU_FILE_TYPE_BIOS
, bios_name
);
1459 ret
= load_elf(filename
, hwdef
->slavio_base
- PROM_VADDR
,
1461 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
1462 ret
= load_image_targphys(filename
, hwdef
->slavio_base
,
1464 qemu_free(filename
);
1468 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
1469 fprintf(stderr
, "qemu: could not load prom '%s'\n",
1474 /* set up devices */
1475 slavio_intctl
= sun4c_intctl_init(hwdef
->intctl_base
,
1476 &slavio_irq
, cpu_irqs
);
1478 iommu
= iommu_init(hwdef
->iommu_base
, hwdef
->iommu_version
,
1479 slavio_irq
[hwdef
->me_irq
]);
1481 espdma
= sparc32_dma_init(hwdef
->dma_base
, slavio_irq
[hwdef
->esp_irq
],
1482 iommu
, &espdma_irq
, &esp_reset
);
1484 ledma
= sparc32_dma_init(hwdef
->dma_base
+ 16ULL,
1485 slavio_irq
[hwdef
->le_irq
], iommu
, &ledma_irq
,
1488 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
1489 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
1492 tcx_init(hwdef
->tcx_base
, hwdef
->vram_size
, graphic_width
, graphic_height
,
1495 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
1497 nvram
= m48t59_init(slavio_irq
[0], hwdef
->nvram_base
, 0,
1498 hwdef
->nvram_size
, 2);
1500 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, slavio_irq
[hwdef
->ms_kb_irq
],
1501 display_type
== DT_NOGRAPHIC
, ESCC_CLOCK
, 1);
1502 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1503 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1504 escc_init(hwdef
->serial_base
, slavio_irq
[hwdef
->ser_irq
],
1505 slavio_irq
[hwdef
->ser_irq
], serial_hds
[0], serial_hds
[1],
1508 slavio_misc
= slavio_misc_init(0, 0, hwdef
->aux1_base
, 0,
1509 slavio_irq
[hwdef
->me_irq
], NULL
, &fdc_tc
);
1511 if (hwdef
->fd_base
!= (target_phys_addr_t
)-1) {
1512 /* there is zero or one floppy drive */
1513 memset(fd
, 0, sizeof(fd
));
1514 drive_index
= drive_get_index(IF_FLOPPY
, 0, 0);
1515 if (drive_index
!= -1)
1516 fd
[0] = drives_table
[drive_index
].bdrv
;
1518 sun4m_fdctrl_init(slavio_irq
[hwdef
->fd_irq
], hwdef
->fd_base
, fd
,
1522 if (drive_get_max_bus(IF_SCSI
) > 0) {
1523 fprintf(stderr
, "qemu: too many SCSI bus\n");
1527 esp_init(hwdef
->esp_base
, 2,
1528 espdma_memory_read
, espdma_memory_write
,
1529 espdma
, *espdma_irq
, esp_reset
);
1531 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
1534 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
1535 boot_device
, RAM_size
, kernel_size
, graphic_width
,
1536 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
1539 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
1540 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
1541 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
1542 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
1543 fw_cfg_add_i16(fw_cfg
, FW_CFG_SUN4M_DEPTH
, graphic_depth
);
1544 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_ADDR
, KERNEL_LOAD_ADDR
);
1545 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_SIZE
, kernel_size
);
1546 if (kernel_cmdline
) {
1547 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_CMDLINE
, CMDLINE_ADDR
);
1548 pstrcpy_targphys(CMDLINE_ADDR
, TARGET_PAGE_SIZE
, kernel_cmdline
);
1550 fw_cfg_add_i32(fw_cfg
, FW_CFG_KERNEL_CMDLINE
, 0);
1552 fw_cfg_add_i32(fw_cfg
, FW_CFG_INITRD_ADDR
, INITRD_LOAD_ADDR
);
1553 fw_cfg_add_i32(fw_cfg
, FW_CFG_INITRD_SIZE
, 0); // not used
1554 fw_cfg_add_i16(fw_cfg
, FW_CFG_BOOT_DEVICE
, boot_device
[0]);
1555 qemu_register_boot_set(fw_cfg_boot_set
, fw_cfg
);
1558 /* SPARCstation 2 hardware initialisation */
1559 static void ss2_init(ram_addr_t RAM_size
,
1560 const char *boot_device
,
1561 const char *kernel_filename
, const char *kernel_cmdline
,
1562 const char *initrd_filename
, const char *cpu_model
)
1564 sun4c_hw_init(&sun4c_hwdefs
[0], RAM_size
, boot_device
, kernel_filename
,
1565 kernel_cmdline
, initrd_filename
, cpu_model
);
1568 static QEMUMachine ss2_machine
= {
1570 .desc
= "Sun4c platform, SPARCstation 2",
1575 static void ss2_machine_init(void)
1577 qemu_register_machine(&ss5_machine
);
1578 qemu_register_machine(&ss10_machine
);
1579 qemu_register_machine(&ss600mp_machine
);
1580 qemu_register_machine(&ss20_machine
);
1581 qemu_register_machine(&voyager_machine
);
1582 qemu_register_machine(&ss_lx_machine
);
1583 qemu_register_machine(&ss4_machine
);
1584 qemu_register_machine(&scls_machine
);
1585 qemu_register_machine(&sbook_machine
);
1586 qemu_register_machine(&ss1000_machine
);
1587 qemu_register_machine(&ss2000_machine
);
1588 qemu_register_machine(&ss2_machine
);
1591 machine_init(ss2_machine_init
);