summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@google.com>2017-05-31 12:12:12 +0800
committerchrome-bot <chrome-bot@chromium.org>2017-06-06 08:52:16 -0700
commit39db721f9ace13cc210278c88c3f364b5d67b5b8 (patch)
tree6a0ca910942bf8c41560e91b73a8a58d04bc146c /test
parent2f436f4cc9bd026ed83511401ab17d68f5f8e5a3 (diff)
downloadchrome-ec-39db721f9ace13cc210278c88c3f364b5d67b5b8.tar.gz
hammer: Add board_get_entropy function (and test)
This function will be used to generate some entropy using the Clock Recovery System. BRANCH=none BUG=b:38486828 TEST=make BOARD=hammer -j tests ./util/flash_ec --board=hammer --image=build/hammer/test-entropy.bin EC console: runtest TEST=Test fails when no USB connection is active TEST=Test passes when USB connection is active TEST=Pasting the values into: tr ';' '\n' | awk 'BEGIN { e = 0; tot=16384.0 } { p = $1/tot; if (p > 0) { e -= p*log(p)/log(2) } } END { print e }' shows an entropy > 4 bits per sample. Change-Id: I2363c7bce42c72c33ef0bf3f099d709ee9c13d13 Reviewed-on: https://chromium-review.googlesource.com/518608 Commit-Ready: Nicolas Boichat <drinkcat@chromium.org> Tested-by: Nicolas Boichat <drinkcat@chromium.org> Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'test')
-rw-r--r--test/build.mk3
-rw-r--r--test/entropy.c60
-rw-r--r--test/entropy.tasklist17
3 files changed, 80 insertions, 0 deletions
diff --git a/test/build.mk b/test/build.mk
index b92e263e8f..807d0f57b7 100644
--- a/test/build.mk
+++ b/test/build.mk
@@ -12,6 +12,8 @@ test-list-y=pingpong timer_calib timer_dos timer_jump mutex utils utils_str
test-list-$(BOARD_BDS)+=
test-list-$(BOARD_PIT)+=kb_scan stress
+test-list-$(BOARD_HAMMER)+=entropy
+
# Samus has board-specific chipset code, and the tests don't
# compile with it. Disable them for now.
test-list-$(BOARD_SAMUS)=
@@ -85,6 +87,7 @@ charge_manager-y=charge_manager.o
charge_manager_drp_charging-y=charge_manager.o
charge_ramp-y+=charge_ramp.o
console_edit-y=console_edit.o
+entropy-y=entropy.o
extpwr_gpio-y=extpwr_gpio.o
fan-y=fan.o
flash-y=flash.o
diff --git a/test/entropy.c b/test/entropy.c
new file mode 100644
index 0000000000..f01a3dd0a0
--- /dev/null
+++ b/test/entropy.c
@@ -0,0 +1,60 @@
+/* Copyright 2017 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Tests entropy source.
+ */
+
+#include "console.h"
+#include "common.h"
+#include "rollback.h"
+#include "test_util.h"
+#include "timer.h"
+#include "util.h"
+#include "watchdog.h"
+
+static int buckets[256];
+
+void run_test(void)
+{
+ const int loopcount = 512;
+
+ uint8_t buffer[32];
+ timestamp_t t0, t1;
+ int i, j;
+
+ memset(buckets, 0, sizeof(buckets));
+
+ for (i = 0; i < loopcount; i++) {
+ t0 = get_time();
+ if (!board_get_entropy(buffer, sizeof(buffer))) {
+ ccprintf("Cannot get entropy\n");
+ test_fail();
+ return;
+ }
+ t1 = get_time();
+ if (i == 0)
+ ccprintf("Got %d bytes in %ld us\n",
+ sizeof(buffer), t1.val - t0.val);
+
+ for (j = 0; j < sizeof(buffer); j++)
+ buckets[buffer[j]]++;
+
+ watchdog_reload();
+ }
+
+ ccprintf("Total count: %d\n", loopcount * sizeof(buffer));
+ ccprintf("Buckets: ");
+ for (j = 0; j < 256; j++) {
+ ccprintf("%d;", buckets[j]);
+ cflush();
+ }
+ ccprintf("\n");
+ /*
+ * From the data above, entropy can be obtained with this command:
+ * tr ';' '\n' | awk 'BEGIN { e = 0; tot=16384.0 }
+ { p = $1/tot; if (p > 0) { e -= p*log(p)/log(2) } }
+ END { print e }'
+ */
+ test_pass();
+}
diff --git a/test/entropy.tasklist b/test/entropy.tasklist
new file mode 100644
index 0000000000..e76178ba0a
--- /dev/null
+++ b/test/entropy.tasklist
@@ -0,0 +1,17 @@
+/* Copyright 2017 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**
+ * List of enabled tasks in the priority order
+ *
+ * The first one has the lowest priority.
+ *
+ * For each task, use the macro TASK_TEST(n, r, d, s) where :
+ * 'n' in the name of the task
+ * 'r' in the main routine of the task
+ * 'd' in an opaque parameter passed to the routine at startup
+ * 's' is the stack size in bytes; must be a multiple of 8
+ */
+#define CONFIG_TEST_TASK_LIST