include upstream ip1000a driver version 2.09f
[linux-2.4.git] / arch / sh64 / lib / checksum.S
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * arch/sh5/lib/checksum.S
7  *
8  * Copyright (C) 2000, 2001  Paolo Alberelli, Stefano D'Andrea
9  *
10  */
11
12 /*
13  *
14  * INET         An implementation of the TCP/IP protocol suite for the LINUX
15  *              operating system.  INET is implemented using the  BSD Socket
16  *              interface as the means of communication with the user level.
17  *
18  *              IP/TCP/UDP checksumming routines
19  *
20  * Authors:     Jorge Cwik, <jorge@laser.satlink.net>
21  *              Arnt Gulbrandsen, <agulbra@nvg.unit.no>
22  *              Tom May, <ftom@netcom.com>
23  *              Pentium Pro/II routines:
24  *              Alexander Kjeldaas <astor@guardian.no>
25  *              Finn Arne Gangstad <finnag@guardian.no>
26  *              Lots of code moved from tcp.c and ip.c; see those files
27  *              for more names.
28  *
29  * Changes:     Ingo Molnar, converted csum_partial_copy() to 2.1 exception
30  *                           handling.
31  *              Andi Kleen,  add zeroing on error
32  *                   converted to pure assembler
33  *
34  * SuperH version:  Copyright (C) 1999  Niibe Yutaka
35  *
36  * SH-5 version:  Copyright (C) 2000  Paolo Alberelli, Stefano D'Andrea
37  *
38  *              This program is free software; you can redistribute it and/or
39  *              modify it under the terms of the GNU General Public License
40  *              as published by the Free Software Foundation; either version
41  *              2 of the License, or (at your option) any later version.
42  */
43
44 #include <asm/errno.h>
45 #include <asm/registers.h>
46
47         .section        .text64, "ax"
48 /*      
49  * unsigned int csum_partial(const unsigned char *buf,
50  *                           int                  len,
51  *                           unsigned int         sum);
52  *
53  *
54  * computes a partial checksum, e.g. for TCP/UDP fragments
55  */
56
57 /*
58  * SH-5 ABI convention:
59  *    Input parameters:
60  *              r2  = *buf
61  *              r3  =  len
62  *              r4  =  sum      so far computed checksum (may be zero)
63  *    return value must be in:
64  *              r2              returned checksum
65  */
66
67         /*
68          * Experiments with Ethernet and SLIP connections show that buff
69          * is aligned on either a 2-byte or 4-byte boundary.  We get at
70          * least a twofold speedup on 486 and Pentium if it is 4-byte aligned.
71          * Fortunately, it is easy to convert 2-byte alignment to 4-byte
72          * alignment for the unrolled loop.
73          */
74
75 #ifndef NOTDEF  
76         /* This version of _csum_partial is an easy but unefficient
77          * implementation. 
78          * It's mainteined only for historical reasons. 
79          */
80         .global csum_partial
81 csum_partial:
82         _ptar           .byte_footer, t1        /* t1 = .byte_footer         */
83         _ptar           .add_short_loop, t2     /* t2 = checksum eval loop   */
84         _ptar           .exiting, t3            /* t3 = add carry...         */
85
86         movi            2, r1
87
88         /* we assume buf short aligned */
89         /* Short must be checksummed   */
90 .add_short_loop:
91         bgt             r1, r3, t1              /* Size = 1 or 0 (remind)    */
92
93         ld.uw           r2, 0, r7               /* r7 = word to be checksumed*/
94         add             r4, r7, r4
95
96         addi            r2, 2, r2               /* move buf forward...       */
97         addi            r3, -2, r3              /* decrement len             */
98         blink           t2, ZERO                /* goto .add_short_loop      */
99         
100 .byte_footer:
101         /* still one byte to be checksummed ? */
102         xor             r7, r7, r7
103         beqi            r3, 0, t3
104         ld.ub           r2, 0, r7               /* r7 = last byte...         */
105 #ifndef __LITTLE_ENDIAN__
106         shlli           r7, 8, r7
107 #endif
108
109 .exiting:
110         add             r4, r7, r2
111         
112         ptabs           r18, t0
113         blink           t0, ZERO
114
115 #else  /* NOTDEF ---------------------------------------------------- */
116
117         .global csum_partial
118 csum_partial:
119         movi            32, r8                  /* r8 = sizeof(8 * int)   */
120         _ptar           .byte_footer, t1        /* t1 = .byte_footer      */
121         _ptar           .word_footer, t2        /* t2 = .word_footer      */
122         _ptar           .long_footer, t3        /* t3 = .long_footer      */
123         _ptar           .exit, t4               /* t4 = exit point        */
124         _ptar           .long_aligned, t0       /* t0 = .long_aligned     */
125         or              r2, ZERO, r5            /* r5 = buffer pointer    */
126         or              r3, ZERO, r6            /* r6 = original length   */
127         andi            r2, 2, r7               
128         beq             r7, ZERO, t0            /* It's buf long aligned */
129
130         /* we assume buf short aligned */
131
132         beqi            r3, 1, t1               /* Size = 1 */
133
134         /* Short must be checksummed */
135         ld.uw           r2, 0, r7               /* r7 = word to be checksumed*/
136         add             r4, r7, r4
137
138         or              ZERO, ZERO, r7
139
140         mshflo.l        r4, r7, r7
141         shlri           r4, 32, r4
142         add             r4, r7, r4              /* Add eventual "carry" */
143         addi            r6, -2, r6
144         addi            r5, 2, r5               /* r5 is now long aligned */
145         beq             r6, ZERO, t4            /* Exit if done */
146         
147         or              ZERO, ZERO, r7          /* Clean up r7 */
148         
149 .long_aligned:
150         bgt             r8, r6, t3
151         
152         /* 8 Longs to be checksummed */
153         ld.l            r5, 0, r7               /* r7 = data to be checksummed*/
154         add             r4, r7, r4
155         or              ZERO, ZERO, r7
156         mshflo.l        r4, r7, r7
157         shlri           r4, 32, r4
158         add             r4, r7, r4              /* Add eventual "carry" */
159         ld.l            r5, 4, r7               /* r7 = data to be checksummed*/
160         add             r4, r7, r4
161         or              ZERO, ZERO, r7
162
163
164         mshflo.l        r4, r7, r7
165         shlri           r4, 32, r4
166         add             r4, r7, r4              /* Add eventual "carry" */
167         ld.l            r5, 8, r7               /* r7 = data to be checksummed*/
168         add             r4, r7, r4
169         or              ZERO, ZERO, r7
170         mshflo.l        r4, r7, r7
171         shlri           r4, 32, r4
172         add             r4, r7, r4              /* Add eventual "carry" */
173
174         ld.l            r5, 12, r7              /* r7 = data to be checksummed*/
175         add             r4, r7, r4
176         or              ZERO, ZERO, r7
177         mshflo.l        r4, r7, r7
178         shlri           r4, 32, r4
179         add             r4, r7, r4              /* Add eventual "carry" */
180
181
182         ld.l            r5, 16, r7              /* r7 = data to be checksummed*/
183         add             r4, r7, r4
184         or              ZERO, ZERO, r7
185         mshflo.l        r4, r7, r7
186         shlri           r4, 32, r4
187         add             r4, r7, r4              /* Add eventual "carry" */
188
189         ld.l            r5, 20, r7              /* r7 = data to be checksummed*/
190         add             r4, r7, r4
191         or              ZERO, ZERO, r7
192         mshflo.l        r4, r7, r7
193         shlri           r4, 32, r4
194         add             r4, r7, r4              /* Add eventual "carry" */
195
196
197         ld.l            r5, 24, r7              /* r7 = data to be checksummed*/
198         add             r4, r7, r4
199         or              ZERO, ZERO, r7
200         mshflo.l        r4, r7, r7
201         shlri           r4, 32, r4
202         add             r4, r7, r4              /* Add eventual "carry" */
203
204
205         ld.l            r5, 28, r7              /* r7 = data to be checksummed*/
206         add             r4, r7, r4
207         or              ZERO, ZERO, r7
208         mshflo.l        r4, r7, r7
209         shlri           r4, 32, r4
210         add             r4, r7, r4              /* Add eventual "carry" */
211
212
213         sub             r6, r8, r6
214         add             r5, r8, r5
215         blink           t0, ZERO
216         
217 .long_footer:
218         movi            4, r8
219         bgt             r8, r6, t2
220         
221         /* Long to be checksummed */
222         ld.l            r5, 0, r7               /* r7 = data to be checksummed*/
223         add             r4, r7, r4
224         or              ZERO, ZERO, r7
225         mshflo.l        r4, r7, r7
226         shlri           r4, 32, r4
227         add             r4, r7, r4              /* Add eventual "carry" */
228
229
230         sub             r6, r8, r6
231         add             r5, r8, r5
232         blink           t3, ZERO
233         
234 .word_footer:
235         movi            2, r8
236         bgt             r8, r6, t1
237
238         /* Short to be checksummed */
239         ld.uw           r5, 0, r7               /* r7 = data to be checksummed*/
240         add             r4, r7, r4
241         or              ZERO, ZERO, r7
242         mshflo.l        r4, r7, r7
243         shlri           r4, 32, r4
244         add             r4, r7, r4              /* Add eventual "carry" */
245
246
247         sub             r6, r8, r6
248         add             r5, r8, r5
249         
250 .byte_footer:
251         beqi            r6, 0, t4
252         /* Short to be checksummed */
253         ld.ub           r5, 0, r7               /* r7 = data to be checksummed*/
254
255 #ifndef __LITTLE_ENDIAN__
256         shlli           r7, 8, r7
257 #endif
258
259         add             r4, r7, r4
260         or              ZERO, ZERO, r7
261         mshflo.l        r4, r7, r7
262         shlri           r4, 32, r4
263         add             r4, r7, r4              /* Add eventual "carry" */
264
265
266 .exit:
267         or              r4, ZERO, r2
268
269         ptabs           r18, t0
270         blink           t0, ZERO
271
272 #endif  /*NOTDEF*/
273
274 /*
275  * unsigned int csum_partial_copy_generic (const char *src,
276  *                                               char *dst,
277  *                                               int len, 
278  *                                               int sum,
279  *                                               int *src_err_ptr,
280  *                                               int *dst_err_ptr)
281  *  
282  *
283  *
284  * Copy from ds while checksumming, otherwise like csum_partial
285  *
286  * The macros SRC and DST specify the type of access for the instruction.
287  * thus we can call a custom exception handler for all access types.
288  *
289  * FIXME: could someone double-check whether I haven't mixed up some SRC and
290  *        DST definitions? It's damn hard to trigger all cases.  I hope I got
291  *        them all but there's no guarantee.
292  */
293
294 /*
295  * SH-5 ABI convention:
296  *    Input parameters:
297  *              r2  = const char  *src
298  *              r3  = char        *dst
299  *              r4  = int          len
300  *              r5  = int          sum   so far computed checksum (may be zero)
301  *              r6  = int         *src_err_ptr
302  *              r7  = int         *dst_err_ptr
303  *    return value must be in:
304  *              r2      returned checksum
305  */
306
307 #ifndef NOTDEF  
308         /* 
309         ** This version of _csum_partial_copy_generic is an easy but
310         ** unefficient implementation. 
311         ** It's mainteined only for historical reasons. 
312         */
313         .global csum_partial_copy_generic
314 csum_partial_copy_generic:
315         _ptar           .gc_byte_footer, t1     /* t1 = .byte_footer         */
316         _ptar           .gc_add_short_loop, t2  /* t2 = checksum eval loop   */
317         _ptar           .gc_exiting, t3         /* t3 = add carry...         */
318
319         or              r2, ZERO, r20           /* r20 = source pointer      */ 
320         or              r3, ZERO, r21           /* r21 = destination pointer */ 
321
322         movi            2, r1
323
324         /* we assume buf short aligned */
325         /* Short must be checksummed   */
326 .gc_add_short_loop:
327
328         bgt             r1, r4, t1              /* Size = 1 or 0 (remind)    */
329
330 .src_err_1:
331         ld.uw           r20, 0, r8              /* r8 = word to be checksum. */
332         st.w            r21, 0, r8              /* fill data into DST */
333
334         add             r5, r8, r5
335
336         addi            r20, 2, r20             /* move SRC forward...       */
337         addi            r21, 2, r21             /* move DST forward...       */
338         addi            r4, -2, r4              /* decrement len             */
339         blink           t2, ZERO                /* goto .gc_add_short_loop   */
340         
341 .gc_byte_footer:
342         /* still one byte to be checksummed ? */
343         xor             r8, r8, r8
344         beqi            r4, 0, t3
345
346 .src_err_2:
347         ld.ub           r20, 0, r8              /* r8 = last byte...         */
348         st.b            r21, 0, r8
349 #ifndef __LITTLE_ENDIAN__
350         shlli           r8, 8, r8
351 #endif
352
353 .gc_exiting:
354         add             r5, r8, r2
355         
356         ptabs           r18, t0
357         blink           t0, ZERO
358
359         .section        .fixup, "ax"
360
361 _csum_partial_copy_generic_dst_err:
362         movi            -(EFAULT), r8           /* r8 = EFAULT reply */
363         st.l            r7, 0, r8               /* *DST_ERR = -EFAULT */
364
365         /* Quiet exit */
366         or              r5, ZERO, r2
367
368         ptabs           r18, t0
369         blink           t0, ZERO
370
371 _csum_partial_copy_generic_src_err:
372         movi            -(EFAULT), r8           /* r8 = EFAULT reply */
373         ld.l            r6, 0, r8               /* *SRC_ERR = -EFAULT */
374
375         /*
376          * Now reset the DST buffer.    
377          * r20 points to the next DST byte.
378          * r3 points to the first DST byte.
379          */
380         _ptar           .quiet_exit, t0
381         _ptar           .src_err_loop, t1
382         beq             r20, r3, t0
383
384 .src_err_loop:
385         addi            r20, -1, r20
386         ld.b            r20, 0, ZERO
387         bne             r20, r3, t1
388
389         /* Quiet exit */
390 .quiet_exit:
391         or              r5, ZERO, r2
392
393         ptabs           r18, t0
394         blink           t0, ZERO
395
396         .section        __ex_table, "a"
397
398         .global asm_checksum_start      /* Just a marker */
399 asm_checksum_start:
400         .long   .src_err_1, _csum_partial_copy_generic_src_err
401         .long   .src_err_2, _csum_partial_copy_generic_src_err
402         .long   .src_err_1+4, _csum_partial_copy_generic_dst_err
403         .long   .src_err_2+4, _csum_partial_copy_generic_dst_err
404         .global asm_checksum_end        /* Just a marker */
405 asm_checksum_end:
406
407 #else  /* NOTDEF -------------------------------------------------------- */
408
409         .global csum_partial_copy_generic
410 csum_partial_copy_generic:
411
412         movi            32, r27                 /* r27 = sizeof(8 * int) */
413         _ptar           .byte_footer_gc, t1     /* t1 = .byte_footer_gc */
414         _ptar           .word_footer_gc, t2     /* t2 = .word_footer_gc */
415         _ptar           .long_footer_gc, t3     /* t3 = .long_footer_gc */
416         _ptar           .exit_gc, t4            /* t4 = exit point */
417
418         or              r2, ZERO, r24           /* r24 = original SRC pointer */
419         or              r3, ZERO, r20           /* r20 = original DST pointer */
420         or              r4, ZERO, r25           /* r25 = original length */
421         _ptar           .long_aligned_gc, t0
422         andi            r2, 2, r26              /* check if source it's  */
423         beq             r26, ZERO, t0           /* long aligned          */
424
425         /* It's short aligned */
426
427         beqi            r4, 1, t1               /* Size = 1 */
428
429         /* Short must be checksummed */
430 .src_err_1:
431         ld.w            r2, 0, r26              /* r26: data to be checksummed*/
432         st.w            r3, 0, r26              /* fill data into DST */
433         add             r5, r26, r5
434         or              ZERO, ZERO, r26
435         mshflo.l        r5, r26, r26
436         shlri           r5, 32, r5
437         add             r5, r26, r5             /* Add eventual "carry" */
438         
439         addi            r25, -2, r25
440         addi            r24, 2, r24             /* r24 is now long aligned */
441         addi            r20, 2, r20             /* r20 it's now long aligned */
442         beq             r25, ZERO, t4           /* Exit if done */
443         
444         or              ZERO, ZERO, r26         /* Clean up r26 */
445         
446 .long_aligned_gc:
447         bgt             r27, r25, t3
448         
449         /* 8 Longs to be checksummed */
450 .src_err_2:
451         ld.l            r24, 0, r26             /* r26: data to be checksummed*/
452         st.l            r20, 0, r26             /* fill data into DST */
453         add             r5, r26, r5
454         or              ZERO, ZERO, r26
455         mshflo.l        r5, r26, r26
456         shlri           r5, 32, r5
457         add             r5, r26, r5             /* Add eventual "carry" */
458
459 .src_err_3:
460         ld.l            r24, 4, r26             /* r26: data to be checksummed*/
461         st.l            r20, 4, r26             /* fill data into DST */
462         add             r5, r26, r5
463         or              ZERO, ZERO, r26
464         mshflo.l        r5, r26, r26
465         shlri           r5, 32, r5
466         add             r5, r26, r5             /* Add eventual "carry" */
467
468 .src_err_4:
469         ld.l            r24, 8, r26             /* r26: data to be checksummed*/
470         st.l            r20, 8, r26             /* fill data into DST */
471         add             r5, r26, r5
472         or              ZERO, ZERO, r26
473         mshflo.l        r5, r26, r26
474         shlri           r5, 32, r5
475         add             r5, r26, r5             /* Add eventual "carry" */
476
477 .src_err_5:
478         ld.l            r24, 12, r26            /* r26: data to be checksummed*/
479         st.l            r20, 12, r26            /* fill data into DST */
480         add             r5, r26, r5
481         or              ZERO, ZERO, r26
482         mshflo.l        r5, r26, r26
483         shlri           r5, 32, r5
484         add             r5, r26, r5             /* Add eventual "carry" */
485
486 .src_err_6:
487         ld.l            r24, 16, r26            /* r26: data to be checksummed*/
488         st.l            r20, 16, r26            /* fill data into DST */
489         add             r5, r26, r5
490         or              ZERO, ZERO, r26
491         mshflo.l        r5, r26, r26
492         shlri           r5, 32, r5
493         add             r5, r26, r5             /* Add eventual "carry" */
494
495 .src_err_7:
496         ld.l            r24, 20, r26            /* r26: data to be checksummed*/
497         st.l            r20, 20, r26            /* fill data into DST */
498         add             r5, r26, r5
499         or              ZERO, ZERO, r26
500         mshflo.l        r5, r26,r26
501         shlri           r5, 32, r5
502         add             r5, r26, r5             /* Add eventual "carry" */
503
504 .src_err_8:
505         ld.l            r24, 24, r26            /* r26: data to be checksummed*/
506         st.l            r20, 24, r26            /* fill data into DST */
507         add             r5, r26, r5
508         or              ZERO, ZERO, r26
509         mshflo.l        r5, r26, r26
510         shlri           r5, 32, r5
511         add             r5, r26, r5             /* Add eventual "carry" */
512
513 .src_err_9:
514         ld.l            r24, 28, r26            /* r26: data to be checksummed*/
515         st.l            r20, 28, r26            /* fill data into DST */
516         add             r5, r26, r5
517         or              ZERO, ZERO, r26
518         mshflo.l        r5, r26, r26
519         shlri           r5, 32, r5
520         add             r5, r26, r5             /* Add eventual "carry" */
521
522         sub             r25, r27, r25
523         add             r24, r27, r24
524         add             r20, r27, r20
525         blink           t0, ZERO
526         
527 .long_footer_gc:
528         movi            4, r27
529         bgt             r27, r25, t2
530         
531         /* Long to be checksummed */
532 .src_err_10:
533         ld.l            r24, 0, r26             /* r26: data to be checksummed*/
534         st.l            r20, 0, r26             /* fill data into DST */
535         add             r5, r26, r5
536         or              ZERO, ZERO, r26
537         mshflo.l        r5, r26, r26
538         shlri           r5, 32, r5
539         add             r5, r26, r5             /* Add eventual "carry" */
540
541         sub             r25, r27, r25
542         add             r24, r27, r24
543         add             r20, r27, r20
544         blink           t3, ZERO
545         
546 .word_footer_gc:
547         movi            2, r27
548         bgt             r27, r25, t1
549
550         /* Short to be checksummed */
551 .src_err_11:
552         ld.uw           r24, 0, r26             /* r26: data to be checksummed*/
553         st.w            r20, 0, r26             /* fill data into DST */
554         add             r5, r26, r5
555         or              ZERO, ZERO, r26
556         mshflo.l        r5, r26, r26
557         shlri           r5, 32, r5
558         add             r5, r26, r5             /* Add eventual "carry" */
559
560         sub             r25, r27, r25
561         add             r24, r27, r24
562         add             r20, r27, r20
563         
564 .byte_footer_gc:
565         beqi            r25, 0, t4
566         /* Short to be checksummed */
567         ld.ub           r24, 0, r26             /* r26: data to be checksummed*/
568 .src_err_12:
569         ld.ub           r24, 0, r26             /* r26: data to be checksummed*/
570         st.b            r20, 0, r26             /* fill data into DST */
571
572 #ifndef __LITTLE_ENDIAN__
573         shlli           r26, 8, r26
574 #endif
575
576         add             r5, r26, r5
577         or              ZERO, ZERO, r26
578         mshflo.l        r5, r26, r26
579         shlri           r5, 32, r5
580         add             r5, r26, r5             /* Add eventual "carry" */
581
582 .exit_gc:
583         or              r5, ZERO, r2
584
585         ptabs           r18, t0
586         blink           t0, ZERO
587
588         .section        .fixup, "ax"
589
590 _csum_partial_copy_generic_dst_err:
591         movi            -(EFAULT), r21          /* r21 = EFAULT reply */
592         ld.l            r7, 0, r21
593
594         /* Quiet exit */
595         or              r5, ZERO, r2
596
597         ptabs           r18, t0
598         blink           t0, ZERO
599
600 _csum_partial_copy_generic_src_err:
601         movi            -(EFAULT), r21          /* r21 = EFAULT reply */
602         ld.l            r6, 0, r21
603
604         /*
605          * Now reset the DST buffer.    
606          * r20 points to the next DST byte.
607          * r3 points to the first DST byte.
608          */
609         _ptar           .quiet_exit, t0
610         _ptar           .src_err_loop, t1
611         beq             r20, r3, t0
612
613 .src_err_loop:
614         addi            r20, -1, r20
615         st.b            r20, 0, ZERO
616         bne             r20, r3, t1
617
618         /* Quiet exit */
619 .quiet_exit:
620         or              r5, ZERO, r2
621
622         ptabs           r18, t0
623         blink           t0, ZERO
624
625         .section        __ex_table, "a"
626
627         .global asm_checksum_start      /* Just a marker */
628 asm_checksum_start:
629         .long   .src_err_1, _csum_partial_copy_generic_src_err
630         .long   .src_err_2, _csum_partial_copy_generic_src_err
631         .long   .src_err_3, _csum_partial_copy_generic_src_err
632         .long   .src_err_4, _csum_partial_copy_generic_src_err
633         .long   .src_err_5, _csum_partial_copy_generic_src_err
634         .long   .src_err_6, _csum_partial_copy_generic_src_err
635         .long   .src_err_7, _csum_partial_copy_generic_src_err
636         .long   .src_err_8, _csum_partial_copy_generic_src_err
637         .long   .src_err_9, _csum_partial_copy_generic_src_err
638         .long   .src_err_10, _csum_partial_copy_generic_src_err
639         .long   .src_err_11, _csum_partial_copy_generic_src_err
640         .long   .src_err_12, _csum_partial_copy_generic_src_err
641         .long   .src_err_1+4, _csum_partial_copy_generic_dst_err
642         .long   .src_err_2+4, _csum_partial_copy_generic_dst_err
643         .long   .src_err_3+4, _csum_partial_copy_generic_dst_err
644         .long   .src_err_4+4, _csum_partial_copy_generic_dst_err
645         .long   .src_err_5+4, _csum_partial_copy_generic_dst_err
646         .long   .src_err_6+4, _csum_partial_copy_generic_dst_err
647         .long   .src_err_7+4, _csum_partial_copy_generic_dst_err
648         .long   .src_err_8+4, _csum_partial_copy_generic_dst_err
649         .long   .src_err_9+4, _csum_partial_copy_generic_dst_err
650         .long   .src_err_10+4, _csum_partial_copy_generic_dst_err
651         .long   .src_err_11+4, _csum_partial_copy_generic_dst_err
652         .long   .src_err_12+4, _csum_partial_copy_generic_dst_err
653
654         .global asm_checksum_end        /* Just a marker */
655 asm_checksum_end:
656 #endif  /* NOTDEF */