diff options
author | Michael Brown <mcb30@ipxe.org> | 2019-08-17 01:24:04 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2019-08-17 01:24:51 +0100 |
commit | 0cc12f053cf9be73ab7a577bb86e2909211f1c70 (patch) | |
tree | 804c1998baf19bbe76c1400af7debc77379d7f55 /src/crypto/bigint.c | |
parent | 131635eac0479b5b283f01107a8e07a61a610261 (diff) | |
download | ipxe-0cc12f053cf9be73ab7a577bb86e2909211f1c70.tar.gz |
[crypto] Profile the various stages of modular multiplication
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/crypto/bigint.c')
-rw-r--r-- | src/crypto/bigint.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/crypto/bigint.c b/src/crypto/bigint.c index 50f320302..ac9670ef6 100644 --- a/src/crypto/bigint.c +++ b/src/crypto/bigint.c @@ -26,6 +26,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include <stdint.h> #include <string.h> #include <assert.h> +#include <ipxe/profile.h> #include <ipxe/bigint.h> /** @file @@ -33,6 +34,22 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); * Big integer support */ +/** Modular multiplication overall profiler */ +static struct profiler bigint_mod_multiply_profiler __profiler = + { .name = "bigint_mod_multiply" }; + +/** Modular multiplication multiply step profiler */ +static struct profiler bigint_mod_multiply_multiply_profiler __profiler = + { .name = "bigint_mod_multiply.multiply" }; + +/** Modular multiplication rescale step profiler */ +static struct profiler bigint_mod_multiply_rescale_profiler __profiler = + { .name = "bigint_mod_multiply.rescale" }; + +/** Modular multiplication subtract step profiler */ +static struct profiler bigint_mod_multiply_subtract_profiler __profiler = + { .name = "bigint_mod_multiply.subtract" }; + /** * Perform modular multiplication of big integers * @@ -63,31 +80,43 @@ void bigint_mod_multiply_raw ( const bigint_element_t *multiplicand0, int rotation; int i; + /* Start profiling */ + profile_start ( &bigint_mod_multiply_profiler ); + /* Sanity check */ assert ( sizeof ( *temp ) == bigint_mod_multiply_tmp_len ( modulus ) ); /* Perform multiplication */ + profile_start ( &bigint_mod_multiply_multiply_profiler ); bigint_multiply ( multiplicand, multiplier, &temp->result ); + profile_stop ( &bigint_mod_multiply_multiply_profiler ); /* Rescale modulus to match result */ + profile_start ( &bigint_mod_multiply_rescale_profiler ); bigint_grow ( modulus, &temp->modulus ); rotation = ( bigint_max_set_bit ( &temp->result ) - bigint_max_set_bit ( &temp->modulus ) ); for ( i = 0 ; i < rotation ; i++ ) bigint_rol ( &temp->modulus ); + profile_stop ( &bigint_mod_multiply_rescale_profiler ); /* Subtract multiples of modulus */ + profile_start ( &bigint_mod_multiply_subtract_profiler ); for ( i = 0 ; i <= rotation ; i++ ) { if ( bigint_is_geq ( &temp->result, &temp->modulus ) ) bigint_subtract ( &temp->modulus, &temp->result ); bigint_ror ( &temp->modulus ); } + profile_stop ( &bigint_mod_multiply_subtract_profiler ); /* Resize result */ bigint_shrink ( &temp->result, result ); /* Sanity check */ assert ( bigint_is_geq ( modulus, result ) ); + + /* Stop profiling */ + profile_stop ( &bigint_mod_multiply_profiler ); } /** |