^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * License. See the file COPYING in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) unsigned long __generic_copy_from_user(void *to, const void __user *from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) unsigned long n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) unsigned long tmp, res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) asm volatile ("\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) " tst.l %0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) " jeq 2f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) "1: "MOVES".l (%1)+,%3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) " move.l %3,(%2)+\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) " subq.l #1,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) " jne 1b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) "2: btst #1,%5\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) " jeq 4f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) "3: "MOVES".w (%1)+,%3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) " move.w %3,(%2)+\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) "4: btst #0,%5\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) " jeq 6f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) "5: "MOVES".b (%1)+,%3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) " move.b %3,(%2)+\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) "6:\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) " .section .fixup,\"ax\"\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) " .even\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) "10: lsl.l #2,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) " btst #1,%5\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) " jeq 8f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) "30: addq.l #2,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) "8: btst #0,%5\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) " jeq 6b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) "50: addq.l #1,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) " jra 6b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) " .previous\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) " .section __ex_table,\"a\"\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) " .align 4\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) " .long 1b,10b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) " .long 3b,30b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) " .long 5b,50b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) " .previous"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) : "0" (n / 4), "d" (n & 3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) EXPORT_SYMBOL(__generic_copy_from_user);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) unsigned long __generic_copy_to_user(void __user *to, const void *from,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) unsigned long n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) unsigned long tmp, res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) asm volatile ("\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) " tst.l %0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) " jeq 4f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) "1: move.l (%1)+,%3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) "2: "MOVES".l %3,(%2)+\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) "3: subq.l #1,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) " jne 1b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) "4: btst #1,%5\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) " jeq 6f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) " move.w (%1)+,%3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) "5: "MOVES".w %3,(%2)+\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) "6: btst #0,%5\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) " jeq 8f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) " move.b (%1)+,%3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) "7: "MOVES".b %3,(%2)+\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) "8:\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) " .section .fixup,\"ax\"\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) " .even\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) "20: lsl.l #2,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) "50: add.l %5,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) " jra 8b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) " .previous\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) " .section __ex_table,\"a\"\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) " .align 4\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) " .long 2b,20b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) " .long 3b,20b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) " .long 5b,50b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) " .long 6b,50b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) " .long 7b,50b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) " .long 8b,50b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) " .previous"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) : "=d" (res), "+a" (from), "+a" (to), "=&d" (tmp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) : "0" (n / 4), "d" (n & 3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) EXPORT_SYMBOL(__generic_copy_to_user);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * Zero Userspace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) unsigned long __clear_user(void __user *to, unsigned long n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) unsigned long res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) asm volatile ("\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) " tst.l %0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) " jeq 3f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) "1: "MOVES".l %2,(%1)+\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) "2: subq.l #1,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) " jne 1b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) "3: btst #1,%4\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) " jeq 5f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) "4: "MOVES".w %2,(%1)+\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) "5: btst #0,%4\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) " jeq 7f\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) "6: "MOVES".b %2,(%1)\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) "7:\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) " .section .fixup,\"ax\"\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) " .even\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) "10: lsl.l #2,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) "40: add.l %4,%0\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) " jra 7b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) " .previous\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) "\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) " .section __ex_table,\"a\"\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) " .align 4\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) " .long 1b,10b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) " .long 2b,10b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) " .long 4b,40b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) " .long 5b,40b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) " .long 6b,40b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) " .long 7b,40b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) " .previous"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) : "=d" (res), "+a" (to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) : "d" (0), "0" (n / 4), "d" (n & 3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) EXPORT_SYMBOL(__clear_user);