]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - arch/sparc64/kernel/una_asm.S
[SPARC64]: Move kernel unaligned trap handlers into assembler file.
[mirror_ubuntu-jammy-kernel.git] / arch / sparc64 / kernel / una_asm.S
1 /* una_asm.S: Kernel unaligned trap assembler helpers.
2 *
3 * Copyright (C) 1996,2005 David S. Miller (davem@davemloft.net)
4 * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
5 */
6
7 .text
8
9 kernel_unaligned_trap_fault:
10 call kernel_mna_trap_fault
11 nop
12 retl
13 nop
14 .size kern_unaligned_trap_fault, .-kern_unaligned_trap_fault
15
16 .globl __do_int_store
17 __do_int_store:
18 rd %asi, %o4
19 wr %o3, 0, %asi
20 ldx [%o2], %g3
21 cmp %o1, 2
22 be,pn %icc, 2f
23 cmp %o1, 4
24 be,pt %icc, 1f
25 srlx %g3, 24, %g2
26 srlx %g3, 56, %g1
27 srlx %g3, 48, %g7
28 4: stba %g1, [%o0] %asi
29 srlx %g3, 40, %g1
30 5: stba %g7, [%o0 + 1] %asi
31 srlx %g3, 32, %g7
32 6: stba %g1, [%o0 + 2] %asi
33 7: stba %g7, [%o0 + 3] %asi
34 srlx %g3, 16, %g1
35 8: stba %g2, [%o0 + 4] %asi
36 srlx %g3, 8, %g7
37 9: stba %g1, [%o0 + 5] %asi
38 10: stba %g7, [%o0 + 6] %asi
39 ba,pt %xcc, 0f
40 11: stba %g3, [%o0 + 7] %asi
41 1: srl %g3, 16, %g7
42 12: stba %g2, [%o0] %asi
43 srl %g3, 8, %g2
44 13: stba %g7, [%o0 + 1] %asi
45 14: stba %g2, [%o0 + 2] %asi
46 ba,pt %xcc, 0f
47 15: stba %g3, [%o0 + 3] %asi
48 2: srl %g3, 8, %g2
49 16: stba %g2, [%o0] %asi
50 17: stba %g3, [%o0 + 1] %asi
51 0:
52 wr %o4, 0x0, %asi
53 retl
54 nop
55 .size __do_int_store, .-__do_int_store
56
57 .section __ex_table
58 .word 4b, kernel_unaligned_trap_fault
59 .word 5b, kernel_unaligned_trap_fault
60 .word 6b, kernel_unaligned_trap_fault
61 .word 7b, kernel_unaligned_trap_fault
62 .word 8b, kernel_unaligned_trap_fault
63 .word 9b, kernel_unaligned_trap_fault
64 .word 10b, kernel_unaligned_trap_fault
65 .word 11b, kernel_unaligned_trap_fault
66 .word 12b, kernel_unaligned_trap_fault
67 .word 13b, kernel_unaligned_trap_fault
68 .word 14b, kernel_unaligned_trap_fault
69 .word 15b, kernel_unaligned_trap_fault
70 .word 16b, kernel_unaligned_trap_fault
71 .word 17b, kernel_unaligned_trap_fault
72 .previous
73
74 .globl do_int_load
75 do_int_load:
76 rd %asi, %o5
77 wr %o4, 0, %asi
78 cmp %o1, 8
79 bge,pn %icc, 9f
80 cmp %o1, 4
81 be,pt %icc, 6f
82 4: lduba [%o2] %asi, %g2
83 5: lduba [%o2 + 1] %asi, %g3
84 sll %g2, 8, %g2
85 brz,pt %o3, 3f
86 add %g2, %g3, %g2
87 sllx %g2, 48, %g2
88 srax %g2, 48, %g2
89 3: ba,pt %xcc, 0f
90 stx %g2, [%o0]
91 6: lduba [%o2 + 1] %asi, %g3
92 sll %g2, 24, %g2
93 7: lduba [%o2 + 2] %asi, %g7
94 sll %g3, 16, %g3
95 8: lduba [%o2 + 3] %asi, %g1
96 sll %g7, 8, %g7
97 or %g2, %g3, %g2
98 or %g7, %g1, %g7
99 or %g2, %g7, %g2
100 brnz,a,pt %o3, 3f
101 sra %g2, 0, %g2
102 3: ba,pt %xcc, 0f
103 stx %g2, [%o0]
104 9: lduba [%o2] %asi, %g2
105 10: lduba [%o2 + 1] %asi, %g3
106 sllx %g2, 56, %g2
107 11: lduba [%o2 + 2] %asi, %g7
108 sllx %g3, 48, %g3
109 12: lduba [%o2 + 3] %asi, %g1
110 sllx %g7, 40, %g7
111 sllx %g1, 32, %g1
112 or %g2, %g3, %g2
113 or %g7, %g1, %g7
114 13: lduba [%o2 + 4] %asi, %g3
115 or %g2, %g7, %g7
116 14: lduba [%o2 + 5] %asi, %g1
117 sllx %g3, 24, %g3
118 15: lduba [%o2 + 6] %asi, %g2
119 sllx %g1, 16, %g1
120 or %g7, %g3, %g7
121 16: lduba [%o2 + 7] %asi, %g3
122 sllx %g2, 8, %g2
123 or %g7, %g1, %g7
124 or %g2, %g3, %g2
125 or %g7, %g2, %g7
126 cmp %o1, 8
127 be,a,pt %icc, 0f
128 stx %g7, [%o0]
129 srlx %g7, 32, %g2
130 sra %g7, 0, %g7
131 stx %g2, [%o0]
132 stx %g7, [%o0 + 8]
133 0:
134 wr %o5, 0x0, %asi
135 retl
136 nop
137 .size __do_int_load, .-__do_int_load
138
139 .section __ex_table
140 .word 4b, kernel_unaligned_trap_fault
141 .word 5b, kernel_unaligned_trap_fault
142 .word 6b, kernel_unaligned_trap_fault
143 .word 7b, kernel_unaligned_trap_fault
144 .word 8b, kernel_unaligned_trap_fault
145 .word 9b, kernel_unaligned_trap_fault
146 .word 10b, kernel_unaligned_trap_fault
147 .word 11b, kernel_unaligned_trap_fault
148 .word 12b, kernel_unaligned_trap_fault
149 .word 13b, kernel_unaligned_trap_fault
150 .word 14b, kernel_unaligned_trap_fault
151 .word 15b, kernel_unaligned_trap_fault
152 .word 16b, kernel_unaligned_trap_fault
153 .previous