From c7ba218da1639a054b5ca1c259530305562fa571 Mon Sep 17 00:00:00 2001 From: blueswir1 Date: Tue, 22 Jul 2008 07:07:34 +0000 Subject: [PATCH] Add T1 and T2 CPUs, add a Sun4v machine git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4923 c046a42c-6fe2-441c-8c8c-71466251a162 --- hw/boards.h | 1 + hw/sun4u.c | 59 ++++++++++++++++++++++++++++++++++++------ qemu-doc.texi | 24 ++++++++++++++--- target-sparc/TODO | 4 ++- target-sparc/helper.c | 22 ++++++++++++++++ target-sparc/machine.c | 1 + 6 files changed, 98 insertions(+), 13 deletions(-) diff --git a/hw/boards.h b/hw/boards.h index eacd324148..22ac3326f4 100644 --- a/hw/boards.h +++ b/hw/boards.h @@ -64,6 +64,7 @@ extern QEMUMachine ss1000_machine, ss2000_machine; /* sun4u.c */ extern QEMUMachine sun4u_machine; +extern QEMUMachine sun4v_machine; /* integratorcp.c */ extern QEMUMachine integratorcp_machine; diff --git a/hw/sun4u.c b/hw/sun4u.c index e8280dd7ab..36d6946f87 100644 --- a/hw/sun4u.c +++ b/hw/sun4u.c @@ -1,5 +1,5 @@ /* - * QEMU Sun4u System Emulator + * QEMU Sun4u/Sun4v System Emulator * * Copyright (c) 2005 Fabrice Bellard * @@ -45,6 +45,10 @@ #define NVRAM_SIZE 0x2000 #define MAX_IDE_BUS 2 +struct hwdef { + const char * const default_cpu_model; +}; + int DMA_get_channel_mode (int nchan) { return 0; @@ -245,11 +249,11 @@ static const int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 }; static fdctrl_t *floppy_controller; -/* Sun4u hardware initialisation */ -static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, - const char *boot_devices, DisplayState *ds, - const char *kernel_filename, const char *kernel_cmdline, - const char *initrd_filename, const char *cpu_model) +static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, + const char *boot_devices, DisplayState *ds, + const char *kernel_filename, const char *kernel_cmdline, + const char *initrd_filename, const char *cpu_model, + const struct hwdef *hwdef) { CPUState *env; char buf[1024]; @@ -267,8 +271,9 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, linux_boot = (kernel_filename != NULL); /* init CPUs */ - if (cpu_model == NULL) - cpu_model = "TI UltraSparc II"; + if (!cpu_model) + cpu_model = hwdef->default_cpu_model; + env = cpu_init(cpu_model); if (!env) { fprintf(stderr, "Unable to find Sparc CPU definition\n"); @@ -409,9 +414,47 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, } +static const struct hwdef hwdefs[] = { + /* Sun4u generic PC-like machine */ + { + .default_cpu_model = "TI UltraSparc II", + }, + /* Sun4v generic PC-like machine */ + { + .default_cpu_model = "Sun UltraSparc T1", + }, +}; + +/* Sun4u hardware initialisation */ +static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, + const char *boot_devices, DisplayState *ds, + const char *kernel_filename, const char *kernel_cmdline, + const char *initrd_filename, const char *cpu_model) +{ + sun4uv_init(RAM_size, vga_ram_size, boot_devices, ds, kernel_filename, + kernel_cmdline, initrd_filename, cpu_model, &hwdefs[0]); +} + +/* Sun4v hardware initialisation */ +static void sun4v_init(ram_addr_t RAM_size, int vga_ram_size, + const char *boot_devices, DisplayState *ds, + const char *kernel_filename, const char *kernel_cmdline, + const char *initrd_filename, const char *cpu_model) +{ + sun4uv_init(RAM_size, vga_ram_size, boot_devices, ds, kernel_filename, + kernel_cmdline, initrd_filename, cpu_model, &hwdefs[1]); +} + QEMUMachine sun4u_machine = { "sun4u", "Sun4u platform", sun4u_init, PROM_SIZE_MAX + VGA_RAM_SIZE, }; + +QEMUMachine sun4v_machine = { + "sun4v", + "Sun4v platform", + sun4v_init, + PROM_SIZE_MAX + VGA_RAM_SIZE, +}; diff --git a/qemu-doc.texi b/qemu-doc.texi index f093915852..eb29a9ffca 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -75,7 +75,7 @@ For system emulation, the following hardware targets are supported: @item G3 BW PowerMac (PowerPC processor) @item Mac99 PowerMac (PowerPC processor, in progress) @item Sun4m/Sun4c/Sun4d (32-bit Sparc processor) -@item Sun4u (64-bit Sparc processor, in progress) +@item Sun4u/Sun4v (64-bit Sparc processor, in progress) @item Malta board (32-bit and 64-bit MIPS processors) @item MIPS Magnum (64-bit MIPS processor) @item ARM Integrator/CP (ARM) @@ -2315,10 +2315,10 @@ Set the emulated machine type. Default is SS-5. @node Sparc64 System emulator @section Sparc64 System emulator -Use the executable @file{qemu-system-sparc64} to simulate a Sun4u machine. -The emulator is not usable for anything yet. +Use the executable @file{qemu-system-sparc64} to simulate a Sun4u or +Sun4v machine. The emulator is not usable for anything yet. -QEMU emulates the following sun4u peripherals: +QEMU emulates the following peripherals: @itemize @minus @item @@ -2329,8 +2329,24 @@ PCI VGA compatible card with VESA Bochs Extensions Non Volatile RAM M48T59 @item PC-compatible serial ports +@item +2 PCI IDE interfaces with hard disk and CD-ROM support @end itemize +@c man begin OPTIONS + +The following options are specific to the Sparc64 emulation: + +@table @option + +@item -M [sun4u|sun4v] + +Set the emulated machine type. The default is sun4u. + +@end table + +@c man end + @node MIPS System emulator @section MIPS System emulator diff --git a/target-sparc/TODO b/target-sparc/TODO index 0d39994b20..70bdeeca71 100644 --- a/target-sparc/TODO +++ b/target-sparc/TODO @@ -86,4 +86,6 @@ Sun4u: - A lot of real machine types Sun4v: -- To be added +- A lot of unimplemented features + - A lot of real machine types + diff --git a/target-sparc/helper.c b/target-sparc/helper.c index 06265dc6a4..85b9d5ca11 100644 --- a/target-sparc/helper.c +++ b/target-sparc/helper.c @@ -1115,6 +1115,28 @@ static const sparc_def_t sparc_defs[] = { .nwindows = 8, .features = CPU_DEFAULT_FEATURES, }, + { + .name = "Sun UltraSparc T1", + // defined in sparc_ifu_fdp.v and ctu.h + .iu_version = ((0x3eULL << 48) | (0x23ULL << 32) | (0x02ULL << 24) + | (MAXTL << 8)), + .fpu_version = 0x00000000, + .mmu_version = mmu_sun4v, + .nwindows = 8, + .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT + | CPU_FEATURE_GL, + }, + { + .name = "Sun UltraSparc T2", + // defined in tlu_asi_ctl.v and n2_revid_cust.v + .iu_version = ((0x3eULL << 48) | (0x24ULL << 32) | (0x02ULL << 24) + | (MAXTL << 8)), + .fpu_version = 0x00000000, + .mmu_version = mmu_sun4v, + .nwindows = 8, + .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT + | CPU_FEATURE_GL, + }, { .name = "NEC UltraSparc I", .iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24) diff --git a/target-sparc/machine.c b/target-sparc/machine.c index aaac30b1e8..04a59da741 100644 --- a/target-sparc/machine.c +++ b/target-sparc/machine.c @@ -7,6 +7,7 @@ void register_machines(void) { #ifdef TARGET_SPARC64 qemu_register_machine(&sun4u_machine); + qemu_register_machine(&sun4v_machine); #else qemu_register_machine(&ss5_machine); qemu_register_machine(&ss10_machine);