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