diff options
Diffstat (limited to 'arch/avr32/kernel/entry-avr32b.S')
-rw-r--r-- | arch/avr32/kernel/entry-avr32b.S | 45 |
1 files changed, 20 insertions, 25 deletions
diff --git a/arch/avr32/kernel/entry-avr32b.S b/arch/avr32/kernel/entry-avr32b.S index 050c006a7f0c..3cdd7071f35e 100644 --- a/arch/avr32/kernel/entry-avr32b.S +++ b/arch/avr32/kernel/entry-avr32b.S | |||
@@ -74,12 +74,6 @@ exception_vectors: | |||
74 | .align 2 | 74 | .align 2 |
75 | bral do_dtlb_modified | 75 | bral do_dtlb_modified |
76 | 76 | ||
77 | /* | ||
78 | * r0 : PGD/PT/PTE | ||
79 | * r1 : Offending address | ||
80 | * r2 : Scratch register | ||
81 | * r3 : Cause (5, 12 or 13) | ||
82 | */ | ||
83 | #define tlbmiss_save pushm r0-r3 | 77 | #define tlbmiss_save pushm r0-r3 |
84 | #define tlbmiss_restore popm r0-r3 | 78 | #define tlbmiss_restore popm r0-r3 |
85 | 79 | ||
@@ -108,17 +102,17 @@ tlb_miss_common: | |||
108 | bld r0, 31 | 102 | bld r0, 31 |
109 | brcs handle_vmalloc_miss | 103 | brcs handle_vmalloc_miss |
110 | 104 | ||
111 | /* First level lookup */ | 105 | /* |
106 | * First level lookup: The PGD contains virtual pointers to | ||
107 | * the second-level page tables, but they may be NULL if not | ||
108 | * present. | ||
109 | */ | ||
112 | pgtbl_lookup: | 110 | pgtbl_lookup: |
113 | lsr r2, r0, PGDIR_SHIFT | 111 | lsr r2, r0, PGDIR_SHIFT |
114 | ld.w r3, r1[r2 << 2] | 112 | ld.w r3, r1[r2 << 2] |
115 | bfextu r1, r0, PAGE_SHIFT, PGDIR_SHIFT - PAGE_SHIFT | 113 | bfextu r1, r0, PAGE_SHIFT, PGDIR_SHIFT - PAGE_SHIFT |
116 | bld r3, _PAGE_BIT_PRESENT | 114 | cp.w r3, 0 |
117 | brcc page_table_not_present | 115 | breq page_table_not_present |
118 | |||
119 | /* Translate to virtual address in P1. */ | ||
120 | andl r3, 0xf000 | ||
121 | sbr r3, 31 | ||
122 | 116 | ||
123 | /* Second level lookup */ | 117 | /* Second level lookup */ |
124 | ld.w r2, r3[r1 << 2] | 118 | ld.w r2, r3[r1 << 2] |
@@ -155,6 +149,19 @@ handle_vmalloc_miss: | |||
155 | orh r1, hi(swapper_pg_dir) | 149 | orh r1, hi(swapper_pg_dir) |
156 | rjmp pgtbl_lookup | 150 | rjmp pgtbl_lookup |
157 | 151 | ||
152 | /* The slow path of the TLB miss handler */ | ||
153 | .align 2 | ||
154 | page_table_not_present: | ||
155 | page_not_present: | ||
156 | tlbmiss_restore | ||
157 | sub sp, 4 | ||
158 | stmts --sp, r0-lr | ||
159 | rcall save_full_context_ex | ||
160 | mfsr r12, SYSREG_ECR | ||
161 | mov r11, sp | ||
162 | rcall do_page_fault | ||
163 | rjmp ret_from_exception | ||
164 | |||
158 | 165 | ||
159 | /* --- System Call --- */ | 166 | /* --- System Call --- */ |
160 | 167 | ||
@@ -267,18 +274,6 @@ syscall_exit_work: | |||
267 | brcc syscall_exit_cont | 274 | brcc syscall_exit_cont |
268 | rjmp enter_monitor_mode | 275 | rjmp enter_monitor_mode |
269 | 276 | ||
270 | /* The slow path of the TLB miss handler */ | ||
271 | page_table_not_present: | ||
272 | page_not_present: | ||
273 | tlbmiss_restore | ||
274 | sub sp, 4 | ||
275 | stmts --sp, r0-lr | ||
276 | rcall save_full_context_ex | ||
277 | mfsr r12, SYSREG_ECR | ||
278 | mov r11, sp | ||
279 | rcall do_page_fault | ||
280 | rjmp ret_from_exception | ||
281 | |||
282 | /* This function expects to find offending PC in SYSREG_RAR_EX */ | 277 | /* This function expects to find offending PC in SYSREG_RAR_EX */ |
283 | .type save_full_context_ex, @function | 278 | .type save_full_context_ex, @function |
284 | .align 2 | 279 | .align 2 |