Rev 1856 | Rev 1858 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1856 | Rev 1857 | ||
---|---|---|---|
Line 38... | Line 38... | ||
38 | #include <arch/trap/trap_table.h> |
38 | #include <arch/trap/trap_table.h> |
39 | #include <arch/trap/regwin.h> |
39 | #include <arch/trap/regwin.h> |
40 | #include <arch/trap/interrupt.h> |
40 | #include <arch/trap/interrupt.h> |
41 | #include <arch/trap/exception.h> |
41 | #include <arch/trap/exception.h> |
42 | #include <arch/trap/mmu.h> |
42 | #include <arch/trap/mmu.h> |
- | 43 | #include <arch/mm/page.h> |
|
43 | #include <arch/stack.h> |
44 | #include <arch/stack.h> |
44 | #include <arch/regdef.h> |
45 | #include <arch/regdef.h> |
45 | 46 | ||
46 | #define TABLE_SIZE TRAP_TABLE_SIZE |
47 | #define TABLE_SIZE TRAP_TABLE_SIZE |
47 | #define ENTRY_SIZE TRAP_TABLE_ENTRY_SIZE |
48 | #define ENTRY_SIZE TRAP_TABLE_ENTRY_SIZE |
Line 327... | Line 328... | ||
327 | andcc %g3, TSTATE_PRIV_BIT, %g0 ! if this trap came from the privileged mode... |
328 | andcc %g3, TSTATE_PRIV_BIT, %g0 ! if this trap came from the privileged mode... |
328 | bnz 0f ! ...skip setting of kernel stack and primary context |
329 | bnz 0f ! ...skip setting of kernel stack and primary context |
329 | nop |
330 | nop |
330 | 331 | ||
331 | /* |
332 | /* |
- | 333 | * Normal window spills will go to the userspace window buffer. |
|
- | 334 | */ |
|
- | 335 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(2), %wstate |
|
- | 336 | ||
- | 337 | /* |
|
332 | * Switch to kernel stack. The old stack is |
338 | * Switch to kernel stack. The old stack is |
333 | * automatically saved in the old window's %sp |
339 | * automatically saved in the old window's %sp |
334 | * and the new window's %fp. |
340 | * and the new window's %fp. |
335 | */ |
341 | */ |
336 | save %g6, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
342 | save %g6, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
Line 361... | Line 367... | ||
361 | /* |
367 | /* |
362 | * At this moment, we are using the kernel stack |
368 | * At this moment, we are using the kernel stack |
363 | * and have successfully allocated a register window. |
369 | * and have successfully allocated a register window. |
364 | */ |
370 | */ |
365 | 1: |
371 | 1: |
366 | 372 | ||
- | 373 | /* |
|
- | 374 | * Other window spills will go to the userspace window buffer |
|
- | 375 | * and normal spills will go to the kernel stack. |
|
- | 376 | */ |
|
- | 377 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(0), %wstate |
|
- | 378 | ||
367 | /* |
379 | /* |
368 | * Copy arguments. |
380 | * Copy arguments. |
369 | */ |
381 | */ |
370 | mov %g1, %l0 |
382 | mov %g1, %l0 |
371 | mov %g2, %o0 |
383 | mov %g2, %o0 |
Line 447... | Line 459... | ||
447 | * restore. Because the fill trap fills only input and local |
459 | * restore. Because the fill trap fills only input and local |
448 | * registers of a window, we need to preserve those output |
460 | * registers of a window, we need to preserve those output |
449 | * registers manually. |
461 | * registers manually. |
450 | */ |
462 | */ |
451 | flushw |
463 | flushw |
452 | mov %sp, %g1 |
464 | mov %sp, %g2 |
453 | stx %i0, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0] |
465 | stx %i0, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0] |
454 | stx %i1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1] |
466 | stx %i1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1] |
455 | stx %i2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2] |
467 | stx %i2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2] |
456 | stx %i3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3] |
468 | stx %i3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3] |
457 | stx %i4, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I4] |
469 | stx %i4, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I4] |
458 | stx %i5, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I5] |
470 | stx %i5, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I5] |
459 | stx %i6, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I6] |
471 | stx %i6, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I6] |
460 | stx %i7, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I7] |
472 | stx %i7, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I7] |
461 | wrpr %l0, 0, %cwp |
473 | wrpr %l0, 0, %cwp |
462 | mov %g1, %sp |
474 | mov %g2, %sp |
463 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0], %i0 |
475 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0], %i0 |
464 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1], %i1 |
476 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1], %i1 |
465 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2], %i2 |
477 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2], %i2 |
466 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3], %i3 |
478 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3], %i3 |
467 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I4], %i4 |
479 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I4], %i4 |
Line 469... | Line 481... | ||
469 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I6], %i6 |
481 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I6], %i6 |
470 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I7], %i7 |
482 | ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I7], %i7 |
471 | 483 | ||
472 | /* |
484 | /* |
473 | * OTHERWIN != 0 or fall-through from the OTHERWIN == 0 case. |
485 | * OTHERWIN != 0 or fall-through from the OTHERWIN == 0 case. |
- | 486 | * The CWP has already been restored to the value it had prior to the SAVE |
|
- | 487 | * at the beginning of this function. |
|
474 | */ |
488 | */ |
475 | 0: |
489 | 0: |
- | 490 | rdpr %tstate, %g1 |
|
- | 491 | andcc %g1, TSTATE_PRIV_BIT, %g0 ! if we are not returning to userspace..., |
|
476 | ! TODO: restore register windows from register window memory buffer |
492 | bnz 1f ! ...skip restoring userspace windows |
- | 493 | nop |
|
- | 494 | ||
- | 495 | rdpr %cwp, %g1 |
|
- | 496 | rdpr %otherwin, %g2 |
|
477 | 497 | ||
- | 498 | /* |
|
- | 499 | * Skip all OTHERWIN windows and descend to the first window |
|
- | 500 | * in the userspace window buffer. |
|
- | 501 | */ |
|
- | 502 | sub %g1, %g2, %g3 |
|
- | 503 | dec %g3 |
|
- | 504 | and %g3, NWINDOW - 1, %g3 |
|
- | 505 | wrpr %g3, 0, %cwp |
|
- | 506 | ||
- | 507 | /* |
|
- | 508 | * CWP is now in the window last saved in the userspace window buffer. |
|
- | 509 | * Fill all windows stored in the buffer. |
|
- | 510 | */ |
|
- | 511 | clr %g4 |
|
- | 512 | 0: andcc %g7, PAGE_WIDTH - 1, %g0 ! PAGE_SIZE alignment check |
|
- | 513 | bz 0f ! %g7 is page-aligned, no more windows to refill |
|
- | 514 | nop |
|
- | 515 | ||
- | 516 | add %g7, -STACK_WINDOW_SAVE_AREA_SIZE, %g7 |
|
- | 517 | ldx [%g7 + L0_OFFSET], %l0 |
|
- | 518 | ldx [%g7 + L1_OFFSET], %l1 |
|
- | 519 | ldx [%g7 + L2_OFFSET], %l2 |
|
- | 520 | ldx [%g7 + L3_OFFSET], %l3 |
|
- | 521 | ldx [%g7 + L4_OFFSET], %l4 |
|
- | 522 | ldx [%g7 + L5_OFFSET], %l5 |
|
- | 523 | ldx [%g7 + L6_OFFSET], %l6 |
|
- | 524 | ldx [%g7 + L7_OFFSET], %l7 |
|
- | 525 | ldx [%g7 + I0_OFFSET], %i0 |
|
- | 526 | ldx [%g7 + I1_OFFSET], %i1 |
|
- | 527 | ldx [%g7 + I2_OFFSET], %i2 |
|
- | 528 | ldx [%g7 + I3_OFFSET], %i3 |
|
- | 529 | ldx [%g7 + I4_OFFSET], %i4 |
|
- | 530 | ldx [%g7 + I5_OFFSET], %i5 |
|
- | 531 | ldx [%g7 + I6_OFFSET], %i6 |
|
- | 532 | ldx [%g7 + I7_OFFSET], %i7 |
|
- | 533 | ||
- | 534 | dec %g3 |
|
- | 535 | and %g3, NWINDOW - 1, %g3 |
|
- | 536 | wrpr %g3, 0, %cwp ! switch to the preceeding window |
|
- | 537 | ||
- | 538 | ba 0b |
|
- | 539 | inc %g4 |
|
- | 540 | ||
- | 541 | 0: |
|
- | 542 | /* |
|
- | 543 | * Switch back to the proper current window and adjust |
|
- | 544 | * OTHERWIN, CANRESTORE, CANSAVE and CLEANWIN. |
|
- | 545 | */ |
|
- | 546 | wrpr %g1, 0, %cwp |
|
- | 547 | add %g4, %g2, %g2 |
|
- | 548 | mov NWINDOW - 2, %g1 |
|
- | 549 | sub %g1, %g2, %g1 |
|
- | 550 | ||
- | 551 | wrpr %g0, 0, %otherwin |
|
- | 552 | wrpr %g1, 0, %cansave ! NWINDOW - 2 - CANRESTORE |
|
- | 553 | wrpr %g2, 0, %canrestore ! OTHERWIN + windows in the buffer |
|
- | 554 | wrpr %g2, 0, %cleanwin ! avoid information leak |
|
- | 555 | ||
- | 556 | /* |
|
- | 557 | * Spills and fills will be processed by the {spill,fill}_1_normal |
|
- | 558 | * handlers. |
|
- | 559 | */ |
|
- | 560 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate |
|
- | 561 | ||
- | 562 | 1: |
|
478 | restore |
563 | restore |
479 | retry |
564 | retry |