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