summaryrefslogtreecommitdiffstats
path: root/qemu/roms/ipxe/src/tests/memset_test.c
blob: d96f83fa60e39059d94b13259c90cacedef82a60 (plain)
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 * Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 *
 * You can also choose to distribute this program under the terms of
 * the Unmodified Binary Distribution Licence (as given in the file
 * COPYING.UBDL), provided that you have satisfied its requirements.
 */

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );

/** @file
 *
 * memset() self-tests
 *
 */

/* Forcibly enable assertions */
#undef NDEBUG

#include <string.h>
#include <ipxe/test.h>

/* Provide global functions to allow inspection of generated code */

void memset_zero_0 ( void *dest ) { memset ( dest, 0, 0 ); }
void memset_zero_1 ( void *dest ) { memset ( dest, 0, 1 ); }
void memset_zero_2 ( void *dest ) { memset ( dest, 0, 2 ); }
void memset_zero_3 ( void *dest ) { memset ( dest, 0, 3 ); }
void memset_zero_4 ( void *dest ) { memset ( dest, 0, 4 ); }
void memset_zero_5 ( void *dest ) { memset ( dest, 0, 5 ); }
void memset_zero_6 ( void *dest ) { memset ( dest, 0, 6 ); }
void memset_zero_7 ( void *dest ) { memset ( dest, 0, 7 ); }
void memset_zero_8 ( void *dest ) { memset ( dest, 0, 8 ); }
void memset_zero_9 ( void *dest ) { memset ( dest, 0, 9 ); }
void memset_zero_10 ( void *dest ) { memset ( dest, 0, 10 ); }
void memset_zero_11 ( void *dest ) { memset ( dest, 0, 11 ); }
void memset_zero_12 ( void *dest ) { memset ( dest, 0, 12 ); }
void memset_zero_13 ( void *dest ) { memset ( dest, 0, 13 ); }
void memset_zero_14 ( void *dest ) { memset ( dest, 0, 14 ); }
void memset_zero_15 ( void *dest ) { memset ( dest, 0, 15 ); }
void memset_zero_16 ( void *dest ) { memset ( dest, 0, 16 ); }
void memset_zero_17 ( void *dest ) { memset ( dest, 0, 17 ); }
void memset_zero_18 ( void *dest ) { memset ( dest, 0, 18 ); }
void memset_zero_19 ( void *dest ) { memset ( dest, 0, 19 ); }
void memset_zero_20 ( void *dest ) { memset ( dest, 0, 20 ); }
void memset_zero_21 ( void *dest ) { memset ( dest, 0, 21 ); }
void memset_zero_22 ( void *dest ) { memset ( dest, 0, 22 ); }
void memset_zero_23 ( void *dest ) { memset ( dest, 0, 23 ); }
void memset_zero_24 ( void *dest ) { memset ( dest, 0, 24 ); }
void memset_zero_25 ( void *dest ) { memset ( dest, 0, 25 ); }
void memset_zero_26 ( void *dest ) { memset ( dest, 0, 26 ); }
void memset_zero_27 ( void *dest ) { memset ( dest, 0, 27 ); }
void memset_zero_28 ( void *dest ) { memset ( dest, 0, 28 ); }
void memset_zero_29 ( void *dest ) { memset ( dest, 0, 29 ); }
void memset_zero_30 ( void *dest ) { memset ( dest, 0, 30 ); }
void memset_zero_31 ( void *dest ) { memset ( dest, 0, 31 ); }

/**
 * Force a call to the variable-length implementation of memset()
 *
 * @v dest		Destination address
 * @v fill		Fill pattern
 * @v len		Length of data
 * @ret dest		Destination address
 */
__attribute__ (( noinline )) void * memset_var ( void *dest, unsigned int fill,
						 size_t len ) {
	return memset ( dest, fill, len );
}

/**
 * Perform a constant-length memset() test
 *
 * @v len		Length of data
 */
#define MEMSET_TEST_CONSTANT( len ) do {				\
		uint8_t dest_const[ 1 + len + 1 ];			\
		uint8_t dest_var[ 1 + len + 1 ];			\
		static uint8_t zero[len];				\
		unsigned int i;						\
									\
		for ( i = 0 ; i < sizeof ( dest_const ) ; i++ )		\
			dest_const[i] = 0xaa;				\
		memset ( ( dest_const + 1 ), 0, len );			\
		ok ( dest_const[0] == 0xaa );				\
		ok ( dest_const[ sizeof ( dest_const ) - 1 ] == 0xaa );	\
		ok ( memcmp ( ( dest_const + 1 ), zero, len ) == 0 );	\
									\
		for ( i = 0 ; i < sizeof ( dest_var ) ; i++ )		\
			dest_var[i] = 0xbb;				\
		memset_var ( ( dest_var + 1 ), 0, len );		\
		ok ( dest_var[0] == 0xbb );				\
		ok ( dest_var[ sizeof ( dest_var ) - 1 ] == 0xbb );	\
		ok ( memcmp ( ( dest_var + 1 ), zero, len ) == 0 );	\
	} while ( 0 )

/**
 * Perform memset() self-tests
 *
 */
static void memset_test_exec ( void ) {

	/* Constant-length tests */
	MEMSET_TEST_CONSTANT ( 0 );
	MEMSET_TEST_CONSTANT ( 1 );
	MEMSET_TEST_CONSTANT ( 2 );
	MEMSET_TEST_CONSTANT ( 3 );
	MEMSET_TEST_CONSTANT ( 4 );
	MEMSET_TEST_CONSTANT ( 5 );
	MEMSET_TEST_CONSTANT ( 6 );
	MEMSET_TEST_CONSTANT ( 7 );
	MEMSET_TEST_CONSTANT ( 8 );
	MEMSET_TEST_CONSTANT ( 9 );
	MEMSET_TEST_CONSTANT ( 10 );
	MEMSET_TEST_CONSTANT ( 11 );
	MEMSET_TEST_CONSTANT ( 12 );
	MEMSET_TEST_CONSTANT ( 13 );
	MEMSET_TEST_CONSTANT ( 14 );
	MEMSET_TEST_CONSTANT ( 15 );
	MEMSET_TEST_CONSTANT ( 16 );
	MEMSET_TEST_CONSTANT ( 17 );
	MEMSET_TEST_CONSTANT ( 18 );
	MEMSET_TEST_CONSTANT ( 19 );
	MEMSET_TEST_CONSTANT ( 20 );
	MEMSET_TEST_CONSTANT ( 21 );
	MEMSET_TEST_CONSTANT ( 22 );
	MEMSET_TEST_CONSTANT ( 23 );
	MEMSET_TEST_CONSTANT ( 24 );
	MEMSET_TEST_CONSTANT ( 25 );
	MEMSET_TEST_CONSTANT ( 26 );
	MEMSET_TEST_CONSTANT ( 27 );
	MEMSET_TEST_CONSTANT ( 28 );
	MEMSET_TEST_CONSTANT ( 29 );
	MEMSET_TEST_CONSTANT ( 30 );
	MEMSET_TEST_CONSTANT ( 31 );
}

/** memset() self-test */
struct self_test memset_test __self_test = {
	.name = "memset",
	.exec = memset_test_exec,
};