Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Blackfin: dpmc: optimize hibernate/resume path

The current save logic used in hibernation is to do a MMR load (base +
offset) into a register, and then push that onto the stack. Then when
restoring, pop off the stack into a register followed by a MMR store
(base + offset). These use plenty of 32bit insns rather than 16bit,
are pretty long winded, and full of pipeline bubbles.

So, by taking advantage of MMRs that are contiguous, the multi-register
push/pop insn, and register abuse, we can shrink this code considerably.

When saving, the new logic does a lot of loads into the data and pointer
registers before executing a single multi-register push insn. Then when
restoring, we do a single multi-register pop insn followed by a lot of
stores. Overall, this allows us to cut the insn count by ~30%, the code
size by ~45%, and drastically reduce the register hazards that trigger
bubbles in the pipeline.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>

+570 -437
-1
arch/blackfin/include/asm/dpmc.h
··· 117 117 #ifndef __ASSEMBLY__ 118 118 119 119 void sleep_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); 120 - void hibernate_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); 121 120 void sleep_deeper(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); 122 121 void do_hibernate(int wakeup); 123 122 void set_dram_srfs(void);
+570 -436
arch/blackfin/mach-common/dpmc_modes.S
··· 50 50 RTS; 51 51 ENDPROC(_sleep_mode) 52 52 53 + /* 54 + * This func never returns as it puts the part into hibernate, and 55 + * is only called from do_hibernate, so we don't bother saving or 56 + * restoring any of the normal C runtime state. When we wake up, 57 + * the entry point will be in do_hibernate and not here. 58 + * 59 + * We accept just one argument -- the value to write to VR_CTL. 60 + */ 53 61 ENTRY(_hibernate_mode) 54 - [--SP] = ( R7:0, P5:0 ); 55 - [--SP] = RETS; 62 + /* Save/setup the regs we need early for minor pipeline optimization */ 63 + R4 = R0; 64 + P3.H = hi(VR_CTL); 65 + P3.L = lo(VR_CTL); 56 66 57 - R3 = R0; 67 + /* Disable all wakeup sources */ 58 68 R0 = IWR_DISABLE_ALL; 59 69 R1 = IWR_DISABLE_ALL; 60 70 R2 = IWR_DISABLE_ALL; ··· 72 62 call _set_dram_srfs; 73 63 SSYNC; 74 64 75 - P0.H = hi(VR_CTL); 76 - P0.L = lo(VR_CTL); 77 - 78 - W[P0] = R3.L; 65 + /* Finally, we climb into our cave to hibernate */ 66 + W[P3] = R4.L; 79 67 CLI R2; 80 68 IDLE; 81 69 .Lforever: ··· 276 268 277 269 .section .text 278 270 279 - #define PM_PUSH(x) \ 280 - R0 = [P0 + (x - SRAM_BASE_ADDRESS)];\ 281 - [--SP] = R0;\ 271 + #define PM_REG0 R7 272 + #define PM_REG1 R6 273 + #define PM_REG2 R5 274 + #define PM_REG3 R4 275 + #define PM_REG4 R3 276 + #define PM_REG5 R2 277 + #define PM_REG6 R1 278 + #define PM_REG7 R0 279 + #define PM_REG8 P5 280 + #define PM_REG9 P4 281 + #define PM_REG10 P3 282 + #define PM_REG11 P2 283 + #define PM_REG12 P1 284 + #define PM_REG13 P0 282 285 283 - #define PM_POP(x) \ 284 - R0 = [SP++];\ 285 - [P0 + (x - SRAM_BASE_ADDRESS)] = R0;\ 286 + #define PM_REGSET0 R7:7 287 + #define PM_REGSET1 R7:6 288 + #define PM_REGSET2 R7:5 289 + #define PM_REGSET3 R7:4 290 + #define PM_REGSET4 R7:3 291 + #define PM_REGSET5 R7:2 292 + #define PM_REGSET6 R7:1 293 + #define PM_REGSET7 R7:0 294 + #define PM_REGSET8 R7:0, P5:5 295 + #define PM_REGSET9 R7:0, P5:4 296 + #define PM_REGSET10 R7:0, P5:3 297 + #define PM_REGSET11 R7:0, P5:2 298 + #define PM_REGSET12 R7:0, P5:1 299 + #define PM_REGSET13 R7:0, P5:0 286 300 287 - #define PM_SYS_PUSH(x) \ 288 - R0 = [P0 + (x - PLL_CTL)];\ 289 - [--SP] = R0;\ 290 - 291 - #define PM_SYS_POP(x) \ 292 - R0 = [SP++];\ 293 - [P0 + (x - PLL_CTL)] = R0;\ 294 - 295 - #define PM_SYS_PUSH16(x) \ 296 - R0 = w[P0 + (x - PLL_CTL)];\ 297 - [--SP] = R0;\ 298 - 299 - #define PM_SYS_POP16(x) \ 300 - R0 = [SP++];\ 301 - w[P0 + (x - PLL_CTL)] = R0;\ 301 + #define _PM_PUSH(n, x, w, base) PM_REG##n = w[FP + ((x) - (base))]; 302 + #define _PM_POP(n, x, w, base) w[FP + ((x) - (base))] = PM_REG##n; 303 + #define PM_PUSH_SYNC(n) [--sp] = (PM_REGSET##n); 304 + #define PM_POP_SYNC(n) (PM_REGSET##n) = [sp++]; 305 + #define PM_PUSH(n, x) PM_REG##n = [FP++]; 306 + #define PM_POP(n, x) [FP--] = PM_REG##n; 307 + #define PM_CORE_PUSH(n, x) _PM_PUSH(n, x, , COREMMR_BASE) 308 + #define PM_CORE_POP(n, x) _PM_POP(n, x, , COREMMR_BASE) 309 + #define PM_SYS_PUSH(n, x) _PM_PUSH(n, x, , SYSMMR_BASE) 310 + #define PM_SYS_POP(n, x) _PM_POP(n, x, , SYSMMR_BASE) 311 + #define PM_SYS_PUSH16(n, x) _PM_PUSH(n, x, w, SYSMMR_BASE) 312 + #define PM_SYS_POP16(n, x) _PM_POP(n, x, w, SYSMMR_BASE) 302 313 303 314 ENTRY(_do_hibernate) 304 - [--SP] = ( R7:0, P5:0 ); 305 - [--SP] = RETS; 306 - /* Save System MMRs */ 307 - R2 = R0; 308 - P0.H = hi(PLL_CTL); 309 - P0.L = lo(PLL_CTL); 310 - 311 - #ifdef SIC_IMASK0 312 - PM_SYS_PUSH(SIC_IMASK0) 313 - #endif 314 - #ifdef SIC_IMASK1 315 - PM_SYS_PUSH(SIC_IMASK1) 316 - #endif 317 - #ifdef SIC_IMASK2 318 - PM_SYS_PUSH(SIC_IMASK2) 319 - #endif 320 - #ifdef SIC_IMASK 321 - PM_SYS_PUSH(SIC_IMASK) 322 - #endif 323 - #ifdef SIC_IAR0 324 - PM_SYS_PUSH(SIC_IAR0) 325 - PM_SYS_PUSH(SIC_IAR1) 326 - PM_SYS_PUSH(SIC_IAR2) 327 - #endif 328 - #ifdef SIC_IAR3 329 - PM_SYS_PUSH(SIC_IAR3) 330 - #endif 331 - #ifdef SIC_IAR4 332 - PM_SYS_PUSH(SIC_IAR4) 333 - PM_SYS_PUSH(SIC_IAR5) 334 - PM_SYS_PUSH(SIC_IAR6) 335 - #endif 336 - #ifdef SIC_IAR7 337 - PM_SYS_PUSH(SIC_IAR7) 338 - #endif 339 - #ifdef SIC_IAR8 340 - PM_SYS_PUSH(SIC_IAR8) 341 - PM_SYS_PUSH(SIC_IAR9) 342 - PM_SYS_PUSH(SIC_IAR10) 343 - PM_SYS_PUSH(SIC_IAR11) 344 - #endif 345 - 346 - #ifdef SIC_IWR 347 - PM_SYS_PUSH(SIC_IWR) 348 - #endif 349 - #ifdef SIC_IWR0 350 - PM_SYS_PUSH(SIC_IWR0) 351 - #endif 352 - #ifdef SIC_IWR1 353 - PM_SYS_PUSH(SIC_IWR1) 354 - #endif 355 - #ifdef SIC_IWR2 356 - PM_SYS_PUSH(SIC_IWR2) 357 - #endif 358 - 359 - #ifdef PINT0_ASSIGN 360 - PM_SYS_PUSH(PINT0_MASK_SET) 361 - PM_SYS_PUSH(PINT1_MASK_SET) 362 - PM_SYS_PUSH(PINT2_MASK_SET) 363 - PM_SYS_PUSH(PINT3_MASK_SET) 364 - PM_SYS_PUSH(PINT0_ASSIGN) 365 - PM_SYS_PUSH(PINT1_ASSIGN) 366 - PM_SYS_PUSH(PINT2_ASSIGN) 367 - PM_SYS_PUSH(PINT3_ASSIGN) 368 - PM_SYS_PUSH(PINT0_INVERT_SET) 369 - PM_SYS_PUSH(PINT1_INVERT_SET) 370 - PM_SYS_PUSH(PINT2_INVERT_SET) 371 - PM_SYS_PUSH(PINT3_INVERT_SET) 372 - PM_SYS_PUSH(PINT0_EDGE_SET) 373 - PM_SYS_PUSH(PINT1_EDGE_SET) 374 - PM_SYS_PUSH(PINT2_EDGE_SET) 375 - PM_SYS_PUSH(PINT3_EDGE_SET) 376 - #endif 377 - 378 - PM_SYS_PUSH(EBIU_AMBCTL0) 379 - PM_SYS_PUSH(EBIU_AMBCTL1) 380 - PM_SYS_PUSH16(EBIU_AMGCTL) 381 - 382 - #ifdef EBIU_FCTL 383 - PM_SYS_PUSH(EBIU_MBSCTL) 384 - PM_SYS_PUSH(EBIU_MODE) 385 - PM_SYS_PUSH(EBIU_FCTL) 386 - #endif 387 - 388 - #ifdef PORTCIO_FER 389 - PM_SYS_PUSH16(PORTCIO_DIR) 390 - PM_SYS_PUSH16(PORTCIO_INEN) 391 - PM_SYS_PUSH16(PORTCIO) 392 - PM_SYS_PUSH16(PORTCIO_FER) 393 - PM_SYS_PUSH16(PORTDIO_DIR) 394 - PM_SYS_PUSH16(PORTDIO_INEN) 395 - PM_SYS_PUSH16(PORTDIO) 396 - PM_SYS_PUSH16(PORTDIO_FER) 397 - PM_SYS_PUSH16(PORTEIO_DIR) 398 - PM_SYS_PUSH16(PORTEIO_INEN) 399 - PM_SYS_PUSH16(PORTEIO) 400 - PM_SYS_PUSH16(PORTEIO_FER) 401 - #endif 402 - 403 - PM_SYS_PUSH16(SYSCR) 404 - 405 - /* Save Core MMRs */ 406 - P0.H = hi(SRAM_BASE_ADDRESS); 407 - P0.L = lo(SRAM_BASE_ADDRESS); 408 - 409 - PM_PUSH(DMEM_CONTROL) 410 - PM_PUSH(DCPLB_ADDR0) 411 - PM_PUSH(DCPLB_ADDR1) 412 - PM_PUSH(DCPLB_ADDR2) 413 - PM_PUSH(DCPLB_ADDR3) 414 - PM_PUSH(DCPLB_ADDR4) 415 - PM_PUSH(DCPLB_ADDR5) 416 - PM_PUSH(DCPLB_ADDR6) 417 - PM_PUSH(DCPLB_ADDR7) 418 - PM_PUSH(DCPLB_ADDR8) 419 - PM_PUSH(DCPLB_ADDR9) 420 - PM_PUSH(DCPLB_ADDR10) 421 - PM_PUSH(DCPLB_ADDR11) 422 - PM_PUSH(DCPLB_ADDR12) 423 - PM_PUSH(DCPLB_ADDR13) 424 - PM_PUSH(DCPLB_ADDR14) 425 - PM_PUSH(DCPLB_ADDR15) 426 - PM_PUSH(DCPLB_DATA0) 427 - PM_PUSH(DCPLB_DATA1) 428 - PM_PUSH(DCPLB_DATA2) 429 - PM_PUSH(DCPLB_DATA3) 430 - PM_PUSH(DCPLB_DATA4) 431 - PM_PUSH(DCPLB_DATA5) 432 - PM_PUSH(DCPLB_DATA6) 433 - PM_PUSH(DCPLB_DATA7) 434 - PM_PUSH(DCPLB_DATA8) 435 - PM_PUSH(DCPLB_DATA9) 436 - PM_PUSH(DCPLB_DATA10) 437 - PM_PUSH(DCPLB_DATA11) 438 - PM_PUSH(DCPLB_DATA12) 439 - PM_PUSH(DCPLB_DATA13) 440 - PM_PUSH(DCPLB_DATA14) 441 - PM_PUSH(DCPLB_DATA15) 442 - PM_PUSH(IMEM_CONTROL) 443 - PM_PUSH(ICPLB_ADDR0) 444 - PM_PUSH(ICPLB_ADDR1) 445 - PM_PUSH(ICPLB_ADDR2) 446 - PM_PUSH(ICPLB_ADDR3) 447 - PM_PUSH(ICPLB_ADDR4) 448 - PM_PUSH(ICPLB_ADDR5) 449 - PM_PUSH(ICPLB_ADDR6) 450 - PM_PUSH(ICPLB_ADDR7) 451 - PM_PUSH(ICPLB_ADDR8) 452 - PM_PUSH(ICPLB_ADDR9) 453 - PM_PUSH(ICPLB_ADDR10) 454 - PM_PUSH(ICPLB_ADDR11) 455 - PM_PUSH(ICPLB_ADDR12) 456 - PM_PUSH(ICPLB_ADDR13) 457 - PM_PUSH(ICPLB_ADDR14) 458 - PM_PUSH(ICPLB_ADDR15) 459 - PM_PUSH(ICPLB_DATA0) 460 - PM_PUSH(ICPLB_DATA1) 461 - PM_PUSH(ICPLB_DATA2) 462 - PM_PUSH(ICPLB_DATA3) 463 - PM_PUSH(ICPLB_DATA4) 464 - PM_PUSH(ICPLB_DATA5) 465 - PM_PUSH(ICPLB_DATA6) 466 - PM_PUSH(ICPLB_DATA7) 467 - PM_PUSH(ICPLB_DATA8) 468 - PM_PUSH(ICPLB_DATA9) 469 - PM_PUSH(ICPLB_DATA10) 470 - PM_PUSH(ICPLB_DATA11) 471 - PM_PUSH(ICPLB_DATA12) 472 - PM_PUSH(ICPLB_DATA13) 473 - PM_PUSH(ICPLB_DATA14) 474 - PM_PUSH(ICPLB_DATA15) 475 - PM_PUSH(EVT2) 476 - PM_PUSH(EVT3) 477 - PM_PUSH(EVT5) 478 - PM_PUSH(EVT6) 479 - PM_PUSH(EVT7) 480 - PM_PUSH(EVT8) 481 - PM_PUSH(EVT9) 482 - PM_PUSH(EVT10) 483 - PM_PUSH(EVT11) 484 - PM_PUSH(EVT12) 485 - PM_PUSH(EVT13) 486 - PM_PUSH(EVT14) 487 - PM_PUSH(EVT15) 488 - PM_PUSH(IMASK) 489 - PM_PUSH(ILAT) 490 - PM_PUSH(IPRIO) 491 - PM_PUSH(TCNTL) 492 - PM_PUSH(TPERIOD) 493 - PM_PUSH(TSCALE) 494 - PM_PUSH(TCOUNT) 495 - PM_PUSH(TBUFCTL) 496 - 497 - /* Save Core Registers */ 498 - [--sp] = SYSCFG; 499 - [--sp] = ( R7:0, P5:0 ); 315 + /* 316 + * Save the core regs early so we can blow them away when 317 + * saving/restoring MMR states 318 + */ 319 + [--sp] = (R7:0, P5:0); 500 320 [--sp] = fp; 501 321 [--sp] = usp; 502 322 ··· 359 523 [--sp] = LB0; 360 524 [--sp] = LB1; 361 525 526 + /* We can't push RETI directly as that'll change IPEND[4] */ 527 + r7 = RETI; 528 + [--sp] = RETS; 362 529 [--sp] = ASTAT; 363 530 [--sp] = CYCLES; 364 531 [--sp] = CYCLES2; 365 - 366 - [--sp] = RETS; 367 - r0 = RETI; 368 - [--sp] = r0; 532 + [--sp] = SYSCFG; 369 533 [--sp] = RETX; 370 534 [--sp] = SEQSTAT; 535 + [--sp] = r7; 536 + 537 + /* Save first func arg in M3 */ 538 + M3 = R0; 539 + 540 + /* Save system MMRs */ 541 + FP.H = hi(SYSMMR_BASE); 542 + FP.L = lo(SYSMMR_BASE); 543 + 544 + #ifdef SIC_IMASK0 545 + PM_SYS_PUSH(0, SIC_IMASK0) 546 + PM_SYS_PUSH(1, SIC_IMASK1) 547 + # ifdef SIC_IMASK2 548 + PM_SYS_PUSH(2, SIC_IMASK2) 549 + # endif 550 + #else 551 + PM_SYS_PUSH(0, SIC_IMASK) 552 + #endif 553 + #ifdef SIC_IAR0 554 + PM_SYS_PUSH(3, SIC_IAR0) 555 + PM_SYS_PUSH(4, SIC_IAR1) 556 + PM_SYS_PUSH(5, SIC_IAR2) 557 + #endif 558 + #ifdef SIC_IAR3 559 + PM_SYS_PUSH(6, SIC_IAR3) 560 + #endif 561 + #ifdef SIC_IAR4 562 + PM_SYS_PUSH(7, SIC_IAR4) 563 + PM_SYS_PUSH(8, SIC_IAR5) 564 + PM_SYS_PUSH(9, SIC_IAR6) 565 + #endif 566 + #ifdef SIC_IAR7 567 + PM_SYS_PUSH(10, SIC_IAR7) 568 + #endif 569 + #ifdef SIC_IAR8 570 + PM_SYS_PUSH(11, SIC_IAR8) 571 + PM_SYS_PUSH(12, SIC_IAR9) 572 + PM_SYS_PUSH(13, SIC_IAR10) 573 + #endif 574 + PM_PUSH_SYNC(13) 575 + #ifdef SIC_IAR11 576 + PM_SYS_PUSH(0, SIC_IAR11) 577 + #endif 578 + 579 + #ifdef SIC_IWR 580 + PM_SYS_PUSH(1, SIC_IWR) 581 + #endif 582 + #ifdef SIC_IWR0 583 + PM_SYS_PUSH(1, SIC_IWR0) 584 + #endif 585 + #ifdef SIC_IWR1 586 + PM_SYS_PUSH(2, SIC_IWR1) 587 + #endif 588 + #ifdef SIC_IWR2 589 + PM_SYS_PUSH(3, SIC_IWR2) 590 + #endif 591 + 592 + #ifdef PINT0_ASSIGN 593 + PM_SYS_PUSH(4, PINT0_MASK_SET) 594 + PM_SYS_PUSH(5, PINT1_MASK_SET) 595 + PM_SYS_PUSH(6, PINT2_MASK_SET) 596 + PM_SYS_PUSH(7, PINT3_MASK_SET) 597 + PM_SYS_PUSH(8, PINT0_ASSIGN) 598 + PM_SYS_PUSH(9, PINT1_ASSIGN) 599 + PM_SYS_PUSH(10, PINT2_ASSIGN) 600 + PM_SYS_PUSH(11, PINT3_ASSIGN) 601 + PM_SYS_PUSH(12, PINT0_INVERT_SET) 602 + PM_SYS_PUSH(13, PINT1_INVERT_SET) 603 + PM_PUSH_SYNC(13) 604 + PM_SYS_PUSH(0, PINT2_INVERT_SET) 605 + PM_SYS_PUSH(1, PINT3_INVERT_SET) 606 + PM_SYS_PUSH(2, PINT0_EDGE_SET) 607 + PM_SYS_PUSH(3, PINT1_EDGE_SET) 608 + PM_SYS_PUSH(4, PINT2_EDGE_SET) 609 + PM_SYS_PUSH(5, PINT3_EDGE_SET) 610 + #endif 611 + 612 + PM_SYS_PUSH16(6, SYSCR) 613 + 614 + PM_SYS_PUSH16(7, EBIU_AMGCTL) 615 + PM_SYS_PUSH(8, EBIU_AMBCTL0) 616 + PM_SYS_PUSH(9, EBIU_AMBCTL1) 617 + #ifdef EBIU_FCTL 618 + PM_SYS_PUSH(10, EBIU_MBSCTL) 619 + PM_SYS_PUSH(11, EBIU_MODE) 620 + PM_SYS_PUSH(12, EBIU_FCTL) 621 + PM_PUSH_SYNC(12) 622 + #else 623 + PM_PUSH_SYNC(9) 624 + #endif 625 + 626 + #ifdef PORTCIO_FER 627 + /* 16bit loads can only be done with dregs */ 628 + PM_SYS_PUSH16(0, PORTCIO_DIR) 629 + PM_SYS_PUSH16(1, PORTCIO_INEN) 630 + PM_SYS_PUSH16(2, PORTCIO) 631 + PM_SYS_PUSH16(3, PORTCIO_FER) 632 + PM_SYS_PUSH16(4, PORTDIO_DIR) 633 + PM_SYS_PUSH16(5, PORTDIO_INEN) 634 + PM_SYS_PUSH16(6, PORTDIO) 635 + PM_SYS_PUSH16(7, PORTDIO_FER) 636 + PM_PUSH_SYNC(7) 637 + PM_SYS_PUSH16(0, PORTEIO_DIR) 638 + PM_SYS_PUSH16(1, PORTEIO_INEN) 639 + PM_SYS_PUSH16(2, PORTEIO) 640 + PM_SYS_PUSH16(3, PORTEIO_FER) 641 + PM_PUSH_SYNC(3) 642 + #endif 643 + 644 + /* Save Core MMRs */ 645 + I0.H = hi(COREMMR_BASE); 646 + I0.L = lo(COREMMR_BASE); 647 + I1 = I0; 648 + I2 = I0; 649 + I3 = I0; 650 + B0 = I0; 651 + B1 = I0; 652 + B2 = I0; 653 + B3 = I0; 654 + I1.L = lo(DCPLB_ADDR0); 655 + I2.L = lo(DCPLB_DATA0); 656 + I3.L = lo(ICPLB_ADDR0); 657 + B0.L = lo(ICPLB_DATA0); 658 + B1.L = lo(EVT2); 659 + B2.L = lo(IMASK); 660 + B3.L = lo(TCNTL); 661 + 662 + /* DCPLB Addr */ 663 + FP = I1; 664 + PM_PUSH(0, DCPLB_ADDR0) 665 + PM_PUSH(1, DCPLB_ADDR1) 666 + PM_PUSH(2, DCPLB_ADDR2) 667 + PM_PUSH(3, DCPLB_ADDR3) 668 + PM_PUSH(4, DCPLB_ADDR4) 669 + PM_PUSH(5, DCPLB_ADDR5) 670 + PM_PUSH(6, DCPLB_ADDR6) 671 + PM_PUSH(7, DCPLB_ADDR7) 672 + PM_PUSH(8, DCPLB_ADDR8) 673 + PM_PUSH(9, DCPLB_ADDR9) 674 + PM_PUSH(10, DCPLB_ADDR10) 675 + PM_PUSH(11, DCPLB_ADDR11) 676 + PM_PUSH(12, DCPLB_ADDR12) 677 + PM_PUSH(13, DCPLB_ADDR13) 678 + PM_PUSH_SYNC(13) 679 + PM_PUSH(0, DCPLB_ADDR14) 680 + PM_PUSH(1, DCPLB_ADDR15) 681 + 682 + /* DCPLB Data */ 683 + FP = I2; 684 + PM_PUSH(2, DCPLB_DATA0) 685 + PM_PUSH(3, DCPLB_DATA1) 686 + PM_PUSH(4, DCPLB_DATA2) 687 + PM_PUSH(5, DCPLB_DATA3) 688 + PM_PUSH(6, DCPLB_DATA4) 689 + PM_PUSH(7, DCPLB_DATA5) 690 + PM_PUSH(8, DCPLB_DATA6) 691 + PM_PUSH(9, DCPLB_DATA7) 692 + PM_PUSH(10, DCPLB_DATA8) 693 + PM_PUSH(11, DCPLB_DATA9) 694 + PM_PUSH(12, DCPLB_DATA10) 695 + PM_PUSH(13, DCPLB_DATA11) 696 + PM_PUSH_SYNC(13) 697 + PM_PUSH(0, DCPLB_DATA12) 698 + PM_PUSH(1, DCPLB_DATA13) 699 + PM_PUSH(2, DCPLB_DATA14) 700 + PM_PUSH(3, DCPLB_DATA15) 701 + 702 + /* ICPLB Addr */ 703 + FP = I3; 704 + PM_PUSH(4, ICPLB_ADDR0) 705 + PM_PUSH(5, ICPLB_ADDR1) 706 + PM_PUSH(6, ICPLB_ADDR2) 707 + PM_PUSH(7, ICPLB_ADDR3) 708 + PM_PUSH(8, ICPLB_ADDR4) 709 + PM_PUSH(9, ICPLB_ADDR5) 710 + PM_PUSH(10, ICPLB_ADDR6) 711 + PM_PUSH(11, ICPLB_ADDR7) 712 + PM_PUSH(12, ICPLB_ADDR8) 713 + PM_PUSH(13, ICPLB_ADDR9) 714 + PM_PUSH_SYNC(13) 715 + PM_PUSH(0, ICPLB_ADDR10) 716 + PM_PUSH(1, ICPLB_ADDR11) 717 + PM_PUSH(2, ICPLB_ADDR12) 718 + PM_PUSH(3, ICPLB_ADDR13) 719 + PM_PUSH(4, ICPLB_ADDR14) 720 + PM_PUSH(5, ICPLB_ADDR15) 721 + 722 + /* ICPLB Data */ 723 + FP = B0; 724 + PM_PUSH(6, ICPLB_DATA0) 725 + PM_PUSH(7, ICPLB_DATA1) 726 + PM_PUSH(8, ICPLB_DATA2) 727 + PM_PUSH(9, ICPLB_DATA3) 728 + PM_PUSH(10, ICPLB_DATA4) 729 + PM_PUSH(11, ICPLB_DATA5) 730 + PM_PUSH(12, ICPLB_DATA6) 731 + PM_PUSH(13, ICPLB_DATA7) 732 + PM_PUSH_SYNC(13) 733 + PM_PUSH(0, ICPLB_DATA8) 734 + PM_PUSH(1, ICPLB_DATA9) 735 + PM_PUSH(2, ICPLB_DATA10) 736 + PM_PUSH(3, ICPLB_DATA11) 737 + PM_PUSH(4, ICPLB_DATA12) 738 + PM_PUSH(5, ICPLB_DATA13) 739 + PM_PUSH(6, ICPLB_DATA14) 740 + PM_PUSH(7, ICPLB_DATA15) 741 + 742 + /* Event Vectors */ 743 + FP = B1; 744 + PM_PUSH(8, EVT2) 745 + PM_PUSH(9, EVT3) 746 + FP += 4; /* EVT4 */ 747 + PM_PUSH(10, EVT5) 748 + PM_PUSH(11, EVT6) 749 + PM_PUSH(12, EVT7) 750 + PM_PUSH(13, EVT8) 751 + PM_PUSH_SYNC(13) 752 + PM_PUSH(0, EVT9) 753 + PM_PUSH(1, EVT10) 754 + PM_PUSH(2, EVT11) 755 + PM_PUSH(3, EVT12) 756 + PM_PUSH(4, EVT13) 757 + PM_PUSH(5, EVT14) 758 + PM_PUSH(6, EVT15) 759 + 760 + /* CEC */ 761 + FP = B2; 762 + PM_PUSH(7, IMASK) 763 + FP += 4; /* IPEND */ 764 + PM_PUSH(8, ILAT) 765 + PM_PUSH(9, IPRIO) 766 + 767 + /* Core Timer */ 768 + FP = B3; 769 + PM_PUSH(10, TCNTL) 770 + PM_PUSH(11, TPERIOD) 771 + PM_PUSH(12, TSCALE) 772 + PM_PUSH(13, TCOUNT) 773 + PM_PUSH_SYNC(13) 774 + 775 + /* Misc non-contiguous registers */ 776 + FP = I0; 777 + PM_CORE_PUSH(0, DMEM_CONTROL); 778 + PM_CORE_PUSH(1, IMEM_CONTROL); 779 + PM_CORE_PUSH(2, TBUFCTL); 780 + PM_PUSH_SYNC(2) 781 + 782 + /* Setup args to hibernate mode early for pipeline optimization */ 783 + R0 = M3; 784 + P1.H = _hibernate_mode; 785 + P1.L = _hibernate_mode; 371 786 372 787 /* Save Magic, return address and Stack Pointer */ 373 - P0.H = 0; 374 - P0.L = 0; 375 - R0.H = 0xDEAD; /* Hibernate Magic */ 376 - R0.L = 0xBEEF; 377 - [P0++] = R0; /* Store Hibernate Magic */ 378 - R0.H = .Lpm_resume_here; 379 - R0.L = .Lpm_resume_here; 380 - [P0++] = R0; /* Save Return Address */ 788 + P0 = 0; 789 + R1.H = 0xDEAD; /* Hibernate Magic */ 790 + R1.L = 0xBEEF; 791 + R2.H = .Lpm_resume_here; 792 + R2.L = .Lpm_resume_here; 793 + [P0++] = R1; /* Store Hibernate Magic */ 794 + [P0++] = R2; /* Save Return Address */ 381 795 [P0++] = SP; /* Save Stack Pointer */ 382 - P0.H = _hibernate_mode; 383 - P0.L = _hibernate_mode; 384 - R0 = R2; 385 - call (P0); /* Goodbye */ 796 + 797 + /* Must use an indirect call as we need to jump to L1 */ 798 + call (P1); /* Goodbye */ 386 799 387 800 .Lpm_resume_here: 388 801 802 + /* Restore Core MMRs */ 803 + I0.H = hi(COREMMR_BASE); 804 + I0.L = lo(COREMMR_BASE); 805 + I1 = I0; 806 + I2 = I0; 807 + I3 = I0; 808 + B0 = I0; 809 + B1 = I0; 810 + B2 = I0; 811 + B3 = I0; 812 + I1.L = lo(DCPLB_ADDR15); 813 + I2.L = lo(DCPLB_DATA15); 814 + I3.L = lo(ICPLB_ADDR15); 815 + B0.L = lo(ICPLB_DATA15); 816 + B1.L = lo(EVT15); 817 + B2.L = lo(IPRIO); 818 + B3.L = lo(TCOUNT); 819 + 820 + /* Misc non-contiguous registers */ 821 + FP = I0; 822 + PM_POP_SYNC(2) 823 + PM_CORE_POP(2, TBUFCTL) 824 + PM_CORE_POP(1, IMEM_CONTROL) 825 + PM_CORE_POP(0, DMEM_CONTROL) 826 + 827 + /* Core Timer */ 828 + PM_POP_SYNC(13) 829 + FP = B3; 830 + PM_POP(13, TCOUNT) 831 + PM_POP(12, TSCALE) 832 + PM_POP(11, TPERIOD) 833 + PM_POP(10, TCNTL) 834 + 835 + /* CEC */ 836 + FP = B2; 837 + PM_POP(9, IPRIO) 838 + PM_POP(8, ILAT) 839 + FP += -4; /* IPEND */ 840 + PM_POP(7, IMASK) 841 + 842 + /* Event Vectors */ 843 + FP = B1; 844 + PM_POP(6, EVT15) 845 + PM_POP(5, EVT14) 846 + PM_POP(4, EVT13) 847 + PM_POP(3, EVT12) 848 + PM_POP(2, EVT11) 849 + PM_POP(1, EVT10) 850 + PM_POP(0, EVT9) 851 + PM_POP_SYNC(13) 852 + PM_POP(13, EVT8) 853 + PM_POP(12, EVT7) 854 + PM_POP(11, EVT6) 855 + PM_POP(10, EVT5) 856 + FP += -4; /* EVT4 */ 857 + PM_POP(9, EVT3) 858 + PM_POP(8, EVT2) 859 + 860 + /* ICPLB Data */ 861 + FP = B0; 862 + PM_POP(7, ICPLB_DATA15) 863 + PM_POP(6, ICPLB_DATA14) 864 + PM_POP(5, ICPLB_DATA13) 865 + PM_POP(4, ICPLB_DATA12) 866 + PM_POP(3, ICPLB_DATA11) 867 + PM_POP(2, ICPLB_DATA10) 868 + PM_POP(1, ICPLB_DATA9) 869 + PM_POP(0, ICPLB_DATA8) 870 + PM_POP_SYNC(13) 871 + PM_POP(13, ICPLB_DATA7) 872 + PM_POP(12, ICPLB_DATA6) 873 + PM_POP(11, ICPLB_DATA5) 874 + PM_POP(10, ICPLB_DATA4) 875 + PM_POP(9, ICPLB_DATA3) 876 + PM_POP(8, ICPLB_DATA2) 877 + PM_POP(7, ICPLB_DATA1) 878 + PM_POP(6, ICPLB_DATA0) 879 + 880 + /* ICPLB Addr */ 881 + FP = I3; 882 + PM_POP(5, ICPLB_ADDR15) 883 + PM_POP(4, ICPLB_ADDR14) 884 + PM_POP(3, ICPLB_ADDR13) 885 + PM_POP(2, ICPLB_ADDR12) 886 + PM_POP(1, ICPLB_ADDR11) 887 + PM_POP(0, ICPLB_ADDR10) 888 + PM_POP_SYNC(13) 889 + PM_POP(13, ICPLB_ADDR9) 890 + PM_POP(12, ICPLB_ADDR8) 891 + PM_POP(11, ICPLB_ADDR7) 892 + PM_POP(10, ICPLB_ADDR6) 893 + PM_POP(9, ICPLB_ADDR5) 894 + PM_POP(8, ICPLB_ADDR4) 895 + PM_POP(7, ICPLB_ADDR3) 896 + PM_POP(6, ICPLB_ADDR2) 897 + PM_POP(5, ICPLB_ADDR1) 898 + PM_POP(4, ICPLB_ADDR0) 899 + 900 + /* DCPLB Data */ 901 + FP = I2; 902 + PM_POP(3, DCPLB_DATA15) 903 + PM_POP(2, DCPLB_DATA14) 904 + PM_POP(1, DCPLB_DATA13) 905 + PM_POP(0, DCPLB_DATA12) 906 + PM_POP_SYNC(13) 907 + PM_POP(13, DCPLB_DATA11) 908 + PM_POP(12, DCPLB_DATA10) 909 + PM_POP(11, DCPLB_DATA9) 910 + PM_POP(10, DCPLB_DATA8) 911 + PM_POP(9, DCPLB_DATA7) 912 + PM_POP(8, DCPLB_DATA6) 913 + PM_POP(7, DCPLB_DATA5) 914 + PM_POP(6, DCPLB_DATA4) 915 + PM_POP(5, DCPLB_DATA3) 916 + PM_POP(4, DCPLB_DATA2) 917 + PM_POP(3, DCPLB_DATA1) 918 + PM_POP(2, DCPLB_DATA0) 919 + 920 + /* DCPLB Addr */ 921 + FP = I1; 922 + PM_POP(1, DCPLB_ADDR15) 923 + PM_POP(0, DCPLB_ADDR14) 924 + PM_POP_SYNC(13) 925 + PM_POP(13, DCPLB_ADDR13) 926 + PM_POP(12, DCPLB_ADDR12) 927 + PM_POP(11, DCPLB_ADDR11) 928 + PM_POP(10, DCPLB_ADDR10) 929 + PM_POP(9, DCPLB_ADDR9) 930 + PM_POP(8, DCPLB_ADDR8) 931 + PM_POP(7, DCPLB_ADDR7) 932 + PM_POP(6, DCPLB_ADDR6) 933 + PM_POP(5, DCPLB_ADDR5) 934 + PM_POP(4, DCPLB_ADDR4) 935 + PM_POP(3, DCPLB_ADDR3) 936 + PM_POP(2, DCPLB_ADDR2) 937 + PM_POP(1, DCPLB_ADDR1) 938 + PM_POP(0, DCPLB_ADDR0) 939 + 940 + /* Restore System MMRs */ 941 + FP.H = hi(SYSMMR_BASE); 942 + FP.L = lo(SYSMMR_BASE); 943 + 944 + #ifdef PORTCIO_FER 945 + PM_POP_SYNC(3) 946 + PM_SYS_POP16(3, PORTEIO_FER) 947 + PM_SYS_POP16(2, PORTEIO) 948 + PM_SYS_POP16(1, PORTEIO_INEN) 949 + PM_SYS_POP16(0, PORTEIO_DIR) 950 + PM_POP_SYNC(7) 951 + PM_SYS_POP16(7, PORTDIO_FER) 952 + PM_SYS_POP16(6, PORTDIO) 953 + PM_SYS_POP16(5, PORTDIO_INEN) 954 + PM_SYS_POP16(4, PORTDIO_DIR) 955 + PM_SYS_POP16(3, PORTCIO_FER) 956 + PM_SYS_POP16(2, PORTCIO) 957 + PM_SYS_POP16(1, PORTCIO_INEN) 958 + PM_SYS_POP16(0, PORTCIO_DIR) 959 + #endif 960 + 961 + #ifdef EBIU_FCTL 962 + PM_POP_SYNC(12) 963 + PM_SYS_POP(12, EBIU_FCTL) 964 + PM_SYS_POP(11, EBIU_MODE) 965 + PM_SYS_POP(10, EBIU_MBSCTL) 966 + #else 967 + PM_POP_SYNC(9) 968 + #endif 969 + PM_SYS_POP(9, EBIU_AMBCTL1) 970 + PM_SYS_POP(8, EBIU_AMBCTL0) 971 + PM_SYS_POP16(7, EBIU_AMGCTL) 972 + 973 + PM_SYS_POP16(6, SYSCR) 974 + 975 + #ifdef PINT0_ASSIGN 976 + PM_SYS_POP(5, PINT3_EDGE_SET) 977 + PM_SYS_POP(4, PINT2_EDGE_SET) 978 + PM_SYS_POP(3, PINT1_EDGE_SET) 979 + PM_SYS_POP(2, PINT0_EDGE_SET) 980 + PM_SYS_POP(1, PINT3_INVERT_SET) 981 + PM_SYS_POP(0, PINT2_INVERT_SET) 982 + PM_POP_SYNC(13) 983 + PM_SYS_POP(13, PINT1_INVERT_SET) 984 + PM_SYS_POP(12, PINT0_INVERT_SET) 985 + PM_SYS_POP(11, PINT3_ASSIGN) 986 + PM_SYS_POP(10, PINT2_ASSIGN) 987 + PM_SYS_POP(9, PINT1_ASSIGN) 988 + PM_SYS_POP(8, PINT0_ASSIGN) 989 + PM_SYS_POP(7, PINT3_MASK_SET) 990 + PM_SYS_POP(6, PINT2_MASK_SET) 991 + PM_SYS_POP(5, PINT1_MASK_SET) 992 + PM_SYS_POP(4, PINT0_MASK_SET) 993 + #endif 994 + 995 + #ifdef SIC_IWR2 996 + PM_SYS_POP(3, SIC_IWR2) 997 + #endif 998 + #ifdef SIC_IWR1 999 + PM_SYS_POP(2, SIC_IWR1) 1000 + #endif 1001 + #ifdef SIC_IWR0 1002 + PM_SYS_POP(1, SIC_IWR0) 1003 + #endif 1004 + #ifdef SIC_IWR 1005 + PM_SYS_POP(1, SIC_IWR) 1006 + #endif 1007 + 1008 + #ifdef SIC_IAR11 1009 + PM_SYS_POP(0, SIC_IAR11) 1010 + #endif 1011 + PM_POP_SYNC(13) 1012 + #ifdef SIC_IAR8 1013 + PM_SYS_POP(13, SIC_IAR10) 1014 + PM_SYS_POP(12, SIC_IAR9) 1015 + PM_SYS_POP(11, SIC_IAR8) 1016 + #endif 1017 + #ifdef SIC_IAR7 1018 + PM_SYS_POP(10, SIC_IAR7) 1019 + #endif 1020 + #ifdef SIC_IAR6 1021 + PM_SYS_POP(9, SIC_IAR6) 1022 + PM_SYS_POP(8, SIC_IAR5) 1023 + PM_SYS_POP(7, SIC_IAR4) 1024 + #endif 1025 + #ifdef SIC_IAR3 1026 + PM_SYS_POP(6, SIC_IAR3) 1027 + #endif 1028 + #ifdef SIC_IAR0 1029 + PM_SYS_POP(5, SIC_IAR2) 1030 + PM_SYS_POP(4, SIC_IAR1) 1031 + PM_SYS_POP(3, SIC_IAR0) 1032 + #endif 1033 + #ifdef SIC_IMASK0 1034 + # ifdef SIC_IMASK2 1035 + PM_SYS_POP(2, SIC_IMASK2) 1036 + # endif 1037 + PM_SYS_POP(1, SIC_IMASK1) 1038 + PM_SYS_POP(0, SIC_IMASK0) 1039 + #else 1040 + PM_SYS_POP(0, SIC_IMASK) 1041 + #endif 1042 + 389 1043 /* Restore Core Registers */ 1044 + RETI = [sp++]; 390 1045 SEQSTAT = [sp++]; 391 1046 RETX = [sp++]; 392 - r0 = [sp++]; 393 - RETI = r0; 394 - RETS = [sp++]; 395 - 1047 + SYSCFG = [sp++]; 396 1048 CYCLES2 = [sp++]; 397 1049 CYCLES = [sp++]; 398 1050 ASTAT = [sp++]; 1051 + RETS = [sp++]; 399 1052 400 1053 LB1 = [sp++]; 401 1054 LB0 = [sp++]; ··· 919 594 920 595 usp = [sp++]; 921 596 fp = [sp++]; 922 - 923 - ( R7 : 0, P5 : 0) = [ SP ++ ]; 924 - SYSCFG = [sp++]; 925 - 926 - /* Restore Core MMRs */ 927 - 928 - PM_POP(TBUFCTL) 929 - PM_POP(TCOUNT) 930 - PM_POP(TSCALE) 931 - PM_POP(TPERIOD) 932 - PM_POP(TCNTL) 933 - PM_POP(IPRIO) 934 - PM_POP(ILAT) 935 - PM_POP(IMASK) 936 - PM_POP(EVT15) 937 - PM_POP(EVT14) 938 - PM_POP(EVT13) 939 - PM_POP(EVT12) 940 - PM_POP(EVT11) 941 - PM_POP(EVT10) 942 - PM_POP(EVT9) 943 - PM_POP(EVT8) 944 - PM_POP(EVT7) 945 - PM_POP(EVT6) 946 - PM_POP(EVT5) 947 - PM_POP(EVT3) 948 - PM_POP(EVT2) 949 - PM_POP(ICPLB_DATA15) 950 - PM_POP(ICPLB_DATA14) 951 - PM_POP(ICPLB_DATA13) 952 - PM_POP(ICPLB_DATA12) 953 - PM_POP(ICPLB_DATA11) 954 - PM_POP(ICPLB_DATA10) 955 - PM_POP(ICPLB_DATA9) 956 - PM_POP(ICPLB_DATA8) 957 - PM_POP(ICPLB_DATA7) 958 - PM_POP(ICPLB_DATA6) 959 - PM_POP(ICPLB_DATA5) 960 - PM_POP(ICPLB_DATA4) 961 - PM_POP(ICPLB_DATA3) 962 - PM_POP(ICPLB_DATA2) 963 - PM_POP(ICPLB_DATA1) 964 - PM_POP(ICPLB_DATA0) 965 - PM_POP(ICPLB_ADDR15) 966 - PM_POP(ICPLB_ADDR14) 967 - PM_POP(ICPLB_ADDR13) 968 - PM_POP(ICPLB_ADDR12) 969 - PM_POP(ICPLB_ADDR11) 970 - PM_POP(ICPLB_ADDR10) 971 - PM_POP(ICPLB_ADDR9) 972 - PM_POP(ICPLB_ADDR8) 973 - PM_POP(ICPLB_ADDR7) 974 - PM_POP(ICPLB_ADDR6) 975 - PM_POP(ICPLB_ADDR5) 976 - PM_POP(ICPLB_ADDR4) 977 - PM_POP(ICPLB_ADDR3) 978 - PM_POP(ICPLB_ADDR2) 979 - PM_POP(ICPLB_ADDR1) 980 - PM_POP(ICPLB_ADDR0) 981 - PM_POP(IMEM_CONTROL) 982 - PM_POP(DCPLB_DATA15) 983 - PM_POP(DCPLB_DATA14) 984 - PM_POP(DCPLB_DATA13) 985 - PM_POP(DCPLB_DATA12) 986 - PM_POP(DCPLB_DATA11) 987 - PM_POP(DCPLB_DATA10) 988 - PM_POP(DCPLB_DATA9) 989 - PM_POP(DCPLB_DATA8) 990 - PM_POP(DCPLB_DATA7) 991 - PM_POP(DCPLB_DATA6) 992 - PM_POP(DCPLB_DATA5) 993 - PM_POP(DCPLB_DATA4) 994 - PM_POP(DCPLB_DATA3) 995 - PM_POP(DCPLB_DATA2) 996 - PM_POP(DCPLB_DATA1) 997 - PM_POP(DCPLB_DATA0) 998 - PM_POP(DCPLB_ADDR15) 999 - PM_POP(DCPLB_ADDR14) 1000 - PM_POP(DCPLB_ADDR13) 1001 - PM_POP(DCPLB_ADDR12) 1002 - PM_POP(DCPLB_ADDR11) 1003 - PM_POP(DCPLB_ADDR10) 1004 - PM_POP(DCPLB_ADDR9) 1005 - PM_POP(DCPLB_ADDR8) 1006 - PM_POP(DCPLB_ADDR7) 1007 - PM_POP(DCPLB_ADDR6) 1008 - PM_POP(DCPLB_ADDR5) 1009 - PM_POP(DCPLB_ADDR4) 1010 - PM_POP(DCPLB_ADDR3) 1011 - PM_POP(DCPLB_ADDR2) 1012 - PM_POP(DCPLB_ADDR1) 1013 - PM_POP(DCPLB_ADDR0) 1014 - PM_POP(DMEM_CONTROL) 1015 - 1016 - /* Restore System MMRs */ 1017 - 1018 - P0.H = hi(PLL_CTL); 1019 - P0.L = lo(PLL_CTL); 1020 - PM_SYS_POP16(SYSCR) 1021 - 1022 - #ifdef PORTCIO_FER 1023 - PM_SYS_POP16(PORTEIO_FER) 1024 - PM_SYS_POP16(PORTEIO) 1025 - PM_SYS_POP16(PORTEIO_INEN) 1026 - PM_SYS_POP16(PORTEIO_DIR) 1027 - PM_SYS_POP16(PORTDIO_FER) 1028 - PM_SYS_POP16(PORTDIO) 1029 - PM_SYS_POP16(PORTDIO_INEN) 1030 - PM_SYS_POP16(PORTDIO_DIR) 1031 - PM_SYS_POP16(PORTCIO_FER) 1032 - PM_SYS_POP16(PORTCIO) 1033 - PM_SYS_POP16(PORTCIO_INEN) 1034 - PM_SYS_POP16(PORTCIO_DIR) 1035 - #endif 1036 - 1037 - #ifdef EBIU_FCTL 1038 - PM_SYS_POP(EBIU_FCTL) 1039 - PM_SYS_POP(EBIU_MODE) 1040 - PM_SYS_POP(EBIU_MBSCTL) 1041 - #endif 1042 - PM_SYS_POP16(EBIU_AMGCTL) 1043 - PM_SYS_POP(EBIU_AMBCTL1) 1044 - PM_SYS_POP(EBIU_AMBCTL0) 1045 - 1046 - #ifdef PINT0_ASSIGN 1047 - PM_SYS_POP(PINT3_EDGE_SET) 1048 - PM_SYS_POP(PINT2_EDGE_SET) 1049 - PM_SYS_POP(PINT1_EDGE_SET) 1050 - PM_SYS_POP(PINT0_EDGE_SET) 1051 - PM_SYS_POP(PINT3_INVERT_SET) 1052 - PM_SYS_POP(PINT2_INVERT_SET) 1053 - PM_SYS_POP(PINT1_INVERT_SET) 1054 - PM_SYS_POP(PINT0_INVERT_SET) 1055 - PM_SYS_POP(PINT3_ASSIGN) 1056 - PM_SYS_POP(PINT2_ASSIGN) 1057 - PM_SYS_POP(PINT1_ASSIGN) 1058 - PM_SYS_POP(PINT0_ASSIGN) 1059 - PM_SYS_POP(PINT3_MASK_SET) 1060 - PM_SYS_POP(PINT2_MASK_SET) 1061 - PM_SYS_POP(PINT1_MASK_SET) 1062 - PM_SYS_POP(PINT0_MASK_SET) 1063 - #endif 1064 - 1065 - #ifdef SIC_IWR2 1066 - PM_SYS_POP(SIC_IWR2) 1067 - #endif 1068 - #ifdef SIC_IWR1 1069 - PM_SYS_POP(SIC_IWR1) 1070 - #endif 1071 - #ifdef SIC_IWR0 1072 - PM_SYS_POP(SIC_IWR0) 1073 - #endif 1074 - #ifdef SIC_IWR 1075 - PM_SYS_POP(SIC_IWR) 1076 - #endif 1077 - 1078 - #ifdef SIC_IAR8 1079 - PM_SYS_POP(SIC_IAR11) 1080 - PM_SYS_POP(SIC_IAR10) 1081 - PM_SYS_POP(SIC_IAR9) 1082 - PM_SYS_POP(SIC_IAR8) 1083 - #endif 1084 - #ifdef SIC_IAR7 1085 - PM_SYS_POP(SIC_IAR7) 1086 - #endif 1087 - #ifdef SIC_IAR6 1088 - PM_SYS_POP(SIC_IAR6) 1089 - PM_SYS_POP(SIC_IAR5) 1090 - PM_SYS_POP(SIC_IAR4) 1091 - #endif 1092 - #ifdef SIC_IAR3 1093 - PM_SYS_POP(SIC_IAR3) 1094 - #endif 1095 - #ifdef SIC_IAR0 1096 - PM_SYS_POP(SIC_IAR2) 1097 - PM_SYS_POP(SIC_IAR1) 1098 - PM_SYS_POP(SIC_IAR0) 1099 - #endif 1100 - #ifdef SIC_IMASK 1101 - PM_SYS_POP(SIC_IMASK) 1102 - #endif 1103 - #ifdef SIC_IMASK2 1104 - PM_SYS_POP(SIC_IMASK2) 1105 - #endif 1106 - #ifdef SIC_IMASK1 1107 - PM_SYS_POP(SIC_IMASK1) 1108 - #endif 1109 - #ifdef SIC_IMASK0 1110 - PM_SYS_POP(SIC_IMASK0) 1111 - #endif 597 + (R7:0, P5:0) = [sp++]; 1112 598 1113 599 [--sp] = RETI; /* Clear Global Interrupt Disable */ 1114 600 SP += 4; 1115 601 1116 - RETS = [SP++]; 1117 - ( R7:0, P5:0 ) = [SP++]; 1118 602 RTS; 1119 603 ENDPROC(_do_hibernate)