Magellan Linux

Contents of /trunk/kernel-alx/patches-4.9/0285-4.9.186-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3373 - (show annotations) (download)
Thu Jul 25 14:48:18 2019 UTC (4 years, 9 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(&notifier->node,
3696 + &context->notifier_list);
3697 + context->n_notifiers++;
3698 + result = VMCI_SUCCESS;
3699 + }
3700 } else {
3701 - list_add_tail_rcu(&notifier->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,