Commit d0dfae6e91d9b2044523ed4db890860f898af86b
1 parent
08e46e54
Add bus model (or input pins) into PowerPC CPU flags.
Add PowerPC 970 bus and exceptions model. Add code provision for PowerPC 970 instanciation. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2680 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
238 additions
and
42 deletions
hw/ppc.c
... | ... | @@ -161,6 +161,128 @@ void ppc6xx_irq_init (CPUState *env) |
161 | 161 | env->irq_inputs = (void **)qemu_allocate_irqs(&ppc6xx_set_irq, env, 6); |
162 | 162 | } |
163 | 163 | |
164 | +/* PowerPC 970 internal IRQ controller */ | |
165 | +static void ppc970_set_irq (void *opaque, int pin, int level) | |
166 | +{ | |
167 | + CPUState *env = opaque; | |
168 | + int cur_level; | |
169 | + | |
170 | +#if defined(PPC_DEBUG_IRQ) | |
171 | + if (loglevel & CPU_LOG_INT) { | |
172 | + fprintf(logfile, "%s: env %p pin %d level %d\n", __func__, | |
173 | + env, pin, level); | |
174 | + } | |
175 | +#endif | |
176 | + cur_level = (env->irq_input_state >> pin) & 1; | |
177 | + /* Don't generate spurious events */ | |
178 | + if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) { | |
179 | + switch (pin) { | |
180 | + case PPC970_INPUT_INT: | |
181 | + /* Level sensitive - active high */ | |
182 | +#if defined(PPC_DEBUG_IRQ) | |
183 | + if (loglevel & CPU_LOG_INT) { | |
184 | + fprintf(logfile, "%s: set the external IRQ state to %d\n", | |
185 | + __func__, level); | |
186 | + } | |
187 | +#endif | |
188 | + ppc_set_irq(env, PPC_INTERRUPT_EXT, level); | |
189 | + break; | |
190 | + case PPC970_INPUT_THINT: | |
191 | + /* Level sensitive - active high */ | |
192 | +#if defined(PPC_DEBUG_IRQ) | |
193 | + if (loglevel & CPU_LOG_INT) { | |
194 | + fprintf(logfile, "%s: set the SMI IRQ state to %d\n", __func__, | |
195 | + level); | |
196 | + } | |
197 | +#endif | |
198 | + ppc_set_irq(env, PPC_INTERRUPT_THERM, level); | |
199 | + break; | |
200 | + case PPC970_INPUT_MCP: | |
201 | + /* Negative edge sensitive */ | |
202 | + /* XXX: TODO: actual reaction may depends on HID0 status | |
203 | + * 603/604/740/750: check HID0[EMCP] | |
204 | + */ | |
205 | + if (cur_level == 1 && level == 0) { | |
206 | +#if defined(PPC_DEBUG_IRQ) | |
207 | + if (loglevel & CPU_LOG_INT) { | |
208 | + fprintf(logfile, "%s: raise machine check state\n", | |
209 | + __func__); | |
210 | + } | |
211 | +#endif | |
212 | + ppc_set_irq(env, PPC_INTERRUPT_MCK, 1); | |
213 | + } | |
214 | + break; | |
215 | + case PPC970_INPUT_CKSTP: | |
216 | + /* Level sensitive - active low */ | |
217 | + /* XXX: TODO: relay the signal to CKSTP_OUT pin */ | |
218 | + if (level) { | |
219 | +#if defined(PPC_DEBUG_IRQ) | |
220 | + if (loglevel & CPU_LOG_INT) { | |
221 | + fprintf(logfile, "%s: stop the CPU\n", __func__); | |
222 | + } | |
223 | +#endif | |
224 | + env->halted = 1; | |
225 | + } else { | |
226 | +#if defined(PPC_DEBUG_IRQ) | |
227 | + if (loglevel & CPU_LOG_INT) { | |
228 | + fprintf(logfile, "%s: restart the CPU\n", __func__); | |
229 | + } | |
230 | +#endif | |
231 | + env->halted = 0; | |
232 | + } | |
233 | + break; | |
234 | + case PPC970_INPUT_HRESET: | |
235 | + /* Level sensitive - active low */ | |
236 | + if (level) { | |
237 | +#if 0 // XXX: TOFIX | |
238 | +#if defined(PPC_DEBUG_IRQ) | |
239 | + if (loglevel & CPU_LOG_INT) { | |
240 | + fprintf(logfile, "%s: reset the CPU\n", __func__); | |
241 | + } | |
242 | +#endif | |
243 | + cpu_reset(env); | |
244 | +#endif | |
245 | + } | |
246 | + break; | |
247 | + case PPC970_INPUT_SRESET: | |
248 | +#if defined(PPC_DEBUG_IRQ) | |
249 | + if (loglevel & CPU_LOG_INT) { | |
250 | + fprintf(logfile, "%s: set the RESET IRQ state to %d\n", | |
251 | + __func__, level); | |
252 | + } | |
253 | +#endif | |
254 | + ppc_set_irq(env, PPC_INTERRUPT_RESET, level); | |
255 | + break; | |
256 | + case PPC970_INPUT_TBEN: | |
257 | +#if defined(PPC_DEBUG_IRQ) | |
258 | + if (loglevel & CPU_LOG_INT) { | |
259 | + fprintf(logfile, "%s: set the TBEN state to %d\n", __func__, | |
260 | + level); | |
261 | + } | |
262 | +#endif | |
263 | + /* XXX: TODO */ | |
264 | + break; | |
265 | + default: | |
266 | + /* Unknown pin - do nothing */ | |
267 | +#if defined(PPC_DEBUG_IRQ) | |
268 | + if (loglevel & CPU_LOG_INT) { | |
269 | + fprintf(logfile, "%s: unknown IRQ pin %d\n", __func__, pin); | |
270 | + } | |
271 | +#endif | |
272 | + return; | |
273 | + } | |
274 | + if (level) | |
275 | + env->irq_input_state |= 1 << pin; | |
276 | + else | |
277 | + env->irq_input_state &= ~(1 << pin); | |
278 | + } | |
279 | +} | |
280 | + | |
281 | +void ppc970_irq_init (CPUState *env) | |
282 | +{ | |
283 | + env->irq_inputs = (void **)qemu_allocate_irqs(&ppc970_set_irq, env, 7); | |
284 | +} | |
285 | + | |
164 | 286 | /* PowerPC 405 internal IRQ controller */ |
165 | 287 | static void ppc405_set_irq (void *opaque, int pin, int level) |
166 | 288 | { | ... | ... |
target-ppc/cpu.h
... | ... | @@ -393,51 +393,60 @@ enum { |
393 | 393 | /* CPU run-time flags (MMU and exception model) */ |
394 | 394 | enum { |
395 | 395 | /* MMU model */ |
396 | - PPC_FLAGS_MMU_MASK = 0x0000000F, | |
396 | + PPC_FLAGS_MMU_MASK = 0x000000FF, | |
397 | 397 | /* Standard 32 bits PowerPC MMU */ |
398 | - PPC_FLAGS_MMU_32B = 0x00000000, | |
398 | + PPC_FLAGS_MMU_32B = 0x00000000, | |
399 | 399 | /* Standard 64 bits PowerPC MMU */ |
400 | - PPC_FLAGS_MMU_64B = 0x00000001, | |
400 | + PPC_FLAGS_MMU_64B = 0x00000001, | |
401 | 401 | /* PowerPC 601 MMU */ |
402 | - PPC_FLAGS_MMU_601 = 0x00000002, | |
402 | + PPC_FLAGS_MMU_601 = 0x00000002, | |
403 | 403 | /* PowerPC 6xx MMU with software TLB */ |
404 | - PPC_FLAGS_MMU_SOFT_6xx = 0x00000003, | |
404 | + PPC_FLAGS_MMU_SOFT_6xx = 0x00000003, | |
405 | 405 | /* PowerPC 4xx MMU with software TLB */ |
406 | - PPC_FLAGS_MMU_SOFT_4xx = 0x00000004, | |
406 | + PPC_FLAGS_MMU_SOFT_4xx = 0x00000004, | |
407 | 407 | /* PowerPC 403 MMU */ |
408 | - PPC_FLAGS_MMU_403 = 0x00000005, | |
409 | - /* Freescale e500 MMU model */ | |
410 | - PPC_FLAGS_MMU_e500 = 0x00000006, | |
408 | + PPC_FLAGS_MMU_403 = 0x00000005, | |
409 | + /* BookE FSL MMU model */ | |
410 | + PPC_FLAGS_MMU_BOOKE_FSL = 0x00000006, | |
411 | 411 | /* BookE MMU model */ |
412 | - PPC_FLAGS_MMU_BOOKE = 0x00000007, | |
412 | + PPC_FLAGS_MMU_BOOKE = 0x00000007, | |
413 | + /* 64 bits "bridge" PowerPC MMU */ | |
414 | + PPC_FLAGS_MMU_64BRIDGE = 0x00000008, | |
413 | 415 | /* Exception model */ |
414 | - PPC_FLAGS_EXCP_MASK = 0x000000F0, | |
416 | + PPC_FLAGS_EXCP_MASK = 0x0000FF00, | |
415 | 417 | /* Standard PowerPC exception model */ |
416 | - PPC_FLAGS_EXCP_STD = 0x00000000, | |
418 | + PPC_FLAGS_EXCP_STD = 0x00000000, | |
417 | 419 | /* PowerPC 40x exception model */ |
418 | - PPC_FLAGS_EXCP_40x = 0x00000010, | |
420 | + PPC_FLAGS_EXCP_40x = 0x00000100, | |
419 | 421 | /* PowerPC 601 exception model */ |
420 | - PPC_FLAGS_EXCP_601 = 0x00000020, | |
422 | + PPC_FLAGS_EXCP_601 = 0x00000200, | |
421 | 423 | /* PowerPC 602 exception model */ |
422 | - PPC_FLAGS_EXCP_602 = 0x00000030, | |
424 | + PPC_FLAGS_EXCP_602 = 0x00000300, | |
423 | 425 | /* PowerPC 603 exception model */ |
424 | - PPC_FLAGS_EXCP_603 = 0x00000040, | |
426 | + PPC_FLAGS_EXCP_603 = 0x00000400, | |
425 | 427 | /* PowerPC 604 exception model */ |
426 | - PPC_FLAGS_EXCP_604 = 0x00000050, | |
428 | + PPC_FLAGS_EXCP_604 = 0x00000500, | |
427 | 429 | /* PowerPC 7x0 exception model */ |
428 | - PPC_FLAGS_EXCP_7x0 = 0x00000060, | |
430 | + PPC_FLAGS_EXCP_7x0 = 0x00000600, | |
429 | 431 | /* PowerPC 7x5 exception model */ |
430 | - PPC_FLAGS_EXCP_7x5 = 0x00000070, | |
432 | + PPC_FLAGS_EXCP_7x5 = 0x00000700, | |
431 | 433 | /* PowerPC 74xx exception model */ |
432 | - PPC_FLAGS_EXCP_74xx = 0x00000080, | |
434 | + PPC_FLAGS_EXCP_74xx = 0x00000800, | |
433 | 435 | /* PowerPC 970 exception model */ |
434 | - PPC_FLAGS_EXCP_970 = 0x00000090, | |
436 | + PPC_FLAGS_EXCP_970 = 0x00000900, | |
435 | 437 | /* BookE exception model */ |
436 | - PPC_FLAGS_EXCP_BOOKE = 0x000000A0, | |
438 | + PPC_FLAGS_EXCP_BOOKE = 0x00000A00, | |
439 | + /* Input pins model */ | |
440 | + PPC_FLAGS_INPUT_MASK = 0x000F0000, | |
441 | + PPC_FLAGS_INPUT_6xx = 0x00000000, | |
442 | + PPC_FLAGS_INPUT_BookE = 0x00010000, | |
443 | + PPC_FLAGS_INPUT_40x = 0x00020000, | |
444 | + PPC_FLAGS_INPUT_970 = 0x00030000, | |
437 | 445 | }; |
438 | 446 | |
439 | 447 | #define PPC_MMU(env) (env->flags & PPC_FLAGS_MMU_MASK) |
440 | 448 | #define PPC_EXCP(env) (env->flags & PPC_FLAGS_EXCP_MASK) |
449 | +#define PPC_INPUT(env) (env->flags & PPC_FLAGS_INPUT_MASK) | |
441 | 450 | |
442 | 451 | /*****************************************************************************/ |
443 | 452 | /* Supported instruction set definitions */ |
... | ... | @@ -454,64 +463,78 @@ enum { |
454 | 463 | #define PPC_INSNS_403 (PPC_INSNS_EMB | PPC_MEM_SYNC | PPC_MEM_EIEIO | \ |
455 | 464 | PPC_MEM_TLBIA | PPC_4xx_COMMON | PPC_40x_EXCP | \ |
456 | 465 | PPC_40x_SPEC) |
457 | -#define PPC_FLAGS_403 (PPC_FLAGS_MMU_403 | PPC_FLAGS_EXCP_40x) | |
466 | +#define PPC_FLAGS_403 (PPC_FLAGS_MMU_403 | PPC_FLAGS_EXCP_40x | \ | |
467 | + PPC_FLAGS_INPUT_40x) | |
458 | 468 | /* PowerPC 405 */ |
459 | 469 | #define PPC_INSNS_405 (PPC_INSNS_EMB | PPC_MEM_SYNC | PPC_MEM_EIEIO | \ |
460 | 470 | PPC_CACHE_OPT | PPC_MEM_TLBIA | PPC_TB | \ |
461 | 471 | PPC_4xx_COMMON | PPC_40x_SPEC | PPC_40x_EXCP | \ |
462 | 472 | PPC_405_MAC) |
463 | -#define PPC_FLAGS_405 (PPC_FLAGS_MMU_SOFT_4xx | PPC_FLAGS_EXCP_40x) | |
473 | +#define PPC_FLAGS_405 (PPC_FLAGS_MMU_SOFT_4xx | PPC_FLAGS_EXCP_40x | \ | |
474 | + PPC_FLAGS_INPUT_40x) | |
464 | 475 | /* PowerPC 440 */ |
465 | 476 | #define PPC_INSNS_440 (PPC_INSNS_EMB | PPC_CACHE_OPT | PPC_BOOKE | \ |
466 | 477 | PPC_4xx_COMMON | PPC_405_MAC | PPC_440_SPEC) |
467 | -#define PPC_FLAGS_440 (PPC_FLAGS_MMU_BOOKE | PPC_FLAGS_EXCP_BOOKE) | |
478 | +#define PPC_FLAGS_440 (PPC_FLAGS_MMU_BOOKE | PPC_FLAGS_EXCP_BOOKE | \ | |
479 | + PPC_FLAGS_INPUT_BookE) | |
468 | 480 | /* Generic BookE PowerPC */ |
469 | 481 | #define PPC_INSNS_BOOKE (PPC_INSNS_EMB | PPC_BOOKE | PPC_MEM_EIEIO | \ |
470 | 482 | PPC_FLOAT | PPC_FLOAT_OPT | PPC_CACHE_OPT) |
471 | -#define PPC_FLAGS_BOOKE (PPC_FLAGS_MMU_BOOKE | PPC_FLAGS_EXCP_BOOKE) | |
483 | +#define PPC_FLAGS_BOOKE (PPC_FLAGS_MMU_BOOKE | PPC_FLAGS_EXCP_BOOKE | \ | |
484 | + PPC_FLAGS_INPUT_BookE) | |
472 | 485 | /* e500 core */ |
473 | 486 | #define PPC_INSNS_E500 (PPC_INSNS_EMB | PPC_BOOKE | PPC_MEM_EIEIO | \ |
474 | 487 | PPC_CACHE_OPT | PPC_E500_VECTOR) |
475 | -#define PPC_FLAGS_E500 (PPC_FLAGS_MMU_SOFT_4xx | PPC_FLAGS_EXCP_40x) | |
488 | +#define PPC_FLAGS_E500 (PPC_FLAGS_MMU_SOFT_4xx | PPC_FLAGS_EXCP_40x | \ | |
489 | + PPC_FLAGS_INPUT_BookE) | |
476 | 490 | /* Non-embedded PowerPC */ |
477 | 491 | #define PPC_INSNS_COMMON (PPC_INSNS_BASE | PPC_FLOAT | PPC_MEM_SYNC | \ |
478 | - PPC_MEM_EIEIO | PPC_SEGMENT | PPC_MEM_TLBIE) | |
492 | + PPC_MEM_EIEIO | PPC_SEGMENT | PPC_MEM_TLBIE) | |
479 | 493 | /* PowerPC 601 */ |
480 | 494 | #define PPC_INSNS_601 (PPC_INSNS_COMMON | PPC_EXTERN | PPC_POWER_BR) |
481 | -#define PPC_FLAGS_601 (PPC_FLAGS_MMU_601 | PPC_FLAGS_EXCP_601) | |
495 | +#define PPC_FLAGS_601 (PPC_FLAGS_MMU_601 | PPC_FLAGS_EXCP_601 | \ | |
496 | + PPC_FLAGS_INPUT_6xx) | |
482 | 497 | /* PowerPC 602 */ |
483 | 498 | #define PPC_INSNS_602 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB | \ |
484 | 499 | PPC_MEM_TLBSYNC | PPC_TB | PPC_602_SPEC) |
485 | -#define PPC_FLAGS_602 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_602) | |
500 | +#define PPC_FLAGS_602 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_602 | \ | |
501 | + PPC_FLAGS_INPUT_6xx) | |
486 | 502 | /* PowerPC 603 */ |
487 | 503 | #define PPC_INSNS_603 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB | \ |
488 | 504 | PPC_MEM_TLBSYNC | PPC_EXTERN | PPC_TB) |
489 | -#define PPC_FLAGS_603 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_603) | |
505 | +#define PPC_FLAGS_603 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_603 | \ | |
506 | + PPC_FLAGS_INPUT_6xx) | |
490 | 507 | /* PowerPC G2 */ |
491 | 508 | #define PPC_INSNS_G2 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_6xx_TLB | \ |
492 | 509 | PPC_MEM_TLBSYNC | PPC_EXTERN | PPC_TB) |
493 | -#define PPC_FLAGS_G2 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_603) | |
510 | +#define PPC_FLAGS_G2 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_603 | \ | |
511 | + PPC_FLAGS_INPUT_6xx) | |
494 | 512 | /* PowerPC 604 */ |
495 | 513 | #define PPC_INSNS_604 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN | \ |
496 | 514 | PPC_MEM_TLBSYNC | PPC_TB) |
497 | -#define PPC_FLAGS_604 (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_604) | |
515 | +#define PPC_FLAGS_604 (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_604 | \ | |
516 | + PPC_FLAGS_INPUT_6xx) | |
498 | 517 | /* PowerPC 740/750 (aka G3) */ |
499 | 518 | #define PPC_INSNS_7x0 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN | \ |
500 | 519 | PPC_MEM_TLBSYNC | PPC_TB) |
501 | -#define PPC_FLAGS_7x0 (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_7x0) | |
520 | +#define PPC_FLAGS_7x0 (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_7x0 | \ | |
521 | + PPC_FLAGS_INPUT_6xx) | |
502 | 522 | /* PowerPC 745/755 */ |
503 | 523 | #define PPC_INSNS_7x5 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_EXTERN | \ |
504 | 524 | PPC_MEM_TLBSYNC | PPC_TB | PPC_6xx_TLB) |
505 | -#define PPC_FLAGS_7x5 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_7x5) | |
525 | +#define PPC_FLAGS_7x5 (PPC_FLAGS_MMU_SOFT_6xx | PPC_FLAGS_EXCP_7x5 | \ | |
526 | + PPC_FLAGS_INPUT_6xx) | |
506 | 527 | /* PowerPC 74xx (aka G4) */ |
507 | 528 | #define PPC_INSNS_74xx (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_ALTIVEC | \ |
508 | 529 | PPC_MEM_TLBSYNC | PPC_TB) |
509 | -#define PPC_FLAGS_74xx (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_74xx) | |
530 | +#define PPC_FLAGS_74xx (PPC_FLAGS_MMU_32B | PPC_FLAGS_EXCP_74xx | \ | |
531 | + PPC_FLAGS_INPUT_6xx) | |
510 | 532 | /* PowerPC 970 (aka G5) */ |
511 | 533 | #define PPC_INSNS_970 (PPC_INSNS_COMMON | PPC_FLOAT_EXT | PPC_FLOAT_OPT | \ |
512 | 534 | PPC_ALTIVEC | PPC_MEM_TLBSYNC | PPC_TB | \ |
513 | 535 | PPC_64B | PPC_64_BRIDGE | PPC_SLBI) |
514 | -#define PPC_FLAGS_970 (PPC_FLAGS_MMU_64B | PPC_FLAGS_EXCP_970) | |
536 | +#define PPC_FLAGS_970 (PPC_FLAGS_MMU_64BRIDGE | PPC_FLAGS_EXCP_970 | \ | |
537 | + PPC_FLAGS_INPUT_970) | |
515 | 538 | |
516 | 539 | /* Default PowerPC will be 604/970 */ |
517 | 540 | #define PPC_INSNS_PPC32 PPC_INSNS_604 |
... | ... | @@ -1347,6 +1370,17 @@ enum { |
1347 | 1370 | PPC405_INPUT_DEBUG = 6, |
1348 | 1371 | }; |
1349 | 1372 | |
1373 | +enum { | |
1374 | + /* PowerPC 970 input pins */ | |
1375 | + PPC970_INPUT_HRESET = 0, | |
1376 | + PPC970_INPUT_SRESET = 1, | |
1377 | + PPC970_INPUT_CKSTP = 2, | |
1378 | + PPC970_INPUT_TBEN = 3, | |
1379 | + PPC970_INPUT_MCP = 4, | |
1380 | + PPC970_INPUT_INT = 5, | |
1381 | + PPC970_INPUT_THINT = 6, | |
1382 | +}; | |
1383 | + | |
1350 | 1384 | /* Hardware exceptions definitions */ |
1351 | 1385 | enum { |
1352 | 1386 | /* External hardware exception sources */ |
... | ... | @@ -1356,12 +1390,13 @@ enum { |
1356 | 1390 | PPC_INTERRUPT_SMI = 3, /* System management interrupt */ |
1357 | 1391 | PPC_INTERRUPT_CEXT = 4, /* Critical external interrupt */ |
1358 | 1392 | PPC_INTERRUPT_DEBUG = 5, /* External debug exception */ |
1393 | + PPC_INTERRUPT_THERM = 6, /* Thermal exception */ | |
1359 | 1394 | /* Internal hardware exception sources */ |
1360 | - PPC_INTERRUPT_DECR = 6, /* Decrementer exception */ | |
1361 | - PPC_INTERRUPT_HDECR = 7, /* Hypervisor decrementer exception */ | |
1362 | - PPC_INTERRUPT_PIT = 8, /* Programmable inteval timer interrupt */ | |
1363 | - PPC_INTERRUPT_FIT = 9, /* Fixed interval timer interrupt */ | |
1364 | - PPC_INTERRUPT_WDT = 10, /* Watchdog timer interrupt */ | |
1395 | + PPC_INTERRUPT_DECR = 7, /* Decrementer exception */ | |
1396 | + PPC_INTERRUPT_HDECR = 8, /* Hypervisor decrementer exception */ | |
1397 | + PPC_INTERRUPT_PIT = 9, /* Programmable inteval timer interrupt */ | |
1398 | + PPC_INTERRUPT_FIT = 10, /* Fixed interval timer interrupt */ | |
1399 | + PPC_INTERRUPT_WDT = 11, /* Watchdog timer interrupt */ | |
1365 | 1400 | }; |
1366 | 1401 | |
1367 | 1402 | /*****************************************************************************/ | ... | ... |
target-ppc/helper.c
... | ... | @@ -2003,6 +2003,13 @@ void ppc_hw_interrupt (CPUPPCState *env) |
2003 | 2003 | env->pending_interrupts &= ~(1 << PPC_INTERRUPT_EXT); |
2004 | 2004 | #endif |
2005 | 2005 | raised = 1; |
2006 | +#if 0 // TODO | |
2007 | + /* Thermal interrupt */ | |
2008 | + } else if (env->pending_interrupts & (1 << PPC_INTERRUPT_THERM)) { | |
2009 | + env->exception_index = EXCP_970_THRM; | |
2010 | + env->pending_interrupts &= ~(1 << PPC_INTERRUPT_THERM); | |
2011 | + raised = 1; | |
2012 | +#endif | |
2006 | 2013 | } |
2007 | 2014 | #if 0 // TODO |
2008 | 2015 | /* External debug exception */ | ... | ... |
target-ppc/translate_init.c
... | ... | @@ -48,6 +48,7 @@ void glue(glue(ppc, name),_irq_init) (CPUPPCState *env); |
48 | 48 | #endif |
49 | 49 | PPC_IRQ_INIT_FN(405); |
50 | 50 | PPC_IRQ_INIT_FN(6xx); |
51 | +PPC_IRQ_INIT_FN(970); | |
51 | 52 | |
52 | 53 | /* Generic callbacks: |
53 | 54 | * do nothing but store/retrieve spr value |
... | ... | @@ -2350,6 +2351,8 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) |
2350 | 2351 | case CPU_PPC_POWER5: /* Power 5 */ |
2351 | 2352 | case CPU_PPC_POWER5P: /* Power 5+ */ |
2352 | 2353 | #endif |
2354 | + break; | |
2355 | + | |
2353 | 2356 | case CPU_PPC_970: /* PowerPC 970 */ |
2354 | 2357 | case CPU_PPC_970FX10: /* PowerPC 970 FX */ |
2355 | 2358 | case CPU_PPC_970FX20: |
... | ... | @@ -2358,12 +2361,41 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) |
2358 | 2361 | case CPU_PPC_970FX31: |
2359 | 2362 | case CPU_PPC_970MP10: /* PowerPC 970 MP */ |
2360 | 2363 | case CPU_PPC_970MP11: |
2364 | + gen_spr_generic(env); | |
2365 | + gen_spr_ne_601(env); | |
2366 | + /* XXX: not correct */ | |
2367 | + gen_low_BATs(env); | |
2368 | + /* Time base */ | |
2369 | + gen_tbl(env); | |
2370 | + gen_spr_7xx(env); | |
2371 | + /* Hardware implementation registers */ | |
2372 | + /* XXX : not implemented */ | |
2373 | + spr_register(env, SPR_HID0, "HID0", | |
2374 | + SPR_NOACCESS, SPR_NOACCESS, | |
2375 | + &spr_read_generic, &spr_write_generic, | |
2376 | + 0x00000000); | |
2377 | + /* XXX : not implemented */ | |
2378 | + spr_register(env, SPR_HID1, "HID1", | |
2379 | + SPR_NOACCESS, SPR_NOACCESS, | |
2380 | + &spr_read_generic, &spr_write_generic, | |
2381 | + 0x00000000); | |
2382 | + /* XXX : not implemented */ | |
2383 | + spr_register(env, SPR_750_HID2, "HID2", | |
2384 | + SPR_NOACCESS, SPR_NOACCESS, | |
2385 | + &spr_read_generic, &spr_write_generic, | |
2386 | + 0x00000000); | |
2387 | + /* Allocate hardware IRQ controller */ | |
2388 | + ppc970_irq_init(env); | |
2389 | + break; | |
2390 | + | |
2361 | 2391 | #if defined (TODO) |
2362 | 2392 | case CPU_PPC_CELL10: /* Cell family */ |
2363 | 2393 | case CPU_PPC_CELL20: |
2364 | 2394 | case CPU_PPC_CELL30: |
2365 | 2395 | case CPU_PPC_CELL31: |
2366 | 2396 | #endif |
2397 | + break; | |
2398 | + | |
2367 | 2399 | #if defined (TODO) |
2368 | 2400 | case CPU_PPC_RS64: /* Apache (RS64/A35) */ |
2369 | 2401 | case CPU_PPC_RS64II: /* NorthStar (RS64-II/A50) */ | ... | ... |