Adrian Bunk | b00dc83 | 2008-05-19 16:52:27 -0700 | [diff] [blame] | 1 | /* |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 2 | * dtlb_prot.S: DTLB protection trap strategy. |
| 3 | * This is included directly into the trap table. |
| 4 | * |
| 5 | * Copyright (C) 1996,1998 David S. Miller (davem@redhat.com) |
| 6 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@ultra.linux.cz) |
| 7 | */ |
| 8 | |
| 9 | /* Ways we can get here: |
| 10 | * |
| 11 | * [TL == 0] 1) User stores to readonly pages. |
| 12 | * [TL == 0] 2) Nucleus stores to user readonly pages. |
| 13 | * [TL > 0] 3) Nucleus stores to user readonly stack frame. |
| 14 | */ |
| 15 | |
| 16 | /* PROT ** ICACHE line 1: User DTLB protection trap */ |
David S. Miller | c9c1083 | 2005-10-12 12:22:46 -0700 | [diff] [blame] | 17 | mov TLB_SFSR, %g1 |
| 18 | stxa %g0, [%g1] ASI_DMMU ! Clear FaultValid bit |
| 19 | membar #Sync ! Synchronize stores |
| 20 | rdpr %pstate, %g5 ! Move into alt-globals |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 21 | wrpr %g5, PSTATE_AG|PSTATE_MG, %pstate |
David S. Miller | c9c1083 | 2005-10-12 12:22:46 -0700 | [diff] [blame] | 22 | rdpr %tl, %g1 ! Need a winfixup? |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 23 | cmp %g1, 1 ! Trap level >1? |
David S. Miller | c9c1083 | 2005-10-12 12:22:46 -0700 | [diff] [blame] | 24 | mov TLB_TAG_ACCESS, %g4 ! For reload of vaddr |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 25 | |
| 26 | /* PROT ** ICACHE line 2: More real fault processing */ |
David S. Miller | 84bd6d8 | 2014-10-18 23:03:09 -0400 | [diff] [blame] | 27 | ldxa [%g4] ASI_DMMU, %g5 ! Put tagaccess in %g5 |
David S. Miller | 4f6deb8 | 2016-07-27 17:50:26 -0700 | [diff] [blame] | 28 | srlx %g5, PAGE_SHIFT, %g5 |
| 29 | sllx %g5, PAGE_SHIFT, %g5 ! Clear context ID bits |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 30 | bgu,pn %xcc, winfix_trampoline ! Yes, perform winfixup |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 31 | mov FAULT_CODE_DTLB | FAULT_CODE_WRITE, %g4 |
David S. Miller | 84bd6d8 | 2014-10-18 23:03:09 -0400 | [diff] [blame] | 32 | ba,pt %xcc, sparc64_realfault_common ! Nope, normal fault |
| 33 | nop |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 34 | nop |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 35 | |
| 36 | /* PROT ** ICACHE line 3: Unused... */ |
| 37 | nop |
| 38 | nop |
| 39 | nop |
| 40 | nop |
| 41 | nop |
| 42 | nop |
| 43 | nop |
| 44 | nop |
| 45 | |
| 46 | /* PROT ** ICACHE line 4: Unused... */ |
| 47 | nop |
| 48 | nop |
| 49 | nop |
| 50 | nop |
| 51 | nop |
| 52 | nop |
| 53 | nop |
| 54 | nop |