@@ -49,6 +49,9 @@ void *T_memccpy(void *__restrict dest, const void *__restrict src, int c, size_t
4949void * T_mempcpy (void * __restrict dest , const void * __restrict src , size_t n )
5050 __attribute__((nonnull (1 , 2 )));
5151
52+ void * T_memchr (const void * s , int c , size_t n )
53+ __attribute__((nonnull (1 )));
54+
5255void * T_memrchr (const void * s , int c , size_t n )
5356 __attribute__((nonnull (1 )));
5457
@@ -92,6 +95,7 @@ void T_bzero(void* s, size_t n);
9295#define T_memcmp memcmp
9396#define T_memccpy memccpy
9497#define T_mempcpy mempcpy
98+ #define T_memchr memchr
9599#define T_memrchr memrchr
96100#define T_memmem memmem
97101#define T_memrmem memrmem
@@ -994,6 +998,54 @@ int strchrnul_test(void) {
994998 return 0 ;
995999}
9961000
1001+ int mem65536_test (void ) {
1002+ void fill_mem32 (void * dst , size_t bytes , uint32_t pattern );
1003+
1004+ uint8_t * const dst = (uint8_t * )0xD40000 ;
1005+ const size_t screen_size = 320 * 240 * 2 ;
1006+ memset (dst , 0 , screen_size );
1007+ const size_t B16 = 65536 ;
1008+ const size_t B17 = 131072 ;
1009+
1010+ /* test return values */
1011+
1012+ C (T_memcpy (SINK , SINK , B16 ) == SINK );
1013+ C (T_memcpy (SINK , SINK , B17 ) == SINK );
1014+
1015+ C (T_memmove (SINK , SINK , B16 ) == SINK );
1016+ C (T_memmove (SINK , SINK , B17 ) == SINK );
1017+
1018+ C (T_memmove (SINK + 16 , SINK , B16 ) == SINK + 16 );
1019+ C (T_memmove (SINK + 16 , SINK , B17 ) == SINK + 16 );
1020+
1021+ C (T_memmove (SINK , SINK + 16 , B16 ) == SINK );
1022+ C (T_memmove (SINK , SINK + 16 , B17 ) == SINK );
1023+
1024+ /* test memcpy and memmove when size is a non-zero multiple of 65536 */
1025+
1026+ fill_mem32 (dst + screen_size - B16 , B16 , 0x78563412 );
1027+ C (T_memcpy (dst + 32 , dst + screen_size - B16 , B16 ) == dst + 32 );
1028+ C (T_memchr (dst , 0x00 , 32 ) == dst );
1029+ C (T_memchr (dst , 0x12 , 32 ) == NULL_ptr );
1030+ C (T_memchr (dst , 0x12 , 33 ) == dst + 32 );
1031+ C (T_memrchr (dst , 0x78 , 32 + B16 + 32 ) == dst + 32 + B16 - 1 );
1032+ const uint32_t pattern_1 = 0xA3A0A1A0 ;
1033+ const uint32_t pattern_2 = 0xFECDAB89 ;
1034+ fill_mem32 (dst , 32 , pattern_1 );
1035+ fill_mem32 (dst + 24576 , B16 , pattern_2 );
1036+
1037+ C (T_memmove (dst + 61 , dst , B16 ) == dst + 61 );
1038+ C (T_memmem (dst , B17 , & pattern_1 , sizeof (pattern_1 )) == dst );
1039+ C (T_memrmem (dst , B17 , & pattern_1 , sizeof (pattern_1 )) == dst + 61 - 4 + 32 );
1040+ C (T_memmove (dst + 24578 , dst , B16 ) == dst + 24578 );
1041+ C (T_memmem (dst , B16 , & pattern_1 , sizeof (pattern_1 )) == dst + 0 );
1042+ C (T_memrmem (dst , B16 , & pattern_1 , sizeof (pattern_1 )) == dst + 24578 + 61 + 32 - 4 );
1043+ C (T_memmem (dst , B16 , & pattern_2 , sizeof (pattern_2 )) == dst + 24576 + 24578 + 61 );
1044+ C (T_memrmem (dst , B16 , & pattern_2 , sizeof (pattern_2 )) == dst + B16 - 4u - (((24578u - 24576u ) - 61u ) % 4u ));
1045+
1046+ return 0 ;
1047+ }
1048+
9971049int run_tests (void ) {
9981050 int ret = 0 ;
9991051 /* boot_asprintf */
@@ -1027,6 +1079,9 @@ int run_tests(void) {
10271079 TEST (strrstr_test ());
10281080 TEST (strchrnul_test ());
10291081
1082+ TEST (mem65536_test ());
1083+ os_ClrHome ();
1084+
10301085 return 0 ;
10311086}
10321087
0 commit comments