Rev 1857 | Rev 1860 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1857 | Rev 1858 | ||
---|---|---|---|
Line 490... | Line 490... | ||
490 | rdpr %tstate, %g1 |
490 | rdpr %tstate, %g1 |
491 | andcc %g1, TSTATE_PRIV_BIT, %g0 ! if we are not returning to userspace..., |
491 | andcc %g1, TSTATE_PRIV_BIT, %g0 ! if we are not returning to userspace..., |
492 | bnz 1f ! ...skip restoring userspace windows |
492 | bnz 1f ! ...skip restoring userspace windows |
493 | nop |
493 | nop |
494 | 494 | ||
- | 495 | /* |
|
- | 496 | * Spills and fills will be processed by the {spill,fill}_1_normal |
|
- | 497 | * handlers. |
|
- | 498 | */ |
|
- | 499 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate |
|
- | 500 | ||
495 | rdpr %cwp, %g1 |
501 | rdpr %cwp, %g1 |
496 | rdpr %otherwin, %g2 |
502 | rdpr %otherwin, %g2 |
497 | 503 | ||
498 | /* |
504 | /* |
499 | * Skip all OTHERWIN windows and descend to the first window |
505 | * Skip all OTHERWIN windows and descend to the first window |
Line 543... | Line 549... | ||
543 | * Switch back to the proper current window and adjust |
549 | * Switch back to the proper current window and adjust |
544 | * OTHERWIN, CANRESTORE, CANSAVE and CLEANWIN. |
550 | * OTHERWIN, CANRESTORE, CANSAVE and CLEANWIN. |
545 | */ |
551 | */ |
546 | wrpr %g1, 0, %cwp |
552 | wrpr %g1, 0, %cwp |
547 | add %g4, %g2, %g2 |
553 | add %g4, %g2, %g2 |
548 | mov NWINDOW - 2, %g1 |
554 | cmp %g2, NWINDOW - 2 |
- | 555 | bg 2f ! fix the CANRESTORE=NWINDOW-1 anomaly |
|
- | 556 | mov NWINDOW - 2, %g1 ! use dealy slot for both cases |
|
549 | sub %g1, %g2, %g1 |
557 | sub %g1, %g2, %g1 |
550 | 558 | ||
551 | wrpr %g0, 0, %otherwin |
559 | wrpr %g0, 0, %otherwin |
552 | wrpr %g1, 0, %cansave ! NWINDOW - 2 - CANRESTORE |
560 | wrpr %g1, 0, %cansave ! NWINDOW - 2 - CANRESTORE |
553 | wrpr %g2, 0, %canrestore ! OTHERWIN + windows in the buffer |
561 | wrpr %g2, 0, %canrestore ! OTHERWIN + windows in the buffer |
554 | wrpr %g2, 0, %cleanwin ! avoid information leak |
562 | wrpr %g2, 0, %cleanwin ! avoid information leak |
555 | 563 | ||
- | 564 | 1: |
|
- | 565 | restore |
|
- | 566 | retry |
|
- | 567 | ||
556 | /* |
568 | /* |
557 | * Spills and fills will be processed by the {spill,fill}_1_normal |
569 | * We got here in order to avoid inconsistency of the window state registers. |
558 | * handlers. |
570 | * If the: |
- | 571 | * |
|
- | 572 | * save %g6, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
|
- | 573 | * |
|
- | 574 | * instruction trapped and spilled a register window into the userspace |
|
- | 575 | * window buffer, we have just restored NWINDOW - 1 register windows. |
|
- | 576 | * However, CANRESTORE can be only NWINDOW - 2 at most. |
|
- | 577 | * |
|
- | 578 | * The solution is to manually switch to (CWP - 1) mod NWINDOW |
|
- | 579 | * and set the window state registers so that: |
|
- | 580 | * |
|
- | 581 | * CANRESTORE = NWINDOW - 2 |
|
- | 582 | * CLEANWIN = NWINDOW - 2 |
|
- | 583 | * CANSAVE = 0 |
|
- | 584 | * OTHERWIN = 0 |
|
- | 585 | * |
|
- | 586 | * The RESTORE isntruction is therfore to be skipped. |
|
559 | */ |
587 | */ |
- | 588 | 2: |
|
- | 589 | wrpr %g0, 0, %otherwin |
|
- | 590 | wrpr %g0, 0, %cansave |
|
560 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate |
591 | wrpr %g1, 0, %canrestore |
- | 592 | wrpr %g1, 0, %cleanwin |
|
- | 593 | ||
- | 594 | rdpr %cwp, %g1 |
|
- | 595 | dec %g1 |
|
- | 596 | and %g1, NWINDOW - 1, %g1 |
|
- | 597 | wrpr %g1, 0, %cwp ! CWP-- |
|
561 | 598 | ||
562 | 1: |
- | |
563 | restore |
- | |
564 | retry |
599 | retry |