/* 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 . */ #include .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) 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+, 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 50: st -X, r22 sbiw r24, 1 brne 50b 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 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: 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 */