xref: /openbmc/linux/arch/parisc/lib/lusercopy.S (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1660662f8SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds *    User Space Access Routines
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds *    Copyright (C) 2000-2002 Hewlett-Packard (John Marvin)
61da177e4SLinus Torvalds *    Copyright (C) 2000 Richard Hirst <rhirst with parisc-linux.org>
71da177e4SLinus Torvalds *    Copyright (C) 2001 Matthieu Delahaye <delahaym at esiee.fr>
81da177e4SLinus Torvalds *    Copyright (C) 2003 Randolph Chung <tausq with parisc-linux.org>
9554bfeceSHelge Deller *    Copyright (C) 2017 Helge Deller <deller@gmx.de>
10554bfeceSHelge Deller *    Copyright (C) 2017 John David Anglin <dave.anglin@bell.net>
111da177e4SLinus Torvalds */
121da177e4SLinus Torvalds
131da177e4SLinus Torvalds/*
141da177e4SLinus Torvalds * These routines still have plenty of room for optimization
151da177e4SLinus Torvalds * (word & doubleword load/store, dual issue, store hints, etc.).
161da177e4SLinus Torvalds */
171da177e4SLinus Torvalds
181da177e4SLinus Torvalds/*
191da177e4SLinus Torvalds * The following routines assume that space register 3 (sr3) contains
201da177e4SLinus Torvalds * the space id associated with the current users address space.
211da177e4SLinus Torvalds */
221da177e4SLinus Torvalds
231da177e4SLinus Torvalds
24dfcf753bSKyle McMartin	.text
25dfcf753bSKyle McMartin
261da177e4SLinus Torvalds#include <asm/assembly.h>
271da177e4SLinus Torvalds#include <asm/errno.h>
280b3d643fSHelge Deller#include <linux/linkage.h>
291da177e4SLinus Torvalds
301da177e4SLinus Torvalds	/*
311da177e4SLinus Torvalds	 * unsigned long lclear_user(void *to, unsigned long n)
321da177e4SLinus Torvalds	 *
331da177e4SLinus Torvalds	 * Returns 0 for success.
341da177e4SLinus Torvalds	 * otherwise, returns number of bytes not transferred.
351da177e4SLinus Torvalds	 */
361da177e4SLinus Torvalds
37f39cce65SHelge DellerENTRY_CFI(lclear_user)
381da177e4SLinus Torvalds	comib,=,n   0,%r25,$lclu_done
391da177e4SLinus Torvalds$lclu_loop:
401da177e4SLinus Torvalds	addib,<>    -1,%r25,$lclu_loop
41*67102872SHelge Deller1:	stbs,ma     %r0,1(%sr3,%r26)
421da177e4SLinus Torvalds
431da177e4SLinus Torvalds$lclu_done:
441da177e4SLinus Torvalds	bv          %r0(%r2)
451da177e4SLinus Torvalds	copy        %r25,%r28
46741394caSHelge Deller
47741394caSHelge Deller2:	b           $lclu_done
48741394caSHelge Deller	ldo         1(%r25),%r25
49741394caSHelge Deller
50741394caSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,2b)
51f39cce65SHelge DellerENDPROC_CFI(lclear_user)
521da177e4SLinus Torvalds
531da177e4SLinus Torvalds
54554bfeceSHelge Deller/*
55554bfeceSHelge Deller * unsigned long pa_memcpy(void *dstp, const void *srcp, unsigned long len)
56554bfeceSHelge Deller *
57554bfeceSHelge Deller * Inputs:
58554bfeceSHelge Deller * - sr1 already contains space of source region
59554bfeceSHelge Deller * - sr2 already contains space of destination region
60554bfeceSHelge Deller *
61554bfeceSHelge Deller * Returns:
62554bfeceSHelge Deller * - number of bytes that could not be copied.
63554bfeceSHelge Deller *   On success, this will be zero.
64554bfeceSHelge Deller *
65554bfeceSHelge Deller * This code is based on a C-implementation of a copy routine written by
66554bfeceSHelge Deller * Randolph Chung, which in turn was derived from the glibc.
67554bfeceSHelge Deller *
68554bfeceSHelge Deller * Several strategies are tried to try to get the best performance for various
69554bfeceSHelge Deller * conditions. In the optimal case, we copy by loops that copy 32- or 16-bytes
70554bfeceSHelge Deller * at a time using general registers.  Unaligned copies are handled either by
71554bfeceSHelge Deller * aligning the destination and then using shift-and-write method, or in a few
72554bfeceSHelge Deller * cases by falling back to a byte-at-a-time copy.
73554bfeceSHelge Deller *
74554bfeceSHelge Deller * Testing with various alignments and buffer sizes shows that this code is
75554bfeceSHelge Deller * often >10x faster than a simple byte-at-a-time copy, even for strangely
76554bfeceSHelge Deller * aligned operands. It is interesting to note that the glibc version of memcpy
77554bfeceSHelge Deller * (written in C) is actually quite fast already. This routine is able to beat
78554bfeceSHelge Deller * it by 30-40% for aligned copies because of the loop unrolling, but in some
79554bfeceSHelge Deller * cases the glibc version is still slightly faster. This lends more
80554bfeceSHelge Deller * credibility that gcc can generate very good code as long as we are careful.
81554bfeceSHelge Deller *
82554bfeceSHelge Deller * Possible optimizations:
83554bfeceSHelge Deller * - add cache prefetching
84554bfeceSHelge Deller * - try not to use the post-increment address modifiers; they may create
85554bfeceSHelge Deller *   additional interlocks. Assumption is that those were only efficient on old
86554bfeceSHelge Deller *   machines (pre PA8000 processors)
87554bfeceSHelge Deller */
88554bfeceSHelge Deller
89554bfeceSHelge Deller	dst = arg0
90554bfeceSHelge Deller	src = arg1
91554bfeceSHelge Deller	len = arg2
92554bfeceSHelge Deller	end = arg3
93554bfeceSHelge Deller	t1  = r19
94554bfeceSHelge Deller	t2  = r20
95554bfeceSHelge Deller	t3  = r21
96554bfeceSHelge Deller	t4  = r22
97554bfeceSHelge Deller	srcspc = sr1
98554bfeceSHelge Deller	dstspc = sr2
99554bfeceSHelge Deller
100554bfeceSHelge Deller	t0 = r1
101554bfeceSHelge Deller	a1 = t1
102554bfeceSHelge Deller	a2 = t2
103554bfeceSHelge Deller	a3 = t3
104554bfeceSHelge Deller	a0 = t4
105554bfeceSHelge Deller
106554bfeceSHelge Deller	save_src = ret0
107554bfeceSHelge Deller	save_dst = ret1
108554bfeceSHelge Deller	save_len = r31
109554bfeceSHelge Deller
110554bfeceSHelge DellerENTRY_CFI(pa_memcpy)
111554bfeceSHelge Deller	/* Last destination address */
112554bfeceSHelge Deller	add	dst,len,end
113554bfeceSHelge Deller
114554bfeceSHelge Deller	/* short copy with less than 16 bytes? */
115409c1b25SMikulas Patocka	cmpib,COND(>>=),n 15,len,.Lbyte_loop
116554bfeceSHelge Deller
117554bfeceSHelge Deller	/* same alignment? */
118554bfeceSHelge Deller	xor	src,dst,t0
119554bfeceSHelge Deller	extru	t0,31,2,t1
120554bfeceSHelge Deller	cmpib,<>,n  0,t1,.Lunaligned_copy
121554bfeceSHelge Deller
122554bfeceSHelge Deller#ifdef CONFIG_64BIT
123554bfeceSHelge Deller	/* only do 64-bit copies if we can get aligned. */
124554bfeceSHelge Deller	extru	t0,31,3,t1
125554bfeceSHelge Deller	cmpib,<>,n  0,t1,.Lalign_loop32
126554bfeceSHelge Deller
127554bfeceSHelge Deller	/* loop until we are 64-bit aligned */
128554bfeceSHelge Deller.Lalign_loop64:
129554bfeceSHelge Deller	extru	dst,31,3,t1
130409c1b25SMikulas Patocka	cmpib,=,n	0,t1,.Lcopy_loop_16_start
131554bfeceSHelge Deller20:	ldb,ma	1(srcspc,src),t1
132554bfeceSHelge Deller21:	stb,ma	t1,1(dstspc,dst)
133554bfeceSHelge Deller	b	.Lalign_loop64
134554bfeceSHelge Deller	ldo	-1(len),len
135554bfeceSHelge Deller
136554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(20b,.Lcopy_done)
137554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
138554bfeceSHelge Deller
139409c1b25SMikulas Patocka.Lcopy_loop_16_start:
140554bfeceSHelge Deller	ldi	31,t0
141554bfeceSHelge Deller.Lcopy_loop_16:
142554bfeceSHelge Deller	cmpb,COND(>>=),n t0,len,.Lword_loop
143554bfeceSHelge Deller
144554bfeceSHelge Deller10:	ldd	0(srcspc,src),t1
145554bfeceSHelge Deller11:	ldd	8(srcspc,src),t2
146554bfeceSHelge Deller	ldo	16(src),src
147554bfeceSHelge Deller12:	std,ma	t1,8(dstspc,dst)
148554bfeceSHelge Deller13:	std,ma	t2,8(dstspc,dst)
149554bfeceSHelge Deller14:	ldd	0(srcspc,src),t1
150554bfeceSHelge Deller15:	ldd	8(srcspc,src),t2
151554bfeceSHelge Deller	ldo	16(src),src
152554bfeceSHelge Deller16:	std,ma	t1,8(dstspc,dst)
153554bfeceSHelge Deller17:	std,ma	t2,8(dstspc,dst)
154554bfeceSHelge Deller
155554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(10b,.Lcopy_done)
156554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(11b,.Lcopy16_fault)
157554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(12b,.Lcopy_done)
158554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(13b,.Lcopy_done)
159554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(14b,.Lcopy_done)
160554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(15b,.Lcopy16_fault)
161554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(16b,.Lcopy_done)
162554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(17b,.Lcopy_done)
163554bfeceSHelge Deller
164554bfeceSHelge Deller	b	.Lcopy_loop_16
165554bfeceSHelge Deller	ldo	-32(len),len
166554bfeceSHelge Deller
167554bfeceSHelge Deller.Lword_loop:
168554bfeceSHelge Deller	cmpib,COND(>>=),n 3,len,.Lbyte_loop
169554bfeceSHelge Deller20:	ldw,ma	4(srcspc,src),t1
170554bfeceSHelge Deller21:	stw,ma	t1,4(dstspc,dst)
171554bfeceSHelge Deller	b	.Lword_loop
172554bfeceSHelge Deller	ldo	-4(len),len
173554bfeceSHelge Deller
174554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(20b,.Lcopy_done)
175554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
176554bfeceSHelge Deller
177554bfeceSHelge Deller#endif /* CONFIG_64BIT */
178554bfeceSHelge Deller
179554bfeceSHelge Deller	/* loop until we are 32-bit aligned */
180554bfeceSHelge Deller.Lalign_loop32:
181554bfeceSHelge Deller	extru	dst,31,2,t1
182409c1b25SMikulas Patocka	cmpib,=,n	0,t1,.Lcopy_loop_8
183554bfeceSHelge Deller20:	ldb,ma	1(srcspc,src),t1
184554bfeceSHelge Deller21:	stb,ma	t1,1(dstspc,dst)
185554bfeceSHelge Deller	b	.Lalign_loop32
186554bfeceSHelge Deller	ldo	-1(len),len
187554bfeceSHelge Deller
188554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(20b,.Lcopy_done)
189554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
190554bfeceSHelge Deller
191554bfeceSHelge Deller
192409c1b25SMikulas Patocka.Lcopy_loop_8:
193554bfeceSHelge Deller	cmpib,COND(>>=),n 15,len,.Lbyte_loop
194554bfeceSHelge Deller
195554bfeceSHelge Deller10:	ldw	0(srcspc,src),t1
196554bfeceSHelge Deller11:	ldw	4(srcspc,src),t2
197554bfeceSHelge Deller12:	stw,ma	t1,4(dstspc,dst)
198554bfeceSHelge Deller13:	stw,ma	t2,4(dstspc,dst)
199554bfeceSHelge Deller14:	ldw	8(srcspc,src),t1
200554bfeceSHelge Deller15:	ldw	12(srcspc,src),t2
201554bfeceSHelge Deller	ldo	16(src),src
202554bfeceSHelge Deller16:	stw,ma	t1,4(dstspc,dst)
203554bfeceSHelge Deller17:	stw,ma	t2,4(dstspc,dst)
204554bfeceSHelge Deller
205554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(10b,.Lcopy_done)
206554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(11b,.Lcopy8_fault)
207554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(12b,.Lcopy_done)
208554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(13b,.Lcopy_done)
209554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(14b,.Lcopy_done)
210554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(15b,.Lcopy8_fault)
211554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(16b,.Lcopy_done)
212554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(17b,.Lcopy_done)
213554bfeceSHelge Deller
214409c1b25SMikulas Patocka	b	.Lcopy_loop_8
215554bfeceSHelge Deller	ldo	-16(len),len
216554bfeceSHelge Deller
217554bfeceSHelge Deller.Lbyte_loop:
218554bfeceSHelge Deller	cmpclr,COND(<>) len,%r0,%r0
219554bfeceSHelge Deller	b,n	.Lcopy_done
220554bfeceSHelge Deller20:	ldb	0(srcspc,src),t1
221554bfeceSHelge Deller	ldo	1(src),src
222554bfeceSHelge Deller21:	stb,ma	t1,1(dstspc,dst)
223554bfeceSHelge Deller	b	.Lbyte_loop
224554bfeceSHelge Deller	ldo	-1(len),len
225554bfeceSHelge Deller
226554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(20b,.Lcopy_done)
227554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
228554bfeceSHelge Deller
229554bfeceSHelge Deller.Lcopy_done:
230554bfeceSHelge Deller	bv	%r0(%r2)
231554bfeceSHelge Deller	sub	end,dst,ret0
232554bfeceSHelge Deller
233554bfeceSHelge Deller
234554bfeceSHelge Deller	/* src and dst are not aligned the same way. */
235554bfeceSHelge Deller	/* need to go the hard way */
236554bfeceSHelge Deller.Lunaligned_copy:
237554bfeceSHelge Deller	/* align until dst is 32bit-word-aligned */
238554bfeceSHelge Deller	extru	dst,31,2,t1
239409c1b25SMikulas Patocka	cmpib,=,n	0,t1,.Lcopy_dstaligned
240554bfeceSHelge Deller20:	ldb	0(srcspc,src),t1
241554bfeceSHelge Deller	ldo	1(src),src
242554bfeceSHelge Deller21:	stb,ma	t1,1(dstspc,dst)
243554bfeceSHelge Deller	b	.Lunaligned_copy
244554bfeceSHelge Deller	ldo	-1(len),len
245554bfeceSHelge Deller
246554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(20b,.Lcopy_done)
247554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(21b,.Lcopy_done)
248554bfeceSHelge Deller
249554bfeceSHelge Deller.Lcopy_dstaligned:
250554bfeceSHelge Deller
251554bfeceSHelge Deller	/* store src, dst and len in safe place */
252554bfeceSHelge Deller	copy	src,save_src
253554bfeceSHelge Deller	copy	dst,save_dst
254554bfeceSHelge Deller	copy	len,save_len
255554bfeceSHelge Deller
256554bfeceSHelge Deller	/* len now needs give number of words to copy */
257554bfeceSHelge Deller	SHRREG	len,2,len
258554bfeceSHelge Deller
259554bfeceSHelge Deller	/*
260554bfeceSHelge Deller	 * Copy from a not-aligned src to an aligned dst using shifts.
261554bfeceSHelge Deller	 * Handles 4 words per loop.
262554bfeceSHelge Deller	 */
263554bfeceSHelge Deller
264554bfeceSHelge Deller	depw,z src,28,2,t0
265554bfeceSHelge Deller	subi 32,t0,t0
266554bfeceSHelge Deller	mtsar t0
267554bfeceSHelge Deller	extru len,31,2,t0
268554bfeceSHelge Deller	cmpib,= 2,t0,.Lcase2
269554bfeceSHelge Deller	/* Make src aligned by rounding it down.  */
270554bfeceSHelge Deller	depi 0,31,2,src
271554bfeceSHelge Deller
272554bfeceSHelge Deller	cmpiclr,<> 3,t0,%r0
273554bfeceSHelge Deller	b,n .Lcase3
274554bfeceSHelge Deller	cmpiclr,<> 1,t0,%r0
275554bfeceSHelge Deller	b,n .Lcase1
276554bfeceSHelge Deller.Lcase0:
277409c1b25SMikulas Patocka	cmpb,COND(=) %r0,len,.Lcda_finish
278554bfeceSHelge Deller	nop
279554bfeceSHelge Deller
280554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a3
281554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
282554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a0
283554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
284554bfeceSHelge Deller	b,n .Ldo3
285554bfeceSHelge Deller.Lcase1:
286554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a2
287554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
288554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a3
289554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
290554bfeceSHelge Deller	ldo -1(len),len
291409c1b25SMikulas Patocka	cmpb,COND(=),n %r0,len,.Ldo0
292554bfeceSHelge Deller.Ldo4:
293554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a0
294554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
295554bfeceSHelge Deller	shrpw a2, a3, %sar, t0
296554bfeceSHelge Deller1:	stw,ma t0, 4(dstspc,dst)
297554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcopy_done)
298554bfeceSHelge Deller.Ldo3:
299554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a1
300554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
301554bfeceSHelge Deller	shrpw a3, a0, %sar, t0
302554bfeceSHelge Deller1:	stw,ma t0, 4(dstspc,dst)
303554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcopy_done)
304554bfeceSHelge Deller.Ldo2:
305554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a2
306554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
307554bfeceSHelge Deller	shrpw a0, a1, %sar, t0
308554bfeceSHelge Deller1:	stw,ma t0, 4(dstspc,dst)
309554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcopy_done)
310554bfeceSHelge Deller.Ldo1:
311554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a3
312554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
313554bfeceSHelge Deller	shrpw a1, a2, %sar, t0
314554bfeceSHelge Deller1:	stw,ma t0, 4(dstspc,dst)
315554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcopy_done)
316554bfeceSHelge Deller	ldo -4(len),len
317409c1b25SMikulas Patocka	cmpb,COND(<>) %r0,len,.Ldo4
318554bfeceSHelge Deller	nop
319554bfeceSHelge Deller.Ldo0:
320554bfeceSHelge Deller	shrpw a2, a3, %sar, t0
321554bfeceSHelge Deller1:	stw,ma t0, 4(dstspc,dst)
322554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcopy_done)
323554bfeceSHelge Deller
324554bfeceSHelge Deller.Lcda_rdfault:
325554bfeceSHelge Deller.Lcda_finish:
326554bfeceSHelge Deller	/* calculate new src, dst and len and jump to byte-copy loop */
327554bfeceSHelge Deller	sub	dst,save_dst,t0
328554bfeceSHelge Deller	add	save_src,t0,src
329554bfeceSHelge Deller	b	.Lbyte_loop
330554bfeceSHelge Deller	sub	save_len,t0,len
331554bfeceSHelge Deller
332554bfeceSHelge Deller.Lcase3:
333554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a0
334554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
335554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a1
336554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
337554bfeceSHelge Deller	b .Ldo2
338554bfeceSHelge Deller	ldo 1(len),len
339554bfeceSHelge Deller.Lcase2:
340554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a1
341554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
342554bfeceSHelge Deller1:	ldw,ma 4(srcspc,src), a2
343554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(1b,.Lcda_rdfault)
344554bfeceSHelge Deller	b .Ldo1
345554bfeceSHelge Deller	ldo 2(len),len
346554bfeceSHelge Deller
347554bfeceSHelge Deller
348554bfeceSHelge Deller	/* fault exception fixup handlers: */
349554bfeceSHelge Deller#ifdef CONFIG_64BIT
350554bfeceSHelge Deller.Lcopy16_fault:
351409c1b25SMikulas Patocka	b	.Lcopy_done
352409c1b25SMikulas Patocka10:	std,ma	t1,8(dstspc,dst)
353554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(10b,.Lcopy_done)
354554bfeceSHelge Deller#endif
355554bfeceSHelge Deller
356554bfeceSHelge Deller.Lcopy8_fault:
357409c1b25SMikulas Patocka	b	.Lcopy_done
358409c1b25SMikulas Patocka10:	stw,ma	t1,4(dstspc,dst)
359554bfeceSHelge Deller	ASM_EXCEPTIONTABLE_ENTRY(10b,.Lcopy_done)
360554bfeceSHelge DellerENDPROC_CFI(pa_memcpy)
361554bfeceSHelge Deller
3621da177e4SLinus Torvalds	.end
363