These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / arch / powerpc / kernel / misc_64.S
1 /*
2  * This file contains miscellaneous low-level functions.
3  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
4  *
5  * Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
6  * and Paul Mackerras.
7  * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com)
8  * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com)
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version
13  * 2 of the License, or (at your option) any later version.
14  *
15  */
16
17 #include <linux/sys.h>
18 #include <asm/unistd.h>
19 #include <asm/errno.h>
20 #include <asm/processor.h>
21 #include <asm/page.h>
22 #include <asm/cache.h>
23 #include <asm/ppc_asm.h>
24 #include <asm/asm-offsets.h>
25 #include <asm/cputable.h>
26 #include <asm/thread_info.h>
27 #include <asm/kexec.h>
28 #include <asm/ptrace.h>
29 #include <asm/mmu.h>
30
31         .text
32
33 #ifndef CONFIG_PREEMPT_RT_FULL
34 _GLOBAL(call_do_softirq)
35         mflr    r0
36         std     r0,16(r1)
37         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
38         mr      r1,r3
39         bl      __do_softirq
40         ld      r1,0(r1)
41         ld      r0,16(r1)
42         mtlr    r0
43         blr
44 #endif
45
46 _GLOBAL(call_do_irq)
47         mflr    r0
48         std     r0,16(r1)
49         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4)
50         mr      r1,r4
51         bl      __do_irq
52         ld      r1,0(r1)
53         ld      r0,16(r1)
54         mtlr    r0
55         blr
56
57         .section        ".toc","aw"
58 PPC64_CACHES:
59         .tc             ppc64_caches[TC],ppc64_caches
60         .section        ".text"
61
62 /*
63  * Write any modified data cache blocks out to memory
64  * and invalidate the corresponding instruction cache blocks.
65  *
66  * flush_icache_range(unsigned long start, unsigned long stop)
67  *
68  *   flush all bytes from start through stop-1 inclusive
69  */
70
71 _KPROBE(flush_icache_range)
72 BEGIN_FTR_SECTION
73         PURGE_PREFETCHED_INS
74         blr
75 END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
76 /*
77  * Flush the data cache to memory 
78  * 
79  * Different systems have different cache line sizes
80  * and in some cases i-cache and d-cache line sizes differ from
81  * each other.
82  */
83         ld      r10,PPC64_CACHES@toc(r2)
84         lwz     r7,DCACHEL1LINESIZE(r10)/* Get cache line size */
85         addi    r5,r7,-1
86         andc    r6,r3,r5                /* round low to line bdy */
87         subf    r8,r6,r4                /* compute length */
88         add     r8,r8,r5                /* ensure we get enough */
89         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of cache line size */
90         srw.    r8,r8,r9                /* compute line count */
91         beqlr                           /* nothing to do? */
92         mtctr   r8
93 1:      dcbst   0,r6
94         add     r6,r6,r7
95         bdnz    1b
96         sync
97
98 /* Now invalidate the instruction cache */
99         
100         lwz     r7,ICACHEL1LINESIZE(r10)        /* Get Icache line size */
101         addi    r5,r7,-1
102         andc    r6,r3,r5                /* round low to line bdy */
103         subf    r8,r6,r4                /* compute length */
104         add     r8,r8,r5
105         lwz     r9,ICACHEL1LOGLINESIZE(r10)     /* Get log-2 of Icache line size */
106         srw.    r8,r8,r9                /* compute line count */
107         beqlr                           /* nothing to do? */
108         mtctr   r8
109 2:      icbi    0,r6
110         add     r6,r6,r7
111         bdnz    2b
112         isync
113         blr
114         .previous .text
115 /*
116  * Like above, but only do the D-cache.
117  *
118  * flush_dcache_range(unsigned long start, unsigned long stop)
119  *
120  *    flush all bytes from start to stop-1 inclusive
121  */
122 _GLOBAL(flush_dcache_range)
123
124 /*
125  * Flush the data cache to memory 
126  * 
127  * Different systems have different cache line sizes
128  */
129         ld      r10,PPC64_CACHES@toc(r2)
130         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
131         addi    r5,r7,-1
132         andc    r6,r3,r5                /* round low to line bdy */
133         subf    r8,r6,r4                /* compute length */
134         add     r8,r8,r5                /* ensure we get enough */
135         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of dcache line size */
136         srw.    r8,r8,r9                /* compute line count */
137         beqlr                           /* nothing to do? */
138         mtctr   r8
139 0:      dcbst   0,r6
140         add     r6,r6,r7
141         bdnz    0b
142         sync
143         blr
144
145 /*
146  * Like above, but works on non-mapped physical addresses.
147  * Use only for non-LPAR setups ! It also assumes real mode
148  * is cacheable. Used for flushing out the DART before using
149  * it as uncacheable memory 
150  *
151  * flush_dcache_phys_range(unsigned long start, unsigned long stop)
152  *
153  *    flush all bytes from start to stop-1 inclusive
154  */
155 _GLOBAL(flush_dcache_phys_range)
156         ld      r10,PPC64_CACHES@toc(r2)
157         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
158         addi    r5,r7,-1
159         andc    r6,r3,r5                /* round low to line bdy */
160         subf    r8,r6,r4                /* compute length */
161         add     r8,r8,r5                /* ensure we get enough */
162         lwz     r9,DCACHEL1LOGLINESIZE(r10)     /* Get log-2 of dcache line size */
163         srw.    r8,r8,r9                /* compute line count */
164         beqlr                           /* nothing to do? */
165         mfmsr   r5                      /* Disable MMU Data Relocation */
166         ori     r0,r5,MSR_DR
167         xori    r0,r0,MSR_DR
168         sync
169         mtmsr   r0
170         sync
171         isync
172         mtctr   r8
173 0:      dcbst   0,r6
174         add     r6,r6,r7
175         bdnz    0b
176         sync
177         isync
178         mtmsr   r5                      /* Re-enable MMU Data Relocation */
179         sync
180         isync
181         blr
182
183 _GLOBAL(flush_inval_dcache_range)
184         ld      r10,PPC64_CACHES@toc(r2)
185         lwz     r7,DCACHEL1LINESIZE(r10)        /* Get dcache line size */
186         addi    r5,r7,-1
187         andc    r6,r3,r5                /* round low to line bdy */
188         subf    r8,r6,r4                /* compute length */
189         add     r8,r8,r5                /* ensure we get enough */
190         lwz     r9,DCACHEL1LOGLINESIZE(r10)/* Get log-2 of dcache line size */
191         srw.    r8,r8,r9                /* compute line count */
192         beqlr                           /* nothing to do? */
193         sync
194         isync
195         mtctr   r8
196 0:      dcbf    0,r6
197         add     r6,r6,r7
198         bdnz    0b
199         sync
200         isync
201         blr
202
203
204 /*
205  * Flush a particular page from the data cache to RAM.
206  * Note: this is necessary because the instruction cache does *not*
207  * snoop from the data cache.
208  *
209  *      void __flush_dcache_icache(void *page)
210  */
211 _GLOBAL(__flush_dcache_icache)
212 /*
213  * Flush the data cache to memory 
214  * 
215  * Different systems have different cache line sizes
216  */
217
218 BEGIN_FTR_SECTION
219         PURGE_PREFETCHED_INS
220         blr
221 END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
222
223 /* Flush the dcache */
224         ld      r7,PPC64_CACHES@toc(r2)
225         clrrdi  r3,r3,PAGE_SHIFT                    /* Page align */
226         lwz     r4,DCACHEL1LINESPERPAGE(r7)     /* Get # dcache lines per page */
227         lwz     r5,DCACHEL1LINESIZE(r7)         /* Get dcache line size */
228         mr      r6,r3
229         mtctr   r4
230 0:      dcbst   0,r6
231         add     r6,r6,r5
232         bdnz    0b
233         sync
234
235 /* Now invalidate the icache */ 
236
237         lwz     r4,ICACHEL1LINESPERPAGE(r7)     /* Get # icache lines per page */
238         lwz     r5,ICACHEL1LINESIZE(r7)         /* Get icache line size */
239         mtctr   r4
240 1:      icbi    0,r3
241         add     r3,r3,r5
242         bdnz    1b
243         isync
244         blr
245
246 _GLOBAL(__bswapdi2)
247         srdi    r8,r3,32
248         rlwinm  r7,r3,8,0xffffffff
249         rlwimi  r7,r3,24,0,7
250         rlwinm  r9,r8,8,0xffffffff
251         rlwimi  r7,r3,24,16,23
252         rlwimi  r9,r8,24,0,7
253         rlwimi  r9,r8,24,16,23
254         sldi    r7,r7,32
255         or      r3,r7,r9
256         blr
257
258
259 #ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
260 _GLOBAL(rmci_on)
261         sync
262         isync
263         li      r3,0x100
264         rldicl  r3,r3,32,0
265         mfspr   r5,SPRN_HID4
266         or      r5,r5,r3
267         sync
268         mtspr   SPRN_HID4,r5
269         isync
270         slbia
271         isync
272         sync
273         blr
274
275 _GLOBAL(rmci_off)
276         sync
277         isync
278         li      r3,0x100
279         rldicl  r3,r3,32,0
280         mfspr   r5,SPRN_HID4
281         andc    r5,r5,r3
282         sync
283         mtspr   SPRN_HID4,r5
284         isync
285         slbia
286         isync
287         sync
288         blr
289 #endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
290
291 #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
292
293 /*
294  * Do an IO access in real mode
295  */
296 _GLOBAL(real_readb)
297         mfmsr   r7
298         ori     r0,r7,MSR_DR
299         xori    r0,r0,MSR_DR
300         sync
301         mtmsrd  r0
302         sync
303         isync
304         mfspr   r6,SPRN_HID4
305         rldicl  r5,r6,32,0
306         ori     r5,r5,0x100
307         rldicl  r5,r5,32,0
308         sync
309         mtspr   SPRN_HID4,r5
310         isync
311         slbia
312         isync
313         lbz     r3,0(r3)
314         sync
315         mtspr   SPRN_HID4,r6
316         isync
317         slbia
318         isync
319         mtmsrd  r7
320         sync
321         isync
322         blr
323
324         /*
325  * Do an IO access in real mode
326  */
327 _GLOBAL(real_writeb)
328         mfmsr   r7
329         ori     r0,r7,MSR_DR
330         xori    r0,r0,MSR_DR
331         sync
332         mtmsrd  r0
333         sync
334         isync
335         mfspr   r6,SPRN_HID4
336         rldicl  r5,r6,32,0
337         ori     r5,r5,0x100
338         rldicl  r5,r5,32,0
339         sync
340         mtspr   SPRN_HID4,r5
341         isync
342         slbia
343         isync
344         stb     r3,0(r4)
345         sync
346         mtspr   SPRN_HID4,r6
347         isync
348         slbia
349         isync
350         mtmsrd  r7
351         sync
352         isync
353         blr
354 #endif /* defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) */
355
356 #ifdef CONFIG_PPC_PASEMI
357
358 _GLOBAL(real_205_readb)
359         mfmsr   r7
360         ori     r0,r7,MSR_DR
361         xori    r0,r0,MSR_DR
362         sync
363         mtmsrd  r0
364         sync
365         isync
366         LBZCIX(R3,R0,R3)
367         isync
368         mtmsrd  r7
369         sync
370         isync
371         blr
372
373 _GLOBAL(real_205_writeb)
374         mfmsr   r7
375         ori     r0,r7,MSR_DR
376         xori    r0,r0,MSR_DR
377         sync
378         mtmsrd  r0
379         sync
380         isync
381         STBCIX(R3,R0,R4)
382         isync
383         mtmsrd  r7
384         sync
385         isync
386         blr
387
388 #endif /* CONFIG_PPC_PASEMI */
389
390
391 #if defined(CONFIG_CPU_FREQ_PMAC64) || defined(CONFIG_CPU_FREQ_MAPLE)
392 /*
393  * SCOM access functions for 970 (FX only for now)
394  *
395  * unsigned long scom970_read(unsigned int address);
396  * void scom970_write(unsigned int address, unsigned long value);
397  *
398  * The address passed in is the 24 bits register address. This code
399  * is 970 specific and will not check the status bits, so you should
400  * know what you are doing.
401  */
402 _GLOBAL(scom970_read)
403         /* interrupts off */
404         mfmsr   r4
405         ori     r0,r4,MSR_EE
406         xori    r0,r0,MSR_EE
407         mtmsrd  r0,1
408
409         /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
410          * (including parity). On current CPUs they must be 0'd,
411          * and finally or in RW bit
412          */
413         rlwinm  r3,r3,8,0,15
414         ori     r3,r3,0x8000
415
416         /* do the actual scom read */
417         sync
418         mtspr   SPRN_SCOMC,r3
419         isync
420         mfspr   r3,SPRN_SCOMD
421         isync
422         mfspr   r0,SPRN_SCOMC
423         isync
424
425         /* XXX: fixup result on some buggy 970's (ouch ! we lost a bit, bah
426          * that's the best we can do). Not implemented yet as we don't use
427          * the scom on any of the bogus CPUs yet, but may have to be done
428          * ultimately
429          */
430
431         /* restore interrupts */
432         mtmsrd  r4,1
433         blr
434
435
436 _GLOBAL(scom970_write)
437         /* interrupts off */
438         mfmsr   r5
439         ori     r0,r5,MSR_EE
440         xori    r0,r0,MSR_EE
441         mtmsrd  r0,1
442
443         /* rotate 24 bits SCOM address 8 bits left and mask out it's low 8 bits
444          * (including parity). On current CPUs they must be 0'd.
445          */
446
447         rlwinm  r3,r3,8,0,15
448
449         sync
450         mtspr   SPRN_SCOMD,r4      /* write data */
451         isync
452         mtspr   SPRN_SCOMC,r3      /* write command */
453         isync
454         mfspr   3,SPRN_SCOMC
455         isync
456
457         /* restore interrupts */
458         mtmsrd  r5,1
459         blr
460 #endif /* CONFIG_CPU_FREQ_PMAC64 || CONFIG_CPU_FREQ_MAPLE */
461
462 /* kexec_wait(phys_cpu)
463  *
464  * wait for the flag to change, indicating this kernel is going away but
465  * the slave code for the next one is at addresses 0 to 100.
466  *
467  * This is used by all slaves, even those that did not find a matching
468  * paca in the secondary startup code.
469  *
470  * Physical (hardware) cpu id should be in r3.
471  */
472 _GLOBAL(kexec_wait)
473         bl      1f
474 1:      mflr    r5
475         addi    r5,r5,kexec_flag-1b
476
477 99:     HMT_LOW
478 #ifdef CONFIG_KEXEC             /* use no memory without kexec */
479         lwz     r4,0(r5)
480         cmpwi   0,r4,0
481         beq     99b
482 #ifdef CONFIG_PPC_BOOK3S_64
483         li      r10,0x60
484         mfmsr   r11
485         clrrdi  r11,r11,1       /* Clear MSR_LE */
486         mtsrr0  r10
487         mtsrr1  r11
488         rfid
489 #else
490         /* Create TLB entry in book3e_secondary_core_init */
491         li      r4,0
492         ba      0x60
493 #endif
494 #endif
495
496 /* this can be in text because we won't change it until we are
497  * running in real anyways
498  */
499 kexec_flag:
500         .long   0
501
502
503 #ifdef CONFIG_KEXEC
504 #ifdef CONFIG_PPC_BOOK3E
505 /*
506  * BOOK3E has no real MMU mode, so we have to setup the initial TLB
507  * for a core to identity map v:0 to p:0.  This current implementation
508  * assumes that 1G is enough for kexec.
509  */
510 kexec_create_tlb:
511         /*
512          * Invalidate all non-IPROT TLB entries to avoid any TLB conflict.
513          * IPROT TLB entries should be >= PAGE_OFFSET and thus not conflict.
514          */
515         PPC_TLBILX_ALL(0,R0)
516         sync
517         isync
518
519         mfspr   r10,SPRN_TLB1CFG
520         andi.   r10,r10,TLBnCFG_N_ENTRY /* Extract # entries */
521         subi    r10,r10,1       /* Last entry: no conflict with kernel text */
522         lis     r9,MAS0_TLBSEL(1)@h
523         rlwimi  r9,r10,16,4,15          /* Setup MAS0 = TLBSEL | ESEL(r9) */
524
525 /* Set up a temp identity mapping v:0 to p:0 and return to it. */
526 #if defined(CONFIG_SMP) || defined(CONFIG_PPC_E500MC)
527 #define M_IF_NEEDED     MAS2_M
528 #else
529 #define M_IF_NEEDED     0
530 #endif
531         mtspr   SPRN_MAS0,r9
532
533         lis     r9,(MAS1_VALID|MAS1_IPROT)@h
534         ori     r9,r9,(MAS1_TSIZE(BOOK3E_PAGESZ_1GB))@l
535         mtspr   SPRN_MAS1,r9
536
537         LOAD_REG_IMMEDIATE(r9, 0x0 | M_IF_NEEDED)
538         mtspr   SPRN_MAS2,r9
539
540         LOAD_REG_IMMEDIATE(r9, 0x0 | MAS3_SR | MAS3_SW | MAS3_SX)
541         mtspr   SPRN_MAS3,r9
542         li      r9,0
543         mtspr   SPRN_MAS7,r9
544
545         tlbwe
546         isync
547         blr
548 #endif
549
550 /* kexec_smp_wait(void)
551  *
552  * call with interrupts off
553  * note: this is a terminal routine, it does not save lr
554  *
555  * get phys id from paca
556  * switch to real mode
557  * mark the paca as no longer used
558  * join other cpus in kexec_wait(phys_id)
559  */
560 _GLOBAL(kexec_smp_wait)
561         lhz     r3,PACAHWCPUID(r13)
562         bl      real_mode
563
564         li      r4,KEXEC_STATE_REAL_MODE
565         stb     r4,PACAKEXECSTATE(r13)
566         SYNC
567
568         b       kexec_wait
569
570 /*
571  * switch to real mode (turn mmu off)
572  * we use the early kernel trick that the hardware ignores bits
573  * 0 and 1 (big endian) of the effective address in real mode
574  *
575  * don't overwrite r3 here, it is live for kexec_wait above.
576  */
577 real_mode:      /* assume normal blr return */
578 #ifdef CONFIG_PPC_BOOK3E
579         /* Create an identity mapping. */
580         b       kexec_create_tlb
581 #else
582 1:      li      r9,MSR_RI
583         li      r10,MSR_DR|MSR_IR
584         mflr    r11             /* return address to SRR0 */
585         mfmsr   r12
586         andc    r9,r12,r9
587         andc    r10,r12,r10
588
589         mtmsrd  r9,1
590         mtspr   SPRN_SRR1,r10
591         mtspr   SPRN_SRR0,r11
592         rfid
593 #endif
594
595 /*
596  * kexec_sequence(newstack, start, image, control, clear_all())
597  *
598  * does the grungy work with stack switching and real mode switches
599  * also does simple calls to other code
600  */
601
602 _GLOBAL(kexec_sequence)
603         mflr    r0
604         std     r0,16(r1)
605
606         /* switch stacks to newstack -- &kexec_stack.stack */
607         stdu    r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
608         mr      r1,r3
609
610         li      r0,0
611         std     r0,16(r1)
612
613         /* save regs for local vars on new stack.
614          * yes, we won't go back, but ...
615          */
616         std     r31,-8(r1)
617         std     r30,-16(r1)
618         std     r29,-24(r1)
619         std     r28,-32(r1)
620         std     r27,-40(r1)
621         std     r26,-48(r1)
622         std     r25,-56(r1)
623
624         stdu    r1,-STACK_FRAME_OVERHEAD-64(r1)
625
626         /* save args into preserved regs */
627         mr      r31,r3                  /* newstack (both) */
628         mr      r30,r4                  /* start (real) */
629         mr      r29,r5                  /* image (virt) */
630         mr      r28,r6                  /* control, unused */
631         mr      r27,r7                  /* clear_all() fn desc */
632         mr      r26,r8                  /* spare */
633         lhz     r25,PACAHWCPUID(r13)    /* get our phys cpu from paca */
634
635         /* disable interrupts, we are overwriting kernel data next */
636 #ifdef CONFIG_PPC_BOOK3E
637         wrteei  0
638 #else
639         mfmsr   r3
640         rlwinm  r3,r3,0,17,15
641         mtmsrd  r3,1
642 #endif
643
644         /* copy dest pages, flush whole dest image */
645         mr      r3,r29
646         bl      kexec_copy_flush        /* (image) */
647
648         /* turn off mmu */
649         bl      real_mode
650
651         /* copy  0x100 bytes starting at start to 0 */
652         li      r3,0
653         mr      r4,r30          /* start, aka phys mem offset */
654         li      r5,0x100
655         li      r6,0
656         bl      copy_and_flush  /* (dest, src, copy limit, start offset) */
657 1:      /* assume normal blr return */
658
659         /* release other cpus to the new kernel secondary start at 0x60 */
660         mflr    r5
661         li      r6,1
662         stw     r6,kexec_flag-1b(5)
663
664 #ifndef CONFIG_PPC_BOOK3E
665         /* clear out hardware hash page table and tlb */
666 #if !defined(_CALL_ELF) || _CALL_ELF != 2
667         ld      r12,0(r27)              /* deref function descriptor */
668 #else
669         mr      r12,r27
670 #endif
671         mtctr   r12
672         bctrl                           /* ppc_md.hpte_clear_all(void); */
673 #endif /* !CONFIG_PPC_BOOK3E */
674
675 /*
676  *   kexec image calling is:
677  *      the first 0x100 bytes of the entry point are copied to 0
678  *
679  *      all slaves branch to slave = 0x60 (absolute)
680  *              slave(phys_cpu_id);
681  *
682  *      master goes to start = entry point
683  *              start(phys_cpu_id, start, 0);
684  *
685  *
686  *   a wrapper is needed to call existing kernels, here is an approximate
687  *   description of one method:
688  *
689  * v2: (2.6.10)
690  *   start will be near the boot_block (maybe 0x100 bytes before it?)
691  *   it will have a 0x60, which will b to boot_block, where it will wait
692  *   and 0 will store phys into struct boot-block and load r3 from there,
693  *   copy kernel 0-0x100 and tell slaves to back down to 0x60 again
694  *
695  * v1: (2.6.9)
696  *    boot block will have all cpus scanning device tree to see if they
697  *    are the boot cpu ?????
698  *    other device tree differences (prop sizes, va vs pa, etc)...
699  */
700         mr      r3,r25  # my phys cpu
701         mr      r4,r30  # start, aka phys mem offset
702         mtlr    4
703         li      r5,0
704         blr     /* image->start(physid, image->start, 0); */
705 #endif /* CONFIG_KEXEC */
706
707 #ifdef CONFIG_MODULES
708 #if defined(_CALL_ELF) && _CALL_ELF == 2
709
710 #ifdef CONFIG_MODVERSIONS
711 .weak __crc_TOC.
712 .section "___kcrctab+TOC.","a"
713 .globl __kcrctab_TOC.
714 __kcrctab_TOC.:
715         .llong  __crc_TOC.
716 #endif
717
718 /*
719  * Export a fake .TOC. since both modpost and depmod will complain otherwise.
720  * Both modpost and depmod strip the leading . so we do the same here.
721  */
722 .section "__ksymtab_strings","a"
723 __kstrtab_TOC.:
724         .asciz "TOC."
725
726 .section "___ksymtab+TOC.","a"
727 /* This symbol name is important: it's used by modpost to find exported syms */
728 .globl __ksymtab_TOC.
729 __ksymtab_TOC.:
730         .llong 0 /* .value */
731         .llong __kstrtab_TOC.
732 #endif /* ELFv2 */
733 #endif /* MODULES */