common/sha256: agressive SHA-256 unrolling as an option

Reduces "hash done" time from ~1.30 to ~1.15s on soraka.

BRANCH=none
BUG=chromium:702378
BUG=b:64196191
TEST=Boot soraka, looks at hash done time.
TEST=make run-sha256 run-sha256_unrolled passes.

Change-Id: Ia29ee27404d6e9aa615ff59755b59d3f26648e71
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/652327
Reviewed-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
This commit is contained in:
Nicolas Boichat 2017-09-06 18:04:19 +08:00 committed by chrome-bot
parent 1d4c4530ac
commit 797d740727
5 changed files with 37 additions and 0 deletions

View File

@ -131,12 +131,37 @@ static void SHA256_transform(struct sha256_ctx *ctx, const uint8_t *message,
for (j = 0; j < 16; j++)
PACK32(&sub_block[j << 2], &w[j]);
#ifdef CONFIG_SHA256_UNROLLED
for (j = 16; j < 64; j += 8) {
SHA256_SCR(j);
SHA256_SCR(j+1);
SHA256_SCR(j+2);
SHA256_SCR(j+3);
SHA256_SCR(j+4);
SHA256_SCR(j+5);
SHA256_SCR(j+6);
SHA256_SCR(j+7);
}
#else
for (j = 16; j < 64; j++)
SHA256_SCR(j);
#endif
for (j = 0; j < 8; j++)
wv[j] = ctx->h[j];
#ifdef CONFIG_SHA256_UNROLLED
for (j = 0; j < 64; j += 8) {
SHA256_EXP(0, 1, 2, 3, 4, 5, 6, 7, j);
SHA256_EXP(7, 0, 1, 2, 3, 4, 5, 6, j+1);
SHA256_EXP(6, 7, 0, 1, 2, 3, 4, 5, j+2);
SHA256_EXP(5, 6, 7, 0, 1, 2, 3, 4, j+3);
SHA256_EXP(4, 5, 6, 7, 0, 1, 2, 3, j+4);
SHA256_EXP(3, 4, 5, 6, 7, 0, 1, 2, j+5);
SHA256_EXP(2, 3, 4, 5, 6, 7, 0, 1, j+6);
SHA256_EXP(1, 2, 3, 4, 5, 6, 7, 0, j+7);
}
#else
for (j = 0; j < 64; j++) {
t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6])
+ sha256_k[j] + w[j];
@ -150,6 +175,7 @@ static void SHA256_transform(struct sha256_ctx *ctx, const uint8_t *message,
wv[1] = wv[0];
wv[0] = t1 + t2;
}
#endif
for (j = 0; j < 8; j++)
ctx->h[j] += wv[j];

View File

@ -2109,6 +2109,9 @@
/* Support computing of other hash sizes (without the VBOOT code) */
#undef CONFIG_SHA256
/* Unroll some loops in SHA256_transform for better performance. */
#undef CONFIG_SHA256_UNROLLED
/* Emulate the CLZ (Count Leading Zeros) in software for CPU lacking support */
#undef CONFIG_SOFTWARE_CLZ

View File

@ -71,6 +71,7 @@ test-list-host += rsa
test-list-host += rsa3
test-list-host += sbs_charging_v2
test-list-host += sha256
test-list-host += sha256_unrolled
test-list-host += shmalloc
test-list-host += system
test-list-host += thermal
@ -121,6 +122,7 @@ rsa3-y=rsa.o
sbs_charging-y=sbs_charging.o
sbs_charging_v2-y=sbs_charging_v2.o
sha256-y=sha256.o
sha256_unrolled-y=sha256.o
shmalloc-y=shmalloc.o
stress-y=stress.o
system-y=system.o

View File

@ -0,0 +1 @@
sha256.tasklist

View File

@ -85,6 +85,11 @@
#define CONFIG_SHA256
#endif
#ifdef TEST_SHA256_UNROLLED
#define CONFIG_SHA256
#define CONFIG_SHA256_UNROLLED
#endif
#ifdef TEST_SHMALLOC
#define CONFIG_MALLOC
#endif