sun4m.c
来自「xen虚拟机源代码安装包」· C语言 代码 · 共 1,534 行 · 第 1/4 页
C
1,534 行
const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4m_hw_init(&hwdefs[3], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}/* SPARCstation 2 hardware initialisation */static void ss2_init(ram_addr_t RAM_size, int vga_ram_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4c_hw_init(&hwdefs[4], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}/* SPARCstation Voyager hardware initialisation */static void vger_init(ram_addr_t RAM_size, int vga_ram_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4m_hw_init(&hwdefs[5], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}/* SPARCstation LX hardware initialisation */static void ss_lx_init(ram_addr_t RAM_size, int vga_ram_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4m_hw_init(&hwdefs[6], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}/* SPARCstation 4 hardware initialisation */static void ss4_init(ram_addr_t RAM_size, int vga_ram_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4m_hw_init(&hwdefs[7], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}/* SPARCClassic hardware initialisation */static void scls_init(ram_addr_t RAM_size, int vga_ram_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4m_hw_init(&hwdefs[8], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}/* SPARCbook hardware initialisation */static void sbook_init(ram_addr_t RAM_size, int vga_ram_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4m_hw_init(&hwdefs[9], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}QEMUMachine ss5_machine = { "SS-5", "Sun4m platform, SPARCstation 5", ss5_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine ss10_machine = { "SS-10", "Sun4m platform, SPARCstation 10", ss10_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine ss600mp_machine = { "SS-600MP", "Sun4m platform, SPARCserver 600MP", ss600mp_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine ss20_machine = { "SS-20", "Sun4m platform, SPARCstation 20", ss20_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine ss2_machine = { "SS-2", "Sun4c platform, SPARCstation 2", ss2_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine voyager_machine = { "Voyager", "Sun4m platform, SPARCstation Voyager", vger_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine ss_lx_machine = { "LX", "Sun4m platform, SPARCstation LX", ss_lx_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine ss4_machine = { "SS-4", "Sun4m platform, SPARCstation 4", ss4_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine scls_machine = { "SPARCClassic", "Sun4m platform, SPARCClassic", scls_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine sbook_machine = { "SPARCbook", "Sun4m platform, SPARCbook", sbook_init, PROM_SIZE_MAX + TCX_SIZE,};static const struct sun4d_hwdef sun4d_hwdefs[] = { /* SS-1000 */ { .iounit_bases = { 0xfe0200000ULL, 0xfe1200000ULL, 0xfe2200000ULL, 0xfe3200000ULL, -1, }, .tcx_base = 0x820000000ULL, .slavio_base = 0xf00000000ULL, .ms_kb_base = 0xf00240000ULL, .serial_base = 0xf00200000ULL, .nvram_base = 0xf00280000ULL, .counter_base = 0xf00300000ULL, .espdma_base = 0x800081000ULL, .esp_base = 0x800080000ULL, .ledma_base = 0x800040000ULL, .le_base = 0x800060000ULL, .sbi_base = 0xf02800000ULL, .vram_size = 0x00100000, .nvram_size = 0x2000, .esp_irq = 3, .le_irq = 4, .clock_irq = 14, .clock1_irq = 10, .ms_kb_irq = 12, .ser_irq = 12, .machine_id = 0x80, .iounit_version = 0x03000000, .max_mem = 0xf00000000ULL, .default_cpu_model = "TI SuperSparc II", }, /* SS-2000 */ { .iounit_bases = { 0xfe0200000ULL, 0xfe1200000ULL, 0xfe2200000ULL, 0xfe3200000ULL, 0xfe4200000ULL, }, .tcx_base = 0x820000000ULL, .slavio_base = 0xf00000000ULL, .ms_kb_base = 0xf00240000ULL, .serial_base = 0xf00200000ULL, .nvram_base = 0xf00280000ULL, .counter_base = 0xf00300000ULL, .espdma_base = 0x800081000ULL, .esp_base = 0x800080000ULL, .ledma_base = 0x800040000ULL, .le_base = 0x800060000ULL, .sbi_base = 0xf02800000ULL, .vram_size = 0x00100000, .nvram_size = 0x2000, .esp_irq = 3, .le_irq = 4, .clock_irq = 14, .clock1_irq = 10, .ms_kb_irq = 12, .ser_irq = 12, .machine_id = 0x80, .iounit_version = 0x03000000, .max_mem = 0xf00000000ULL, .default_cpu_model = "TI SuperSparc II", },};static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ CPUState *env, *envs[MAX_CPUS]; unsigned int i; void *iounits[MAX_IOUNITS], *espdma, *ledma, *main_esp, *nvram, *sbi; qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq, *espdma_irq, *ledma_irq; qemu_irq *esp_reset, *le_reset; unsigned long prom_offset, kernel_size; int ret; char buf[1024]; int drive_index; /* init CPUs */ if (!cpu_model) cpu_model = hwdef->default_cpu_model; for (i = 0; i < smp_cpus; i++) { env = cpu_init(cpu_model); if (!env) { fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n"); exit(1); } cpu_sparc_set_id(env, i); envs[i] = env; if (i == 0) { qemu_register_reset(main_cpu_reset, env); } else { qemu_register_reset(secondary_cpu_reset, env); env->halted = 1; } register_savevm("cpu", i, 3, cpu_save, cpu_load, env); cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS); env->prom_addr = hwdef->slavio_base; } for (i = smp_cpus; i < MAX_CPUS; i++) cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS); /* allocate RAM */ if ((uint64_t)RAM_size > hwdef->max_mem) { fprintf(stderr, "qemu: Too much memory for this machine: %d, maximum %d\n", (unsigned int)(RAM_size / (1024 * 1024)), (unsigned int)(hwdef->max_mem / (1024 * 1024))); exit(1); } cpu_register_physical_memory(0, RAM_size, 0); /* load boot prom */ prom_offset = RAM_size + hwdef->vram_size; cpu_register_physical_memory(hwdef->slavio_base, (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK, prom_offset | IO_MEM_ROM); if (bios_name == NULL) bios_name = PROM_FILENAME; snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name); ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL); if (ret < 0 || ret > PROM_SIZE_MAX) ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX); if (ret < 0 || ret > PROM_SIZE_MAX) { fprintf(stderr, "qemu: could not load prom '%s'\n", buf); exit(1); } /* set up devices */ sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs); for (i = 0; i < MAX_IOUNITS; i++) if (hwdef->iounit_bases[i] != (target_phys_addr_t)-1) iounits[i] = iommu_init(hwdef->iounit_bases[i], hwdef->iounit_version, sbi_irq[hwdef->me_irq]); espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[hwdef->esp_irq], iounits[0], &espdma_irq, &esp_reset); ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[hwdef->le_irq], iounits[0], &ledma_irq, &le_reset); if (graphic_depth != 8 && graphic_depth != 24) { fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth); exit (1); } tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size, hwdef->vram_size, graphic_width, graphic_height, graphic_depth); if (nd_table[0].model == NULL || strcmp(nd_table[0].model, "lance") == 0) { lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset); } else if (strcmp(nd_table[0].model, "?") == 0) { fprintf(stderr, "qemu: Supported NICs: lance\n"); exit (1); } else { fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model); exit (1); } nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0, hwdef->nvram_size, 8); slavio_timer_init_all(hwdef->counter_base, sbi_irq[hwdef->clock1_irq], sbi_cpu_irq, smp_cpus); slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[hwdef->ms_kb_irq], nographic); // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device slavio_serial_init(hwdef->serial_base, sbi_irq[hwdef->ser_irq], serial_hds[1], serial_hds[0]); if (drive_get_max_bus(IF_SCSI) > 0) { fprintf(stderr, "qemu: too many SCSI bus\n"); exit(1); } main_esp = esp_init(hwdef->esp_base, 2, espdma_memory_read, espdma_memory_write, espdma, *espdma_irq, esp_reset); for (i = 0; i < ESP_MAX_DEVS; i++) { drive_index = drive_get_index(IF_SCSI, 0, i); if (drive_index == -1) continue; esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i); } kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename, RAM_size); nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, boot_device, RAM_size, kernel_size, graphic_width, graphic_height, graphic_depth, hwdef->machine_id, "Sun4d");}/* SPARCserver 1000 hardware initialisation */static void ss1000_init(ram_addr_t RAM_size, int vga_ram_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}/* SPARCcenter 2000 hardware initialisation */static void ss2000_init(ram_addr_t RAM_size, int vga_ram_size, const char *boot_device, DisplayState *ds, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model){ sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, ds, kernel_filename, kernel_cmdline, initrd_filename, cpu_model);}QEMUMachine ss1000_machine = { "SS-1000", "Sun4d platform, SPARCserver 1000", ss1000_init, PROM_SIZE_MAX + TCX_SIZE,};QEMUMachine ss2000_machine = { "SS-2000", "Sun4d platform, SPARCcenter 2000", ss2000_init, PROM_SIZE_MAX + TCX_SIZE,};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?