aboutsummaryrefslogtreecommitdiffstats
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c38
1 files changed, 11 insertions, 27 deletions
diff --git a/main.c b/main.c
index 8c33f84..ce5f496 100644
--- a/main.c
+++ b/main.c
@@ -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);