some minor improvments and bug fixes

This commit is contained in:
bg 2012-09-18 06:07:04 +02:00
parent fdbda6486d
commit 7edc452f93
11 changed files with 106 additions and 61 deletions

View File

@ -14,7 +14,7 @@ override ASFLAGS = -mmcu=$(MCU_TARGET) -Wa,--gdwarf-2
#PROGRAMMER = avr911 #PROGRAMMER = avr911
#PROG_PORT = /dev/ttyUSB1 #PROG_PORT = /dev/ttyUSB1
PROGRAMMER = usbasp PROGRAMMER = avrispmkII
PROG_PORT = usb PROG_PORT = usb
DEFS = -D$(call uc, $(MCU_TARGET)) -DF_CPU=$(F_CPU) DEFS = -D$(call uc, $(MCU_TARGET)) -DF_CPU=$(F_CPU)
FLASHCMD = avrdude -p $(MCU_TARGET) -P $(PROG_PORT) -c $(PROGRAMMER) -U flash:w:# no space at the end FLASHCMD = avrdude -p $(MCU_TARGET) -P $(PROG_PORT) -c $(PROGRAMMER) -U flash:w:# no space at the end

View File

@ -32,15 +32,17 @@
#include "performance_test.h" #include "performance_test.h"
#include "stack_measuring.h" #include "stack_measuring.h"
#include "cli.h" #include "cli.h"
#include "uart_i.h"
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdio.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#define PATTERN_A 0xAA #define PATTERN_A 0xAA
#define PATTERN_B 0x55 #define PATTERN_B 0x55
/*
static static
void printvalue(unsigned long v){ void printvalue(unsigned long v){
char str[20]; char str[20];
@ -51,6 +53,7 @@ void printvalue(unsigned long v){
} }
cli_putstr(str); cli_putstr(str);
} }
*/
void bcal_performance(const bcdesc_t* bcd){ void bcal_performance(const bcdesc_t* bcd){
bcdesc_t bc; bcdesc_t bc;
@ -62,30 +65,22 @@ void bcal_performance(const bcdesc_t* bcd){
uint64_t t; uint64_t t;
uint8_t i; uint8_t i;
if(bc.type!=BCDESC_TYPE_BLOCKCIPHER) if(bc.type != BCDESC_TYPE_BLOCKCIPHER)
return; return;
calibrateTimer(); calibrateTimer();
print_overhead(); print_overhead();
cli_putstr_P(PSTR("\r\n\r\n === ")); printf_P(PSTR("\n\n === %S"), bc.name);
cli_putstr_P(bc.name); printf_P(PSTR(" performance === \n"
cli_putstr_P(PSTR(" performance === " " type: blockcipher\n"
"\r\n type: blockcipher" " keysize (bits): %5"PRIu16"\n"), keysize);
"\r\n keysize (bits): ")); printf_P(PSTR(" ctxsize (bytes): %5"PRIu16"\n"), bc.ctxsize_B);
printvalue(keysize); printf_P(PSTR(" blocksize (bits): %5"PRIu16"\n"), bc.blocksize_b);
uart0_flush();
cli_putstr_P(PSTR("\r\n ctxsize (bytes): "));
printvalue(bc.ctxsize_B);
cli_putstr_P(PSTR("\r\n blocksize (bits): "));
printvalue(bc.blocksize_b);
t=0; t=0;
if(bc.init.init1){ if(bc.init.init1){
if((bc.flags&BC_INIT_TYPE)==BC_INIT_TYPE_1){ if((bc.flags & BC_INIT_TYPE) == BC_INIT_TYPE_1){
for(i=0; i<32; ++i){ for(i=0; i<32; ++i){
startTimer(0); startTimer(1);
START_TIMER; START_TIMER;
(bc.init.init1)(key, &ctx); (bc.init.init1)(key, &ctx);
STOP_TIMER; STOP_TIMER;
@ -96,7 +91,7 @@ void bcal_performance(const bcdesc_t* bcd){
} }
} else { } else {
for(i=0; i<32; ++i){ for(i=0; i<32; ++i){
startTimer(0); startTimer(1);
START_TIMER; START_TIMER;
(bc.init.init2)(key, keysize, &ctx); (bc.init.init2)(key, keysize, &ctx);
STOP_TIMER; STOP_TIMER;
@ -107,9 +102,10 @@ void bcal_performance(const bcdesc_t* bcd){
} }
} }
t>>=5; t>>=5;
cli_putstr_P(PSTR("\r\n init (cycles): ")); printf_P(PSTR(" init (cycles): %5"PRIu16"\n"), t);
printvalue(t);
} }
uart0_flush();
t=0; t=0;
for(i=0; i<32; ++i){ for(i=0; i<32; ++i){
startTimer(0); startTimer(0);
@ -119,9 +115,9 @@ void bcal_performance(const bcdesc_t* bcd){
t += stopTimer(); t += stopTimer();
} }
t>>=5; t>>=5;
cli_putstr_P(PSTR("\r\n encrypt (cycles): ")); printf_P(PSTR(" encrypt (cycles): %5"PRIu16"\n"), t);
printvalue(t);
uart0_flush();
t=0; t=0;
for(i=0; i<32; ++i){ for(i=0; i<32; ++i){
startTimer(0); startTimer(0);
@ -131,10 +127,11 @@ void bcal_performance(const bcdesc_t* bcd){
t += stopTimer(); t += stopTimer();
} }
t>>=5; t>>=5;
cli_putstr_P(PSTR("\r\n decrypt (cycles): ")); printf_P(PSTR(" decrypt (cycles): %5"PRIu16"\n"), t);
printvalue(t); uart0_flush();
if(bc.free){ if(bc.free){
uart0_flush();
bc.free(&ctx); bc.free(&ctx);
} }
} }
@ -147,17 +144,17 @@ void bcal_stacksize(const bcdesc_t* bcd){
uint8_t data[(bc.blocksize_b+7)/8]; uint8_t data[(bc.blocksize_b+7)/8];
uint16_t keysize = get_keysize(bc.valid_keysize_desc); uint16_t keysize = get_keysize(bc.valid_keysize_desc);
uint8_t key[(keysize+7)/8]; uint8_t key[(keysize+7)/8];
uint16_t t1, t2; uint16_t t1 = 0, t2 = 0;
if(bc.type!=BCDESC_TYPE_BLOCKCIPHER) if(bc.type != BCDESC_TYPE_BLOCKCIPHER)
return; return;
cli_putstr_P(PSTR("\r\n\r\n === ")); printf_P(PSTR("\n === %S stack-usage ===\n"),bc.name);
cli_putstr_P(bc.name);
cli_putstr_P(PSTR(" stack-usage === ")); uart0_flush();
if(bc.init.init1){ if(bc.init.init1){
if((bc.flags&BC_INIT_TYPE)==BC_INIT_TYPE_1){ if((bc.flags & BC_INIT_TYPE) == BC_INIT_TYPE_1){
cli(); cli();
stack_measure_init(&smctx, PATTERN_A); stack_measure_init(&smctx, PATTERN_A);
bc.init.init1(&ctx, key); bc.init.init1(&ctx, key);
t1 = stack_measure_final(&smctx); t1 = stack_measure_final(&smctx);
@ -166,18 +163,18 @@ void bcal_stacksize(const bcdesc_t* bcd){
t2 = stack_measure_final(&smctx); t2 = stack_measure_final(&smctx);
sei(); sei();
} else { } else {
cli(); cli();
stack_measure_init(&smctx, PATTERN_A); stack_measure_init(&smctx, PATTERN_A);
bc.init.init2(&ctx, keysize, key); bc.init.init2(&ctx, keysize, key);
t1 = stack_measure_final(&smctx); t1 = stack_measure_final(&smctx);
stack_measure_init(&smctx, PATTERN_B); stack_measure_init(&smctx, PATTERN_B);
bc.init.init2(&ctx, keysize, key); bc.init.init2(&ctx, keysize, key);
t2 = stack_measure_final(&smctx); t2 = stack_measure_final(&smctx);
sei(); sei();
} }
t1 = (t1>t2)?t1:t2; t1 = (t1>t2)?t1:t2;
cli_putstr_P(PSTR("\r\n init (bytes): ")); printf_P(PSTR(" init (bytes): %5"PRIu16"\n"), t1);
printvalue((unsigned long)t1);
} }
cli(); cli();
stack_measure_init(&smctx, PATTERN_A); stack_measure_init(&smctx, PATTERN_A);
@ -189,8 +186,7 @@ void bcal_stacksize(const bcdesc_t* bcd){
sei(); sei();
t1 = (t1>t2)?t1:t2; t1 = (t1>t2)?t1:t2;
cli_putstr_P(PSTR("\r\n encBlock (bytes): ")); printf_P(PSTR(" encBlock (bytes): %5"PRIu16"\n"), t1);
printvalue((unsigned long)t1);
cli(); cli();
stack_measure_init(&smctx, PATTERN_A); stack_measure_init(&smctx, PATTERN_A);
@ -202,8 +198,7 @@ void bcal_stacksize(const bcdesc_t* bcd){
sei(); sei();
t1 = (t1>t2)?t1:t2; t1 = (t1>t2)?t1:t2;
cli_putstr_P(PSTR("\r\n decBlock (bytes): ")); printf_P(PSTR(" decBlock (bytes): %5"PRIu16"\n"), t1);
printvalue((unsigned long)t1);
if(bc.free){ if(bc.free){
bc.free(&ctx); bc.free(&ctx);
@ -215,7 +210,7 @@ void bcal_performance_multiple(const bcdesc_t* const* bcd_list){
for(;;){ for(;;){
bcd = (void*)pgm_read_word(bcd_list); bcd = (void*)pgm_read_word(bcd_list);
if(!bcd){ if(!bcd){
cli_putstr_P(PSTR("\r\n\r\n End of performance figures\r\n")); puts_P(PSTR("\n End of performance figures\n"));
return; return;
} }
bcal_performance(bcd); bcal_performance(bcd);

View File

@ -315,7 +315,7 @@ int8_t bigint_cmp_u(const bigint_t* a, const bigint_t* b){
if(a->length_W < b->length_W){ if(a->length_W < b->length_W){
return -1; return -1;
} }
if(a->length_W==0){ if(a->length_W == 0){
return 0; return 0;
} }
uint16_t i; uint16_t i;

View File

@ -1,3 +1,8 @@
CLI_STD = cli-stub.o cli-basics.o cli-core.o cli-hexdump.o debug.o hexdigit_tab.o \ CLI_STD = cli-stub.o cli-basics.o cli-core.o cli-hexdump.o debug.o hexdigit_tab.o \
dbz_strings.o string-extras-asm.o uart_i-asm.o circularbytebuffer-asm.o \ dbz_strings.o string-extras-asm.o uart_i-asm.o circularbytebuffer-asm.o \
main-test-common.o main-test-common.o
#CLI_STD = cli.o debug.o hexdigit_tab.o \
# dbz_strings.o string-extras-asm.o uart_i-asm.o circularbytebuffer-asm.o \
# main-test-common.o

View File

@ -25,12 +25,23 @@
stack_measure_init: stack_measure_init:
movw r30, r24 movw r30, r24
lds r20, __brkval lds r20, __brkval
lds r21, __brkval+1 lds r21, __brkval + 1
in r0, _SFR_IO_ADDR(SREG) in r0, _SFR_IO_ADDR(SREG)
cli cli
in r26, _SFR_IO_ADDR(SPL) in r26, _SFR_IO_ADDR(SPL)
out _SFR_IO_ADDR(SREG), r0 out _SFR_IO_ADDR(SREG), r0
in r27, _SFR_IO_ADDR(SPH) in r27, _SFR_IO_ADDR(SPH)
cp r20, r26
cpc r21, r27
brlo 10f
ldi r20, lo8(__bss_end)
ldi r21, hi8(__bss_end)
cp r20, r26
cpc r21, r27
brlo 10f
ldi r21, 1
clr r20
10:
st Z+, r20 st Z+, r20
st Z+, r21 st Z+, r21
st Z+, r26 st Z+, r26
@ -41,23 +52,31 @@ stack_measure_init:
sbc r25, r21 sbc r25, r21
sbiw r24, 1 sbiw r24, 1
st X, r22 st X, r22
1: st -X, r22 50: st -X, r22
sbiw r24, 1 sbiw r24, 1
brne 1b brne 50b
ret ret
.global stack_measure_final .global stack_measure_final
stack_measure_final: stack_measure_final:
movw r30, r24 movw r30, r24
lds r20, __brkval lds r20, __brkval
lds r21, __brkval+1 lds r21, __brkval + 1
ld r26, Z+ ld r26, Z+
ld r27, Z+ ld r27, Z+
cp r20, r26 cp r20, r26
cpc r21, r27 cpc r21, r27
brlo 1f brlo 10f
movw r26, r20 ldi r20, lo8(__bss_end)
1: ldi r21, hi8(__bss_end)
cp r20, r26
cpc r21, r27
brlo 10f
ldi r21, 1
clr r20
10:
adiw r26, 1 adiw r26, 1
ld r24, Z+ ld r24, Z+
ld r25, Z+ ld r25, Z+

View File

@ -392,6 +392,7 @@ cli_auto_help:
99: 99:
pop_range 28, 29 pop_range 28, 29
pop_range 14, 17 pop_range 14, 17
ori r24, 1
ret ret
ahelphead_str: ahelphead_str:
.asciz "\r\n[auto help] available commands:\r\n <command> - <params> - <address>\r\n" .asciz "\r\n[auto help] available commands:\r\n <command> - <params> - <address>\r\n"

View File

@ -98,7 +98,7 @@ int8_t cmd_interface(PGM_VOID_P cmd_desc){
c = cli_rx(); c = cli_rx();
switch (c){ switch (c){
case CLI_ENTER: case CLI_ENTER:
if((exit_code=search_and_call(cli_buffer, maxcmdlength, cmd_desc))<=0){ if((exit_code = search_and_call(cli_buffer, maxcmdlength, cmd_desc)) <=0 ){
free(cli_buffer); free(cli_buffer);
return exit_code; return exit_code;
} }

View File

@ -57,15 +57,15 @@ extern uint8_t cli_echo;
void cli_putc(char c); void cli_putc(char c);
uint16_t cli_getc(void); uint16_t cli_getc(void);
uint16_t cli_getc_cecho(void); uint16_t cli_getc_cecho(void);
uint8_t cli_getsn(char* s, uint16_t n); uint8_t cli_getsn(char* s, size_t n);
uint8_t cli_getsn_cecho(char* s, uint16_t n); uint8_t cli_getsn_cecho(char* s, uint16_t n);
void cli_putstr(const char* s); void cli_putstr(const char* s);
void cli_putstr_P(PGM_P s); void cli_putstr_P(PGM_P s);
void cli_hexdump_byte(uint8_t byte); void cli_hexdump_byte(uint8_t byte);
void cli_hexdump(const void* data, uint16_t length); void cli_hexdump(const void* data, size_t length);
void cli_hexdump_rev(const void* data, uint16_t length); void cli_hexdump_rev(const void* data, size_t length);
void cli_hexdump2(const void* data, uint16_t length); void cli_hexdump2(const void* data, size_t length);
void cli_hexdump_block(const void* data, uint16_t length, uint8_t indent, uint8_t width); void cli_hexdump_block(const void* data, size_t length, uint8_t indent, uint8_t width);
void echo_ctrl(char* s); void echo_ctrl(char* s);
int8_t cmd_interface(PGM_VOID_P cmd_desc); int8_t cmd_interface(PGM_VOID_P cmd_desc);

View File

@ -52,5 +52,5 @@ void welcome_msg(const char* algoname){
cli_putstr(__TIME__); cli_putstr(__TIME__);
cli_putstr_P(PSTR(")\r\nloaded and running\r\n")); cli_putstr_P(PSTR(")\r\nloaded and running\r\n"));
*/ */
printf_P(PSTR("\n\nAVR-Crypto-Lib VS(%s; %s %s)\nloaded and running\n"), algoname, __DATE__, __TIME__); printf_P(PSTR("\n\nAVR-Crypto-Lib VS (%s; %s %s)\nloaded and running\n"), algoname, __DATE__, __TIME__);
} }

View File

@ -192,6 +192,11 @@ uart0_init:
std Z+UART0_TXON_OFFSET, r24 std Z+UART0_TXON_OFFSET, r24
std Z+UART0_RXON_OFFSET, r24 std Z+UART0_RXON_OFFSET, r24
#endif #endif
#if UART0_HOOK
std Z+UART0_HOOK_OFFSET, r1
std Z+UART0_HOOK_OFFSET+1, r1
std Z+UART0_HOOKR_OFFSET, r1
#endif
ldi r24, UBRRH_VALUE ldi r24, UBRRH_VALUE
STORE_IO UBRR0H, r24 STORE_IO UBRR0H, r24
ldi r24, UBRRL_VALUE ldi r24, UBRRL_VALUE
@ -496,5 +501,16 @@ uart0_sethook:
st X+, r25 st X+, r25
ret ret
#endif #endif
.global uart0_flush
uart0_flush:
10:
ldi r24, lo8(uart0_ctx+UART0_CBB_TX_OFFSET)
ldi r25, hi8(uart0_ctx+UART0_CBB_TX_OFFSET)
rcall circularbytebuffer_cnt
tst r24
brne 10b
ret
#endif /* UART0_I */ #endif /* UART0_I */

View File

@ -115,7 +115,7 @@ typedef struct{
#endif #endif
#if UART1_SWFLOWCTRL #if UART1_SWFLOWCTRL
volatile uint8_t txon; /**< flag indicating if we are allowed to send data */ volatile uint8_t txon; /**< flag indicating if we are allowed to send data */
volatile uint8_t rxon; /**< flag indicating if we have send an \a XOFF */ volatile uint8_t rxon; /**< flag indicating if we have send a XOFF */
#endif #endif
} uart1_ctx_t; } uart1_ctx_t;
@ -156,6 +156,15 @@ uint16_t uart0_getc(void);
*/ */
uint8_t uart0_dataavail(void); uint8_t uart0_dataavail(void);
/**
* \brief flushes the internal transmit buffer.
*
* This function function waits until all data was send (the transmit-buffer
* does not contain any data).
*/
void uart0_flush(void);
#if UART0_HOOK #if UART0_HOOK
/** /**
* \brief sets the hook for uart0. * \brief sets the hook for uart0.