8d2b749e17742723a4ca3b125931bc4fc0deb2e0
[linux-flexiantxendom0-3.2.10.git] / arch / sparc64 / lib / blockops.S
1 /* $Id: blockops.S,v 1.27 2000/07/14 01:12:49 davem Exp $
2  * blockops.S: UltraSparc block zero optimized routines.
3  *
4  * Copyright (C) 1996, 1998, 1999, 2000 David S. Miller (davem@redhat.com)
5  * Copyright (C) 1997 Jakub Jelinek (jakub@redhat.com)
6  */
7
8 #include "VIS.h"
9 #include <asm/visasm.h>
10 #include <asm/page.h>
11 #include <asm/pgtable.h>
12 #include <asm/asm_offsets.h>
13
14 #define TOUCH(reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7)   \
15         fmovd   %reg0, %f48;    fmovd   %reg1, %f50;            \
16         fmovd   %reg2, %f52;    fmovd   %reg3, %f54;            \
17         fmovd   %reg4, %f56;    fmovd   %reg5, %f58;            \
18         fmovd   %reg6, %f60;    fmovd   %reg7, %f62;
19
20 #define TLBTEMP_BASE    (8 * 1024 * 1024)
21 #define DCACHE_SIZE     (PAGE_SIZE * 2)
22 #define TLBTEMP_ENT1    (61 << 3)
23 #define TLBTEMP_ENT2    (62 << 3)
24 #define TLBTEMP_ENTSZ   (1 << 3)
25
26         .text
27
28         .align          32
29         .globl          _copy_page
30         .type           _copy_page,@function
31 _copy_page: /* %o0=dest, %o1=src */
32         VISEntry
33         membar          #LoadStore | #StoreStore | #StoreLoad
34         ldda            [%o1] ASI_BLK_P, %f0
35         add             %o1, 0x40, %o1
36         ldda            [%o1] ASI_BLK_P, %f16
37         add             %o1, 0x40, %o1
38         sethi           %hi(8192), %o2
39 1:      TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
40         ldda            [%o1] ASI_BLK_P, %f32
41         stda            %f48, [%o0] ASI_BLK_P
42         add             %o1, 0x40, %o1
43         sub             %o2, 0x40, %o2
44         add             %o0, 0x40, %o0
45         TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
46         ldda            [%o1] ASI_BLK_P, %f0
47         stda            %f48, [%o0] ASI_BLK_P
48         add             %o1, 0x40, %o1
49         sub             %o2, 0x40, %o2
50         add             %o0, 0x40, %o0
51         TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
52         ldda            [%o1] ASI_BLK_P, %f16
53         stda            %f48, [%o0] ASI_BLK_P
54         sub             %o2, 0x40, %o2
55         add             %o1, 0x40, %o1
56         cmp             %o2, 0x80
57         bne,pt          %xcc, 1b
58          add            %o0, 0x40, %o0
59         membar          #Sync
60         stda            %f0, [%o0] ASI_BLK_P
61         add             %o0, 0x40, %o0
62         stda            %f16, [%o0] ASI_BLK_P
63         membar          #Sync
64         VISExit
65         retl
66          nop
67
68         .globl          copy_user_page
69         .type           copy_user_page,@function
70 copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
71         VISEntry
72         sethi           %hi(PAGE_SIZE), %g3
73         sub             %o0, %g4, %g1
74         and             %o2, %g3, %o0
75         sethi           %hi(TLBTEMP_BASE), %o3
76         sethi           %uhi(_PAGE_VALID), %g3
77         sub             %o1, %g4, %g2
78         sllx            %g3, 32, %g3
79         mov             TLB_TAG_ACCESS, %o2
80         or              %g3, (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_L | _PAGE_W), %g3
81         sethi           %hi(DCACHE_SIZE), %o1
82         or              %g1, %g3, %g1
83         or              %g2, %g3, %g2
84         add             %o0, %o3, %o0
85         add             %o0, %o1, %o1
86         mov             TLBTEMP_ENT1, %o3
87         rdpr            %pstate, %g3
88         wrpr            %g3, PSTATE_IE, %pstate
89
90         /* Do this now, before loading the fixed TLB entries for copying,
91          * so we do not risk a multiple TLB match condition later when
92          * restoring those entries.
93          */
94         ldub            [%g6 + AOFF_task_thread + AOFF_thread_use_blkcommit], %g3
95
96         /* Spitfire Errata #32 workaround */
97         mov             0x8, %o4
98         stxa            %g0, [%o4] ASI_DMMU
99         sethi           %hi(empty_zero_page), %o4
100         flush           %o4
101
102         ldxa            [%o3] ASI_DTLB_TAG_READ, %o4
103
104         /* Spitfire Errata #32 workaround */
105         mov             0x8, %o5
106         stxa            %g0, [%o5] ASI_DMMU
107         sethi           %hi(empty_zero_page), %o5
108         flush           %o5
109
110         ldxa            [%o3] ASI_DTLB_DATA_ACCESS, %o5
111         stxa            %o0, [%o2] ASI_DMMU
112         stxa            %g1, [%o3] ASI_DTLB_DATA_ACCESS
113         membar          #Sync
114         add             %o3, (TLBTEMP_ENTSZ), %o3
115
116         /* Spitfire Errata #32 workaround */
117         mov             0x8, %g5
118         stxa            %g0, [%g5] ASI_DMMU
119         sethi           %hi(empty_zero_page), %g5
120         flush           %g5
121
122         ldxa            [%o3] ASI_DTLB_TAG_READ, %g5
123
124         /* Spitfire Errata #32 workaround */
125         mov             0x8, %g7
126         stxa            %g0, [%g7] ASI_DMMU
127         sethi           %hi(empty_zero_page), %g7
128         flush           %g7
129
130         ldxa            [%o3] ASI_DTLB_DATA_ACCESS, %g7
131         stxa            %o1, [%o2] ASI_DMMU
132         stxa            %g2, [%o3] ASI_DTLB_DATA_ACCESS
133         membar          #Sync
134
135         cmp             %g3, 0
136         bne,pn          %xcc, copy_page_using_blkcommit
137          nop
138
139         ldda            [%o1] ASI_BLK_P, %f0
140         add             %o1, 0x40, %o1
141         ldda            [%o1] ASI_BLK_P, %f16
142         add             %o1, 0x40, %o1
143         sethi           %hi(8192), %o2
144 1:      TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
145         ldda            [%o1] ASI_BLK_P, %f32
146         stda            %f48, [%o0] ASI_BLK_P
147         add             %o1, 0x40, %o1
148         sub             %o2, 0x40, %o2
149         add             %o0, 0x40, %o0
150         TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
151         ldda            [%o1] ASI_BLK_P, %f0
152         stda            %f48, [%o0] ASI_BLK_P
153         add             %o1, 0x40, %o1
154         sub             %o2, 0x40, %o2
155         add             %o0, 0x40, %o0
156         TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
157         ldda            [%o1] ASI_BLK_P, %f16
158         stda            %f48, [%o0] ASI_BLK_P
159         sub             %o2, 0x40, %o2
160         add             %o1, 0x40, %o1
161         cmp             %o2, 0x80
162         bne,pt          %xcc, 1b
163          add            %o0, 0x40, %o0
164         membar          #Sync
165         stda            %f0, [%o0] ASI_BLK_P
166         add             %o0, 0x40, %o0
167         stda            %f16, [%o0] ASI_BLK_P
168 copy_user_page_continue:
169         membar          #Sync
170         VISExit
171
172         mov             TLB_TAG_ACCESS, %o2
173         stxa            %g5, [%o2] ASI_DMMU
174         stxa            %g7, [%o3] ASI_DTLB_DATA_ACCESS
175         membar          #Sync
176         sub             %o3, (TLBTEMP_ENTSZ), %o3
177         stxa            %o4, [%o2] ASI_DMMU
178         stxa            %o5, [%o3] ASI_DTLB_DATA_ACCESS
179         membar          #Sync
180         rdpr            %pstate, %g3
181         jmpl            %o7 + 0x8, %g0
182          wrpr           %g3, PSTATE_IE, %pstate
183
184 copy_page_using_blkcommit:
185         membar          #LoadStore | #StoreStore | #StoreLoad
186         ldda            [%o1] ASI_BLK_P, %f0
187         add             %o1, 0x40, %o1
188         ldda            [%o1] ASI_BLK_P, %f16
189         add             %o1, 0x40, %o1
190         sethi           %hi(8192), %o2
191 1:      TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
192         ldda            [%o1] ASI_BLK_P, %f32
193         stda            %f48, [%o0] ASI_BLK_COMMIT_P
194         add             %o1, 0x40, %o1
195         sub             %o2, 0x40, %o2
196         add             %o0, 0x40, %o0
197         TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
198         ldda            [%o1] ASI_BLK_P, %f0
199         stda            %f48, [%o0] ASI_BLK_COMMIT_P
200         add             %o1, 0x40, %o1
201         sub             %o2, 0x40, %o2
202         add             %o0, 0x40, %o0
203         TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
204         ldda            [%o1] ASI_BLK_P, %f16
205         stda            %f48, [%o0] ASI_BLK_COMMIT_P
206         sub             %o2, 0x40, %o2
207         add             %o1, 0x40, %o1
208         cmp             %o2, 0x80
209         bne,pt          %xcc, 1b
210          add            %o0, 0x40, %o0
211         membar          #Sync
212         stda            %f0, [%o0] ASI_BLK_COMMIT_P
213         add             %o0, 0x40, %o0
214         ba,pt           %xcc, copy_user_page_continue
215          stda           %f16, [%o0] ASI_BLK_COMMIT_P
216
217         .align          32
218         .globl          _clear_page
219         .type           _clear_page,@function
220 _clear_page:    /* %o0=dest */
221         VISEntryHalf
222         ba,pt           %xcc, clear_page_common
223          clr            %o4
224
225         .align          32
226         .globl          clear_user_page
227         .type           clear_user_page,@function
228 clear_user_page:        /* %o0=dest, %o1=vaddr */
229         VISEntryHalf
230         sethi           %hi(PAGE_SIZE), %g3
231         sub             %o0, %g4, %g1
232         and             %o1, %g3, %o0
233         mov             TLB_TAG_ACCESS, %o2
234         sethi           %uhi(_PAGE_VALID), %g3
235         sethi           %hi(TLBTEMP_BASE), %o3
236         sllx            %g3, 32, %g3
237         or              %g3, (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_L | _PAGE_W), %g3
238         or              %g1, %g3, %g1
239         add             %o0, %o3, %o0
240         mov             TLBTEMP_ENT2, %o3
241         rdpr            %pstate, %g3
242         wrpr            %g3, PSTATE_IE, %pstate
243
244         /* Spitfire Errata #32 workaround */
245         mov             0x8, %g5
246         stxa            %g0, [%g5] ASI_DMMU
247         sethi           %hi(empty_zero_page), %g5
248         flush           %g5
249
250         ldxa            [%o3] ASI_DTLB_TAG_READ, %g5
251
252         /* Spitfire Errata #32 workaround */
253         mov             0x8, %g7
254         stxa            %g0, [%g7] ASI_DMMU
255         sethi           %hi(empty_zero_page), %g7
256         flush           %g7
257
258         ldxa            [%o3] ASI_DTLB_DATA_ACCESS, %g7
259         stxa            %o0, [%o2] ASI_DMMU
260         stxa            %g1, [%o3] ASI_DTLB_DATA_ACCESS
261         membar          #Sync
262
263         mov             1, %o4
264
265 clear_page_common:
266         membar          #StoreLoad | #StoreStore | #LoadStore   ! LSU   Group
267         fzero           %f0                             ! FPA   Group
268         mov             32, %o1                         ! IEU0
269         fzero           %f2                             ! FPA   Group
270         faddd           %f0, %f2, %f4                   ! FPA   Group
271         fmuld           %f0, %f2, %f6                   ! FPM
272         faddd           %f0, %f2, %f8                   ! FPA   Group
273         fmuld           %f0, %f2, %f10                  ! FPM
274
275         faddd           %f0, %f2, %f12                  ! FPA   Group
276         fmuld           %f0, %f2, %f14                  ! FPM
277 1:      stda            %f0, [%o0 + %g0] ASI_BLK_P      ! Store Group
278         add             %o0, 0x40, %o0                  ! IEU0
279         stda            %f0, [%o0 + %g0] ASI_BLK_P      ! Store Group
280         add             %o0, 0x40, %o0                  ! IEU0
281         stda            %f0, [%o0 + %g0] ASI_BLK_P      ! Store Group
282
283         add             %o0, 0x40, %o0                  ! IEU0  Group
284         stda            %f0, [%o0 + %g0] ASI_BLK_P      ! Store Group
285         subcc           %o1, 1, %o1                     ! IEU1
286         bne,pt          %icc, 1b                        ! CTI
287          add            %o0, 0x40, %o0                  ! IEU0  Group
288         membar          #Sync                           ! LSU   Group
289         VISExitHalf
290
291         brnz,pt         %o4, 1f
292          nop
293
294         retl
295          nop
296
297 1:      stxa            %g5, [%o2] ASI_DMMU
298         stxa            %g7, [%o3] ASI_DTLB_DATA_ACCESS
299         membar          #Sync
300         jmpl            %o7 + 0x8, %g0
301          wrpr           %g3, 0x0, %pstate