[ubicom32]: move new files out from platform support patch
[openwrt.git] / target / linux / ubicom32 / files / arch / ubicom32 / crypto / sha1_ubicom32_asm.S
1 /*
2  * arch/ubicom32/crypto/sha1_ubicom32_asm.S
3  *      SHA1 hash support for Ubicom32 architecture V3.
4  *
5  * (C) Copyright 2009, Ubicom, Inc.
6  *
7  * This file is part of the Ubicom32 Linux Kernel Port.
8  *
9  * The Ubicom32 Linux Kernel Port is free software: you can redistribute
10  * it and/or modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation, either version 2 of the
12  * License, or (at your option) any later version.
13  *
14  * The Ubicom32 Linux Kernel Port is distributed in the hope that it
15  * will be useful, but WITHOUT ANY WARRANTY; without even the implied
16  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
17  * the GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with the Ubicom32 Linux Kernel Port.  If not,
21  * see <http://www.gnu.org/licenses/>.
22  *
23  * Ubicom32 implementation derived from (with many thanks):
24  *   arch/m68knommu
25  *   arch/blackfin
26  *   arch/parisc
27  */
28
29 #define __ASM__
30 #include <asm/ip5000.h>
31
32 #ifndef RP
33 #define RP A5
34 #endif
35
36 ;*****************************************************************************************
37 ; The function prototype
38 ;*****************************************************************************************
39 ; void sha1_ip5k_init(void)
40 ; void sha1_ip5k_transform(u32_t *data_input)
41 ; void sha1_ip5k_output(u32_t *digest)
42
43 ;*****************************************************************************************
44 ; Inputs
45 ;*****************************************************************************************
46 ; data_input is the pointer to the block of data over which the digest will be calculated.
47 ;       It should be word aligned.
48 ;
49 ; digest is the pointer to the block of data into which the digest (the output) will be written.
50 ;       It should be word aligned.
51 ;
52
53 ;*****************************************************************************************
54 ; Outputs
55 ;*****************************************************************************************
56 ; None
57
58 ;*****************************************************************************************
59 ; Hash Constants
60 ;*****************************************************************************************
61 #define HASH_SHA1_IN0 0x67452301
62 #define HASH_SHA1_IN1 0xefcdab89
63 #define HASH_SHA1_IN2 0x98badcfe
64 #define HASH_SHA1_IN3 0x10325476
65 #define HASH_SHA1_IN4 0xc3d2e1f0
66
67 #define HASH_SECURITY_BLOCK_CONTROL_INIT_NO_ENCYPTION 2
68 #define HASH_SECURITY_BLOCK_CONTROL_INIT_SHA1 ((1 << 5) | HASH_SECURITY_BLOCK_CONTROL_INIT_NO_ENCYPTION)
69
70 ;*****************************************************************************************
71 ; An: Address Registers
72 ;*****************************************************************************************
73 #define an_digest a4
74 #define an_data_input a4
75 #define an_security_block a3
76
77 ;*****************************************************************************************
78 ; Hash related defines
79 ;*****************************************************************************************
80 #define hash_control 0x00(an_security_block)
81 #define hash_control_low 0x02(an_security_block)
82 #define hash_status 0x04(an_security_block)
83
84 #define hash_input_0 0x30(an_security_block)
85 #define hash_input_1 0x34(an_security_block)
86 #define hash_input_2 0x38(an_security_block)
87 #define hash_input_3 0x3c(an_security_block)
88 #define hash_input_4 0x40(an_security_block)
89
90 #define hash_output_0 0x70(an_security_block)
91 #define hash_output_0_low 0x72(an_security_block)
92 #define hash_output_1 0x74(an_security_block)
93 #define hash_output_1_low 0x76(an_security_block)
94 #define hash_output_2 0x78(an_security_block)
95 #define hash_output_2_low 0x7a(an_security_block)
96 #define hash_output_3 0x7c(an_security_block)
97 #define hash_output_3_low 0x7e(an_security_block)
98 #define hash_output_4 0x80(an_security_block)
99 #define hash_output_4_low 0x82(an_security_block)
100
101 ;*****************************************************************************************
102 ; Assembly macros
103 ;*****************************************************************************************
104         ; C compiler reserves RP (A5) for return address during subroutine call.
105         ; Use RP to return to caller
106 .macro  call_return_macro
107         calli   RP, 0(RP)
108 .endm
109
110 ;*****************************************************************************************
111 ;       void sha1_ip5k_init(void)
112 ;               initialize the output registers of the hash module
113
114         ;.section .text.sha1_ip5k_init,"ax",@progbits
115         .section .ocm_text,"ax",@progbits
116         .global _sha1_ip5k_init
117         .func sha1_ip5k_init, _sha1_ip5k_init
118
119 _sha1_ip5k_init:
120         moveai an_security_block, #SECURITY_BASE_EFFECTIVE_ADDRESS
121
122         movei hash_control, #%hi(HASH_SECURITY_BLOCK_CONTROL_INIT_SHA1)
123         movei hash_control_low, #%lo(HASH_SECURITY_BLOCK_CONTROL_INIT_SHA1)
124
125         movei hash_output_0, #%hi(HASH_SHA1_IN0)
126         movei hash_output_0_low, #%lo(HASH_SHA1_IN0)
127
128         movei hash_output_1, #%hi(HASH_SHA1_IN1)
129         movei hash_output_1_low, #%lo(HASH_SHA1_IN1)
130
131         movei hash_output_2, #%hi(HASH_SHA1_IN2)
132         movei hash_output_2_low, #%lo(HASH_SHA1_IN2)
133
134         movei hash_output_3, #%hi(HASH_SHA1_IN3)
135         movei hash_output_3_low, #%lo(HASH_SHA1_IN3)
136
137         movei hash_output_4, #%hi(HASH_SHA1_IN4)
138         movei hash_output_4_low, #%lo(HASH_SHA1_IN4)
139
140         call_return_macro
141         .endfunc
142
143 ;*****************************************************************************************
144 ;       void sha1_ip5k_init_digest(u32_t *hash_input)
145 ;               initialize the output registers of the hash module
146
147         ;.section .text.sha1_ip5k_init_digest,"ax",@progbits
148         .section .ocm_text,"ax",@progbits
149         .global _sha1_ip5k_init_digest
150         .func sha1_ip5k_init_digest, _sha1_ip5k_init_digest
151
152 _sha1_ip5k_init_digest:
153         movea an_data_input, D0
154
155         moveai an_security_block, #SECURITY_BASE_EFFECTIVE_ADDRESS
156
157         movei hash_control, #%hi(HASH_SECURITY_BLOCK_CONTROL_INIT_SHA1)
158         movei hash_control_low, #%lo(HASH_SECURITY_BLOCK_CONTROL_INIT_SHA1)
159
160         move.4 hash_output_0, (an_data_input)4++
161         move.4 hash_output_1, (an_data_input)4++
162         move.4 hash_output_2, (an_data_input)4++
163         move.4 hash_output_3, (an_data_input)4++
164         move.4 hash_output_4, (an_data_input)4++
165
166         call_return_macro
167         .endfunc
168
169 ;*****************************************************************************************
170 ;       void sha1_ip5k_transform(u32_t *data_input)
171 ;               performs intermediate transformation step for the hash calculation
172
173         ;.section .text.sha1_ip5k_transform,"ax",@progbits
174         .section .ocm_text,"ax",@progbits
175         .global _sha1_ip5k_transform
176         .func sha1_ip5k_transform, _sha1_ip5k_transform
177
178 _sha1_ip5k_transform:
179         movea an_data_input, D0
180
181         moveai an_security_block, #SECURITY_BASE_EFFECTIVE_ADDRESS
182
183         ; Write the first 128bits (16 bytes)
184         move.4 hash_input_0, (an_data_input)4++
185         move.4 hash_input_1, (an_data_input)4++
186         move.4 hash_input_2, (an_data_input)4++
187         move.4 hash_input_3, (an_data_input)4++
188         move.4 hash_input_4, D0
189
190         move.4 hash_input_0, (an_data_input)4++
191         move.4 hash_input_1, (an_data_input)4++
192         move.4 hash_input_2, (an_data_input)4++
193         move.4 hash_input_3, (an_data_input)4++
194         move.4 hash_input_4, D0
195
196         move.4 hash_input_0, (an_data_input)4++
197         move.4 hash_input_1, (an_data_input)4++
198         move.4 hash_input_2, (an_data_input)4++
199         move.4 hash_input_3, (an_data_input)4++
200         move.4 hash_input_4, D0
201
202         move.4 hash_input_0, (an_data_input)4++
203         move.4 hash_input_1, (an_data_input)4++
204         move.4 hash_input_2, (an_data_input)4++
205         move.4 hash_input_3, (an_data_input)4++
206         move.4 hash_input_4, D0
207
208         pipe_flush 0
209
210 sha1_ip5k_transform_wait:
211         ; wait for the module to calculate the output hash
212         btst hash_status, #0
213         jmpne.f sha1_ip5k_transform_wait
214
215         call_return_macro
216         .endfunc
217
218 ;*****************************************************************************************
219 ;       void sha1_ip5k_output(u32_t *digest)
220 ;               Return the hash of the input data
221
222         ;.section .text.sha1_ip5k_output,"ax",@progbits
223         .section .ocm_text,"ax",@progbits
224         .global _sha1_ip5k_output
225         .func sha1_ip5k_output, _sha1_ip5k_output
226
227 _sha1_ip5k_output:
228         movea an_digest, D0
229
230         moveai an_security_block, #SECURITY_BASE_EFFECTIVE_ADDRESS
231
232         ; we have finished
233         move.4 0(an_digest), hash_output_0
234         move.4 4(an_digest), hash_output_1
235         move.4 8(an_digest), hash_output_2
236         move.4 12(an_digest), hash_output_3
237         move.4 16(an_digest), hash_output_4
238
239         call_return_macro
240         .endfunc
241
242 ;*****************************************************************************************
243 ;END                    ;End of program code
244 ;*****************************************************************************************