xtest/perfs: fix option for random initialization of input buffers

Before this change, AES and SHA performance tests always filled
input buffers with random values, wherever option "-r" was set or
not.

This change allows the run SHA performance test with zero-initialized
input buffers or random-initialized input buffers.

This change allows the run AES performance test with zero-initialized
input buffers, random-initialized input buffers or with uninitialized
input buffers (which is quite handy when testing with input buffers
into SDP secure memory).
A new option is added in "xtest --aes-perf": argument "--not-inited"
specifies that input buffer does not need to be initialized.

Since the initialization of crypto test buffers can use several
configuration, this change clarifies then, renaming the macro
CRYPTO_NOT_RANDOM into CRYPTO_USE_ZEROS.

Signed-off-by: Etienne Carriere <etienne.carriere@linaro.org>
Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
diff --git a/host/xtest/aes_perf.c b/host/xtest/aes_perf.c
index 59e6eaa..bbf4903 100644
--- a/host/xtest/aes_perf.c
+++ b/host/xtest/aes_perf.c
@@ -207,7 +207,7 @@
 {
 	fprintf(stderr, "Usage: %s [-h]\n", progname);
 	fprintf(stderr, "Usage: %s [-d] [-i] [-k SIZE]", progname);
-	fprintf(stderr, " [-l LOOP] [-m MODE] [-n LOOP] [-r] [-s SIZE]");
+	fprintf(stderr, " [-l LOOP] [-m MODE] [-n LOOP] [-r|--no-inited] [-s SIZE]");
 	fprintf(stderr, " [-v [-v]] [-w SEC]");
 #ifdef CFG_SECURE_DATA_PATH
 	fprintf(stderr, " [--sdp [-Id|-Ir|-IR] [-Od|-Or|-OR] [--ion-heap ID]]");
@@ -223,7 +223,8 @@
 	fprintf(stderr, "  -l LOOP       Inner loop iterations (TA calls TEE_CipherUpdate() <x> times) [%u]\n", l);
 	fprintf(stderr, "  -m MODE       AES mode: ECB, CBC, CTR, XTS [%s]\n", mode_str(mode));
 	fprintf(stderr, "  -n LOOP       Outer test loop iterations [%u]\n", n);
-	fprintf(stderr, "  -r|--random   Get input data from /dev/urandom (default: all-zeros)\n");
+	fprintf(stderr, "  --not-inited  Do not initialize input buffer content.\n");
+	fprintf(stderr, "  -r|--random   Get input data from /dev/urandom (default: all zeros)\n");
 	fprintf(stderr, "  -s SIZE       Test buffer size in bytes [%zu]\n", size);
 	fprintf(stderr, "  -v            Be verbose (use twice for greater effect)\n");
 	fprintf(stderr, "  -w|--warmup SEC  Warm-up time in seconds: execute a busy loop before\n");
@@ -405,17 +406,25 @@
 	return (1000000000/usec)*((double)size/(1024*1024));
 }
 
-
-static void run_feed_input(void *in, size_t size, int random_in)
+static void feed_input(void *in, size_t size, int random)
 {
-	if (!random_in)
-		return;
-
-	if (!is_sdp_test)
+	if (random)
 		read_random(in, size);
+	else
+		memset(in, 0, size);
+}
+
+static void run_feed_input(void *in, size_t size, int random)
+{
+	if (!is_sdp_test) {
+		feed_input(in, size, random);
+		return;
+	}
 
 #ifdef CFG_SECURE_DATA_PATH
-	if (input_buffer != BUFFER_SHM_ALLOCATED) {
+	if (input_buffer == BUFFER_SHM_ALLOCATED) {
+		feed_input(in, size, random);
+	} else {
 		char *data = mmap(NULL, size, PROT_WRITE, MAP_SHARED,
 						input_sdp_fd, 0);
 
@@ -423,15 +432,16 @@
 			perror("failed to map input buffer");
 			exit(-1);
 		}
-		read_random(data, size);
+		feed_input(data, size, random);
 		munmap(data, size);
 	}
 #endif
 }
 
