Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/sunxi Factor out some of the self-test logic us...



details:   https://anonhg.NetBSD.org/src/rev/5ef28c6251cb
branches:  trunk
changeset: 1005482:5ef28c6251cb
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon Dec 09 14:56:06 2019 +0000

description:
Factor out some of the self-test logic used for debugging.

Add missing bus_dmamap_sync(POSTWRITE) while here.

diffstat:

 sys/arch/arm/sunxi/sun8i_crypto.c |  95 ++++++++++++++++++--------------------
 1 files changed, 45 insertions(+), 50 deletions(-)

diffs (142 lines):

diff -r b47eff6030f9 -r 5ef28c6251cb sys/arch/arm/sunxi/sun8i_crypto.c
--- a/sys/arch/arm/sunxi/sun8i_crypto.c Mon Dec 09 14:55:52 2019 +0000
+++ b/sys/arch/arm/sunxi/sun8i_crypto.c Mon Dec 09 14:56:06 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sun8i_crypto.c,v 1.2 2019/12/09 14:55:52 riastradh Exp $       */
+/*     $NetBSD: sun8i_crypto.c,v 1.3 2019/12/09 14:56:06 riastradh Exp $       */
 
 /*-
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: sun8i_crypto.c,v 1.2 2019/12/09 14:55:52 riastradh Exp $");
+__KERNEL_RCSID(1, "$NetBSD: sun8i_crypto.c,v 1.3 2019/12/09 14:56:06 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -981,9 +981,9 @@
  * Self-test
  */
 
-static uint8_t selftest_input[16];
-static uint8_t selftest_key[16];
-static uint8_t selftest_output[16] = {
+static const uint8_t selftest_input[16];
+static const uint8_t selftest_key[16];
+static const uint8_t selftest_output[16] = {
        0x66,0xe9,0x4b,0xd4,0xef,0x8a,0x2c,0x3b,
        0x88,0x4c,0xfa,0x59,0xca,0x34,0x2b,0x2e,
 };
@@ -1061,70 +1061,65 @@
 fail0: aprint_error_dev(self, "failed to run self-test, error=%d\n", error);
 }
 
+static bool
+sun8i_crypto_selftest_check(struct sun8i_crypto_softc *sc, const char *title,
+    size_t n, const void *expected, const void *actual)
+{
+       const uint8_t *e = expected;
+       const uint8_t *a = actual;
+       size_t i;
+
+       if (memcmp(e, a, n) == 0)
+               return true;
+
+       device_printf(sc->sc_dev, "self-test: %s\n", title);
+       printf("expected: ");
+       for (i = 0; i < n; i++)
+               printf("%02hhx", e[i]);
+       printf("\n");
+       printf("actual:   ");
+       for (i = 0; i < n; i++)
+               printf("%02hhx", a[i]);
+       printf("\n");
+       return false;
+}
+
 static void
 sun8i_crypto_selftest_done(struct sun8i_crypto_softc *sc,
     struct sun8i_crypto_task *task, void *cookie, int error)
 {
        struct sun8i_crypto_selftest *selftest = cookie;
-       unsigned i;
        bool ok = true;
 
        KASSERT(selftest == &sc->sc_selftest);
 
+       /*
+        * Finished the DMA read into the output buffer, and finished
+        * the DMA writes from the key buffer and input buffer.
+        */
        bus_dmamap_sync(sc->sc_dmat, selftest->cs_out.cb_map, 0,
            sizeof selftest_output, BUS_DMASYNC_POSTREAD);
+       bus_dmamap_sync(sc->sc_dmat, selftest->cs_key.cb_map, 0,
+           sizeof selftest_key, BUS_DMASYNC_POSTWRITE);
        bus_dmamap_sync(sc->sc_dmat, selftest->cs_in.cb_map, 0,
            sizeof selftest_input, BUS_DMASYNC_POSTWRITE);
 
+       /* If anything went wrong, fail now.  */
        if (error) {
                device_printf(sc->sc_dev, "self-test error=%d\n", error);
                goto out;
        }
 
-       if (memcmp(selftest_input, selftest->cs_in.cb_kva,
-               sizeof selftest_input) != 0) {
-               device_printf(sc->sc_dev, "self-test: input clobbered\n");
-               printf("expected: ");
-               for (i = 0; i < sizeof selftest_input; i++)
-                       printf("%02hhx", selftest_input[i]);
-               printf("\n");
-               printf("actual:   ");
-               for (i = 0; i < sizeof selftest_input; i++)
-                       printf("%02hhx",
-                           ((const uint8_t *)selftest->cs_in.cb_kva)[i]);
-               printf("\n");
-               ok = false;
-       }
-
-       if (memcmp(selftest_key, selftest->cs_key.cb_kva,
-               sizeof selftest_key) != 0) {
-               device_printf(sc->sc_dev, "self-test: key clobbered\n");
-               printf("expected: ");
-               for (i = 0; i < sizeof selftest_key; i++)
-                       printf("%02hhx", selftest_key[i]);
-               printf("\n");
-               printf("actual:   ");
-               for (i = 0; i < sizeof selftest_key; i++)
-                       printf("%02hhx",
-                           ((const uint8_t *)selftest->cs_key.cb_kva)[i]);
-               printf("\n");
-               ok = false;
-       }
-
-       if (memcmp(selftest_output, selftest->cs_out.cb_kva,
-               sizeof selftest_output) != 0) {
-               device_printf(sc->sc_dev, "self-test: output mismatch\n");
-               printf("expected: ");
-               for (i = 0; i < sizeof selftest_output; i++)
-                       printf("%02hhx", selftest_output[i]);
-               printf("\n");
-               printf("actual:   ");
-               for (i = 0; i < sizeof selftest_output; i++)
-                       printf("%02hhx",
-                           ((const uint8_t *)selftest->cs_out.cb_kva)[i]);
-               printf("\n");
-               ok = false;
-       }
+       /*
+        * Verify the input and key weren't clobbered, and verify the
+        * output matches what we expect.
+        */
+       ok &= sun8i_crypto_selftest_check(sc, "input clobbered",
+           sizeof selftest_input, selftest_input, selftest->cs_in.cb_kva);
+       ok &= sun8i_crypto_selftest_check(sc, "key clobbered",
+           sizeof selftest_key, selftest_key, selftest->cs_key.cb_kva);
+       ok &= sun8i_crypto_selftest_check(sc, "output mismatch",
+           sizeof selftest_output, selftest_output, selftest->cs_out.cb_kva);
 
        /* XXX Disable the RNG and other stuff if this fails...  */
        if (ok)



Home | Main Index | Thread Index | Old Index