]> git.cryptolib.org Git - avr-crypto-lib.git/blob - stack_measuring.S
fixing some decryption bugs in GCM128
[avr-crypto-lib.git] / stack_measuring.S
1 /* stack_measuring.S */
2 /*
3     This file is part of the AVR-Crypto-Lib.
4     Copyright (C) 2010 Daniel Otte (daniel.otte@rub.de)
5
6     This program is free software: you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation, either version 3 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <avr/io.h>
21
22 .extern __brkval
23
24 .global stack_measure_init
25 stack_measure_init:
26         movw r30, r24
27         lds r20, __brkval
28         lds r21, __brkval + 1
29         in r0, _SFR_IO_ADDR(SREG)
30         cli
31         in r26, _SFR_IO_ADDR(SPL)
32         out _SFR_IO_ADDR(SREG), r0
33         in r27, _SFR_IO_ADDR(SPH)
34         cp r20, r26
35         cpc r21, r27
36         brlo 10f
37         ldi r20, lo8(__bss_end)
38         ldi r21, hi8(__bss_end)
39         cp r20, r26
40         cpc r21, r27
41         brlo 10f
42         ldi r21, 1
43         clr r20
44 10:
45         st Z+, r20
46         st Z+, r21
47         st Z+, r26
48         st Z+, r27
49         st Z, r22
50         movw r24, r26
51         sub r24, r20
52         sbc r25, r21
53         sbiw r24, 1
54         st X, r22
55 50: st -X, r22
56         sbiw r24, 1
57         brne 50b
58         ret
59
60 .global stack_measure_final
61 stack_measure_final:
62         movw r30, r24
63         lds r20, __brkval
64         lds r21, __brkval + 1
65         ld r26, Z+
66         ld r27, Z+
67
68         cp r20, r26
69         cpc r21, r27
70         brlo 10f
71         ldi r20, lo8(__bss_end)
72         ldi r21, hi8(__bss_end)
73         cp r20, r26
74         cpc r21, r27
75         brlo 10f
76         ldi r21, 1
77         clr r20
78 10:
79
80         adiw r26, 1
81         ld r24, Z+
82         ld r25, Z+
83         ld r22, Z
84         sub r24, r26
85         sbc r25, r27
86         adiw r24, 2
87 1:
88         sbiw r24, 1
89         breq 2f
90         ld r20, X+
91         cpse r20, r22
92 2:  ret
93         rjmp 1b
94
95 /* for testing only
96 .global stack_measure_usestack
97 stack_measure_usestack:
98         adiw r24, 0
99         brne 2f
100 1:      ret
101 2:
102         in r0, _SFR_IO_ADDR(SREG)
103         cli
104         in r26, _SFR_IO_ADDR(SPL)
105         out _SFR_IO_ADDR(SREG), r0
106         in r27, _SFR_IO_ADDR(SPH)
107     st X, r22
108         sbiw r24, 1
109         breq 1b
110 3:  st -X, r22
111         sbiw r24, 1
112         breq 1b
113         rjmp 3b
114
115         */