Rev 1861 | Rev 1863 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1861 | Rev 1862 | ||
---|---|---|---|
Line 37... | Line 37... | ||
37 | 37 | ||
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/syscall.h> |
|
42 | #include <arch/trap/mmu.h> |
43 | #include <arch/trap/mmu.h> |
43 | #include <arch/mm/mmu.h> |
44 | #include <arch/mm/mmu.h> |
44 | #include <arch/mm/page.h> |
45 | #include <arch/mm/page.h> |
45 | #include <arch/stack.h> |
46 | #include <arch/stack.h> |
46 | #include <arch/regdef.h> |
47 | #include <arch/regdef.h> |
Line 227... | Line 228... | ||
227 | .org trap_table + TT_FILL_1_NORMAL*ENTRY_SIZE |
228 | .org trap_table + TT_FILL_1_NORMAL*ENTRY_SIZE |
228 | .global fill_1_normal |
229 | .global fill_1_normal |
229 | fill_1_normal: |
230 | fill_1_normal: |
230 | FILL_NORMAL_HANDLER_USERSPACE |
231 | FILL_NORMAL_HANDLER_USERSPACE |
231 | 232 | ||
- | 233 | /* TT = 0x100, TL = 0, trap_instruction_0 */ |
|
- | 234 | .org trap_table + TT_TRAP_INSTRUCTION(0)*ENTRY_SIZE |
|
- | 235 | .global trap_instruction_0 |
|
- | 236 | trap_instruction_0: |
|
- | 237 | TRAP_INSTRUCTION 0 |
|
- | 238 | ||
- | 239 | /* TT = 0x101, TL = 0, trap_instruction_1 */ |
|
- | 240 | .org trap_table + TT_TRAP_INSTRUCTION(1)*ENTRY_SIZE |
|
- | 241 | .global trap_instruction_1 |
|
- | 242 | trap_instruction_1: |
|
- | 243 | TRAP_INSTRUCTION 1 |
|
- | 244 | ||
- | 245 | /* TT = 0x102, TL = 0, trap_instruction_2 */ |
|
- | 246 | .org trap_table + TT_TRAP_INSTRUCTION(2)*ENTRY_SIZE |
|
- | 247 | .global trap_instruction_2 |
|
- | 248 | trap_instruction_2: |
|
- | 249 | TRAP_INSTRUCTION 2 |
|
- | 250 | ||
- | 251 | /* TT = 0x103, TL = 0, trap_instruction_3 */ |
|
- | 252 | .org trap_table + TT_TRAP_INSTRUCTION(3)*ENTRY_SIZE |
|
- | 253 | .global trap_instruction_3 |
|
- | 254 | trap_instruction_3: |
|
- | 255 | TRAP_INSTRUCTION 3 |
|
- | 256 | ||
- | 257 | /* TT = 0x104, TL = 0, trap_instruction_4 */ |
|
- | 258 | .org trap_table + TT_TRAP_INSTRUCTION(4)*ENTRY_SIZE |
|
- | 259 | .global trap_instruction_4 |
|
- | 260 | trap_instruction_4: |
|
- | 261 | TRAP_INSTRUCTION 4 |
|
- | 262 | ||
- | 263 | /* TT = 0x105, TL = 0, trap_instruction_5 */ |
|
- | 264 | .org trap_table + TT_TRAP_INSTRUCTION(5)*ENTRY_SIZE |
|
- | 265 | .global trap_instruction_5 |
|
- | 266 | trap_instruction_5: |
|
- | 267 | TRAP_INSTRUCTION 5 |
|
- | 268 | ||
- | 269 | /* TT = 0x106, TL = 0, trap_instruction_6 */ |
|
- | 270 | .org trap_table + TT_TRAP_INSTRUCTION(6)*ENTRY_SIZE |
|
- | 271 | .global trap_instruction_6 |
|
- | 272 | trap_instruction_6: |
|
- | 273 | TRAP_INSTRUCTION 6 |
|
- | 274 | ||
- | 275 | /* TT = 0x107, TL = 0, trap_instruction_7 */ |
|
- | 276 | .org trap_table + TT_TRAP_INSTRUCTION(7)*ENTRY_SIZE |
|
- | 277 | .global trap_instruction_7 |
|
- | 278 | trap_instruction_7: |
|
- | 279 | TRAP_INSTRUCTION 7 |
|
- | 280 | ||
- | 281 | /* TT = 0x108, TL = 0, trap_instruction_8 */ |
|
- | 282 | .org trap_table + TT_TRAP_INSTRUCTION(8)*ENTRY_SIZE |
|
- | 283 | .global trap_instruction_8 |
|
- | 284 | trap_instruction_8: |
|
- | 285 | TRAP_INSTRUCTION 8 |
|
- | 286 | ||
- | 287 | /* TT = 0x109, TL = 0, trap_instruction_9 */ |
|
- | 288 | .org trap_table + TT_TRAP_INSTRUCTION(9)*ENTRY_SIZE |
|
- | 289 | .global trap_instruction_9 |
|
- | 290 | trap_instruction_9: |
|
- | 291 | TRAP_INSTRUCTION 9 |
|
- | 292 | ||
- | 293 | /* TT = 0x10a, TL = 0, trap_instruction_10 */ |
|
- | 294 | .org trap_table + TT_TRAP_INSTRUCTION(10)*ENTRY_SIZE |
|
- | 295 | .global trap_instruction_10 |
|
- | 296 | trap_instruction_10: |
|
- | 297 | TRAP_INSTRUCTION 10 |
|
- | 298 | ||
- | 299 | /* TT = 0x10b, TL = 0, trap_instruction_11 */ |
|
- | 300 | .org trap_table + TT_TRAP_INSTRUCTION(11)*ENTRY_SIZE |
|
- | 301 | .global trap_instruction_11 |
|
- | 302 | trap_instruction_11: |
|
- | 303 | TRAP_INSTRUCTION 11 |
|
- | 304 | ||
- | 305 | /* TT = 0x10c, TL = 0, trap_instruction_12 */ |
|
- | 306 | .org trap_table + TT_TRAP_INSTRUCTION(12)*ENTRY_SIZE |
|
- | 307 | .global trap_instruction_12 |
|
- | 308 | trap_instruction_12: |
|
- | 309 | TRAP_INSTRUCTION 12 |
|
- | 310 | ||
- | 311 | /* TT = 0x10d, TL = 0, trap_instruction_13 */ |
|
- | 312 | .org trap_table + TT_TRAP_INSTRUCTION(13)*ENTRY_SIZE |
|
- | 313 | .global trap_instruction_13 |
|
- | 314 | trap_instruction_13: |
|
- | 315 | TRAP_INSTRUCTION 13 |
|
- | 316 | ||
- | 317 | /* TT = 0x10e, TL = 0, trap_instruction_14 */ |
|
- | 318 | .org trap_table + TT_TRAP_INSTRUCTION(14)*ENTRY_SIZE |
|
- | 319 | .global trap_instruction_14 |
|
- | 320 | trap_instruction_14: |
|
- | 321 | TRAP_INSTRUCTION 14 |
|
- | 322 | ||
- | 323 | /* TT = 0x10f, TL = 0, trap_instruction_15 */ |
|
- | 324 | .org trap_table + TT_TRAP_INSTRUCTION(15)*ENTRY_SIZE |
|
- | 325 | .global trap_instruction_15 |
|
- | 326 | trap_instruction_15: |
|
- | 327 | TRAP_INSTRUCTION 15 |
|
- | 328 | ||
- | 329 | /* TT = 0x110, TL = 0, trap_instruction_16 */ |
|
- | 330 | .org trap_table + TT_TRAP_INSTRUCTION(16)*ENTRY_SIZE |
|
- | 331 | .global trap_instruction_16 |
|
- | 332 | trap_instruction_16: |
|
- | 333 | TRAP_INSTRUCTION 16 |
|
- | 334 | ||
- | 335 | /* TT = 0x111, TL = 0, trap_instruction_17 */ |
|
- | 336 | .org trap_table + TT_TRAP_INSTRUCTION(17)*ENTRY_SIZE |
|
- | 337 | .global trap_instruction_17 |
|
- | 338 | trap_instruction_17: |
|
- | 339 | TRAP_INSTRUCTION 17 |
|
- | 340 | ||
- | 341 | /* TT = 0x112, TL = 0, trap_instruction_18 */ |
|
- | 342 | .org trap_table + TT_TRAP_INSTRUCTION(18)*ENTRY_SIZE |
|
- | 343 | .global trap_instruction_18 |
|
- | 344 | trap_instruction_18: |
|
- | 345 | TRAP_INSTRUCTION 18 |
|
- | 346 | ||
- | 347 | /* TT = 0x113, TL = 0, trap_instruction_19 */ |
|
- | 348 | .org trap_table + TT_TRAP_INSTRUCTION(19)*ENTRY_SIZE |
|
- | 349 | .global trap_instruction_19 |
|
- | 350 | trap_instruction_19: |
|
- | 351 | TRAP_INSTRUCTION 19 |
|
- | 352 | ||
- | 353 | /* TT = 0x114, TL = 0, trap_instruction_20 */ |
|
- | 354 | .org trap_table + TT_TRAP_INSTRUCTION(20)*ENTRY_SIZE |
|
- | 355 | .global trap_instruction_20 |
|
- | 356 | trap_instruction_20: |
|
- | 357 | TRAP_INSTRUCTION 20 |
|
- | 358 | ||
- | 359 | /* TT = 0x115, TL = 0, trap_instruction_21 */ |
|
- | 360 | .org trap_table + TT_TRAP_INSTRUCTION(21)*ENTRY_SIZE |
|
- | 361 | .global trap_instruction_21 |
|
- | 362 | trap_instruction_21: |
|
- | 363 | TRAP_INSTRUCTION 21 |
|
- | 364 | ||
- | 365 | /* TT = 0x116, TL = 0, trap_instruction_22 */ |
|
- | 366 | .org trap_table + TT_TRAP_INSTRUCTION(22)*ENTRY_SIZE |
|
- | 367 | .global trap_instruction_22 |
|
- | 368 | trap_instruction_22: |
|
- | 369 | TRAP_INSTRUCTION 22 |
|
- | 370 | ||
- | 371 | /* TT = 0x117, TL = 0, trap_instruction_23 */ |
|
- | 372 | .org trap_table + TT_TRAP_INSTRUCTION(23)*ENTRY_SIZE |
|
- | 373 | .global trap_instruction_23 |
|
- | 374 | trap_instruction_23: |
|
- | 375 | TRAP_INSTRUCTION 23 |
|
- | 376 | ||
- | 377 | /* TT = 0x118, TL = 0, trap_instruction_24 */ |
|
- | 378 | .org trap_table + TT_TRAP_INSTRUCTION(24)*ENTRY_SIZE |
|
- | 379 | .global trap_instruction_24 |
|
- | 380 | trap_instruction_24: |
|
- | 381 | TRAP_INSTRUCTION 24 |
|
- | 382 | ||
- | 383 | /* TT = 0x119, TL = 0, trap_instruction_25 */ |
|
- | 384 | .org trap_table + TT_TRAP_INSTRUCTION(25)*ENTRY_SIZE |
|
- | 385 | .global trap_instruction_25 |
|
- | 386 | trap_instruction_25: |
|
- | 387 | TRAP_INSTRUCTION 25 |
|
- | 388 | ||
- | 389 | /* TT = 0x11a, TL = 0, trap_instruction_26 */ |
|
- | 390 | .org trap_table + TT_TRAP_INSTRUCTION(26)*ENTRY_SIZE |
|
- | 391 | .global trap_instruction_26 |
|
- | 392 | trap_instruction_26: |
|
- | 393 | TRAP_INSTRUCTION 26 |
|
- | 394 | ||
- | 395 | /* TT = 0x11b, TL = 0, trap_instruction_27 */ |
|
- | 396 | .org trap_table + TT_TRAP_INSTRUCTION(27)*ENTRY_SIZE |
|
- | 397 | .global trap_instruction_27 |
|
- | 398 | trap_instruction_27: |
|
- | 399 | TRAP_INSTRUCTION 27 |
|
- | 400 | ||
- | 401 | /* TT = 0x11c, TL = 0, trap_instruction_28 */ |
|
- | 402 | .org trap_table + TT_TRAP_INSTRUCTION(28)*ENTRY_SIZE |
|
- | 403 | .global trap_instruction_28 |
|
- | 404 | trap_instruction_28: |
|
- | 405 | TRAP_INSTRUCTION 28 |
|
- | 406 | ||
- | 407 | /* TT = 0x11d, TL = 0, trap_instruction_29 */ |
|
- | 408 | .org trap_table + TT_TRAP_INSTRUCTION(29)*ENTRY_SIZE |
|
- | 409 | .global trap_instruction_29 |
|
- | 410 | trap_instruction_29: |
|
- | 411 | TRAP_INSTRUCTION 29 |
|
- | 412 | ||
- | 413 | /* TT = 0x11e, TL = 0, trap_instruction_30 */ |
|
- | 414 | .org trap_table + TT_TRAP_INSTRUCTION(30)*ENTRY_SIZE |
|
- | 415 | .global trap_instruction_30 |
|
- | 416 | trap_instruction_30: |
|
- | 417 | TRAP_INSTRUCTION 30 |
|
- | 418 | ||
- | 419 | /* TT = 0x11f, TL = 0, trap_instruction_31 */ |
|
- | 420 | .org trap_table + TT_TRAP_INSTRUCTION(31)*ENTRY_SIZE |
|
- | 421 | .global trap_instruction_31 |
|
- | 422 | trap_instruction_31: |
|
- | 423 | TRAP_INSTRUCTION 31 |
|
- | 424 | ||
232 | /* |
425 | /* |
233 | * Handlers for TL>0. |
426 | * Handlers for TL>0. |
234 | */ |
427 | */ |
235 | 428 | ||
236 | /* TT = 0x08, TL > 0, instruction_access_exception */ |
429 | /* TT = 0x08, TL > 0, instruction_access_exception */ |
Line 303... | Line 496... | ||
303 | .org trap_table + (TT_FILL_0_NORMAL+512)*ENTRY_SIZE |
496 | .org trap_table + (TT_FILL_0_NORMAL+512)*ENTRY_SIZE |
304 | .global fill_0_normal_high |
497 | .global fill_0_normal_high |
305 | fill_0_normal_high: |
498 | fill_0_normal_high: |
306 | FILL_NORMAL_HANDLER_KERNEL |
499 | FILL_NORMAL_HANDLER_KERNEL |
307 | 500 | ||
- | 501 | #define NOT(x) ((x) == 0) |
|
308 | 502 | ||
309 | /* Preemptible trap handler for TL=1. |
503 | /* Preemptible trap handler for TL=1. |
310 | * |
504 | * |
311 | * This trap handler makes arrangements to make calling of scheduler() from |
505 | * This trap handler makes arrangements to make calling of scheduler() from |
312 | * within a trap context possible. It is called from several other trap |
506 | * within a trap context possible. It is called from several other trap |
Line 321... | Line 515... | ||
321 | * %g1 Address of function to call. |
515 | * %g1 Address of function to call. |
322 | * %g2 Argument for the function. |
516 | * %g2 Argument for the function. |
323 | * %g6 Pre-set as kernel stack base if trap from userspace. |
517 | * %g6 Pre-set as kernel stack base if trap from userspace. |
324 | * %g7 Pre-set as address of the userspace window buffer. |
518 | * %g7 Pre-set as address of the userspace window buffer. |
325 | */ |
519 | */ |
326 | .global preemptible_handler |
520 | .macro PREEMPTIBLE_HANDLER_TEMPLATE is_syscall |
327 | preemptible_handler: |
521 | .if NOT(\is_syscall) |
328 | rdpr %tstate, %g3 |
522 | rdpr %tstate, %g3 |
329 | andcc %g3, TSTATE_PRIV_BIT, %g0 ! if this trap came from the privileged mode... |
523 | andcc %g3, TSTATE_PRIV_BIT, %g0 ! if this trap came from the privileged mode... |
330 | bnz 0f ! ...skip setting of kernel stack and primary context |
524 | bnz 0f ! ...skip setting of kernel stack and primary context |
331 | nop |
525 | nop |
332 | 526 | .endif |
|
333 | /* |
527 | /* |
334 | * Normal window spills will go to the userspace window buffer. |
528 | * Normal window spills will go to the userspace window buffer. |
335 | */ |
529 | */ |
336 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(2), %wstate |
530 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(2), %wstate |
337 | 531 | ||
Line 340... | Line 534... | ||
340 | * automatically saved in the old window's %sp |
534 | * automatically saved in the old window's %sp |
341 | * and the new window's %fp. |
535 | * and the new window's %fp. |
342 | */ |
536 | */ |
343 | save %g6, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
537 | save %g6, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
344 | 538 | ||
- | 539 | .if \is_syscall |
|
- | 540 | /* |
|
- | 541 | * Copy arguments for the syscall to the new window. |
|
- | 542 | */ |
|
- | 543 | mov %i0, %o2 |
|
- | 544 | mov %i1, %o3 |
|
- | 545 | mov %i2, %o4 |
|
- | 546 | mov %i3, %o5 |
|
- | 547 | .endif |
|
- | 548 | ||
345 | /* |
549 | /* |
346 | * Mark the CANSAVE windows as OTHER windows. |
550 | * Mark the CANSAVE windows as OTHER windows. |
347 | * Set CLEANWIN to NWINDOW-1 so that clean_window traps do not occur. |
551 | * Set CLEANWIN to NWINDOW-1 so that clean_window traps do not occur. |
348 | */ |
552 | */ |
349 | rdpr %cansave, %l0 |
553 | rdpr %cansave, %l0 |
Line 357... | Line 561... | ||
357 | mov VA_PRIMARY_CONTEXT_REG, %l0 |
561 | mov VA_PRIMARY_CONTEXT_REG, %l0 |
358 | stxa %g0, [%l0] ASI_DMMU |
562 | stxa %g0, [%l0] ASI_DMMU |
359 | rd %pc, %l0 |
563 | rd %pc, %l0 |
360 | flush %l0 |
564 | flush %l0 |
361 | 565 | ||
- | 566 | .if NOT(\is_syscall) |
|
362 | ba 1f |
567 | ba 1f |
363 | nop |
568 | nop |
364 | 569 | ||
365 | 0: |
570 | 0: |
366 | save %sp, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
571 | save %sp, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
Line 368... | Line 573... | ||
368 | /* |
573 | /* |
369 | * At this moment, we are using the kernel stack |
574 | * At this moment, we are using the kernel stack |
370 | * and have successfully allocated a register window. |
575 | * and have successfully allocated a register window. |
371 | */ |
576 | */ |
372 | 1: |
577 | 1: |
373 | 578 | .endif |
|
374 | /* |
579 | /* |
375 | * Other window spills will go to the userspace window buffer |
580 | * Other window spills will go to the userspace window buffer |
376 | * and normal spills will go to the kernel stack. |
581 | * and normal spills will go to the kernel stack. |
377 | */ |
582 | */ |
378 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(0), %wstate |
583 | wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(0), %wstate |
Line 407... | Line 612... | ||
407 | * Call the higher-level handler and pass istate as second parameter. |
612 | * Call the higher-level handler and pass istate as second parameter. |
408 | */ |
613 | */ |
409 | call %l0 |
614 | call %l0 |
410 | add %sp, PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC, %o1 |
615 | add %sp, PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC, %o1 |
411 | 616 | ||
- | 617 | .if \is_syscall |
|
- | 618 | /* |
|
- | 619 | * Copy the value returned by the syscall. |
|
- | 620 | */ |
|
- | 621 | mov %o0, %i0 |
|
- | 622 | .endif |
|
- | 623 | ||
412 | RESTORE_GLOBALS |
624 | RESTORE_GLOBALS |
413 | wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
625 | wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
414 | wrpr %g0, 1, %tl |
626 | wrpr %g0, 1, %tl |
415 | 627 | ||
416 | /* |
628 | /* |
Line 486... | Line 698... | ||
486 | * OTHERWIN != 0 or fall-through from the OTHERWIN == 0 case. |
698 | * OTHERWIN != 0 or fall-through from the OTHERWIN == 0 case. |
487 | * The CWP has already been restored to the value it had prior to the SAVE |
699 | * The CWP has already been restored to the value it had prior to the SAVE |
488 | * at the beginning of this function. |
700 | * at the beginning of this function. |
489 | */ |
701 | */ |
490 | 0: |
702 | 0: |
- | 703 | .if NOT(\is_syscall) |
|
491 | rdpr %tstate, %g1 |
704 | rdpr %tstate, %g1 |
492 | andcc %g1, TSTATE_PRIV_BIT, %g0 ! if we are not returning to userspace..., |
705 | andcc %g1, TSTATE_PRIV_BIT, %g0 ! if we are not returning to userspace..., |
493 | bnz 1f ! ...skip restoring userspace windows |
706 | bnz 1f ! ...skip restoring userspace windows |
494 | nop |
707 | nop |
- | 708 | .endif |
|
495 | 709 | ||
496 | /* |
710 | /* |
497 | * Spills and fills will be processed by the {spill,fill}_1_normal |
711 | * Spills and fills will be processed by the {spill,fill}_1_normal |
498 | * handlers. |
712 | * handlers. |
499 | */ |
713 | */ |
Line 570... | Line 784... | ||
570 | wrpr %g2, 0, %canrestore ! OTHERWIN + windows in the buffer |
784 | wrpr %g2, 0, %canrestore ! OTHERWIN + windows in the buffer |
571 | wrpr %g2, 0, %cleanwin ! avoid information leak |
785 | wrpr %g2, 0, %cleanwin ! avoid information leak |
572 | 786 | ||
573 | 1: |
787 | 1: |
574 | restore |
788 | restore |
- | 789 | ||
- | 790 | .if \is_syscall |
|
- | 791 | done |
|
- | 792 | .else |
|
575 | retry |
793 | retry |
- | 794 | .endif |
|
576 | 795 | ||
577 | /* |
796 | /* |
578 | * We got here in order to avoid inconsistency of the window state registers. |
797 | * We got here in order to avoid inconsistency of the window state registers. |
579 | * If the: |
798 | * If the: |
580 | * |
799 | * |
Line 603... | Line 822... | ||
603 | rdpr %cwp, %g1 |
822 | rdpr %cwp, %g1 |
604 | dec %g1 |
823 | dec %g1 |
605 | and %g1, NWINDOW - 1, %g1 |
824 | and %g1, NWINDOW - 1, %g1 |
606 | wrpr %g1, 0, %cwp ! CWP-- |
825 | wrpr %g1, 0, %cwp ! CWP-- |
607 | 826 | ||
- | 827 | .if \is_syscall |
|
- | 828 | done |
|
- | 829 | .else |
|
608 | retry |
830 | retry |
- | 831 | .endif |
|
- | 832 | ||
- | 833 | .endm |
|
- | 834 | ||
- | 835 | .global preemptible_handler |
|
- | 836 | preemptible_handler: |
|
- | 837 | PREEMPTIBLE_HANDLER_TEMPLATE 0 |
|
- | 838 | ||
- | 839 | .global trap_instruction_handler |
|
- | 840 | trap_instruction_handler: |
|
- | 841 | PREEMPTIBLE_HANDLER_TEMPLATE 1 |