]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - stack_measuring.S
stack usage measurement
[avr-crypto-lib.git] / stack_measuring.S
diff --git a/stack_measuring.S b/stack_measuring.S
new file mode 100644 (file)
index 0000000..a70f32d
--- /dev/null
@@ -0,0 +1,96 @@
+/* stack_measuring.S */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de)
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <avr/io.h>
+
+.extern __brkval
+
+.global stack_measure_init
+stack_measure_init:
+       movw r30, r24
+       lds r20, __brkval
+       lds r21, __brkval+1
+       in r0, _SFR_IO_ADDR(SREG)
+       cli
+       in r26, _SFR_IO_ADDR(SPL)
+       out _SFR_IO_ADDR(SREG), r0
+       in r27, _SFR_IO_ADDR(SPH)
+       st Z+, r20
+       st Z+, r21
+       st Z+, r26
+       st Z+, r27
+       st Z, r22
+       movw r24, r26
+       sub r24, r20
+       sbc r25, r21
+       sbiw r24, 1
+       st X, r22
+1:  st -X, r22
+       sbiw r24, 1
+       brne 1b
+       ret
+
+.global stack_measure_final
+stack_measure_final:
+       movw r30, r24
+       lds r20, __brkval
+       lds r21, __brkval+1
+       ld r26, Z+
+       ld r27, Z+
+       cp r20, r26
+       cpc r21, r27
+       brlo 1f
+       movw r26, r20
+1:
+       adiw r26, 1
+       ld r24, Z+
+       ld r25, Z+
+       ld r22, Z
+       sub r24, r26
+       sbc r25, r27
+       adiw r24, 2
+1:
+       sbiw r24, 1
+       breq 2f
+       ld r20, X+
+       cpse r20, r22
+2:  ret
+       rjmp 1b
+
+/* for testing only
+.global stack_measure_usestack
+stack_measure_usestack:
+       adiw r24, 0
+       brne 2f
+1:     ret
+2:
+       in r0, _SFR_IO_ADDR(SREG)
+       cli
+       in r26, _SFR_IO_ADDR(SPL)
+       out _SFR_IO_ADDR(SREG), r0
+       in r27, _SFR_IO_ADDR(SPH)
+    st X, r22
+       sbiw r24, 1
+       breq 1b
+3:  st -X, r22
+       sbiw r24, 1
+       breq 1b
+       rjmp 3b
+
+       */