Commit e0353fe250eacac23104ff7fe466cd6533536509
1 parent
36cd9210
Add SparcStation-10 machine
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2571 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
78 additions
and
13 deletions
hw/slavio_intctl.c
| @@ -54,6 +54,7 @@ typedef struct SLAVIO_INTCTLState { | @@ -54,6 +54,7 @@ typedef struct SLAVIO_INTCTLState { | ||
| 54 | uint64_t irq_count[32]; | 54 | uint64_t irq_count[32]; |
| 55 | #endif | 55 | #endif |
| 56 | CPUState *cpu_envs[MAX_CPUS]; | 56 | CPUState *cpu_envs[MAX_CPUS]; |
| 57 | + const uint32_t *intbit_to_level; | ||
| 57 | } SLAVIO_INTCTLState; | 58 | } SLAVIO_INTCTLState; |
| 58 | 59 | ||
| 59 | #define INTCTL_MAXADDR 0xf | 60 | #define INTCTL_MAXADDR 0xf |
| @@ -208,11 +209,6 @@ void slavio_irq_info(void *opaque) | @@ -208,11 +209,6 @@ void slavio_irq_info(void *opaque) | ||
| 208 | #endif | 209 | #endif |
| 209 | } | 210 | } |
| 210 | 211 | ||
| 211 | -static const uint32_t intbit_to_level[32] = { | ||
| 212 | - 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12, | ||
| 213 | - 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0, | ||
| 214 | -}; | ||
| 215 | - | ||
| 216 | static void slavio_check_interrupts(void *opaque) | 212 | static void slavio_check_interrupts(void *opaque) |
| 217 | { | 213 | { |
| 218 | CPUState *env; | 214 | CPUState *env; |
| @@ -225,8 +221,8 @@ static void slavio_check_interrupts(void *opaque) | @@ -225,8 +221,8 @@ static void slavio_check_interrupts(void *opaque) | ||
| 225 | if (pending && !(s->intregm_disabled & 0x80000000)) { | 221 | if (pending && !(s->intregm_disabled & 0x80000000)) { |
| 226 | for (i = 0; i < 32; i++) { | 222 | for (i = 0; i < 32; i++) { |
| 227 | if (pending & (1 << i)) { | 223 | if (pending & (1 << i)) { |
| 228 | - if (max < intbit_to_level[i]) | ||
| 229 | - max = intbit_to_level[i]; | 224 | + if (max < s->intbit_to_level[i]) |
| 225 | + max = s->intbit_to_level[i]; | ||
| 230 | } | 226 | } |
| 231 | } | 227 | } |
| 232 | env = s->cpu_envs[s->target_cpu]; | 228 | env = s->cpu_envs[s->target_cpu]; |
| @@ -288,7 +284,7 @@ void slavio_pic_set_irq(void *opaque, int irq, int level) | @@ -288,7 +284,7 @@ void slavio_pic_set_irq(void *opaque, int irq, int level) | ||
| 288 | DPRINTF("Set cpu %d irq %d level %d\n", s->target_cpu, irq, level); | 284 | DPRINTF("Set cpu %d irq %d level %d\n", s->target_cpu, irq, level); |
| 289 | if (irq < 32) { | 285 | if (irq < 32) { |
| 290 | uint32_t mask = 1 << irq; | 286 | uint32_t mask = 1 << irq; |
| 291 | - uint32_t pil = intbit_to_level[irq]; | 287 | + uint32_t pil = s->intbit_to_level[irq]; |
| 292 | if (pil > 0) { | 288 | if (pil > 0) { |
| 293 | if (level) { | 289 | if (level) { |
| 294 | s->intregm_pending |= mask; | 290 | s->intregm_pending |= mask; |
| @@ -313,7 +309,7 @@ void slavio_pic_set_irq_cpu(void *opaque, int irq, int level, unsigned int cpu) | @@ -313,7 +309,7 @@ void slavio_pic_set_irq_cpu(void *opaque, int irq, int level, unsigned int cpu) | ||
| 313 | return; | 309 | return; |
| 314 | } | 310 | } |
| 315 | if (irq < 32) { | 311 | if (irq < 32) { |
| 316 | - uint32_t pil = intbit_to_level[irq]; | 312 | + uint32_t pil = s->intbit_to_level[irq]; |
| 317 | if (pil > 0) { | 313 | if (pil > 0) { |
| 318 | if (level) { | 314 | if (level) { |
| 319 | s->intreg_pending[cpu] |= 1 << pil; | 315 | s->intreg_pending[cpu] |= 1 << pil; |
| @@ -375,7 +371,8 @@ void slavio_intctl_set_cpu(void *opaque, unsigned int cpu, CPUState *env) | @@ -375,7 +371,8 @@ void slavio_intctl_set_cpu(void *opaque, unsigned int cpu, CPUState *env) | ||
| 375 | s->cpu_envs[cpu] = env; | 371 | s->cpu_envs[cpu] = env; |
| 376 | } | 372 | } |
| 377 | 373 | ||
| 378 | -void *slavio_intctl_init(uint32_t addr, uint32_t addrg) | 374 | +void *slavio_intctl_init(uint32_t addr, uint32_t addrg, |
| 375 | + const uint32_t *intbit_to_level) | ||
| 379 | { | 376 | { |
| 380 | int slavio_intctl_io_memory, slavio_intctlm_io_memory, i; | 377 | int slavio_intctl_io_memory, slavio_intctlm_io_memory, i; |
| 381 | SLAVIO_INTCTLState *s; | 378 | SLAVIO_INTCTLState *s; |
| @@ -384,6 +381,7 @@ void *slavio_intctl_init(uint32_t addr, uint32_t addrg) | @@ -384,6 +381,7 @@ void *slavio_intctl_init(uint32_t addr, uint32_t addrg) | ||
| 384 | if (!s) | 381 | if (!s) |
| 385 | return NULL; | 382 | return NULL; |
| 386 | 383 | ||
| 384 | + s->intbit_to_level = intbit_to_level; | ||
| 387 | for (i = 0; i < MAX_CPUS; i++) { | 385 | for (i = 0; i < MAX_CPUS; i++) { |
| 388 | slavio_intctl_io_memory = cpu_register_io_memory(0, slavio_intctl_mem_read, slavio_intctl_mem_write, s); | 386 | slavio_intctl_io_memory = cpu_register_io_memory(0, slavio_intctl_mem_read, slavio_intctl_mem_write, s); |
| 389 | cpu_register_physical_memory(addr + i * TARGET_PAGE_SIZE, INTCTL_MAXADDR, slavio_intctl_io_memory); | 387 | cpu_register_physical_memory(addr + i * TARGET_PAGE_SIZE, INTCTL_MAXADDR, slavio_intctl_io_memory); |
hw/sun4m.c
| @@ -59,6 +59,7 @@ struct hwdef { | @@ -59,6 +59,7 @@ struct hwdef { | ||
| 59 | int intctl_g_intr, esp_irq, le_irq, cpu_irq, clock_irq, clock1_irq; | 59 | int intctl_g_intr, esp_irq, le_irq, cpu_irq, clock_irq, clock1_irq; |
| 60 | int ser_irq, ms_kb_irq, fd_irq, me_irq, cs_irq; | 60 | int ser_irq, ms_kb_irq, fd_irq, me_irq, cs_irq; |
| 61 | int machine_id; // For NVRAM | 61 | int machine_id; // For NVRAM |
| 62 | + uint32_t intbit_to_level[32]; | ||
| 62 | }; | 63 | }; |
| 63 | 64 | ||
| 64 | /* TSC handling */ | 65 | /* TSC handling */ |
| @@ -238,7 +239,8 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | @@ -238,7 +239,8 @@ static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size, | ||
| 238 | 239 | ||
| 239 | iommu = iommu_init(hwdef->iommu_base); | 240 | iommu = iommu_init(hwdef->iommu_base); |
| 240 | slavio_intctl = slavio_intctl_init(hwdef->intctl_base, | 241 | slavio_intctl = slavio_intctl_init(hwdef->intctl_base, |
| 241 | - hwdef->intctl_base + 0x10000); | 242 | + hwdef->intctl_base + 0x10000, |
| 243 | + &hwdef->intbit_to_level[0]); | ||
| 242 | for(i = 0; i < smp_cpus; i++) { | 244 | for(i = 0; i < smp_cpus; i++) { |
| 243 | slavio_intctl_set_cpu(slavio_intctl, i, envs[i]); | 245 | slavio_intctl_set_cpu(slavio_intctl, i, envs[i]); |
| 244 | } | 246 | } |
| @@ -375,6 +377,43 @@ static const struct hwdef hwdefs[] = { | @@ -375,6 +377,43 @@ static const struct hwdef hwdefs[] = { | ||
| 375 | .me_irq = 30, | 377 | .me_irq = 30, |
| 376 | .cs_irq = 5, | 378 | .cs_irq = 5, |
| 377 | .machine_id = 0x80, | 379 | .machine_id = 0x80, |
| 380 | + .intbit_to_level = { | ||
| 381 | + 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12, | ||
| 382 | + 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0, | ||
| 383 | + }, | ||
| 384 | + }, | ||
| 385 | + /* SS-10 */ | ||
| 386 | + /* XXX: Replace with real values */ | ||
| 387 | + { | ||
| 388 | + .iommu_base = 0x10000000, | ||
| 389 | + .tcx_base = 0x50000000, | ||
| 390 | + .cs_base = 0x6c000000, | ||
| 391 | + .slavio_base = 0x71000000, | ||
| 392 | + .ms_kb_base = 0x71000000, | ||
| 393 | + .serial_base = 0x71100000, | ||
| 394 | + .nvram_base = 0x71200000, | ||
| 395 | + .fd_base = 0x71400000, | ||
| 396 | + .counter_base = 0x71d00000, | ||
| 397 | + .intctl_base = 0x71e00000, | ||
| 398 | + .dma_base = 0x78400000, | ||
| 399 | + .esp_base = 0x78800000, | ||
| 400 | + .le_base = 0x78c00000, | ||
| 401 | + .vram_size = 0x00100000, | ||
| 402 | + .nvram_size = 0x2000, | ||
| 403 | + .esp_irq = 18, | ||
| 404 | + .le_irq = 16, | ||
| 405 | + .clock_irq = 7, | ||
| 406 | + .clock1_irq = 19, | ||
| 407 | + .ms_kb_irq = 14, | ||
| 408 | + .ser_irq = 15, | ||
| 409 | + .fd_irq = 22, | ||
| 410 | + .me_irq = 30, | ||
| 411 | + .cs_irq = 5, | ||
| 412 | + .machine_id = 0x73, | ||
| 413 | + .intbit_to_level = { | ||
| 414 | + 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12, | ||
| 415 | + 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0, | ||
| 416 | + }, | ||
| 378 | }, | 417 | }, |
| 379 | }; | 418 | }; |
| 380 | 419 | ||
| @@ -403,8 +442,27 @@ static void ss5_init(int ram_size, int vga_ram_size, int boot_device, | @@ -403,8 +442,27 @@ static void ss5_init(int ram_size, int vga_ram_size, int boot_device, | ||
| 403 | 0); | 442 | 0); |
| 404 | } | 443 | } |
| 405 | 444 | ||
| 445 | +/* SPARCstation 10 hardware initialisation */ | ||
| 446 | +static void ss10_init(int ram_size, int vga_ram_size, int boot_device, | ||
| 447 | + DisplayState *ds, const char **fd_filename, int snapshot, | ||
| 448 | + const char *kernel_filename, const char *kernel_cmdline, | ||
| 449 | + const char *initrd_filename, const char *cpu_model) | ||
| 450 | +{ | ||
| 451 | + if (cpu_model == NULL) | ||
| 452 | + cpu_model = "TI SuperSparc II"; | ||
| 453 | + sun4m_common_init(ram_size, boot_device, ds, kernel_filename, | ||
| 454 | + kernel_cmdline, initrd_filename, cpu_model, | ||
| 455 | + 1); | ||
| 456 | +} | ||
| 457 | + | ||
| 406 | QEMUMachine ss5_machine = { | 458 | QEMUMachine ss5_machine = { |
| 407 | "SS-5", | 459 | "SS-5", |
| 408 | "Sun4m platform, SPARCstation 5", | 460 | "Sun4m platform, SPARCstation 5", |
| 409 | ss5_init, | 461 | ss5_init, |
| 410 | }; | 462 | }; |
| 463 | + | ||
| 464 | +QEMUMachine ss10_machine = { | ||
| 465 | + "SS-10", | ||
| 466 | + "Sun4m platform, SPARCstation 10", | ||
| 467 | + ss10_init, | ||
| 468 | +}; |
target-sparc/translate.c
| @@ -2874,6 +2874,13 @@ static const sparc_def_t sparc_defs[] = { | @@ -2874,6 +2874,13 @@ static const sparc_def_t sparc_defs[] = { | ||
| 2874 | .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ | 2874 | .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */ |
| 2875 | .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */ | 2875 | .mmu_version = 0x04 << 24, /* Impl 0, ver 4 */ |
| 2876 | }, | 2876 | }, |
| 2877 | + { | ||
| 2878 | + /* XXX: Replace with real values */ | ||
| 2879 | + .name = "TI SuperSparc II", | ||
| 2880 | + .iu_version = 0x40000000, | ||
| 2881 | + .fpu_version = 0x00000000, | ||
| 2882 | + .mmu_version = 0x00000000, | ||
| 2883 | + }, | ||
| 2877 | #endif | 2884 | #endif |
| 2878 | }; | 2885 | }; |
| 2879 | 2886 |
vl.c
| @@ -6691,6 +6691,7 @@ void register_machines(void) | @@ -6691,6 +6691,7 @@ void register_machines(void) | ||
| 6691 | qemu_register_machine(&sun4u_machine); | 6691 | qemu_register_machine(&sun4u_machine); |
| 6692 | #else | 6692 | #else |
| 6693 | qemu_register_machine(&ss5_machine); | 6693 | qemu_register_machine(&ss5_machine); |
| 6694 | + qemu_register_machine(&ss10_machine); | ||
| 6694 | #endif | 6695 | #endif |
| 6695 | #elif defined(TARGET_ARM) | 6696 | #elif defined(TARGET_ARM) |
| 6696 | qemu_register_machine(&integratorcp_machine); | 6697 | qemu_register_machine(&integratorcp_machine); |
vl.h
| @@ -1143,7 +1143,7 @@ extern CPUReadMemoryFunc *PPC_io_read[]; | @@ -1143,7 +1143,7 @@ extern CPUReadMemoryFunc *PPC_io_read[]; | ||
| 1143 | void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val); | 1143 | void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val); |
| 1144 | 1144 | ||
| 1145 | /* sun4m.c */ | 1145 | /* sun4m.c */ |
| 1146 | -extern QEMUMachine ss5_machine; | 1146 | +extern QEMUMachine ss5_machine, ss10_machine; |
| 1147 | void pic_set_irq_cpu(int irq, int level, unsigned int cpu); | 1147 | void pic_set_irq_cpu(int irq, int level, unsigned int cpu); |
| 1148 | 1148 | ||
| 1149 | /* iommu.c */ | 1149 | /* iommu.c */ |
| @@ -1169,7 +1169,8 @@ void tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base, | @@ -1169,7 +1169,8 @@ void tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base, | ||
| 1169 | unsigned long vram_offset, int vram_size, int width, int height); | 1169 | unsigned long vram_offset, int vram_size, int width, int height); |
| 1170 | 1170 | ||
| 1171 | /* slavio_intctl.c */ | 1171 | /* slavio_intctl.c */ |
| 1172 | -void *slavio_intctl_init(uint32_t addr, uint32_t addrg); | 1172 | +void *slavio_intctl_init(uint32_t addr, uint32_t addrg, |
| 1173 | + const uint32_t *intbit_to_level); | ||
| 1173 | void slavio_intctl_set_cpu(void *opaque, unsigned int cpu, CPUState *env); | 1174 | void slavio_intctl_set_cpu(void *opaque, unsigned int cpu, CPUState *env); |
| 1174 | void slavio_pic_info(void *opaque); | 1175 | void slavio_pic_info(void *opaque); |
| 1175 | void slavio_irq_info(void *opaque); | 1176 | void slavio_irq_info(void *opaque); |