hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
 * Copyright (C) 2008-2009 Michal Simek <monstr@monstr.eu>
 * Copyright (C) 2008-2009 PetaLogix
 * Copyright (C) 2007 John Williams
 *
 * Reasonably optimised generic C-code for memset on Microblaze
 * This is generic C code to do efficient, alignment-aware memcpy.
 *
 * It is based on demo code originally Copyright 2001 by Intel Corp, taken from
 * http://www.embedded.com/showArticle.jhtml?articleID=19205567
 *
 * Attempts were made, unsuccessfully, to contact the original
 * author of this code (Michael Morrow, Intel).  Below is the original
 * copyright notice.
 *
 * This software has been developed by Intel Corporation.
 * Intel specifically disclaims all warranties, express or
 * implied, and all liability, including consequential and
 * other indirect damages, for the use of this program, including
 * liability for infringement of any proprietary rights,
 * and including the warranties of merchantability and fitness
 * for a particular purpose. Intel does not assume any
 * responsibility for and errors which may appear in this program
 * not any responsibility to update it.
 */
 
#include <linux/export.h>
#include <linux/types.h>
#include <linux/stddef.h>
#include <linux/compiler.h>
#include <linux/string.h>
 
#ifdef __HAVE_ARCH_MEMSET
#ifndef CONFIG_OPT_LIB_FUNCTION
void *memset(void *v_src, int c, __kernel_size_t n)
{
   char *src = v_src;
 
   /* Truncate c to 8 bits */
   c = (c & 0xFF);
 
   /* Simple, byte oriented memset or the rest of count. */
   while (n--)
       *src++ = c;
 
   return v_src;
}
#else /* CONFIG_OPT_LIB_FUNCTION */
void *memset(void *v_src, int c, __kernel_size_t n)
{
   char *src = v_src;
   uint32_t *i_src;
   uint32_t w32 = 0;
 
   /* Truncate c to 8 bits */
   c = (c & 0xFF);
 
   if (unlikely(c)) {
       /* Make a repeating word out of it */
       w32 = c;
       w32 |= w32 << 8;
       w32 |= w32 << 16;
   }
 
   if (likely(n >= 4)) {
       /* Align the destination to a word boundary */
       /* This is done in an endian independent manner */
       switch ((unsigned) src & 3) {
       case 1:
           *src++ = c;
           --n;
       case 2:
           *src++ = c;
           --n;
       case 3:
           *src++ = c;
           --n;
       }
 
       i_src  = (void *)src;
 
       /* Do as many full-word copies as we can */
       for (; n >= 4; n -= 4)
           *i_src++ = w32;
 
       src  = (void *)i_src;
   }
 
   /* Simple, byte oriented memset or the rest of count. */
   while (n--)
       *src++ = c;
 
   return v_src;
}
#endif /* CONFIG_OPT_LIB_FUNCTION */
EXPORT_SYMBOL(memset);
#endif /* __HAVE_ARCH_MEMSET */