1 /* $NetBSD: copy.S,v 1.25 2020/06/30 16:20:01 maxv Exp $ */ 2 3 /*- 4 * Copyright (c) 2002 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Matthew Fredette. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* $OpenBSD: locore.S,v 1.46 2001/09/20 18:33:03 mickey Exp $ */ 33 34 /* 35 * Copyright (c) 1998-2004 Michael Shalayeff 36 * All rights reserved. 37 * 38 * Redistribution and use in source and binary forms, with or without 39 * modification, are permitted provided that the following conditions 40 * are met: 41 * 1. Redistributions of source code must retain the above copyright 42 * notice, this list of conditions and the following disclaimer. 43 * 2. Redistributions in binary form must reproduce the above copyright 44 * notice, this list of conditions and the following disclaimer in the 45 * documentation and/or other materials provided with the distribution. 46 * 47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 48 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 50 * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 51 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 52 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 53 * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 55 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 56 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 57 * THE POSSIBILITY OF SUCH DAMAGE. 58 * 59 * Portitions of this file are derived from other sources, see 60 * the copyrights and acknowledgements below. 61 */ 62 /* 63 * Copyright (c) 1990,1991,1992,1994 The University of Utah and 64 * the Computer Systems Laboratory (CSL). All rights reserved. 65 * 66 * THE UNIVERSITY OF UTAH AND CSL PROVIDE THIS SOFTWARE IN ITS "AS IS" 67 * CONDITION, AND DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES 68 * WHATSOEVER RESULTING FROM ITS USE. 69 * 70 * CSL requests users of this software to return to csl-dist (at) cs.utah.edu any 71 * improvements that they make and grant CSL redistribution rights. 72 * 73 * Utah $Hdr: locore.s 1.62 94/12/15$ 74 */ 75 /* 76 * (c) Copyright 1988 HEWLETT-PACKARD COMPANY 77 * 78 * To anyone who acknowledges that this file is provided "AS IS" 79 * without any express or implied warranty: 80 * permission to use, copy, modify, and distribute this file 81 * for any purpose is hereby granted without fee, provided that 82 * the above copyright notice and this notice appears in all 83 * copies, and that the name of Hewlett-Packard Company not be 84 * used in advertising or publicity pertaining to distribution 85 * of the software without specific, written prior permission. 86 * Hewlett-Packard Company makes no representations about the 87 * suitability of this software for any purpose. 88 */ 89 90 /* 91 * This file contains the functions for user-space access: 92 * copyin/copyout, ufetch/ustore, etc. 93 */ 94 95 .align NBPG /* let's fit 'em on a single page */ 96 97 #define FUSUX(name) \ 98 LEAF_ENTRY_NOPROFILE(name) ! \ 99 ldil L%VM_MAXUSER_ADDRESS, %t1 ! \ 100 comb,>>= %arg0, %t1, ufetchstore_efault ! \ 101 GET_CURLWP(%t1) ! \ 102 ldw L_PCB(%t1), %t1 ! \ 103 ldil L%ufetchstore_fault, %t2 ! \ 104 ldo R%ufetchstore_fault(%t2), %t2 ! \ 105 ldw PCB_ONFAULT(%t1), %t3 ! \ 106 stw %t2, PCB_ONFAULT(%t1) ! \ 107 ldw PCB_SPACE(%t1), %t2 ! \ 108 mtsp %t2, %sr1 109 110 #define FUX(name,linsn,sinsn) \ 111 FUSUX(name) ! \ 112 linsn 0(%sr1, %arg0), %t2 ! \ 113 stw %r0, PCB_ONFAULT(%t1) ! \ 114 sinsn %t2, 0(%arg1) ! \ 115 bv %r0(%rp) ! \ 116 ldi 0, %ret0 ! \ 117 EXIT(name) 118 119 #define SUX(name,insn) \ 120 FUSUX(name) ! \ 121 insn %arg1, 0(%sr1, %arg0) ! \ 122 stw %r0, PCB_ONFAULT(%t1) ! \ 123 bv %r0(%rp) ! \ 124 ldi 0, %ret0 ! \ 125 EXIT(name) 126 127 LEAF_ENTRY_NOPROFILE(ufetchstore_fault) 128 bv 0(%rp) 129 stw %r0, PCB_ONFAULT(%t1) 130 EXIT(ufetchstore_fault) 131 132 LEAF_ENTRY_NOPROFILE(ufetchstore_efault) 133 bv 0(%rp) 134 ldi EFAULT, %ret0 135 EXIT(ufetchstore_efault) 136 137 FUX(_ufetch_8, ldb, stb) 138 FUX(_ufetch_16, ldh, sth) 139 FUX(_ufetch_32, ldw, stw) 140 141 SUX(_ustore_8, stb) 142 SUX(_ustore_16, sth) 143 SUX(_ustore_32, stw) 144 145 .align 64 146 147 /* 148 * int spstrcpy (pa_space_t ssp, const void *src, pa_space_t dsp, void *dst, 149 * size_t size, size_t *rsize) 150 * 151 * Do a space to space size bounded string copy and return actual copy size in 152 * rsize. If the copy ran out of space before '\0' is seen return ENAMETOOLONG 153 * 154 */ 155 LEAF_ENTRY(spstrcpy) 156 /* setup fault handler */ 157 GET_CURLWP(%r31) 158 ldw L_PCB(%r31), %r31 159 ldil L%L$spstrcpy_fault, %t2 160 ldo R%L$spstrcpy_fault(%t2), %t2 161 stw %t2, PCB_ONFAULT(%r31) 162 163 ldw HPPA_FRAME_ARG(4)(%sp), %t2 /* size */ 164 mtsp %arg0, %sr1 165 mtsp %arg2, %sr2 166 copy %arg1, %arg0 /* save src */ 167 168 L$spstrcpy_loop: 169 comb,=,n %r0, %t2, L$spstrcpy_exit 170 ldbs,ma 1(%sr1, %arg1), %t1 171 stbs,ma %t1, 1(%sr2, %arg3) 172 comb,<> %r0, %t1, L$spstrcpy_loop 173 ldo -1(%t2), %t2 174 175 L$spstrcpy_exit: 176 comiclr,= 0, %t1, %ret0 177 ldi ENAMETOOLONG,%ret0 178 179 L$spstrcpy_fault: 180 /* reset fault handler */ 181 stw %r0, PCB_ONFAULT(%r31) 182 sub %arg1, %arg0, %arg1 183 ldw HPPA_FRAME_ARG(5)(%sp), %arg0 /* rsize */ 184 comiclr,= 0, %arg0, %r0 185 stw %arg1, 0(%arg0) 186 bv,n 0(%rp) 187 EXIT(spstrcpy) 188 189 /* 190 * This macro expands into one function that calls spcopy 191 * or strspcpy. The function name is name, the copy function 192 * is copyfn, and the assembly to set up the space arguments 193 * is in spaceargs. 194 */ 195 #define _SPCOPY(name, fncall, spaceargs) \ 196 ENTRY(name, HPPA_FRAME_SIZE * 2) ! \ 197 ! \ 198 /* Start stack calling convention. */ ! \ 199 stw %rp, HPPA_FRAME_CRP(%sp) ! \ 200 copy %r3, %r1 ! \ 201 copy %sp, %r3 ! \ 202 stw,ma %r1, (HPPA_FRAME_SIZE * 2)(%sp) ! \ 203 ! \ 204 /* ! \ 205 * Set up all arguments for the copy ! \ 206 * function. spcopy only takes five ! \ 207 * arguments, but the sixth argument ! \ 208 * we set up is harmless. ! \ 209 */ ! \ 210 stw %arg3, HPPA_FRAME_ARG(5)(%sp) ! \ 211 stw %arg2, HPPA_FRAME_ARG(4)(%sp) ! \ 212 copy %arg1, %arg3 ! \ 213 copy %arg0, %arg1 ! \ 214 spaceargs ! \ 215 ! \ 216 /* Call the copy function. */ ! \ 217 fncall ! \ 218 ! \ 219 /* End stack calling convention. */ ! \ 220 ldw HPPA_FRAME_CRP(%r3), %rp ! \ 221 ldo HPPA_FRAME_SIZE(%r3), %sp ! \ 222 ldw,mb -HPPA_FRAME_SIZE(%sp), %r3 ! \ 223 bv,n %r0(%rp) ! \ 224 EXIT(name) 225 226 /* This loads curlwp's space into the given register. */ 227 #define SPACE_CURLWP(reg) \ 228 GET_CURLWP(reg) ! \ 229 ldw L_PCB(reg), reg ! \ 230 ldw PCB_SPACE(reg), reg 231 232 /* This loads the kernel's space into the given register. */ 233 #define SPACE_KERNEL(reg) \ 234 ldi HPPA_SID_KERNEL, reg 235 236 /* This calls the spcopy function. */ 237 #define CALL_SPCOPY \ 238 ldil L%spcopy, %r1 ! \ 239 ldo R%spcopy(%r1), %r1 ! \ 240 blr %r0, %rp ! \ 241 bv,n %r0(%r1) ! \ 242 nop 243 244 /* This calls the spstrcpy function. */ 245 #define CALL_SPSTRCPY \ 246 bl,n spstrcpy, %rp ! \ 247 nop 248 249 /* 250 * This function expands to one pair of copyin or copyout 251 * functions - one non-string copier and one string copier. 252 */ 253 #define SPCOPY(name, namestr, spaceargs) \ 254 _SPCOPY(name, CALL_SPCOPY, spaceargs) ! \ 255 _SPCOPY(namestr, CALL_SPSTRCPY, spaceargs) 256 257 /* 258 * int kcopy(const void *src, void *dst, size_t len); 259 */ 260 _SPCOPY(kcopy, CALL_SPCOPY, 261 SPACE_KERNEL(%arg0) ! SPACE_KERNEL(%arg2)) 262 263 /* 264 * int copyin(const void *src, void *dst, size_t size); 265 * int copyinstr(const void *src, void *dst, size_t size, size_t *lenp); 266 */ 267 SPCOPY(copyin, copyinstr, 268 SPACE_CURLWP(%arg0) ! SPACE_KERNEL(%arg2)) 269 270 /* 271 * int copyout(const void *src, void *dst, size_t size); 272 * int copyoutstr(const void *src, void *dst, size_t size, size_t *lenp); 273 */ 274 SPCOPY(copyout, copyoutstr, 275 SPACE_KERNEL(%arg0) ! SPACE_CURLWP(%arg2)) 276 277 /* 278 * For lack of a better place to put them, these functions 279 * write the kernel text. The kernel text is normally mapped 280 * read/execute, but since it is mapped directly, we can use 281 * absolute accesses on it. 282 */ 283 ENTRY(hppa_ktext_stw, HPPA_FRAME_SIZE) 284 285 /* Start stack calling convention. */ 286 stw %rp, HPPA_FRAME_CRP(%sp) 287 copy %r3, %r1 288 copy %sp, %r3 289 stw,ma %r1, HPPA_FRAME_SIZE(%sp) 290 291 /* Do the store. */ 292 stwas %arg1, 0(%arg0) 293 294 /* Call fcacheall(). */ 295 .import fcacheall, code 296 ldil L%fcacheall, %r1 297 ldo R%fcacheall(%r1), %r1 298 blr %r0, %rp 299 .call 300 bv,n %r0(%r1) 301 nop 302 303 /* Add some nops for good measure. */ 304 nop 305 nop 306 nop 307 nop 308 nop 309 nop 310 nop 311 nop 312 313 /* End stack calling convention. */ 314 ldw HPPA_FRAME_CRP(%r3), %rp 315 ldo HPPA_FRAME_SIZE(%r3), %sp 316 ldw,mb -HPPA_FRAME_SIZE(%sp), %r3 317 bv,n %r0(%rp) 318 EXIT(hppa_ktext_stw) 319 320 ENTRY(hppa_ktext_stb, HPPA_FRAME_SIZE) 321 322 /* 323 * Make the deposit location for the byte in the 324 * aligned word. 325 */ 326 ldi 7, %t2 327 extru %arg0, 31, 2, %t1 328 sh3add %t1, %t2, %t1 329 mtsar %t1 330 331 /* Load the aligned word and deposit the byte. */ 332 dep %r0, 31, 2, %arg0 333 ldwas 0(%arg0), %t2 334 vdep %arg1, 8, %t2 335 336 /* Jump to hppa_ktext_stw to finish. */ 337 b hppa_ktext_stw 338 copy %t2, %arg1 339 EXIT(hppa_ktext_stb) 340