Commit | Line | Data |
---|---|---|
f0e98c38 DM |
1 | /* una_asm.S: Kernel unaligned trap assembler helpers. |
2 | * | |
3 | * Copyright (C) 1996,2005,2008 David S. Miller (davem@davemloft.net) | |
4 | * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | |
5 | */ | |
6 | ||
7 | #include <linux/errno.h> | |
8 | ||
9 | .text | |
10 | ||
11 | retl_efault: | |
12 | retl | |
13 | mov -EFAULT, %o0 | |
14 | ||
15 | /* int __do_int_store(unsigned long *dst_addr, int size, | |
16 | * unsigned long *src_val) | |
17 | * | |
18 | * %o0 = dest_addr | |
19 | * %o1 = size | |
20 | * %o2 = src_val | |
21 | * | |
22 | * Return '0' on success, -EFAULT on failure. | |
23 | */ | |
24 | .globl __do_int_store | |
25 | __do_int_store: | |
26 | ld [%o2], %g1 | |
27 | cmp %1, 2 | |
28 | be 2f | |
29 | cmp %1, 4 | |
30 | be 1f | |
31 | srl %g1, 24, %g2 | |
32 | srl %g1, 16, %g7 | |
33 | 4: stb %g2, [%o0] | |
34 | srl %g1, 8, %g2 | |
35 | 5: stb %g7, [%o0 + 1] | |
36 | ld [%o2 + 4], %g7 | |
37 | 6: stb %g2, [%o0 + 2] | |
38 | srl %g7, 24, %g2 | |
39 | 7: stb %g1, [%o0 + 3] | |
40 | srl %g7, 16, %g1 | |
41 | 8: stb %g2, [%o0 + 4] | |
42 | srl %g7, 8, %g2 | |
43 | 9: stb %g1, [%o0 + 5] | |
44 | 10: stb %g2, [%o0 + 6] | |
45 | b 0f | |
46 | 11: stb %g7, [%o0 + 7] | |
47 | 1: srl %g1, 16, %g7 | |
48 | 12: stb %g2, [%o0] | |
49 | srl %g1, 8, %g2 | |
50 | 13: stb %g7, [%o0 + 1] | |
51 | 14: stb %g2, [%o0 + 2] | |
52 | b 0f | |
53 | 15: stb %g1, [%o0 + 3] | |
54 | 2: srl %g1, 8, %g2 | |
55 | 16: stb %g2, [%o0] | |
56 | 17: stb %g1, [%o0 + 1] | |
57 | 0: retl | |
58 | mov 0, %o0 | |
59 | ||
60 | .section __ex_table,#alloc | |
61 | .word 4b, retl_efault | |
62 | .word 5b, retl_efault | |
63 | .word 6b, retl_efault | |
64 | .word 7b, retl_efault | |
65 | .word 8b, retl_efault | |
66 | .word 9b, retl_efault | |
67 | .word 10b, retl_efault | |
68 | .word 11b, retl_efault | |
69 | .word 12b, retl_efault | |
70 | .word 13b, retl_efault | |
71 | .word 14b, retl_efault | |
72 | .word 15b, retl_efault | |
73 | .word 16b, retl_efault | |
74 | .word 17b, retl_efault | |
75 | .previous | |
76 | ||
77 | /* int do_int_load(unsigned long *dest_reg, int size, | |
78 | * unsigned long *saddr, int is_signed) | |
79 | * | |
80 | * %o0 = dest_reg | |
81 | * %o1 = size | |
82 | * %o2 = saddr | |
83 | * %o3 = is_signed | |
84 | * | |
85 | * Return '0' on success, -EFAULT on failure. | |
86 | */ | |
87 | .globl do_int_load | |
88 | do_int_load: | |
89 | cmp %o1, 8 | |
90 | be 9f | |
91 | cmp %o1, 4 | |
92 | be 6f | |
93 | 4: ldub [%o2], %g1 | |
94 | 5: ldub [%o2 + 1], %g2 | |
95 | sll %g1, 8, %g1 | |
96 | tst %o3 | |
97 | be 3f | |
98 | or %g1, %g2, %g1 | |
99 | sll %g1, 16, %g1 | |
100 | sra %g1, 16, %g1 | |
101 | 3: b 0f | |
102 | st %g1, [%o0] | |
103 | 6: ldub [%o2 + 1], %g2 | |
104 | sll %g1, 24, %g1 | |
105 | 7: ldub [%o2 + 2], %g7 | |
106 | sll %g2, 16, %g2 | |
107 | 8: ldub [%o2 + 3], %g3 | |
108 | sll %g7, 8, %g7 | |
109 | or %g3, %g2, %g3 | |
110 | or %g7, %g3, %g7 | |
111 | or %g1, %g7, %g1 | |
112 | b 0f | |
113 | st %g1, [%o0] | |
114 | 9: ldub [%o2], %g1 | |
115 | 10: ldub [%o2 + 1], %g2 | |
116 | sll %g1, 24, %g1 | |
117 | 11: ldub [%o2 + 2], %g7 | |
118 | sll %g2, 16, %g2 | |
119 | 12: ldub [%o2 + 3], %g3 | |
120 | sll %g7, 8, %g7 | |
121 | or %g1, %g2, %g1 | |
122 | or %g7, %g3, %g7 | |
123 | or %g1, %g7, %g7 | |
124 | 13: ldub [%o2 + 4], %g1 | |
125 | st %g7, [%o0] | |
126 | 14: ldub [%o2 + 5], %g2 | |
127 | sll %g1, 24, %g1 | |
128 | 15: ldub [%o2 + 6], %g7 | |
129 | sll %g2, 16, %g2 | |
130 | 16: ldub [%o2 + 7], %g3 | |
131 | sll %g7, 8, %g7 | |
132 | or %g1, %g2, %g1 | |
133 | or %g7, %g3, %g7 | |
134 | or %g1, %g7, %g7 | |
135 | st %g7, [%o0 + 4] | |
136 | 0: retl | |
137 | mov 0, %o0 | |
138 | ||
139 | .section __ex_table,#alloc | |
140 | .word 4b, retl_efault | |
141 | .word 5b, retl_efault | |
142 | .word 6b, retl_efault | |
143 | .word 7b, retl_efault | |
144 | .word 8b, retl_efault | |
145 | .word 9b, retl_efault | |
146 | .word 10b, retl_efault | |
147 | .word 11b, retl_efault | |
148 | .word 12b, retl_efault | |
149 | .word 13b, retl_efault | |
150 | .word 14b, retl_efault | |
151 | .word 15b, retl_efault | |
152 | .word 16b, retl_efault | |
153 | .previous |