diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 38 |
1 files changed, 11 insertions, 27 deletions
@@ -6,6 +6,7 @@ #include <linux/init.h> #include <linux/module.h> #include <linux/delay.h> +#include <asm/neon.h> static unsigned long stamp = 0; module_param(stamp, ulong, 0); @@ -16,20 +17,6 @@ enum { CURVE25519_POINT_SIZE = 32 }; u8 dummy_out[CURVE25519_POINT_SIZE]; #include "test_vectors.h" -static inline cycles_t get_arm_cycles(void) -{ - cycles_t cycles; - asm volatile("isb;mrs %0, cntpct_el0" : "=r"(cycles)); - return cycles; -} - -static inline cycles_t get_arm_freq(void) -{ - cycles_t cycles; - asm volatile("isb;mrs %0, cntfrq_el0" : "=r"(cycles)); - return cycles; -} - #define declare_it(name) \ bool curve25519_ ## name(u8 mypublic[CURVE25519_POINT_SIZE], const u8 secret[CURVE25519_POINT_SIZE], const u8 basepoint[CURVE25519_POINT_SIZE]); \ static __always_inline int name(void) \ @@ -40,10 +27,10 @@ static __always_inline int name(void) \ #define do_it(name) do { \ for (i = 0; i < WARMUP; ++i) \ ret |= name(); \ - start_ ## name = get_arm_cycles(); \ + start_ ## name = get_cycles(); \ for (i = 0; i < TRIALS; ++i) \ ret |= name(); \ - end_ ## name = get_arm_cycles(); \ + end_ ## name = get_cycles(); \ } while (0) #define test_it(name, before, after) do { \ @@ -58,12 +45,11 @@ static __always_inline int name(void) \ } while (0) #define report_it(name) do { \ - pr_err("%lu: %7s: %lu cycles per call\n", stamp, #name, (end_ ## name - start_ ## name) * get_arm_freq() / TRIALS / 1000000); \ + pr_err("%lu: %7s: %lu cycles per call\n", stamp, #name, (end_ ## name - start_ ## name) / TRIALS); \ } while (0) -declare_it(donna64) -declare_it(hacl64) +declare_it(neon) declare_it(fiat32) declare_it(donna32) @@ -74,8 +60,7 @@ static bool verify(void) u8 out[CURVE25519_POINT_SIZE]; for (i = 0; i < ARRAY_SIZE(curve25519_test_vectors); ++i) { - test_it(donna64, {}, {}); - test_it(hacl64, {}, {}); + test_it(neon, { kernel_neon_begin(); }, { kernel_neon_end(); }); test_it(fiat32, {}, {}); test_it(donna32, {}, {}); } @@ -86,8 +71,7 @@ static int __init mod_init(void) { enum { WARMUP = 5000, TRIALS = 10000, IDLE = 1 * 1000 }; int ret = 0, i; - cycles_t start_donna64, end_donna64; - cycles_t start_hacl64, end_hacl64; + cycles_t start_neon, end_neon; cycles_t start_fiat32, end_fiat32; cycles_t start_donna32, end_donna32; unsigned long flags; @@ -100,15 +84,15 @@ static int __init mod_init(void) spin_lock_irqsave(&lock, flags); - do_it(donna64); - do_it(hacl64); + kernel_neon_begin(); + do_it(neon); + kernel_neon_end(); do_it(fiat32); do_it(donna32); spin_unlock_irqrestore(&lock, flags); - report_it(donna64); - report_it(hacl64); + report_it(neon); report_it(fiat32); report_it(donna32); |