File indexing completed on 2025-05-11 08:24:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 #ifdef HAVE_CONFIG_H
0052 #include "config.h"
0053 #endif
0054
0055 #include <rtems.h>
0056 #include <string.h>
0057
0058 #include <rtems/test.h>
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 static void Clear( volatile uint8_t *b, const volatile uint8_t *e )
0077 {
0078 while ( b != e ) {
0079 *b = 0;
0080 ++b;
0081 }
0082 }
0083
0084 static bool Compare(
0085 volatile uint8_t *b,
0086 const volatile uint8_t *e,
0087 uint8_t expected
0088 )
0089 {
0090 bool result;
0091
0092 result = true;
0093
0094 while ( b != e ) {
0095 result = result && *b == expected;
0096 ++b;
0097 }
0098
0099 return result;
0100 }
0101
0102
0103
0104
0105 static void CValC_Action_0( void )
0106 {
0107 uint8_t src[sizeof( long ) * 10];
0108 uint8_t dst[sizeof( long ) * 10];
0109 uint8_t *begin;
0110 uint8_t *end;
0111 uint8_t *aligned_src;
0112 uint8_t *aligned_dst;
0113 size_t offset_src;
0114
0115 memset( src, 0x85, sizeof( src ) );
0116 begin = dst;
0117 end = begin + sizeof( dst );
0118 aligned_src = (uint8_t *) RTEMS_ALIGN_UP( (uintptr_t) src, sizeof( long ) );
0119 aligned_dst = (uint8_t *) RTEMS_ALIGN_UP( (uintptr_t) dst, sizeof( long ) );
0120
0121 for ( offset_src = 0; offset_src < sizeof( long ); ++offset_src ) {
0122 size_t offset_dst;
0123
0124 for ( offset_dst = 0; offset_dst < sizeof( long ); ++offset_dst ) {
0125 size_t size;
0126
0127 for ( size = 0; size < sizeof( long ) * 8; ++size ) {
0128 uint8_t *s;
0129 uint8_t *p;
0130 uint8_t *q;
0131
0132 s = aligned_src + offset_src;
0133 p = aligned_dst + offset_dst;
0134 q = p + size;
0135
0136 Clear( begin, end );
0137 memcpy( p, s, size );
0138 T_true( Compare( begin, p, 0 ) );
0139 T_true( Compare( p, q, 0x85 ) );
0140 T_true( Compare( q, end, 0 ) );
0141 }
0142 }
0143 }
0144 }
0145
0146
0147
0148
0149 static void CValC_Action_1( void )
0150 {
0151 uint8_t dst[sizeof( long ) * 10];
0152 uint8_t *begin;
0153 uint8_t *end;
0154 uint8_t *aligned;
0155 size_t offset;
0156
0157 begin = dst;
0158 end = begin + sizeof( dst );
0159 aligned = (uint8_t *) RTEMS_ALIGN_UP( (uintptr_t) dst, sizeof( long ) );
0160
0161 for ( offset = 0; offset < sizeof( long ); ++offset ) {
0162 size_t size;
0163
0164 for ( size = 0; size < sizeof( long ) * 8; ++size ) {
0165 uint8_t *p;
0166 uint8_t *q;
0167
0168 p = aligned + offset;
0169 q = p + size;
0170
0171 Clear( begin, end );
0172 memset( p, 0x85, size );
0173 T_true( Compare( begin, p, 0 ) );
0174 T_true( Compare( p, q, 0x85 ) );
0175 T_true( Compare( q, end, 0 ) );
0176 }
0177 }
0178 }
0179
0180
0181
0182
0183 T_TEST_CASE( CValC )
0184 {
0185 CValC_Action_0();
0186 CValC_Action_1();
0187 }
0188
0189