+
 /* Encryption test: buffer of tsize byte. Run test n times. */
 void aes_perf_run_test(int mode, int keysize, int decrypt, size_t size,
-				unsigned int n, unsigned int l, int random_in,
+				unsigned int n, unsigned int l, int input_data_init,
 				int in_place, int warmup, int verbosity)
 {
 	struct statistics stats;
@@ -458,22 +468,8 @@
 	memset(&stats, 0, sizeof(stats));
 
 	alloc_buffers(size, in_place, verbosity);
-
-	if (input_buffer == BUFFER_SHM_ALLOCATED && !random_in)
-		memset(in_shm.buffer, 0, size);
-#ifdef CFG_SECURE_DATA_PATH
-	else {
-		char *data = mmap(NULL, size, PROT_WRITE, MAP_SHARED,
-						input_sdp_fd, 0);
-
-		if (data == MAP_FAILED) {
-			perror("failed to map input buffer");
-			exit(-1);
-		}
-		memset(in_shm.buffer, 0, size);
-		munmap(data, size);
-	}
-#endif
+	if (input_data_init == CRYPTO_USE_ZEROS)
+		run_feed_input(in_shm.buffer, size, 0);
 
 	memset(&op, 0, sizeof(op));
 	/* Using INOUT to handle the case in_place == 1 */
@@ -488,7 +484,7 @@
 
 	verbose("Starting test: %s, %scrypt, keysize=%u bits, size=%zu bytes, ",
 		mode_str(mode), (decrypt ? "de" : "en"), keysize, size);
-	verbose("random=%s, ", yesno(random_in));
+	verbose("random=%s, ", yesno(input_data_init == CRYPTO_USE_RANDOM));
 	verbose("in place=%s, ", yesno(in_place));
 	verbose("inner loops=%u, loops=%u, warm-up=%u s\n", l, n, warmup);
 
@@ -500,7 +496,8 @@
 		uint32_t ret_origin;
 		struct timespec t0, t1;
 
-		run_feed_input(in_shm.buffer, size, random_in);
+		if (input_data_init == CRYPTO_USE_RANDOM)
+			run_feed_input(in_shm.buffer, size, 1);
 
 		get_current_time(&t0);
 
@@ -565,7 +562,7 @@
 	int keysize = AES_128;	/* AES key size (-k) */
 	int mode = TA_AES_ECB;	/* AES mode (-m) */
 	/* Get input data from /dev/urandom (-r) */
-	int random_in = CRYPTO_USE_RANDOM;
+	int input_data_init = CRYPTO_USE_ZEROS;
 	/* Use same buffer for in and out (-i) */
 	int in_place = AES_PERF_INPLACE;
 	int warmup = CRYPTO_DEF_WARMUP;	/* Start with a 2-second busy loop (-w) */
@@ -617,7 +614,19 @@
 			n = atoi(argv[i]);
 		} else if (!strcmp(argv[i], "--random") ||
 			   !strcmp(argv[i], "-r")) {
-			random_in = 1;
+			if (input_data_init == CRYPTO_NOT_INITED) {
+				perror("--random is not compatible with --not-inited\n");
+				usage(argv[0], keysize, mode, size, warmup, l, n);
+				return 1;
+			}
+			input_data_init = CRYPTO_USE_RANDOM;
+		} else if (!strcmp(argv[i], "--not-inited")) {
+			if (input_data_init == CRYPTO_USE_RANDOM) {
+				perror("--random is not compatible with --not-inited\n");
+				usage(argv[0], keysize, mode, size, warmup, l, n);
+				return 1;
+			}
+			input_data_init = CRYPTO_NOT_INITED;
 		} else if (!strcmp(argv[i], "-s")) {
 			NEXT_ARG(i);
 			size = atoi(argv[i]);
@@ -671,7 +680,7 @@
 	}
 
 
-	aes_perf_run_test(mode, keysize, decrypt, size, n, l, random_in,
+	aes_perf_run_test(mode, keysize, decrypt, size, n, l, input_data_init,
 					in_place, warmup, verbosity);
 
 	return 0;
diff --git a/host/xtest/crypto_common.h b/host/xtest/crypto_common.h
index 096c27b..c686c84 100644
--- a/host/xtest/crypto_common.h
+++ b/host/xtest/crypto_common.h
@@ -38,8 +38,9 @@
 
 #define CRYPTO_DEF_LOOPS 1 /* Default amount of inner loops */
 
+#define CRYPTO_USE_ZEROS  0 /* Init input data to zero */
 #define CRYPTO_USE_RANDOM 1 /* Get input data from /dev/urandom */
-#define CRYPTO_NOT_RANDOM 0
+#define CRYPTO_NOT_INITED 2 /* Input data are not initialized */
 
 #define CRYPTO_DEF_WARMUP 2 /* Start with a 2-second busy loop  */
 #define CRYPTO_DEF_COUNT 5000	/* Default number of measurements */
diff --git a/host/xtest/sha_perf.c b/host/xtest/sha_perf.c
index 85fa7cd..1f645f0 100644
--- a/host/xtest/sha_perf.c
+++ b/host/xtest/sha_perf.c
@@ -239,8 +239,9 @@
 	TEEC_Result res;
 	uint32_t ret_origin;
 
-	if (random_in)
+	if (random_in == CRYPTO_USE_RANDOM)
 		read_random(in, size);
+
 	get_current_time(&t0);
 	res = TEEC_InvokeCommand(&sess, TA_SHA_PERF_CMD_PROCESS, op,
 				 &ret_origin);
@@ -324,7 +325,7 @@
 
 	alloc_shm(size, algo, offset);
 
-	if (!random_in)
+	if (random_in == CRYPTO_USE_ZEROS)
 		memset((uint8_t *)in_shm.buffer + offset, 0, size);
 
 	memset(&op, 0, sizeof(op));
@@ -342,7 +343,7 @@
 
 	verbose("Starting test: %s, size=%zu bytes, ",
 		algo_str(algo), size);
-	verbose("random=%s, ", yesno(random_in));
+	verbose("random=%s, ", yesno(random_in == CRYPTO_USE_RANDOM));
 	verbose("unaligned=%s, ", yesno(offset));
 	verbose("inner loops=%u, loops=%u, warm-up=%u s\n", l, n, warmup);
 
@@ -411,7 +412,7 @@
 	int verbosity = CRYPTO_DEF_VERBOSITY;	/* Verbosity (-v) */
 	int algo = TA_SHA_SHA1;	/* Algorithm (-a) */
 	/* Get input data from /dev/urandom (-r) */
-	int random_in = CRYPTO_USE_RANDOM;
+	int random_in = CRYPTO_USE_ZEROS;
 	/* Start with a 2-second busy loop (-w) */
 	int warmup = CRYPTO_DEF_WARMUP;
 	int offset = 0; /* Buffer offset wrt. alloc'ed address (-u) */
@@ -450,7 +451,7 @@
 			n = atoi(argv[i]);
 		} else if (!strcmp(argv[i], "--random") ||
 			   !strcmp(argv[i], "-r")) {
-			random_in = 1;
+			random_in = CRYPTO_USE_RANDOM;
 		} else if (!strcmp(argv[i], "-s")) {
 			NEXT_ARG(i);
 			size = atoi(argv[i]);