^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #include <asm/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #define OPSIZ (BITS_PER_LONG/8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) typedef unsigned long op_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) void *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) memset (void *dstpp, int sc, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) unsigned int c = sc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) long int dstp = (long int) dstpp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) if (len >= 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) size_t xlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) op_t cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) cccc = (unsigned char) c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) cccc |= cccc << 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) cccc |= cccc << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) if (OPSIZ > 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /* Do the shift in two steps to avoid warning if long has 32 bits. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) cccc |= (cccc << 16) << 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* There are at least some bytes to set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) No need to test for LEN == 0 in this alignment loop. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) while (dstp % OPSIZ != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ((unsigned char *) dstp)[0] = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) dstp += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) len -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* Write 8 `op_t' per iteration until less than 8 `op_t' remain. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) xlen = len / (OPSIZ * 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) while (xlen > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) ((op_t *) dstp)[0] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ((op_t *) dstp)[1] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) ((op_t *) dstp)[2] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ((op_t *) dstp)[3] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ((op_t *) dstp)[4] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ((op_t *) dstp)[5] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ((op_t *) dstp)[6] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ((op_t *) dstp)[7] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) dstp += 8 * OPSIZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) xlen -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) len %= OPSIZ * 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* Write 1 `op_t' per iteration until less than OPSIZ bytes remain. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) xlen = len / OPSIZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) while (xlen > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ((op_t *) dstp)[0] = cccc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) dstp += OPSIZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) xlen -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) len %= OPSIZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* Write the last few bytes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) while (len > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ((unsigned char *) dstp)[0] = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) dstp += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) len -= 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) return dstpp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }