source: trunk/kernel/libk/memcpy.c @ 662

Last change on this file since 662 was 487, checked in by viala@…, 6 years ago

[libk/memcpt.c] Add .h in .c.

Fix needed for C99 or C11 where not static function must have a defined prototype.
libk/memcpy.c:28:8: warning: no previous declaration for 'memcpy' [-Wmissing-declarations]

void * memcpy( void * dst,

~

libk/memcpy.c: In function 'memcpy':
libk/memcpy.c:46:27: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]

unsigned char *csrc = (unsigned char*)wsrc;


libk/memcpy.c: At top level:
libk/memcpy.c:57:8: warning: no previous declaration for 'memset' [-Wmissing-declarations]

void * memset( void * dst,

~

libk/memcpy.c:89:5: warning: no previous declaration for 'memcmp' [-Wmissing-declarations]

int memcmp( const void * s1,

~

File size: 2.5 KB
Line 
1/*
2 * memcpy.c - architecture independent memory copy functions
3 *
4 * Author ALain Greiner (2016)
5 *
6 * Copyright (c) UPMC Sorbonne Universites
7 *
8 * This file is part of ALMOS-MKH.
9 *
10 * ALMOS-MKH is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; version 2.0 of the License.
13 *
14 * ALMOS-MKH is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24#include <hal_kernel_types.h>
25#include <printk.h>
26#include <memcpy.h>
27
28/////////////////////////////////
29void * memcpy( void       * dst,
30               const void * src,
31               uint32_t     size)
32{
33    uint32_t       * wdst = dst;
34    const uint32_t * wsrc = src;
35
36    // word per word copy if both addresses aligned
37    if (!((uint32_t) wdst & 3) && !((uint32_t) wsrc & 3) )
38    {
39        while (size > 3)
40        {
41            *wdst++ = *wsrc++;
42            size -= 4;
43        }
44    }
45
46    unsigned char *cdst = (unsigned char*)wdst;
47    unsigned char *csrc = (unsigned char*)wsrc;
48
49    // byte per byte for last bytes (or not aligned)
50    while (size--)
51    {
52        *cdst++ = *csrc++;
53    }
54    return dst;
55}
56
57//////////////////////////////
58void * memset( void     * dst,
59               uint32_t   val,
60               uint32_t   size)
61{
62    // build 8 bits and 32 bits values
63    uint8_t    byte = (uint8_t)(val & 0xFF);
64    uint32_t   word = (val<<24) | (val<<16) | (val<<8) | val;
65
66    // word per word if address aligned
67    uint32_t * wdst = (uint32_t *)dst;
68
69    if( (((uint32_t)dst) & 0x3) == 0 )
70    {
71        while( size > 3 )
72        {
73            *wdst++ = word;
74            size -= 4;
75        }
76    }
77
78    // byte per byte for last bytes (or not aligned)
79    char * cdst = (char *)wdst;
80
81    while( size-- )
82    {
83        *cdst++ = byte;
84    }
85
86    return dst;
87}
88
89//////////////////////////////
90int memcmp( const void * s1,
91            const void * s2,
92            uint32_t     n)
93{
94    const uint8_t * cs1 = s1;
95    const uint8_t * cs2 = s2;
96
97    while (n > 0)
98    {
99        if (*cs1++ != *cs2++)
100            return (*--cs1 - *--cs2);
101        n--;
102    }
103    return 0;
104}
105
Note: See TracBrowser for help on using the repository browser.