1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 #include <asm/exceptions.h>
65 #include <asm/unistd.h>
66 #include <asm/page.h>
67
68 #include <asm/entry.h>
69 #include <asm/current.h>
70 #include <linux/linkage.h>
71
72 #include <asm/mmu.h>
73 #include <asm/pgtable.h>
74 #include <asm/signal.h>
75 #include <asm/registers.h>
76 #include <asm/asm-offsets.h>
77
78 #undef DEBUG
79
80
81 #define NUM_TO_REG(num) r ## num
82
83 #ifdef CONFIG_MMU
84 #define RESTORE_STATE \
85 lwi r5, r1, 0; \
86 mts rmsr, r5; \
87 nop; \
88 lwi r3, r1, PT_R3; \
89 lwi r4, r1, PT_R4; \
90 lwi r5, r1, PT_R5; \
91 lwi r6, r1, PT_R6; \
92 lwi r11, r1, PT_R11; \
93 lwi r31, r1, PT_R31; \
94 lwi r1, r1, PT_R1;
95 #endif
96
97 #define LWREG_NOP \
98 bri ex_handler_unhandled; \
99 nop;
100
101 #define SWREG_NOP \
102 bri ex_handler_unhandled; \
103 nop;
104
105
106
107
108
109
110 #define R3_TO_LWREG_V(regnum) \
111 swi r3, r1, 4 * regnum; \
112 bri ex_handler_done;
113
114
115 #define R3_TO_LWREG(regnum) \
116 or NUM_TO_REG (regnum), r0, r3; \
117 bri ex_handler_done;
118
119
120 #define SWREG_TO_R3_V(regnum) \
121 lwi r3, r1, 4 * regnum; \
122 bri ex_sw_tail;
123
124
125 #define SWREG_TO_R3(regnum) \
126 or r3, r0, NUM_TO_REG (regnum); \
127 bri ex_sw_tail;
128
129 #ifdef CONFIG_MMU
130 #define R3_TO_LWREG_VM_V(regnum) \
131 brid ex_lw_end_vm; \
132 swi r3, r7, 4 * regnum;
133
134 #define R3_TO_LWREG_VM(regnum) \
135 brid ex_lw_end_vm; \
136 or NUM_TO_REG (regnum), r0, r3;
137
138 #define SWREG_TO_R3_VM_V(regnum) \
139 brid ex_sw_tail_vm; \
140 lwi r3, r7, 4 * regnum;
141
142 #define SWREG_TO_R3_VM(regnum) \
143 brid ex_sw_tail_vm; \
144 or r3, r0, NUM_TO_REG (regnum);
145
146
147 #if CONFIG_XILINX_MICROBLAZE0_USE_BARREL == 0
148
149 #define BSRLI2(rD, rA) \
150 srl rD, rA; \
151 srl rD, rD;
152 #define BSRLI4(rD, rA) \
153 BSRLI2(rD, rA); \
154 BSRLI2(rD, rD)
155 #define BSRLI10(rD, rA) \
156 srl rD, rA; \
157 srl rD, rD; \
158 srl rD, rD; \
159 srl rD, rD; \
160 srl rD, rD; \
161 srl rD, rD; \
162 srl rD, rD; \
163 srl rD, rD; \
164 srl rD, rD; \
165 srl rD, rD
166 #define BSRLI20(rD, rA) \
167 BSRLI10(rD, rA); \
168 BSRLI10(rD, rD)
169
170 .macro bsrli, rD, rA, IMM
171 .if (\IMM) == 2
172 BSRLI2(\rD, \rA)
173 .elseif (\IMM) == 10
174 BSRLI10(\rD, \rA)
175 .elseif (\IMM) == 12
176 BSRLI2(\rD, \rA)
177 BSRLI10(\rD, \rD)
178 .elseif (\IMM) == 14
179 BSRLI4(\rD, \rA)
180 BSRLI10(\rD, \rD)
181 .elseif (\IMM) == 20
182 BSRLI20(\rD, \rA)
183 .elseif (\IMM) == 24
184 BSRLI4(\rD, \rA)
185 BSRLI20(\rD, \rD)
186 .elseif (\IMM) == 28
187 BSRLI4(\rD, \rA)
188 BSRLI4(\rD, \rD)
189 BSRLI20(\rD, \rD)
190 .else
191 .error "BSRLI shift macros \IMM"
192 .endif
193 .endm
194 #endif
195
196 #endif
197
198 .extern other_exception_handler
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254 #ifdef CONFIG_MMU
255 .section .data
256 .align 4
257 pt_pool_space:
258 .space PT_SIZE
259
260 #ifdef DEBUG
261
262 .section .data
263 .global exception_debug_table
264 .align 4
265 exception_debug_table:
266
267 .space (32 * 4)
268 #endif
269
270 .section .rodata
271 .align 4
272 _MB_HW_ExceptionVectorTable:
273
274 .long TOPHYS(ex_handler_unhandled)
275
276 .long TOPHYS(handle_unaligned_ex)
277
278 .long TOPHYS(full_exception_trapw)
279
280 .long TOPHYS(full_exception_trapw)
281
282 .long TOPHYS(full_exception_trapw)
283
284 .long TOPHYS(full_exception_trapw)
285
286 .long TOPHYS(full_exception_trapw)
287
288 .long TOPHYS(full_exception_trapw)
289
290 .long TOPHYS(ex_handler_unhandled)
291 .long TOPHYS(ex_handler_unhandled)
292 .long TOPHYS(ex_handler_unhandled)
293 .long TOPHYS(ex_handler_unhandled)
294 .long TOPHYS(ex_handler_unhandled)
295 .long TOPHYS(ex_handler_unhandled)
296 .long TOPHYS(ex_handler_unhandled)
297 .long TOPHYS(ex_handler_unhandled)
298
299 .long TOPHYS(handle_data_storage_exception)
300
301 .long TOPHYS(handle_instruction_storage_exception)
302
303 .long TOPHYS(handle_data_tlb_miss_exception)
304
305 .long TOPHYS(handle_instruction_tlb_miss_exception)
306
307 .long TOPHYS(ex_handler_unhandled)
308 .long TOPHYS(ex_handler_unhandled)
309 .long TOPHYS(ex_handler_unhandled)
310 .long TOPHYS(ex_handler_unhandled)
311 .long TOPHYS(ex_handler_unhandled)
312 .long TOPHYS(ex_handler_unhandled)
313 .long TOPHYS(ex_handler_unhandled)
314 .long TOPHYS(ex_handler_unhandled)
315 .long TOPHYS(ex_handler_unhandled)
316 .long TOPHYS(ex_handler_unhandled)
317 .long TOPHYS(ex_handler_unhandled)
318 .long TOPHYS(ex_handler_unhandled)
319 #endif
320
321 .global _hw_exception_handler
322 .section .text
323 .align 4
324 .ent _hw_exception_handler
325 _hw_exception_handler:
326 #ifndef CONFIG_MMU
327 addik r1, r1, -(EX_HANDLER_STACK_SIZ);
328 #else
329 swi r1, r0, TOPHYS(pt_pool_space + PT_R1);
330
331
332 ori r1, r0, TOPHYS(pt_pool_space);
333 #endif
334 swi r3, r1, PT_R3
335 swi r4, r1, PT_R4
336 swi r5, r1, PT_R5
337 swi r6, r1, PT_R6
338
339 #ifdef CONFIG_MMU
340 swi r11, r1, PT_R11
341 swi r31, r1, PT_R31
342 lwi r31, r0, TOPHYS(PER_CPU(CURRENT_SAVE))
343 #endif
344
345 mfs r5, rmsr;
346 nop
347 swi r5, r1, 0;
348 mfs r4, resr
349 nop
350 mfs r3, rear;
351 nop
352
353 #ifndef CONFIG_MMU
354 andi r5, r4, 0x1000;
355 beqi r5, not_in_delay_slot;
356 mfs r17, rbtr;
357 nop
358 not_in_delay_slot:
359 swi r17, r1, PT_R17
360 #endif
361
362 andi r5, r4, 0x1F;
363
364 #ifdef CONFIG_MMU
365
366 addk r6, r5, r5;
367 addk r6, r6, r6;
368
369 #ifdef DEBUG
370
371 lwi r5, r0, TOPHYS(exception_debug_table)
372 addi r5, r5, 1
373 swi r5, r0, TOPHYS(exception_debug_table)
374 lwi r5, r6, TOPHYS(exception_debug_table)
375 addi r5, r5, 1
376 swi r5, r6, TOPHYS(exception_debug_table)
377 #endif
378
379
380 lwi r6, r6, TOPHYS(_MB_HW_ExceptionVectorTable)
381 bra r6
382
383 full_exception_trapw:
384 RESTORE_STATE
385 bri full_exception_trap
386 #else
387
388 mfs r6, rmsr;
389 nop
390 swi r6, r1, 0;
391 ori r6, r6, 0x100;
392 andi r6, r6, ~2;
393 mts rmsr, r6;
394 nop
395
396 xori r6, r5, 1;
397
398 beqi r6, handle_unaligned_ex;
399
400 handle_other_ex:
401
402 swi r7, r1, PT_R7
403 swi r8, r1, PT_R8
404 swi r9, r1, PT_R9
405 swi r10, r1, PT_R10
406 swi r11, r1, PT_R11
407 swi r12, r1, PT_R12
408 swi r14, r1, PT_R14
409 swi r15, r1, PT_R15
410 swi r18, r1, PT_R18
411
412 or r5, r1, r0
413 andi r6, r4, 0x1F;
414 lwi r7, r0, PER_CPU(KM)
415 swi r7, r1, PT_MODE
416 mfs r7, rfsr
417 nop
418 addk r8, r17, r0;
419 bralid r15, full_exception;
420 nop;
421 mts rfsr, r0;
422 nop
423
424
425
426
427
428 mfs r5, rmsr;
429 nop
430 ori r5, r5, 2;
431 mts rmsr, r5;
432 nop
433 addi r12, r0, __NR_syscalls;
434 brki r14, 0x08;
435 mfs r5, rmsr;
436 nop
437 andi r5, r5, ~2;
438 mts rmsr, r5;
439 nop
440
441 lwi r7, r1, PT_R7
442 lwi r8, r1, PT_R8
443 lwi r9, r1, PT_R9
444 lwi r10, r1, PT_R10
445 lwi r11, r1, PT_R11
446 lwi r12, r1, PT_R12
447 lwi r14, r1, PT_R14
448 lwi r15, r1, PT_R15
449 lwi r18, r1, PT_R18
450
451 bri ex_handler_done;
452 #endif
453
454
455
456
457
458
459
460
461 handle_unaligned_ex:
462
463
464
465
466 #ifdef CONFIG_MMU
467 andi r6, r4, 0x1000
468 beqi r6, _no_delayslot
469 mfs r17, rbtr;
470 nop
471 _no_delayslot:
472
473 RESTORE_STATE;
474 bri unaligned_data_trap
475 #endif
476 andi r6, r4, 0x3E0;
477 srl r6, r6;
478 srl r6, r6;
479 srl r6, r6;
480 srl r6, r6;
481 srl r6, r6;
482
483 sbi r6, r0, TOPHYS(ex_reg_op);
484
485 andi r6, r4, 0x400;
486 bnei r6, ex_sw;
487 ex_lw:
488 andi r6, r4, 0x800;
489 beqi r6, ex_lhw;
490 lbui r5, r3, 0;
491
492
493 sbi r5, r0, TOPHYS(ex_tmp_data_loc_0);
494 lbui r5, r3, 1;
495 sbi r5, r0, TOPHYS(ex_tmp_data_loc_1);
496 lbui r5, r3, 2;
497 sbi r5, r0, TOPHYS(ex_tmp_data_loc_2);
498 lbui r5, r3, 3;
499 sbi r5, r0, TOPHYS(ex_tmp_data_loc_3);
500
501 lwi r4, r0, TOPHYS(ex_tmp_data_loc_0);
502 bri ex_lw_tail;
503 ex_lhw:
504 lbui r5, r3, 0;
505
506
507 sbi r5, r0, TOPHYS(ex_tmp_data_loc_0);
508 lbui r5, r3, 1;
509 sbi r5, r0, TOPHYS(ex_tmp_data_loc_1);
510
511 lhui r4, r0, TOPHYS(ex_tmp_data_loc_0);
512 ex_lw_tail:
513
514 lbui r5, r0, TOPHYS(ex_reg_op);
515
516 addik r6, r0, TOPHYS(lw_table);
517 addk r5, r5, r5;
518 addk r5, r5, r5;
519 addk r5, r5, r5;
520 addk r5, r5, r6;
521 bra r5;
522 ex_lw_end:
523 ex_sw:
524
525 lbui r5, r0, TOPHYS(ex_reg_op);
526
527 addik r6, r0, TOPHYS(sw_table);
528 add r5, r5, r5;
529 add r5, r5, r5;
530 add r5, r5, r5;
531 add r5, r5, r6;
532 bra r5;
533 ex_sw_tail:
534 mfs r6, resr;
535 nop
536 andi r6, r6, 0x800;
537 beqi r6, ex_shw;
538
539 swi r4, r0, TOPHYS(ex_tmp_data_loc_0);
540
541 lbui r4, r0, TOPHYS(ex_tmp_data_loc_0);
542 sbi r4, r3, 0;
543 lbui r4, r0, TOPHYS(ex_tmp_data_loc_1);
544 sbi r4, r3, 1;
545 lbui r4, r0, TOPHYS(ex_tmp_data_loc_2);
546 sbi r4, r3, 2;
547 lbui r4, r0, TOPHYS(ex_tmp_data_loc_3);
548 sbi r4, r3, 3;
549 bri ex_handler_done;
550
551 ex_shw:
552
553 swi r4, r0, TOPHYS(ex_tmp_data_loc_0);
554 lbui r4, r0, TOPHYS(ex_tmp_data_loc_2);
555 sbi r4, r3, 0;
556 lbui r4, r0, TOPHYS(ex_tmp_data_loc_3);
557 sbi r4, r3, 1;
558 ex_sw_end:
559
560 ex_handler_done:
561 #ifndef CONFIG_MMU
562 lwi r5, r1, 0
563 mts rmsr, r5
564 nop
565 lwi r3, r1, PT_R3
566 lwi r4, r1, PT_R4
567 lwi r5, r1, PT_R5
568 lwi r6, r1, PT_R6
569 lwi r17, r1, PT_R17
570
571 rted r17, 0
572 addik r1, r1, (EX_HANDLER_STACK_SIZ);
573 #else
574 RESTORE_STATE;
575 rted r17, 0
576 nop
577 #endif
578
579 #ifdef CONFIG_MMU
580
581
582
583
584
585
586
587
588
589
590
591 handle_data_storage_exception:
592
593
594
595 mfs r11, rpid
596 nop
597
598
599
600 ori r5, r0, CONFIG_KERNEL_START
601 cmpu r5, r3, r5
602 bgti r5, ex3
603
604
605
606
607 andi r4, r4, ESR_DIZ
608 bnei r4, ex2
609
610 ori r4, r0, swapper_pg_dir
611 mts rpid, r0
612 nop
613 bri ex4
614
615
616 ex3:
617
618
619
620
621 andi r4, r4, ESR_DIZ
622 bnei r4, ex2
623
624 addi r4 ,CURRENT_TASK, TOPHYS(0);
625 lwi r4, r4, TASK_THREAD+PGDIR
626 ex4:
627 tophys(r4,r4)
628
629 bsrli r5, r3, PGDIR_SHIFT - 2
630 andi r5, r5, PAGE_SIZE - 4
631
632 or r4, r4, r5
633 lwi r4, r4, 0
634 andi r5, r4, PAGE_MASK
635 beqi r5, ex2
636
637 tophys(r5,r5)
638 bsrli r6, r3, PTE_SHIFT
639 andi r6, r6, PAGE_SIZE - 4
640 or r5, r5, r6
641 lwi r4, r5, 0
642
643 andi r6, r4, _PAGE_RW
644 beqi r6, ex2
645
646
647 ori r4, r4, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE
648 swi r4, r5, 0
649
650
651
652
653
654
655
656
657
658
659 andi r4, r4, PAGE_MASK | TLB_EX | TLB_WR | \
660 TLB_ZSEL(1) | TLB_ATTR_MASK
661 ori r4, r4, _PAGE_HWEXEC
662
663
664 mts rtlbsx, r3
665 nop
666 mfs r5, rtlbx
667 nop
668 mts rtlblo, r4
669 nop
670
671
672
673 mts rpid, r11
674 nop
675 bri 4
676
677 RESTORE_STATE;
678 rted r17, 0
679 nop
680 ex2:
681
682
683 mts rpid, r11
684 nop
685 bri 4
686 RESTORE_STATE;
687 bri page_fault_data_trap
688
689
690
691
692 handle_instruction_storage_exception:
693
694
695
696
697 RESTORE_STATE;
698 bri page_fault_instr_trap
699
700
701
702
703
704
705 handle_data_tlb_miss_exception:
706
707
708
709 mfs r11, rpid
710 nop
711
712
713
714 ori r6, r0, CONFIG_KERNEL_START
715 cmpu r4, r3, r6
716 bgti r4, ex5
717 ori r4, r0, swapper_pg_dir
718 mts rpid, r0
719 nop
720 bri ex6
721
722
723 ex5:
724
725 addi r4 ,CURRENT_TASK, TOPHYS(0);
726 lwi r4, r4, TASK_THREAD+PGDIR
727 ex6:
728 tophys(r4,r4)
729
730 bsrli r5, r3, PGDIR_SHIFT - 2
731 andi r5, r5, PAGE_SIZE - 4
732
733 or r4, r4, r5
734 lwi r4, r4, 0
735 andi r5, r4, PAGE_MASK
736 beqi r5, ex7
737
738 tophys(r5,r5)
739 bsrli r6, r3, PTE_SHIFT
740 andi r6, r6, PAGE_SIZE - 4
741 or r5, r5, r6
742 lwi r4, r5, 0
743
744 andi r6, r4, _PAGE_PRESENT
745 beqi r6, ex7
746
747 ori r4, r4, _PAGE_ACCESSED
748 swi r4, r5, 0
749
750
751
752
753
754
755
756
757
758 brid finish_tlb_load
759 andi r4, r4, PAGE_MASK | TLB_EX | TLB_WR | \
760 TLB_ZSEL(1) | TLB_ATTR_MASK
761 ex7:
762
763
764
765 mts rpid, r11
766 nop
767 bri 4
768 RESTORE_STATE;
769 bri page_fault_data_trap
770
771
772
773
774
775 handle_instruction_tlb_miss_exception:
776
777
778
779 mfs r11, rpid
780 nop
781
782
783
784
785 ori r4, r0, CONFIG_KERNEL_START
786 cmpu r4, r3, r4
787 bgti r4, ex8
788 ori r4, r0, swapper_pg_dir
789 mts rpid, r0
790 nop
791 bri ex9
792
793
794 ex8:
795
796 addi r4 ,CURRENT_TASK, TOPHYS(0);
797 lwi r4, r4, TASK_THREAD+PGDIR
798 ex9:
799 tophys(r4,r4)
800
801 bsrli r5, r3, PGDIR_SHIFT - 2
802 andi r5, r5, PAGE_SIZE - 4
803
804 or r4, r4, r5
805 lwi r4, r4, 0
806 andi r5, r4, PAGE_MASK
807 beqi r5, ex10
808
809 tophys(r5,r5)
810 bsrli r6, r3, PTE_SHIFT
811 andi r6, r6, PAGE_SIZE - 4
812 or r5, r5, r6
813 lwi r4, r5, 0
814
815 andi r6, r4, _PAGE_PRESENT
816 beqi r6, ex10
817
818 ori r4, r4, _PAGE_ACCESSED
819 swi r4, r5, 0
820
821
822
823
824
825
826
827
828
829 brid finish_tlb_load
830 andi r4, r4, PAGE_MASK | TLB_EX | TLB_WR | \
831 TLB_ZSEL(1) | TLB_ATTR_MASK
832 ex10:
833
834
835
836 mts rpid, r11
837 nop
838 bri 4
839 RESTORE_STATE;
840 bri page_fault_instr_trap
841
842
843
844
845
846
847
848
849
850 .section .data
851 .align 4
852 .global tlb_skip
853 tlb_skip:
854 .long MICROBLAZE_TLB_SKIP
855 tlb_index:
856
857 .long MICROBLAZE_TLB_SIZE/2
858 .previous
859 finish_tlb_load:
860
861 lwi r5, r0, TOPHYS(tlb_index)
862 addik r5, r5, 1
863
864
865 andi r5, r5, MICROBLAZE_TLB_SIZE - 1
866 ori r6, r0, 1
867 cmp r31, r5, r6
868 blti r31, ex12
869 lwi r5, r0, TOPHYS(tlb_skip)
870 ex12:
871
872 swi r5, r0, TOPHYS(tlb_index)
873
874 ori r4, r4, _PAGE_HWEXEC
875 mts rtlbx, r5
876 nop
877 mts rtlblo, r4
878 nop
879
880
881
882
883
884 andi r3, r3, PAGE_MASK
885 #ifdef CONFIG_MICROBLAZE_64K_PAGES
886 ori r3, r3, TLB_VALID | TLB_PAGESZ(PAGESZ_64K)
887 #elif CONFIG_MICROBLAZE_16K_PAGES
888 ori r3, r3, TLB_VALID | TLB_PAGESZ(PAGESZ_16K)
889 #else
890 ori r3, r3, TLB_VALID | TLB_PAGESZ(PAGESZ_4K)
891 #endif
892 mts rtlbhi, r3
893 nop
894
895
896 mts rpid, r11
897 nop
898 bri 4
899 RESTORE_STATE;
900 rted r17, 0
901 nop
902
903
904
905
906
907
908 .globl giveup_fpu;
909 .align 4;
910 giveup_fpu:
911 bralid r15,0
912 nop
913
914
915 .globl abort;
916 .align 4;
917 abort:
918 br r0
919
920 .globl set_context;
921 .align 4;
922 set_context:
923 mts rpid, r5
924 nop
925 bri 4
926 rtsd r15,8
927 nop
928
929 #endif
930 .end _hw_exception_handler
931
932 #ifdef CONFIG_MMU
933
934
935
936
937
938
939
940
941
942
943 .global _unaligned_data_exception
944 .ent _unaligned_data_exception
945 _unaligned_data_exception:
946 andi r8, r3, 0x3E0;
947 bsrli r8, r8, 2;
948 andi r6, r3, 0x400;
949 bneid r6, ex_sw_vm;
950 andi r6, r3, 0x800;
951 ex_lw_vm:
952 beqid r6, ex_lhw_vm;
953 load1: lbui r5, r4, 0;
954
955 addik r6, r0, ex_tmp_data_loc_0;
956 sbi r5, r6, 0;
957 load2: lbui r5, r4, 1;
958 sbi r5, r6, 1;
959 load3: lbui r5, r4, 2;
960 sbi r5, r6, 2;
961 load4: lbui r5, r4, 3;
962 sbi r5, r6, 3;
963 brid ex_lw_tail_vm;
964
965 lwi r3, r6, 0;
966 ex_lhw_vm:
967
968
969 addik r6, r0, ex_tmp_data_loc_0;
970 sbi r5, r6, 0;
971 load5: lbui r5, r4, 1;
972 sbi r5, r6, 1;
973 lhui r3, r6, 0;
974 ex_lw_tail_vm:
975
976 addik r5, r8, lw_table_vm;
977 bra r5;
978 ex_lw_end_vm:
979 brai ret_from_exc;
980 ex_sw_vm:
981
982 addik r5, r8, sw_table_vm;
983 bra r5;
984 ex_sw_tail_vm:
985 addik r5, r0, ex_tmp_data_loc_0;
986 beqid r6, ex_shw_vm;
987 swi r3, r5, 0;
988
989 lbui r3, r5, 0;
990 store1: sbi r3, r4, 0;
991 lbui r3, r5, 1;
992 store2: sbi r3, r4, 1;
993 lbui r3, r5, 2;
994 store3: sbi r3, r4, 2;
995 lbui r3, r5, 3;
996 brid ret_from_exc;
997 store4: sbi r3, r4, 3;
998 ex_shw_vm:
999
1000 #ifdef __MICROBLAZEEL__
1001 lbui r3, r5, 0;
1002 store5: sbi r3, r4, 0;
1003 lbui r3, r5, 1;
1004 brid ret_from_exc;
1005 store6: sbi r3, r4, 1;
1006 #else
1007 lbui r3, r5, 2;
1008 store5: sbi r3, r4, 0;
1009 lbui r3, r5, 3;
1010 brid ret_from_exc;
1011 store6: sbi r3, r4, 1;
1012 #endif
1013
1014 ex_sw_end_vm:
1015
1016
1017
1018
1019
1020 ex_unaligned_fixup:
1021 ori r5, r7, 0
1022 lwi r6, r7, PT_PC;
1023 addik r6, r6, -4
1024 swi r6, r7, PT_PC;
1025 addik r7, r0, SIGSEGV
1026
1027
1028 addik r15, r0, ret_from_exc-8
1029 brid bad_page_fault
1030 nop
1031
1032
1033 .section __ex_table,"a";
1034 .word load1,ex_unaligned_fixup;
1035 .word load2,ex_unaligned_fixup;
1036 .word load3,ex_unaligned_fixup;
1037 .word load4,ex_unaligned_fixup;
1038 .word load5,ex_unaligned_fixup;
1039 .word store1,ex_unaligned_fixup;
1040 .word store2,ex_unaligned_fixup;
1041 .word store3,ex_unaligned_fixup;
1042 .word store4,ex_unaligned_fixup;
1043 .word store5,ex_unaligned_fixup;
1044 .word store6,ex_unaligned_fixup;
1045 .previous;
1046 .end _unaligned_data_exception
1047 #endif
1048
1049 .global ex_handler_unhandled
1050 ex_handler_unhandled:
1051
1052 bri 0
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062 .section .text
1063 .align 4
1064 lw_table:
1065 lw_r0: R3_TO_LWREG (0);
1066 lw_r1: LWREG_NOP;
1067 lw_r2: R3_TO_LWREG (2);
1068 lw_r3: R3_TO_LWREG_V (3);
1069 lw_r4: R3_TO_LWREG_V (4);
1070 lw_r5: R3_TO_LWREG_V (5);
1071 lw_r6: R3_TO_LWREG_V (6);
1072 lw_r7: R3_TO_LWREG (7);
1073 lw_r8: R3_TO_LWREG (8);
1074 lw_r9: R3_TO_LWREG (9);
1075 lw_r10: R3_TO_LWREG (10);
1076 lw_r11: R3_TO_LWREG (11);
1077 lw_r12: R3_TO_LWREG (12);
1078 lw_r13: R3_TO_LWREG (13);
1079 lw_r14: R3_TO_LWREG (14);
1080 lw_r15: R3_TO_LWREG (15);
1081 lw_r16: R3_TO_LWREG (16);
1082 lw_r17: LWREG_NOP;
1083 lw_r18: R3_TO_LWREG (18);
1084 lw_r19: R3_TO_LWREG (19);
1085 lw_r20: R3_TO_LWREG (20);
1086 lw_r21: R3_TO_LWREG (21);
1087 lw_r22: R3_TO_LWREG (22);
1088 lw_r23: R3_TO_LWREG (23);
1089 lw_r24: R3_TO_LWREG (24);
1090 lw_r25: R3_TO_LWREG (25);
1091 lw_r26: R3_TO_LWREG (26);
1092 lw_r27: R3_TO_LWREG (27);
1093 lw_r28: R3_TO_LWREG (28);
1094 lw_r29: R3_TO_LWREG (29);
1095 lw_r30: R3_TO_LWREG (30);
1096 #ifdef CONFIG_MMU
1097 lw_r31: R3_TO_LWREG_V (31);
1098 #else
1099 lw_r31: R3_TO_LWREG (31);
1100 #endif
1101
1102 sw_table:
1103 sw_r0: SWREG_TO_R3 (0);
1104 sw_r1: SWREG_NOP;
1105 sw_r2: SWREG_TO_R3 (2);
1106 sw_r3: SWREG_TO_R3_V (3);
1107 sw_r4: SWREG_TO_R3_V (4);
1108 sw_r5: SWREG_TO_R3_V (5);
1109 sw_r6: SWREG_TO_R3_V (6);
1110 sw_r7: SWREG_TO_R3 (7);
1111 sw_r8: SWREG_TO_R3 (8);
1112 sw_r9: SWREG_TO_R3 (9);
1113 sw_r10: SWREG_TO_R3 (10);
1114 sw_r11: SWREG_TO_R3 (11);
1115 sw_r12: SWREG_TO_R3 (12);
1116 sw_r13: SWREG_TO_R3 (13);
1117 sw_r14: SWREG_TO_R3 (14);
1118 sw_r15: SWREG_TO_R3 (15);
1119 sw_r16: SWREG_TO_R3 (16);
1120 sw_r17: SWREG_NOP;
1121 sw_r18: SWREG_TO_R3 (18);
1122 sw_r19: SWREG_TO_R3 (19);
1123 sw_r20: SWREG_TO_R3 (20);
1124 sw_r21: SWREG_TO_R3 (21);
1125 sw_r22: SWREG_TO_R3 (22);
1126 sw_r23: SWREG_TO_R3 (23);
1127 sw_r24: SWREG_TO_R3 (24);
1128 sw_r25: SWREG_TO_R3 (25);
1129 sw_r26: SWREG_TO_R3 (26);
1130 sw_r27: SWREG_TO_R3 (27);
1131 sw_r28: SWREG_TO_R3 (28);
1132 sw_r29: SWREG_TO_R3 (29);
1133 sw_r30: SWREG_TO_R3 (30);
1134 #ifdef CONFIG_MMU
1135 sw_r31: SWREG_TO_R3_V (31);
1136 #else
1137 sw_r31: SWREG_TO_R3 (31);
1138 #endif
1139
1140 #ifdef CONFIG_MMU
1141 lw_table_vm:
1142 lw_r0_vm: R3_TO_LWREG_VM (0);
1143 lw_r1_vm: R3_TO_LWREG_VM_V (1);
1144 lw_r2_vm: R3_TO_LWREG_VM_V (2);
1145 lw_r3_vm: R3_TO_LWREG_VM_V (3);
1146 lw_r4_vm: R3_TO_LWREG_VM_V (4);
1147 lw_r5_vm: R3_TO_LWREG_VM_V (5);
1148 lw_r6_vm: R3_TO_LWREG_VM_V (6);
1149 lw_r7_vm: R3_TO_LWREG_VM_V (7);
1150 lw_r8_vm: R3_TO_LWREG_VM_V (8);
1151 lw_r9_vm: R3_TO_LWREG_VM_V (9);
1152 lw_r10_vm: R3_TO_LWREG_VM_V (10);
1153 lw_r11_vm: R3_TO_LWREG_VM_V (11);
1154 lw_r12_vm: R3_TO_LWREG_VM_V (12);
1155 lw_r13_vm: R3_TO_LWREG_VM_V (13);
1156 lw_r14_vm: R3_TO_LWREG_VM_V (14);
1157 lw_r15_vm: R3_TO_LWREG_VM_V (15);
1158 lw_r16_vm: R3_TO_LWREG_VM_V (16);
1159 lw_r17_vm: R3_TO_LWREG_VM_V (17);
1160 lw_r18_vm: R3_TO_LWREG_VM_V (18);
1161 lw_r19_vm: R3_TO_LWREG_VM_V (19);
1162 lw_r20_vm: R3_TO_LWREG_VM_V (20);
1163 lw_r21_vm: R3_TO_LWREG_VM_V (21);
1164 lw_r22_vm: R3_TO_LWREG_VM_V (22);
1165 lw_r23_vm: R3_TO_LWREG_VM_V (23);
1166 lw_r24_vm: R3_TO_LWREG_VM_V (24);
1167 lw_r25_vm: R3_TO_LWREG_VM_V (25);
1168 lw_r26_vm: R3_TO_LWREG_VM_V (26);
1169 lw_r27_vm: R3_TO_LWREG_VM_V (27);
1170 lw_r28_vm: R3_TO_LWREG_VM_V (28);
1171 lw_r29_vm: R3_TO_LWREG_VM_V (29);
1172 lw_r30_vm: R3_TO_LWREG_VM_V (30);
1173 lw_r31_vm: R3_TO_LWREG_VM_V (31);
1174
1175 sw_table_vm:
1176 sw_r0_vm: SWREG_TO_R3_VM (0);
1177 sw_r1_vm: SWREG_TO_R3_VM_V (1);
1178 sw_r2_vm: SWREG_TO_R3_VM_V (2);
1179 sw_r3_vm: SWREG_TO_R3_VM_V (3);
1180 sw_r4_vm: SWREG_TO_R3_VM_V (4);
1181 sw_r5_vm: SWREG_TO_R3_VM_V (5);
1182 sw_r6_vm: SWREG_TO_R3_VM_V (6);
1183 sw_r7_vm: SWREG_TO_R3_VM_V (7);
1184 sw_r8_vm: SWREG_TO_R3_VM_V (8);
1185 sw_r9_vm: SWREG_TO_R3_VM_V (9);
1186 sw_r10_vm: SWREG_TO_R3_VM_V (10);
1187 sw_r11_vm: SWREG_TO_R3_VM_V (11);
1188 sw_r12_vm: SWREG_TO_R3_VM_V (12);
1189 sw_r13_vm: SWREG_TO_R3_VM_V (13);
1190 sw_r14_vm: SWREG_TO_R3_VM_V (14);
1191 sw_r15_vm: SWREG_TO_R3_VM_V (15);
1192 sw_r16_vm: SWREG_TO_R3_VM_V (16);
1193 sw_r17_vm: SWREG_TO_R3_VM_V (17);
1194 sw_r18_vm: SWREG_TO_R3_VM_V (18);
1195 sw_r19_vm: SWREG_TO_R3_VM_V (19);
1196 sw_r20_vm: SWREG_TO_R3_VM_V (20);
1197 sw_r21_vm: SWREG_TO_R3_VM_V (21);
1198 sw_r22_vm: SWREG_TO_R3_VM_V (22);
1199 sw_r23_vm: SWREG_TO_R3_VM_V (23);
1200 sw_r24_vm: SWREG_TO_R3_VM_V (24);
1201 sw_r25_vm: SWREG_TO_R3_VM_V (25);
1202 sw_r26_vm: SWREG_TO_R3_VM_V (26);
1203 sw_r27_vm: SWREG_TO_R3_VM_V (27);
1204 sw_r28_vm: SWREG_TO_R3_VM_V (28);
1205 sw_r29_vm: SWREG_TO_R3_VM_V (29);
1206 sw_r30_vm: SWREG_TO_R3_VM_V (30);
1207 sw_r31_vm: SWREG_TO_R3_VM_V (31);
1208 #endif
1209
1210
1211 .section .data
1212 .align 4
1213 ex_tmp_data_loc_0:
1214 .byte 0
1215 ex_tmp_data_loc_1:
1216 .byte 0
1217 ex_tmp_data_loc_2:
1218 .byte 0
1219 ex_tmp_data_loc_3:
1220 .byte 0
1221 ex_reg_op:
1222 .byte 0