Contents of /trunk/kernel-alx/patches-4.9/0285-4.9.186-all-fixes.patch
Parent Directory | Revision Log
Revision 3373 -
(show annotations)
(download)
Thu Jul 25 14:48:18 2019 UTC (5 years, 2 months ago) by niro
File size: 166396 byte(s)
Thu Jul 25 14:48:18 2019 UTC (5 years, 2 months ago) by niro
File size: 166396 byte(s)
-linux-4.9.186
1 | diff --git a/Documentation/devicetree/bindings/net/can/microchip,mcp251x.txt b/Documentation/devicetree/bindings/net/can/microchip,mcp251x.txt |
2 | index ee3723beb701..33b38716b77f 100644 |
3 | --- a/Documentation/devicetree/bindings/net/can/microchip,mcp251x.txt |
4 | +++ b/Documentation/devicetree/bindings/net/can/microchip,mcp251x.txt |
5 | @@ -4,6 +4,7 @@ Required properties: |
6 | - compatible: Should be one of the following: |
7 | - "microchip,mcp2510" for MCP2510. |
8 | - "microchip,mcp2515" for MCP2515. |
9 | + - "microchip,mcp25625" for MCP25625. |
10 | - reg: SPI chip select. |
11 | - clocks: The clock feeding the CAN controller. |
12 | - interrupt-parent: The parent interrupt controller. |
13 | diff --git a/Makefile b/Makefile |
14 | index c80dad45334e..1ab22a85118f 100644 |
15 | --- a/Makefile |
16 | +++ b/Makefile |
17 | @@ -1,6 +1,6 @@ |
18 | VERSION = 4 |
19 | PATCHLEVEL = 9 |
20 | -SUBLEVEL = 185 |
21 | +SUBLEVEL = 186 |
22 | EXTRAVERSION = |
23 | NAME = Roaring Lionus |
24 | |
25 | diff --git a/arch/arc/kernel/unwind.c b/arch/arc/kernel/unwind.c |
26 | index 61fd1ce63c56..6bb9f8ea9291 100644 |
27 | --- a/arch/arc/kernel/unwind.c |
28 | +++ b/arch/arc/kernel/unwind.c |
29 | @@ -185,11 +185,6 @@ static void *__init unw_hdr_alloc_early(unsigned long sz) |
30 | MAX_DMA_ADDRESS); |
31 | } |
32 | |
33 | -static void *unw_hdr_alloc(unsigned long sz) |
34 | -{ |
35 | - return kmalloc(sz, GFP_KERNEL); |
36 | -} |
37 | - |
38 | static void init_unwind_table(struct unwind_table *table, const char *name, |
39 | const void *core_start, unsigned long core_size, |
40 | const void *init_start, unsigned long init_size, |
41 | @@ -370,6 +365,10 @@ ret_err: |
42 | } |
43 | |
44 | #ifdef CONFIG_MODULES |
45 | +static void *unw_hdr_alloc(unsigned long sz) |
46 | +{ |
47 | + return kmalloc(sz, GFP_KERNEL); |
48 | +} |
49 | |
50 | static struct unwind_table *last_table; |
51 | |
52 | diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi |
53 | index 7839300fe46b..200d9082caa4 100644 |
54 | --- a/arch/arm/boot/dts/imx6ul.dtsi |
55 | +++ b/arch/arm/boot/dts/imx6ul.dtsi |
56 | @@ -332,7 +332,7 @@ |
57 | pwm1: pwm@02080000 { |
58 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; |
59 | reg = <0x02080000 0x4000>; |
60 | - interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>; |
61 | + interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>; |
62 | clocks = <&clks IMX6UL_CLK_PWM1>, |
63 | <&clks IMX6UL_CLK_PWM1>; |
64 | clock-names = "ipg", "per"; |
65 | @@ -343,7 +343,7 @@ |
66 | pwm2: pwm@02084000 { |
67 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; |
68 | reg = <0x02084000 0x4000>; |
69 | - interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>; |
70 | + interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>; |
71 | clocks = <&clks IMX6UL_CLK_PWM2>, |
72 | <&clks IMX6UL_CLK_PWM2>; |
73 | clock-names = "ipg", "per"; |
74 | @@ -354,7 +354,7 @@ |
75 | pwm3: pwm@02088000 { |
76 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; |
77 | reg = <0x02088000 0x4000>; |
78 | - interrupts = <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>; |
79 | + interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>; |
80 | clocks = <&clks IMX6UL_CLK_PWM3>, |
81 | <&clks IMX6UL_CLK_PWM3>; |
82 | clock-names = "ipg", "per"; |
83 | @@ -365,7 +365,7 @@ |
84 | pwm4: pwm@0208c000 { |
85 | compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm"; |
86 | reg = <0x0208c000 0x4000>; |
87 | - interrupts = <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>; |
88 | + interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>; |
89 | clocks = <&clks IMX6UL_CLK_PWM4>, |
90 | <&clks IMX6UL_CLK_PWM4>; |
91 | clock-names = "ipg", "per"; |
92 | diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c |
93 | index 8e4539f69fdc..3bdf0d588238 100644 |
94 | --- a/arch/arm/mach-davinci/board-da850-evm.c |
95 | +++ b/arch/arm/mach-davinci/board-da850-evm.c |
96 | @@ -1479,6 +1479,8 @@ static __init void da850_evm_init(void) |
97 | if (ret) |
98 | pr_warn("%s: dsp/rproc registration failed: %d\n", |
99 | __func__, ret); |
100 | + |
101 | + regulator_has_full_constraints(); |
102 | } |
103 | |
104 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
105 | diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c |
106 | index 9a22d40602aa..24779504f489 100644 |
107 | --- a/arch/arm/mach-davinci/devices-da8xx.c |
108 | +++ b/arch/arm/mach-davinci/devices-da8xx.c |
109 | @@ -706,6 +706,9 @@ static struct platform_device da8xx_lcdc_device = { |
110 | .id = 0, |
111 | .num_resources = ARRAY_SIZE(da8xx_lcdc_resources), |
112 | .resource = da8xx_lcdc_resources, |
113 | + .dev = { |
114 | + .coherent_dma_mask = DMA_BIT_MASK(32), |
115 | + } |
116 | }; |
117 | |
118 | int __init da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata) |
119 | diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c |
120 | index 718981bb80cd..0aec48c1736b 100644 |
121 | --- a/arch/arm/mach-omap2/prm3xxx.c |
122 | +++ b/arch/arm/mach-omap2/prm3xxx.c |
123 | @@ -433,7 +433,7 @@ static void omap3_prm_reconfigure_io_chain(void) |
124 | * registers, and omap3xxx_prm_reconfigure_io_chain() must be called. |
125 | * No return value. |
126 | */ |
127 | -static void __init omap3xxx_prm_enable_io_wakeup(void) |
128 | +static void omap3xxx_prm_enable_io_wakeup(void) |
129 | { |
130 | if (prm_features & PRM_HAS_IO_WAKEUP) |
131 | omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, |
132 | diff --git a/arch/arm64/crypto/sha256-core.S b/arch/arm64/crypto/sha256-core.S |
133 | deleted file mode 100644 |
134 | index 3ce82cc860bc..000000000000 |
135 | --- a/arch/arm64/crypto/sha256-core.S |
136 | +++ /dev/null |
137 | @@ -1,2061 +0,0 @@ |
138 | -// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. |
139 | -// |
140 | -// Licensed under the OpenSSL license (the "License"). You may not use |
141 | -// this file except in compliance with the License. You can obtain a copy |
142 | -// in the file LICENSE in the source distribution or at |
143 | -// https://www.openssl.org/source/license.html |
144 | - |
145 | -// ==================================================================== |
146 | -// Written by Andy Polyakov <appro@openssl.org> for the OpenSSL |
147 | -// project. The module is, however, dual licensed under OpenSSL and |
148 | -// CRYPTOGAMS licenses depending on where you obtain it. For further |
149 | -// details see http://www.openssl.org/~appro/cryptogams/. |
150 | -// |
151 | -// Permission to use under GPLv2 terms is granted. |
152 | -// ==================================================================== |
153 | -// |
154 | -// SHA256/512 for ARMv8. |
155 | -// |
156 | -// Performance in cycles per processed byte and improvement coefficient |
157 | -// over code generated with "default" compiler: |
158 | -// |
159 | -// SHA256-hw SHA256(*) SHA512 |
160 | -// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) |
161 | -// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) |
162 | -// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) |
163 | -// Denver 2.01 10.5 (+26%) 6.70 (+8%) |
164 | -// X-Gene 20.0 (+100%) 12.8 (+300%(***)) |
165 | -// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) |
166 | -// |
167 | -// (*) Software SHA256 results are of lesser relevance, presented |
168 | -// mostly for informational purposes. |
169 | -// (**) The result is a trade-off: it's possible to improve it by |
170 | -// 10% (or by 1 cycle per round), but at the cost of 20% loss |
171 | -// on Cortex-A53 (or by 4 cycles per round). |
172 | -// (***) Super-impressive coefficients over gcc-generated code are |
173 | -// indication of some compiler "pathology", most notably code |
174 | -// generated with -mgeneral-regs-only is significanty faster |
175 | -// and the gap is only 40-90%. |
176 | -// |
177 | -// October 2016. |
178 | -// |
179 | -// Originally it was reckoned that it makes no sense to implement NEON |
180 | -// version of SHA256 for 64-bit processors. This is because performance |
181 | -// improvement on most wide-spread Cortex-A5x processors was observed |
182 | -// to be marginal, same on Cortex-A53 and ~10% on A57. But then it was |
183 | -// observed that 32-bit NEON SHA256 performs significantly better than |
184 | -// 64-bit scalar version on *some* of the more recent processors. As |
185 | -// result 64-bit NEON version of SHA256 was added to provide best |
186 | -// all-round performance. For example it executes ~30% faster on X-Gene |
187 | -// and Mongoose. [For reference, NEON version of SHA512 is bound to |
188 | -// deliver much less improvement, likely *negative* on Cortex-A5x. |
189 | -// Which is why NEON support is limited to SHA256.] |
190 | - |
191 | -#ifndef __KERNEL__ |
192 | -# include "arm_arch.h" |
193 | -#endif |
194 | - |
195 | -.text |
196 | - |
197 | -.extern OPENSSL_armcap_P |
198 | -.globl sha256_block_data_order |
199 | -.type sha256_block_data_order,%function |
200 | -.align 6 |
201 | -sha256_block_data_order: |
202 | -#ifndef __KERNEL__ |
203 | -# ifdef __ILP32__ |
204 | - ldrsw x16,.LOPENSSL_armcap_P |
205 | -# else |
206 | - ldr x16,.LOPENSSL_armcap_P |
207 | -# endif |
208 | - adr x17,.LOPENSSL_armcap_P |
209 | - add x16,x16,x17 |
210 | - ldr w16,[x16] |
211 | - tst w16,#ARMV8_SHA256 |
212 | - b.ne .Lv8_entry |
213 | - tst w16,#ARMV7_NEON |
214 | - b.ne .Lneon_entry |
215 | -#endif |
216 | - stp x29,x30,[sp,#-128]! |
217 | - add x29,sp,#0 |
218 | - |
219 | - stp x19,x20,[sp,#16] |
220 | - stp x21,x22,[sp,#32] |
221 | - stp x23,x24,[sp,#48] |
222 | - stp x25,x26,[sp,#64] |
223 | - stp x27,x28,[sp,#80] |
224 | - sub sp,sp,#4*4 |
225 | - |
226 | - ldp w20,w21,[x0] // load context |
227 | - ldp w22,w23,[x0,#2*4] |
228 | - ldp w24,w25,[x0,#4*4] |
229 | - add x2,x1,x2,lsl#6 // end of input |
230 | - ldp w26,w27,[x0,#6*4] |
231 | - adr x30,.LK256 |
232 | - stp x0,x2,[x29,#96] |
233 | - |
234 | -.Loop: |
235 | - ldp w3,w4,[x1],#2*4 |
236 | - ldr w19,[x30],#4 // *K++ |
237 | - eor w28,w21,w22 // magic seed |
238 | - str x1,[x29,#112] |
239 | -#ifndef __AARCH64EB__ |
240 | - rev w3,w3 // 0 |
241 | -#endif |
242 | - ror w16,w24,#6 |
243 | - add w27,w27,w19 // h+=K[i] |
244 | - eor w6,w24,w24,ror#14 |
245 | - and w17,w25,w24 |
246 | - bic w19,w26,w24 |
247 | - add w27,w27,w3 // h+=X[i] |
248 | - orr w17,w17,w19 // Ch(e,f,g) |
249 | - eor w19,w20,w21 // a^b, b^c in next round |
250 | - eor w16,w16,w6,ror#11 // Sigma1(e) |
251 | - ror w6,w20,#2 |
252 | - add w27,w27,w17 // h+=Ch(e,f,g) |
253 | - eor w17,w20,w20,ror#9 |
254 | - add w27,w27,w16 // h+=Sigma1(e) |
255 | - and w28,w28,w19 // (b^c)&=(a^b) |
256 | - add w23,w23,w27 // d+=h |
257 | - eor w28,w28,w21 // Maj(a,b,c) |
258 | - eor w17,w6,w17,ror#13 // Sigma0(a) |
259 | - add w27,w27,w28 // h+=Maj(a,b,c) |
260 | - ldr w28,[x30],#4 // *K++, w19 in next round |
261 | - //add w27,w27,w17 // h+=Sigma0(a) |
262 | -#ifndef __AARCH64EB__ |
263 | - rev w4,w4 // 1 |
264 | -#endif |
265 | - ldp w5,w6,[x1],#2*4 |
266 | - add w27,w27,w17 // h+=Sigma0(a) |
267 | - ror w16,w23,#6 |
268 | - add w26,w26,w28 // h+=K[i] |
269 | - eor w7,w23,w23,ror#14 |
270 | - and w17,w24,w23 |
271 | - bic w28,w25,w23 |
272 | - add w26,w26,w4 // h+=X[i] |
273 | - orr w17,w17,w28 // Ch(e,f,g) |
274 | - eor w28,w27,w20 // a^b, b^c in next round |
275 | - eor w16,w16,w7,ror#11 // Sigma1(e) |
276 | - ror w7,w27,#2 |
277 | - add w26,w26,w17 // h+=Ch(e,f,g) |
278 | - eor w17,w27,w27,ror#9 |
279 | - add w26,w26,w16 // h+=Sigma1(e) |
280 | - and w19,w19,w28 // (b^c)&=(a^b) |
281 | - add w22,w22,w26 // d+=h |
282 | - eor w19,w19,w20 // Maj(a,b,c) |
283 | - eor w17,w7,w17,ror#13 // Sigma0(a) |
284 | - add w26,w26,w19 // h+=Maj(a,b,c) |
285 | - ldr w19,[x30],#4 // *K++, w28 in next round |
286 | - //add w26,w26,w17 // h+=Sigma0(a) |
287 | -#ifndef __AARCH64EB__ |
288 | - rev w5,w5 // 2 |
289 | -#endif |
290 | - add w26,w26,w17 // h+=Sigma0(a) |
291 | - ror w16,w22,#6 |
292 | - add w25,w25,w19 // h+=K[i] |
293 | - eor w8,w22,w22,ror#14 |
294 | - and w17,w23,w22 |
295 | - bic w19,w24,w22 |
296 | - add w25,w25,w5 // h+=X[i] |
297 | - orr w17,w17,w19 // Ch(e,f,g) |
298 | - eor w19,w26,w27 // a^b, b^c in next round |
299 | - eor w16,w16,w8,ror#11 // Sigma1(e) |
300 | - ror w8,w26,#2 |
301 | - add w25,w25,w17 // h+=Ch(e,f,g) |
302 | - eor w17,w26,w26,ror#9 |
303 | - add w25,w25,w16 // h+=Sigma1(e) |
304 | - and w28,w28,w19 // (b^c)&=(a^b) |
305 | - add w21,w21,w25 // d+=h |
306 | - eor w28,w28,w27 // Maj(a,b,c) |
307 | - eor w17,w8,w17,ror#13 // Sigma0(a) |
308 | - add w25,w25,w28 // h+=Maj(a,b,c) |
309 | - ldr w28,[x30],#4 // *K++, w19 in next round |
310 | - //add w25,w25,w17 // h+=Sigma0(a) |
311 | -#ifndef __AARCH64EB__ |
312 | - rev w6,w6 // 3 |
313 | -#endif |
314 | - ldp w7,w8,[x1],#2*4 |
315 | - add w25,w25,w17 // h+=Sigma0(a) |
316 | - ror w16,w21,#6 |
317 | - add w24,w24,w28 // h+=K[i] |
318 | - eor w9,w21,w21,ror#14 |
319 | - and w17,w22,w21 |
320 | - bic w28,w23,w21 |
321 | - add w24,w24,w6 // h+=X[i] |
322 | - orr w17,w17,w28 // Ch(e,f,g) |
323 | - eor w28,w25,w26 // a^b, b^c in next round |
324 | - eor w16,w16,w9,ror#11 // Sigma1(e) |
325 | - ror w9,w25,#2 |
326 | - add w24,w24,w17 // h+=Ch(e,f,g) |
327 | - eor w17,w25,w25,ror#9 |
328 | - add w24,w24,w16 // h+=Sigma1(e) |
329 | - and w19,w19,w28 // (b^c)&=(a^b) |
330 | - add w20,w20,w24 // d+=h |
331 | - eor w19,w19,w26 // Maj(a,b,c) |
332 | - eor w17,w9,w17,ror#13 // Sigma0(a) |
333 | - add w24,w24,w19 // h+=Maj(a,b,c) |
334 | - ldr w19,[x30],#4 // *K++, w28 in next round |
335 | - //add w24,w24,w17 // h+=Sigma0(a) |
336 | -#ifndef __AARCH64EB__ |
337 | - rev w7,w7 // 4 |
338 | -#endif |
339 | - add w24,w24,w17 // h+=Sigma0(a) |
340 | - ror w16,w20,#6 |
341 | - add w23,w23,w19 // h+=K[i] |
342 | - eor w10,w20,w20,ror#14 |
343 | - and w17,w21,w20 |
344 | - bic w19,w22,w20 |
345 | - add w23,w23,w7 // h+=X[i] |
346 | - orr w17,w17,w19 // Ch(e,f,g) |
347 | - eor w19,w24,w25 // a^b, b^c in next round |
348 | - eor w16,w16,w10,ror#11 // Sigma1(e) |
349 | - ror w10,w24,#2 |
350 | - add w23,w23,w17 // h+=Ch(e,f,g) |
351 | - eor w17,w24,w24,ror#9 |
352 | - add w23,w23,w16 // h+=Sigma1(e) |
353 | - and w28,w28,w19 // (b^c)&=(a^b) |
354 | - add w27,w27,w23 // d+=h |
355 | - eor w28,w28,w25 // Maj(a,b,c) |
356 | - eor w17,w10,w17,ror#13 // Sigma0(a) |
357 | - add w23,w23,w28 // h+=Maj(a,b,c) |
358 | - ldr w28,[x30],#4 // *K++, w19 in next round |
359 | - //add w23,w23,w17 // h+=Sigma0(a) |
360 | -#ifndef __AARCH64EB__ |
361 | - rev w8,w8 // 5 |
362 | -#endif |
363 | - ldp w9,w10,[x1],#2*4 |
364 | - add w23,w23,w17 // h+=Sigma0(a) |
365 | - ror w16,w27,#6 |
366 | - add w22,w22,w28 // h+=K[i] |
367 | - eor w11,w27,w27,ror#14 |
368 | - and w17,w20,w27 |
369 | - bic w28,w21,w27 |
370 | - add w22,w22,w8 // h+=X[i] |
371 | - orr w17,w17,w28 // Ch(e,f,g) |
372 | - eor w28,w23,w24 // a^b, b^c in next round |
373 | - eor w16,w16,w11,ror#11 // Sigma1(e) |
374 | - ror w11,w23,#2 |
375 | - add w22,w22,w17 // h+=Ch(e,f,g) |
376 | - eor w17,w23,w23,ror#9 |
377 | - add w22,w22,w16 // h+=Sigma1(e) |
378 | - and w19,w19,w28 // (b^c)&=(a^b) |
379 | - add w26,w26,w22 // d+=h |
380 | - eor w19,w19,w24 // Maj(a,b,c) |
381 | - eor w17,w11,w17,ror#13 // Sigma0(a) |
382 | - add w22,w22,w19 // h+=Maj(a,b,c) |
383 | - ldr w19,[x30],#4 // *K++, w28 in next round |
384 | - //add w22,w22,w17 // h+=Sigma0(a) |
385 | -#ifndef __AARCH64EB__ |
386 | - rev w9,w9 // 6 |
387 | -#endif |
388 | - add w22,w22,w17 // h+=Sigma0(a) |
389 | - ror w16,w26,#6 |
390 | - add w21,w21,w19 // h+=K[i] |
391 | - eor w12,w26,w26,ror#14 |
392 | - and w17,w27,w26 |
393 | - bic w19,w20,w26 |
394 | - add w21,w21,w9 // h+=X[i] |
395 | - orr w17,w17,w19 // Ch(e,f,g) |
396 | - eor w19,w22,w23 // a^b, b^c in next round |
397 | - eor w16,w16,w12,ror#11 // Sigma1(e) |
398 | - ror w12,w22,#2 |
399 | - add w21,w21,w17 // h+=Ch(e,f,g) |
400 | - eor w17,w22,w22,ror#9 |
401 | - add w21,w21,w16 // h+=Sigma1(e) |
402 | - and w28,w28,w19 // (b^c)&=(a^b) |
403 | - add w25,w25,w21 // d+=h |
404 | - eor w28,w28,w23 // Maj(a,b,c) |
405 | - eor w17,w12,w17,ror#13 // Sigma0(a) |
406 | - add w21,w21,w28 // h+=Maj(a,b,c) |
407 | - ldr w28,[x30],#4 // *K++, w19 in next round |
408 | - //add w21,w21,w17 // h+=Sigma0(a) |
409 | -#ifndef __AARCH64EB__ |
410 | - rev w10,w10 // 7 |
411 | -#endif |
412 | - ldp w11,w12,[x1],#2*4 |
413 | - add w21,w21,w17 // h+=Sigma0(a) |
414 | - ror w16,w25,#6 |
415 | - add w20,w20,w28 // h+=K[i] |
416 | - eor w13,w25,w25,ror#14 |
417 | - and w17,w26,w25 |
418 | - bic w28,w27,w25 |
419 | - add w20,w20,w10 // h+=X[i] |
420 | - orr w17,w17,w28 // Ch(e,f,g) |
421 | - eor w28,w21,w22 // a^b, b^c in next round |
422 | - eor w16,w16,w13,ror#11 // Sigma1(e) |
423 | - ror w13,w21,#2 |
424 | - add w20,w20,w17 // h+=Ch(e,f,g) |
425 | - eor w17,w21,w21,ror#9 |
426 | - add w20,w20,w16 // h+=Sigma1(e) |
427 | - and w19,w19,w28 // (b^c)&=(a^b) |
428 | - add w24,w24,w20 // d+=h |
429 | - eor w19,w19,w22 // Maj(a,b,c) |
430 | - eor w17,w13,w17,ror#13 // Sigma0(a) |
431 | - add w20,w20,w19 // h+=Maj(a,b,c) |
432 | - ldr w19,[x30],#4 // *K++, w28 in next round |
433 | - //add w20,w20,w17 // h+=Sigma0(a) |
434 | -#ifndef __AARCH64EB__ |
435 | - rev w11,w11 // 8 |
436 | -#endif |
437 | - add w20,w20,w17 // h+=Sigma0(a) |
438 | - ror w16,w24,#6 |
439 | - add w27,w27,w19 // h+=K[i] |
440 | - eor w14,w24,w24,ror#14 |
441 | - and w17,w25,w24 |
442 | - bic w19,w26,w24 |
443 | - add w27,w27,w11 // h+=X[i] |
444 | - orr w17,w17,w19 // Ch(e,f,g) |
445 | - eor w19,w20,w21 // a^b, b^c in next round |
446 | - eor w16,w16,w14,ror#11 // Sigma1(e) |
447 | - ror w14,w20,#2 |
448 | - add w27,w27,w17 // h+=Ch(e,f,g) |
449 | - eor w17,w20,w20,ror#9 |
450 | - add w27,w27,w16 // h+=Sigma1(e) |
451 | - and w28,w28,w19 // (b^c)&=(a^b) |
452 | - add w23,w23,w27 // d+=h |
453 | - eor w28,w28,w21 // Maj(a,b,c) |
454 | - eor w17,w14,w17,ror#13 // Sigma0(a) |
455 | - add w27,w27,w28 // h+=Maj(a,b,c) |
456 | - ldr w28,[x30],#4 // *K++, w19 in next round |
457 | - //add w27,w27,w17 // h+=Sigma0(a) |
458 | -#ifndef __AARCH64EB__ |
459 | - rev w12,w12 // 9 |
460 | -#endif |
461 | - ldp w13,w14,[x1],#2*4 |
462 | - add w27,w27,w17 // h+=Sigma0(a) |
463 | - ror w16,w23,#6 |
464 | - add w26,w26,w28 // h+=K[i] |
465 | - eor w15,w23,w23,ror#14 |
466 | - and w17,w24,w23 |
467 | - bic w28,w25,w23 |
468 | - add w26,w26,w12 // h+=X[i] |
469 | - orr w17,w17,w28 // Ch(e,f,g) |
470 | - eor w28,w27,w20 // a^b, b^c in next round |
471 | - eor w16,w16,w15,ror#11 // Sigma1(e) |
472 | - ror w15,w27,#2 |
473 | - add w26,w26,w17 // h+=Ch(e,f,g) |
474 | - eor w17,w27,w27,ror#9 |
475 | - add w26,w26,w16 // h+=Sigma1(e) |
476 | - and w19,w19,w28 // (b^c)&=(a^b) |
477 | - add w22,w22,w26 // d+=h |
478 | - eor w19,w19,w20 // Maj(a,b,c) |
479 | - eor w17,w15,w17,ror#13 // Sigma0(a) |
480 | - add w26,w26,w19 // h+=Maj(a,b,c) |
481 | - ldr w19,[x30],#4 // *K++, w28 in next round |
482 | - //add w26,w26,w17 // h+=Sigma0(a) |
483 | -#ifndef __AARCH64EB__ |
484 | - rev w13,w13 // 10 |
485 | -#endif |
486 | - add w26,w26,w17 // h+=Sigma0(a) |
487 | - ror w16,w22,#6 |
488 | - add w25,w25,w19 // h+=K[i] |
489 | - eor w0,w22,w22,ror#14 |
490 | - and w17,w23,w22 |
491 | - bic w19,w24,w22 |
492 | - add w25,w25,w13 // h+=X[i] |
493 | - orr w17,w17,w19 // Ch(e,f,g) |
494 | - eor w19,w26,w27 // a^b, b^c in next round |
495 | - eor w16,w16,w0,ror#11 // Sigma1(e) |
496 | - ror w0,w26,#2 |
497 | - add w25,w25,w17 // h+=Ch(e,f,g) |
498 | - eor w17,w26,w26,ror#9 |
499 | - add w25,w25,w16 // h+=Sigma1(e) |
500 | - and w28,w28,w19 // (b^c)&=(a^b) |
501 | - add w21,w21,w25 // d+=h |
502 | - eor w28,w28,w27 // Maj(a,b,c) |
503 | - eor w17,w0,w17,ror#13 // Sigma0(a) |
504 | - add w25,w25,w28 // h+=Maj(a,b,c) |
505 | - ldr w28,[x30],#4 // *K++, w19 in next round |
506 | - //add w25,w25,w17 // h+=Sigma0(a) |
507 | -#ifndef __AARCH64EB__ |
508 | - rev w14,w14 // 11 |
509 | -#endif |
510 | - ldp w15,w0,[x1],#2*4 |
511 | - add w25,w25,w17 // h+=Sigma0(a) |
512 | - str w6,[sp,#12] |
513 | - ror w16,w21,#6 |
514 | - add w24,w24,w28 // h+=K[i] |
515 | - eor w6,w21,w21,ror#14 |
516 | - and w17,w22,w21 |
517 | - bic w28,w23,w21 |
518 | - add w24,w24,w14 // h+=X[i] |
519 | - orr w17,w17,w28 // Ch(e,f,g) |
520 | - eor w28,w25,w26 // a^b, b^c in next round |
521 | - eor w16,w16,w6,ror#11 // Sigma1(e) |
522 | - ror w6,w25,#2 |
523 | - add w24,w24,w17 // h+=Ch(e,f,g) |
524 | - eor w17,w25,w25,ror#9 |
525 | - add w24,w24,w16 // h+=Sigma1(e) |
526 | - and w19,w19,w28 // (b^c)&=(a^b) |
527 | - add w20,w20,w24 // d+=h |
528 | - eor w19,w19,w26 // Maj(a,b,c) |
529 | - eor w17,w6,w17,ror#13 // Sigma0(a) |
530 | - add w24,w24,w19 // h+=Maj(a,b,c) |
531 | - ldr w19,[x30],#4 // *K++, w28 in next round |
532 | - //add w24,w24,w17 // h+=Sigma0(a) |
533 | -#ifndef __AARCH64EB__ |
534 | - rev w15,w15 // 12 |
535 | -#endif |
536 | - add w24,w24,w17 // h+=Sigma0(a) |
537 | - str w7,[sp,#0] |
538 | - ror w16,w20,#6 |
539 | - add w23,w23,w19 // h+=K[i] |
540 | - eor w7,w20,w20,ror#14 |
541 | - and w17,w21,w20 |
542 | - bic w19,w22,w20 |
543 | - add w23,w23,w15 // h+=X[i] |
544 | - orr w17,w17,w19 // Ch(e,f,g) |
545 | - eor w19,w24,w25 // a^b, b^c in next round |
546 | - eor w16,w16,w7,ror#11 // Sigma1(e) |
547 | - ror w7,w24,#2 |
548 | - add w23,w23,w17 // h+=Ch(e,f,g) |
549 | - eor w17,w24,w24,ror#9 |
550 | - add w23,w23,w16 // h+=Sigma1(e) |
551 | - and w28,w28,w19 // (b^c)&=(a^b) |
552 | - add w27,w27,w23 // d+=h |
553 | - eor w28,w28,w25 // Maj(a,b,c) |
554 | - eor w17,w7,w17,ror#13 // Sigma0(a) |
555 | - add w23,w23,w28 // h+=Maj(a,b,c) |
556 | - ldr w28,[x30],#4 // *K++, w19 in next round |
557 | - //add w23,w23,w17 // h+=Sigma0(a) |
558 | -#ifndef __AARCH64EB__ |
559 | - rev w0,w0 // 13 |
560 | -#endif |
561 | - ldp w1,w2,[x1] |
562 | - add w23,w23,w17 // h+=Sigma0(a) |
563 | - str w8,[sp,#4] |
564 | - ror w16,w27,#6 |
565 | - add w22,w22,w28 // h+=K[i] |
566 | - eor w8,w27,w27,ror#14 |
567 | - and w17,w20,w27 |
568 | - bic w28,w21,w27 |
569 | - add w22,w22,w0 // h+=X[i] |
570 | - orr w17,w17,w28 // Ch(e,f,g) |
571 | - eor w28,w23,w24 // a^b, b^c in next round |
572 | - eor w16,w16,w8,ror#11 // Sigma1(e) |
573 | - ror w8,w23,#2 |
574 | - add w22,w22,w17 // h+=Ch(e,f,g) |
575 | - eor w17,w23,w23,ror#9 |
576 | - add w22,w22,w16 // h+=Sigma1(e) |
577 | - and w19,w19,w28 // (b^c)&=(a^b) |
578 | - add w26,w26,w22 // d+=h |
579 | - eor w19,w19,w24 // Maj(a,b,c) |
580 | - eor w17,w8,w17,ror#13 // Sigma0(a) |
581 | - add w22,w22,w19 // h+=Maj(a,b,c) |
582 | - ldr w19,[x30],#4 // *K++, w28 in next round |
583 | - //add w22,w22,w17 // h+=Sigma0(a) |
584 | -#ifndef __AARCH64EB__ |
585 | - rev w1,w1 // 14 |
586 | -#endif |
587 | - ldr w6,[sp,#12] |
588 | - add w22,w22,w17 // h+=Sigma0(a) |
589 | - str w9,[sp,#8] |
590 | - ror w16,w26,#6 |
591 | - add w21,w21,w19 // h+=K[i] |
592 | - eor w9,w26,w26,ror#14 |
593 | - and w17,w27,w26 |
594 | - bic w19,w20,w26 |
595 | - add w21,w21,w1 // h+=X[i] |
596 | - orr w17,w17,w19 // Ch(e,f,g) |
597 | - eor w19,w22,w23 // a^b, b^c in next round |
598 | - eor w16,w16,w9,ror#11 // Sigma1(e) |
599 | - ror w9,w22,#2 |
600 | - add w21,w21,w17 // h+=Ch(e,f,g) |
601 | - eor w17,w22,w22,ror#9 |
602 | - add w21,w21,w16 // h+=Sigma1(e) |
603 | - and w28,w28,w19 // (b^c)&=(a^b) |
604 | - add w25,w25,w21 // d+=h |
605 | - eor w28,w28,w23 // Maj(a,b,c) |
606 | - eor w17,w9,w17,ror#13 // Sigma0(a) |
607 | - add w21,w21,w28 // h+=Maj(a,b,c) |
608 | - ldr w28,[x30],#4 // *K++, w19 in next round |
609 | - //add w21,w21,w17 // h+=Sigma0(a) |
610 | -#ifndef __AARCH64EB__ |
611 | - rev w2,w2 // 15 |
612 | -#endif |
613 | - ldr w7,[sp,#0] |
614 | - add w21,w21,w17 // h+=Sigma0(a) |
615 | - str w10,[sp,#12] |
616 | - ror w16,w25,#6 |
617 | - add w20,w20,w28 // h+=K[i] |
618 | - ror w9,w4,#7 |
619 | - and w17,w26,w25 |
620 | - ror w8,w1,#17 |
621 | - bic w28,w27,w25 |
622 | - ror w10,w21,#2 |
623 | - add w20,w20,w2 // h+=X[i] |
624 | - eor w16,w16,w25,ror#11 |
625 | - eor w9,w9,w4,ror#18 |
626 | - orr w17,w17,w28 // Ch(e,f,g) |
627 | - eor w28,w21,w22 // a^b, b^c in next round |
628 | - eor w16,w16,w25,ror#25 // Sigma1(e) |
629 | - eor w10,w10,w21,ror#13 |
630 | - add w20,w20,w17 // h+=Ch(e,f,g) |
631 | - and w19,w19,w28 // (b^c)&=(a^b) |
632 | - eor w8,w8,w1,ror#19 |
633 | - eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) |
634 | - add w20,w20,w16 // h+=Sigma1(e) |
635 | - eor w19,w19,w22 // Maj(a,b,c) |
636 | - eor w17,w10,w21,ror#22 // Sigma0(a) |
637 | - eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) |
638 | - add w3,w3,w12 |
639 | - add w24,w24,w20 // d+=h |
640 | - add w20,w20,w19 // h+=Maj(a,b,c) |
641 | - ldr w19,[x30],#4 // *K++, w28 in next round |
642 | - add w3,w3,w9 |
643 | - add w20,w20,w17 // h+=Sigma0(a) |
644 | - add w3,w3,w8 |
645 | -.Loop_16_xx: |
646 | - ldr w8,[sp,#4] |
647 | - str w11,[sp,#0] |
648 | - ror w16,w24,#6 |
649 | - add w27,w27,w19 // h+=K[i] |
650 | - ror w10,w5,#7 |
651 | - and w17,w25,w24 |
652 | - ror w9,w2,#17 |
653 | - bic w19,w26,w24 |
654 | - ror w11,w20,#2 |
655 | - add w27,w27,w3 // h+=X[i] |
656 | - eor w16,w16,w24,ror#11 |
657 | - eor w10,w10,w5,ror#18 |
658 | - orr w17,w17,w19 // Ch(e,f,g) |
659 | - eor w19,w20,w21 // a^b, b^c in next round |
660 | - eor w16,w16,w24,ror#25 // Sigma1(e) |
661 | - eor w11,w11,w20,ror#13 |
662 | - add w27,w27,w17 // h+=Ch(e,f,g) |
663 | - and w28,w28,w19 // (b^c)&=(a^b) |
664 | - eor w9,w9,w2,ror#19 |
665 | - eor w10,w10,w5,lsr#3 // sigma0(X[i+1]) |
666 | - add w27,w27,w16 // h+=Sigma1(e) |
667 | - eor w28,w28,w21 // Maj(a,b,c) |
668 | - eor w17,w11,w20,ror#22 // Sigma0(a) |
669 | - eor w9,w9,w2,lsr#10 // sigma1(X[i+14]) |
670 | - add w4,w4,w13 |
671 | - add w23,w23,w27 // d+=h |
672 | - add w27,w27,w28 // h+=Maj(a,b,c) |
673 | - ldr w28,[x30],#4 // *K++, w19 in next round |
674 | - add w4,w4,w10 |
675 | - add w27,w27,w17 // h+=Sigma0(a) |
676 | - add w4,w4,w9 |
677 | - ldr w9,[sp,#8] |
678 | - str w12,[sp,#4] |
679 | - ror w16,w23,#6 |
680 | - add w26,w26,w28 // h+=K[i] |
681 | - ror w11,w6,#7 |
682 | - and w17,w24,w23 |
683 | - ror w10,w3,#17 |
684 | - bic w28,w25,w23 |
685 | - ror w12,w27,#2 |
686 | - add w26,w26,w4 // h+=X[i] |
687 | - eor w16,w16,w23,ror#11 |
688 | - eor w11,w11,w6,ror#18 |
689 | - orr w17,w17,w28 // Ch(e,f,g) |
690 | - eor w28,w27,w20 // a^b, b^c in next round |
691 | - eor w16,w16,w23,ror#25 // Sigma1(e) |
692 | - eor w12,w12,w27,ror#13 |
693 | - add w26,w26,w17 // h+=Ch(e,f,g) |
694 | - and w19,w19,w28 // (b^c)&=(a^b) |
695 | - eor w10,w10,w3,ror#19 |
696 | - eor w11,w11,w6,lsr#3 // sigma0(X[i+1]) |
697 | - add w26,w26,w16 // h+=Sigma1(e) |
698 | - eor w19,w19,w20 // Maj(a,b,c) |
699 | - eor w17,w12,w27,ror#22 // Sigma0(a) |
700 | - eor w10,w10,w3,lsr#10 // sigma1(X[i+14]) |
701 | - add w5,w5,w14 |
702 | - add w22,w22,w26 // d+=h |
703 | - add w26,w26,w19 // h+=Maj(a,b,c) |
704 | - ldr w19,[x30],#4 // *K++, w28 in next round |
705 | - add w5,w5,w11 |
706 | - add w26,w26,w17 // h+=Sigma0(a) |
707 | - add w5,w5,w10 |
708 | - ldr w10,[sp,#12] |
709 | - str w13,[sp,#8] |
710 | - ror w16,w22,#6 |
711 | - add w25,w25,w19 // h+=K[i] |
712 | - ror w12,w7,#7 |
713 | - and w17,w23,w22 |
714 | - ror w11,w4,#17 |
715 | - bic w19,w24,w22 |
716 | - ror w13,w26,#2 |
717 | - add w25,w25,w5 // h+=X[i] |
718 | - eor w16,w16,w22,ror#11 |
719 | - eor w12,w12,w7,ror#18 |
720 | - orr w17,w17,w19 // Ch(e,f,g) |
721 | - eor w19,w26,w27 // a^b, b^c in next round |
722 | - eor w16,w16,w22,ror#25 // Sigma1(e) |
723 | - eor w13,w13,w26,ror#13 |
724 | - add w25,w25,w17 // h+=Ch(e,f,g) |
725 | - and w28,w28,w19 // (b^c)&=(a^b) |
726 | - eor w11,w11,w4,ror#19 |
727 | - eor w12,w12,w7,lsr#3 // sigma0(X[i+1]) |
728 | - add w25,w25,w16 // h+=Sigma1(e) |
729 | - eor w28,w28,w27 // Maj(a,b,c) |
730 | - eor w17,w13,w26,ror#22 // Sigma0(a) |
731 | - eor w11,w11,w4,lsr#10 // sigma1(X[i+14]) |
732 | - add w6,w6,w15 |
733 | - add w21,w21,w25 // d+=h |
734 | - add w25,w25,w28 // h+=Maj(a,b,c) |
735 | - ldr w28,[x30],#4 // *K++, w19 in next round |
736 | - add w6,w6,w12 |
737 | - add w25,w25,w17 // h+=Sigma0(a) |
738 | - add w6,w6,w11 |
739 | - ldr w11,[sp,#0] |
740 | - str w14,[sp,#12] |
741 | - ror w16,w21,#6 |
742 | - add w24,w24,w28 // h+=K[i] |
743 | - ror w13,w8,#7 |
744 | - and w17,w22,w21 |
745 | - ror w12,w5,#17 |
746 | - bic w28,w23,w21 |
747 | - ror w14,w25,#2 |
748 | - add w24,w24,w6 // h+=X[i] |
749 | - eor w16,w16,w21,ror#11 |
750 | - eor w13,w13,w8,ror#18 |
751 | - orr w17,w17,w28 // Ch(e,f,g) |
752 | - eor w28,w25,w26 // a^b, b^c in next round |
753 | - eor w16,w16,w21,ror#25 // Sigma1(e) |
754 | - eor w14,w14,w25,ror#13 |
755 | - add w24,w24,w17 // h+=Ch(e,f,g) |
756 | - and w19,w19,w28 // (b^c)&=(a^b) |
757 | - eor w12,w12,w5,ror#19 |
758 | - eor w13,w13,w8,lsr#3 // sigma0(X[i+1]) |
759 | - add w24,w24,w16 // h+=Sigma1(e) |
760 | - eor w19,w19,w26 // Maj(a,b,c) |
761 | - eor w17,w14,w25,ror#22 // Sigma0(a) |
762 | - eor w12,w12,w5,lsr#10 // sigma1(X[i+14]) |
763 | - add w7,w7,w0 |
764 | - add w20,w20,w24 // d+=h |
765 | - add w24,w24,w19 // h+=Maj(a,b,c) |
766 | - ldr w19,[x30],#4 // *K++, w28 in next round |
767 | - add w7,w7,w13 |
768 | - add w24,w24,w17 // h+=Sigma0(a) |
769 | - add w7,w7,w12 |
770 | - ldr w12,[sp,#4] |
771 | - str w15,[sp,#0] |
772 | - ror w16,w20,#6 |
773 | - add w23,w23,w19 // h+=K[i] |
774 | - ror w14,w9,#7 |
775 | - and w17,w21,w20 |
776 | - ror w13,w6,#17 |
777 | - bic w19,w22,w20 |
778 | - ror w15,w24,#2 |
779 | - add w23,w23,w7 // h+=X[i] |
780 | - eor w16,w16,w20,ror#11 |
781 | - eor w14,w14,w9,ror#18 |
782 | - orr w17,w17,w19 // Ch(e,f,g) |
783 | - eor w19,w24,w25 // a^b, b^c in next round |
784 | - eor w16,w16,w20,ror#25 // Sigma1(e) |
785 | - eor w15,w15,w24,ror#13 |
786 | - add w23,w23,w17 // h+=Ch(e,f,g) |
787 | - and w28,w28,w19 // (b^c)&=(a^b) |
788 | - eor w13,w13,w6,ror#19 |
789 | - eor w14,w14,w9,lsr#3 // sigma0(X[i+1]) |
790 | - add w23,w23,w16 // h+=Sigma1(e) |
791 | - eor w28,w28,w25 // Maj(a,b,c) |
792 | - eor w17,w15,w24,ror#22 // Sigma0(a) |
793 | - eor w13,w13,w6,lsr#10 // sigma1(X[i+14]) |
794 | - add w8,w8,w1 |
795 | - add w27,w27,w23 // d+=h |
796 | - add w23,w23,w28 // h+=Maj(a,b,c) |
797 | - ldr w28,[x30],#4 // *K++, w19 in next round |
798 | - add w8,w8,w14 |
799 | - add w23,w23,w17 // h+=Sigma0(a) |
800 | - add w8,w8,w13 |
801 | - ldr w13,[sp,#8] |
802 | - str w0,[sp,#4] |
803 | - ror w16,w27,#6 |
804 | - add w22,w22,w28 // h+=K[i] |
805 | - ror w15,w10,#7 |
806 | - and w17,w20,w27 |
807 | - ror w14,w7,#17 |
808 | - bic w28,w21,w27 |
809 | - ror w0,w23,#2 |
810 | - add w22,w22,w8 // h+=X[i] |
811 | - eor w16,w16,w27,ror#11 |
812 | - eor w15,w15,w10,ror#18 |
813 | - orr w17,w17,w28 // Ch(e,f,g) |
814 | - eor w28,w23,w24 // a^b, b^c in next round |
815 | - eor w16,w16,w27,ror#25 // Sigma1(e) |
816 | - eor w0,w0,w23,ror#13 |
817 | - add w22,w22,w17 // h+=Ch(e,f,g) |
818 | - and w19,w19,w28 // (b^c)&=(a^b) |
819 | - eor w14,w14,w7,ror#19 |
820 | - eor w15,w15,w10,lsr#3 // sigma0(X[i+1]) |
821 | - add w22,w22,w16 // h+=Sigma1(e) |
822 | - eor w19,w19,w24 // Maj(a,b,c) |
823 | - eor w17,w0,w23,ror#22 // Sigma0(a) |
824 | - eor w14,w14,w7,lsr#10 // sigma1(X[i+14]) |
825 | - add w9,w9,w2 |
826 | - add w26,w26,w22 // d+=h |
827 | - add w22,w22,w19 // h+=Maj(a,b,c) |
828 | - ldr w19,[x30],#4 // *K++, w28 in next round |
829 | - add w9,w9,w15 |
830 | - add w22,w22,w17 // h+=Sigma0(a) |
831 | - add w9,w9,w14 |
832 | - ldr w14,[sp,#12] |
833 | - str w1,[sp,#8] |
834 | - ror w16,w26,#6 |
835 | - add w21,w21,w19 // h+=K[i] |
836 | - ror w0,w11,#7 |
837 | - and w17,w27,w26 |
838 | - ror w15,w8,#17 |
839 | - bic w19,w20,w26 |
840 | - ror w1,w22,#2 |
841 | - add w21,w21,w9 // h+=X[i] |
842 | - eor w16,w16,w26,ror#11 |
843 | - eor w0,w0,w11,ror#18 |
844 | - orr w17,w17,w19 // Ch(e,f,g) |
845 | - eor w19,w22,w23 // a^b, b^c in next round |
846 | - eor w16,w16,w26,ror#25 // Sigma1(e) |
847 | - eor w1,w1,w22,ror#13 |
848 | - add w21,w21,w17 // h+=Ch(e,f,g) |
849 | - and w28,w28,w19 // (b^c)&=(a^b) |
850 | - eor w15,w15,w8,ror#19 |
851 | - eor w0,w0,w11,lsr#3 // sigma0(X[i+1]) |
852 | - add w21,w21,w16 // h+=Sigma1(e) |
853 | - eor w28,w28,w23 // Maj(a,b,c) |
854 | - eor w17,w1,w22,ror#22 // Sigma0(a) |
855 | - eor w15,w15,w8,lsr#10 // sigma1(X[i+14]) |
856 | - add w10,w10,w3 |
857 | - add w25,w25,w21 // d+=h |
858 | - add w21,w21,w28 // h+=Maj(a,b,c) |
859 | - ldr w28,[x30],#4 // *K++, w19 in next round |
860 | - add w10,w10,w0 |
861 | - add w21,w21,w17 // h+=Sigma0(a) |
862 | - add w10,w10,w15 |
863 | - ldr w15,[sp,#0] |
864 | - str w2,[sp,#12] |
865 | - ror w16,w25,#6 |
866 | - add w20,w20,w28 // h+=K[i] |
867 | - ror w1,w12,#7 |
868 | - and w17,w26,w25 |
869 | - ror w0,w9,#17 |
870 | - bic w28,w27,w25 |
871 | - ror w2,w21,#2 |
872 | - add w20,w20,w10 // h+=X[i] |
873 | - eor w16,w16,w25,ror#11 |
874 | - eor w1,w1,w12,ror#18 |
875 | - orr w17,w17,w28 // Ch(e,f,g) |
876 | - eor w28,w21,w22 // a^b, b^c in next round |
877 | - eor w16,w16,w25,ror#25 // Sigma1(e) |
878 | - eor w2,w2,w21,ror#13 |
879 | - add w20,w20,w17 // h+=Ch(e,f,g) |
880 | - and w19,w19,w28 // (b^c)&=(a^b) |
881 | - eor w0,w0,w9,ror#19 |
882 | - eor w1,w1,w12,lsr#3 // sigma0(X[i+1]) |
883 | - add w20,w20,w16 // h+=Sigma1(e) |
884 | - eor w19,w19,w22 // Maj(a,b,c) |
885 | - eor w17,w2,w21,ror#22 // Sigma0(a) |
886 | - eor w0,w0,w9,lsr#10 // sigma1(X[i+14]) |
887 | - add w11,w11,w4 |
888 | - add w24,w24,w20 // d+=h |
889 | - add w20,w20,w19 // h+=Maj(a,b,c) |
890 | - ldr w19,[x30],#4 // *K++, w28 in next round |
891 | - add w11,w11,w1 |
892 | - add w20,w20,w17 // h+=Sigma0(a) |
893 | - add w11,w11,w0 |
894 | - ldr w0,[sp,#4] |
895 | - str w3,[sp,#0] |
896 | - ror w16,w24,#6 |
897 | - add w27,w27,w19 // h+=K[i] |
898 | - ror w2,w13,#7 |
899 | - and w17,w25,w24 |
900 | - ror w1,w10,#17 |
901 | - bic w19,w26,w24 |
902 | - ror w3,w20,#2 |
903 | - add w27,w27,w11 // h+=X[i] |
904 | - eor w16,w16,w24,ror#11 |
905 | - eor w2,w2,w13,ror#18 |
906 | - orr w17,w17,w19 // Ch(e,f,g) |
907 | - eor w19,w20,w21 // a^b, b^c in next round |
908 | - eor w16,w16,w24,ror#25 // Sigma1(e) |
909 | - eor w3,w3,w20,ror#13 |
910 | - add w27,w27,w17 // h+=Ch(e,f,g) |
911 | - and w28,w28,w19 // (b^c)&=(a^b) |
912 | - eor w1,w1,w10,ror#19 |
913 | - eor w2,w2,w13,lsr#3 // sigma0(X[i+1]) |
914 | - add w27,w27,w16 // h+=Sigma1(e) |
915 | - eor w28,w28,w21 // Maj(a,b,c) |
916 | - eor w17,w3,w20,ror#22 // Sigma0(a) |
917 | - eor w1,w1,w10,lsr#10 // sigma1(X[i+14]) |
918 | - add w12,w12,w5 |
919 | - add w23,w23,w27 // d+=h |
920 | - add w27,w27,w28 // h+=Maj(a,b,c) |
921 | - ldr w28,[x30],#4 // *K++, w19 in next round |
922 | - add w12,w12,w2 |
923 | - add w27,w27,w17 // h+=Sigma0(a) |
924 | - add w12,w12,w1 |
925 | - ldr w1,[sp,#8] |
926 | - str w4,[sp,#4] |
927 | - ror w16,w23,#6 |
928 | - add w26,w26,w28 // h+=K[i] |
929 | - ror w3,w14,#7 |
930 | - and w17,w24,w23 |
931 | - ror w2,w11,#17 |
932 | - bic w28,w25,w23 |
933 | - ror w4,w27,#2 |
934 | - add w26,w26,w12 // h+=X[i] |
935 | - eor w16,w16,w23,ror#11 |
936 | - eor w3,w3,w14,ror#18 |
937 | - orr w17,w17,w28 // Ch(e,f,g) |
938 | - eor w28,w27,w20 // a^b, b^c in next round |
939 | - eor w16,w16,w23,ror#25 // Sigma1(e) |
940 | - eor w4,w4,w27,ror#13 |
941 | - add w26,w26,w17 // h+=Ch(e,f,g) |
942 | - and w19,w19,w28 // (b^c)&=(a^b) |
943 | - eor w2,w2,w11,ror#19 |
944 | - eor w3,w3,w14,lsr#3 // sigma0(X[i+1]) |
945 | - add w26,w26,w16 // h+=Sigma1(e) |
946 | - eor w19,w19,w20 // Maj(a,b,c) |
947 | - eor w17,w4,w27,ror#22 // Sigma0(a) |
948 | - eor w2,w2,w11,lsr#10 // sigma1(X[i+14]) |
949 | - add w13,w13,w6 |
950 | - add w22,w22,w26 // d+=h |
951 | - add w26,w26,w19 // h+=Maj(a,b,c) |
952 | - ldr w19,[x30],#4 // *K++, w28 in next round |
953 | - add w13,w13,w3 |
954 | - add w26,w26,w17 // h+=Sigma0(a) |
955 | - add w13,w13,w2 |
956 | - ldr w2,[sp,#12] |
957 | - str w5,[sp,#8] |
958 | - ror w16,w22,#6 |
959 | - add w25,w25,w19 // h+=K[i] |
960 | - ror w4,w15,#7 |
961 | - and w17,w23,w22 |
962 | - ror w3,w12,#17 |
963 | - bic w19,w24,w22 |
964 | - ror w5,w26,#2 |
965 | - add w25,w25,w13 // h+=X[i] |
966 | - eor w16,w16,w22,ror#11 |
967 | - eor w4,w4,w15,ror#18 |
968 | - orr w17,w17,w19 // Ch(e,f,g) |
969 | - eor w19,w26,w27 // a^b, b^c in next round |
970 | - eor w16,w16,w22,ror#25 // Sigma1(e) |
971 | - eor w5,w5,w26,ror#13 |
972 | - add w25,w25,w17 // h+=Ch(e,f,g) |
973 | - and w28,w28,w19 // (b^c)&=(a^b) |
974 | - eor w3,w3,w12,ror#19 |
975 | - eor w4,w4,w15,lsr#3 // sigma0(X[i+1]) |
976 | - add w25,w25,w16 // h+=Sigma1(e) |
977 | - eor w28,w28,w27 // Maj(a,b,c) |
978 | - eor w17,w5,w26,ror#22 // Sigma0(a) |
979 | - eor w3,w3,w12,lsr#10 // sigma1(X[i+14]) |
980 | - add w14,w14,w7 |
981 | - add w21,w21,w25 // d+=h |
982 | - add w25,w25,w28 // h+=Maj(a,b,c) |
983 | - ldr w28,[x30],#4 // *K++, w19 in next round |
984 | - add w14,w14,w4 |
985 | - add w25,w25,w17 // h+=Sigma0(a) |
986 | - add w14,w14,w3 |
987 | - ldr w3,[sp,#0] |
988 | - str w6,[sp,#12] |
989 | - ror w16,w21,#6 |
990 | - add w24,w24,w28 // h+=K[i] |
991 | - ror w5,w0,#7 |
992 | - and w17,w22,w21 |
993 | - ror w4,w13,#17 |
994 | - bic w28,w23,w21 |
995 | - ror w6,w25,#2 |
996 | - add w24,w24,w14 // h+=X[i] |
997 | - eor w16,w16,w21,ror#11 |
998 | - eor w5,w5,w0,ror#18 |
999 | - orr w17,w17,w28 // Ch(e,f,g) |
1000 | - eor w28,w25,w26 // a^b, b^c in next round |
1001 | - eor w16,w16,w21,ror#25 // Sigma1(e) |
1002 | - eor w6,w6,w25,ror#13 |
1003 | - add w24,w24,w17 // h+=Ch(e,f,g) |
1004 | - and w19,w19,w28 // (b^c)&=(a^b) |
1005 | - eor w4,w4,w13,ror#19 |
1006 | - eor w5,w5,w0,lsr#3 // sigma0(X[i+1]) |
1007 | - add w24,w24,w16 // h+=Sigma1(e) |
1008 | - eor w19,w19,w26 // Maj(a,b,c) |
1009 | - eor w17,w6,w25,ror#22 // Sigma0(a) |
1010 | - eor w4,w4,w13,lsr#10 // sigma1(X[i+14]) |
1011 | - add w15,w15,w8 |
1012 | - add w20,w20,w24 // d+=h |
1013 | - add w24,w24,w19 // h+=Maj(a,b,c) |
1014 | - ldr w19,[x30],#4 // *K++, w28 in next round |
1015 | - add w15,w15,w5 |
1016 | - add w24,w24,w17 // h+=Sigma0(a) |
1017 | - add w15,w15,w4 |
1018 | - ldr w4,[sp,#4] |
1019 | - str w7,[sp,#0] |
1020 | - ror w16,w20,#6 |
1021 | - add w23,w23,w19 // h+=K[i] |
1022 | - ror w6,w1,#7 |
1023 | - and w17,w21,w20 |
1024 | - ror w5,w14,#17 |
1025 | - bic w19,w22,w20 |
1026 | - ror w7,w24,#2 |
1027 | - add w23,w23,w15 // h+=X[i] |
1028 | - eor w16,w16,w20,ror#11 |
1029 | - eor w6,w6,w1,ror#18 |
1030 | - orr w17,w17,w19 // Ch(e,f,g) |
1031 | - eor w19,w24,w25 // a^b, b^c in next round |
1032 | - eor w16,w16,w20,ror#25 // Sigma1(e) |
1033 | - eor w7,w7,w24,ror#13 |
1034 | - add w23,w23,w17 // h+=Ch(e,f,g) |
1035 | - and w28,w28,w19 // (b^c)&=(a^b) |
1036 | - eor w5,w5,w14,ror#19 |
1037 | - eor w6,w6,w1,lsr#3 // sigma0(X[i+1]) |
1038 | - add w23,w23,w16 // h+=Sigma1(e) |
1039 | - eor w28,w28,w25 // Maj(a,b,c) |
1040 | - eor w17,w7,w24,ror#22 // Sigma0(a) |
1041 | - eor w5,w5,w14,lsr#10 // sigma1(X[i+14]) |
1042 | - add w0,w0,w9 |
1043 | - add w27,w27,w23 // d+=h |
1044 | - add w23,w23,w28 // h+=Maj(a,b,c) |
1045 | - ldr w28,[x30],#4 // *K++, w19 in next round |
1046 | - add w0,w0,w6 |
1047 | - add w23,w23,w17 // h+=Sigma0(a) |
1048 | - add w0,w0,w5 |
1049 | - ldr w5,[sp,#8] |
1050 | - str w8,[sp,#4] |
1051 | - ror w16,w27,#6 |
1052 | - add w22,w22,w28 // h+=K[i] |
1053 | - ror w7,w2,#7 |
1054 | - and w17,w20,w27 |
1055 | - ror w6,w15,#17 |
1056 | - bic w28,w21,w27 |
1057 | - ror w8,w23,#2 |
1058 | - add w22,w22,w0 // h+=X[i] |
1059 | - eor w16,w16,w27,ror#11 |
1060 | - eor w7,w7,w2,ror#18 |
1061 | - orr w17,w17,w28 // Ch(e,f,g) |
1062 | - eor w28,w23,w24 // a^b, b^c in next round |
1063 | - eor w16,w16,w27,ror#25 // Sigma1(e) |
1064 | - eor w8,w8,w23,ror#13 |
1065 | - add w22,w22,w17 // h+=Ch(e,f,g) |
1066 | - and w19,w19,w28 // (b^c)&=(a^b) |
1067 | - eor w6,w6,w15,ror#19 |
1068 | - eor w7,w7,w2,lsr#3 // sigma0(X[i+1]) |
1069 | - add w22,w22,w16 // h+=Sigma1(e) |
1070 | - eor w19,w19,w24 // Maj(a,b,c) |
1071 | - eor w17,w8,w23,ror#22 // Sigma0(a) |
1072 | - eor w6,w6,w15,lsr#10 // sigma1(X[i+14]) |
1073 | - add w1,w1,w10 |
1074 | - add w26,w26,w22 // d+=h |
1075 | - add w22,w22,w19 // h+=Maj(a,b,c) |
1076 | - ldr w19,[x30],#4 // *K++, w28 in next round |
1077 | - add w1,w1,w7 |
1078 | - add w22,w22,w17 // h+=Sigma0(a) |
1079 | - add w1,w1,w6 |
1080 | - ldr w6,[sp,#12] |
1081 | - str w9,[sp,#8] |
1082 | - ror w16,w26,#6 |
1083 | - add w21,w21,w19 // h+=K[i] |
1084 | - ror w8,w3,#7 |
1085 | - and w17,w27,w26 |
1086 | - ror w7,w0,#17 |
1087 | - bic w19,w20,w26 |
1088 | - ror w9,w22,#2 |
1089 | - add w21,w21,w1 // h+=X[i] |
1090 | - eor w16,w16,w26,ror#11 |
1091 | - eor w8,w8,w3,ror#18 |
1092 | - orr w17,w17,w19 // Ch(e,f,g) |
1093 | - eor w19,w22,w23 // a^b, b^c in next round |
1094 | - eor w16,w16,w26,ror#25 // Sigma1(e) |
1095 | - eor w9,w9,w22,ror#13 |
1096 | - add w21,w21,w17 // h+=Ch(e,f,g) |
1097 | - and w28,w28,w19 // (b^c)&=(a^b) |
1098 | - eor w7,w7,w0,ror#19 |
1099 | - eor w8,w8,w3,lsr#3 // sigma0(X[i+1]) |
1100 | - add w21,w21,w16 // h+=Sigma1(e) |
1101 | - eor w28,w28,w23 // Maj(a,b,c) |
1102 | - eor w17,w9,w22,ror#22 // Sigma0(a) |
1103 | - eor w7,w7,w0,lsr#10 // sigma1(X[i+14]) |
1104 | - add w2,w2,w11 |
1105 | - add w25,w25,w21 // d+=h |
1106 | - add w21,w21,w28 // h+=Maj(a,b,c) |
1107 | - ldr w28,[x30],#4 // *K++, w19 in next round |
1108 | - add w2,w2,w8 |
1109 | - add w21,w21,w17 // h+=Sigma0(a) |
1110 | - add w2,w2,w7 |
1111 | - ldr w7,[sp,#0] |
1112 | - str w10,[sp,#12] |
1113 | - ror w16,w25,#6 |
1114 | - add w20,w20,w28 // h+=K[i] |
1115 | - ror w9,w4,#7 |
1116 | - and w17,w26,w25 |
1117 | - ror w8,w1,#17 |
1118 | - bic w28,w27,w25 |
1119 | - ror w10,w21,#2 |
1120 | - add w20,w20,w2 // h+=X[i] |
1121 | - eor w16,w16,w25,ror#11 |
1122 | - eor w9,w9,w4,ror#18 |
1123 | - orr w17,w17,w28 // Ch(e,f,g) |
1124 | - eor w28,w21,w22 // a^b, b^c in next round |
1125 | - eor w16,w16,w25,ror#25 // Sigma1(e) |
1126 | - eor w10,w10,w21,ror#13 |
1127 | - add w20,w20,w17 // h+=Ch(e,f,g) |
1128 | - and w19,w19,w28 // (b^c)&=(a^b) |
1129 | - eor w8,w8,w1,ror#19 |
1130 | - eor w9,w9,w4,lsr#3 // sigma0(X[i+1]) |
1131 | - add w20,w20,w16 // h+=Sigma1(e) |
1132 | - eor w19,w19,w22 // Maj(a,b,c) |
1133 | - eor w17,w10,w21,ror#22 // Sigma0(a) |
1134 | - eor w8,w8,w1,lsr#10 // sigma1(X[i+14]) |
1135 | - add w3,w3,w12 |
1136 | - add w24,w24,w20 // d+=h |
1137 | - add w20,w20,w19 // h+=Maj(a,b,c) |
1138 | - ldr w19,[x30],#4 // *K++, w28 in next round |
1139 | - add w3,w3,w9 |
1140 | - add w20,w20,w17 // h+=Sigma0(a) |
1141 | - add w3,w3,w8 |
1142 | - cbnz w19,.Loop_16_xx |
1143 | - |
1144 | - ldp x0,x2,[x29,#96] |
1145 | - ldr x1,[x29,#112] |
1146 | - sub x30,x30,#260 // rewind |
1147 | - |
1148 | - ldp w3,w4,[x0] |
1149 | - ldp w5,w6,[x0,#2*4] |
1150 | - add x1,x1,#14*4 // advance input pointer |
1151 | - ldp w7,w8,[x0,#4*4] |
1152 | - add w20,w20,w3 |
1153 | - ldp w9,w10,[x0,#6*4] |
1154 | - add w21,w21,w4 |
1155 | - add w22,w22,w5 |
1156 | - add w23,w23,w6 |
1157 | - stp w20,w21,[x0] |
1158 | - add w24,w24,w7 |
1159 | - add w25,w25,w8 |
1160 | - stp w22,w23,[x0,#2*4] |
1161 | - add w26,w26,w9 |
1162 | - add w27,w27,w10 |
1163 | - cmp x1,x2 |
1164 | - stp w24,w25,[x0,#4*4] |
1165 | - stp w26,w27,[x0,#6*4] |
1166 | - b.ne .Loop |
1167 | - |
1168 | - ldp x19,x20,[x29,#16] |
1169 | - add sp,sp,#4*4 |
1170 | - ldp x21,x22,[x29,#32] |
1171 | - ldp x23,x24,[x29,#48] |
1172 | - ldp x25,x26,[x29,#64] |
1173 | - ldp x27,x28,[x29,#80] |
1174 | - ldp x29,x30,[sp],#128 |
1175 | - ret |
1176 | -.size sha256_block_data_order,.-sha256_block_data_order |
1177 | - |
1178 | -.align 6 |
1179 | -.type .LK256,%object |
1180 | -.LK256: |
1181 | - .long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 |
1182 | - .long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 |
1183 | - .long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 |
1184 | - .long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 |
1185 | - .long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc |
1186 | - .long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da |
1187 | - .long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 |
1188 | - .long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967 |
1189 | - .long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 |
1190 | - .long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 |
1191 | - .long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 |
1192 | - .long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 |
1193 | - .long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 |
1194 | - .long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 |
1195 | - .long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 |
1196 | - .long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 |
1197 | - .long 0 //terminator |
1198 | -.size .LK256,.-.LK256 |
1199 | -#ifndef __KERNEL__ |
1200 | -.align 3 |
1201 | -.LOPENSSL_armcap_P: |
1202 | -# ifdef __ILP32__ |
1203 | - .long OPENSSL_armcap_P-. |
1204 | -# else |
1205 | - .quad OPENSSL_armcap_P-. |
1206 | -# endif |
1207 | -#endif |
1208 | -.asciz "SHA256 block transform for ARMv8, CRYPTOGAMS by <appro@openssl.org>" |
1209 | -.align 2 |
1210 | -#ifndef __KERNEL__ |
1211 | -.type sha256_block_armv8,%function |
1212 | -.align 6 |
1213 | -sha256_block_armv8: |
1214 | -.Lv8_entry: |
1215 | - stp x29,x30,[sp,#-16]! |
1216 | - add x29,sp,#0 |
1217 | - |
1218 | - ld1 {v0.4s,v1.4s},[x0] |
1219 | - adr x3,.LK256 |
1220 | - |
1221 | -.Loop_hw: |
1222 | - ld1 {v4.16b-v7.16b},[x1],#64 |
1223 | - sub x2,x2,#1 |
1224 | - ld1 {v16.4s},[x3],#16 |
1225 | - rev32 v4.16b,v4.16b |
1226 | - rev32 v5.16b,v5.16b |
1227 | - rev32 v6.16b,v6.16b |
1228 | - rev32 v7.16b,v7.16b |
1229 | - orr v18.16b,v0.16b,v0.16b // offload |
1230 | - orr v19.16b,v1.16b,v1.16b |
1231 | - ld1 {v17.4s},[x3],#16 |
1232 | - add v16.4s,v16.4s,v4.4s |
1233 | - .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b |
1234 | - orr v2.16b,v0.16b,v0.16b |
1235 | - .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s |
1236 | - .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s |
1237 | - .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b |
1238 | - ld1 {v16.4s},[x3],#16 |
1239 | - add v17.4s,v17.4s,v5.4s |
1240 | - .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b |
1241 | - orr v2.16b,v0.16b,v0.16b |
1242 | - .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s |
1243 | - .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s |
1244 | - .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b |
1245 | - ld1 {v17.4s},[x3],#16 |
1246 | - add v16.4s,v16.4s,v6.4s |
1247 | - .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b |
1248 | - orr v2.16b,v0.16b,v0.16b |
1249 | - .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s |
1250 | - .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s |
1251 | - .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b |
1252 | - ld1 {v16.4s},[x3],#16 |
1253 | - add v17.4s,v17.4s,v7.4s |
1254 | - .inst 0x5e282887 //sha256su0 v7.16b,v4.16b |
1255 | - orr v2.16b,v0.16b,v0.16b |
1256 | - .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s |
1257 | - .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s |
1258 | - .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b |
1259 | - ld1 {v17.4s},[x3],#16 |
1260 | - add v16.4s,v16.4s,v4.4s |
1261 | - .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b |
1262 | - orr v2.16b,v0.16b,v0.16b |
1263 | - .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s |
1264 | - .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s |
1265 | - .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b |
1266 | - ld1 {v16.4s},[x3],#16 |
1267 | - add v17.4s,v17.4s,v5.4s |
1268 | - .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b |
1269 | - orr v2.16b,v0.16b,v0.16b |
1270 | - .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s |
1271 | - .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s |
1272 | - .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b |
1273 | - ld1 {v17.4s},[x3],#16 |
1274 | - add v16.4s,v16.4s,v6.4s |
1275 | - .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b |
1276 | - orr v2.16b,v0.16b,v0.16b |
1277 | - .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s |
1278 | - .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s |
1279 | - .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b |
1280 | - ld1 {v16.4s},[x3],#16 |
1281 | - add v17.4s,v17.4s,v7.4s |
1282 | - .inst 0x5e282887 //sha256su0 v7.16b,v4.16b |
1283 | - orr v2.16b,v0.16b,v0.16b |
1284 | - .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s |
1285 | - .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s |
1286 | - .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b |
1287 | - ld1 {v17.4s},[x3],#16 |
1288 | - add v16.4s,v16.4s,v4.4s |
1289 | - .inst 0x5e2828a4 //sha256su0 v4.16b,v5.16b |
1290 | - orr v2.16b,v0.16b,v0.16b |
1291 | - .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s |
1292 | - .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s |
1293 | - .inst 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b |
1294 | - ld1 {v16.4s},[x3],#16 |
1295 | - add v17.4s,v17.4s,v5.4s |
1296 | - .inst 0x5e2828c5 //sha256su0 v5.16b,v6.16b |
1297 | - orr v2.16b,v0.16b,v0.16b |
1298 | - .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s |
1299 | - .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s |
1300 | - .inst 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b |
1301 | - ld1 {v17.4s},[x3],#16 |
1302 | - add v16.4s,v16.4s,v6.4s |
1303 | - .inst 0x5e2828e6 //sha256su0 v6.16b,v7.16b |
1304 | - orr v2.16b,v0.16b,v0.16b |
1305 | - .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s |
1306 | - .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s |
1307 | - .inst 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b |
1308 | - ld1 {v16.4s},[x3],#16 |
1309 | - add v17.4s,v17.4s,v7.4s |
1310 | - .inst 0x5e282887 //sha256su0 v7.16b,v4.16b |
1311 | - orr v2.16b,v0.16b,v0.16b |
1312 | - .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s |
1313 | - .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s |
1314 | - .inst 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b |
1315 | - ld1 {v17.4s},[x3],#16 |
1316 | - add v16.4s,v16.4s,v4.4s |
1317 | - orr v2.16b,v0.16b,v0.16b |
1318 | - .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s |
1319 | - .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s |
1320 | - |
1321 | - ld1 {v16.4s},[x3],#16 |
1322 | - add v17.4s,v17.4s,v5.4s |
1323 | - orr v2.16b,v0.16b,v0.16b |
1324 | - .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s |
1325 | - .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s |
1326 | - |
1327 | - ld1 {v17.4s},[x3] |
1328 | - add v16.4s,v16.4s,v6.4s |
1329 | - sub x3,x3,#64*4-16 // rewind |
1330 | - orr v2.16b,v0.16b,v0.16b |
1331 | - .inst 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s |
1332 | - .inst 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s |
1333 | - |
1334 | - add v17.4s,v17.4s,v7.4s |
1335 | - orr v2.16b,v0.16b,v0.16b |
1336 | - .inst 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s |
1337 | - .inst 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s |
1338 | - |
1339 | - add v0.4s,v0.4s,v18.4s |
1340 | - add v1.4s,v1.4s,v19.4s |
1341 | - |
1342 | - cbnz x2,.Loop_hw |
1343 | - |
1344 | - st1 {v0.4s,v1.4s},[x0] |
1345 | - |
1346 | - ldr x29,[sp],#16 |
1347 | - ret |
1348 | -.size sha256_block_armv8,.-sha256_block_armv8 |
1349 | -#endif |
1350 | -#ifdef __KERNEL__ |
1351 | -.globl sha256_block_neon |
1352 | -#endif |
1353 | -.type sha256_block_neon,%function |
1354 | -.align 4 |
1355 | -sha256_block_neon: |
1356 | -.Lneon_entry: |
1357 | - stp x29, x30, [sp, #-16]! |
1358 | - mov x29, sp |
1359 | - sub sp,sp,#16*4 |
1360 | - |
1361 | - adr x16,.LK256 |
1362 | - add x2,x1,x2,lsl#6 // len to point at the end of inp |
1363 | - |
1364 | - ld1 {v0.16b},[x1], #16 |
1365 | - ld1 {v1.16b},[x1], #16 |
1366 | - ld1 {v2.16b},[x1], #16 |
1367 | - ld1 {v3.16b},[x1], #16 |
1368 | - ld1 {v4.4s},[x16], #16 |
1369 | - ld1 {v5.4s},[x16], #16 |
1370 | - ld1 {v6.4s},[x16], #16 |
1371 | - ld1 {v7.4s},[x16], #16 |
1372 | - rev32 v0.16b,v0.16b // yes, even on |
1373 | - rev32 v1.16b,v1.16b // big-endian |
1374 | - rev32 v2.16b,v2.16b |
1375 | - rev32 v3.16b,v3.16b |
1376 | - mov x17,sp |
1377 | - add v4.4s,v4.4s,v0.4s |
1378 | - add v5.4s,v5.4s,v1.4s |
1379 | - add v6.4s,v6.4s,v2.4s |
1380 | - st1 {v4.4s-v5.4s},[x17], #32 |
1381 | - add v7.4s,v7.4s,v3.4s |
1382 | - st1 {v6.4s-v7.4s},[x17] |
1383 | - sub x17,x17,#32 |
1384 | - |
1385 | - ldp w3,w4,[x0] |
1386 | - ldp w5,w6,[x0,#8] |
1387 | - ldp w7,w8,[x0,#16] |
1388 | - ldp w9,w10,[x0,#24] |
1389 | - ldr w12,[sp,#0] |
1390 | - mov w13,wzr |
1391 | - eor w14,w4,w5 |
1392 | - mov w15,wzr |
1393 | - b .L_00_48 |
1394 | - |
1395 | -.align 4 |
1396 | -.L_00_48: |
1397 | - ext v4.16b,v0.16b,v1.16b,#4 |
1398 | - add w10,w10,w12 |
1399 | - add w3,w3,w15 |
1400 | - and w12,w8,w7 |
1401 | - bic w15,w9,w7 |
1402 | - ext v7.16b,v2.16b,v3.16b,#4 |
1403 | - eor w11,w7,w7,ror#5 |
1404 | - add w3,w3,w13 |
1405 | - mov d19,v3.d[1] |
1406 | - orr w12,w12,w15 |
1407 | - eor w11,w11,w7,ror#19 |
1408 | - ushr v6.4s,v4.4s,#7 |
1409 | - eor w15,w3,w3,ror#11 |
1410 | - ushr v5.4s,v4.4s,#3 |
1411 | - add w10,w10,w12 |
1412 | - add v0.4s,v0.4s,v7.4s |
1413 | - ror w11,w11,#6 |
1414 | - sli v6.4s,v4.4s,#25 |
1415 | - eor w13,w3,w4 |
1416 | - eor w15,w15,w3,ror#20 |
1417 | - ushr v7.4s,v4.4s,#18 |
1418 | - add w10,w10,w11 |
1419 | - ldr w12,[sp,#4] |
1420 | - and w14,w14,w13 |
1421 | - eor v5.16b,v5.16b,v6.16b |
1422 | - ror w15,w15,#2 |
1423 | - add w6,w6,w10 |
1424 | - sli v7.4s,v4.4s,#14 |
1425 | - eor w14,w14,w4 |
1426 | - ushr v16.4s,v19.4s,#17 |
1427 | - add w9,w9,w12 |
1428 | - add w10,w10,w15 |
1429 | - and w12,w7,w6 |
1430 | - eor v5.16b,v5.16b,v7.16b |
1431 | - bic w15,w8,w6 |
1432 | - eor w11,w6,w6,ror#5 |
1433 | - sli v16.4s,v19.4s,#15 |
1434 | - add w10,w10,w14 |
1435 | - orr w12,w12,w15 |
1436 | - ushr v17.4s,v19.4s,#10 |
1437 | - eor w11,w11,w6,ror#19 |
1438 | - eor w15,w10,w10,ror#11 |
1439 | - ushr v7.4s,v19.4s,#19 |
1440 | - add w9,w9,w12 |
1441 | - ror w11,w11,#6 |
1442 | - add v0.4s,v0.4s,v5.4s |
1443 | - eor w14,w10,w3 |
1444 | - eor w15,w15,w10,ror#20 |
1445 | - sli v7.4s,v19.4s,#13 |
1446 | - add w9,w9,w11 |
1447 | - ldr w12,[sp,#8] |
1448 | - and w13,w13,w14 |
1449 | - eor v17.16b,v17.16b,v16.16b |
1450 | - ror w15,w15,#2 |
1451 | - add w5,w5,w9 |
1452 | - eor w13,w13,w3 |
1453 | - eor v17.16b,v17.16b,v7.16b |
1454 | - add w8,w8,w12 |
1455 | - add w9,w9,w15 |
1456 | - and w12,w6,w5 |
1457 | - add v0.4s,v0.4s,v17.4s |
1458 | - bic w15,w7,w5 |
1459 | - eor w11,w5,w5,ror#5 |
1460 | - add w9,w9,w13 |
1461 | - ushr v18.4s,v0.4s,#17 |
1462 | - orr w12,w12,w15 |
1463 | - ushr v19.4s,v0.4s,#10 |
1464 | - eor w11,w11,w5,ror#19 |
1465 | - eor w15,w9,w9,ror#11 |
1466 | - sli v18.4s,v0.4s,#15 |
1467 | - add w8,w8,w12 |
1468 | - ushr v17.4s,v0.4s,#19 |
1469 | - ror w11,w11,#6 |
1470 | - eor w13,w9,w10 |
1471 | - eor v19.16b,v19.16b,v18.16b |
1472 | - eor w15,w15,w9,ror#20 |
1473 | - add w8,w8,w11 |
1474 | - sli v17.4s,v0.4s,#13 |
1475 | - ldr w12,[sp,#12] |
1476 | - and w14,w14,w13 |
1477 | - ror w15,w15,#2 |
1478 | - ld1 {v4.4s},[x16], #16 |
1479 | - add w4,w4,w8 |
1480 | - eor v19.16b,v19.16b,v17.16b |
1481 | - eor w14,w14,w10 |
1482 | - eor v17.16b,v17.16b,v17.16b |
1483 | - add w7,w7,w12 |
1484 | - add w8,w8,w15 |
1485 | - and w12,w5,w4 |
1486 | - mov v17.d[1],v19.d[0] |
1487 | - bic w15,w6,w4 |
1488 | - eor w11,w4,w4,ror#5 |
1489 | - add w8,w8,w14 |
1490 | - add v0.4s,v0.4s,v17.4s |
1491 | - orr w12,w12,w15 |
1492 | - eor w11,w11,w4,ror#19 |
1493 | - eor w15,w8,w8,ror#11 |
1494 | - add v4.4s,v4.4s,v0.4s |
1495 | - add w7,w7,w12 |
1496 | - ror w11,w11,#6 |
1497 | - eor w14,w8,w9 |
1498 | - eor w15,w15,w8,ror#20 |
1499 | - add w7,w7,w11 |
1500 | - ldr w12,[sp,#16] |
1501 | - and w13,w13,w14 |
1502 | - ror w15,w15,#2 |
1503 | - add w3,w3,w7 |
1504 | - eor w13,w13,w9 |
1505 | - st1 {v4.4s},[x17], #16 |
1506 | - ext v4.16b,v1.16b,v2.16b,#4 |
1507 | - add w6,w6,w12 |
1508 | - add w7,w7,w15 |
1509 | - and w12,w4,w3 |
1510 | - bic w15,w5,w3 |
1511 | - ext v7.16b,v3.16b,v0.16b,#4 |
1512 | - eor w11,w3,w3,ror#5 |
1513 | - add w7,w7,w13 |
1514 | - mov d19,v0.d[1] |
1515 | - orr w12,w12,w15 |
1516 | - eor w11,w11,w3,ror#19 |
1517 | - ushr v6.4s,v4.4s,#7 |
1518 | - eor w15,w7,w7,ror#11 |
1519 | - ushr v5.4s,v4.4s,#3 |
1520 | - add w6,w6,w12 |
1521 | - add v1.4s,v1.4s,v7.4s |
1522 | - ror w11,w11,#6 |
1523 | - sli v6.4s,v4.4s,#25 |
1524 | - eor w13,w7,w8 |
1525 | - eor w15,w15,w7,ror#20 |
1526 | - ushr v7.4s,v4.4s,#18 |
1527 | - add w6,w6,w11 |
1528 | - ldr w12,[sp,#20] |
1529 | - and w14,w14,w13 |
1530 | - eor v5.16b,v5.16b,v6.16b |
1531 | - ror w15,w15,#2 |
1532 | - add w10,w10,w6 |
1533 | - sli v7.4s,v4.4s,#14 |
1534 | - eor w14,w14,w8 |
1535 | - ushr v16.4s,v19.4s,#17 |
1536 | - add w5,w5,w12 |
1537 | - add w6,w6,w15 |
1538 | - and w12,w3,w10 |
1539 | - eor v5.16b,v5.16b,v7.16b |
1540 | - bic w15,w4,w10 |
1541 | - eor w11,w10,w10,ror#5 |
1542 | - sli v16.4s,v19.4s,#15 |
1543 | - add w6,w6,w14 |
1544 | - orr w12,w12,w15 |
1545 | - ushr v17.4s,v19.4s,#10 |
1546 | - eor w11,w11,w10,ror#19 |
1547 | - eor w15,w6,w6,ror#11 |
1548 | - ushr v7.4s,v19.4s,#19 |
1549 | - add w5,w5,w12 |
1550 | - ror w11,w11,#6 |
1551 | - add v1.4s,v1.4s,v5.4s |
1552 | - eor w14,w6,w7 |
1553 | - eor w15,w15,w6,ror#20 |
1554 | - sli v7.4s,v19.4s,#13 |
1555 | - add w5,w5,w11 |
1556 | - ldr w12,[sp,#24] |
1557 | - and w13,w13,w14 |
1558 | - eor v17.16b,v17.16b,v16.16b |
1559 | - ror w15,w15,#2 |
1560 | - add w9,w9,w5 |
1561 | - eor w13,w13,w7 |
1562 | - eor v17.16b,v17.16b,v7.16b |
1563 | - add w4,w4,w12 |
1564 | - add w5,w5,w15 |
1565 | - and w12,w10,w9 |
1566 | - add v1.4s,v1.4s,v17.4s |
1567 | - bic w15,w3,w9 |
1568 | - eor w11,w9,w9,ror#5 |
1569 | - add w5,w5,w13 |
1570 | - ushr v18.4s,v1.4s,#17 |
1571 | - orr w12,w12,w15 |
1572 | - ushr v19.4s,v1.4s,#10 |
1573 | - eor w11,w11,w9,ror#19 |
1574 | - eor w15,w5,w5,ror#11 |
1575 | - sli v18.4s,v1.4s,#15 |
1576 | - add w4,w4,w12 |
1577 | - ushr v17.4s,v1.4s,#19 |
1578 | - ror w11,w11,#6 |
1579 | - eor w13,w5,w6 |
1580 | - eor v19.16b,v19.16b,v18.16b |
1581 | - eor w15,w15,w5,ror#20 |
1582 | - add w4,w4,w11 |
1583 | - sli v17.4s,v1.4s,#13 |
1584 | - ldr w12,[sp,#28] |
1585 | - and w14,w14,w13 |
1586 | - ror w15,w15,#2 |
1587 | - ld1 {v4.4s},[x16], #16 |
1588 | - add w8,w8,w4 |
1589 | - eor v19.16b,v19.16b,v17.16b |
1590 | - eor w14,w14,w6 |
1591 | - eor v17.16b,v17.16b,v17.16b |
1592 | - add w3,w3,w12 |
1593 | - add w4,w4,w15 |
1594 | - and w12,w9,w8 |
1595 | - mov v17.d[1],v19.d[0] |
1596 | - bic w15,w10,w8 |
1597 | - eor w11,w8,w8,ror#5 |
1598 | - add w4,w4,w14 |
1599 | - add v1.4s,v1.4s,v17.4s |
1600 | - orr w12,w12,w15 |
1601 | - eor w11,w11,w8,ror#19 |
1602 | - eor w15,w4,w4,ror#11 |
1603 | - add v4.4s,v4.4s,v1.4s |
1604 | - add w3,w3,w12 |
1605 | - ror w11,w11,#6 |
1606 | - eor w14,w4,w5 |
1607 | - eor w15,w15,w4,ror#20 |
1608 | - add w3,w3,w11 |
1609 | - ldr w12,[sp,#32] |
1610 | - and w13,w13,w14 |
1611 | - ror w15,w15,#2 |
1612 | - add w7,w7,w3 |
1613 | - eor w13,w13,w5 |
1614 | - st1 {v4.4s},[x17], #16 |
1615 | - ext v4.16b,v2.16b,v3.16b,#4 |
1616 | - add w10,w10,w12 |
1617 | - add w3,w3,w15 |
1618 | - and w12,w8,w7 |
1619 | - bic w15,w9,w7 |
1620 | - ext v7.16b,v0.16b,v1.16b,#4 |
1621 | - eor w11,w7,w7,ror#5 |
1622 | - add w3,w3,w13 |
1623 | - mov d19,v1.d[1] |
1624 | - orr w12,w12,w15 |
1625 | - eor w11,w11,w7,ror#19 |
1626 | - ushr v6.4s,v4.4s,#7 |
1627 | - eor w15,w3,w3,ror#11 |
1628 | - ushr v5.4s,v4.4s,#3 |
1629 | - add w10,w10,w12 |
1630 | - add v2.4s,v2.4s,v7.4s |
1631 | - ror w11,w11,#6 |
1632 | - sli v6.4s,v4.4s,#25 |
1633 | - eor w13,w3,w4 |
1634 | - eor w15,w15,w3,ror#20 |
1635 | - ushr v7.4s,v4.4s,#18 |
1636 | - add w10,w10,w11 |
1637 | - ldr w12,[sp,#36] |
1638 | - and w14,w14,w13 |
1639 | - eor v5.16b,v5.16b,v6.16b |
1640 | - ror w15,w15,#2 |
1641 | - add w6,w6,w10 |
1642 | - sli v7.4s,v4.4s,#14 |
1643 | - eor w14,w14,w4 |
1644 | - ushr v16.4s,v19.4s,#17 |
1645 | - add w9,w9,w12 |
1646 | - add w10,w10,w15 |
1647 | - and w12,w7,w6 |
1648 | - eor v5.16b,v5.16b,v7.16b |
1649 | - bic w15,w8,w6 |
1650 | - eor w11,w6,w6,ror#5 |
1651 | - sli v16.4s,v19.4s,#15 |
1652 | - add w10,w10,w14 |
1653 | - orr w12,w12,w15 |
1654 | - ushr v17.4s,v19.4s,#10 |
1655 | - eor w11,w11,w6,ror#19 |
1656 | - eor w15,w10,w10,ror#11 |
1657 | - ushr v7.4s,v19.4s,#19 |
1658 | - add w9,w9,w12 |
1659 | - ror w11,w11,#6 |
1660 | - add v2.4s,v2.4s,v5.4s |
1661 | - eor w14,w10,w3 |
1662 | - eor w15,w15,w10,ror#20 |
1663 | - sli v7.4s,v19.4s,#13 |
1664 | - add w9,w9,w11 |
1665 | - ldr w12,[sp,#40] |
1666 | - and w13,w13,w14 |
1667 | - eor v17.16b,v17.16b,v16.16b |
1668 | - ror w15,w15,#2 |
1669 | - add w5,w5,w9 |
1670 | - eor w13,w13,w3 |
1671 | - eor v17.16b,v17.16b,v7.16b |
1672 | - add w8,w8,w12 |
1673 | - add w9,w9,w15 |
1674 | - and w12,w6,w5 |
1675 | - add v2.4s,v2.4s,v17.4s |
1676 | - bic w15,w7,w5 |
1677 | - eor w11,w5,w5,ror#5 |
1678 | - add w9,w9,w13 |
1679 | - ushr v18.4s,v2.4s,#17 |
1680 | - orr w12,w12,w15 |
1681 | - ushr v19.4s,v2.4s,#10 |
1682 | - eor w11,w11,w5,ror#19 |
1683 | - eor w15,w9,w9,ror#11 |
1684 | - sli v18.4s,v2.4s,#15 |
1685 | - add w8,w8,w12 |
1686 | - ushr v17.4s,v2.4s,#19 |
1687 | - ror w11,w11,#6 |
1688 | - eor w13,w9,w10 |
1689 | - eor v19.16b,v19.16b,v18.16b |
1690 | - eor w15,w15,w9,ror#20 |
1691 | - add w8,w8,w11 |
1692 | - sli v17.4s,v2.4s,#13 |
1693 | - ldr w12,[sp,#44] |
1694 | - and w14,w14,w13 |
1695 | - ror w15,w15,#2 |
1696 | - ld1 {v4.4s},[x16], #16 |
1697 | - add w4,w4,w8 |
1698 | - eor v19.16b,v19.16b,v17.16b |
1699 | - eor w14,w14,w10 |
1700 | - eor v17.16b,v17.16b,v17.16b |
1701 | - add w7,w7,w12 |
1702 | - add w8,w8,w15 |
1703 | - and w12,w5,w4 |
1704 | - mov v17.d[1],v19.d[0] |
1705 | - bic w15,w6,w4 |
1706 | - eor w11,w4,w4,ror#5 |
1707 | - add w8,w8,w14 |
1708 | - add v2.4s,v2.4s,v17.4s |
1709 | - orr w12,w12,w15 |
1710 | - eor w11,w11,w4,ror#19 |
1711 | - eor w15,w8,w8,ror#11 |
1712 | - add v4.4s,v4.4s,v2.4s |
1713 | - add w7,w7,w12 |
1714 | - ror w11,w11,#6 |
1715 | - eor w14,w8,w9 |
1716 | - eor w15,w15,w8,ror#20 |
1717 | - add w7,w7,w11 |
1718 | - ldr w12,[sp,#48] |
1719 | - and w13,w13,w14 |
1720 | - ror w15,w15,#2 |
1721 | - add w3,w3,w7 |
1722 | - eor w13,w13,w9 |
1723 | - st1 {v4.4s},[x17], #16 |
1724 | - ext v4.16b,v3.16b,v0.16b,#4 |
1725 | - add w6,w6,w12 |
1726 | - add w7,w7,w15 |
1727 | - and w12,w4,w3 |
1728 | - bic w15,w5,w3 |
1729 | - ext v7.16b,v1.16b,v2.16b,#4 |
1730 | - eor w11,w3,w3,ror#5 |
1731 | - add w7,w7,w13 |
1732 | - mov d19,v2.d[1] |
1733 | - orr w12,w12,w15 |
1734 | - eor w11,w11,w3,ror#19 |
1735 | - ushr v6.4s,v4.4s,#7 |
1736 | - eor w15,w7,w7,ror#11 |
1737 | - ushr v5.4s,v4.4s,#3 |
1738 | - add w6,w6,w12 |
1739 | - add v3.4s,v3.4s,v7.4s |
1740 | - ror w11,w11,#6 |
1741 | - sli v6.4s,v4.4s,#25 |
1742 | - eor w13,w7,w8 |
1743 | - eor w15,w15,w7,ror#20 |
1744 | - ushr v7.4s,v4.4s,#18 |
1745 | - add w6,w6,w11 |
1746 | - ldr w12,[sp,#52] |
1747 | - and w14,w14,w13 |
1748 | - eor v5.16b,v5.16b,v6.16b |
1749 | - ror w15,w15,#2 |
1750 | - add w10,w10,w6 |
1751 | - sli v7.4s,v4.4s,#14 |
1752 | - eor w14,w14,w8 |
1753 | - ushr v16.4s,v19.4s,#17 |
1754 | - add w5,w5,w12 |
1755 | - add w6,w6,w15 |
1756 | - and w12,w3,w10 |
1757 | - eor v5.16b,v5.16b,v7.16b |
1758 | - bic w15,w4,w10 |
1759 | - eor w11,w10,w10,ror#5 |
1760 | - sli v16.4s,v19.4s,#15 |
1761 | - add w6,w6,w14 |
1762 | - orr w12,w12,w15 |
1763 | - ushr v17.4s,v19.4s,#10 |
1764 | - eor w11,w11,w10,ror#19 |
1765 | - eor w15,w6,w6,ror#11 |
1766 | - ushr v7.4s,v19.4s,#19 |
1767 | - add w5,w5,w12 |
1768 | - ror w11,w11,#6 |
1769 | - add v3.4s,v3.4s,v5.4s |
1770 | - eor w14,w6,w7 |
1771 | - eor w15,w15,w6,ror#20 |
1772 | - sli v7.4s,v19.4s,#13 |
1773 | - add w5,w5,w11 |
1774 | - ldr w12,[sp,#56] |
1775 | - and w13,w13,w14 |
1776 | - eor v17.16b,v17.16b,v16.16b |
1777 | - ror w15,w15,#2 |
1778 | - add w9,w9,w5 |
1779 | - eor w13,w13,w7 |
1780 | - eor v17.16b,v17.16b,v7.16b |
1781 | - add w4,w4,w12 |
1782 | - add w5,w5,w15 |
1783 | - and w12,w10,w9 |
1784 | - add v3.4s,v3.4s,v17.4s |
1785 | - bic w15,w3,w9 |
1786 | - eor w11,w9,w9,ror#5 |
1787 | - add w5,w5,w13 |
1788 | - ushr v18.4s,v3.4s,#17 |
1789 | - orr w12,w12,w15 |
1790 | - ushr v19.4s,v3.4s,#10 |
1791 | - eor w11,w11,w9,ror#19 |
1792 | - eor w15,w5,w5,ror#11 |
1793 | - sli v18.4s,v3.4s,#15 |
1794 | - add w4,w4,w12 |
1795 | - ushr v17.4s,v3.4s,#19 |
1796 | - ror w11,w11,#6 |
1797 | - eor w13,w5,w6 |
1798 | - eor v19.16b,v19.16b,v18.16b |
1799 | - eor w15,w15,w5,ror#20 |
1800 | - add w4,w4,w11 |
1801 | - sli v17.4s,v3.4s,#13 |
1802 | - ldr w12,[sp,#60] |
1803 | - and w14,w14,w13 |
1804 | - ror w15,w15,#2 |
1805 | - ld1 {v4.4s},[x16], #16 |
1806 | - add w8,w8,w4 |
1807 | - eor v19.16b,v19.16b,v17.16b |
1808 | - eor w14,w14,w6 |
1809 | - eor v17.16b,v17.16b,v17.16b |
1810 | - add w3,w3,w12 |
1811 | - add w4,w4,w15 |
1812 | - and w12,w9,w8 |
1813 | - mov v17.d[1],v19.d[0] |
1814 | - bic w15,w10,w8 |
1815 | - eor w11,w8,w8,ror#5 |
1816 | - add w4,w4,w14 |
1817 | - add v3.4s,v3.4s,v17.4s |
1818 | - orr w12,w12,w15 |
1819 | - eor w11,w11,w8,ror#19 |
1820 | - eor w15,w4,w4,ror#11 |
1821 | - add v4.4s,v4.4s,v3.4s |
1822 | - add w3,w3,w12 |
1823 | - ror w11,w11,#6 |
1824 | - eor w14,w4,w5 |
1825 | - eor w15,w15,w4,ror#20 |
1826 | - add w3,w3,w11 |
1827 | - ldr w12,[x16] |
1828 | - and w13,w13,w14 |
1829 | - ror w15,w15,#2 |
1830 | - add w7,w7,w3 |
1831 | - eor w13,w13,w5 |
1832 | - st1 {v4.4s},[x17], #16 |
1833 | - cmp w12,#0 // check for K256 terminator |
1834 | - ldr w12,[sp,#0] |
1835 | - sub x17,x17,#64 |
1836 | - bne .L_00_48 |
1837 | - |
1838 | - sub x16,x16,#256 // rewind x16 |
1839 | - cmp x1,x2 |
1840 | - mov x17, #64 |
1841 | - csel x17, x17, xzr, eq |
1842 | - sub x1,x1,x17 // avoid SEGV |
1843 | - mov x17,sp |
1844 | - add w10,w10,w12 |
1845 | - add w3,w3,w15 |
1846 | - and w12,w8,w7 |
1847 | - ld1 {v0.16b},[x1],#16 |
1848 | - bic w15,w9,w7 |
1849 | - eor w11,w7,w7,ror#5 |
1850 | - ld1 {v4.4s},[x16],#16 |
1851 | - add w3,w3,w13 |
1852 | - orr w12,w12,w15 |
1853 | - eor w11,w11,w7,ror#19 |
1854 | - eor w15,w3,w3,ror#11 |
1855 | - rev32 v0.16b,v0.16b |
1856 | - add w10,w10,w12 |
1857 | - ror w11,w11,#6 |
1858 | - eor w13,w3,w4 |
1859 | - eor w15,w15,w3,ror#20 |
1860 | - add v4.4s,v4.4s,v0.4s |
1861 | - add w10,w10,w11 |
1862 | - ldr w12,[sp,#4] |
1863 | - and w14,w14,w13 |
1864 | - ror w15,w15,#2 |
1865 | - add w6,w6,w10 |
1866 | - eor w14,w14,w4 |
1867 | - add w9,w9,w12 |
1868 | - add w10,w10,w15 |
1869 | - and w12,w7,w6 |
1870 | - bic w15,w8,w6 |
1871 | - eor w11,w6,w6,ror#5 |
1872 | - add w10,w10,w14 |
1873 | - orr w12,w12,w15 |
1874 | - eor w11,w11,w6,ror#19 |
1875 | - eor w15,w10,w10,ror#11 |
1876 | - add w9,w9,w12 |
1877 | - ror w11,w11,#6 |
1878 | - eor w14,w10,w3 |
1879 | - eor w15,w15,w10,ror#20 |
1880 | - add w9,w9,w11 |
1881 | - ldr w12,[sp,#8] |
1882 | - and w13,w13,w14 |
1883 | - ror w15,w15,#2 |
1884 | - add w5,w5,w9 |
1885 | - eor w13,w13,w3 |
1886 | - add w8,w8,w12 |
1887 | - add w9,w9,w15 |
1888 | - and w12,w6,w5 |
1889 | - bic w15,w7,w5 |
1890 | - eor w11,w5,w5,ror#5 |
1891 | - add w9,w9,w13 |
1892 | - orr w12,w12,w15 |
1893 | - eor w11,w11,w5,ror#19 |
1894 | - eor w15,w9,w9,ror#11 |
1895 | - add w8,w8,w12 |
1896 | - ror w11,w11,#6 |
1897 | - eor w13,w9,w10 |
1898 | - eor w15,w15,w9,ror#20 |
1899 | - add w8,w8,w11 |
1900 | - ldr w12,[sp,#12] |
1901 | - and w14,w14,w13 |
1902 | - ror w15,w15,#2 |
1903 | - add w4,w4,w8 |
1904 | - eor w14,w14,w10 |
1905 | - add w7,w7,w12 |
1906 | - add w8,w8,w15 |
1907 | - and w12,w5,w4 |
1908 | - bic w15,w6,w4 |
1909 | - eor w11,w4,w4,ror#5 |
1910 | - add w8,w8,w14 |
1911 | - orr w12,w12,w15 |
1912 | - eor w11,w11,w4,ror#19 |
1913 | - eor w15,w8,w8,ror#11 |
1914 | - add w7,w7,w12 |
1915 | - ror w11,w11,#6 |
1916 | - eor w14,w8,w9 |
1917 | - eor w15,w15,w8,ror#20 |
1918 | - add w7,w7,w11 |
1919 | - ldr w12,[sp,#16] |
1920 | - and w13,w13,w14 |
1921 | - ror w15,w15,#2 |
1922 | - add w3,w3,w7 |
1923 | - eor w13,w13,w9 |
1924 | - st1 {v4.4s},[x17], #16 |
1925 | - add w6,w6,w12 |
1926 | - add w7,w7,w15 |
1927 | - and w12,w4,w3 |
1928 | - ld1 {v1.16b},[x1],#16 |
1929 | - bic w15,w5,w3 |
1930 | - eor w11,w3,w3,ror#5 |
1931 | - ld1 {v4.4s},[x16],#16 |
1932 | - add w7,w7,w13 |
1933 | - orr w12,w12,w15 |
1934 | - eor w11,w11,w3,ror#19 |
1935 | - eor w15,w7,w7,ror#11 |
1936 | - rev32 v1.16b,v1.16b |
1937 | - add w6,w6,w12 |
1938 | - ror w11,w11,#6 |
1939 | - eor w13,w7,w8 |
1940 | - eor w15,w15,w7,ror#20 |
1941 | - add v4.4s,v4.4s,v1.4s |
1942 | - add w6,w6,w11 |
1943 | - ldr w12,[sp,#20] |
1944 | - and w14,w14,w13 |
1945 | - ror w15,w15,#2 |
1946 | - add w10,w10,w6 |
1947 | - eor w14,w14,w8 |
1948 | - add w5,w5,w12 |
1949 | - add w6,w6,w15 |
1950 | - and w12,w3,w10 |
1951 | - bic w15,w4,w10 |
1952 | - eor w11,w10,w10,ror#5 |
1953 | - add w6,w6,w14 |
1954 | - orr w12,w12,w15 |
1955 | - eor w11,w11,w10,ror#19 |
1956 | - eor w15,w6,w6,ror#11 |
1957 | - add w5,w5,w12 |
1958 | - ror w11,w11,#6 |
1959 | - eor w14,w6,w7 |
1960 | - eor w15,w15,w6,ror#20 |
1961 | - add w5,w5,w11 |
1962 | - ldr w12,[sp,#24] |
1963 | - and w13,w13,w14 |
1964 | - ror w15,w15,#2 |
1965 | - add w9,w9,w5 |
1966 | - eor w13,w13,w7 |
1967 | - add w4,w4,w12 |
1968 | - add w5,w5,w15 |
1969 | - and w12,w10,w9 |
1970 | - bic w15,w3,w9 |
1971 | - eor w11,w9,w9,ror#5 |
1972 | - add w5,w5,w13 |
1973 | - orr w12,w12,w15 |
1974 | - eor w11,w11,w9,ror#19 |
1975 | - eor w15,w5,w5,ror#11 |
1976 | - add w4,w4,w12 |
1977 | - ror w11,w11,#6 |
1978 | - eor w13,w5,w6 |
1979 | - eor w15,w15,w5,ror#20 |
1980 | - add w4,w4,w11 |
1981 | - ldr w12,[sp,#28] |
1982 | - and w14,w14,w13 |
1983 | - ror w15,w15,#2 |
1984 | - add w8,w8,w4 |
1985 | - eor w14,w14,w6 |
1986 | - add w3,w3,w12 |
1987 | - add w4,w4,w15 |
1988 | - and w12,w9,w8 |
1989 | - bic w15,w10,w8 |
1990 | - eor w11,w8,w8,ror#5 |
1991 | - add w4,w4,w14 |
1992 | - orr w12,w12,w15 |
1993 | - eor w11,w11,w8,ror#19 |
1994 | - eor w15,w4,w4,ror#11 |
1995 | - add w3,w3,w12 |
1996 | - ror w11,w11,#6 |
1997 | - eor w14,w4,w5 |
1998 | - eor w15,w15,w4,ror#20 |
1999 | - add w3,w3,w11 |
2000 | - ldr w12,[sp,#32] |
2001 | - and w13,w13,w14 |
2002 | - ror w15,w15,#2 |
2003 | - add w7,w7,w3 |
2004 | - eor w13,w13,w5 |
2005 | - st1 {v4.4s},[x17], #16 |
2006 | - add w10,w10,w12 |
2007 | - add w3,w3,w15 |
2008 | - and w12,w8,w7 |
2009 | - ld1 {v2.16b},[x1],#16 |
2010 | - bic w15,w9,w7 |
2011 | - eor w11,w7,w7,ror#5 |
2012 | - ld1 {v4.4s},[x16],#16 |
2013 | - add w3,w3,w13 |
2014 | - orr w12,w12,w15 |
2015 | - eor w11,w11,w7,ror#19 |
2016 | - eor w15,w3,w3,ror#11 |
2017 | - rev32 v2.16b,v2.16b |
2018 | - add w10,w10,w12 |
2019 | - ror w11,w11,#6 |
2020 | - eor w13,w3,w4 |
2021 | - eor w15,w15,w3,ror#20 |
2022 | - add v4.4s,v4.4s,v2.4s |
2023 | - add w10,w10,w11 |
2024 | - ldr w12,[sp,#36] |
2025 | - and w14,w14,w13 |
2026 | - ror w15,w15,#2 |
2027 | - add w6,w6,w10 |
2028 | - eor w14,w14,w4 |
2029 | - add w9,w9,w12 |
2030 | - add w10,w10,w15 |
2031 | - and w12,w7,w6 |
2032 | - bic w15,w8,w6 |
2033 | - eor w11,w6,w6,ror#5 |
2034 | - add w10,w10,w14 |
2035 | - orr w12,w12,w15 |
2036 | - eor w11,w11,w6,ror#19 |
2037 | - eor w15,w10,w10,ror#11 |
2038 | - add w9,w9,w12 |
2039 | - ror w11,w11,#6 |
2040 | - eor w14,w10,w3 |
2041 | - eor w15,w15,w10,ror#20 |
2042 | - add w9,w9,w11 |
2043 | - ldr w12,[sp,#40] |
2044 | - and w13,w13,w14 |
2045 | - ror w15,w15,#2 |
2046 | - add w5,w5,w9 |
2047 | - eor w13,w13,w3 |
2048 | - add w8,w8,w12 |
2049 | - add w9,w9,w15 |
2050 | - and w12,w6,w5 |
2051 | - bic w15,w7,w5 |
2052 | - eor w11,w5,w5,ror#5 |
2053 | - add w9,w9,w13 |
2054 | - orr w12,w12,w15 |
2055 | - eor w11,w11,w5,ror#19 |
2056 | - eor w15,w9,w9,ror#11 |
2057 | - add w8,w8,w12 |
2058 | - ror w11,w11,#6 |
2059 | - eor w13,w9,w10 |
2060 | - eor w15,w15,w9,ror#20 |
2061 | - add w8,w8,w11 |
2062 | - ldr w12,[sp,#44] |
2063 | - and w14,w14,w13 |
2064 | - ror w15,w15,#2 |
2065 | - add w4,w4,w8 |
2066 | - eor w14,w14,w10 |
2067 | - add w7,w7,w12 |
2068 | - add w8,w8,w15 |
2069 | - and w12,w5,w4 |
2070 | - bic w15,w6,w4 |
2071 | - eor w11,w4,w4,ror#5 |
2072 | - add w8,w8,w14 |
2073 | - orr w12,w12,w15 |
2074 | - eor w11,w11,w4,ror#19 |
2075 | - eor w15,w8,w8,ror#11 |
2076 | - add w7,w7,w12 |
2077 | - ror w11,w11,#6 |
2078 | - eor w14,w8,w9 |
2079 | - eor w15,w15,w8,ror#20 |
2080 | - add w7,w7,w11 |
2081 | - ldr w12,[sp,#48] |
2082 | - and w13,w13,w14 |
2083 | - ror w15,w15,#2 |
2084 | - add w3,w3,w7 |
2085 | - eor w13,w13,w9 |
2086 | - st1 {v4.4s},[x17], #16 |
2087 | - add w6,w6,w12 |
2088 | - add w7,w7,w15 |
2089 | - and w12,w4,w3 |
2090 | - ld1 {v3.16b},[x1],#16 |
2091 | - bic w15,w5,w3 |
2092 | - eor w11,w3,w3,ror#5 |
2093 | - ld1 {v4.4s},[x16],#16 |
2094 | - add w7,w7,w13 |
2095 | - orr w12,w12,w15 |
2096 | - eor w11,w11,w3,ror#19 |
2097 | - eor w15,w7,w7,ror#11 |
2098 | - rev32 v3.16b,v3.16b |
2099 | - add w6,w6,w12 |
2100 | - ror w11,w11,#6 |
2101 | - eor w13,w7,w8 |
2102 | - eor w15,w15,w7,ror#20 |
2103 | - add v4.4s,v4.4s,v3.4s |
2104 | - add w6,w6,w11 |
2105 | - ldr w12,[sp,#52] |
2106 | - and w14,w14,w13 |
2107 | - ror w15,w15,#2 |
2108 | - add w10,w10,w6 |
2109 | - eor w14,w14,w8 |
2110 | - add w5,w5,w12 |
2111 | - add w6,w6,w15 |
2112 | - and w12,w3,w10 |
2113 | - bic w15,w4,w10 |
2114 | - eor w11,w10,w10,ror#5 |
2115 | - add w6,w6,w14 |
2116 | - orr w12,w12,w15 |
2117 | - eor w11,w11,w10,ror#19 |
2118 | - eor w15,w6,w6,ror#11 |
2119 | - add w5,w5,w12 |
2120 | - ror w11,w11,#6 |
2121 | - eor w14,w6,w7 |
2122 | - eor w15,w15,w6,ror#20 |
2123 | - add w5,w5,w11 |
2124 | - ldr w12,[sp,#56] |
2125 | - and w13,w13,w14 |
2126 | - ror w15,w15,#2 |
2127 | - add w9,w9,w5 |
2128 | - eor w13,w13,w7 |
2129 | - add w4,w4,w12 |
2130 | - add w5,w5,w15 |
2131 | - and w12,w10,w9 |
2132 | - bic w15,w3,w9 |
2133 | - eor w11,w9,w9,ror#5 |
2134 | - add w5,w5,w13 |
2135 | - orr w12,w12,w15 |
2136 | - eor w11,w11,w9,ror#19 |
2137 | - eor w15,w5,w5,ror#11 |
2138 | - add w4,w4,w12 |
2139 | - ror w11,w11,#6 |
2140 | - eor w13,w5,w6 |
2141 | - eor w15,w15,w5,ror#20 |
2142 | - add w4,w4,w11 |
2143 | - ldr w12,[sp,#60] |
2144 | - and w14,w14,w13 |
2145 | - ror w15,w15,#2 |
2146 | - add w8,w8,w4 |
2147 | - eor w14,w14,w6 |
2148 | - add w3,w3,w12 |
2149 | - add w4,w4,w15 |
2150 | - and w12,w9,w8 |
2151 | - bic w15,w10,w8 |
2152 | - eor w11,w8,w8,ror#5 |
2153 | - add w4,w4,w14 |
2154 | - orr w12,w12,w15 |
2155 | - eor w11,w11,w8,ror#19 |
2156 | - eor w15,w4,w4,ror#11 |
2157 | - add w3,w3,w12 |
2158 | - ror w11,w11,#6 |
2159 | - eor w14,w4,w5 |
2160 | - eor w15,w15,w4,ror#20 |
2161 | - add w3,w3,w11 |
2162 | - and w13,w13,w14 |
2163 | - ror w15,w15,#2 |
2164 | - add w7,w7,w3 |
2165 | - eor w13,w13,w5 |
2166 | - st1 {v4.4s},[x17], #16 |
2167 | - add w3,w3,w15 // h+=Sigma0(a) from the past |
2168 | - ldp w11,w12,[x0,#0] |
2169 | - add w3,w3,w13 // h+=Maj(a,b,c) from the past |
2170 | - ldp w13,w14,[x0,#8] |
2171 | - add w3,w3,w11 // accumulate |
2172 | - add w4,w4,w12 |
2173 | - ldp w11,w12,[x0,#16] |
2174 | - add w5,w5,w13 |
2175 | - add w6,w6,w14 |
2176 | - ldp w13,w14,[x0,#24] |
2177 | - add w7,w7,w11 |
2178 | - add w8,w8,w12 |
2179 | - ldr w12,[sp,#0] |
2180 | - stp w3,w4,[x0,#0] |
2181 | - add w9,w9,w13 |
2182 | - mov w13,wzr |
2183 | - stp w5,w6,[x0,#8] |
2184 | - add w10,w10,w14 |
2185 | - stp w7,w8,[x0,#16] |
2186 | - eor w14,w4,w5 |
2187 | - stp w9,w10,[x0,#24] |
2188 | - mov w15,wzr |
2189 | - mov x17,sp |
2190 | - b.ne .L_00_48 |
2191 | - |
2192 | - ldr x29,[x29] |
2193 | - add sp,sp,#16*4+16 |
2194 | - ret |
2195 | -.size sha256_block_neon,.-sha256_block_neon |
2196 | -#ifndef __KERNEL__ |
2197 | -.comm OPENSSL_armcap_P,4,4 |
2198 | -#endif |
2199 | diff --git a/arch/arm64/crypto/sha512-core.S b/arch/arm64/crypto/sha512-core.S |
2200 | deleted file mode 100644 |
2201 | index bd0f59f06c9d..000000000000 |
2202 | --- a/arch/arm64/crypto/sha512-core.S |
2203 | +++ /dev/null |
2204 | @@ -1,1085 +0,0 @@ |
2205 | -// Copyright 2014-2016 The OpenSSL Project Authors. All Rights Reserved. |
2206 | -// |
2207 | -// Licensed under the OpenSSL license (the "License"). You may not use |
2208 | -// this file except in compliance with the License. You can obtain a copy |
2209 | -// in the file LICENSE in the source distribution or at |
2210 | -// https://www.openssl.org/source/license.html |
2211 | - |
2212 | -// ==================================================================== |
2213 | -// Written by Andy Polyakov <appro@openssl.org> for the OpenSSL |
2214 | -// project. The module is, however, dual licensed under OpenSSL and |
2215 | -// CRYPTOGAMS licenses depending on where you obtain it. For further |
2216 | -// details see http://www.openssl.org/~appro/cryptogams/. |
2217 | -// |
2218 | -// Permission to use under GPLv2 terms is granted. |
2219 | -// ==================================================================== |
2220 | -// |
2221 | -// SHA256/512 for ARMv8. |
2222 | -// |
2223 | -// Performance in cycles per processed byte and improvement coefficient |
2224 | -// over code generated with "default" compiler: |
2225 | -// |
2226 | -// SHA256-hw SHA256(*) SHA512 |
2227 | -// Apple A7 1.97 10.5 (+33%) 6.73 (-1%(**)) |
2228 | -// Cortex-A53 2.38 15.5 (+115%) 10.0 (+150%(***)) |
2229 | -// Cortex-A57 2.31 11.6 (+86%) 7.51 (+260%(***)) |
2230 | -// Denver 2.01 10.5 (+26%) 6.70 (+8%) |
2231 | -// X-Gene 20.0 (+100%) 12.8 (+300%(***)) |
2232 | -// Mongoose 2.36 13.0 (+50%) 8.36 (+33%) |
2233 | -// |
2234 | -// (*) Software SHA256 results are of lesser relevance, presented |
2235 | -// mostly for informational purposes. |
2236 | -// (**) The result is a trade-off: it's possible to improve it by |
2237 | -// 10% (or by 1 cycle per round), but at the cost of 20% loss |
2238 | -// on Cortex-A53 (or by 4 cycles per round). |
2239 | -// (***) Super-impressive coefficients over gcc-generated code are |
2240 | -// indication of some compiler "pathology", most notably code |
2241 | -// generated with -mgeneral-regs-only is significanty faster |
2242 | -// and the gap is only 40-90%. |
2243 | -// |
2244 | -// October 2016. |
2245 | -// |
2246 | -// Originally it was reckoned that it makes no sense to implement NEON |
2247 | -// version of SHA256 for 64-bit processors. This is because performance |
2248 | -// improvement on most wide-spread Cortex-A5x processors was observed |
2249 | -// to be marginal, same on Cortex-A53 and ~10% on A57. But then it was |
2250 | -// observed that 32-bit NEON SHA256 performs significantly better than |
2251 | -// 64-bit scalar version on *some* of the more recent processors. As |
2252 | -// result 64-bit NEON version of SHA256 was added to provide best |
2253 | -// all-round performance. For example it executes ~30% faster on X-Gene |
2254 | -// and Mongoose. [For reference, NEON version of SHA512 is bound to |
2255 | -// deliver much less improvement, likely *negative* on Cortex-A5x. |
2256 | -// Which is why NEON support is limited to SHA256.] |
2257 | - |
2258 | -#ifndef __KERNEL__ |
2259 | -# include "arm_arch.h" |
2260 | -#endif |
2261 | - |
2262 | -.text |
2263 | - |
2264 | -.extern OPENSSL_armcap_P |
2265 | -.globl sha512_block_data_order |
2266 | -.type sha512_block_data_order,%function |
2267 | -.align 6 |
2268 | -sha512_block_data_order: |
2269 | - stp x29,x30,[sp,#-128]! |
2270 | - add x29,sp,#0 |
2271 | - |
2272 | - stp x19,x20,[sp,#16] |
2273 | - stp x21,x22,[sp,#32] |
2274 | - stp x23,x24,[sp,#48] |
2275 | - stp x25,x26,[sp,#64] |
2276 | - stp x27,x28,[sp,#80] |
2277 | - sub sp,sp,#4*8 |
2278 | - |
2279 | - ldp x20,x21,[x0] // load context |
2280 | - ldp x22,x23,[x0,#2*8] |
2281 | - ldp x24,x25,[x0,#4*8] |
2282 | - add x2,x1,x2,lsl#7 // end of input |
2283 | - ldp x26,x27,[x0,#6*8] |
2284 | - adr x30,.LK512 |
2285 | - stp x0,x2,[x29,#96] |
2286 | - |
2287 | -.Loop: |
2288 | - ldp x3,x4,[x1],#2*8 |
2289 | - ldr x19,[x30],#8 // *K++ |
2290 | - eor x28,x21,x22 // magic seed |
2291 | - str x1,[x29,#112] |
2292 | -#ifndef __AARCH64EB__ |
2293 | - rev x3,x3 // 0 |
2294 | -#endif |
2295 | - ror x16,x24,#14 |
2296 | - add x27,x27,x19 // h+=K[i] |
2297 | - eor x6,x24,x24,ror#23 |
2298 | - and x17,x25,x24 |
2299 | - bic x19,x26,x24 |
2300 | - add x27,x27,x3 // h+=X[i] |
2301 | - orr x17,x17,x19 // Ch(e,f,g) |
2302 | - eor x19,x20,x21 // a^b, b^c in next round |
2303 | - eor x16,x16,x6,ror#18 // Sigma1(e) |
2304 | - ror x6,x20,#28 |
2305 | - add x27,x27,x17 // h+=Ch(e,f,g) |
2306 | - eor x17,x20,x20,ror#5 |
2307 | - add x27,x27,x16 // h+=Sigma1(e) |
2308 | - and x28,x28,x19 // (b^c)&=(a^b) |
2309 | - add x23,x23,x27 // d+=h |
2310 | - eor x28,x28,x21 // Maj(a,b,c) |
2311 | - eor x17,x6,x17,ror#34 // Sigma0(a) |
2312 | - add x27,x27,x28 // h+=Maj(a,b,c) |
2313 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2314 | - //add x27,x27,x17 // h+=Sigma0(a) |
2315 | -#ifndef __AARCH64EB__ |
2316 | - rev x4,x4 // 1 |
2317 | -#endif |
2318 | - ldp x5,x6,[x1],#2*8 |
2319 | - add x27,x27,x17 // h+=Sigma0(a) |
2320 | - ror x16,x23,#14 |
2321 | - add x26,x26,x28 // h+=K[i] |
2322 | - eor x7,x23,x23,ror#23 |
2323 | - and x17,x24,x23 |
2324 | - bic x28,x25,x23 |
2325 | - add x26,x26,x4 // h+=X[i] |
2326 | - orr x17,x17,x28 // Ch(e,f,g) |
2327 | - eor x28,x27,x20 // a^b, b^c in next round |
2328 | - eor x16,x16,x7,ror#18 // Sigma1(e) |
2329 | - ror x7,x27,#28 |
2330 | - add x26,x26,x17 // h+=Ch(e,f,g) |
2331 | - eor x17,x27,x27,ror#5 |
2332 | - add x26,x26,x16 // h+=Sigma1(e) |
2333 | - and x19,x19,x28 // (b^c)&=(a^b) |
2334 | - add x22,x22,x26 // d+=h |
2335 | - eor x19,x19,x20 // Maj(a,b,c) |
2336 | - eor x17,x7,x17,ror#34 // Sigma0(a) |
2337 | - add x26,x26,x19 // h+=Maj(a,b,c) |
2338 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2339 | - //add x26,x26,x17 // h+=Sigma0(a) |
2340 | -#ifndef __AARCH64EB__ |
2341 | - rev x5,x5 // 2 |
2342 | -#endif |
2343 | - add x26,x26,x17 // h+=Sigma0(a) |
2344 | - ror x16,x22,#14 |
2345 | - add x25,x25,x19 // h+=K[i] |
2346 | - eor x8,x22,x22,ror#23 |
2347 | - and x17,x23,x22 |
2348 | - bic x19,x24,x22 |
2349 | - add x25,x25,x5 // h+=X[i] |
2350 | - orr x17,x17,x19 // Ch(e,f,g) |
2351 | - eor x19,x26,x27 // a^b, b^c in next round |
2352 | - eor x16,x16,x8,ror#18 // Sigma1(e) |
2353 | - ror x8,x26,#28 |
2354 | - add x25,x25,x17 // h+=Ch(e,f,g) |
2355 | - eor x17,x26,x26,ror#5 |
2356 | - add x25,x25,x16 // h+=Sigma1(e) |
2357 | - and x28,x28,x19 // (b^c)&=(a^b) |
2358 | - add x21,x21,x25 // d+=h |
2359 | - eor x28,x28,x27 // Maj(a,b,c) |
2360 | - eor x17,x8,x17,ror#34 // Sigma0(a) |
2361 | - add x25,x25,x28 // h+=Maj(a,b,c) |
2362 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2363 | - //add x25,x25,x17 // h+=Sigma0(a) |
2364 | -#ifndef __AARCH64EB__ |
2365 | - rev x6,x6 // 3 |
2366 | -#endif |
2367 | - ldp x7,x8,[x1],#2*8 |
2368 | - add x25,x25,x17 // h+=Sigma0(a) |
2369 | - ror x16,x21,#14 |
2370 | - add x24,x24,x28 // h+=K[i] |
2371 | - eor x9,x21,x21,ror#23 |
2372 | - and x17,x22,x21 |
2373 | - bic x28,x23,x21 |
2374 | - add x24,x24,x6 // h+=X[i] |
2375 | - orr x17,x17,x28 // Ch(e,f,g) |
2376 | - eor x28,x25,x26 // a^b, b^c in next round |
2377 | - eor x16,x16,x9,ror#18 // Sigma1(e) |
2378 | - ror x9,x25,#28 |
2379 | - add x24,x24,x17 // h+=Ch(e,f,g) |
2380 | - eor x17,x25,x25,ror#5 |
2381 | - add x24,x24,x16 // h+=Sigma1(e) |
2382 | - and x19,x19,x28 // (b^c)&=(a^b) |
2383 | - add x20,x20,x24 // d+=h |
2384 | - eor x19,x19,x26 // Maj(a,b,c) |
2385 | - eor x17,x9,x17,ror#34 // Sigma0(a) |
2386 | - add x24,x24,x19 // h+=Maj(a,b,c) |
2387 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2388 | - //add x24,x24,x17 // h+=Sigma0(a) |
2389 | -#ifndef __AARCH64EB__ |
2390 | - rev x7,x7 // 4 |
2391 | -#endif |
2392 | - add x24,x24,x17 // h+=Sigma0(a) |
2393 | - ror x16,x20,#14 |
2394 | - add x23,x23,x19 // h+=K[i] |
2395 | - eor x10,x20,x20,ror#23 |
2396 | - and x17,x21,x20 |
2397 | - bic x19,x22,x20 |
2398 | - add x23,x23,x7 // h+=X[i] |
2399 | - orr x17,x17,x19 // Ch(e,f,g) |
2400 | - eor x19,x24,x25 // a^b, b^c in next round |
2401 | - eor x16,x16,x10,ror#18 // Sigma1(e) |
2402 | - ror x10,x24,#28 |
2403 | - add x23,x23,x17 // h+=Ch(e,f,g) |
2404 | - eor x17,x24,x24,ror#5 |
2405 | - add x23,x23,x16 // h+=Sigma1(e) |
2406 | - and x28,x28,x19 // (b^c)&=(a^b) |
2407 | - add x27,x27,x23 // d+=h |
2408 | - eor x28,x28,x25 // Maj(a,b,c) |
2409 | - eor x17,x10,x17,ror#34 // Sigma0(a) |
2410 | - add x23,x23,x28 // h+=Maj(a,b,c) |
2411 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2412 | - //add x23,x23,x17 // h+=Sigma0(a) |
2413 | -#ifndef __AARCH64EB__ |
2414 | - rev x8,x8 // 5 |
2415 | -#endif |
2416 | - ldp x9,x10,[x1],#2*8 |
2417 | - add x23,x23,x17 // h+=Sigma0(a) |
2418 | - ror x16,x27,#14 |
2419 | - add x22,x22,x28 // h+=K[i] |
2420 | - eor x11,x27,x27,ror#23 |
2421 | - and x17,x20,x27 |
2422 | - bic x28,x21,x27 |
2423 | - add x22,x22,x8 // h+=X[i] |
2424 | - orr x17,x17,x28 // Ch(e,f,g) |
2425 | - eor x28,x23,x24 // a^b, b^c in next round |
2426 | - eor x16,x16,x11,ror#18 // Sigma1(e) |
2427 | - ror x11,x23,#28 |
2428 | - add x22,x22,x17 // h+=Ch(e,f,g) |
2429 | - eor x17,x23,x23,ror#5 |
2430 | - add x22,x22,x16 // h+=Sigma1(e) |
2431 | - and x19,x19,x28 // (b^c)&=(a^b) |
2432 | - add x26,x26,x22 // d+=h |
2433 | - eor x19,x19,x24 // Maj(a,b,c) |
2434 | - eor x17,x11,x17,ror#34 // Sigma0(a) |
2435 | - add x22,x22,x19 // h+=Maj(a,b,c) |
2436 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2437 | - //add x22,x22,x17 // h+=Sigma0(a) |
2438 | -#ifndef __AARCH64EB__ |
2439 | - rev x9,x9 // 6 |
2440 | -#endif |
2441 | - add x22,x22,x17 // h+=Sigma0(a) |
2442 | - ror x16,x26,#14 |
2443 | - add x21,x21,x19 // h+=K[i] |
2444 | - eor x12,x26,x26,ror#23 |
2445 | - and x17,x27,x26 |
2446 | - bic x19,x20,x26 |
2447 | - add x21,x21,x9 // h+=X[i] |
2448 | - orr x17,x17,x19 // Ch(e,f,g) |
2449 | - eor x19,x22,x23 // a^b, b^c in next round |
2450 | - eor x16,x16,x12,ror#18 // Sigma1(e) |
2451 | - ror x12,x22,#28 |
2452 | - add x21,x21,x17 // h+=Ch(e,f,g) |
2453 | - eor x17,x22,x22,ror#5 |
2454 | - add x21,x21,x16 // h+=Sigma1(e) |
2455 | - and x28,x28,x19 // (b^c)&=(a^b) |
2456 | - add x25,x25,x21 // d+=h |
2457 | - eor x28,x28,x23 // Maj(a,b,c) |
2458 | - eor x17,x12,x17,ror#34 // Sigma0(a) |
2459 | - add x21,x21,x28 // h+=Maj(a,b,c) |
2460 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2461 | - //add x21,x21,x17 // h+=Sigma0(a) |
2462 | -#ifndef __AARCH64EB__ |
2463 | - rev x10,x10 // 7 |
2464 | -#endif |
2465 | - ldp x11,x12,[x1],#2*8 |
2466 | - add x21,x21,x17 // h+=Sigma0(a) |
2467 | - ror x16,x25,#14 |
2468 | - add x20,x20,x28 // h+=K[i] |
2469 | - eor x13,x25,x25,ror#23 |
2470 | - and x17,x26,x25 |
2471 | - bic x28,x27,x25 |
2472 | - add x20,x20,x10 // h+=X[i] |
2473 | - orr x17,x17,x28 // Ch(e,f,g) |
2474 | - eor x28,x21,x22 // a^b, b^c in next round |
2475 | - eor x16,x16,x13,ror#18 // Sigma1(e) |
2476 | - ror x13,x21,#28 |
2477 | - add x20,x20,x17 // h+=Ch(e,f,g) |
2478 | - eor x17,x21,x21,ror#5 |
2479 | - add x20,x20,x16 // h+=Sigma1(e) |
2480 | - and x19,x19,x28 // (b^c)&=(a^b) |
2481 | - add x24,x24,x20 // d+=h |
2482 | - eor x19,x19,x22 // Maj(a,b,c) |
2483 | - eor x17,x13,x17,ror#34 // Sigma0(a) |
2484 | - add x20,x20,x19 // h+=Maj(a,b,c) |
2485 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2486 | - //add x20,x20,x17 // h+=Sigma0(a) |
2487 | -#ifndef __AARCH64EB__ |
2488 | - rev x11,x11 // 8 |
2489 | -#endif |
2490 | - add x20,x20,x17 // h+=Sigma0(a) |
2491 | - ror x16,x24,#14 |
2492 | - add x27,x27,x19 // h+=K[i] |
2493 | - eor x14,x24,x24,ror#23 |
2494 | - and x17,x25,x24 |
2495 | - bic x19,x26,x24 |
2496 | - add x27,x27,x11 // h+=X[i] |
2497 | - orr x17,x17,x19 // Ch(e,f,g) |
2498 | - eor x19,x20,x21 // a^b, b^c in next round |
2499 | - eor x16,x16,x14,ror#18 // Sigma1(e) |
2500 | - ror x14,x20,#28 |
2501 | - add x27,x27,x17 // h+=Ch(e,f,g) |
2502 | - eor x17,x20,x20,ror#5 |
2503 | - add x27,x27,x16 // h+=Sigma1(e) |
2504 | - and x28,x28,x19 // (b^c)&=(a^b) |
2505 | - add x23,x23,x27 // d+=h |
2506 | - eor x28,x28,x21 // Maj(a,b,c) |
2507 | - eor x17,x14,x17,ror#34 // Sigma0(a) |
2508 | - add x27,x27,x28 // h+=Maj(a,b,c) |
2509 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2510 | - //add x27,x27,x17 // h+=Sigma0(a) |
2511 | -#ifndef __AARCH64EB__ |
2512 | - rev x12,x12 // 9 |
2513 | -#endif |
2514 | - ldp x13,x14,[x1],#2*8 |
2515 | - add x27,x27,x17 // h+=Sigma0(a) |
2516 | - ror x16,x23,#14 |
2517 | - add x26,x26,x28 // h+=K[i] |
2518 | - eor x15,x23,x23,ror#23 |
2519 | - and x17,x24,x23 |
2520 | - bic x28,x25,x23 |
2521 | - add x26,x26,x12 // h+=X[i] |
2522 | - orr x17,x17,x28 // Ch(e,f,g) |
2523 | - eor x28,x27,x20 // a^b, b^c in next round |
2524 | - eor x16,x16,x15,ror#18 // Sigma1(e) |
2525 | - ror x15,x27,#28 |
2526 | - add x26,x26,x17 // h+=Ch(e,f,g) |
2527 | - eor x17,x27,x27,ror#5 |
2528 | - add x26,x26,x16 // h+=Sigma1(e) |
2529 | - and x19,x19,x28 // (b^c)&=(a^b) |
2530 | - add x22,x22,x26 // d+=h |
2531 | - eor x19,x19,x20 // Maj(a,b,c) |
2532 | - eor x17,x15,x17,ror#34 // Sigma0(a) |
2533 | - add x26,x26,x19 // h+=Maj(a,b,c) |
2534 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2535 | - //add x26,x26,x17 // h+=Sigma0(a) |
2536 | -#ifndef __AARCH64EB__ |
2537 | - rev x13,x13 // 10 |
2538 | -#endif |
2539 | - add x26,x26,x17 // h+=Sigma0(a) |
2540 | - ror x16,x22,#14 |
2541 | - add x25,x25,x19 // h+=K[i] |
2542 | - eor x0,x22,x22,ror#23 |
2543 | - and x17,x23,x22 |
2544 | - bic x19,x24,x22 |
2545 | - add x25,x25,x13 // h+=X[i] |
2546 | - orr x17,x17,x19 // Ch(e,f,g) |
2547 | - eor x19,x26,x27 // a^b, b^c in next round |
2548 | - eor x16,x16,x0,ror#18 // Sigma1(e) |
2549 | - ror x0,x26,#28 |
2550 | - add x25,x25,x17 // h+=Ch(e,f,g) |
2551 | - eor x17,x26,x26,ror#5 |
2552 | - add x25,x25,x16 // h+=Sigma1(e) |
2553 | - and x28,x28,x19 // (b^c)&=(a^b) |
2554 | - add x21,x21,x25 // d+=h |
2555 | - eor x28,x28,x27 // Maj(a,b,c) |
2556 | - eor x17,x0,x17,ror#34 // Sigma0(a) |
2557 | - add x25,x25,x28 // h+=Maj(a,b,c) |
2558 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2559 | - //add x25,x25,x17 // h+=Sigma0(a) |
2560 | -#ifndef __AARCH64EB__ |
2561 | - rev x14,x14 // 11 |
2562 | -#endif |
2563 | - ldp x15,x0,[x1],#2*8 |
2564 | - add x25,x25,x17 // h+=Sigma0(a) |
2565 | - str x6,[sp,#24] |
2566 | - ror x16,x21,#14 |
2567 | - add x24,x24,x28 // h+=K[i] |
2568 | - eor x6,x21,x21,ror#23 |
2569 | - and x17,x22,x21 |
2570 | - bic x28,x23,x21 |
2571 | - add x24,x24,x14 // h+=X[i] |
2572 | - orr x17,x17,x28 // Ch(e,f,g) |
2573 | - eor x28,x25,x26 // a^b, b^c in next round |
2574 | - eor x16,x16,x6,ror#18 // Sigma1(e) |
2575 | - ror x6,x25,#28 |
2576 | - add x24,x24,x17 // h+=Ch(e,f,g) |
2577 | - eor x17,x25,x25,ror#5 |
2578 | - add x24,x24,x16 // h+=Sigma1(e) |
2579 | - and x19,x19,x28 // (b^c)&=(a^b) |
2580 | - add x20,x20,x24 // d+=h |
2581 | - eor x19,x19,x26 // Maj(a,b,c) |
2582 | - eor x17,x6,x17,ror#34 // Sigma0(a) |
2583 | - add x24,x24,x19 // h+=Maj(a,b,c) |
2584 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2585 | - //add x24,x24,x17 // h+=Sigma0(a) |
2586 | -#ifndef __AARCH64EB__ |
2587 | - rev x15,x15 // 12 |
2588 | -#endif |
2589 | - add x24,x24,x17 // h+=Sigma0(a) |
2590 | - str x7,[sp,#0] |
2591 | - ror x16,x20,#14 |
2592 | - add x23,x23,x19 // h+=K[i] |
2593 | - eor x7,x20,x20,ror#23 |
2594 | - and x17,x21,x20 |
2595 | - bic x19,x22,x20 |
2596 | - add x23,x23,x15 // h+=X[i] |
2597 | - orr x17,x17,x19 // Ch(e,f,g) |
2598 | - eor x19,x24,x25 // a^b, b^c in next round |
2599 | - eor x16,x16,x7,ror#18 // Sigma1(e) |
2600 | - ror x7,x24,#28 |
2601 | - add x23,x23,x17 // h+=Ch(e,f,g) |
2602 | - eor x17,x24,x24,ror#5 |
2603 | - add x23,x23,x16 // h+=Sigma1(e) |
2604 | - and x28,x28,x19 // (b^c)&=(a^b) |
2605 | - add x27,x27,x23 // d+=h |
2606 | - eor x28,x28,x25 // Maj(a,b,c) |
2607 | - eor x17,x7,x17,ror#34 // Sigma0(a) |
2608 | - add x23,x23,x28 // h+=Maj(a,b,c) |
2609 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2610 | - //add x23,x23,x17 // h+=Sigma0(a) |
2611 | -#ifndef __AARCH64EB__ |
2612 | - rev x0,x0 // 13 |
2613 | -#endif |
2614 | - ldp x1,x2,[x1] |
2615 | - add x23,x23,x17 // h+=Sigma0(a) |
2616 | - str x8,[sp,#8] |
2617 | - ror x16,x27,#14 |
2618 | - add x22,x22,x28 // h+=K[i] |
2619 | - eor x8,x27,x27,ror#23 |
2620 | - and x17,x20,x27 |
2621 | - bic x28,x21,x27 |
2622 | - add x22,x22,x0 // h+=X[i] |
2623 | - orr x17,x17,x28 // Ch(e,f,g) |
2624 | - eor x28,x23,x24 // a^b, b^c in next round |
2625 | - eor x16,x16,x8,ror#18 // Sigma1(e) |
2626 | - ror x8,x23,#28 |
2627 | - add x22,x22,x17 // h+=Ch(e,f,g) |
2628 | - eor x17,x23,x23,ror#5 |
2629 | - add x22,x22,x16 // h+=Sigma1(e) |
2630 | - and x19,x19,x28 // (b^c)&=(a^b) |
2631 | - add x26,x26,x22 // d+=h |
2632 | - eor x19,x19,x24 // Maj(a,b,c) |
2633 | - eor x17,x8,x17,ror#34 // Sigma0(a) |
2634 | - add x22,x22,x19 // h+=Maj(a,b,c) |
2635 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2636 | - //add x22,x22,x17 // h+=Sigma0(a) |
2637 | -#ifndef __AARCH64EB__ |
2638 | - rev x1,x1 // 14 |
2639 | -#endif |
2640 | - ldr x6,[sp,#24] |
2641 | - add x22,x22,x17 // h+=Sigma0(a) |
2642 | - str x9,[sp,#16] |
2643 | - ror x16,x26,#14 |
2644 | - add x21,x21,x19 // h+=K[i] |
2645 | - eor x9,x26,x26,ror#23 |
2646 | - and x17,x27,x26 |
2647 | - bic x19,x20,x26 |
2648 | - add x21,x21,x1 // h+=X[i] |
2649 | - orr x17,x17,x19 // Ch(e,f,g) |
2650 | - eor x19,x22,x23 // a^b, b^c in next round |
2651 | - eor x16,x16,x9,ror#18 // Sigma1(e) |
2652 | - ror x9,x22,#28 |
2653 | - add x21,x21,x17 // h+=Ch(e,f,g) |
2654 | - eor x17,x22,x22,ror#5 |
2655 | - add x21,x21,x16 // h+=Sigma1(e) |
2656 | - and x28,x28,x19 // (b^c)&=(a^b) |
2657 | - add x25,x25,x21 // d+=h |
2658 | - eor x28,x28,x23 // Maj(a,b,c) |
2659 | - eor x17,x9,x17,ror#34 // Sigma0(a) |
2660 | - add x21,x21,x28 // h+=Maj(a,b,c) |
2661 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2662 | - //add x21,x21,x17 // h+=Sigma0(a) |
2663 | -#ifndef __AARCH64EB__ |
2664 | - rev x2,x2 // 15 |
2665 | -#endif |
2666 | - ldr x7,[sp,#0] |
2667 | - add x21,x21,x17 // h+=Sigma0(a) |
2668 | - str x10,[sp,#24] |
2669 | - ror x16,x25,#14 |
2670 | - add x20,x20,x28 // h+=K[i] |
2671 | - ror x9,x4,#1 |
2672 | - and x17,x26,x25 |
2673 | - ror x8,x1,#19 |
2674 | - bic x28,x27,x25 |
2675 | - ror x10,x21,#28 |
2676 | - add x20,x20,x2 // h+=X[i] |
2677 | - eor x16,x16,x25,ror#18 |
2678 | - eor x9,x9,x4,ror#8 |
2679 | - orr x17,x17,x28 // Ch(e,f,g) |
2680 | - eor x28,x21,x22 // a^b, b^c in next round |
2681 | - eor x16,x16,x25,ror#41 // Sigma1(e) |
2682 | - eor x10,x10,x21,ror#34 |
2683 | - add x20,x20,x17 // h+=Ch(e,f,g) |
2684 | - and x19,x19,x28 // (b^c)&=(a^b) |
2685 | - eor x8,x8,x1,ror#61 |
2686 | - eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) |
2687 | - add x20,x20,x16 // h+=Sigma1(e) |
2688 | - eor x19,x19,x22 // Maj(a,b,c) |
2689 | - eor x17,x10,x21,ror#39 // Sigma0(a) |
2690 | - eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) |
2691 | - add x3,x3,x12 |
2692 | - add x24,x24,x20 // d+=h |
2693 | - add x20,x20,x19 // h+=Maj(a,b,c) |
2694 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2695 | - add x3,x3,x9 |
2696 | - add x20,x20,x17 // h+=Sigma0(a) |
2697 | - add x3,x3,x8 |
2698 | -.Loop_16_xx: |
2699 | - ldr x8,[sp,#8] |
2700 | - str x11,[sp,#0] |
2701 | - ror x16,x24,#14 |
2702 | - add x27,x27,x19 // h+=K[i] |
2703 | - ror x10,x5,#1 |
2704 | - and x17,x25,x24 |
2705 | - ror x9,x2,#19 |
2706 | - bic x19,x26,x24 |
2707 | - ror x11,x20,#28 |
2708 | - add x27,x27,x3 // h+=X[i] |
2709 | - eor x16,x16,x24,ror#18 |
2710 | - eor x10,x10,x5,ror#8 |
2711 | - orr x17,x17,x19 // Ch(e,f,g) |
2712 | - eor x19,x20,x21 // a^b, b^c in next round |
2713 | - eor x16,x16,x24,ror#41 // Sigma1(e) |
2714 | - eor x11,x11,x20,ror#34 |
2715 | - add x27,x27,x17 // h+=Ch(e,f,g) |
2716 | - and x28,x28,x19 // (b^c)&=(a^b) |
2717 | - eor x9,x9,x2,ror#61 |
2718 | - eor x10,x10,x5,lsr#7 // sigma0(X[i+1]) |
2719 | - add x27,x27,x16 // h+=Sigma1(e) |
2720 | - eor x28,x28,x21 // Maj(a,b,c) |
2721 | - eor x17,x11,x20,ror#39 // Sigma0(a) |
2722 | - eor x9,x9,x2,lsr#6 // sigma1(X[i+14]) |
2723 | - add x4,x4,x13 |
2724 | - add x23,x23,x27 // d+=h |
2725 | - add x27,x27,x28 // h+=Maj(a,b,c) |
2726 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2727 | - add x4,x4,x10 |
2728 | - add x27,x27,x17 // h+=Sigma0(a) |
2729 | - add x4,x4,x9 |
2730 | - ldr x9,[sp,#16] |
2731 | - str x12,[sp,#8] |
2732 | - ror x16,x23,#14 |
2733 | - add x26,x26,x28 // h+=K[i] |
2734 | - ror x11,x6,#1 |
2735 | - and x17,x24,x23 |
2736 | - ror x10,x3,#19 |
2737 | - bic x28,x25,x23 |
2738 | - ror x12,x27,#28 |
2739 | - add x26,x26,x4 // h+=X[i] |
2740 | - eor x16,x16,x23,ror#18 |
2741 | - eor x11,x11,x6,ror#8 |
2742 | - orr x17,x17,x28 // Ch(e,f,g) |
2743 | - eor x28,x27,x20 // a^b, b^c in next round |
2744 | - eor x16,x16,x23,ror#41 // Sigma1(e) |
2745 | - eor x12,x12,x27,ror#34 |
2746 | - add x26,x26,x17 // h+=Ch(e,f,g) |
2747 | - and x19,x19,x28 // (b^c)&=(a^b) |
2748 | - eor x10,x10,x3,ror#61 |
2749 | - eor x11,x11,x6,lsr#7 // sigma0(X[i+1]) |
2750 | - add x26,x26,x16 // h+=Sigma1(e) |
2751 | - eor x19,x19,x20 // Maj(a,b,c) |
2752 | - eor x17,x12,x27,ror#39 // Sigma0(a) |
2753 | - eor x10,x10,x3,lsr#6 // sigma1(X[i+14]) |
2754 | - add x5,x5,x14 |
2755 | - add x22,x22,x26 // d+=h |
2756 | - add x26,x26,x19 // h+=Maj(a,b,c) |
2757 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2758 | - add x5,x5,x11 |
2759 | - add x26,x26,x17 // h+=Sigma0(a) |
2760 | - add x5,x5,x10 |
2761 | - ldr x10,[sp,#24] |
2762 | - str x13,[sp,#16] |
2763 | - ror x16,x22,#14 |
2764 | - add x25,x25,x19 // h+=K[i] |
2765 | - ror x12,x7,#1 |
2766 | - and x17,x23,x22 |
2767 | - ror x11,x4,#19 |
2768 | - bic x19,x24,x22 |
2769 | - ror x13,x26,#28 |
2770 | - add x25,x25,x5 // h+=X[i] |
2771 | - eor x16,x16,x22,ror#18 |
2772 | - eor x12,x12,x7,ror#8 |
2773 | - orr x17,x17,x19 // Ch(e,f,g) |
2774 | - eor x19,x26,x27 // a^b, b^c in next round |
2775 | - eor x16,x16,x22,ror#41 // Sigma1(e) |
2776 | - eor x13,x13,x26,ror#34 |
2777 | - add x25,x25,x17 // h+=Ch(e,f,g) |
2778 | - and x28,x28,x19 // (b^c)&=(a^b) |
2779 | - eor x11,x11,x4,ror#61 |
2780 | - eor x12,x12,x7,lsr#7 // sigma0(X[i+1]) |
2781 | - add x25,x25,x16 // h+=Sigma1(e) |
2782 | - eor x28,x28,x27 // Maj(a,b,c) |
2783 | - eor x17,x13,x26,ror#39 // Sigma0(a) |
2784 | - eor x11,x11,x4,lsr#6 // sigma1(X[i+14]) |
2785 | - add x6,x6,x15 |
2786 | - add x21,x21,x25 // d+=h |
2787 | - add x25,x25,x28 // h+=Maj(a,b,c) |
2788 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2789 | - add x6,x6,x12 |
2790 | - add x25,x25,x17 // h+=Sigma0(a) |
2791 | - add x6,x6,x11 |
2792 | - ldr x11,[sp,#0] |
2793 | - str x14,[sp,#24] |
2794 | - ror x16,x21,#14 |
2795 | - add x24,x24,x28 // h+=K[i] |
2796 | - ror x13,x8,#1 |
2797 | - and x17,x22,x21 |
2798 | - ror x12,x5,#19 |
2799 | - bic x28,x23,x21 |
2800 | - ror x14,x25,#28 |
2801 | - add x24,x24,x6 // h+=X[i] |
2802 | - eor x16,x16,x21,ror#18 |
2803 | - eor x13,x13,x8,ror#8 |
2804 | - orr x17,x17,x28 // Ch(e,f,g) |
2805 | - eor x28,x25,x26 // a^b, b^c in next round |
2806 | - eor x16,x16,x21,ror#41 // Sigma1(e) |
2807 | - eor x14,x14,x25,ror#34 |
2808 | - add x24,x24,x17 // h+=Ch(e,f,g) |
2809 | - and x19,x19,x28 // (b^c)&=(a^b) |
2810 | - eor x12,x12,x5,ror#61 |
2811 | - eor x13,x13,x8,lsr#7 // sigma0(X[i+1]) |
2812 | - add x24,x24,x16 // h+=Sigma1(e) |
2813 | - eor x19,x19,x26 // Maj(a,b,c) |
2814 | - eor x17,x14,x25,ror#39 // Sigma0(a) |
2815 | - eor x12,x12,x5,lsr#6 // sigma1(X[i+14]) |
2816 | - add x7,x7,x0 |
2817 | - add x20,x20,x24 // d+=h |
2818 | - add x24,x24,x19 // h+=Maj(a,b,c) |
2819 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2820 | - add x7,x7,x13 |
2821 | - add x24,x24,x17 // h+=Sigma0(a) |
2822 | - add x7,x7,x12 |
2823 | - ldr x12,[sp,#8] |
2824 | - str x15,[sp,#0] |
2825 | - ror x16,x20,#14 |
2826 | - add x23,x23,x19 // h+=K[i] |
2827 | - ror x14,x9,#1 |
2828 | - and x17,x21,x20 |
2829 | - ror x13,x6,#19 |
2830 | - bic x19,x22,x20 |
2831 | - ror x15,x24,#28 |
2832 | - add x23,x23,x7 // h+=X[i] |
2833 | - eor x16,x16,x20,ror#18 |
2834 | - eor x14,x14,x9,ror#8 |
2835 | - orr x17,x17,x19 // Ch(e,f,g) |
2836 | - eor x19,x24,x25 // a^b, b^c in next round |
2837 | - eor x16,x16,x20,ror#41 // Sigma1(e) |
2838 | - eor x15,x15,x24,ror#34 |
2839 | - add x23,x23,x17 // h+=Ch(e,f,g) |
2840 | - and x28,x28,x19 // (b^c)&=(a^b) |
2841 | - eor x13,x13,x6,ror#61 |
2842 | - eor x14,x14,x9,lsr#7 // sigma0(X[i+1]) |
2843 | - add x23,x23,x16 // h+=Sigma1(e) |
2844 | - eor x28,x28,x25 // Maj(a,b,c) |
2845 | - eor x17,x15,x24,ror#39 // Sigma0(a) |
2846 | - eor x13,x13,x6,lsr#6 // sigma1(X[i+14]) |
2847 | - add x8,x8,x1 |
2848 | - add x27,x27,x23 // d+=h |
2849 | - add x23,x23,x28 // h+=Maj(a,b,c) |
2850 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2851 | - add x8,x8,x14 |
2852 | - add x23,x23,x17 // h+=Sigma0(a) |
2853 | - add x8,x8,x13 |
2854 | - ldr x13,[sp,#16] |
2855 | - str x0,[sp,#8] |
2856 | - ror x16,x27,#14 |
2857 | - add x22,x22,x28 // h+=K[i] |
2858 | - ror x15,x10,#1 |
2859 | - and x17,x20,x27 |
2860 | - ror x14,x7,#19 |
2861 | - bic x28,x21,x27 |
2862 | - ror x0,x23,#28 |
2863 | - add x22,x22,x8 // h+=X[i] |
2864 | - eor x16,x16,x27,ror#18 |
2865 | - eor x15,x15,x10,ror#8 |
2866 | - orr x17,x17,x28 // Ch(e,f,g) |
2867 | - eor x28,x23,x24 // a^b, b^c in next round |
2868 | - eor x16,x16,x27,ror#41 // Sigma1(e) |
2869 | - eor x0,x0,x23,ror#34 |
2870 | - add x22,x22,x17 // h+=Ch(e,f,g) |
2871 | - and x19,x19,x28 // (b^c)&=(a^b) |
2872 | - eor x14,x14,x7,ror#61 |
2873 | - eor x15,x15,x10,lsr#7 // sigma0(X[i+1]) |
2874 | - add x22,x22,x16 // h+=Sigma1(e) |
2875 | - eor x19,x19,x24 // Maj(a,b,c) |
2876 | - eor x17,x0,x23,ror#39 // Sigma0(a) |
2877 | - eor x14,x14,x7,lsr#6 // sigma1(X[i+14]) |
2878 | - add x9,x9,x2 |
2879 | - add x26,x26,x22 // d+=h |
2880 | - add x22,x22,x19 // h+=Maj(a,b,c) |
2881 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2882 | - add x9,x9,x15 |
2883 | - add x22,x22,x17 // h+=Sigma0(a) |
2884 | - add x9,x9,x14 |
2885 | - ldr x14,[sp,#24] |
2886 | - str x1,[sp,#16] |
2887 | - ror x16,x26,#14 |
2888 | - add x21,x21,x19 // h+=K[i] |
2889 | - ror x0,x11,#1 |
2890 | - and x17,x27,x26 |
2891 | - ror x15,x8,#19 |
2892 | - bic x19,x20,x26 |
2893 | - ror x1,x22,#28 |
2894 | - add x21,x21,x9 // h+=X[i] |
2895 | - eor x16,x16,x26,ror#18 |
2896 | - eor x0,x0,x11,ror#8 |
2897 | - orr x17,x17,x19 // Ch(e,f,g) |
2898 | - eor x19,x22,x23 // a^b, b^c in next round |
2899 | - eor x16,x16,x26,ror#41 // Sigma1(e) |
2900 | - eor x1,x1,x22,ror#34 |
2901 | - add x21,x21,x17 // h+=Ch(e,f,g) |
2902 | - and x28,x28,x19 // (b^c)&=(a^b) |
2903 | - eor x15,x15,x8,ror#61 |
2904 | - eor x0,x0,x11,lsr#7 // sigma0(X[i+1]) |
2905 | - add x21,x21,x16 // h+=Sigma1(e) |
2906 | - eor x28,x28,x23 // Maj(a,b,c) |
2907 | - eor x17,x1,x22,ror#39 // Sigma0(a) |
2908 | - eor x15,x15,x8,lsr#6 // sigma1(X[i+14]) |
2909 | - add x10,x10,x3 |
2910 | - add x25,x25,x21 // d+=h |
2911 | - add x21,x21,x28 // h+=Maj(a,b,c) |
2912 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2913 | - add x10,x10,x0 |
2914 | - add x21,x21,x17 // h+=Sigma0(a) |
2915 | - add x10,x10,x15 |
2916 | - ldr x15,[sp,#0] |
2917 | - str x2,[sp,#24] |
2918 | - ror x16,x25,#14 |
2919 | - add x20,x20,x28 // h+=K[i] |
2920 | - ror x1,x12,#1 |
2921 | - and x17,x26,x25 |
2922 | - ror x0,x9,#19 |
2923 | - bic x28,x27,x25 |
2924 | - ror x2,x21,#28 |
2925 | - add x20,x20,x10 // h+=X[i] |
2926 | - eor x16,x16,x25,ror#18 |
2927 | - eor x1,x1,x12,ror#8 |
2928 | - orr x17,x17,x28 // Ch(e,f,g) |
2929 | - eor x28,x21,x22 // a^b, b^c in next round |
2930 | - eor x16,x16,x25,ror#41 // Sigma1(e) |
2931 | - eor x2,x2,x21,ror#34 |
2932 | - add x20,x20,x17 // h+=Ch(e,f,g) |
2933 | - and x19,x19,x28 // (b^c)&=(a^b) |
2934 | - eor x0,x0,x9,ror#61 |
2935 | - eor x1,x1,x12,lsr#7 // sigma0(X[i+1]) |
2936 | - add x20,x20,x16 // h+=Sigma1(e) |
2937 | - eor x19,x19,x22 // Maj(a,b,c) |
2938 | - eor x17,x2,x21,ror#39 // Sigma0(a) |
2939 | - eor x0,x0,x9,lsr#6 // sigma1(X[i+14]) |
2940 | - add x11,x11,x4 |
2941 | - add x24,x24,x20 // d+=h |
2942 | - add x20,x20,x19 // h+=Maj(a,b,c) |
2943 | - ldr x19,[x30],#8 // *K++, x28 in next round |
2944 | - add x11,x11,x1 |
2945 | - add x20,x20,x17 // h+=Sigma0(a) |
2946 | - add x11,x11,x0 |
2947 | - ldr x0,[sp,#8] |
2948 | - str x3,[sp,#0] |
2949 | - ror x16,x24,#14 |
2950 | - add x27,x27,x19 // h+=K[i] |
2951 | - ror x2,x13,#1 |
2952 | - and x17,x25,x24 |
2953 | - ror x1,x10,#19 |
2954 | - bic x19,x26,x24 |
2955 | - ror x3,x20,#28 |
2956 | - add x27,x27,x11 // h+=X[i] |
2957 | - eor x16,x16,x24,ror#18 |
2958 | - eor x2,x2,x13,ror#8 |
2959 | - orr x17,x17,x19 // Ch(e,f,g) |
2960 | - eor x19,x20,x21 // a^b, b^c in next round |
2961 | - eor x16,x16,x24,ror#41 // Sigma1(e) |
2962 | - eor x3,x3,x20,ror#34 |
2963 | - add x27,x27,x17 // h+=Ch(e,f,g) |
2964 | - and x28,x28,x19 // (b^c)&=(a^b) |
2965 | - eor x1,x1,x10,ror#61 |
2966 | - eor x2,x2,x13,lsr#7 // sigma0(X[i+1]) |
2967 | - add x27,x27,x16 // h+=Sigma1(e) |
2968 | - eor x28,x28,x21 // Maj(a,b,c) |
2969 | - eor x17,x3,x20,ror#39 // Sigma0(a) |
2970 | - eor x1,x1,x10,lsr#6 // sigma1(X[i+14]) |
2971 | - add x12,x12,x5 |
2972 | - add x23,x23,x27 // d+=h |
2973 | - add x27,x27,x28 // h+=Maj(a,b,c) |
2974 | - ldr x28,[x30],#8 // *K++, x19 in next round |
2975 | - add x12,x12,x2 |
2976 | - add x27,x27,x17 // h+=Sigma0(a) |
2977 | - add x12,x12,x1 |
2978 | - ldr x1,[sp,#16] |
2979 | - str x4,[sp,#8] |
2980 | - ror x16,x23,#14 |
2981 | - add x26,x26,x28 // h+=K[i] |
2982 | - ror x3,x14,#1 |
2983 | - and x17,x24,x23 |
2984 | - ror x2,x11,#19 |
2985 | - bic x28,x25,x23 |
2986 | - ror x4,x27,#28 |
2987 | - add x26,x26,x12 // h+=X[i] |
2988 | - eor x16,x16,x23,ror#18 |
2989 | - eor x3,x3,x14,ror#8 |
2990 | - orr x17,x17,x28 // Ch(e,f,g) |
2991 | - eor x28,x27,x20 // a^b, b^c in next round |
2992 | - eor x16,x16,x23,ror#41 // Sigma1(e) |
2993 | - eor x4,x4,x27,ror#34 |
2994 | - add x26,x26,x17 // h+=Ch(e,f,g) |
2995 | - and x19,x19,x28 // (b^c)&=(a^b) |
2996 | - eor x2,x2,x11,ror#61 |
2997 | - eor x3,x3,x14,lsr#7 // sigma0(X[i+1]) |
2998 | - add x26,x26,x16 // h+=Sigma1(e) |
2999 | - eor x19,x19,x20 // Maj(a,b,c) |
3000 | - eor x17,x4,x27,ror#39 // Sigma0(a) |
3001 | - eor x2,x2,x11,lsr#6 // sigma1(X[i+14]) |
3002 | - add x13,x13,x6 |
3003 | - add x22,x22,x26 // d+=h |
3004 | - add x26,x26,x19 // h+=Maj(a,b,c) |
3005 | - ldr x19,[x30],#8 // *K++, x28 in next round |
3006 | - add x13,x13,x3 |
3007 | - add x26,x26,x17 // h+=Sigma0(a) |
3008 | - add x13,x13,x2 |
3009 | - ldr x2,[sp,#24] |
3010 | - str x5,[sp,#16] |
3011 | - ror x16,x22,#14 |
3012 | - add x25,x25,x19 // h+=K[i] |
3013 | - ror x4,x15,#1 |
3014 | - and x17,x23,x22 |
3015 | - ror x3,x12,#19 |
3016 | - bic x19,x24,x22 |
3017 | - ror x5,x26,#28 |
3018 | - add x25,x25,x13 // h+=X[i] |
3019 | - eor x16,x16,x22,ror#18 |
3020 | - eor x4,x4,x15,ror#8 |
3021 | - orr x17,x17,x19 // Ch(e,f,g) |
3022 | - eor x19,x26,x27 // a^b, b^c in next round |
3023 | - eor x16,x16,x22,ror#41 // Sigma1(e) |
3024 | - eor x5,x5,x26,ror#34 |
3025 | - add x25,x25,x17 // h+=Ch(e,f,g) |
3026 | - and x28,x28,x19 // (b^c)&=(a^b) |
3027 | - eor x3,x3,x12,ror#61 |
3028 | - eor x4,x4,x15,lsr#7 // sigma0(X[i+1]) |
3029 | - add x25,x25,x16 // h+=Sigma1(e) |
3030 | - eor x28,x28,x27 // Maj(a,b,c) |
3031 | - eor x17,x5,x26,ror#39 // Sigma0(a) |
3032 | - eor x3,x3,x12,lsr#6 // sigma1(X[i+14]) |
3033 | - add x14,x14,x7 |
3034 | - add x21,x21,x25 // d+=h |
3035 | - add x25,x25,x28 // h+=Maj(a,b,c) |
3036 | - ldr x28,[x30],#8 // *K++, x19 in next round |
3037 | - add x14,x14,x4 |
3038 | - add x25,x25,x17 // h+=Sigma0(a) |
3039 | - add x14,x14,x3 |
3040 | - ldr x3,[sp,#0] |
3041 | - str x6,[sp,#24] |
3042 | - ror x16,x21,#14 |
3043 | - add x24,x24,x28 // h+=K[i] |
3044 | - ror x5,x0,#1 |
3045 | - and x17,x22,x21 |
3046 | - ror x4,x13,#19 |
3047 | - bic x28,x23,x21 |
3048 | - ror x6,x25,#28 |
3049 | - add x24,x24,x14 // h+=X[i] |
3050 | - eor x16,x16,x21,ror#18 |
3051 | - eor x5,x5,x0,ror#8 |
3052 | - orr x17,x17,x28 // Ch(e,f,g) |
3053 | - eor x28,x25,x26 // a^b, b^c in next round |
3054 | - eor x16,x16,x21,ror#41 // Sigma1(e) |
3055 | - eor x6,x6,x25,ror#34 |
3056 | - add x24,x24,x17 // h+=Ch(e,f,g) |
3057 | - and x19,x19,x28 // (b^c)&=(a^b) |
3058 | - eor x4,x4,x13,ror#61 |
3059 | - eor x5,x5,x0,lsr#7 // sigma0(X[i+1]) |
3060 | - add x24,x24,x16 // h+=Sigma1(e) |
3061 | - eor x19,x19,x26 // Maj(a,b,c) |
3062 | - eor x17,x6,x25,ror#39 // Sigma0(a) |
3063 | - eor x4,x4,x13,lsr#6 // sigma1(X[i+14]) |
3064 | - add x15,x15,x8 |
3065 | - add x20,x20,x24 // d+=h |
3066 | - add x24,x24,x19 // h+=Maj(a,b,c) |
3067 | - ldr x19,[x30],#8 // *K++, x28 in next round |
3068 | - add x15,x15,x5 |
3069 | - add x24,x24,x17 // h+=Sigma0(a) |
3070 | - add x15,x15,x4 |
3071 | - ldr x4,[sp,#8] |
3072 | - str x7,[sp,#0] |
3073 | - ror x16,x20,#14 |
3074 | - add x23,x23,x19 // h+=K[i] |
3075 | - ror x6,x1,#1 |
3076 | - and x17,x21,x20 |
3077 | - ror x5,x14,#19 |
3078 | - bic x19,x22,x20 |
3079 | - ror x7,x24,#28 |
3080 | - add x23,x23,x15 // h+=X[i] |
3081 | - eor x16,x16,x20,ror#18 |
3082 | - eor x6,x6,x1,ror#8 |
3083 | - orr x17,x17,x19 // Ch(e,f,g) |
3084 | - eor x19,x24,x25 // a^b, b^c in next round |
3085 | - eor x16,x16,x20,ror#41 // Sigma1(e) |
3086 | - eor x7,x7,x24,ror#34 |
3087 | - add x23,x23,x17 // h+=Ch(e,f,g) |
3088 | - and x28,x28,x19 // (b^c)&=(a^b) |
3089 | - eor x5,x5,x14,ror#61 |
3090 | - eor x6,x6,x1,lsr#7 // sigma0(X[i+1]) |
3091 | - add x23,x23,x16 // h+=Sigma1(e) |
3092 | - eor x28,x28,x25 // Maj(a,b,c) |
3093 | - eor x17,x7,x24,ror#39 // Sigma0(a) |
3094 | - eor x5,x5,x14,lsr#6 // sigma1(X[i+14]) |
3095 | - add x0,x0,x9 |
3096 | - add x27,x27,x23 // d+=h |
3097 | - add x23,x23,x28 // h+=Maj(a,b,c) |
3098 | - ldr x28,[x30],#8 // *K++, x19 in next round |
3099 | - add x0,x0,x6 |
3100 | - add x23,x23,x17 // h+=Sigma0(a) |
3101 | - add x0,x0,x5 |
3102 | - ldr x5,[sp,#16] |
3103 | - str x8,[sp,#8] |
3104 | - ror x16,x27,#14 |
3105 | - add x22,x22,x28 // h+=K[i] |
3106 | - ror x7,x2,#1 |
3107 | - and x17,x20,x27 |
3108 | - ror x6,x15,#19 |
3109 | - bic x28,x21,x27 |
3110 | - ror x8,x23,#28 |
3111 | - add x22,x22,x0 // h+=X[i] |
3112 | - eor x16,x16,x27,ror#18 |
3113 | - eor x7,x7,x2,ror#8 |
3114 | - orr x17,x17,x28 // Ch(e,f,g) |
3115 | - eor x28,x23,x24 // a^b, b^c in next round |
3116 | - eor x16,x16,x27,ror#41 // Sigma1(e) |
3117 | - eor x8,x8,x23,ror#34 |
3118 | - add x22,x22,x17 // h+=Ch(e,f,g) |
3119 | - and x19,x19,x28 // (b^c)&=(a^b) |
3120 | - eor x6,x6,x15,ror#61 |
3121 | - eor x7,x7,x2,lsr#7 // sigma0(X[i+1]) |
3122 | - add x22,x22,x16 // h+=Sigma1(e) |
3123 | - eor x19,x19,x24 // Maj(a,b,c) |
3124 | - eor x17,x8,x23,ror#39 // Sigma0(a) |
3125 | - eor x6,x6,x15,lsr#6 // sigma1(X[i+14]) |
3126 | - add x1,x1,x10 |
3127 | - add x26,x26,x22 // d+=h |
3128 | - add x22,x22,x19 // h+=Maj(a,b,c) |
3129 | - ldr x19,[x30],#8 // *K++, x28 in next round |
3130 | - add x1,x1,x7 |
3131 | - add x22,x22,x17 // h+=Sigma0(a) |
3132 | - add x1,x1,x6 |
3133 | - ldr x6,[sp,#24] |
3134 | - str x9,[sp,#16] |
3135 | - ror x16,x26,#14 |
3136 | - add x21,x21,x19 // h+=K[i] |
3137 | - ror x8,x3,#1 |
3138 | - and x17,x27,x26 |
3139 | - ror x7,x0,#19 |
3140 | - bic x19,x20,x26 |
3141 | - ror x9,x22,#28 |
3142 | - add x21,x21,x1 // h+=X[i] |
3143 | - eor x16,x16,x26,ror#18 |
3144 | - eor x8,x8,x3,ror#8 |
3145 | - orr x17,x17,x19 // Ch(e,f,g) |
3146 | - eor x19,x22,x23 // a^b, b^c in next round |
3147 | - eor x16,x16,x26,ror#41 // Sigma1(e) |
3148 | - eor x9,x9,x22,ror#34 |
3149 | - add x21,x21,x17 // h+=Ch(e,f,g) |
3150 | - and x28,x28,x19 // (b^c)&=(a^b) |
3151 | - eor x7,x7,x0,ror#61 |
3152 | - eor x8,x8,x3,lsr#7 // sigma0(X[i+1]) |
3153 | - add x21,x21,x16 // h+=Sigma1(e) |
3154 | - eor x28,x28,x23 // Maj(a,b,c) |
3155 | - eor x17,x9,x22,ror#39 // Sigma0(a) |
3156 | - eor x7,x7,x0,lsr#6 // sigma1(X[i+14]) |
3157 | - add x2,x2,x11 |
3158 | - add x25,x25,x21 // d+=h |
3159 | - add x21,x21,x28 // h+=Maj(a,b,c) |
3160 | - ldr x28,[x30],#8 // *K++, x19 in next round |
3161 | - add x2,x2,x8 |
3162 | - add x21,x21,x17 // h+=Sigma0(a) |
3163 | - add x2,x2,x7 |
3164 | - ldr x7,[sp,#0] |
3165 | - str x10,[sp,#24] |
3166 | - ror x16,x25,#14 |
3167 | - add x20,x20,x28 // h+=K[i] |
3168 | - ror x9,x4,#1 |
3169 | - and x17,x26,x25 |
3170 | - ror x8,x1,#19 |
3171 | - bic x28,x27,x25 |
3172 | - ror x10,x21,#28 |
3173 | - add x20,x20,x2 // h+=X[i] |
3174 | - eor x16,x16,x25,ror#18 |
3175 | - eor x9,x9,x4,ror#8 |
3176 | - orr x17,x17,x28 // Ch(e,f,g) |
3177 | - eor x28,x21,x22 // a^b, b^c in next round |
3178 | - eor x16,x16,x25,ror#41 // Sigma1(e) |
3179 | - eor x10,x10,x21,ror#34 |
3180 | - add x20,x20,x17 // h+=Ch(e,f,g) |
3181 | - and x19,x19,x28 // (b^c)&=(a^b) |
3182 | - eor x8,x8,x1,ror#61 |
3183 | - eor x9,x9,x4,lsr#7 // sigma0(X[i+1]) |
3184 | - add x20,x20,x16 // h+=Sigma1(e) |
3185 | - eor x19,x19,x22 // Maj(a,b,c) |
3186 | - eor x17,x10,x21,ror#39 // Sigma0(a) |
3187 | - eor x8,x8,x1,lsr#6 // sigma1(X[i+14]) |
3188 | - add x3,x3,x12 |
3189 | - add x24,x24,x20 // d+=h |
3190 | - add x20,x20,x19 // h+=Maj(a,b,c) |
3191 | - ldr x19,[x30],#8 // *K++, x28 in next round |
3192 | - add x3,x3,x9 |
3193 | - add x20,x20,x17 // h+=Sigma0(a) |
3194 | - add x3,x3,x8 |
3195 | - cbnz x19,.Loop_16_xx |
3196 | - |
3197 | - ldp x0,x2,[x29,#96] |
3198 | - ldr x1,[x29,#112] |
3199 | - sub x30,x30,#648 // rewind |
3200 | - |
3201 | - ldp x3,x4,[x0] |
3202 | - ldp x5,x6,[x0,#2*8] |
3203 | - add x1,x1,#14*8 // advance input pointer |
3204 | - ldp x7,x8,[x0,#4*8] |
3205 | - add x20,x20,x3 |
3206 | - ldp x9,x10,[x0,#6*8] |
3207 | - add x21,x21,x4 |
3208 | - add x22,x22,x5 |
3209 | - add x23,x23,x6 |
3210 | - stp x20,x21,[x0] |
3211 | - add x24,x24,x7 |
3212 | - add x25,x25,x8 |
3213 | - stp x22,x23,[x0,#2*8] |
3214 | - add x26,x26,x9 |
3215 | - add x27,x27,x10 |
3216 | - cmp x1,x2 |
3217 | - stp x24,x25,[x0,#4*8] |
3218 | - stp x26,x27,[x0,#6*8] |
3219 | - b.ne .Loop |
3220 | - |
3221 | - ldp x19,x20,[x29,#16] |
3222 | - add sp,sp,#4*8 |
3223 | - ldp x21,x22,[x29,#32] |
3224 | - ldp x23,x24,[x29,#48] |
3225 | - ldp x25,x26,[x29,#64] |
3226 | - ldp x27,x28,[x29,#80] |
3227 | - ldp x29,x30,[sp],#128 |
3228 | - ret |
3229 | -.size sha512_block_data_order,.-sha512_block_data_order |
3230 | - |
3231 | -.align 6 |
3232 | -.type .LK512,%object |
3233 | -.LK512: |
3234 | - .quad 0x428a2f98d728ae22,0x7137449123ef65cd |
3235 | - .quad 0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc |
3236 | - .quad 0x3956c25bf348b538,0x59f111f1b605d019 |
3237 | - .quad 0x923f82a4af194f9b,0xab1c5ed5da6d8118 |
3238 | - .quad 0xd807aa98a3030242,0x12835b0145706fbe |
3239 | - .quad 0x243185be4ee4b28c,0x550c7dc3d5ffb4e2 |
3240 | - .quad 0x72be5d74f27b896f,0x80deb1fe3b1696b1 |
3241 | - .quad 0x9bdc06a725c71235,0xc19bf174cf692694 |
3242 | - .quad 0xe49b69c19ef14ad2,0xefbe4786384f25e3 |
3243 | - .quad 0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65 |
3244 | - .quad 0x2de92c6f592b0275,0x4a7484aa6ea6e483 |
3245 | - .quad 0x5cb0a9dcbd41fbd4,0x76f988da831153b5 |
3246 | - .quad 0x983e5152ee66dfab,0xa831c66d2db43210 |
3247 | - .quad 0xb00327c898fb213f,0xbf597fc7beef0ee4 |
3248 | - .quad 0xc6e00bf33da88fc2,0xd5a79147930aa725 |
3249 | - .quad 0x06ca6351e003826f,0x142929670a0e6e70 |
3250 | - .quad 0x27b70a8546d22ffc,0x2e1b21385c26c926 |
3251 | - .quad 0x4d2c6dfc5ac42aed,0x53380d139d95b3df |
3252 | - .quad 0x650a73548baf63de,0x766a0abb3c77b2a8 |
3253 | - .quad 0x81c2c92e47edaee6,0x92722c851482353b |
3254 | - .quad 0xa2bfe8a14cf10364,0xa81a664bbc423001 |
3255 | - .quad 0xc24b8b70d0f89791,0xc76c51a30654be30 |
3256 | - .quad 0xd192e819d6ef5218,0xd69906245565a910 |
3257 | - .quad 0xf40e35855771202a,0x106aa07032bbd1b8 |
3258 | - .quad 0x19a4c116b8d2d0c8,0x1e376c085141ab53 |
3259 | - .quad 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8 |
3260 | - .quad 0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb |
3261 | - .quad 0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3 |
3262 | - .quad 0x748f82ee5defb2fc,0x78a5636f43172f60 |
3263 | - .quad 0x84c87814a1f0ab72,0x8cc702081a6439ec |
3264 | - .quad 0x90befffa23631e28,0xa4506cebde82bde9 |
3265 | - .quad 0xbef9a3f7b2c67915,0xc67178f2e372532b |
3266 | - .quad 0xca273eceea26619c,0xd186b8c721c0c207 |
3267 | - .quad 0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178 |
3268 | - .quad 0x06f067aa72176fba,0x0a637dc5a2c898a6 |
3269 | - .quad 0x113f9804bef90dae,0x1b710b35131c471b |
3270 | - .quad 0x28db77f523047d84,0x32caab7b40c72493 |
3271 | - .quad 0x3c9ebe0a15c9bebc,0x431d67c49c100d4c |
3272 | - .quad 0x4cc5d4becb3e42b6,0x597f299cfc657e2a |
3273 | - .quad 0x5fcb6fab3ad6faec,0x6c44198c4a475817 |
3274 | - .quad 0 // terminator |
3275 | -.size .LK512,.-.LK512 |
3276 | -#ifndef __KERNEL__ |
3277 | -.align 3 |
3278 | -.LOPENSSL_armcap_P: |
3279 | -# ifdef __ILP32__ |
3280 | - .long OPENSSL_armcap_P-. |
3281 | -# else |
3282 | - .quad OPENSSL_armcap_P-. |
3283 | -# endif |
3284 | -#endif |
3285 | -.asciz "SHA512 block transform for ARMv8, CRYPTOGAMS by <appro@openssl.org>" |
3286 | -.align 2 |
3287 | -#ifndef __KERNEL__ |
3288 | -.comm OPENSSL_armcap_P,4,4 |
3289 | -#endif |
3290 | diff --git a/arch/mips/include/uapi/asm/sgidefs.h b/arch/mips/include/uapi/asm/sgidefs.h |
3291 | index 876442fcfb32..5be81f8fd479 100644 |
3292 | --- a/arch/mips/include/uapi/asm/sgidefs.h |
3293 | +++ b/arch/mips/include/uapi/asm/sgidefs.h |
3294 | @@ -10,14 +10,6 @@ |
3295 | #ifndef __ASM_SGIDEFS_H |
3296 | #define __ASM_SGIDEFS_H |
3297 | |
3298 | -/* |
3299 | - * Using a Linux compiler for building Linux seems logic but not to |
3300 | - * everybody. |
3301 | - */ |
3302 | -#ifndef __linux__ |
3303 | -#error Use a Linux compiler or give up. |
3304 | -#endif |
3305 | - |
3306 | /* |
3307 | * Definitions for the ISA levels |
3308 | * |
3309 | diff --git a/arch/s390/include/asm/facility.h b/arch/s390/include/asm/facility.h |
3310 | index 5811e7849a2e..1df70a73dc5c 100644 |
3311 | --- a/arch/s390/include/asm/facility.h |
3312 | +++ b/arch/s390/include/asm/facility.h |
3313 | @@ -61,6 +61,18 @@ static inline int test_facility(unsigned long nr) |
3314 | return __test_facility(nr, &S390_lowcore.stfle_fac_list); |
3315 | } |
3316 | |
3317 | +static inline unsigned long __stfle_asm(u64 *stfle_fac_list, int size) |
3318 | +{ |
3319 | + register unsigned long reg0 asm("0") = size - 1; |
3320 | + |
3321 | + asm volatile( |
3322 | + ".insn s,0xb2b00000,0(%1)" /* stfle */ |
3323 | + : "+d" (reg0) |
3324 | + : "a" (stfle_fac_list) |
3325 | + : "memory", "cc"); |
3326 | + return reg0; |
3327 | +} |
3328 | + |
3329 | /** |
3330 | * stfle - Store facility list extended |
3331 | * @stfle_fac_list: array where facility list can be stored |
3332 | @@ -78,13 +90,8 @@ static inline void stfle(u64 *stfle_fac_list, int size) |
3333 | memcpy(stfle_fac_list, &S390_lowcore.stfl_fac_list, 4); |
3334 | if (S390_lowcore.stfl_fac_list & 0x01000000) { |
3335 | /* More facility bits available with stfle */ |
3336 | - register unsigned long reg0 asm("0") = size - 1; |
3337 | - |
3338 | - asm volatile(".insn s,0xb2b00000,0(%1)" /* stfle */ |
3339 | - : "+d" (reg0) |
3340 | - : "a" (stfle_fac_list) |
3341 | - : "memory", "cc"); |
3342 | - nr = (reg0 + 1) * 8; /* # bytes stored by stfle */ |
3343 | + nr = __stfle_asm(stfle_fac_list, size); |
3344 | + nr = min_t(unsigned long, (nr + 1) * 8, size * 8); |
3345 | } |
3346 | memset((char *) stfle_fac_list + nr, 0, size * 8 - nr); |
3347 | preempt_enable(); |
3348 | diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c |
3349 | index e497d374412a..8d20fb09722c 100644 |
3350 | --- a/arch/x86/kernel/ptrace.c |
3351 | +++ b/arch/x86/kernel/ptrace.c |
3352 | @@ -23,6 +23,7 @@ |
3353 | #include <linux/rcupdate.h> |
3354 | #include <linux/export.h> |
3355 | #include <linux/context_tracking.h> |
3356 | +#include <linux/nospec.h> |
3357 | |
3358 | #include <asm/uaccess.h> |
3359 | #include <asm/pgtable.h> |
3360 | @@ -650,9 +651,11 @@ static unsigned long ptrace_get_debugreg(struct task_struct *tsk, int n) |
3361 | { |
3362 | struct thread_struct *thread = &tsk->thread; |
3363 | unsigned long val = 0; |
3364 | + int index = n; |
3365 | |
3366 | if (n < HBP_NUM) { |
3367 | - struct perf_event *bp = thread->ptrace_bps[n]; |
3368 | + struct perf_event *bp = thread->ptrace_bps[index]; |
3369 | + index = array_index_nospec(index, HBP_NUM); |
3370 | |
3371 | if (bp) |
3372 | val = bp->hw.info.address; |
3373 | diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c |
3374 | index 9692a5e9fdab..b95693a73f12 100644 |
3375 | --- a/arch/x86/kernel/tls.c |
3376 | +++ b/arch/x86/kernel/tls.c |
3377 | @@ -4,6 +4,7 @@ |
3378 | #include <linux/user.h> |
3379 | #include <linux/regset.h> |
3380 | #include <linux/syscalls.h> |
3381 | +#include <linux/nospec.h> |
3382 | |
3383 | #include <asm/uaccess.h> |
3384 | #include <asm/desc.h> |
3385 | @@ -219,6 +220,7 @@ int do_get_thread_area(struct task_struct *p, int idx, |
3386 | struct user_desc __user *u_info) |
3387 | { |
3388 | struct user_desc info; |
3389 | + int index; |
3390 | |
3391 | if (idx == -1 && get_user(idx, &u_info->entry_number)) |
3392 | return -EFAULT; |
3393 | @@ -226,8 +228,11 @@ int do_get_thread_area(struct task_struct *p, int idx, |
3394 | if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) |
3395 | return -EINVAL; |
3396 | |
3397 | - fill_user_desc(&info, idx, |
3398 | - &p->thread.tls_array[idx - GDT_ENTRY_TLS_MIN]); |
3399 | + index = idx - GDT_ENTRY_TLS_MIN; |
3400 | + index = array_index_nospec(index, |
3401 | + GDT_ENTRY_TLS_MAX - GDT_ENTRY_TLS_MIN + 1); |
3402 | + |
3403 | + fill_user_desc(&info, idx, &p->thread.tls_array[index]); |
3404 | |
3405 | if (copy_to_user(u_info, &info, sizeof(info))) |
3406 | return -EFAULT; |
3407 | diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c |
3408 | index 463033b4db1d..5a24a484ecc7 100644 |
3409 | --- a/drivers/crypto/talitos.c |
3410 | +++ b/drivers/crypto/talitos.c |
3411 | @@ -2185,7 +2185,7 @@ static struct talitos_alg_template driver_algs[] = { |
3412 | .base = { |
3413 | .cra_name = "authenc(hmac(sha1),cbc(aes))", |
3414 | .cra_driver_name = "authenc-hmac-sha1-" |
3415 | - "cbc-aes-talitos", |
3416 | + "cbc-aes-talitos-hsna", |
3417 | .cra_blocksize = AES_BLOCK_SIZE, |
3418 | .cra_flags = CRYPTO_ALG_ASYNC, |
3419 | }, |
3420 | @@ -2229,7 +2229,7 @@ static struct talitos_alg_template driver_algs[] = { |
3421 | .cra_name = "authenc(hmac(sha1)," |
3422 | "cbc(des3_ede))", |
3423 | .cra_driver_name = "authenc-hmac-sha1-" |
3424 | - "cbc-3des-talitos", |
3425 | + "cbc-3des-talitos-hsna", |
3426 | .cra_blocksize = DES3_EDE_BLOCK_SIZE, |
3427 | .cra_flags = CRYPTO_ALG_ASYNC, |
3428 | }, |
3429 | @@ -2271,7 +2271,7 @@ static struct talitos_alg_template driver_algs[] = { |
3430 | .base = { |
3431 | .cra_name = "authenc(hmac(sha224),cbc(aes))", |
3432 | .cra_driver_name = "authenc-hmac-sha224-" |
3433 | - "cbc-aes-talitos", |
3434 | + "cbc-aes-talitos-hsna", |
3435 | .cra_blocksize = AES_BLOCK_SIZE, |
3436 | .cra_flags = CRYPTO_ALG_ASYNC, |
3437 | }, |
3438 | @@ -2315,7 +2315,7 @@ static struct talitos_alg_template driver_algs[] = { |
3439 | .cra_name = "authenc(hmac(sha224)," |
3440 | "cbc(des3_ede))", |
3441 | .cra_driver_name = "authenc-hmac-sha224-" |
3442 | - "cbc-3des-talitos", |
3443 | + "cbc-3des-talitos-hsna", |
3444 | .cra_blocksize = DES3_EDE_BLOCK_SIZE, |
3445 | .cra_flags = CRYPTO_ALG_ASYNC, |
3446 | }, |
3447 | @@ -2357,7 +2357,7 @@ static struct talitos_alg_template driver_algs[] = { |
3448 | .base = { |
3449 | .cra_name = "authenc(hmac(sha256),cbc(aes))", |
3450 | .cra_driver_name = "authenc-hmac-sha256-" |
3451 | - "cbc-aes-talitos", |
3452 | + "cbc-aes-talitos-hsna", |
3453 | .cra_blocksize = AES_BLOCK_SIZE, |
3454 | .cra_flags = CRYPTO_ALG_ASYNC, |
3455 | }, |
3456 | @@ -2401,7 +2401,7 @@ static struct talitos_alg_template driver_algs[] = { |
3457 | .cra_name = "authenc(hmac(sha256)," |
3458 | "cbc(des3_ede))", |
3459 | .cra_driver_name = "authenc-hmac-sha256-" |
3460 | - "cbc-3des-talitos", |
3461 | + "cbc-3des-talitos-hsna", |
3462 | .cra_blocksize = DES3_EDE_BLOCK_SIZE, |
3463 | .cra_flags = CRYPTO_ALG_ASYNC, |
3464 | }, |
3465 | @@ -2527,7 +2527,7 @@ static struct talitos_alg_template driver_algs[] = { |
3466 | .base = { |
3467 | .cra_name = "authenc(hmac(md5),cbc(aes))", |
3468 | .cra_driver_name = "authenc-hmac-md5-" |
3469 | - "cbc-aes-talitos", |
3470 | + "cbc-aes-talitos-hsna", |
3471 | .cra_blocksize = AES_BLOCK_SIZE, |
3472 | .cra_flags = CRYPTO_ALG_ASYNC, |
3473 | }, |
3474 | @@ -2569,7 +2569,7 @@ static struct talitos_alg_template driver_algs[] = { |
3475 | .base = { |
3476 | .cra_name = "authenc(hmac(md5),cbc(des3_ede))", |
3477 | .cra_driver_name = "authenc-hmac-md5-" |
3478 | - "cbc-3des-talitos", |
3479 | + "cbc-3des-talitos-hsna", |
3480 | .cra_blocksize = DES3_EDE_BLOCK_SIZE, |
3481 | .cra_flags = CRYPTO_ALG_ASYNC, |
3482 | }, |
3483 | diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c |
3484 | index 2165f3dd328b..842c0235471d 100644 |
3485 | --- a/drivers/input/keyboard/imx_keypad.c |
3486 | +++ b/drivers/input/keyboard/imx_keypad.c |
3487 | @@ -530,11 +530,12 @@ static int imx_keypad_probe(struct platform_device *pdev) |
3488 | return 0; |
3489 | } |
3490 | |
3491 | -static int __maybe_unused imx_kbd_suspend(struct device *dev) |
3492 | +static int __maybe_unused imx_kbd_noirq_suspend(struct device *dev) |
3493 | { |
3494 | struct platform_device *pdev = to_platform_device(dev); |
3495 | struct imx_keypad *kbd = platform_get_drvdata(pdev); |
3496 | struct input_dev *input_dev = kbd->input_dev; |
3497 | + unsigned short reg_val = readw(kbd->mmio_base + KPSR); |
3498 | |
3499 | /* imx kbd can wake up system even clock is disabled */ |
3500 | mutex_lock(&input_dev->mutex); |
3501 | @@ -544,13 +545,20 @@ static int __maybe_unused imx_kbd_suspend(struct device *dev) |
3502 | |
3503 | mutex_unlock(&input_dev->mutex); |
3504 | |
3505 | - if (device_may_wakeup(&pdev->dev)) |
3506 | + if (device_may_wakeup(&pdev->dev)) { |
3507 | + if (reg_val & KBD_STAT_KPKD) |
3508 | + reg_val |= KBD_STAT_KRIE; |
3509 | + if (reg_val & KBD_STAT_KPKR) |
3510 | + reg_val |= KBD_STAT_KDIE; |
3511 | + writew(reg_val, kbd->mmio_base + KPSR); |
3512 | + |
3513 | enable_irq_wake(kbd->irq); |
3514 | + } |
3515 | |
3516 | return 0; |
3517 | } |
3518 | |
3519 | -static int __maybe_unused imx_kbd_resume(struct device *dev) |
3520 | +static int __maybe_unused imx_kbd_noirq_resume(struct device *dev) |
3521 | { |
3522 | struct platform_device *pdev = to_platform_device(dev); |
3523 | struct imx_keypad *kbd = platform_get_drvdata(pdev); |
3524 | @@ -574,7 +582,9 @@ err_clk: |
3525 | return ret; |
3526 | } |
3527 | |
3528 | -static SIMPLE_DEV_PM_OPS(imx_kbd_pm_ops, imx_kbd_suspend, imx_kbd_resume); |
3529 | +static const struct dev_pm_ops imx_kbd_pm_ops = { |
3530 | + SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(imx_kbd_noirq_suspend, imx_kbd_noirq_resume) |
3531 | +}; |
3532 | |
3533 | static struct platform_driver imx_keypad_driver = { |
3534 | .driver = { |
3535 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c |
3536 | index 38edf8f5bf8a..15be3ee6cc50 100644 |
3537 | --- a/drivers/input/mouse/elantech.c |
3538 | +++ b/drivers/input/mouse/elantech.c |
3539 | @@ -1187,6 +1187,8 @@ static const char * const middle_button_pnp_ids[] = { |
3540 | "LEN2132", /* ThinkPad P52 */ |
3541 | "LEN2133", /* ThinkPad P72 w/ NFC */ |
3542 | "LEN2134", /* ThinkPad P72 */ |
3543 | + "LEN0407", |
3544 | + "LEN0408", |
3545 | NULL |
3546 | }; |
3547 | |
3548 | diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c |
3549 | index 0aba34a7b3b3..727f9e571955 100644 |
3550 | --- a/drivers/md/dm-verity-target.c |
3551 | +++ b/drivers/md/dm-verity-target.c |
3552 | @@ -218,8 +218,8 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, |
3553 | BUG(); |
3554 | } |
3555 | |
3556 | - DMERR("%s: %s block %llu is corrupted", v->data_dev->name, type_str, |
3557 | - block); |
3558 | + DMERR_LIMIT("%s: %s block %llu is corrupted", v->data_dev->name, |
3559 | + type_str, block); |
3560 | |
3561 | if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS) |
3562 | DMERR("%s: reached maximum errors", v->data_dev->name); |
3563 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
3564 | index 21698eb671d7..765a16dab2e5 100644 |
3565 | --- a/drivers/md/md.c |
3566 | +++ b/drivers/md/md.c |
3567 | @@ -7296,9 +7296,9 @@ static void status_unused(struct seq_file *seq) |
3568 | static int status_resync(struct seq_file *seq, struct mddev *mddev) |
3569 | { |
3570 | sector_t max_sectors, resync, res; |
3571 | - unsigned long dt, db; |
3572 | - sector_t rt; |
3573 | - int scale; |
3574 | + unsigned long dt, db = 0; |
3575 | + sector_t rt, curr_mark_cnt, resync_mark_cnt; |
3576 | + int scale, recovery_active; |
3577 | unsigned int per_milli; |
3578 | |
3579 | if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery) || |
3580 | @@ -7368,22 +7368,30 @@ static int status_resync(struct seq_file *seq, struct mddev *mddev) |
3581 | * db: blocks written from mark until now |
3582 | * rt: remaining time |
3583 | * |
3584 | - * rt is a sector_t, so could be 32bit or 64bit. |
3585 | - * So we divide before multiply in case it is 32bit and close |
3586 | - * to the limit. |
3587 | - * We scale the divisor (db) by 32 to avoid losing precision |
3588 | - * near the end of resync when the number of remaining sectors |
3589 | - * is close to 'db'. |
3590 | - * We then divide rt by 32 after multiplying by db to compensate. |
3591 | - * The '+1' avoids division by zero if db is very small. |
3592 | + * rt is a sector_t, which is always 64bit now. We are keeping |
3593 | + * the original algorithm, but it is not really necessary. |
3594 | + * |
3595 | + * Original algorithm: |
3596 | + * So we divide before multiply in case it is 32bit and close |
3597 | + * to the limit. |
3598 | + * We scale the divisor (db) by 32 to avoid losing precision |
3599 | + * near the end of resync when the number of remaining sectors |
3600 | + * is close to 'db'. |
3601 | + * We then divide rt by 32 after multiplying by db to compensate. |
3602 | + * The '+1' avoids division by zero if db is very small. |
3603 | */ |
3604 | dt = ((jiffies - mddev->resync_mark) / HZ); |
3605 | if (!dt) dt++; |
3606 | - db = (mddev->curr_mark_cnt - atomic_read(&mddev->recovery_active)) |
3607 | - - mddev->resync_mark_cnt; |
3608 | + |
3609 | + curr_mark_cnt = mddev->curr_mark_cnt; |
3610 | + recovery_active = atomic_read(&mddev->recovery_active); |
3611 | + resync_mark_cnt = mddev->resync_mark_cnt; |
3612 | + |
3613 | + if (curr_mark_cnt >= (recovery_active + resync_mark_cnt)) |
3614 | + db = curr_mark_cnt - (recovery_active + resync_mark_cnt); |
3615 | |
3616 | rt = max_sectors - resync; /* number of remaining sectors */ |
3617 | - sector_div(rt, db/32+1); |
3618 | + rt = div64_u64(rt, db/32+1); |
3619 | rt *= dt; |
3620 | rt >>= 5; |
3621 | |
3622 | diff --git a/drivers/misc/vmw_vmci/vmci_context.c b/drivers/misc/vmw_vmci/vmci_context.c |
3623 | index f866a4baecb5..b9da2c6cc981 100644 |
3624 | --- a/drivers/misc/vmw_vmci/vmci_context.c |
3625 | +++ b/drivers/misc/vmw_vmci/vmci_context.c |
3626 | @@ -28,6 +28,9 @@ |
3627 | #include "vmci_driver.h" |
3628 | #include "vmci_event.h" |
3629 | |
3630 | +/* Use a wide upper bound for the maximum contexts. */ |
3631 | +#define VMCI_MAX_CONTEXTS 2000 |
3632 | + |
3633 | /* |
3634 | * List of current VMCI contexts. Contexts can be added by |
3635 | * vmci_ctx_create() and removed via vmci_ctx_destroy(). |
3636 | @@ -124,19 +127,22 @@ struct vmci_ctx *vmci_ctx_create(u32 cid, u32 priv_flags, |
3637 | /* Initialize host-specific VMCI context. */ |
3638 | init_waitqueue_head(&context->host_context.wait_queue); |
3639 | |
3640 | - context->queue_pair_array = vmci_handle_arr_create(0); |
3641 | + context->queue_pair_array = |
3642 | + vmci_handle_arr_create(0, VMCI_MAX_GUEST_QP_COUNT); |
3643 | if (!context->queue_pair_array) { |
3644 | error = -ENOMEM; |
3645 | goto err_free_ctx; |
3646 | } |
3647 | |
3648 | - context->doorbell_array = vmci_handle_arr_create(0); |
3649 | + context->doorbell_array = |
3650 | + vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); |
3651 | if (!context->doorbell_array) { |
3652 | error = -ENOMEM; |
3653 | goto err_free_qp_array; |
3654 | } |
3655 | |
3656 | - context->pending_doorbell_array = vmci_handle_arr_create(0); |
3657 | + context->pending_doorbell_array = |
3658 | + vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); |
3659 | if (!context->pending_doorbell_array) { |
3660 | error = -ENOMEM; |
3661 | goto err_free_db_array; |
3662 | @@ -211,7 +217,7 @@ static int ctx_fire_notification(u32 context_id, u32 priv_flags) |
3663 | * We create an array to hold the subscribers we find when |
3664 | * scanning through all contexts. |
3665 | */ |
3666 | - subscriber_array = vmci_handle_arr_create(0); |
3667 | + subscriber_array = vmci_handle_arr_create(0, VMCI_MAX_CONTEXTS); |
3668 | if (subscriber_array == NULL) |
3669 | return VMCI_ERROR_NO_MEM; |
3670 | |
3671 | @@ -630,20 +636,26 @@ int vmci_ctx_add_notification(u32 context_id, u32 remote_cid) |
3672 | |
3673 | spin_lock(&context->lock); |
3674 | |
3675 | - list_for_each_entry(n, &context->notifier_list, node) { |
3676 | - if (vmci_handle_is_equal(n->handle, notifier->handle)) { |
3677 | - exists = true; |
3678 | - break; |
3679 | + if (context->n_notifiers < VMCI_MAX_CONTEXTS) { |
3680 | + list_for_each_entry(n, &context->notifier_list, node) { |
3681 | + if (vmci_handle_is_equal(n->handle, notifier->handle)) { |
3682 | + exists = true; |
3683 | + break; |
3684 | + } |
3685 | } |
3686 | - } |
3687 | |
3688 | - if (exists) { |
3689 | - kfree(notifier); |
3690 | - result = VMCI_ERROR_ALREADY_EXISTS; |
3691 | + if (exists) { |
3692 | + kfree(notifier); |
3693 | + result = VMCI_ERROR_ALREADY_EXISTS; |
3694 | + } else { |
3695 | + list_add_tail_rcu(¬ifier->node, |
3696 | + &context->notifier_list); |
3697 | + context->n_notifiers++; |
3698 | + result = VMCI_SUCCESS; |
3699 | + } |
3700 | } else { |
3701 | - list_add_tail_rcu(¬ifier->node, &context->notifier_list); |
3702 | - context->n_notifiers++; |
3703 | - result = VMCI_SUCCESS; |
3704 | + kfree(notifier); |
3705 | + result = VMCI_ERROR_NO_MEM; |
3706 | } |
3707 | |
3708 | spin_unlock(&context->lock); |
3709 | @@ -728,8 +740,7 @@ static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context, |
3710 | u32 *buf_size, void **pbuf) |
3711 | { |
3712 | struct dbell_cpt_state *dbells; |
3713 | - size_t n_doorbells; |
3714 | - int i; |
3715 | + u32 i, n_doorbells; |
3716 | |
3717 | n_doorbells = vmci_handle_arr_get_size(context->doorbell_array); |
3718 | if (n_doorbells > 0) { |
3719 | @@ -867,7 +878,8 @@ int vmci_ctx_rcv_notifications_get(u32 context_id, |
3720 | spin_lock(&context->lock); |
3721 | |
3722 | *db_handle_array = context->pending_doorbell_array; |
3723 | - context->pending_doorbell_array = vmci_handle_arr_create(0); |
3724 | + context->pending_doorbell_array = |
3725 | + vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); |
3726 | if (!context->pending_doorbell_array) { |
3727 | context->pending_doorbell_array = *db_handle_array; |
3728 | *db_handle_array = NULL; |
3729 | @@ -949,12 +961,11 @@ int vmci_ctx_dbell_create(u32 context_id, struct vmci_handle handle) |
3730 | return VMCI_ERROR_NOT_FOUND; |
3731 | |
3732 | spin_lock(&context->lock); |
3733 | - if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) { |
3734 | - vmci_handle_arr_append_entry(&context->doorbell_array, handle); |
3735 | - result = VMCI_SUCCESS; |
3736 | - } else { |
3737 | + if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) |
3738 | + result = vmci_handle_arr_append_entry(&context->doorbell_array, |
3739 | + handle); |
3740 | + else |
3741 | result = VMCI_ERROR_DUPLICATE_ENTRY; |
3742 | - } |
3743 | |
3744 | spin_unlock(&context->lock); |
3745 | vmci_ctx_put(context); |
3746 | @@ -1090,15 +1101,16 @@ int vmci_ctx_notify_dbell(u32 src_cid, |
3747 | if (!vmci_handle_arr_has_entry( |
3748 | dst_context->pending_doorbell_array, |
3749 | handle)) { |
3750 | - vmci_handle_arr_append_entry( |
3751 | + result = vmci_handle_arr_append_entry( |
3752 | &dst_context->pending_doorbell_array, |
3753 | handle); |
3754 | - |
3755 | - ctx_signal_notify(dst_context); |
3756 | - wake_up(&dst_context->host_context.wait_queue); |
3757 | - |
3758 | + if (result == VMCI_SUCCESS) { |
3759 | + ctx_signal_notify(dst_context); |
3760 | + wake_up(&dst_context->host_context.wait_queue); |
3761 | + } |
3762 | + } else { |
3763 | + result = VMCI_SUCCESS; |
3764 | } |
3765 | - result = VMCI_SUCCESS; |
3766 | } |
3767 | spin_unlock(&dst_context->lock); |
3768 | } |
3769 | @@ -1125,13 +1137,11 @@ int vmci_ctx_qp_create(struct vmci_ctx *context, struct vmci_handle handle) |
3770 | if (context == NULL || vmci_handle_is_invalid(handle)) |
3771 | return VMCI_ERROR_INVALID_ARGS; |
3772 | |
3773 | - if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) { |
3774 | - vmci_handle_arr_append_entry(&context->queue_pair_array, |
3775 | - handle); |
3776 | - result = VMCI_SUCCESS; |
3777 | - } else { |
3778 | + if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) |
3779 | + result = vmci_handle_arr_append_entry( |
3780 | + &context->queue_pair_array, handle); |
3781 | + else |
3782 | result = VMCI_ERROR_DUPLICATE_ENTRY; |
3783 | - } |
3784 | |
3785 | return result; |
3786 | } |
3787 | diff --git a/drivers/misc/vmw_vmci/vmci_handle_array.c b/drivers/misc/vmw_vmci/vmci_handle_array.c |
3788 | index 344973a0fb0a..917e18a8af95 100644 |
3789 | --- a/drivers/misc/vmw_vmci/vmci_handle_array.c |
3790 | +++ b/drivers/misc/vmw_vmci/vmci_handle_array.c |
3791 | @@ -16,24 +16,29 @@ |
3792 | #include <linux/slab.h> |
3793 | #include "vmci_handle_array.h" |
3794 | |
3795 | -static size_t handle_arr_calc_size(size_t capacity) |
3796 | +static size_t handle_arr_calc_size(u32 capacity) |
3797 | { |
3798 | - return sizeof(struct vmci_handle_arr) + |
3799 | + return VMCI_HANDLE_ARRAY_HEADER_SIZE + |
3800 | capacity * sizeof(struct vmci_handle); |
3801 | } |
3802 | |
3803 | -struct vmci_handle_arr *vmci_handle_arr_create(size_t capacity) |
3804 | +struct vmci_handle_arr *vmci_handle_arr_create(u32 capacity, u32 max_capacity) |
3805 | { |
3806 | struct vmci_handle_arr *array; |
3807 | |
3808 | + if (max_capacity == 0 || capacity > max_capacity) |
3809 | + return NULL; |
3810 | + |
3811 | if (capacity == 0) |
3812 | - capacity = VMCI_HANDLE_ARRAY_DEFAULT_SIZE; |
3813 | + capacity = min((u32)VMCI_HANDLE_ARRAY_DEFAULT_CAPACITY, |
3814 | + max_capacity); |
3815 | |
3816 | array = kmalloc(handle_arr_calc_size(capacity), GFP_ATOMIC); |
3817 | if (!array) |
3818 | return NULL; |
3819 | |
3820 | array->capacity = capacity; |
3821 | + array->max_capacity = max_capacity; |
3822 | array->size = 0; |
3823 | |
3824 | return array; |
3825 | @@ -44,27 +49,34 @@ void vmci_handle_arr_destroy(struct vmci_handle_arr *array) |
3826 | kfree(array); |
3827 | } |
3828 | |
3829 | -void vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, |
3830 | - struct vmci_handle handle) |
3831 | +int vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, |
3832 | + struct vmci_handle handle) |
3833 | { |
3834 | struct vmci_handle_arr *array = *array_ptr; |
3835 | |
3836 | if (unlikely(array->size >= array->capacity)) { |
3837 | /* reallocate. */ |
3838 | struct vmci_handle_arr *new_array; |
3839 | - size_t new_capacity = array->capacity * VMCI_ARR_CAP_MULT; |
3840 | - size_t new_size = handle_arr_calc_size(new_capacity); |
3841 | + u32 capacity_bump = min(array->max_capacity - array->capacity, |
3842 | + array->capacity); |
3843 | + size_t new_size = handle_arr_calc_size(array->capacity + |
3844 | + capacity_bump); |
3845 | + |
3846 | + if (array->size >= array->max_capacity) |
3847 | + return VMCI_ERROR_NO_MEM; |
3848 | |
3849 | new_array = krealloc(array, new_size, GFP_ATOMIC); |
3850 | if (!new_array) |
3851 | - return; |
3852 | + return VMCI_ERROR_NO_MEM; |
3853 | |
3854 | - new_array->capacity = new_capacity; |
3855 | + new_array->capacity += capacity_bump; |
3856 | *array_ptr = array = new_array; |
3857 | } |
3858 | |
3859 | array->entries[array->size] = handle; |
3860 | array->size++; |
3861 | + |
3862 | + return VMCI_SUCCESS; |
3863 | } |
3864 | |
3865 | /* |
3866 | @@ -74,7 +86,7 @@ struct vmci_handle vmci_handle_arr_remove_entry(struct vmci_handle_arr *array, |
3867 | struct vmci_handle entry_handle) |
3868 | { |
3869 | struct vmci_handle handle = VMCI_INVALID_HANDLE; |
3870 | - size_t i; |
3871 | + u32 i; |
3872 | |
3873 | for (i = 0; i < array->size; i++) { |
3874 | if (vmci_handle_is_equal(array->entries[i], entry_handle)) { |
3875 | @@ -109,7 +121,7 @@ struct vmci_handle vmci_handle_arr_remove_tail(struct vmci_handle_arr *array) |
3876 | * Handle at given index, VMCI_INVALID_HANDLE if invalid index. |
3877 | */ |
3878 | struct vmci_handle |
3879 | -vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index) |
3880 | +vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, u32 index) |
3881 | { |
3882 | if (unlikely(index >= array->size)) |
3883 | return VMCI_INVALID_HANDLE; |
3884 | @@ -120,7 +132,7 @@ vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index) |
3885 | bool vmci_handle_arr_has_entry(const struct vmci_handle_arr *array, |
3886 | struct vmci_handle entry_handle) |
3887 | { |
3888 | - size_t i; |
3889 | + u32 i; |
3890 | |
3891 | for (i = 0; i < array->size; i++) |
3892 | if (vmci_handle_is_equal(array->entries[i], entry_handle)) |
3893 | diff --git a/drivers/misc/vmw_vmci/vmci_handle_array.h b/drivers/misc/vmw_vmci/vmci_handle_array.h |
3894 | index b5f3a7f98cf1..0fc58597820e 100644 |
3895 | --- a/drivers/misc/vmw_vmci/vmci_handle_array.h |
3896 | +++ b/drivers/misc/vmw_vmci/vmci_handle_array.h |
3897 | @@ -17,32 +17,41 @@ |
3898 | #define _VMCI_HANDLE_ARRAY_H_ |
3899 | |
3900 | #include <linux/vmw_vmci_defs.h> |
3901 | +#include <linux/limits.h> |
3902 | #include <linux/types.h> |
3903 | |
3904 | -#define VMCI_HANDLE_ARRAY_DEFAULT_SIZE 4 |
3905 | -#define VMCI_ARR_CAP_MULT 2 /* Array capacity multiplier */ |
3906 | - |
3907 | struct vmci_handle_arr { |
3908 | - size_t capacity; |
3909 | - size_t size; |
3910 | + u32 capacity; |
3911 | + u32 max_capacity; |
3912 | + u32 size; |
3913 | + u32 pad; |
3914 | struct vmci_handle entries[]; |
3915 | }; |
3916 | |
3917 | -struct vmci_handle_arr *vmci_handle_arr_create(size_t capacity); |
3918 | +#define VMCI_HANDLE_ARRAY_HEADER_SIZE \ |
3919 | + offsetof(struct vmci_handle_arr, entries) |
3920 | +/* Select a default capacity that results in a 64 byte sized array */ |
3921 | +#define VMCI_HANDLE_ARRAY_DEFAULT_CAPACITY 6 |
3922 | +/* Make sure that the max array size can be expressed by a u32 */ |
3923 | +#define VMCI_HANDLE_ARRAY_MAX_CAPACITY \ |
3924 | + ((U32_MAX - VMCI_HANDLE_ARRAY_HEADER_SIZE - 1) / \ |
3925 | + sizeof(struct vmci_handle)) |
3926 | + |
3927 | +struct vmci_handle_arr *vmci_handle_arr_create(u32 capacity, u32 max_capacity); |
3928 | void vmci_handle_arr_destroy(struct vmci_handle_arr *array); |
3929 | -void vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, |
3930 | - struct vmci_handle handle); |
3931 | +int vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, |
3932 | + struct vmci_handle handle); |
3933 | struct vmci_handle vmci_handle_arr_remove_entry(struct vmci_handle_arr *array, |
3934 | struct vmci_handle |
3935 | entry_handle); |
3936 | struct vmci_handle vmci_handle_arr_remove_tail(struct vmci_handle_arr *array); |
3937 | struct vmci_handle |
3938 | -vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index); |
3939 | +vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, u32 index); |
3940 | bool vmci_handle_arr_has_entry(const struct vmci_handle_arr *array, |
3941 | struct vmci_handle entry_handle); |
3942 | struct vmci_handle *vmci_handle_arr_get_handles(struct vmci_handle_arr *array); |
3943 | |
3944 | -static inline size_t vmci_handle_arr_get_size( |
3945 | +static inline u32 vmci_handle_arr_get_size( |
3946 | const struct vmci_handle_arr *array) |
3947 | { |
3948 | return array->size; |
3949 | diff --git a/drivers/net/can/spi/Kconfig b/drivers/net/can/spi/Kconfig |
3950 | index 148cae5871a6..249d2db7d600 100644 |
3951 | --- a/drivers/net/can/spi/Kconfig |
3952 | +++ b/drivers/net/can/spi/Kconfig |
3953 | @@ -2,9 +2,10 @@ menu "CAN SPI interfaces" |
3954 | depends on SPI |
3955 | |
3956 | config CAN_MCP251X |
3957 | - tristate "Microchip MCP251x SPI CAN controllers" |
3958 | + tristate "Microchip MCP251x and MCP25625 SPI CAN controllers" |
3959 | depends on HAS_DMA |
3960 | ---help--- |
3961 | - Driver for the Microchip MCP251x SPI CAN controllers. |
3962 | + Driver for the Microchip MCP251x and MCP25625 SPI CAN |
3963 | + controllers. |
3964 | |
3965 | endmenu |
3966 | diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c |
3967 | index f3f05fea8e1f..d8c448beab24 100644 |
3968 | --- a/drivers/net/can/spi/mcp251x.c |
3969 | +++ b/drivers/net/can/spi/mcp251x.c |
3970 | @@ -1,5 +1,5 @@ |
3971 | /* |
3972 | - * CAN bus driver for Microchip 251x CAN Controller with SPI Interface |
3973 | + * CAN bus driver for Microchip 251x/25625 CAN Controller with SPI Interface |
3974 | * |
3975 | * MCP2510 support and bug fixes by Christian Pellegrin |
3976 | * <chripell@evolware.org> |
3977 | @@ -41,7 +41,7 @@ |
3978 | * static struct spi_board_info spi_board_info[] = { |
3979 | * { |
3980 | * .modalias = "mcp2510", |
3981 | - * // or "mcp2515" depending on your controller |
3982 | + * // "mcp2515" or "mcp25625" depending on your controller |
3983 | * .platform_data = &mcp251x_info, |
3984 | * .irq = IRQ_EINT13, |
3985 | * .max_speed_hz = 2*1000*1000, |
3986 | @@ -238,6 +238,7 @@ static const struct can_bittiming_const mcp251x_bittiming_const = { |
3987 | enum mcp251x_model { |
3988 | CAN_MCP251X_MCP2510 = 0x2510, |
3989 | CAN_MCP251X_MCP2515 = 0x2515, |
3990 | + CAN_MCP251X_MCP25625 = 0x25625, |
3991 | }; |
3992 | |
3993 | struct mcp251x_priv { |
3994 | @@ -280,7 +281,6 @@ static inline int mcp251x_is_##_model(struct spi_device *spi) \ |
3995 | } |
3996 | |
3997 | MCP251X_IS(2510); |
3998 | -MCP251X_IS(2515); |
3999 | |
4000 | static void mcp251x_clean(struct net_device *net) |
4001 | { |
4002 | @@ -640,7 +640,7 @@ static int mcp251x_hw_reset(struct spi_device *spi) |
4003 | |
4004 | /* Wait for oscillator startup timer after reset */ |
4005 | mdelay(MCP251X_OST_DELAY_MS); |
4006 | - |
4007 | + |
4008 | reg = mcp251x_read_reg(spi, CANSTAT); |
4009 | if ((reg & CANCTRL_REQOP_MASK) != CANCTRL_REQOP_CONF) |
4010 | return -ENODEV; |
4011 | @@ -821,9 +821,8 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) |
4012 | /* receive buffer 0 */ |
4013 | if (intf & CANINTF_RX0IF) { |
4014 | mcp251x_hw_rx(spi, 0); |
4015 | - /* |
4016 | - * Free one buffer ASAP |
4017 | - * (The MCP2515 does this automatically.) |
4018 | + /* Free one buffer ASAP |
4019 | + * (The MCP2515/25625 does this automatically.) |
4020 | */ |
4021 | if (mcp251x_is_2510(spi)) |
4022 | mcp251x_write_bits(spi, CANINTF, CANINTF_RX0IF, 0x00); |
4023 | @@ -832,7 +831,7 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) |
4024 | /* receive buffer 1 */ |
4025 | if (intf & CANINTF_RX1IF) { |
4026 | mcp251x_hw_rx(spi, 1); |
4027 | - /* the MCP2515 does this automatically */ |
4028 | + /* The MCP2515/25625 does this automatically. */ |
4029 | if (mcp251x_is_2510(spi)) |
4030 | clear_intf |= CANINTF_RX1IF; |
4031 | } |
4032 | @@ -1007,6 +1006,10 @@ static const struct of_device_id mcp251x_of_match[] = { |
4033 | .compatible = "microchip,mcp2515", |
4034 | .data = (void *)CAN_MCP251X_MCP2515, |
4035 | }, |
4036 | + { |
4037 | + .compatible = "microchip,mcp25625", |
4038 | + .data = (void *)CAN_MCP251X_MCP25625, |
4039 | + }, |
4040 | { } |
4041 | }; |
4042 | MODULE_DEVICE_TABLE(of, mcp251x_of_match); |
4043 | @@ -1020,6 +1023,10 @@ static const struct spi_device_id mcp251x_id_table[] = { |
4044 | .name = "mcp2515", |
4045 | .driver_data = (kernel_ulong_t)CAN_MCP251X_MCP2515, |
4046 | }, |
4047 | + { |
4048 | + .name = "mcp25625", |
4049 | + .driver_data = (kernel_ulong_t)CAN_MCP251X_MCP25625, |
4050 | + }, |
4051 | { } |
4052 | }; |
4053 | MODULE_DEVICE_TABLE(spi, mcp251x_id_table); |
4054 | @@ -1260,5 +1267,5 @@ module_spi_driver(mcp251x_can_driver); |
4055 | |
4056 | MODULE_AUTHOR("Chris Elston <celston@katalix.com>, " |
4057 | "Christian Pellegrin <chripell@evolware.org>"); |
4058 | -MODULE_DESCRIPTION("Microchip 251x CAN driver"); |
4059 | +MODULE_DESCRIPTION("Microchip 251x/25625 CAN driver"); |
4060 | MODULE_LICENSE("GPL v2"); |
4061 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c |
4062 | index 8aecd8ef6542..15a0850e6bde 100644 |
4063 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c |
4064 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c |
4065 | @@ -1562,7 +1562,8 @@ static int bnx2x_get_module_info(struct net_device *dev, |
4066 | } |
4067 | |
4068 | if (!sff8472_comp || |
4069 | - (diag_type & SFP_EEPROM_DIAG_ADDR_CHANGE_REQ)) { |
4070 | + (diag_type & SFP_EEPROM_DIAG_ADDR_CHANGE_REQ) || |
4071 | + !(diag_type & SFP_EEPROM_DDM_IMPLEMENTED)) { |
4072 | modinfo->type = ETH_MODULE_SFF_8079; |
4073 | modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; |
4074 | } else { |
4075 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h |
4076 | index b7d251108c19..7115f5025664 100644 |
4077 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h |
4078 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h |
4079 | @@ -62,6 +62,7 @@ |
4080 | #define SFP_EEPROM_DIAG_TYPE_ADDR 0x5c |
4081 | #define SFP_EEPROM_DIAG_TYPE_SIZE 1 |
4082 | #define SFP_EEPROM_DIAG_ADDR_CHANGE_REQ (1<<2) |
4083 | +#define SFP_EEPROM_DDM_IMPLEMENTED (1<<6) |
4084 | #define SFP_EEPROM_SFF_8472_COMP_ADDR 0x5e |
4085 | #define SFP_EEPROM_SFF_8472_COMP_SIZE 1 |
4086 | |
4087 | diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c |
4088 | index 345818193de9..56db37d92937 100644 |
4089 | --- a/drivers/net/ethernet/emulex/benet/be_ethtool.c |
4090 | +++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c |
4091 | @@ -898,7 +898,7 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test, |
4092 | u64 *data) |
4093 | { |
4094 | struct be_adapter *adapter = netdev_priv(netdev); |
4095 | - int status; |
4096 | + int status, cnt; |
4097 | u8 link_status = 0; |
4098 | |
4099 | if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) { |
4100 | @@ -909,6 +909,9 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test, |
4101 | |
4102 | memset(data, 0, sizeof(u64) * ETHTOOL_TESTS_NUM); |
4103 | |
4104 | + /* check link status before offline tests */ |
4105 | + link_status = netif_carrier_ok(netdev); |
4106 | + |
4107 | if (test->flags & ETH_TEST_FL_OFFLINE) { |
4108 | if (be_loopback_test(adapter, BE_MAC_LOOPBACK, &data[0]) != 0) |
4109 | test->flags |= ETH_TEST_FL_FAILED; |
4110 | @@ -929,13 +932,26 @@ static void be_self_test(struct net_device *netdev, struct ethtool_test *test, |
4111 | test->flags |= ETH_TEST_FL_FAILED; |
4112 | } |
4113 | |
4114 | - status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); |
4115 | - if (status) { |
4116 | - test->flags |= ETH_TEST_FL_FAILED; |
4117 | - data[4] = -1; |
4118 | - } else if (!link_status) { |
4119 | + /* link status was down prior to test */ |
4120 | + if (!link_status) { |
4121 | test->flags |= ETH_TEST_FL_FAILED; |
4122 | data[4] = 1; |
4123 | + return; |
4124 | + } |
4125 | + |
4126 | + for (cnt = 10; cnt; cnt--) { |
4127 | + status = be_cmd_link_status_query(adapter, NULL, &link_status, |
4128 | + 0); |
4129 | + if (status) { |
4130 | + test->flags |= ETH_TEST_FL_FAILED; |
4131 | + data[4] = -1; |
4132 | + break; |
4133 | + } |
4134 | + |
4135 | + if (link_status) |
4136 | + break; |
4137 | + |
4138 | + msleep_interruptible(500); |
4139 | } |
4140 | } |
4141 | |
4142 | diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c |
4143 | index 8bbedfc9c48f..a0f97c5ab6ef 100644 |
4144 | --- a/drivers/net/ethernet/intel/e1000e/netdev.c |
4145 | +++ b/drivers/net/ethernet/intel/e1000e/netdev.c |
4146 | @@ -4212,7 +4212,7 @@ void e1000e_up(struct e1000_adapter *adapter) |
4147 | e1000_configure_msix(adapter); |
4148 | e1000_irq_enable(adapter); |
4149 | |
4150 | - netif_start_queue(adapter->netdev); |
4151 | + /* Tx queue started by watchdog timer when link is up */ |
4152 | |
4153 | e1000e_trigger_lsc(adapter); |
4154 | } |
4155 | @@ -4588,6 +4588,7 @@ int e1000e_open(struct net_device *netdev) |
4156 | pm_runtime_get_sync(&pdev->dev); |
4157 | |
4158 | netif_carrier_off(netdev); |
4159 | + netif_stop_queue(netdev); |
4160 | |
4161 | /* allocate transmit descriptors */ |
4162 | err = e1000e_setup_tx_resources(adapter->tx_ring); |
4163 | @@ -4648,7 +4649,6 @@ int e1000e_open(struct net_device *netdev) |
4164 | e1000_irq_enable(adapter); |
4165 | |
4166 | adapter->tx_hang_recheck = false; |
4167 | - netif_start_queue(netdev); |
4168 | |
4169 | hw->mac.get_link_status = true; |
4170 | pm_runtime_put(&pdev->dev); |
4171 | @@ -5271,6 +5271,7 @@ static void e1000_watchdog_task(struct work_struct *work) |
4172 | if (phy->ops.cfg_on_link_up) |
4173 | phy->ops.cfg_on_link_up(hw); |
4174 | |
4175 | + netif_wake_queue(netdev); |
4176 | netif_carrier_on(netdev); |
4177 | |
4178 | if (!test_bit(__E1000_DOWN, &adapter->state)) |
4179 | @@ -5284,6 +5285,7 @@ static void e1000_watchdog_task(struct work_struct *work) |
4180 | /* Link status message must follow this format */ |
4181 | pr_info("%s NIC Link is Down\n", adapter->netdev->name); |
4182 | netif_carrier_off(netdev); |
4183 | + netif_stop_queue(netdev); |
4184 | if (!test_bit(__E1000_DOWN, &adapter->state)) |
4185 | mod_timer(&adapter->phy_info_timer, |
4186 | round_jiffies(jiffies + 2 * HZ)); |
4187 | @@ -5291,13 +5293,8 @@ static void e1000_watchdog_task(struct work_struct *work) |
4188 | /* 8000ES2LAN requires a Rx packet buffer work-around |
4189 | * on link down event; reset the controller to flush |
4190 | * the Rx packet buffer. |
4191 | - * |
4192 | - * If the link is lost the controller stops DMA, but |
4193 | - * if there is queued Tx work it cannot be done. So |
4194 | - * reset the controller to flush the Tx packet buffers. |
4195 | */ |
4196 | - if ((adapter->flags & FLAG_RX_NEEDS_RESTART) || |
4197 | - e1000_desc_unused(tx_ring) + 1 < tx_ring->count) |
4198 | + if (adapter->flags & FLAG_RX_NEEDS_RESTART) |
4199 | adapter->flags |= FLAG_RESTART_NOW; |
4200 | else |
4201 | pm_schedule_suspend(netdev->dev.parent, |
4202 | @@ -5320,6 +5317,14 @@ link_up: |
4203 | adapter->gotc_old = adapter->stats.gotc; |
4204 | spin_unlock(&adapter->stats64_lock); |
4205 | |
4206 | + /* If the link is lost the controller stops DMA, but |
4207 | + * if there is queued Tx work it cannot be done. So |
4208 | + * reset the controller to flush the Tx packet buffers. |
4209 | + */ |
4210 | + if (!netif_carrier_ok(netdev) && |
4211 | + (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) |
4212 | + adapter->flags |= FLAG_RESTART_NOW; |
4213 | + |
4214 | /* If reset is necessary, do it outside of interrupt context. */ |
4215 | if (adapter->flags & FLAG_RESTART_NOW) { |
4216 | schedule_work(&adapter->reset_task); |
4217 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/reg.h b/drivers/net/ethernet/mellanox/mlxsw/reg.h |
4218 | index a01e6c0d0cd1..b2a745b579fd 100644 |
4219 | --- a/drivers/net/ethernet/mellanox/mlxsw/reg.h |
4220 | +++ b/drivers/net/ethernet/mellanox/mlxsw/reg.h |
4221 | @@ -935,7 +935,7 @@ static inline void mlxsw_reg_spaft_pack(char *payload, u8 local_port, |
4222 | MLXSW_REG_ZERO(spaft, payload); |
4223 | mlxsw_reg_spaft_local_port_set(payload, local_port); |
4224 | mlxsw_reg_spaft_allow_untagged_set(payload, allow_untagged); |
4225 | - mlxsw_reg_spaft_allow_prio_tagged_set(payload, true); |
4226 | + mlxsw_reg_spaft_allow_prio_tagged_set(payload, allow_untagged); |
4227 | mlxsw_reg_spaft_allow_tagged_set(payload, true); |
4228 | } |
4229 | |
4230 | diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c |
4231 | index 6f85276376e8..ae9b983e8e5c 100644 |
4232 | --- a/drivers/net/ethernet/sis/sis900.c |
4233 | +++ b/drivers/net/ethernet/sis/sis900.c |
4234 | @@ -1058,7 +1058,7 @@ sis900_open(struct net_device *net_dev) |
4235 | sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); |
4236 | |
4237 | /* Enable all known interrupts by setting the interrupt mask. */ |
4238 | - sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); |
4239 | + sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC); |
4240 | sw32(cr, RxENA | sr32(cr)); |
4241 | sw32(ier, IE); |
4242 | |
4243 | @@ -1581,7 +1581,7 @@ static void sis900_tx_timeout(struct net_device *net_dev) |
4244 | sw32(txdp, sis_priv->tx_ring_dma); |
4245 | |
4246 | /* Enable all known interrupts by setting the interrupt mask. */ |
4247 | - sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); |
4248 | + sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC); |
4249 | } |
4250 | |
4251 | /** |
4252 | @@ -1621,7 +1621,7 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev) |
4253 | spin_unlock_irqrestore(&sis_priv->lock, flags); |
4254 | return NETDEV_TX_OK; |
4255 | } |
4256 | - sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len); |
4257 | + sis_priv->tx_ring[entry].cmdsts = (OWN | INTR | skb->len); |
4258 | sw32(cr, TxENA | sr32(cr)); |
4259 | |
4260 | sis_priv->cur_tx ++; |
4261 | @@ -1677,7 +1677,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance) |
4262 | do { |
4263 | status = sr32(isr); |
4264 | |
4265 | - if ((status & (HIBERR|TxURN|TxERR|TxIDLE|RxORN|RxERR|RxOK)) == 0) |
4266 | + if ((status & (HIBERR|TxURN|TxERR|TxIDLE|TxDESC|RxORN|RxERR|RxOK)) == 0) |
4267 | /* nothing intresting happened */ |
4268 | break; |
4269 | handled = 1; |
4270 | @@ -1687,7 +1687,7 @@ static irqreturn_t sis900_interrupt(int irq, void *dev_instance) |
4271 | /* Rx interrupt */ |
4272 | sis900_rx(net_dev); |
4273 | |
4274 | - if (status & (TxURN | TxERR | TxIDLE)) |
4275 | + if (status & (TxURN | TxERR | TxIDLE | TxDESC)) |
4276 | /* Tx interrupt */ |
4277 | sis900_finish_xmit(net_dev); |
4278 | |
4279 | @@ -1899,8 +1899,8 @@ static void sis900_finish_xmit (struct net_device *net_dev) |
4280 | |
4281 | if (tx_status & OWN) { |
4282 | /* The packet is not transmitted yet (owned by hardware) ! |
4283 | - * Note: the interrupt is generated only when Tx Machine |
4284 | - * is idle, so this is an almost impossible case */ |
4285 | + * Note: this is an almost impossible condition |
4286 | + * in case of TxDESC ('descriptor interrupt') */ |
4287 | break; |
4288 | } |
4289 | |
4290 | @@ -2476,7 +2476,7 @@ static int sis900_resume(struct pci_dev *pci_dev) |
4291 | sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); |
4292 | |
4293 | /* Enable all known interrupts by setting the interrupt mask. */ |
4294 | - sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); |
4295 | + sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE | TxDESC); |
4296 | sw32(cr, RxENA | sr32(cr)); |
4297 | sw32(ier, IE); |
4298 | |
4299 | diff --git a/drivers/net/ppp/ppp_mppe.c b/drivers/net/ppp/ppp_mppe.c |
4300 | index f60f7660b451..92f52a73ec0e 100644 |
4301 | --- a/drivers/net/ppp/ppp_mppe.c |
4302 | +++ b/drivers/net/ppp/ppp_mppe.c |
4303 | @@ -63,6 +63,7 @@ MODULE_AUTHOR("Frank Cusack <fcusack@fcusack.com>"); |
4304 | MODULE_DESCRIPTION("Point-to-Point Protocol Microsoft Point-to-Point Encryption support"); |
4305 | MODULE_LICENSE("Dual BSD/GPL"); |
4306 | MODULE_ALIAS("ppp-compress-" __stringify(CI_MPPE)); |
4307 | +MODULE_SOFTDEP("pre: arc4"); |
4308 | MODULE_VERSION("1.0.2"); |
4309 | |
4310 | static unsigned int |
4311 | diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c |
4312 | index 99ab20334d21..37c3cbe0ff2b 100644 |
4313 | --- a/drivers/net/wireless/ath/carl9170/usb.c |
4314 | +++ b/drivers/net/wireless/ath/carl9170/usb.c |
4315 | @@ -128,6 +128,8 @@ static struct usb_device_id carl9170_usb_ids[] = { |
4316 | }; |
4317 | MODULE_DEVICE_TABLE(usb, carl9170_usb_ids); |
4318 | |
4319 | +static struct usb_driver carl9170_driver; |
4320 | + |
4321 | static void carl9170_usb_submit_data_urb(struct ar9170 *ar) |
4322 | { |
4323 | struct urb *urb; |
4324 | @@ -966,32 +968,28 @@ err_out: |
4325 | |
4326 | static void carl9170_usb_firmware_failed(struct ar9170 *ar) |
4327 | { |
4328 | - struct device *parent = ar->udev->dev.parent; |
4329 | - struct usb_device *udev; |
4330 | - |
4331 | - /* |
4332 | - * Store a copy of the usb_device pointer locally. |
4333 | - * This is because device_release_driver initiates |
4334 | - * carl9170_usb_disconnect, which in turn frees our |
4335 | - * driver context (ar). |
4336 | + /* Store a copies of the usb_interface and usb_device pointer locally. |
4337 | + * This is because release_driver initiates carl9170_usb_disconnect, |
4338 | + * which in turn frees our driver context (ar). |
4339 | */ |
4340 | - udev = ar->udev; |
4341 | + struct usb_interface *intf = ar->intf; |
4342 | + struct usb_device *udev = ar->udev; |
4343 | |
4344 | complete(&ar->fw_load_wait); |
4345 | + /* at this point 'ar' could be already freed. Don't use it anymore */ |
4346 | + ar = NULL; |
4347 | |
4348 | /* unbind anything failed */ |
4349 | - if (parent) |
4350 | - device_lock(parent); |
4351 | - |
4352 | - device_release_driver(&udev->dev); |
4353 | - if (parent) |
4354 | - device_unlock(parent); |
4355 | + usb_lock_device(udev); |
4356 | + usb_driver_release_interface(&carl9170_driver, intf); |
4357 | + usb_unlock_device(udev); |
4358 | |
4359 | - usb_put_dev(udev); |
4360 | + usb_put_intf(intf); |
4361 | } |
4362 | |
4363 | static void carl9170_usb_firmware_finish(struct ar9170 *ar) |
4364 | { |
4365 | + struct usb_interface *intf = ar->intf; |
4366 | int err; |
4367 | |
4368 | err = carl9170_parse_firmware(ar); |
4369 | @@ -1009,7 +1007,7 @@ static void carl9170_usb_firmware_finish(struct ar9170 *ar) |
4370 | goto err_unrx; |
4371 | |
4372 | complete(&ar->fw_load_wait); |
4373 | - usb_put_dev(ar->udev); |
4374 | + usb_put_intf(intf); |
4375 | return; |
4376 | |
4377 | err_unrx: |
4378 | @@ -1052,7 +1050,6 @@ static int carl9170_usb_probe(struct usb_interface *intf, |
4379 | return PTR_ERR(ar); |
4380 | |
4381 | udev = interface_to_usbdev(intf); |
4382 | - usb_get_dev(udev); |
4383 | ar->udev = udev; |
4384 | ar->intf = intf; |
4385 | ar->features = id->driver_info; |
4386 | @@ -1094,15 +1091,14 @@ static int carl9170_usb_probe(struct usb_interface *intf, |
4387 | atomic_set(&ar->rx_anch_urbs, 0); |
4388 | atomic_set(&ar->rx_pool_urbs, 0); |
4389 | |
4390 | - usb_get_dev(ar->udev); |
4391 | + usb_get_intf(intf); |
4392 | |
4393 | carl9170_set_state(ar, CARL9170_STOPPED); |
4394 | |
4395 | err = request_firmware_nowait(THIS_MODULE, 1, CARL9170FW_NAME, |
4396 | &ar->udev->dev, GFP_KERNEL, ar, carl9170_usb_firmware_step2); |
4397 | if (err) { |
4398 | - usb_put_dev(udev); |
4399 | - usb_put_dev(udev); |
4400 | + usb_put_intf(intf); |
4401 | carl9170_free(ar); |
4402 | } |
4403 | return err; |
4404 | @@ -1131,7 +1127,6 @@ static void carl9170_usb_disconnect(struct usb_interface *intf) |
4405 | |
4406 | carl9170_release_firmware(ar); |
4407 | carl9170_free(ar); |
4408 | - usb_put_dev(udev); |
4409 | } |
4410 | |
4411 | #ifdef CONFIG_PM |
4412 | diff --git a/drivers/net/wireless/intersil/p54/p54usb.c b/drivers/net/wireless/intersil/p54/p54usb.c |
4413 | index 043bd1c23c19..4a197a32d78c 100644 |
4414 | --- a/drivers/net/wireless/intersil/p54/p54usb.c |
4415 | +++ b/drivers/net/wireless/intersil/p54/p54usb.c |
4416 | @@ -33,6 +33,8 @@ MODULE_ALIAS("prism54usb"); |
4417 | MODULE_FIRMWARE("isl3886usb"); |
4418 | MODULE_FIRMWARE("isl3887usb"); |
4419 | |
4420 | +static struct usb_driver p54u_driver; |
4421 | + |
4422 | /* |
4423 | * Note: |
4424 | * |
4425 | @@ -921,9 +923,9 @@ static void p54u_load_firmware_cb(const struct firmware *firmware, |
4426 | { |
4427 | struct p54u_priv *priv = context; |
4428 | struct usb_device *udev = priv->udev; |
4429 | + struct usb_interface *intf = priv->intf; |
4430 | int err; |
4431 | |
4432 | - complete(&priv->fw_wait_load); |
4433 | if (firmware) { |
4434 | priv->fw = firmware; |
4435 | err = p54u_start_ops(priv); |
4436 | @@ -932,26 +934,22 @@ static void p54u_load_firmware_cb(const struct firmware *firmware, |
4437 | dev_err(&udev->dev, "Firmware not found.\n"); |
4438 | } |
4439 | |
4440 | - if (err) { |
4441 | - struct device *parent = priv->udev->dev.parent; |
4442 | - |
4443 | - dev_err(&udev->dev, "failed to initialize device (%d)\n", err); |
4444 | - |
4445 | - if (parent) |
4446 | - device_lock(parent); |
4447 | + complete(&priv->fw_wait_load); |
4448 | + /* |
4449 | + * At this point p54u_disconnect may have already freed |
4450 | + * the "priv" context. Do not use it anymore! |
4451 | + */ |
4452 | + priv = NULL; |
4453 | |
4454 | - device_release_driver(&udev->dev); |
4455 | - /* |
4456 | - * At this point p54u_disconnect has already freed |
4457 | - * the "priv" context. Do not use it anymore! |
4458 | - */ |
4459 | - priv = NULL; |
4460 | + if (err) { |
4461 | + dev_err(&intf->dev, "failed to initialize device (%d)\n", err); |
4462 | |
4463 | - if (parent) |
4464 | - device_unlock(parent); |
4465 | + usb_lock_device(udev); |
4466 | + usb_driver_release_interface(&p54u_driver, intf); |
4467 | + usb_unlock_device(udev); |
4468 | } |
4469 | |
4470 | - usb_put_dev(udev); |
4471 | + usb_put_intf(intf); |
4472 | } |
4473 | |
4474 | static int p54u_load_firmware(struct ieee80211_hw *dev, |
4475 | @@ -972,14 +970,14 @@ static int p54u_load_firmware(struct ieee80211_hw *dev, |
4476 | dev_info(&priv->udev->dev, "Loading firmware file %s\n", |
4477 | p54u_fwlist[i].fw); |
4478 | |
4479 | - usb_get_dev(udev); |
4480 | + usb_get_intf(intf); |
4481 | err = request_firmware_nowait(THIS_MODULE, 1, p54u_fwlist[i].fw, |
4482 | device, GFP_KERNEL, priv, |
4483 | p54u_load_firmware_cb); |
4484 | if (err) { |
4485 | dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s " |
4486 | "(%d)!\n", p54u_fwlist[i].fw, err); |
4487 | - usb_put_dev(udev); |
4488 | + usb_put_intf(intf); |
4489 | } |
4490 | |
4491 | return err; |
4492 | @@ -1011,8 +1009,6 @@ static int p54u_probe(struct usb_interface *intf, |
4493 | skb_queue_head_init(&priv->rx_queue); |
4494 | init_usb_anchor(&priv->submitted); |
4495 | |
4496 | - usb_get_dev(udev); |
4497 | - |
4498 | /* really lazy and simple way of figuring out if we're a 3887 */ |
4499 | /* TODO: should just stick the identification in the device table */ |
4500 | i = intf->altsetting->desc.bNumEndpoints; |
4501 | @@ -1053,10 +1049,8 @@ static int p54u_probe(struct usb_interface *intf, |
4502 | priv->upload_fw = p54u_upload_firmware_net2280; |
4503 | } |
4504 | err = p54u_load_firmware(dev, intf); |
4505 | - if (err) { |
4506 | - usb_put_dev(udev); |
4507 | + if (err) |
4508 | p54_free_common(dev); |
4509 | - } |
4510 | return err; |
4511 | } |
4512 | |
4513 | @@ -1072,7 +1066,6 @@ static void p54u_disconnect(struct usb_interface *intf) |
4514 | wait_for_completion(&priv->fw_wait_load); |
4515 | p54_unregister_common(dev); |
4516 | |
4517 | - usb_put_dev(interface_to_usbdev(intf)); |
4518 | release_firmware(priv->fw); |
4519 | p54_free_common(dev); |
4520 | } |
4521 | diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h |
4522 | index 4b1894b4757f..395d6ece2cac 100644 |
4523 | --- a/drivers/net/wireless/marvell/mwifiex/fw.h |
4524 | +++ b/drivers/net/wireless/marvell/mwifiex/fw.h |
4525 | @@ -1719,9 +1719,10 @@ struct mwifiex_ie_types_wmm_queue_status { |
4526 | struct ieee_types_vendor_header { |
4527 | u8 element_id; |
4528 | u8 len; |
4529 | - u8 oui[4]; /* 0~2: oui, 3: oui_type */ |
4530 | - u8 oui_subtype; |
4531 | - u8 version; |
4532 | + struct { |
4533 | + u8 oui[3]; |
4534 | + u8 oui_type; |
4535 | + } __packed oui; |
4536 | } __packed; |
4537 | |
4538 | struct ieee_types_wmm_parameter { |
4539 | @@ -1735,6 +1736,9 @@ struct ieee_types_wmm_parameter { |
4540 | * Version [1] |
4541 | */ |
4542 | struct ieee_types_vendor_header vend_hdr; |
4543 | + u8 oui_subtype; |
4544 | + u8 version; |
4545 | + |
4546 | u8 qos_info_bitmap; |
4547 | u8 reserved; |
4548 | struct ieee_types_wmm_ac_parameters ac_params[IEEE80211_NUM_ACS]; |
4549 | @@ -1752,6 +1756,8 @@ struct ieee_types_wmm_info { |
4550 | * Version [1] |
4551 | */ |
4552 | struct ieee_types_vendor_header vend_hdr; |
4553 | + u8 oui_subtype; |
4554 | + u8 version; |
4555 | |
4556 | u8 qos_info_bitmap; |
4557 | } __packed; |
4558 | diff --git a/drivers/net/wireless/marvell/mwifiex/ie.c b/drivers/net/wireless/marvell/mwifiex/ie.c |
4559 | index c488c3068abc..0f977dc556ca 100644 |
4560 | --- a/drivers/net/wireless/marvell/mwifiex/ie.c |
4561 | +++ b/drivers/net/wireless/marvell/mwifiex/ie.c |
4562 | @@ -328,6 +328,8 @@ static int mwifiex_uap_parse_tail_ies(struct mwifiex_private *priv, |
4563 | struct ieee80211_vendor_ie *vendorhdr; |
4564 | u16 gen_idx = MWIFIEX_AUTO_IDX_MASK, ie_len = 0; |
4565 | int left_len, parsed_len = 0; |
4566 | + unsigned int token_len; |
4567 | + int err = 0; |
4568 | |
4569 | if (!info->tail || !info->tail_len) |
4570 | return 0; |
4571 | @@ -343,6 +345,12 @@ static int mwifiex_uap_parse_tail_ies(struct mwifiex_private *priv, |
4572 | */ |
4573 | while (left_len > sizeof(struct ieee_types_header)) { |
4574 | hdr = (void *)(info->tail + parsed_len); |
4575 | + token_len = hdr->len + sizeof(struct ieee_types_header); |
4576 | + if (token_len > left_len) { |
4577 | + err = -EINVAL; |
4578 | + goto out; |
4579 | + } |
4580 | + |
4581 | switch (hdr->element_id) { |
4582 | case WLAN_EID_SSID: |
4583 | case WLAN_EID_SUPP_RATES: |
4584 | @@ -356,13 +364,16 @@ static int mwifiex_uap_parse_tail_ies(struct mwifiex_private *priv, |
4585 | case WLAN_EID_VENDOR_SPECIFIC: |
4586 | break; |
4587 | default: |
4588 | - memcpy(gen_ie->ie_buffer + ie_len, hdr, |
4589 | - hdr->len + sizeof(struct ieee_types_header)); |
4590 | - ie_len += hdr->len + sizeof(struct ieee_types_header); |
4591 | + if (ie_len + token_len > IEEE_MAX_IE_SIZE) { |
4592 | + err = -EINVAL; |
4593 | + goto out; |
4594 | + } |
4595 | + memcpy(gen_ie->ie_buffer + ie_len, hdr, token_len); |
4596 | + ie_len += token_len; |
4597 | break; |
4598 | } |
4599 | - left_len -= hdr->len + sizeof(struct ieee_types_header); |
4600 | - parsed_len += hdr->len + sizeof(struct ieee_types_header); |
4601 | + left_len -= token_len; |
4602 | + parsed_len += token_len; |
4603 | } |
4604 | |
4605 | /* parse only WPA vendor IE from tail, WMM IE is configured by |
4606 | @@ -372,15 +383,17 @@ static int mwifiex_uap_parse_tail_ies(struct mwifiex_private *priv, |
4607 | WLAN_OUI_TYPE_MICROSOFT_WPA, |
4608 | info->tail, info->tail_len); |
4609 | if (vendorhdr) { |
4610 | - memcpy(gen_ie->ie_buffer + ie_len, vendorhdr, |
4611 | - vendorhdr->len + sizeof(struct ieee_types_header)); |
4612 | - ie_len += vendorhdr->len + sizeof(struct ieee_types_header); |
4613 | + token_len = vendorhdr->len + sizeof(struct ieee_types_header); |
4614 | + if (ie_len + token_len > IEEE_MAX_IE_SIZE) { |
4615 | + err = -EINVAL; |
4616 | + goto out; |
4617 | + } |
4618 | + memcpy(gen_ie->ie_buffer + ie_len, vendorhdr, token_len); |
4619 | + ie_len += token_len; |
4620 | } |
4621 | |
4622 | - if (!ie_len) { |
4623 | - kfree(gen_ie); |
4624 | - return 0; |
4625 | - } |
4626 | + if (!ie_len) |
4627 | + goto out; |
4628 | |
4629 | gen_ie->ie_index = cpu_to_le16(gen_idx); |
4630 | gen_ie->mgmt_subtype_mask = cpu_to_le16(MGMT_MASK_BEACON | |
4631 | @@ -390,13 +403,15 @@ static int mwifiex_uap_parse_tail_ies(struct mwifiex_private *priv, |
4632 | |
4633 | if (mwifiex_update_uap_custom_ie(priv, gen_ie, &gen_idx, NULL, NULL, |
4634 | NULL, NULL)) { |
4635 | - kfree(gen_ie); |
4636 | - return -1; |
4637 | + err = -EINVAL; |
4638 | + goto out; |
4639 | } |
4640 | |
4641 | priv->gen_idx = gen_idx; |
4642 | + |
4643 | + out: |
4644 | kfree(gen_ie); |
4645 | - return 0; |
4646 | + return err; |
4647 | } |
4648 | |
4649 | /* This function parses different IEs-head & tail IEs, beacon IEs, |
4650 | diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c |
4651 | index 78d59a67f7e1..97847eee2dfb 100644 |
4652 | --- a/drivers/net/wireless/marvell/mwifiex/scan.c |
4653 | +++ b/drivers/net/wireless/marvell/mwifiex/scan.c |
4654 | @@ -1236,6 +1236,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, |
4655 | } |
4656 | switch (element_id) { |
4657 | case WLAN_EID_SSID: |
4658 | + if (element_len > IEEE80211_MAX_SSID_LEN) |
4659 | + return -EINVAL; |
4660 | bss_entry->ssid.ssid_len = element_len; |
4661 | memcpy(bss_entry->ssid.ssid, (current_ptr + 2), |
4662 | element_len); |
4663 | @@ -1245,6 +1247,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, |
4664 | break; |
4665 | |
4666 | case WLAN_EID_SUPP_RATES: |
4667 | + if (element_len > MWIFIEX_SUPPORTED_RATES) |
4668 | + return -EINVAL; |
4669 | memcpy(bss_entry->data_rates, current_ptr + 2, |
4670 | element_len); |
4671 | memcpy(bss_entry->supported_rates, current_ptr + 2, |
4672 | @@ -1254,6 +1258,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, |
4673 | break; |
4674 | |
4675 | case WLAN_EID_FH_PARAMS: |
4676 | + if (element_len + 2 < sizeof(*fh_param_set)) |
4677 | + return -EINVAL; |
4678 | fh_param_set = |
4679 | (struct ieee_types_fh_param_set *) current_ptr; |
4680 | memcpy(&bss_entry->phy_param_set.fh_param_set, |
4681 | @@ -1262,6 +1268,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, |
4682 | break; |
4683 | |
4684 | case WLAN_EID_DS_PARAMS: |
4685 | + if (element_len + 2 < sizeof(*ds_param_set)) |
4686 | + return -EINVAL; |
4687 | ds_param_set = |
4688 | (struct ieee_types_ds_param_set *) current_ptr; |
4689 | |
4690 | @@ -1273,6 +1281,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, |
4691 | break; |
4692 | |
4693 | case WLAN_EID_CF_PARAMS: |
4694 | + if (element_len + 2 < sizeof(*cf_param_set)) |
4695 | + return -EINVAL; |
4696 | cf_param_set = |
4697 | (struct ieee_types_cf_param_set *) current_ptr; |
4698 | memcpy(&bss_entry->ss_param_set.cf_param_set, |
4699 | @@ -1281,6 +1291,8 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, |
4700 | break; |
4701 | |
4702 | case WLAN_EID_IBSS_PARAMS: |
4703 | + if (element_len + 2 < sizeof(*ibss_param_set)) |
4704 | + return -EINVAL; |
4705 | ibss_param_set = |
4706 | (struct ieee_types_ibss_param_set *) |
4707 | current_ptr; |
4708 | @@ -1290,10 +1302,14 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, |
4709 | break; |
4710 | |
4711 | case WLAN_EID_ERP_INFO: |
4712 | + if (!element_len) |
4713 | + return -EINVAL; |
4714 | bss_entry->erp_flags = *(current_ptr + 2); |
4715 | break; |
4716 | |
4717 | case WLAN_EID_PWR_CONSTRAINT: |
4718 | + if (!element_len) |
4719 | + return -EINVAL; |
4720 | bss_entry->local_constraint = *(current_ptr + 2); |
4721 | bss_entry->sensed_11h = true; |
4722 | break; |
4723 | @@ -1336,15 +1352,22 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, |
4724 | vendor_ie = (struct ieee_types_vendor_specific *) |
4725 | current_ptr; |
4726 | |
4727 | - if (!memcmp |
4728 | - (vendor_ie->vend_hdr.oui, wpa_oui, |
4729 | - sizeof(wpa_oui))) { |
4730 | + /* 802.11 requires at least 3-byte OUI. */ |
4731 | + if (element_len < sizeof(vendor_ie->vend_hdr.oui.oui)) |
4732 | + return -EINVAL; |
4733 | + |
4734 | + /* Not long enough for a match? Skip it. */ |
4735 | + if (element_len < sizeof(wpa_oui)) |
4736 | + break; |
4737 | + |
4738 | + if (!memcmp(&vendor_ie->vend_hdr.oui, wpa_oui, |
4739 | + sizeof(wpa_oui))) { |
4740 | bss_entry->bcn_wpa_ie = |
4741 | (struct ieee_types_vendor_specific *) |
4742 | current_ptr; |
4743 | bss_entry->wpa_offset = (u16) |
4744 | (current_ptr - bss_entry->beacon_buf); |
4745 | - } else if (!memcmp(vendor_ie->vend_hdr.oui, wmm_oui, |
4746 | + } else if (!memcmp(&vendor_ie->vend_hdr.oui, wmm_oui, |
4747 | sizeof(wmm_oui))) { |
4748 | if (total_ie_len == |
4749 | sizeof(struct ieee_types_wmm_parameter) || |
4750 | diff --git a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c |
4751 | index 1532ac9cee0b..7f9645703d96 100644 |
4752 | --- a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c |
4753 | +++ b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c |
4754 | @@ -1374,7 +1374,7 @@ mwifiex_set_gen_ie_helper(struct mwifiex_private *priv, u8 *ie_data_ptr, |
4755 | /* Test to see if it is a WPA IE, if not, then it is a |
4756 | * gen IE |
4757 | */ |
4758 | - if (!memcmp(pvendor_ie->oui, wpa_oui, |
4759 | + if (!memcmp(&pvendor_ie->oui, wpa_oui, |
4760 | sizeof(wpa_oui))) { |
4761 | find_wpa_ie = 1; |
4762 | break; |
4763 | @@ -1383,7 +1383,7 @@ mwifiex_set_gen_ie_helper(struct mwifiex_private *priv, u8 *ie_data_ptr, |
4764 | /* Test to see if it is a WPS IE, if so, enable |
4765 | * wps session flag |
4766 | */ |
4767 | - if (!memcmp(pvendor_ie->oui, wps_oui, |
4768 | + if (!memcmp(&pvendor_ie->oui, wps_oui, |
4769 | sizeof(wps_oui))) { |
4770 | priv->wps.session_enable = true; |
4771 | mwifiex_dbg(priv->adapter, MSG, |
4772 | diff --git a/drivers/net/wireless/marvell/mwifiex/wmm.c b/drivers/net/wireless/marvell/mwifiex/wmm.c |
4773 | index dea2fe671dfe..9843560e784f 100644 |
4774 | --- a/drivers/net/wireless/marvell/mwifiex/wmm.c |
4775 | +++ b/drivers/net/wireless/marvell/mwifiex/wmm.c |
4776 | @@ -240,7 +240,7 @@ mwifiex_wmm_setup_queue_priorities(struct mwifiex_private *priv, |
4777 | mwifiex_dbg(priv->adapter, INFO, |
4778 | "info: WMM Parameter IE: version=%d,\t" |
4779 | "qos_info Parameter Set Count=%d, Reserved=%#x\n", |
4780 | - wmm_ie->vend_hdr.version, wmm_ie->qos_info_bitmap & |
4781 | + wmm_ie->version, wmm_ie->qos_info_bitmap & |
4782 | IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK, |
4783 | wmm_ie->reserved); |
4784 | |
4785 | diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c |
4786 | index 35286907c636..d0090c5c88e7 100644 |
4787 | --- a/drivers/s390/cio/qdio_setup.c |
4788 | +++ b/drivers/s390/cio/qdio_setup.c |
4789 | @@ -150,6 +150,7 @@ static int __qdio_allocate_qs(struct qdio_q **irq_ptr_qs, int nr_queues) |
4790 | return -ENOMEM; |
4791 | } |
4792 | irq_ptr_qs[i] = q; |
4793 | + INIT_LIST_HEAD(&q->entry); |
4794 | } |
4795 | return 0; |
4796 | } |
4797 | @@ -178,6 +179,7 @@ static void setup_queues_misc(struct qdio_q *q, struct qdio_irq *irq_ptr, |
4798 | q->mask = 1 << (31 - i); |
4799 | q->nr = i; |
4800 | q->handler = handler; |
4801 | + INIT_LIST_HEAD(&q->entry); |
4802 | } |
4803 | |
4804 | static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr, |
4805 | diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c |
4806 | index 30e9fbbff051..debe69adfc70 100644 |
4807 | --- a/drivers/s390/cio/qdio_thinint.c |
4808 | +++ b/drivers/s390/cio/qdio_thinint.c |
4809 | @@ -80,7 +80,6 @@ void tiqdio_add_input_queues(struct qdio_irq *irq_ptr) |
4810 | mutex_lock(&tiq_list_lock); |
4811 | list_add_rcu(&irq_ptr->input_qs[0]->entry, &tiq_list); |
4812 | mutex_unlock(&tiq_list_lock); |
4813 | - xchg(irq_ptr->dsci, 1 << 7); |
4814 | } |
4815 | |
4816 | void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr) |
4817 | @@ -88,14 +87,14 @@ void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr) |
4818 | struct qdio_q *q; |
4819 | |
4820 | q = irq_ptr->input_qs[0]; |
4821 | - /* if establish triggered an error */ |
4822 | - if (!q || !q->entry.prev || !q->entry.next) |
4823 | + if (!q) |
4824 | return; |
4825 | |
4826 | mutex_lock(&tiq_list_lock); |
4827 | list_del_rcu(&q->entry); |
4828 | mutex_unlock(&tiq_list_lock); |
4829 | synchronize_rcu(); |
4830 | + INIT_LIST_HEAD(&q->entry); |
4831 | } |
4832 | |
4833 | static inline int has_multiple_inq_on_dsci(struct qdio_irq *irq_ptr) |
4834 | diff --git a/drivers/staging/comedi/drivers/amplc_pci230.c b/drivers/staging/comedi/drivers/amplc_pci230.c |
4835 | index 42945de31fe2..d23aa5d8e62a 100644 |
4836 | --- a/drivers/staging/comedi/drivers/amplc_pci230.c |
4837 | +++ b/drivers/staging/comedi/drivers/amplc_pci230.c |
4838 | @@ -2337,7 +2337,8 @@ static irqreturn_t pci230_interrupt(int irq, void *d) |
4839 | devpriv->intr_running = false; |
4840 | spin_unlock_irqrestore(&devpriv->isr_spinlock, irqflags); |
4841 | |
4842 | - comedi_handle_events(dev, s_ao); |
4843 | + if (s_ao) |
4844 | + comedi_handle_events(dev, s_ao); |
4845 | comedi_handle_events(dev, s_ai); |
4846 | |
4847 | return IRQ_HANDLED; |
4848 | diff --git a/drivers/staging/comedi/drivers/dt282x.c b/drivers/staging/comedi/drivers/dt282x.c |
4849 | index d5295bbdd28c..37133d54dda1 100644 |
4850 | --- a/drivers/staging/comedi/drivers/dt282x.c |
4851 | +++ b/drivers/staging/comedi/drivers/dt282x.c |
4852 | @@ -566,7 +566,8 @@ static irqreturn_t dt282x_interrupt(int irq, void *d) |
4853 | } |
4854 | #endif |
4855 | comedi_handle_events(dev, s); |
4856 | - comedi_handle_events(dev, s_ao); |
4857 | + if (s_ao) |
4858 | + comedi_handle_events(dev, s_ao); |
4859 | |
4860 | return IRQ_RETVAL(handled); |
4861 | } |
4862 | diff --git a/drivers/staging/iio/cdc/ad7150.c b/drivers/staging/iio/cdc/ad7150.c |
4863 | index 50a5b0c2cc7b..7ab95efcf1dc 100644 |
4864 | --- a/drivers/staging/iio/cdc/ad7150.c |
4865 | +++ b/drivers/staging/iio/cdc/ad7150.c |
4866 | @@ -6,6 +6,7 @@ |
4867 | * Licensed under the GPL-2 or later. |
4868 | */ |
4869 | |
4870 | +#include <linux/bitfield.h> |
4871 | #include <linux/interrupt.h> |
4872 | #include <linux/device.h> |
4873 | #include <linux/kernel.h> |
4874 | @@ -129,7 +130,7 @@ static int ad7150_read_event_config(struct iio_dev *indio_dev, |
4875 | { |
4876 | int ret; |
4877 | u8 threshtype; |
4878 | - bool adaptive; |
4879 | + bool thrfixed; |
4880 | struct ad7150_chip_info *chip = iio_priv(indio_dev); |
4881 | |
4882 | ret = i2c_smbus_read_byte_data(chip->client, AD7150_CFG); |
4883 | @@ -137,21 +138,23 @@ static int ad7150_read_event_config(struct iio_dev *indio_dev, |
4884 | return ret; |
4885 | |
4886 | threshtype = (ret >> 5) & 0x03; |
4887 | - adaptive = !!(ret & 0x80); |
4888 | + |
4889 | + /*check if threshold mode is fixed or adaptive*/ |
4890 | + thrfixed = FIELD_GET(AD7150_CFG_FIX, ret); |
4891 | |
4892 | switch (type) { |
4893 | case IIO_EV_TYPE_MAG_ADAPTIVE: |
4894 | if (dir == IIO_EV_DIR_RISING) |
4895 | - return adaptive && (threshtype == 0x1); |
4896 | - return adaptive && (threshtype == 0x0); |
4897 | + return !thrfixed && (threshtype == 0x1); |
4898 | + return !thrfixed && (threshtype == 0x0); |
4899 | case IIO_EV_TYPE_THRESH_ADAPTIVE: |
4900 | if (dir == IIO_EV_DIR_RISING) |
4901 | - return adaptive && (threshtype == 0x3); |
4902 | - return adaptive && (threshtype == 0x2); |
4903 | + return !thrfixed && (threshtype == 0x3); |
4904 | + return !thrfixed && (threshtype == 0x2); |
4905 | case IIO_EV_TYPE_THRESH: |
4906 | if (dir == IIO_EV_DIR_RISING) |
4907 | - return !adaptive && (threshtype == 0x1); |
4908 | - return !adaptive && (threshtype == 0x0); |
4909 | + return thrfixed && (threshtype == 0x1); |
4910 | + return thrfixed && (threshtype == 0x0); |
4911 | default: |
4912 | break; |
4913 | } |
4914 | diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c |
4915 | index 5b54439a8a9b..84474f06dbcf 100644 |
4916 | --- a/drivers/tty/serial/8250/8250_port.c |
4917 | +++ b/drivers/tty/serial/8250/8250_port.c |
4918 | @@ -1814,8 +1814,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) |
4919 | |
4920 | status = serial_port_in(port, UART_LSR); |
4921 | |
4922 | - if (status & (UART_LSR_DR | UART_LSR_BI) && |
4923 | - iir & UART_IIR_RDI) { |
4924 | + if (status & (UART_LSR_DR | UART_LSR_BI)) { |
4925 | if (!up->dma || handle_rx_dma(up, iir)) |
4926 | status = serial8250_rx_chars(up, status); |
4927 | } |
4928 | diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c |
4929 | index 5d1bd13a56c1..d5fbc2352029 100644 |
4930 | --- a/drivers/usb/gadget/function/u_ether.c |
4931 | +++ b/drivers/usb/gadget/function/u_ether.c |
4932 | @@ -198,11 +198,12 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) |
4933 | out = dev->port_usb->out_ep; |
4934 | else |
4935 | out = NULL; |
4936 | - spin_unlock_irqrestore(&dev->lock, flags); |
4937 | |
4938 | if (!out) |
4939 | + { |
4940 | + spin_unlock_irqrestore(&dev->lock, flags); |
4941 | return -ENOTCONN; |
4942 | - |
4943 | + } |
4944 | |
4945 | /* Padding up to RX_EXTRA handles minor disagreements with host. |
4946 | * Normally we use the USB "terminate on short read" convention; |
4947 | @@ -223,6 +224,7 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) |
4948 | |
4949 | if (dev->port_usb->is_fixed) |
4950 | size = max_t(size_t, size, dev->port_usb->fixed_out_len); |
4951 | + spin_unlock_irqrestore(&dev->lock, flags); |
4952 | |
4953 | skb = alloc_skb(size + NET_IP_ALIGN, gfp_flags); |
4954 | if (skb == NULL) { |
4955 | diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c |
4956 | index 968ade5a35f5..696560529e6a 100644 |
4957 | --- a/drivers/usb/renesas_usbhs/fifo.c |
4958 | +++ b/drivers/usb/renesas_usbhs/fifo.c |
4959 | @@ -821,9 +821,8 @@ static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map) |
4960 | } |
4961 | |
4962 | static void usbhsf_dma_complete(void *arg); |
4963 | -static void xfer_work(struct work_struct *work) |
4964 | +static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt) |
4965 | { |
4966 | - struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); |
4967 | struct usbhs_pipe *pipe = pkt->pipe; |
4968 | struct usbhs_fifo *fifo; |
4969 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); |
4970 | @@ -831,12 +830,10 @@ static void xfer_work(struct work_struct *work) |
4971 | struct dma_chan *chan; |
4972 | struct device *dev = usbhs_priv_to_dev(priv); |
4973 | enum dma_transfer_direction dir; |
4974 | - unsigned long flags; |
4975 | |
4976 | - usbhs_lock(priv, flags); |
4977 | fifo = usbhs_pipe_to_fifo(pipe); |
4978 | if (!fifo) |
4979 | - goto xfer_work_end; |
4980 | + return; |
4981 | |
4982 | chan = usbhsf_dma_chan_get(fifo, pkt); |
4983 | dir = usbhs_pipe_is_dir_in(pipe) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV; |
4984 | @@ -845,7 +842,7 @@ static void xfer_work(struct work_struct *work) |
4985 | pkt->trans, dir, |
4986 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
4987 | if (!desc) |
4988 | - goto xfer_work_end; |
4989 | + return; |
4990 | |
4991 | desc->callback = usbhsf_dma_complete; |
4992 | desc->callback_param = pipe; |
4993 | @@ -853,7 +850,7 @@ static void xfer_work(struct work_struct *work) |
4994 | pkt->cookie = dmaengine_submit(desc); |
4995 | if (pkt->cookie < 0) { |
4996 | dev_err(dev, "Failed to submit dma descriptor\n"); |
4997 | - goto xfer_work_end; |
4998 | + return; |
4999 | } |
5000 | |
5001 | dev_dbg(dev, " %s %d (%d/ %d)\n", |
5002 | @@ -864,8 +861,17 @@ static void xfer_work(struct work_struct *work) |
5003 | dma_async_issue_pending(chan); |
5004 | usbhsf_dma_start(pipe, fifo); |
5005 | usbhs_pipe_enable(pipe); |
5006 | +} |
5007 | + |
5008 | +static void xfer_work(struct work_struct *work) |
5009 | +{ |
5010 | + struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); |
5011 | + struct usbhs_pipe *pipe = pkt->pipe; |
5012 | + struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); |
5013 | + unsigned long flags; |
5014 | |
5015 | -xfer_work_end: |
5016 | + usbhs_lock(priv, flags); |
5017 | + usbhsf_dma_xfer_preparing(pkt); |
5018 | usbhs_unlock(priv, flags); |
5019 | } |
5020 | |
5021 | @@ -918,8 +924,13 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done) |
5022 | pkt->trans = len; |
5023 | |
5024 | usbhsf_tx_irq_ctrl(pipe, 0); |
5025 | - INIT_WORK(&pkt->work, xfer_work); |
5026 | - schedule_work(&pkt->work); |
5027 | + /* FIXME: Workaound for usb dmac that driver can be used in atomic */ |
5028 | + if (usbhs_get_dparam(priv, has_usb_dmac)) { |
5029 | + usbhsf_dma_xfer_preparing(pkt); |
5030 | + } else { |
5031 | + INIT_WORK(&pkt->work, xfer_work); |
5032 | + schedule_work(&pkt->work); |
5033 | + } |
5034 | |
5035 | return 0; |
5036 | |
5037 | @@ -1025,8 +1036,7 @@ static int usbhsf_dma_prepare_pop_with_usb_dmac(struct usbhs_pkt *pkt, |
5038 | |
5039 | pkt->trans = pkt->length; |
5040 | |
5041 | - INIT_WORK(&pkt->work, xfer_work); |
5042 | - schedule_work(&pkt->work); |
5043 | + usbhsf_dma_xfer_preparing(pkt); |
5044 | |
5045 | return 0; |
5046 | |
5047 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
5048 | index f54931aa7528..63ff1a4f2e41 100644 |
5049 | --- a/drivers/usb/serial/ftdi_sio.c |
5050 | +++ b/drivers/usb/serial/ftdi_sio.c |
5051 | @@ -1024,6 +1024,7 @@ static const struct usb_device_id id_table_combined[] = { |
5052 | { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) }, |
5053 | /* EZPrototypes devices */ |
5054 | { USB_DEVICE(EZPROTOTYPES_VID, HJELMSLUND_USB485_ISO_PID) }, |
5055 | + { USB_DEVICE_INTERFACE_NUMBER(UNJO_VID, UNJO_ISODEBUG_V1_PID, 1) }, |
5056 | { } /* Terminating entry */ |
5057 | }; |
5058 | |
5059 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
5060 | index 15d220eaf6e6..ed6b36674c15 100644 |
5061 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
5062 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
5063 | @@ -1542,3 +1542,9 @@ |
5064 | #define CHETCO_SEASMART_DISPLAY_PID 0xA5AD /* SeaSmart NMEA2000 Display */ |
5065 | #define CHETCO_SEASMART_LITE_PID 0xA5AE /* SeaSmart Lite USB Adapter */ |
5066 | #define CHETCO_SEASMART_ANALOG_PID 0xA5AF /* SeaSmart Analog Adapter */ |
5067 | + |
5068 | +/* |
5069 | + * Unjo AB |
5070 | + */ |
5071 | +#define UNJO_VID 0x22B7 |
5072 | +#define UNJO_ISODEBUG_V1_PID 0x150D |
5073 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
5074 | index 1effe74ec638..d7b31fdce94d 100644 |
5075 | --- a/drivers/usb/serial/option.c |
5076 | +++ b/drivers/usb/serial/option.c |
5077 | @@ -1338,6 +1338,7 @@ static const struct usb_device_id option_ids[] = { |
5078 | .driver_info = RSVD(4) }, |
5079 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) }, |
5080 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) }, |
5081 | + { USB_DEVICE_INTERFACE_CLASS(ZTE_VENDOR_ID, 0x0601, 0xff) }, /* GosunCn ZTE WeLink ME3630 (RNDIS mode) */ |
5082 | { USB_DEVICE_INTERFACE_CLASS(ZTE_VENDOR_ID, 0x0602, 0xff) }, /* GosunCn ZTE WeLink ME3630 (MBIM mode) */ |
5083 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), |
5084 | .driver_info = RSVD(4) }, |
5085 | diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c |
5086 | index c160d2d0e18d..57a97b38a2fa 100644 |
5087 | --- a/fs/crypto/policy.c |
5088 | +++ b/fs/crypto/policy.c |
5089 | @@ -114,6 +114,8 @@ int fscrypt_process_policy(struct file *filp, |
5090 | if (!inode_has_encryption_context(inode)) { |
5091 | if (!S_ISDIR(inode->i_mode)) |
5092 | ret = -ENOTDIR; |
5093 | + else if (IS_DEADDIR(inode)) |
5094 | + ret = -ENOENT; |
5095 | else if (!inode->i_sb->s_cop->empty_dir) |
5096 | ret = -EOPNOTSUPP; |
5097 | else if (!inode->i_sb->s_cop->empty_dir(inode)) |
5098 | diff --git a/fs/udf/inode.c b/fs/udf/inode.c |
5099 | index fd817022cb9b..9e66d85021fc 100644 |
5100 | --- a/fs/udf/inode.c |
5101 | +++ b/fs/udf/inode.c |
5102 | @@ -478,13 +478,15 @@ static struct buffer_head *udf_getblk(struct inode *inode, long block, |
5103 | return NULL; |
5104 | } |
5105 | |
5106 | -/* Extend the file by 'blocks' blocks, return the number of extents added */ |
5107 | +/* Extend the file with new blocks totaling 'new_block_bytes', |
5108 | + * return the number of extents added |
5109 | + */ |
5110 | static int udf_do_extend_file(struct inode *inode, |
5111 | struct extent_position *last_pos, |
5112 | struct kernel_long_ad *last_ext, |
5113 | - sector_t blocks) |
5114 | + loff_t new_block_bytes) |
5115 | { |
5116 | - sector_t add; |
5117 | + uint32_t add; |
5118 | int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK); |
5119 | struct super_block *sb = inode->i_sb; |
5120 | struct kernel_lb_addr prealloc_loc = {}; |
5121 | @@ -494,7 +496,7 @@ static int udf_do_extend_file(struct inode *inode, |
5122 | |
5123 | /* The previous extent is fake and we should not extend by anything |
5124 | * - there's nothing to do... */ |
5125 | - if (!blocks && fake) |
5126 | + if (!new_block_bytes && fake) |
5127 | return 0; |
5128 | |
5129 | iinfo = UDF_I(inode); |
5130 | @@ -525,13 +527,12 @@ static int udf_do_extend_file(struct inode *inode, |
5131 | /* Can we merge with the previous extent? */ |
5132 | if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == |
5133 | EXT_NOT_RECORDED_NOT_ALLOCATED) { |
5134 | - add = ((1 << 30) - sb->s_blocksize - |
5135 | - (last_ext->extLength & UDF_EXTENT_LENGTH_MASK)) >> |
5136 | - sb->s_blocksize_bits; |
5137 | - if (add > blocks) |
5138 | - add = blocks; |
5139 | - blocks -= add; |
5140 | - last_ext->extLength += add << sb->s_blocksize_bits; |
5141 | + add = (1 << 30) - sb->s_blocksize - |
5142 | + (last_ext->extLength & UDF_EXTENT_LENGTH_MASK); |
5143 | + if (add > new_block_bytes) |
5144 | + add = new_block_bytes; |
5145 | + new_block_bytes -= add; |
5146 | + last_ext->extLength += add; |
5147 | } |
5148 | |
5149 | if (fake) { |
5150 | @@ -552,28 +553,27 @@ static int udf_do_extend_file(struct inode *inode, |
5151 | } |
5152 | |
5153 | /* Managed to do everything necessary? */ |
5154 | - if (!blocks) |
5155 | + if (!new_block_bytes) |
5156 | goto out; |
5157 | |
5158 | /* All further extents will be NOT_RECORDED_NOT_ALLOCATED */ |
5159 | last_ext->extLocation.logicalBlockNum = 0; |
5160 | last_ext->extLocation.partitionReferenceNum = 0; |
5161 | - add = (1 << (30-sb->s_blocksize_bits)) - 1; |
5162 | - last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | |
5163 | - (add << sb->s_blocksize_bits); |
5164 | + add = (1 << 30) - sb->s_blocksize; |
5165 | + last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | add; |
5166 | |
5167 | /* Create enough extents to cover the whole hole */ |
5168 | - while (blocks > add) { |
5169 | - blocks -= add; |
5170 | + while (new_block_bytes > add) { |
5171 | + new_block_bytes -= add; |
5172 | err = udf_add_aext(inode, last_pos, &last_ext->extLocation, |
5173 | last_ext->extLength, 1); |
5174 | if (err) |
5175 | return err; |
5176 | count++; |
5177 | } |
5178 | - if (blocks) { |
5179 | + if (new_block_bytes) { |
5180 | last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | |
5181 | - (blocks << sb->s_blocksize_bits); |
5182 | + new_block_bytes; |
5183 | err = udf_add_aext(inode, last_pos, &last_ext->extLocation, |
5184 | last_ext->extLength, 1); |
5185 | if (err) |
5186 | @@ -604,6 +604,24 @@ out: |
5187 | return count; |
5188 | } |
5189 | |
5190 | +/* Extend the final block of the file to final_block_len bytes */ |
5191 | +static void udf_do_extend_final_block(struct inode *inode, |
5192 | + struct extent_position *last_pos, |
5193 | + struct kernel_long_ad *last_ext, |
5194 | + uint32_t final_block_len) |
5195 | +{ |
5196 | + struct super_block *sb = inode->i_sb; |
5197 | + uint32_t added_bytes; |
5198 | + |
5199 | + added_bytes = final_block_len - |
5200 | + (last_ext->extLength & (sb->s_blocksize - 1)); |
5201 | + last_ext->extLength += added_bytes; |
5202 | + UDF_I(inode)->i_lenExtents += added_bytes; |
5203 | + |
5204 | + udf_write_aext(inode, last_pos, &last_ext->extLocation, |
5205 | + last_ext->extLength, 1); |
5206 | +} |
5207 | + |
5208 | static int udf_extend_file(struct inode *inode, loff_t newsize) |
5209 | { |
5210 | |
5211 | @@ -613,10 +631,12 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) |
5212 | int8_t etype; |
5213 | struct super_block *sb = inode->i_sb; |
5214 | sector_t first_block = newsize >> sb->s_blocksize_bits, offset; |
5215 | + unsigned long partial_final_block; |
5216 | int adsize; |
5217 | struct udf_inode_info *iinfo = UDF_I(inode); |
5218 | struct kernel_long_ad extent; |
5219 | - int err; |
5220 | + int err = 0; |
5221 | + int within_final_block; |
5222 | |
5223 | if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) |
5224 | adsize = sizeof(struct short_ad); |
5225 | @@ -626,18 +646,8 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) |
5226 | BUG(); |
5227 | |
5228 | etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset); |
5229 | + within_final_block = (etype != -1); |
5230 | |
5231 | - /* File has extent covering the new size (could happen when extending |
5232 | - * inside a block)? */ |
5233 | - if (etype != -1) |
5234 | - return 0; |
5235 | - if (newsize & (sb->s_blocksize - 1)) |
5236 | - offset++; |
5237 | - /* Extended file just to the boundary of the last file block? */ |
5238 | - if (offset == 0) |
5239 | - return 0; |
5240 | - |
5241 | - /* Truncate is extending the file by 'offset' blocks */ |
5242 | if ((!epos.bh && epos.offset == udf_file_entry_alloc_offset(inode)) || |
5243 | (epos.bh && epos.offset == sizeof(struct allocExtDesc))) { |
5244 | /* File has no extents at all or has empty last |
5245 | @@ -651,7 +661,22 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) |
5246 | &extent.extLength, 0); |
5247 | extent.extLength |= etype << 30; |
5248 | } |
5249 | - err = udf_do_extend_file(inode, &epos, &extent, offset); |
5250 | + |
5251 | + partial_final_block = newsize & (sb->s_blocksize - 1); |
5252 | + |
5253 | + /* File has extent covering the new size (could happen when extending |
5254 | + * inside a block)? |
5255 | + */ |
5256 | + if (within_final_block) { |
5257 | + /* Extending file within the last file block */ |
5258 | + udf_do_extend_final_block(inode, &epos, &extent, |
5259 | + partial_final_block); |
5260 | + } else { |
5261 | + loff_t add = ((loff_t)offset << sb->s_blocksize_bits) | |
5262 | + partial_final_block; |
5263 | + err = udf_do_extend_file(inode, &epos, &extent, add); |
5264 | + } |
5265 | + |
5266 | if (err < 0) |
5267 | goto out; |
5268 | err = 0; |
5269 | @@ -756,6 +781,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, |
5270 | /* Are we beyond EOF? */ |
5271 | if (etype == -1) { |
5272 | int ret; |
5273 | + loff_t hole_len; |
5274 | isBeyondEOF = true; |
5275 | if (count) { |
5276 | if (c) |
5277 | @@ -771,7 +797,8 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, |
5278 | startnum = (offset > 0); |
5279 | } |
5280 | /* Create extents for the hole between EOF and offset */ |
5281 | - ret = udf_do_extend_file(inode, &prev_epos, laarr, offset); |
5282 | + hole_len = (loff_t)offset << inode->i_blkbits; |
5283 | + ret = udf_do_extend_file(inode, &prev_epos, laarr, hole_len); |
5284 | if (ret < 0) { |
5285 | brelse(prev_epos.bh); |
5286 | brelse(cur_epos.bh); |
5287 | diff --git a/include/linux/vmw_vmci_defs.h b/include/linux/vmw_vmci_defs.h |
5288 | index 1bd31a38c51e..ce13d4677f1d 100644 |
5289 | --- a/include/linux/vmw_vmci_defs.h |
5290 | +++ b/include/linux/vmw_vmci_defs.h |
5291 | @@ -75,9 +75,18 @@ enum { |
5292 | |
5293 | /* |
5294 | * A single VMCI device has an upper limit of 128MB on the amount of |
5295 | - * memory that can be used for queue pairs. |
5296 | + * memory that can be used for queue pairs. Since each queue pair |
5297 | + * consists of at least two pages, the memory limit also dictates the |
5298 | + * number of queue pairs a guest can create. |
5299 | */ |
5300 | #define VMCI_MAX_GUEST_QP_MEMORY (128 * 1024 * 1024) |
5301 | +#define VMCI_MAX_GUEST_QP_COUNT (VMCI_MAX_GUEST_QP_MEMORY / PAGE_SIZE / 2) |
5302 | + |
5303 | +/* |
5304 | + * There can be at most PAGE_SIZE doorbells since there is one doorbell |
5305 | + * per byte in the doorbell bitmap page. |
5306 | + */ |
5307 | +#define VMCI_MAX_GUEST_DOORBELL_COUNT PAGE_SIZE |
5308 | |
5309 | /* |
5310 | * Queues with pre-mapped data pages must be small, so that we don't pin |
5311 | diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h |
5312 | index 1b1cf33cbfb0..2b6abd046087 100644 |
5313 | --- a/include/net/ip6_tunnel.h |
5314 | +++ b/include/net/ip6_tunnel.h |
5315 | @@ -149,9 +149,12 @@ static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb, |
5316 | memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); |
5317 | pkt_len = skb->len - skb_inner_network_offset(skb); |
5318 | err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb); |
5319 | - if (unlikely(net_xmit_eval(err))) |
5320 | - pkt_len = -1; |
5321 | - iptunnel_xmit_stats(dev, pkt_len); |
5322 | + |
5323 | + if (dev) { |
5324 | + if (unlikely(net_xmit_eval(err))) |
5325 | + pkt_len = -1; |
5326 | + iptunnel_xmit_stats(dev, pkt_len); |
5327 | + } |
5328 | } |
5329 | #endif |
5330 | #endif |
5331 | diff --git a/include/uapi/linux/nilfs2_ondisk.h b/include/uapi/linux/nilfs2_ondisk.h |
5332 | index 2a8a3addb675..f9b6b5be7ddf 100644 |
5333 | --- a/include/uapi/linux/nilfs2_ondisk.h |
5334 | +++ b/include/uapi/linux/nilfs2_ondisk.h |
5335 | @@ -28,7 +28,7 @@ |
5336 | |
5337 | #include <linux/types.h> |
5338 | #include <linux/magic.h> |
5339 | - |
5340 | +#include <asm/byteorder.h> |
5341 | |
5342 | #define NILFS_INODE_BMAP_SIZE 7 |
5343 | |
5344 | @@ -532,19 +532,19 @@ enum { |
5345 | static inline void \ |
5346 | nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \ |
5347 | { \ |
5348 | - cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \ |
5349 | - (1UL << NILFS_CHECKPOINT_##flag)); \ |
5350 | + cp->cp_flags = __cpu_to_le32(__le32_to_cpu(cp->cp_flags) | \ |
5351 | + (1UL << NILFS_CHECKPOINT_##flag)); \ |
5352 | } \ |
5353 | static inline void \ |
5354 | nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \ |
5355 | { \ |
5356 | - cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \ |
5357 | + cp->cp_flags = __cpu_to_le32(__le32_to_cpu(cp->cp_flags) & \ |
5358 | ~(1UL << NILFS_CHECKPOINT_##flag)); \ |
5359 | } \ |
5360 | static inline int \ |
5361 | nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \ |
5362 | { \ |
5363 | - return !!(le32_to_cpu(cp->cp_flags) & \ |
5364 | + return !!(__le32_to_cpu(cp->cp_flags) & \ |
5365 | (1UL << NILFS_CHECKPOINT_##flag)); \ |
5366 | } |
5367 | |
5368 | @@ -594,20 +594,20 @@ enum { |
5369 | static inline void \ |
5370 | nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \ |
5371 | { \ |
5372 | - su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \ |
5373 | + su->su_flags = __cpu_to_le32(__le32_to_cpu(su->su_flags) | \ |
5374 | (1UL << NILFS_SEGMENT_USAGE_##flag));\ |
5375 | } \ |
5376 | static inline void \ |
5377 | nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \ |
5378 | { \ |
5379 | su->su_flags = \ |
5380 | - cpu_to_le32(le32_to_cpu(su->su_flags) & \ |
5381 | + __cpu_to_le32(__le32_to_cpu(su->su_flags) & \ |
5382 | ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \ |
5383 | } \ |
5384 | static inline int \ |
5385 | nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \ |
5386 | { \ |
5387 | - return !!(le32_to_cpu(su->su_flags) & \ |
5388 | + return !!(__le32_to_cpu(su->su_flags) & \ |
5389 | (1UL << NILFS_SEGMENT_USAGE_##flag)); \ |
5390 | } |
5391 | |
5392 | @@ -618,15 +618,15 @@ NILFS_SEGMENT_USAGE_FNS(ERROR, error) |
5393 | static inline void |
5394 | nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su) |
5395 | { |
5396 | - su->su_lastmod = cpu_to_le64(0); |
5397 | - su->su_nblocks = cpu_to_le32(0); |
5398 | - su->su_flags = cpu_to_le32(0); |
5399 | + su->su_lastmod = __cpu_to_le64(0); |
5400 | + su->su_nblocks = __cpu_to_le32(0); |
5401 | + su->su_flags = __cpu_to_le32(0); |
5402 | } |
5403 | |
5404 | static inline int |
5405 | nilfs_segment_usage_clean(const struct nilfs_segment_usage *su) |
5406 | { |
5407 | - return !le32_to_cpu(su->su_flags); |
5408 | + return !__le32_to_cpu(su->su_flags); |
5409 | } |
5410 | |
5411 | /** |
5412 | diff --git a/kernel/events/core.c b/kernel/events/core.c |
5413 | index 7929526e96e2..93d7333c64d8 100644 |
5414 | --- a/kernel/events/core.c |
5415 | +++ b/kernel/events/core.c |
5416 | @@ -5492,7 +5492,7 @@ static void perf_sample_regs_user(struct perf_regs *regs_user, |
5417 | if (user_mode(regs)) { |
5418 | regs_user->abi = perf_reg_abi(current); |
5419 | regs_user->regs = regs; |
5420 | - } else if (current->mm) { |
5421 | + } else if (!(current->flags & PF_KTHREAD)) { |
5422 | perf_get_regs_user(regs_user, regs, regs_user_copy); |
5423 | } else { |
5424 | regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE; |
5425 | diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c |
5426 | index 1e1fa99b3243..0b53d1907e4a 100644 |
5427 | --- a/net/ipv6/netfilter/nf_conntrack_reasm.c |
5428 | +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c |
5429 | @@ -264,8 +264,14 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, |
5430 | |
5431 | prev = fq->q.fragments_tail; |
5432 | err = inet_frag_queue_insert(&fq->q, skb, offset, end); |
5433 | - if (err) |
5434 | + if (err) { |
5435 | + if (err == IPFRAG_DUP) { |
5436 | + /* No error for duplicates, pretend they got queued. */ |
5437 | + kfree_skb(skb); |
5438 | + return -EINPROGRESS; |
5439 | + } |
5440 | goto insert_error; |
5441 | + } |
5442 | |
5443 | if (dev) |
5444 | fq->iif = dev->ifindex; |
5445 | @@ -292,15 +298,17 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, |
5446 | skb->_skb_refdst = 0UL; |
5447 | err = nf_ct_frag6_reasm(fq, skb, prev, dev); |
5448 | skb->_skb_refdst = orefdst; |
5449 | - return err; |
5450 | + |
5451 | + /* After queue has assumed skb ownership, only 0 or |
5452 | + * -EINPROGRESS must be returned. |
5453 | + */ |
5454 | + return err ? -EINPROGRESS : 0; |
5455 | } |
5456 | |
5457 | skb_dst_drop(skb); |
5458 | return -EINPROGRESS; |
5459 | |
5460 | insert_error: |
5461 | - if (err == IPFRAG_DUP) |
5462 | - goto err; |
5463 | inet_frag_kill(&fq->q); |
5464 | err: |
5465 | skb_dst_drop(skb); |
5466 | @@ -480,12 +488,6 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user) |
5467 | ret = 0; |
5468 | } |
5469 | |
5470 | - /* after queue has assumed skb ownership, only 0 or -EINPROGRESS |
5471 | - * must be returned. |
5472 | - */ |
5473 | - if (ret) |
5474 | - ret = -EINPROGRESS; |
5475 | - |
5476 | spin_unlock_bh(&fq->q.lock); |
5477 | inet_frag_put(&fq->q); |
5478 | return ret; |
5479 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h |
5480 | index 8a690ebd7374..6708de10a3e5 100644 |
5481 | --- a/net/mac80211/ieee80211_i.h |
5482 | +++ b/net/mac80211/ieee80211_i.h |
5483 | @@ -1403,7 +1403,7 @@ ieee80211_get_sband(struct ieee80211_sub_if_data *sdata) |
5484 | rcu_read_lock(); |
5485 | chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); |
5486 | |
5487 | - if (WARN_ON(!chanctx_conf)) { |
5488 | + if (WARN_ON_ONCE(!chanctx_conf)) { |
5489 | rcu_read_unlock(); |
5490 | return NULL; |
5491 | } |
5492 | diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c |
5493 | index b2a27263d6ff..5c347d3a92c9 100644 |
5494 | --- a/net/mac80211/mesh.c |
5495 | +++ b/net/mac80211/mesh.c |
5496 | @@ -885,6 +885,7 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) |
5497 | |
5498 | /* flush STAs and mpaths on this iface */ |
5499 | sta_info_flush(sdata); |
5500 | + ieee80211_free_keys(sdata, true); |
5501 | mesh_path_flush_by_iface(sdata); |
5502 | |
5503 | /* stop the beacon */ |
5504 | @@ -1135,7 +1136,8 @@ int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata) |
5505 | ifmsh->chsw_ttl = 0; |
5506 | |
5507 | /* Remove the CSA and MCSP elements from the beacon */ |
5508 | - tmp_csa_settings = rcu_dereference(ifmsh->csa); |
5509 | + tmp_csa_settings = rcu_dereference_protected(ifmsh->csa, |
5510 | + lockdep_is_held(&sdata->wdev.mtx)); |
5511 | RCU_INIT_POINTER(ifmsh->csa, NULL); |
5512 | if (tmp_csa_settings) |
5513 | kfree_rcu(tmp_csa_settings, rcu_head); |
5514 | @@ -1157,6 +1159,8 @@ int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata, |
5515 | struct mesh_csa_settings *tmp_csa_settings; |
5516 | int ret = 0; |
5517 | |
5518 | + lockdep_assert_held(&sdata->wdev.mtx); |
5519 | + |
5520 | tmp_csa_settings = kmalloc(sizeof(*tmp_csa_settings), |
5521 | GFP_ATOMIC); |
5522 | if (!tmp_csa_settings) |
5523 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c |
5524 | index 244eac1bd648..de18a463ac96 100644 |
5525 | --- a/net/sunrpc/clnt.c |
5526 | +++ b/net/sunrpc/clnt.c |
5527 | @@ -2718,6 +2718,7 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt, |
5528 | xprt = xprt_iter_xprt(&clnt->cl_xpi); |
5529 | if (xps == NULL || xprt == NULL) { |
5530 | rcu_read_unlock(); |
5531 | + xprt_switch_put(xps); |
5532 | return -EAGAIN; |
5533 | } |
5534 | resvport = xprt->resvport; |
5535 | diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c |
5536 | index 97913e109b14..99e5a2f63e76 100644 |
5537 | --- a/samples/bpf/bpf_load.c |
5538 | +++ b/samples/bpf/bpf_load.c |
5539 | @@ -369,7 +369,7 @@ void read_trace_pipe(void) |
5540 | static char buf[4096]; |
5541 | ssize_t sz; |
5542 | |
5543 | - sz = read(trace_fd, buf, sizeof(buf)); |
5544 | + sz = read(trace_fd, buf, sizeof(buf) - 1); |
5545 | if (sz > 0) { |
5546 | buf[sz] = 0; |
5547 | puts(buf); |
5548 | diff --git a/virt/kvm/arm/vgic/vgic-its.c b/virt/kvm/arm/vgic/vgic-its.c |
5549 | index 1ebbf233de9a..6d64b2cb02ab 100644 |
5550 | --- a/virt/kvm/arm/vgic/vgic-its.c |
5551 | +++ b/virt/kvm/arm/vgic/vgic-its.c |
5552 | @@ -1466,6 +1466,7 @@ static void vgic_its_destroy(struct kvm_device *kvm_dev) |
5553 | mutex_unlock(&its->its_lock); |
5554 | |
5555 | kfree(its); |
5556 | + kfree(kvm_dev);/* alloc by kvm_ioctl_create_device, free by .destroy */ |
5557 | } |
5558 | |
5559 | static int vgic_its_has_attr(struct kvm_device *dev, |