Merge with Linux 2.3.99-pre4.
[linux-2.6/linux-mips.git] / arch / arm / mm / proc-sa110.S
blob13c1f2773e485471d86a3774e2b7d976e8f2c2d7
1 /*
2  * linux/arch/arm/mm/proc-sa110.S: MMU functions for SA110
3  *
4  * (C) 1997-2000 Russell King
5  *
6  * These are the low level assembler for performing cache and TLB
7  * functions on the StrongARM-110 and StrongARM-1100
8  */
9 #include <linux/linkage.h>
10 #include <asm/assembler.h>
11 #include <asm/procinfo.h>
12 #include <asm/hardware.h>
13 #include "../lib/constants.h"
15 /* This is the maximum size of an area which will be flushed.  If the area
16  * is larger than this, then we flush the whole cache
17  */
18 #define MAX_AREA_SIZE   32768
19 #define FLUSH_OFFSET    32768
21                 .macro flush_110_dcache rd, ra, re
22                 add     \re, \ra, #16384                @ only necessary for 16k
23 1001:           ldr     \rd, [\ra], #32
24                 teq     \re, \ra
25                 bne     1001b
26                 .endm
28                 .macro flush_1100_dcache        rd, ra, re
29                 add     \re, \ra, #8192                 @ only necessary for 8k
30 1001:           ldr     \rd, [\ra], #32
31                 teq     \re, \ra
32                 bne     1001b
33 #ifdef FLUSH_BASE_MINICACHE
34                 add     \ra, \ra, #FLUSH_BASE_MINICACHE - FLUSH_BASE
35                 add     \re, \ra, #512                  @ only 512 bytes
36 1002:           ldr     \rd, [\ra], #32
37                 teq     \re, \ra
38                 bne     1002b
39 #endif
40                 .endm
42                 .data
43 Lclean_switch:  .long   0
44                 .text
47  * Function: sa110_flush_cache_all (void)
48  * Purpose : Flush all cache lines
49  */
50                 .align  5
51 ENTRY(cpu_sa110_flush_cache_all)                        @ preserves r0
52                 mov     r2, #1
53 cpu_sa110_flush_cache_all_r2:
54                 ldr     r3, =Lclean_switch
55                 ldr     ip, =FLUSH_BASE
56                 ldr     r1, [r3]
57                 ands    r1, r1, #1
58                 eor     r1, r1, #1
59                 str     r1, [r3]
60                 addne   ip, ip, #FLUSH_OFFSET
61                 flush_110_dcache        r3, ip, r1
62                 mov     ip, #0
63                 teq     r2, #0
64                 mcrne   p15, 0, ip, c7, c5, 0           @ flush I cache
65                 mcr     p15, 0, ip, c7, c10, 4          @ drain WB
66                 mov     pc, lr
68                 .align  5
69 ENTRY(cpu_sa1100_flush_cache_all)                       @ preserves r0
70                 mov     r2, #1
71 cpu_sa1100_flush_cache_all_r2:
72                 ldr     r3, =Lclean_switch
73                 ldr     ip, =FLUSH_BASE
74                 ldr     r1, [r3]
75                 ands    r1, r1, #1
76                 eor     r1, r1, #1
77                 str     r1, [r3]
78                 addne   ip, ip, #FLUSH_OFFSET
79                 flush_1100_dcache       r3, ip, r1
80                 mov     ip, #0
81                 teq     r2, #0
82                 mcrne   p15, 0, ip, c7, c5, 0           @ flush I cache
83                 mcr     p15, 0, ip, c7, c10, 4          @ drain WB
84                 mov     pc, lr
87  * Function: sa110_flush_cache_area (unsigned long address, int end, int flags)
88  * Params  : address    Area start address
89  *         : end        Area end address
90  *         : flags      b0 = I cache as well
91  * Purpose : clean & flush all cache lines associated with this area of memory
92  */
93                 .align  5
94 ENTRY(cpu_sa110_flush_cache_area)
95                 sub     r3, r1, r0
96                 cmp     r3, #MAX_AREA_SIZE
97                 bgt     cpu_sa110_flush_cache_all_r2
98 1:              mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
99                 mcr     p15, 0, r0, c7, c6, 1           @ flush D entry
100                 add     r0, r0, #32
101                 mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
102                 mcr     p15, 0, r0, c7, c6, 1           @ flush D entry
103                 add     r0, r0, #32
104                 cmp     r0, r1
105                 blt     1b
106                 teq     r2, #0
107                 movne   r0, #0
108                 mcrne   p15, 0, r0, c7, c5, 0           @ flush I cache
109                 mov     pc, lr
111 ENTRY(cpu_sa1100_flush_cache_area)
112                 sub     r3, r1, r0
113                 cmp     r3, #MAX_AREA_SIZE
114                 bgt     cpu_sa1100_flush_cache_all_r2
115                 b       1b
118  * Function: sa110_cache_wback_area(unsigned long address, unsigned long end)
119  * Params  : address    Area start address
120  *         : end        Area end address
121  * Purpose : ensure all dirty cachelines in the specified area have been
122  *           written out to memory (for DMA)
123  */
124                 .align  5
125 ENTRY(cpu_sa110_cache_wback_area)
126                 sub     r3, r1, r0
127                 cmp     r3, #MAX_AREA_SIZE
128                 mov     r2, #0
129                 bgt     cpu_sa110_flush_cache_all_r2
130                 bic     r0, r0, #31
131 1:              mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
132                 add     r0, r0, #32
133                 mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
134                 add     r0, r0, #32
135                 cmp     r0, r1
136                 blt     1b
137                 mcr     p15, 0, r2, c7, c10, 4          @ drain WB
138                 mov     pc, lr
140 ENTRY(cpu_sa1100_cache_wback_area)
141                 sub     r3, r1, r0
142                 cmp     r3, #MAX_AREA_SIZE
143                 mov     r2, #0
144                 bgt     cpu_sa1100_flush_cache_all_r2
145                 bic     r0, r0, #31
146                 b       1b
148  * Function: sa110_cache_purge_area(unsigned long address, unsigned long end)
149  * Params  : address    Area start address
150  *         : end        Area end address
151  * Purpose : throw away all D-cached data in specified region without
152  *           an obligation to write it back.
153  * Note    : Must clean the D-cached entries around the boundaries if the
154  *           start and/or end address are not cache aligned.
155  */
156                 .align  5
157 ENTRY(cpu_sa110_cache_purge_area)
158 ENTRY(cpu_sa1100_cache_purge_area)
159                 tst     r0, #31
160                 bic     r0, r0, #31
161                 mcrne   p15, 0, r0, c7, c10, 1          @ clean D entry
162                 tst     r1, #31
163                 mcrne   p15, 0, r1, c7, c10, 1          @ clean D entry
164 1:              mcr     p15, 0, r0, c7, c6, 1           @ flush D entry
165                 add     r0, r0, #32
166                 cmp     r0, r1
167                 blt     1b
168                 mov     pc, lr
171  * Function: sa110_flush_cache_entry (unsigned long address)
172  * Params  : address    Address of cache line to flush
173  * Purpose : clean & flush an entry
174  */
175                 .align  5
176 ENTRY(cpu_sa110_flush_cache_entry)
177 ENTRY(cpu_sa1100_flush_cache_entry)
178                 mov     r1, #0
179                 mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
180                 mcr     p15, 0, r1, c7, c10, 4          @ drain WB
181                 mcr     p15, 0, r1, c7, c5, 0           @ flush I cache
182                 mov     pc, lr
185  * Function: sa110_clean_cache_area(unsigned long start, unsigned long size)
186  * Params  : address    Address of cache line to clean
187  * Purpose : Ensure that physical memory reflects cache at this location
188  *           for page table purposes.
189  */
190 ENTRY(cpu_sa110_clean_cache_area)
191 ENTRY(cpu_sa1100_clean_cache_area)
192 1:              mcr     p15, 0, r0, c7, c10, 1          @ clean D entry  (drain is done by TLB fns)
193                 add     r0, r0, #32
194                 subs    r1, r1, #32
195                 bhi     1b
196                 mov     pc, lr
199  * Function: sa110_flush_ram_page (unsigned long page)
200  * Params  : page       Area start address
201  * Purpose : clean all cache lines associated with this area of memory
202  */
203                 .align  5
204 ENTRY(cpu_sa110_flush_ram_page)
205 ENTRY(cpu_sa1100_flush_ram_page)
206                 mov     r1, #4096
207 1:              mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
208                 add     r0, r0, #32
209                 mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
210                 add     r0, r0, #32
211                 mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
212                 add     r0, r0, #32
213                 mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
214                 add     r0, r0, #32
215                 subs    r1, r1, #128
216                 bne     1b
217                 mov     r0, #0
218                 mcr     p15, 0, r0, c7, c10, 4          @ drain WB
219                 mov     pc, lr
222  * Function: sa110_flush_tlb_all (void)
223  * Purpose : flush all TLB entries in all caches
224  */
225                 .align  5
226 ENTRY(cpu_sa110_flush_tlb_all)
227 ENTRY(cpu_sa1100_flush_tlb_all)
228                 mov     ip, #0
229                 mcr     p15, 0, ip, c7, c10, 4          @ drain WB
230                 mcr     p15, 0, ip, c8, c7, 0           @ flush I & D tlbs
231                 mov     pc, lr
234  * Function: sa110_flush_tlb_area (unsigned long address, unsigned long end, int flags)
235  * Params  : address    Area start address
236  *         : end        Area end address
237  *         : flags      b0 = I-TLB as well
238  * Purpose : flush a TLB entry
239  */
240                 .align  5
241 ENTRY(cpu_sa110_flush_tlb_area)
242 ENTRY(cpu_sa1100_flush_tlb_area)
243                 mov     r3, #0
244                 mcr     p15, 0, r3, c7, c10, 4          @ drain WB
245 1:              cmp     r0, r1
246                 mcrlt   p15, 0, r0, c8, c6, 1           @ flush D TLB entry
247                 addlt   r0, r0, #4096
248                 cmp     r0, r1
249                 mcrlt   p15, 0, r0, c8, c6, 1           @ flush D TLB entry
250                 addlt   r0, r0, #4096
251                 blt     1b
252                 teq     r2, #0
253                 mcrne   p15, 0, r3, c8, c5, 0           @ flush I TLB
254                 mov     pc, lr
257  * Function: sa110_flush_tlb_page (unsigned long address, int flags)
258  * Params  : address    Address to flush
259  *         : flags      b0 = I-TLB as well
260  * Purpose : flush a TLB entry
261  */
262                 .align  5
263 ENTRY(cpu_sa110_flush_tlb_page)
264 ENTRY(cpu_sa1100_flush_tlb_page)
265                 mov     r3, #0
266                 mcr     p15, 0, r3, c7, c10, 4          @ drain WB
267                 mcr     p15, 0, r0, c8, c6, 1           @ flush D TLB entry
268                 teq     r1, #0
269                 mcrne   p15, 0, r3, c8, c5, 0           @ flush I TLB
270                 mov     pc, lr
273  * Function: sa110_flush_icache_area (unsigned long address, unsigned long size)
274  * Params  : address    Address of area to flush
275  *         : size       Size of area to flush
276  * Purpose : flush an area from the Icache
277  */
278                 .align  5
279 ENTRY(cpu_sa110_flush_icache_area)
280 ENTRY(cpu_sa1100_flush_icache_area)
281 1:              mcr     p15, 0, r0, c7, c10, 1          @ Clean D entry
282                 add     r0, r0, #32
283                 subs    r1, r1, #32
284                 bhi     1b
285                 mov     r0, #0
286                 mcr     p15, 0, r0, c7, c10, 4          @ drain WB
287                 mcr     p15, 0, r0, c7, c5, 0           @ flush I cache
288                 mov     pc, lr
290                 .align  5
291 ENTRY(cpu_sa110_flush_icache_page)
292 ENTRY(cpu_sa1100_flush_icache_page)
293                 mcr     p15, 0, r0, c7, c5, 0           @ flush I cache
294                 mov     pc, lr
297  * Function: sa110_data_abort ()
298  * Params  : r0 = address of aborted instruction
299  * Purpose : obtain information about current aborted instruction
300  * Returns : r0 = address of abort
301  *         : r1 = FSR
302  *         : r2 != 0 if writing
303  */
304                 .align  5
305 ENTRY(cpu_sa110_data_abort)
306 ENTRY(cpu_sa1100_data_abort)
307                 ldr     r2, [r0]                        @ read instruction causing problem
308                 mrc     p15, 0, r0, c6, c0, 0           @ get FAR
309                 mov     r2, r2, lsr #19                 @ b1 = L
310                 and     r3, r2, #0x69 << 2
311                 and     r2, r2, #2
312                 mrc     p15, 0, r1, c5, c0, 0           @ get FSR
313                 and     r1, r1, #255
314                 mov     pc, lr
316                 .align  5
318  * Function: sa110_set_pgd(unsigned long pgd_phys)
319  * Params  : pgd_phys   Physical address of page table
320  * Purpose : Perform a task switch, saving the old processes state, and restoring
321  *           the new.
322  */
323                 .align  5
324 ENTRY(cpu_sa110_set_pgd)
325                 ldr     r3, =Lclean_switch
326                 ldr     ip, =FLUSH_BASE
327                 ldr     r2, [r3]
328                 ands    r2, r2, #1
329                 eor     r2, r2, #1
330                 str     r2, [r3]
331                 addne   ip, ip, #FLUSH_OFFSET
332                 flush_110_dcache        r3, ip, r1
333                 mov     r1, #0
334                 mcr     p15, 0, r1, c7, c5, 0           @ flush I cache
335                 mcr     p15, 0, r1, c7, c10, 4          @ drain WB
336                 mcr     p15, 0, r0, c2, c0, 0           @ load page table pointer
337                 mcr     p15, 0, r1, c8, c7, 0           @ flush TLBs
338                 mov     pc, lr
340                 .align  5
341 ENTRY(cpu_sa1100_set_pgd)
342                 ldr     r3, =Lclean_switch
343                 ldr     ip, =FLUSH_BASE
344                 ldr     r2, [r3]
345                 ands    r2, r2, #1
346                 eor     r2, r2, #1
347                 str     r2, [r3]
348                 addne   ip, ip, #FLUSH_OFFSET
349                 flush_1100_dcache       r3, ip, r1
350                 mov     r1, #0
351                 mcr     p15, 0, r1, c7, c5, 0           @ flush I cache
352                 mcr     p15, 0, r1, c7, c10, 4          @ drain WB
353                 mcr     p15, 0, r0, c2, c0, 0           @ load page table pointer
354                 mcr     p15, 0, r1, c8, c7, 0           @ flush TLBs
355                 mov     pc, lr
358  * Function: sa110_set_pmd(pmd_t *pmdp, pmd_t pmd)
359  * Params  : r0 = Address to set
360  *         : r1 = value to set
361  * Purpose : Set a PMD and flush it out
362  */
363                 .align  5
364 ENTRY(cpu_sa110_set_pmd)
365 ENTRY(cpu_sa1100_set_pmd)
366                 str     r1, [r0]
367                 mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
368                 mcr     p15, 0, r0, c7, c10, 4          @ drain WB
369                 mov     pc, lr
372  * Function: sa110_set_pte(pte_t *ptep, pte_t pte)
373  * Params  : r0 = Address to set
374  *         : r1 = value to set
375  * Purpose : Set a PTE and flush it out
376  */
377                 .align  5
378 ENTRY(cpu_sa110_set_pte)
379 ENTRY(cpu_sa1100_set_pte)
380                 str     r1, [r0], #-1024                @ linux version
382                 eor     r1, r1, #LPTE_PRESENT | LPTE_YOUNG | LPTE_WRITE | LPTE_DIRTY
384                 bic     r2, r1, #0xff0
385                 bic     r2, r2, #3
386                 orr     r2, r2, #HPTE_TYPE_SMALL
388                 tst     r1, #LPTE_USER | LPTE_EXEC      @ User or Exec?
389                 orrne   r2, r2, #HPTE_AP_READ
391                 tst     r1, #LPTE_WRITE | LPTE_DIRTY    @ Write and Dirty?
392                 orreq   r2, r2, #HPTE_AP_WRITE
394                 tst     r1, #LPTE_PRESENT | LPTE_YOUNG  @ Present and Young?
395                 movne   r2, #0
397                 str     r2, [r0]                        @ hardware version
398                 mov     r0, r0
399                 mcr     p15, 0, r0, c7, c10, 1          @ clean D entry
400                 mcr     p15, 0, r0, c7, c10, 4          @ drain WB
401                 mov     pc, lr
404  * Function: sa110_check_bugs (void)
405  *         : sa110_proc_init (void)
406  *         : sa110_proc_fin (void)
407  * Notes   : This processor does not require these
408  */
409 ENTRY(cpu_sa110_check_bugs)
410 ENTRY(cpu_sa1100_check_bugs)
411                 mrs     ip, cpsr
412                 bic     ip, ip, #F_BIT
413                 msr     cpsr, ip
414                 mov     pc, lr
416 ENTRY(cpu_sa110_proc_init)
417 ENTRY(cpu_sa1100_proc_init)
418                 mov     r0, #0
419                 mcr     p15, 0, r0, c15, c1, 2          @ Enable clock switching
420                 mov     pc, lr
422 ENTRY(cpu_sa110_proc_fin)
423 ENTRY(cpu_sa1100_proc_fin)
424                 stmfd   sp!, {r1, lr}
425                 mrs     r0, cpsr
426                 orr     r0, r0, #F_BIT | I_BIT
427                 msr     cpsr, r0
428                 bl      cpu_sa110_flush_cache_all       @ clean caches
429                 mov     r0, #0
430                 mcr     p15, 0, r0, c15, c2, 2          @ Disable clock switching
431                 mrc     p15, 0, r0, c1, c0, 0
432                 bic     r0, r0, #0x1000                 @ ...i............
433                 bic     r0, r0, #0x000e                 @ ............wca.
434                 mcr     p15, 0, r0, c1, c0, 0           @ disable caches
435                 ldmfd   sp!, {r1, pc}
437                 .align  5
438 idle:           mcr     p15, 0, r0, c15, c8, 2          @ Wait for interrupt
439                 mov     r0, r0                          @ safety
440                 mov     pc, lr
442  * Function: *_do_idle
443  * Params  : r0 = call type:
444  *           0 = slow idle
445  *           1 = fast idle
446  *           2 = switch to slow processor clock
447  *           3 = switch to fast processor clock
448  */
449 ENTRY(cpu_sa110_do_idle)
450 ENTRY(cpu_sa1100_do_idle)
451                 mov     ip, #0
452                 cmp     r0, #4
453                 addcc   pc, pc, r0, lsl #2
454                 mov     pc, lr
456                 b       idle
457                 b       idle
458                 b       slow_clock
459                 b       fast_clock
461 fast_clock:     mcr     p15, 0, ip, c15, c1, 2          @ enable clock switching
462                 mov     pc, lr
464 slow_clock:     mcr     p15, 0, ip, c15, c2, 2          @ disable clock switching
465                 ldr     r1, =UNCACHEABLE_ADDR           @ load from uncacheable loc
466                 ldr     r1, [r1, #0]                    @ force switch to MCLK
467                 mov     pc, lr
470  * Function: sa110_reset
471  * Params  : r0 = address to jump to
472  * Notes   : This sets up everything for a reset
473  */
474                 .align  5
475 ENTRY(cpu_sa110_reset)
476 ENTRY(cpu_sa1100_reset)
477                 mov     ip, #0
478                 mcr     p15, 0, ip, c7, c7, 0           @ flush I,D caches
479                 mcr     p15, 0, ip, c7, c10, 4          @ drain WB
480                 mcr     p15, 0, ip, c8, c7, 0           @ flush I & D tlbs
481                 mrc     p15, 0, ip, c1, c0, 0           @ ctrl register
482                 bic     ip, ip, #0x000f                 @ ............wcam
483                 bic     ip, ip, #0x1100                 @ ...i...s........
484                 mcr     p15, 0, ip, c1, c0, 0           @ ctrl register
485                 mov     pc, r0
487  * Purpose : Function pointers used to access above functions - all calls
488  *           come through these
489  */
491 cpu_manu_name:  .asciz  "Intel"
492 ENTRY(cpu_sa110_name)
493                 .asciz  "StrongARM-110"
494 ENTRY(cpu_sa1100_name)
495                 .asciz  "StrongARM-1100"
496                 .align
498                 .section ".text.init", #alloc, #execinstr
500 __sa110_setup:  mov     r0, #0
501                 mcr     p15, 0, r0, c7, c7              @ flush I,D caches on v4
502                 mcr     p15, 0, r0, c7, c10, 4          @ drain write buffer on v4
503                 mcr     p15, 0, r0, c8, c7              @ flush I,D TLBs on v4
504                 mcr     p15, 0, r4, c2, c0              @ load page table pointer
505                 mov     r0, #0x1f                       @ Domains 0, 1 = client
506                 mcr     p15, 0, r0, c3, c0              @ load domain access register
507                 mrc     p15, 0, r0, c1, c0              @ get control register v4
508                 bic     r0, r0, #0x0e00                 @ ....??r.........
509                 bic     r0, r0, #0x0002                 @ ..............a.
510                 orr     r0, r0, #0x003d                 @ ..........DPWC.M
511                 orr     r0, r0, #0x1100                 @ ...I...S........
512                 mov     pc, lr
514                 .type   sa110_processor_functions, #object
515 ENTRY(sa110_processor_functions)
516                 .word   cpu_sa110_data_abort
517                 .word   cpu_sa110_check_bugs
518                 .word   cpu_sa110_proc_init
519                 .word   cpu_sa110_proc_fin
520                 .word   cpu_sa110_flush_cache_all
521                 .word   cpu_sa110_flush_cache_area
522                 .word   cpu_sa110_flush_cache_entry
523                 .word   cpu_sa110_clean_cache_area
524                 .word   cpu_sa110_flush_ram_page
525                 .word   cpu_sa110_flush_tlb_all
526                 .word   cpu_sa110_flush_tlb_area
527                 .word   cpu_sa110_set_pgd
528                 .word   cpu_sa110_set_pmd
529                 .word   cpu_sa110_set_pte
530                 .word   cpu_sa110_reset
531                 .word   cpu_sa110_flush_icache_area
532                 .word   cpu_sa110_cache_wback_area
533                 .word   cpu_sa110_cache_purge_area
534                 .word   cpu_sa110_flush_tlb_page
535                 .word   cpu_sa110_do_idle
536                 .word   cpu_sa110_flush_icache_page
537                 .size   sa110_processor_functions, . - sa110_processor_functions
539                 .type   cpu_sa110_info, #object
540 cpu_sa110_info:
541                 .long   cpu_manu_name
542                 .long   cpu_sa110_name
543                 .size   cpu_sa110_info, . - cpu_sa110_info
546                 .type   sa1100_processor_functions, #object
547 ENTRY(sa1100_processor_functions)
548                 .word   cpu_sa1100_data_abort
549                 .word   cpu_sa1100_check_bugs
550                 .word   cpu_sa1100_proc_init
551                 .word   cpu_sa1100_proc_fin
552                 .word   cpu_sa1100_flush_cache_all
553                 .word   cpu_sa1100_flush_cache_area
554                 .word   cpu_sa1100_flush_cache_entry
555                 .word   cpu_sa1100_clean_cache_area
556                 .word   cpu_sa1100_flush_ram_page
557                 .word   cpu_sa1100_flush_tlb_all
558                 .word   cpu_sa1100_flush_tlb_area
559                 .word   cpu_sa1100_set_pgd
560                 .word   cpu_sa1100_set_pmd
561                 .word   cpu_sa1100_set_pte
562                 .word   cpu_sa1100_reset
563                 .word   cpu_sa1100_flush_icache_area
564                 .word   cpu_sa1100_cache_wback_area
565                 .word   cpu_sa1100_cache_purge_area
566                 .word   cpu_sa1100_flush_tlb_page
567                 .word   cpu_sa1100_do_idle
568                 .word   cpu_sa1100_flush_icache_page
569                 .size   sa1100_processor_functions, . - sa1100_processor_functions
571 cpu_sa1100_info:
572                 .long   cpu_manu_name
573                 .long   cpu_sa1100_name
574                 .size   cpu_sa1100_info, . - cpu_sa1100_info
576                 .type   cpu_arch_name, #object
577 cpu_arch_name:  .asciz  "armv4"
578                 .size   cpu_arch_name, . - cpu_arch_name
580                 .type   cpu_elf_name, #object
581 cpu_elf_name:   .asciz  "v4"
582                 .size   cpu_elf_name, . - cpu_elf_name
583                 .align
585                 .section ".proc.info", #alloc, #execinstr
587                 .type   __sa110_proc_info,#object
588 __sa110_proc_info:
589                 .long   0x4401a100
590                 .long   0xfffffff0
591                 .long   0x00000c02
592                 b       __sa110_setup
593                 .long   cpu_arch_name
594                 .long   cpu_elf_name
595                 .long   HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT
596                 .long   cpu_sa110_info
597                 .long   sa110_processor_functions
598                 .size   __sa110_proc_info, . - __sa110_proc_info
600                 .type   __sa1100_proc_info,#object
601 __sa1100_proc_info:
602                 .long   0x4401a110
603                 .long   0xfffffff0
604                 .long   0x00000c02
605                 b       __sa110_setup
606                 .long   cpu_arch_name
607                 .long   cpu_elf_name
608                 .long   HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT
609                 .long   cpu_sa1100_info
610                 .long   sa1100_processor_functions
611                 .size   __sa1100_proc_info, . - __sa1100_proc_info