| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 1 | /* | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 2 | * Copyright (C) 2002 Paul Mackerras, IBM Corp. | 
|  | 3 | * | 
|  | 4 | * This program is free software; you can redistribute it and/or | 
|  | 5 | * modify it under the terms of the GNU General Public License | 
|  | 6 | * as published by the Free Software Foundation; either version | 
|  | 7 | * 2 of the License, or (at your option) any later version. | 
|  | 8 | */ | 
|  | 9 | #include <asm/processor.h> | 
|  | 10 | #include <asm/ppc_asm.h> | 
|  | 11 |  | 
|  | 12 | .align	7 | 
|  | 13 | _GLOBAL(__copy_tofrom_user) | 
|  | 14 | /* first check for a whole page copy on a page boundary */ | 
|  | 15 | cmpldi	cr1,r5,16 | 
|  | 16 | cmpdi	cr6,r5,4096 | 
|  | 17 | or	r0,r3,r4 | 
|  | 18 | neg	r6,r3		/* LS 3 bits = # bytes to 8-byte dest bdry */ | 
|  | 19 | andi.	r0,r0,4095 | 
|  | 20 | std	r3,-24(r1) | 
|  | 21 | crand	cr0*4+2,cr0*4+2,cr6*4+2 | 
|  | 22 | std	r4,-16(r1) | 
|  | 23 | std	r5,-8(r1) | 
|  | 24 | dcbt	0,r4 | 
| Benjamin Herrenschmidt | 3c726f8 | 2005-11-07 11:06:55 +1100 | [diff] [blame] | 25 | beq	.Lcopy_page_4K | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 26 | andi.	r6,r6,7 | 
| Olof Johansson | 3467bfd | 2007-03-22 09:34:13 -0500 | [diff] [blame] | 27 | PPC_MTOCRF	0x01,r5 | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 28 | blt	cr1,.Lshort_copy | 
| Mark Nelson | a4e22f0 | 2008-11-11 00:53:34 +0000 | [diff] [blame] | 29 | /* Below we want to nop out the bne if we're on a CPU that has the | 
|  | 30 | * CPU_FTR_UNALIGNED_LD_STD bit set and the CPU_FTR_CP_USE_DCBTZ bit | 
|  | 31 | * cleared. | 
|  | 32 | * At the time of writing the only CPU that has this combination of bits | 
|  | 33 | * set is Power6. | 
|  | 34 | */ | 
|  | 35 | BEGIN_FTR_SECTION | 
|  | 36 | nop | 
|  | 37 | FTR_SECTION_ELSE | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 38 | bne	.Ldst_unaligned | 
| Mark Nelson | a4e22f0 | 2008-11-11 00:53:34 +0000 | [diff] [blame] | 39 | ALT_FTR_SECTION_END(CPU_FTR_UNALIGNED_LD_STD | CPU_FTR_CP_USE_DCBTZ, \ | 
|  | 40 | CPU_FTR_UNALIGNED_LD_STD) | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 41 | .Ldst_aligned: | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 42 | addi	r3,r3,-16 | 
| Mark Nelson | a4e22f0 | 2008-11-11 00:53:34 +0000 | [diff] [blame] | 43 | BEGIN_FTR_SECTION | 
|  | 44 | andi.	r0,r4,7 | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 45 | bne	.Lsrc_unaligned | 
| Mark Nelson | a4e22f0 | 2008-11-11 00:53:34 +0000 | [diff] [blame] | 46 | END_FTR_SECTION_IFCLR(CPU_FTR_UNALIGNED_LD_STD) | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 47 | srdi	r7,r5,4 | 
|  | 48 | 20:	ld	r9,0(r4) | 
|  | 49 | addi	r4,r4,-8 | 
|  | 50 | mtctr	r7 | 
|  | 51 | andi.	r5,r5,7 | 
|  | 52 | bf	cr7*4+0,22f | 
|  | 53 | addi	r3,r3,8 | 
|  | 54 | addi	r4,r4,8 | 
|  | 55 | mr	r8,r9 | 
|  | 56 | blt	cr1,72f | 
|  | 57 | 21:	ld	r9,8(r4) | 
|  | 58 | 70:	std	r8,8(r3) | 
|  | 59 | 22:	ldu	r8,16(r4) | 
|  | 60 | 71:	stdu	r9,16(r3) | 
|  | 61 | bdnz	21b | 
|  | 62 | 72:	std	r8,8(r3) | 
|  | 63 | beq+	3f | 
|  | 64 | addi	r3,r3,16 | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 65 | .Ldo_tail: | 
|  | 66 | bf	cr7*4+1,1f | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 67 | 23:	lwz	r9,8(r4) | 
|  | 68 | addi	r4,r4,4 | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 69 | 73:	stw	r9,0(r3) | 
|  | 70 | addi	r3,r3,4 | 
|  | 71 | 1:	bf	cr7*4+2,2f | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 72 | 44:	lhz	r9,8(r4) | 
|  | 73 | addi	r4,r4,2 | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 74 | 74:	sth	r9,0(r3) | 
|  | 75 | addi	r3,r3,2 | 
|  | 76 | 2:	bf	cr7*4+3,3f | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 77 | 45:	lbz	r9,8(r4) | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 78 | 75:	stb	r9,0(r3) | 
|  | 79 | 3:	li	r3,0 | 
|  | 80 | blr | 
|  | 81 |  | 
|  | 82 | .Lsrc_unaligned: | 
|  | 83 | srdi	r6,r5,3 | 
|  | 84 | addi	r5,r5,-16 | 
|  | 85 | subf	r4,r0,r4 | 
|  | 86 | srdi	r7,r5,4 | 
|  | 87 | sldi	r10,r0,3 | 
|  | 88 | cmpldi	cr6,r6,3 | 
|  | 89 | andi.	r5,r5,7 | 
|  | 90 | mtctr	r7 | 
|  | 91 | subfic	r11,r10,64 | 
|  | 92 | add	r5,r5,r0 | 
|  | 93 | bt	cr7*4+0,28f | 
|  | 94 |  | 
|  | 95 | 24:	ld	r9,0(r4)	/* 3+2n loads, 2+2n stores */ | 
|  | 96 | 25:	ld	r0,8(r4) | 
|  | 97 | sld	r6,r9,r10 | 
|  | 98 | 26:	ldu	r9,16(r4) | 
|  | 99 | srd	r7,r0,r11 | 
|  | 100 | sld	r8,r0,r10 | 
|  | 101 | or	r7,r7,r6 | 
|  | 102 | blt	cr6,79f | 
|  | 103 | 27:	ld	r0,8(r4) | 
|  | 104 | b	2f | 
|  | 105 |  | 
|  | 106 | 28:	ld	r0,0(r4)	/* 4+2n loads, 3+2n stores */ | 
|  | 107 | 29:	ldu	r9,8(r4) | 
|  | 108 | sld	r8,r0,r10 | 
|  | 109 | addi	r3,r3,-8 | 
|  | 110 | blt	cr6,5f | 
|  | 111 | 30:	ld	r0,8(r4) | 
|  | 112 | srd	r12,r9,r11 | 
|  | 113 | sld	r6,r9,r10 | 
|  | 114 | 31:	ldu	r9,16(r4) | 
|  | 115 | or	r12,r8,r12 | 
|  | 116 | srd	r7,r0,r11 | 
|  | 117 | sld	r8,r0,r10 | 
|  | 118 | addi	r3,r3,16 | 
|  | 119 | beq	cr6,78f | 
|  | 120 |  | 
|  | 121 | 1:	or	r7,r7,r6 | 
|  | 122 | 32:	ld	r0,8(r4) | 
|  | 123 | 76:	std	r12,8(r3) | 
|  | 124 | 2:	srd	r12,r9,r11 | 
|  | 125 | sld	r6,r9,r10 | 
|  | 126 | 33:	ldu	r9,16(r4) | 
|  | 127 | or	r12,r8,r12 | 
|  | 128 | 77:	stdu	r7,16(r3) | 
|  | 129 | srd	r7,r0,r11 | 
|  | 130 | sld	r8,r0,r10 | 
|  | 131 | bdnz	1b | 
|  | 132 |  | 
|  | 133 | 78:	std	r12,8(r3) | 
|  | 134 | or	r7,r7,r6 | 
|  | 135 | 79:	std	r7,16(r3) | 
|  | 136 | 5:	srd	r12,r9,r11 | 
|  | 137 | or	r12,r8,r12 | 
|  | 138 | 80:	std	r12,24(r3) | 
|  | 139 | bne	6f | 
|  | 140 | li	r3,0 | 
|  | 141 | blr | 
|  | 142 | 6:	cmpwi	cr1,r5,8 | 
|  | 143 | addi	r3,r3,32 | 
|  | 144 | sld	r9,r9,r10 | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 145 | ble	cr1,7f | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 146 | 34:	ld	r0,8(r4) | 
|  | 147 | srd	r7,r0,r11 | 
|  | 148 | or	r9,r7,r9 | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 149 | 7: | 
|  | 150 | bf	cr7*4+1,1f | 
|  | 151 | rotldi	r9,r9,32 | 
|  | 152 | 94:	stw	r9,0(r3) | 
|  | 153 | addi	r3,r3,4 | 
|  | 154 | 1:	bf	cr7*4+2,2f | 
|  | 155 | rotldi	r9,r9,16 | 
|  | 156 | 95:	sth	r9,0(r3) | 
|  | 157 | addi	r3,r3,2 | 
|  | 158 | 2:	bf	cr7*4+3,3f | 
|  | 159 | rotldi	r9,r9,8 | 
|  | 160 | 96:	stb	r9,0(r3) | 
|  | 161 | 3:	li	r3,0 | 
|  | 162 | blr | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 163 |  | 
|  | 164 | .Ldst_unaligned: | 
| Olof Johansson | 3467bfd | 2007-03-22 09:34:13 -0500 | [diff] [blame] | 165 | PPC_MTOCRF	0x01,r6		/* put #bytes to 8B bdry into cr7 */ | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 166 | subf	r5,r6,r5 | 
|  | 167 | li	r7,0 | 
| Mark Nelson | a4e22f0 | 2008-11-11 00:53:34 +0000 | [diff] [blame] | 168 | cmpldi	cr1,r5,16 | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 169 | bf	cr7*4+3,1f | 
|  | 170 | 35:	lbz	r0,0(r4) | 
|  | 171 | 81:	stb	r0,0(r3) | 
|  | 172 | addi	r7,r7,1 | 
|  | 173 | 1:	bf	cr7*4+2,2f | 
|  | 174 | 36:	lhzx	r0,r7,r4 | 
|  | 175 | 82:	sthx	r0,r7,r3 | 
|  | 176 | addi	r7,r7,2 | 
|  | 177 | 2:	bf	cr7*4+1,3f | 
|  | 178 | 37:	lwzx	r0,r7,r4 | 
|  | 179 | 83:	stwx	r0,r7,r3 | 
| Olof Johansson | 3467bfd | 2007-03-22 09:34:13 -0500 | [diff] [blame] | 180 | 3:	PPC_MTOCRF	0x01,r5 | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 181 | add	r4,r6,r4 | 
|  | 182 | add	r3,r6,r3 | 
|  | 183 | b	.Ldst_aligned | 
|  | 184 |  | 
|  | 185 | .Lshort_copy: | 
|  | 186 | bf	cr7*4+0,1f | 
|  | 187 | 38:	lwz	r0,0(r4) | 
|  | 188 | 39:	lwz	r9,4(r4) | 
|  | 189 | addi	r4,r4,8 | 
|  | 190 | 84:	stw	r0,0(r3) | 
|  | 191 | 85:	stw	r9,4(r3) | 
|  | 192 | addi	r3,r3,8 | 
|  | 193 | 1:	bf	cr7*4+1,2f | 
|  | 194 | 40:	lwz	r0,0(r4) | 
|  | 195 | addi	r4,r4,4 | 
|  | 196 | 86:	stw	r0,0(r3) | 
|  | 197 | addi	r3,r3,4 | 
|  | 198 | 2:	bf	cr7*4+2,3f | 
|  | 199 | 41:	lhz	r0,0(r4) | 
|  | 200 | addi	r4,r4,2 | 
|  | 201 | 87:	sth	r0,0(r3) | 
|  | 202 | addi	r3,r3,2 | 
|  | 203 | 3:	bf	cr7*4+3,4f | 
|  | 204 | 42:	lbz	r0,0(r4) | 
|  | 205 | 88:	stb	r0,0(r3) | 
|  | 206 | 4:	li	r3,0 | 
|  | 207 | blr | 
|  | 208 |  | 
|  | 209 | /* | 
|  | 210 | * exception handlers follow | 
|  | 211 | * we have to return the number of bytes not copied | 
|  | 212 | * for an exception on a load, we set the rest of the destination to 0 | 
|  | 213 | */ | 
|  | 214 |  | 
|  | 215 | 136: | 
|  | 216 | 137: | 
|  | 217 | add	r3,r3,r7 | 
|  | 218 | b	1f | 
|  | 219 | 130: | 
|  | 220 | 131: | 
|  | 221 | addi	r3,r3,8 | 
|  | 222 | 120: | 
|  | 223 | 122: | 
|  | 224 | 124: | 
|  | 225 | 125: | 
|  | 226 | 126: | 
|  | 227 | 127: | 
|  | 228 | 128: | 
|  | 229 | 129: | 
|  | 230 | 133: | 
|  | 231 | addi	r3,r3,8 | 
|  | 232 | 121: | 
|  | 233 | 132: | 
|  | 234 | addi	r3,r3,8 | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 235 | 134: | 
|  | 236 | 135: | 
|  | 237 | 138: | 
|  | 238 | 139: | 
|  | 239 | 140: | 
|  | 240 | 141: | 
|  | 241 | 142: | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 242 | 123: | 
|  | 243 | 144: | 
|  | 244 | 145: | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 245 |  | 
|  | 246 | /* | 
|  | 247 | * here we have had a fault on a load and r3 points to the first | 
|  | 248 | * unmodified byte of the destination | 
|  | 249 | */ | 
|  | 250 | 1:	ld	r6,-24(r1) | 
|  | 251 | ld	r4,-16(r1) | 
|  | 252 | ld	r5,-8(r1) | 
|  | 253 | subf	r6,r6,r3 | 
|  | 254 | add	r4,r4,r6 | 
|  | 255 | subf	r5,r6,r5	/* #bytes left to go */ | 
|  | 256 |  | 
|  | 257 | /* | 
|  | 258 | * first see if we can copy any more bytes before hitting another exception | 
|  | 259 | */ | 
|  | 260 | mtctr	r5 | 
|  | 261 | 43:	lbz	r0,0(r4) | 
|  | 262 | addi	r4,r4,1 | 
|  | 263 | 89:	stb	r0,0(r3) | 
|  | 264 | addi	r3,r3,1 | 
|  | 265 | bdnz	43b | 
|  | 266 | li	r3,0		/* huh? all copied successfully this time? */ | 
|  | 267 | blr | 
|  | 268 |  | 
|  | 269 | /* | 
|  | 270 | * here we have trapped again, need to clear ctr bytes starting at r3 | 
|  | 271 | */ | 
|  | 272 | 143:	mfctr	r5 | 
|  | 273 | li	r0,0 | 
|  | 274 | mr	r4,r3 | 
|  | 275 | mr	r3,r5		/* return the number of bytes not copied */ | 
|  | 276 | 1:	andi.	r9,r4,7 | 
|  | 277 | beq	3f | 
|  | 278 | 90:	stb	r0,0(r4) | 
|  | 279 | addic.	r5,r5,-1 | 
|  | 280 | addi	r4,r4,1 | 
|  | 281 | bne	1b | 
|  | 282 | blr | 
|  | 283 | 3:	cmpldi	cr1,r5,8 | 
|  | 284 | srdi	r9,r5,3 | 
|  | 285 | andi.	r5,r5,7 | 
|  | 286 | blt	cr1,93f | 
|  | 287 | mtctr	r9 | 
|  | 288 | 91:	std	r0,0(r4) | 
|  | 289 | addi	r4,r4,8 | 
|  | 290 | bdnz	91b | 
|  | 291 | 93:	beqlr | 
|  | 292 | mtctr	r5 | 
|  | 293 | 92:	stb	r0,0(r4) | 
|  | 294 | addi	r4,r4,1 | 
|  | 295 | bdnz	92b | 
|  | 296 | blr | 
|  | 297 |  | 
|  | 298 | /* | 
|  | 299 | * exception handlers for stores: we just need to work | 
|  | 300 | * out how many bytes weren't copied | 
|  | 301 | */ | 
|  | 302 | 182: | 
|  | 303 | 183: | 
|  | 304 | add	r3,r3,r7 | 
|  | 305 | b	1f | 
|  | 306 | 180: | 
|  | 307 | addi	r3,r3,8 | 
|  | 308 | 171: | 
|  | 309 | 177: | 
|  | 310 | addi	r3,r3,8 | 
|  | 311 | 170: | 
|  | 312 | 172: | 
|  | 313 | 176: | 
|  | 314 | 178: | 
|  | 315 | addi	r3,r3,4 | 
|  | 316 | 185: | 
|  | 317 | addi	r3,r3,4 | 
|  | 318 | 173: | 
|  | 319 | 174: | 
|  | 320 | 175: | 
|  | 321 | 179: | 
|  | 322 | 181: | 
|  | 323 | 184: | 
|  | 324 | 186: | 
|  | 325 | 187: | 
|  | 326 | 188: | 
|  | 327 | 189: | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 328 | 194: | 
|  | 329 | 195: | 
|  | 330 | 196: | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 331 | 1: | 
|  | 332 | ld	r6,-24(r1) | 
|  | 333 | ld	r5,-8(r1) | 
|  | 334 | add	r6,r6,r5 | 
|  | 335 | subf	r3,r3,r6	/* #bytes not copied */ | 
|  | 336 | 190: | 
|  | 337 | 191: | 
|  | 338 | 192: | 
|  | 339 | blr			/* #bytes not copied in r3 */ | 
|  | 340 |  | 
|  | 341 | .section __ex_table,"a" | 
|  | 342 | .align	3 | 
|  | 343 | .llong	20b,120b | 
|  | 344 | .llong	21b,121b | 
|  | 345 | .llong	70b,170b | 
|  | 346 | .llong	22b,122b | 
|  | 347 | .llong	71b,171b | 
|  | 348 | .llong	72b,172b | 
|  | 349 | .llong	23b,123b | 
|  | 350 | .llong	73b,173b | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 351 | .llong	44b,144b | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 352 | .llong	74b,174b | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 353 | .llong	45b,145b | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 354 | .llong	75b,175b | 
|  | 355 | .llong	24b,124b | 
|  | 356 | .llong	25b,125b | 
|  | 357 | .llong	26b,126b | 
|  | 358 | .llong	27b,127b | 
|  | 359 | .llong	28b,128b | 
|  | 360 | .llong	29b,129b | 
|  | 361 | .llong	30b,130b | 
|  | 362 | .llong	31b,131b | 
|  | 363 | .llong	32b,132b | 
|  | 364 | .llong	76b,176b | 
|  | 365 | .llong	33b,133b | 
|  | 366 | .llong	77b,177b | 
|  | 367 | .llong	78b,178b | 
|  | 368 | .llong	79b,179b | 
|  | 369 | .llong	80b,180b | 
|  | 370 | .llong	34b,134b | 
| Mark Nelson | f72b728 | 2009-02-25 13:46:24 +0000 | [diff] [blame] | 371 | .llong	94b,194b | 
|  | 372 | .llong	95b,195b | 
|  | 373 | .llong	96b,196b | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 374 | .llong	35b,135b | 
|  | 375 | .llong	81b,181b | 
|  | 376 | .llong	36b,136b | 
|  | 377 | .llong	82b,182b | 
|  | 378 | .llong	37b,137b | 
|  | 379 | .llong	83b,183b | 
|  | 380 | .llong	38b,138b | 
|  | 381 | .llong	39b,139b | 
|  | 382 | .llong	84b,184b | 
|  | 383 | .llong	85b,185b | 
|  | 384 | .llong	40b,140b | 
|  | 385 | .llong	86b,186b | 
|  | 386 | .llong	41b,141b | 
|  | 387 | .llong	87b,187b | 
|  | 388 | .llong	42b,142b | 
|  | 389 | .llong	88b,188b | 
|  | 390 | .llong	43b,143b | 
|  | 391 | .llong	89b,189b | 
|  | 392 | .llong	90b,190b | 
|  | 393 | .llong	91b,191b | 
|  | 394 | .llong	92b,192b | 
|  | 395 |  | 
|  | 396 | .text | 
|  | 397 |  | 
|  | 398 | /* | 
|  | 399 | * Routine to copy a whole page of data, optimized for POWER4. | 
|  | 400 | * On POWER4 it is more than 50% faster than the simple loop | 
|  | 401 | * above (following the .Ldst_aligned label) but it runs slightly | 
|  | 402 | * slower on POWER3. | 
|  | 403 | */ | 
| Benjamin Herrenschmidt | 3c726f8 | 2005-11-07 11:06:55 +1100 | [diff] [blame] | 404 | .Lcopy_page_4K: | 
| Paul Mackerras | 14cf11a | 2005-09-26 16:04:21 +1000 | [diff] [blame] | 405 | std	r31,-32(1) | 
|  | 406 | std	r30,-40(1) | 
|  | 407 | std	r29,-48(1) | 
|  | 408 | std	r28,-56(1) | 
|  | 409 | std	r27,-64(1) | 
|  | 410 | std	r26,-72(1) | 
|  | 411 | std	r25,-80(1) | 
|  | 412 | std	r24,-88(1) | 
|  | 413 | std	r23,-96(1) | 
|  | 414 | std	r22,-104(1) | 
|  | 415 | std	r21,-112(1) | 
|  | 416 | std	r20,-120(1) | 
|  | 417 | li	r5,4096/32 - 1 | 
|  | 418 | addi	r3,r3,-8 | 
|  | 419 | li	r0,5 | 
|  | 420 | 0:	addi	r5,r5,-24 | 
|  | 421 | mtctr	r0 | 
|  | 422 | 20:	ld	r22,640(4) | 
|  | 423 | 21:	ld	r21,512(4) | 
|  | 424 | 22:	ld	r20,384(4) | 
|  | 425 | 23:	ld	r11,256(4) | 
|  | 426 | 24:	ld	r9,128(4) | 
|  | 427 | 25:	ld	r7,0(4) | 
|  | 428 | 26:	ld	r25,648(4) | 
|  | 429 | 27:	ld	r24,520(4) | 
|  | 430 | 28:	ld	r23,392(4) | 
|  | 431 | 29:	ld	r10,264(4) | 
|  | 432 | 30:	ld	r8,136(4) | 
|  | 433 | 31:	ldu	r6,8(4) | 
|  | 434 | cmpwi	r5,24 | 
|  | 435 | 1: | 
|  | 436 | 32:	std	r22,648(3) | 
|  | 437 | 33:	std	r21,520(3) | 
|  | 438 | 34:	std	r20,392(3) | 
|  | 439 | 35:	std	r11,264(3) | 
|  | 440 | 36:	std	r9,136(3) | 
|  | 441 | 37:	std	r7,8(3) | 
|  | 442 | 38:	ld	r28,648(4) | 
|  | 443 | 39:	ld	r27,520(4) | 
|  | 444 | 40:	ld	r26,392(4) | 
|  | 445 | 41:	ld	r31,264(4) | 
|  | 446 | 42:	ld	r30,136(4) | 
|  | 447 | 43:	ld	r29,8(4) | 
|  | 448 | 44:	std	r25,656(3) | 
|  | 449 | 45:	std	r24,528(3) | 
|  | 450 | 46:	std	r23,400(3) | 
|  | 451 | 47:	std	r10,272(3) | 
|  | 452 | 48:	std	r8,144(3) | 
|  | 453 | 49:	std	r6,16(3) | 
|  | 454 | 50:	ld	r22,656(4) | 
|  | 455 | 51:	ld	r21,528(4) | 
|  | 456 | 52:	ld	r20,400(4) | 
|  | 457 | 53:	ld	r11,272(4) | 
|  | 458 | 54:	ld	r9,144(4) | 
|  | 459 | 55:	ld	r7,16(4) | 
|  | 460 | 56:	std	r28,664(3) | 
|  | 461 | 57:	std	r27,536(3) | 
|  | 462 | 58:	std	r26,408(3) | 
|  | 463 | 59:	std	r31,280(3) | 
|  | 464 | 60:	std	r30,152(3) | 
|  | 465 | 61:	stdu	r29,24(3) | 
|  | 466 | 62:	ld	r25,664(4) | 
|  | 467 | 63:	ld	r24,536(4) | 
|  | 468 | 64:	ld	r23,408(4) | 
|  | 469 | 65:	ld	r10,280(4) | 
|  | 470 | 66:	ld	r8,152(4) | 
|  | 471 | 67:	ldu	r6,24(4) | 
|  | 472 | bdnz	1b | 
|  | 473 | 68:	std	r22,648(3) | 
|  | 474 | 69:	std	r21,520(3) | 
|  | 475 | 70:	std	r20,392(3) | 
|  | 476 | 71:	std	r11,264(3) | 
|  | 477 | 72:	std	r9,136(3) | 
|  | 478 | 73:	std	r7,8(3) | 
|  | 479 | 74:	addi	r4,r4,640 | 
|  | 480 | 75:	addi	r3,r3,648 | 
|  | 481 | bge	0b | 
|  | 482 | mtctr	r5 | 
|  | 483 | 76:	ld	r7,0(4) | 
|  | 484 | 77:	ld	r8,8(4) | 
|  | 485 | 78:	ldu	r9,16(4) | 
|  | 486 | 3: | 
|  | 487 | 79:	ld	r10,8(4) | 
|  | 488 | 80:	std	r7,8(3) | 
|  | 489 | 81:	ld	r7,16(4) | 
|  | 490 | 82:	std	r8,16(3) | 
|  | 491 | 83:	ld	r8,24(4) | 
|  | 492 | 84:	std	r9,24(3) | 
|  | 493 | 85:	ldu	r9,32(4) | 
|  | 494 | 86:	stdu	r10,32(3) | 
|  | 495 | bdnz	3b | 
|  | 496 | 4: | 
|  | 497 | 87:	ld	r10,8(4) | 
|  | 498 | 88:	std	r7,8(3) | 
|  | 499 | 89:	std	r8,16(3) | 
|  | 500 | 90:	std	r9,24(3) | 
|  | 501 | 91:	std	r10,32(3) | 
|  | 502 | 9:	ld	r20,-120(1) | 
|  | 503 | ld	r21,-112(1) | 
|  | 504 | ld	r22,-104(1) | 
|  | 505 | ld	r23,-96(1) | 
|  | 506 | ld	r24,-88(1) | 
|  | 507 | ld	r25,-80(1) | 
|  | 508 | ld	r26,-72(1) | 
|  | 509 | ld	r27,-64(1) | 
|  | 510 | ld	r28,-56(1) | 
|  | 511 | ld	r29,-48(1) | 
|  | 512 | ld	r30,-40(1) | 
|  | 513 | ld	r31,-32(1) | 
|  | 514 | li	r3,0 | 
|  | 515 | blr | 
|  | 516 |  | 
|  | 517 | /* | 
|  | 518 | * on an exception, reset to the beginning and jump back into the | 
|  | 519 | * standard __copy_tofrom_user | 
|  | 520 | */ | 
|  | 521 | 100:	ld	r20,-120(1) | 
|  | 522 | ld	r21,-112(1) | 
|  | 523 | ld	r22,-104(1) | 
|  | 524 | ld	r23,-96(1) | 
|  | 525 | ld	r24,-88(1) | 
|  | 526 | ld	r25,-80(1) | 
|  | 527 | ld	r26,-72(1) | 
|  | 528 | ld	r27,-64(1) | 
|  | 529 | ld	r28,-56(1) | 
|  | 530 | ld	r29,-48(1) | 
|  | 531 | ld	r30,-40(1) | 
|  | 532 | ld	r31,-32(1) | 
|  | 533 | ld	r3,-24(r1) | 
|  | 534 | ld	r4,-16(r1) | 
|  | 535 | li	r5,4096 | 
|  | 536 | b	.Ldst_aligned | 
|  | 537 |  | 
|  | 538 | .section __ex_table,"a" | 
|  | 539 | .align	3 | 
|  | 540 | .llong	20b,100b | 
|  | 541 | .llong	21b,100b | 
|  | 542 | .llong	22b,100b | 
|  | 543 | .llong	23b,100b | 
|  | 544 | .llong	24b,100b | 
|  | 545 | .llong	25b,100b | 
|  | 546 | .llong	26b,100b | 
|  | 547 | .llong	27b,100b | 
|  | 548 | .llong	28b,100b | 
|  | 549 | .llong	29b,100b | 
|  | 550 | .llong	30b,100b | 
|  | 551 | .llong	31b,100b | 
|  | 552 | .llong	32b,100b | 
|  | 553 | .llong	33b,100b | 
|  | 554 | .llong	34b,100b | 
|  | 555 | .llong	35b,100b | 
|  | 556 | .llong	36b,100b | 
|  | 557 | .llong	37b,100b | 
|  | 558 | .llong	38b,100b | 
|  | 559 | .llong	39b,100b | 
|  | 560 | .llong	40b,100b | 
|  | 561 | .llong	41b,100b | 
|  | 562 | .llong	42b,100b | 
|  | 563 | .llong	43b,100b | 
|  | 564 | .llong	44b,100b | 
|  | 565 | .llong	45b,100b | 
|  | 566 | .llong	46b,100b | 
|  | 567 | .llong	47b,100b | 
|  | 568 | .llong	48b,100b | 
|  | 569 | .llong	49b,100b | 
|  | 570 | .llong	50b,100b | 
|  | 571 | .llong	51b,100b | 
|  | 572 | .llong	52b,100b | 
|  | 573 | .llong	53b,100b | 
|  | 574 | .llong	54b,100b | 
|  | 575 | .llong	55b,100b | 
|  | 576 | .llong	56b,100b | 
|  | 577 | .llong	57b,100b | 
|  | 578 | .llong	58b,100b | 
|  | 579 | .llong	59b,100b | 
|  | 580 | .llong	60b,100b | 
|  | 581 | .llong	61b,100b | 
|  | 582 | .llong	62b,100b | 
|  | 583 | .llong	63b,100b | 
|  | 584 | .llong	64b,100b | 
|  | 585 | .llong	65b,100b | 
|  | 586 | .llong	66b,100b | 
|  | 587 | .llong	67b,100b | 
|  | 588 | .llong	68b,100b | 
|  | 589 | .llong	69b,100b | 
|  | 590 | .llong	70b,100b | 
|  | 591 | .llong	71b,100b | 
|  | 592 | .llong	72b,100b | 
|  | 593 | .llong	73b,100b | 
|  | 594 | .llong	74b,100b | 
|  | 595 | .llong	75b,100b | 
|  | 596 | .llong	76b,100b | 
|  | 597 | .llong	77b,100b | 
|  | 598 | .llong	78b,100b | 
|  | 599 | .llong	79b,100b | 
|  | 600 | .llong	80b,100b | 
|  | 601 | .llong	81b,100b | 
|  | 602 | .llong	82b,100b | 
|  | 603 | .llong	83b,100b | 
|  | 604 | .llong	84b,100b | 
|  | 605 | .llong	85b,100b | 
|  | 606 | .llong	86b,100b | 
|  | 607 | .llong	87b,100b | 
|  | 608 | .llong	88b,100b | 
|  | 609 | .llong	89b,100b | 
|  | 610 | .llong	90b,100b | 
|  | 611 | .llong	91b,100b |