aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/assert.h21
-rw-r--r--src/include/ipxe/asn1.h7
-rw-r--r--src/include/ipxe/entropy.h42
-rw-r--r--src/include/ipxe/gcm.h11
4 files changed, 36 insertions, 45 deletions
diff --git a/src/include/assert.h b/src/include/assert.h
index 6d05318..b3a9b1f 100644
--- a/src/include/assert.h
+++ b/src/include/assert.h
@@ -65,19 +65,22 @@ assert_printf ( const char *fmt, ... ) asm ( "printf" );
#define static_assert(x) _Static_assert( x, #x )
/**
- * Assert a condition at link-time.
+ * Assert a condition at build time (after dead code elimination)
*
- * If the condition is not true, the link will fail with an unresolved
- * symbol (error_symbol).
+ * If the compiler cannot prove that the condition is true, the build
+ * will fail with an error message.
*
* This macro is iPXE-specific. Do not use this macro in code
* intended to be portable.
- *
*/
-#define linker_assert( condition, error_symbol ) \
- if ( ! (condition) ) { \
- extern void error_symbol ( void ); \
- error_symbol(); \
- }
+#define build_assert( condition ) \
+ do { \
+ if ( ! (condition) ) { \
+ extern void __attribute__ (( error ( \
+ "build_assert(" #condition ") failed" \
+ ) )) _C2 ( build_assert_, __LINE__ ) ( void ); \
+ _C2 ( build_assert_, __LINE__ ) (); \
+ } \
+ } while ( 0 )
#endif /* _ASSERT_H */
diff --git a/src/include/ipxe/asn1.h b/src/include/ipxe/asn1.h
index 77429f3..452fcef 100644
--- a/src/include/ipxe/asn1.h
+++ b/src/include/ipxe/asn1.h
@@ -390,10 +390,9 @@ asn1_built ( struct asn1_builder *builder ) {
} *u = container_of ( builder, typeof ( *u ), builder );
/* Sanity check */
- linker_assert ( ( ( const void * ) &u->builder.data ) ==
- &u->cursor.data, asn1_builder_cursor_data_mismatch );
- linker_assert ( &u->builder.len == &u->cursor.len,
- asn1_builder_cursor_len_mismatch );
+ build_assert ( ( ( const void * ) &u->builder.data ) ==
+ &u->cursor.data );
+ build_assert ( &u->builder.len == &u->cursor.len );
return &u->cursor;
}
diff --git a/src/include/ipxe/entropy.h b/src/include/ipxe/entropy.h
index 240feac..82bb118 100644
--- a/src/include/ipxe/entropy.h
+++ b/src/include/ipxe/entropy.h
@@ -237,8 +237,7 @@ get_entropy_input ( unsigned int min_entropy_bits, void *data, size_t min_len,
int rc;
/* Sanity check */
- linker_assert ( ( min_entropy_bits <= ( 8 * max_len ) ),
- entropy_buffer_too_small );
+ build_assert ( min_entropy_bits <= ( 8 * max_len ) );
/* Round up minimum entropy to an integral number of bytes */
min_entropy_bits = ( ( min_entropy_bits + 7 ) & ~7 );
@@ -247,11 +246,11 @@ get_entropy_input ( unsigned int min_entropy_bits, void *data, size_t min_len,
* meet or exceed the security strength indicated by the
* min_entropy parameter.
*/
- linker_assert ( ( ( 8 * ENTROPY_HASH_DF_OUTLEN_BYTES ) >=
- min_entropy_bits ), hash_df_algorithm_too_weak );
+ build_assert ( ( 8 * ENTROPY_HASH_DF_OUTLEN_BYTES ) >=
+ min_entropy_bits );
/* 1. If ( min_length > max_length ), then return ( FAILURE, Null ) */
- linker_assert ( ( min_len <= max_len ), min_len_greater_than_max_len );
+ build_assert ( min_len <= max_len );
/* 2. n = 2 * min_entropy */
n = ( 2 * min_entropy_bits );
@@ -269,9 +268,8 @@ get_entropy_input ( unsigned int min_entropy_bits, void *data, size_t min_len,
* (The implementation of these steps is inside the function
* get_entropy_input_tmp().)
*/
- linker_assert ( __builtin_constant_p ( tmp_len ),
- tmp_len_not_constant );
- linker_assert ( ( n == ( 8 * tmp_len ) ), tmp_len_mismatch );
+ build_assert ( __builtin_constant_p ( tmp_len ) );
+ build_assert ( n == ( 8 * tmp_len ) );
if ( ( rc = get_entropy_input_tmp ( MIN_ENTROPY ( min_entropy_bits ),
tmp, tmp_len ) ) != 0 ) {
return rc;
@@ -283,17 +281,17 @@ get_entropy_input ( unsigned int min_entropy_bits, void *data, size_t min_len,
*/
if ( tmp_len < min_len ) {
/* (Data is already in-place.) */
- linker_assert ( ( data == tmp ), data_not_inplace );
+ build_assert ( data == tmp );
memset ( ( data + tmp_len ), 0, ( min_len - tmp_len ) );
return min_len;
} else if ( tmp_len > max_len ) {
- linker_assert ( ( tmp == tmp_buf ), data_inplace );
+ build_assert ( tmp == tmp_buf );
hash_df ( &entropy_hash_df_algorithm, tmp, tmp_len,
data, max_len );
return max_len;
} else {
/* (Data is already in-place.) */
- linker_assert ( ( data == tmp ), data_not_inplace );
+ build_assert ( data == tmp );
return tmp_len;
}
}
@@ -328,15 +326,14 @@ entropy_repetition_count_cutoff ( min_entropy_t min_entropy_per_sample ) {
cutoff = max_repetitions;
if ( cutoff < max_repetitions )
cutoff++;
- linker_assert ( ( cutoff >= max_repetitions ), rounding_error );
+ build_assert ( cutoff >= max_repetitions );
/* Floating-point operations are not allowed in iPXE since we
* never set up a suitable environment. Abort the build
* unless the calculated number of repetitions is a
* compile-time constant.
*/
- linker_assert ( __builtin_constant_p ( cutoff ),
- repetition_count_cutoff_not_constant );
+ build_assert ( __builtin_constant_p ( cutoff ) );
return cutoff;
}
@@ -443,12 +440,10 @@ entropy_adaptive_proportion_cutoff ( min_entropy_t min_entropy_per_sample ) {
cutoff = entropy_adaptive_proportion_cutoff_lookup ( n, h );
/* Fail unless cutoff value is a compile-time constant */
- linker_assert ( __builtin_constant_p ( cutoff ),
- adaptive_proportion_cutoff_not_constant );
+ build_assert ( __builtin_constant_p ( cutoff ) );
/* Fail if cutoff value is N/A */
- linker_assert ( ( cutoff != APC_NA ),
- adaptive_proportion_cutoff_not_applicable );
+ build_assert ( cutoff != APC_NA );
return cutoff;
}
@@ -475,8 +470,7 @@ entropy_startup_test_count ( unsigned int repetition_count_cutoff,
num_samples = repetition_count_cutoff;
if ( num_samples < adaptive_proportion_cutoff )
num_samples = adaptive_proportion_cutoff;
- linker_assert ( __builtin_constant_p ( num_samples ),
- startup_test_count_not_constant );
+ build_assert ( __builtin_constant_p ( num_samples ) );
return num_samples;
}
@@ -499,11 +493,9 @@ entropy_init ( struct entropy_source *source,
unsigned int startup_test_count;
/* Sanity check */
- linker_assert ( min_entropy_per_sample > MIN_ENTROPY ( 0 ),
- min_entropy_per_sample_is_zero );
- linker_assert ( ( min_entropy_per_sample <=
- MIN_ENTROPY ( 8 * sizeof ( noise_sample_t ) ) ),
- min_entropy_per_sample_is_impossibly_high );
+ build_assert ( min_entropy_per_sample > MIN_ENTROPY ( 0 ) );
+ build_assert ( min_entropy_per_sample <=
+ MIN_ENTROPY ( 8 * sizeof ( noise_sample_t ) ) );
/* Calculate test cutoff values */
repetition_count_cutoff =
diff --git a/src/include/ipxe/gcm.h b/src/include/ipxe/gcm.h
index 90ef0b5..9653a0a 100644
--- a/src/include/ipxe/gcm.h
+++ b/src/include/ipxe/gcm.h
@@ -88,13 +88,10 @@ struct _gcm_name ## _context { \
static int _gcm_name ## _setkey ( void *ctx, const void *key, \
size_t keylen ) { \
struct _gcm_name ## _context *context = ctx; \
- linker_assert ( _blocksize == sizeof ( context->gcm.key ), \
- _gcm_name ## _unsupported_blocksize ); \
- linker_assert ( ( ( void * ) &context->gcm ) == ctx, \
- _gcm_name ## _context_layout_error ); \
- linker_assert ( ( ( void * ) &context->raw ) == \
- ( ( void * ) context->gcm.raw_ctx ), \
- _gcm_name ## _context_layout_error ); \
+ build_assert ( _blocksize == sizeof ( context->gcm.key ) ); \
+ build_assert ( ( ( void * ) &context->gcm ) == ctx ); \
+ build_assert ( ( ( void * ) &context->raw ) == \
+ ( ( void * ) context->gcm.raw_ctx ) ); \
return gcm_setkey ( &context->gcm, key, keylen, &_raw_cipher ); \
} \
static void _gcm_name ## _setiv ( void *ctx, const void *iv, \