]> git.proxmox.com Git - qemu.git/blob - hw/sun4m.c
Break up vl.h.
[qemu.git] / hw / sun4m.c
1 /*
2 * QEMU Sun4m System Emulator
3 *
4 * Copyright (c) 2003-2005 Fabrice Bellard
5 *
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:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
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.
23 */
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
35 //#define DEBUG_IRQ
36
37 /*
38 * Sun4m architecture was used in the following machines:
39 *
40 * SPARCserver 6xxMP/xx
41 * SPARCclassic (SPARCclassic Server)(SPARCstation LC) (4/15), SPARCclassic X (4/10)
42 * SPARCstation LX/ZX (4/30)
43 * SPARCstation Voyager
44 * SPARCstation 10/xx, SPARCserver 10/xx
45 * SPARCstation 5, SPARCserver 5
46 * SPARCstation 20/xx, SPARCserver 20
47 * SPARCstation 4
48 *
49 * See for example: http://www.sunhelp.org/faq/sunref1.html
50 */
51
52 #ifdef DEBUG_IRQ
53 #define DPRINTF(fmt, args...) \
54 do { printf("CPUIRQ: " fmt , ##args); } while (0)
55 #else
56 #define DPRINTF(fmt, args...)
57 #endif
58
59 #define KERNEL_LOAD_ADDR 0x00004000
60 #define CMDLINE_ADDR 0x007ff000
61 #define INITRD_LOAD_ADDR 0x00800000
62 #define PROM_SIZE_MAX (512 * 1024)
63 #define PROM_PADDR 0xff0000000ULL
64 #define PROM_VADDR 0xffd00000
65 #define PROM_FILENAME "openbios-sparc32"
66
67 #define MAX_CPUS 16
68 #define MAX_PILS 16
69
70 struct hwdef {
71 target_phys_addr_t iommu_base, slavio_base;
72 target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base;
73 target_phys_addr_t serial_base, fd_base;
74 target_phys_addr_t dma_base, esp_base, le_base;
75 target_phys_addr_t tcx_base, cs_base, power_base;
76 long vram_size, nvram_size;
77 // IRQ numbers are not PIL ones, but master interrupt controller register
78 // bit numbers
79 int intctl_g_intr, esp_irq, le_irq, clock_irq, clock1_irq;
80 int ser_irq, ms_kb_irq, fd_irq, me_irq, cs_irq;
81 int machine_id; // For NVRAM
82 uint32_t iommu_version;
83 uint32_t intbit_to_level[32];
84 };
85
86 /* TSC handling */
87
88 uint64_t cpu_get_tsc()
89 {
90 return qemu_get_clock(vm_clock);
91 }
92
93 int DMA_get_channel_mode (int nchan)
94 {
95 return 0;
96 }
97 int DMA_read_memory (int nchan, void *buf, int pos, int size)
98 {
99 return 0;
100 }
101 int DMA_write_memory (int nchan, void *buf, int pos, int size)
102 {
103 return 0;
104 }
105 void DMA_hold_DREQ (int nchan) {}
106 void DMA_release_DREQ (int nchan) {}
107 void DMA_schedule(int nchan) {}
108 void DMA_run (void) {}
109 void DMA_init (int high_page_enable) {}
110 void DMA_register_channel (int nchan,
111 DMA_transfer_handler transfer_handler,
112 void *opaque)
113 {
114 }
115
116 extern int nographic;
117
118 static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline,
119 const char *boot_devices, uint32_t RAM_size,
120 uint32_t kernel_size,
121 int width, int height, int depth,
122 int machine_id)
123 {
124 unsigned int i;
125 uint32_t start, end;
126 uint8_t image[0x1ff0];
127 ohwcfg_v3_t *header = (ohwcfg_v3_t *)ℑ
128 struct sparc_arch_cfg *sparc_header;
129 struct OpenBIOS_nvpart_v1 *part_header;
130
131 memset(image, '\0', sizeof(image));
132
133 // Try to match PPC NVRAM
134 strcpy(header->struct_ident, "QEMU_BIOS");
135 header->struct_version = cpu_to_be32(3); /* structure v3 */
136
137 header->nvram_size = cpu_to_be16(0x2000);
138 header->nvram_arch_ptr = cpu_to_be16(sizeof(ohwcfg_v3_t));
139 header->nvram_arch_size = cpu_to_be16(sizeof(struct sparc_arch_cfg));
140 strcpy(header->arch, "sun4m");
141 header->nb_cpus = smp_cpus & 0xff;
142 header->RAM0_base = 0;
143 header->RAM0_size = cpu_to_be64((uint64_t)RAM_size);
144 strcpy(header->boot_devices, boot_devices);
145 header->nboot_devices = strlen(boot_devices) & 0xff;
146 header->kernel_image = cpu_to_be64((uint64_t)KERNEL_LOAD_ADDR);
147 header->kernel_size = cpu_to_be64((uint64_t)kernel_size);
148 if (cmdline) {
149 strcpy(phys_ram_base + CMDLINE_ADDR, cmdline);
150 header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR);
151 header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline));
152 }
153 // XXX add initrd_image, initrd_size
154 header->width = cpu_to_be16(width);
155 header->height = cpu_to_be16(height);
156 header->depth = cpu_to_be16(depth);
157 if (nographic)
158 header->graphic_flags = cpu_to_be16(OHW_GF_NOGRAPHICS);
159
160 header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
161
162 // Architecture specific header
163 start = sizeof(ohwcfg_v3_t);
164 sparc_header = (struct sparc_arch_cfg *)&image[start];
165 sparc_header->valid = 0;
166 start += sizeof(struct sparc_arch_cfg);
167
168 // OpenBIOS nvram variables
169 // Variable partition
170 part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
171 part_header->signature = OPENBIOS_PART_SYSTEM;
172 strcpy(part_header->name, "system");
173
174 end = start + sizeof(struct OpenBIOS_nvpart_v1);
175 for (i = 0; i < nb_prom_envs; i++)
176 end = OpenBIOS_set_var(image, end, prom_envs[i]);
177
178 // End marker
179 image[end++] = '\0';
180
181 end = start + ((end - start + 15) & ~15);
182 OpenBIOS_finish_partition(part_header, end - start);
183
184 // free partition
185 start = end;
186 part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
187 part_header->signature = OPENBIOS_PART_FREE;
188 strcpy(part_header->name, "free");
189
190 end = 0x1fd0;
191 OpenBIOS_finish_partition(part_header, end - start);
192
193 Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr, machine_id);
194
195 for (i = 0; i < sizeof(image); i++)
196 m48t59_write(nvram, i, image[i]);
197 }
198
199 static void *slavio_intctl;
200
201 void pic_info()
202 {
203 slavio_pic_info(slavio_intctl);
204 }
205
206 void irq_info()
207 {
208 slavio_irq_info(slavio_intctl);
209 }
210
211 void cpu_check_irqs(CPUState *env)
212 {
213 if (env->pil_in && (env->interrupt_index == 0 ||
214 (env->interrupt_index & ~15) == TT_EXTINT)) {
215 unsigned int i;
216
217 for (i = 15; i > 0; i--) {
218 if (env->pil_in & (1 << i)) {
219 int old_interrupt = env->interrupt_index;
220
221 env->interrupt_index = TT_EXTINT | i;
222 if (old_interrupt != env->interrupt_index)
223 cpu_interrupt(env, CPU_INTERRUPT_HARD);
224 break;
225 }
226 }
227 } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) {
228 env->interrupt_index = 0;
229 cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
230 }
231 }
232
233 static void cpu_set_irq(void *opaque, int irq, int level)
234 {
235 CPUState *env = opaque;
236
237 if (level) {
238 DPRINTF("Raise CPU IRQ %d\n", irq);
239 env->halted = 0;
240 env->pil_in |= 1 << irq;
241 cpu_check_irqs(env);
242 } else {
243 DPRINTF("Lower CPU IRQ %d\n", irq);
244 env->pil_in &= ~(1 << irq);
245 cpu_check_irqs(env);
246 }
247 }
248
249 static void dummy_cpu_set_irq(void *opaque, int irq, int level)
250 {
251 }
252
253 static void *slavio_misc;
254
255 void qemu_system_powerdown(void)
256 {
257 slavio_set_power_fail(slavio_misc, 1);
258 }
259
260 static void main_cpu_reset(void *opaque)
261 {
262 CPUState *env = opaque;
263
264 cpu_reset(env);
265 env->halted = 0;
266 }
267
268 static void secondary_cpu_reset(void *opaque)
269 {
270 CPUState *env = opaque;
271
272 cpu_reset(env);
273 env->halted = 1;
274 }
275
276 static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size,
277 DisplayState *ds, const char *cpu_model)
278
279 {
280 CPUState *env, *envs[MAX_CPUS];
281 unsigned int i;
282 void *iommu, *espdma, *ledma, *main_esp, *nvram;
283 qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq,
284 *espdma_irq, *ledma_irq;
285 qemu_irq *esp_reset, *le_reset;
286
287 /* init CPUs */
288
289 for(i = 0; i < smp_cpus; i++) {
290 env = cpu_init(cpu_model);
291 if (!env) {
292 fprintf(stderr, "Unable to find Sparc CPU definition\n");
293 exit(1);
294 }
295 cpu_sparc_set_id(env, i);
296 envs[i] = env;
297 if (i == 0) {
298 qemu_register_reset(main_cpu_reset, env);
299 } else {
300 qemu_register_reset(secondary_cpu_reset, env);
301 env->halted = 1;
302 }
303 register_savevm("cpu", i, 3, cpu_save, cpu_load, env);
304 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
305 }
306
307 for (i = smp_cpus; i < MAX_CPUS; i++)
308 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
309
310 /* allocate RAM */
311 cpu_register_physical_memory(0, RAM_size, 0);
312
313 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version);
314 slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
315 hwdef->intctl_base + 0x10000ULL,
316 &hwdef->intbit_to_level[0],
317 &slavio_irq, &slavio_cpu_irq,
318 cpu_irqs,
319 hwdef->clock_irq);
320
321 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
322 iommu, &espdma_irq, &esp_reset);
323
324 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
325 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
326 &le_reset);
327
328 if (graphic_depth != 8 && graphic_depth != 24) {
329 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
330 exit (1);
331 }
332 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
333 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
334
335 if (nd_table[0].model == NULL
336 || strcmp(nd_table[0].model, "lance") == 0) {
337 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
338 } else if (strcmp(nd_table[0].model, "?") == 0) {
339 fprintf(stderr, "qemu: Supported NICs: lance\n");
340 exit (1);
341 } else {
342 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
343 exit (1);
344 }
345
346 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
347 hwdef->nvram_size, 8);
348
349 slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq],
350 slavio_cpu_irq);
351
352 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq]);
353 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
354 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
355 slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
356 serial_hds[1], serial_hds[0]);
357
358 if (hwdef->fd_base != (target_phys_addr_t)-1)
359 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd_table);
360
361 main_esp = esp_init(bs_table, hwdef->esp_base, espdma, *espdma_irq,
362 esp_reset);
363
364 for (i = 0; i < MAX_DISKS; i++) {
365 if (bs_table[i]) {
366 esp_scsi_attach(main_esp, bs_table[i], i);
367 }
368 }
369
370 slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->power_base,
371 slavio_irq[hwdef->me_irq]);
372 if (hwdef->cs_base != (target_phys_addr_t)-1)
373 cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
374
375 return nvram;
376 }
377
378 static void sun4m_load_kernel(long vram_size, int RAM_size,
379 const char *boot_device,
380 const char *kernel_filename,
381 const char *kernel_cmdline,
382 const char *initrd_filename,
383 int machine_id,
384 void *nvram)
385 {
386 int ret, linux_boot;
387 char buf[1024];
388 unsigned int i;
389 long prom_offset, initrd_size, kernel_size;
390
391 linux_boot = (kernel_filename != NULL);
392
393 prom_offset = RAM_size + vram_size;
394 cpu_register_physical_memory(PROM_PADDR,
395 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK,
396 prom_offset | IO_MEM_ROM);
397
398 if (bios_name == NULL)
399 bios_name = PROM_FILENAME;
400 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
401 ret = load_elf(buf, PROM_PADDR - PROM_VADDR, NULL, NULL, NULL);
402 if (ret < 0 || ret > PROM_SIZE_MAX)
403 ret = load_image(buf, phys_ram_base + prom_offset);
404 if (ret < 0 || ret > PROM_SIZE_MAX) {
405 fprintf(stderr, "qemu: could not load prom '%s'\n",
406 buf);
407 exit(1);
408 }
409
410 kernel_size = 0;
411 if (linux_boot) {
412 kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
413 NULL);
414 if (kernel_size < 0)
415 kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR);
416 if (kernel_size < 0)
417 kernel_size = load_image(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR);
418 if (kernel_size < 0) {
419 fprintf(stderr, "qemu: could not load kernel '%s'\n",
420 kernel_filename);
421 exit(1);
422 }
423
424 /* load initrd */
425 initrd_size = 0;
426 if (initrd_filename) {
427 initrd_size = load_image(initrd_filename, phys_ram_base + INITRD_LOAD_ADDR);
428 if (initrd_size < 0) {
429 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
430 initrd_filename);
431 exit(1);
432 }
433 }
434 if (initrd_size > 0) {
435 for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) {
436 if (ldl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i)
437 == 0x48647253) { // HdrS
438 stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR);
439 stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 20, initrd_size);
440 break;
441 }
442 }
443 }
444 }
445 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
446 boot_device, RAM_size, kernel_size, graphic_width,
447 graphic_height, graphic_depth, machine_id);
448 }
449
450 static const struct hwdef hwdefs[] = {
451 /* SS-5 */
452 {
453 .iommu_base = 0x10000000,
454 .tcx_base = 0x50000000,
455 .cs_base = 0x6c000000,
456 .slavio_base = 0x70000000,
457 .ms_kb_base = 0x71000000,
458 .serial_base = 0x71100000,
459 .nvram_base = 0x71200000,
460 .fd_base = 0x71400000,
461 .counter_base = 0x71d00000,
462 .intctl_base = 0x71e00000,
463 .dma_base = 0x78400000,
464 .esp_base = 0x78800000,
465 .le_base = 0x78c00000,
466 .power_base = 0x7a000000,
467 .vram_size = 0x00100000,
468 .nvram_size = 0x2000,
469 .esp_irq = 18,
470 .le_irq = 16,
471 .clock_irq = 7,
472 .clock1_irq = 19,
473 .ms_kb_irq = 14,
474 .ser_irq = 15,
475 .fd_irq = 22,
476 .me_irq = 30,
477 .cs_irq = 5,
478 .machine_id = 0x80,
479 .iommu_version = 0x04000000,
480 .intbit_to_level = {
481 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
482 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
483 },
484 },
485 /* SS-10 */
486 {
487 .iommu_base = 0xfe0000000ULL,
488 .tcx_base = 0xe20000000ULL,
489 .cs_base = -1,
490 .slavio_base = 0xff0000000ULL,
491 .ms_kb_base = 0xff1000000ULL,
492 .serial_base = 0xff1100000ULL,
493 .nvram_base = 0xff1200000ULL,
494 .fd_base = 0xff1700000ULL,
495 .counter_base = 0xff1300000ULL,
496 .intctl_base = 0xff1400000ULL,
497 .dma_base = 0xef0400000ULL,
498 .esp_base = 0xef0800000ULL,
499 .le_base = 0xef0c00000ULL,
500 .power_base = 0xefa000000ULL,
501 .vram_size = 0x00100000,
502 .nvram_size = 0x2000,
503 .esp_irq = 18,
504 .le_irq = 16,
505 .clock_irq = 7,
506 .clock1_irq = 19,
507 .ms_kb_irq = 14,
508 .ser_irq = 15,
509 .fd_irq = 22,
510 .me_irq = 30,
511 .cs_irq = -1,
512 .machine_id = 0x72,
513 .iommu_version = 0x03000000,
514 .intbit_to_level = {
515 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
516 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
517 },
518 },
519 /* SS-600MP */
520 {
521 .iommu_base = 0xfe0000000ULL,
522 .tcx_base = 0xe20000000ULL,
523 .cs_base = -1,
524 .slavio_base = 0xff0000000ULL,
525 .ms_kb_base = 0xff1000000ULL,
526 .serial_base = 0xff1100000ULL,
527 .nvram_base = 0xff1200000ULL,
528 .fd_base = -1,
529 .counter_base = 0xff1300000ULL,
530 .intctl_base = 0xff1400000ULL,
531 .dma_base = 0xef0081000ULL,
532 .esp_base = 0xef0080000ULL,
533 .le_base = 0xef0060000ULL,
534 .power_base = 0xefa000000ULL,
535 .vram_size = 0x00100000,
536 .nvram_size = 0x2000,
537 .esp_irq = 18,
538 .le_irq = 16,
539 .clock_irq = 7,
540 .clock1_irq = 19,
541 .ms_kb_irq = 14,
542 .ser_irq = 15,
543 .fd_irq = 22,
544 .me_irq = 30,
545 .cs_irq = -1,
546 .machine_id = 0x71,
547 .iommu_version = 0x01000000,
548 .intbit_to_level = {
549 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
550 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
551 },
552 },
553 };
554
555 static void sun4m_common_init(int RAM_size, const char *boot_device, DisplayState *ds,
556 const char *kernel_filename, const char *kernel_cmdline,
557 const char *initrd_filename, const char *cpu_model,
558 unsigned int machine, int max_ram)
559 {
560 void *nvram;
561
562 if ((unsigned int)RAM_size > (unsigned int)max_ram) {
563 fprintf(stderr, "qemu: Too much memory for this machine: %d, maximum %d\n",
564 (unsigned int)RAM_size / (1024 * 1024),
565 (unsigned int)max_ram / (1024 * 1024));
566 exit(1);
567 }
568 nvram = sun4m_hw_init(&hwdefs[machine], RAM_size, ds, cpu_model);
569
570 sun4m_load_kernel(hwdefs[machine].vram_size, RAM_size, boot_device,
571 kernel_filename, kernel_cmdline, initrd_filename,
572 hwdefs[machine].machine_id, nvram);
573 }
574
575 /* SPARCstation 5 hardware initialisation */
576 static void ss5_init(int RAM_size, int vga_ram_size, const char *boot_device,
577 DisplayState *ds, const char **fd_filename, int snapshot,
578 const char *kernel_filename, const char *kernel_cmdline,
579 const char *initrd_filename, const char *cpu_model)
580 {
581 if (cpu_model == NULL)
582 cpu_model = "Fujitsu MB86904";
583 sun4m_common_init(RAM_size, boot_device, ds, kernel_filename,
584 kernel_cmdline, initrd_filename, cpu_model,
585 0, 0x10000000);
586 }
587
588 /* SPARCstation 10 hardware initialisation */
589 static void ss10_init(int RAM_size, int vga_ram_size, const char *boot_device,
590 DisplayState *ds, const char **fd_filename, int snapshot,
591 const char *kernel_filename, const char *kernel_cmdline,
592 const char *initrd_filename, const char *cpu_model)
593 {
594 if (cpu_model == NULL)
595 cpu_model = "TI SuperSparc II";
596 sun4m_common_init(RAM_size, boot_device, ds, kernel_filename,
597 kernel_cmdline, initrd_filename, cpu_model,
598 1, 0xffffffff); // XXX actually first 62GB ok
599 }
600
601 /* SPARCserver 600MP hardware initialisation */
602 static void ss600mp_init(int RAM_size, int vga_ram_size, const char *boot_device,
603 DisplayState *ds, const char **fd_filename, int snapshot,
604 const char *kernel_filename, const char *kernel_cmdline,
605 const char *initrd_filename, const char *cpu_model)
606 {
607 if (cpu_model == NULL)
608 cpu_model = "TI SuperSparc II";
609 sun4m_common_init(RAM_size, boot_device, ds, kernel_filename,
610 kernel_cmdline, initrd_filename, cpu_model,
611 2, 0xffffffff); // XXX actually first 62GB ok
612 }
613
614 QEMUMachine ss5_machine = {
615 "SS-5",
616 "Sun4m platform, SPARCstation 5",
617 ss5_init,
618 };
619
620 QEMUMachine ss10_machine = {
621 "SS-10",
622 "Sun4m platform, SPARCstation 10",
623 ss10_init,
624 };
625
626 QEMUMachine ss600mp_machine = {
627 "SS-600MP",
628 "Sun4m platform, SPARCserver 600MP",
629 ss600mp_init,
630 };