~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/parisc/kernel/head.S

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/parisc/kernel/head.S (Version linux-6.12-rc7) and /arch/mips/kernel/head.S (Version linux-3.10.108)


  1 /* This file is subject to the terms and condi !!   1 /*
                                                   >>   2  * This file is subject to the terms and conditions of the GNU General Public
  2  * License.  See the file "COPYING" in the mai      3  * License.  See the file "COPYING" in the main directory of this archive
  3  * for more details.                                4  * for more details.
  4  *                                                  5  *
  5  * Copyright (C) 1999-2007 by Helge Deller <del !!   6  * Copyright (C) 1994, 1995 Waldorf Electronics
  6  * Copyright 1999 SuSE GmbH (Philipp Rumpf)    !!   7  * Written by Ralf Baechle and Andreas Busse
  7  * Copyright 1999 Philipp Rumpf (prumpf@tux.or !!   8  * Copyright (C) 1994 - 99, 2003, 06 Ralf Baechle
  8  * Copyright 2000 Hewlett Packard (Paul Bame,  !!   9  * Copyright (C) 1996 Paul M. Antoine
  9  * Copyright (C) 2001 Grant Grundler (Hewlett  !!  10  * Modified for DECStation and hence R3000 support by Paul M. Antoine
 10  * Copyright (C) 2004 Kyle McMartin <kyle@debia !!  11  * Further modifications by David S. Miller and Harald Koerfgen
 11  *                                             !!  12  * Copyright (C) 1999 Silicon Graphics, Inc.
 12  * Initial Version 04-23-1999 by Helge Deller < !!  13  * Kevin Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
                                                   >>  14  * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
 13  */                                                15  */
 14                                                << 
 15 #include <asm/asm-offsets.h>                   << 
 16 #include <asm/psw.h>                           << 
 17 #include <asm/pdc.h>                           << 
 18                                                << 
 19 #include <asm/assembly.h>                      << 
 20                                                << 
 21 #include <linux/linkage.h>                     << 
 22 #include <linux/init.h>                            16 #include <linux/init.h>
 23 #include <linux/pgtable.h>                     !!  17 #include <linux/threads.h>
 24                                                    18 
 25         .level  1.1                            !!  19 #include <asm/addrspace.h>
                                                   >>  20 #include <asm/asm.h>
                                                   >>  21 #include <asm/asmmacro.h>
                                                   >>  22 #include <asm/irqflags.h>
                                                   >>  23 #include <asm/regdef.h>
                                                   >>  24 #include <asm/pgtable-bits.h>
                                                   >>  25 #include <asm/mipsregs.h>
                                                   >>  26 #include <asm/stackframe.h>
 26                                                    27 
 27         __INITDATA                             !!  28 #include <kernel-entry-init.h>
 28 ENTRY(boot_args)                               << 
 29         .word 0 /* arg0 */                     << 
 30         .word 0 /* arg1 */                     << 
 31         .word 0 /* arg2 */                     << 
 32         .word 0 /* arg3 */                     << 
 33 END(boot_args)                                 << 
 34                                                << 
 35         __HEAD                                 << 
 36                                                << 
 37         .align  4                              << 
 38         .import init_task,data                 << 
 39         .import init_stack,data                << 
 40         .import fault_vector_20,code    /* IVA << 
 41 #ifndef CONFIG_64BIT                           << 
 42         .import fault_vector_11,code    /* IVA << 
 43         .import $global$                /* for << 
 44 #endif /*!CONFIG_64BIT*/                       << 
 45 ENTRY(parisc_kernel_start)                     << 
 46         .proc                                  << 
 47         .callinfo                              << 
 48                                                << 
 49         /* Make sure sr4-sr7 are set to zero f << 
 50         mtsp    %r0,%sr4                       << 
 51         mtsp    %r0,%sr5                       << 
 52         mtsp    %r0,%sr6                       << 
 53         mtsp    %r0,%sr7                       << 
 54                                                << 
 55         /* Clear BSS (shouldn't the boot loade << 
 56                                                << 
 57         .import __bss_start,data               << 
 58         .import __bss_stop,data                << 
 59                                                << 
 60         load32          PA(__bss_start),%r3    << 
 61         load32          PA(__bss_stop),%r4     << 
 62 $bss_loop:                                     << 
 63         cmpb,<<,n       %r3,%r4,$bss_loop      << 
 64         stw,ma          %r0,4(%r3)             << 
 65                                                << 
 66         /* Save away the arguments the boot lo << 
 67         load32          PA(boot_args),%r1      << 
 68         stw,ma          %arg0,4(%r1)           << 
 69         stw,ma          %arg1,4(%r1)           << 
 70         stw,ma          %arg2,4(%r1)           << 
 71         stw,ma          %arg3,4(%r1)           << 
 72                                                << 
 73 #if defined(CONFIG_PA20)                       << 
 74         /* check for 64-bit capable CPU as req << 
 75         ldi             32,%r10                << 
 76         mtctl           %r10,%cr11             << 
 77         .level 2.0                             << 
 78         mfctl,w         %cr11,%r10             << 
 79         .level 1.1                             << 
 80         comib,<>,n      0,%r10,$cpu_ok         << 
 81                                                << 
 82         load32          PA(msg1),%arg0         << 
 83         ldi             msg1_end-msg1,%arg1    << 
 84 $iodc_panic:                                   << 
 85         copy            %arg0, %r10            << 
 86         copy            %arg1, %r11            << 
 87         load32          PA(init_stack),%sp     << 
 88 #define MEM_CONS 0x3A0                         << 
 89         ldw             MEM_CONS+32(%r0),%arg0 << 
 90         ldi             ENTRY_IO_COUT,%arg1    << 
 91         ldw             MEM_CONS+36(%r0),%arg2 << 
 92         ldw             MEM_CONS+8(%r0),%arg3  << 
 93         load32          PA(__bss_start),%r1    << 
 94         stw             %r1,-52(%sp)           << 
 95         stw             %r0,-56(%sp)           << 
 96         stw             %r10,-60(%sp)          << 
 97         stw             %r11,-64(%sp)          << 
 98         stw             %r0,-68(%sp)           << 
 99         load32          PA(.iodc_panic_ret), % << 
100         ldw             MEM_CONS+40(%r0),%r1   << 
101         bv,n            (%r1)                  << 
102 .iodc_panic_ret:                               << 
103         b .                             /* wai << 
104         or              %r10,%r10,%r10  /* qem << 
105 msg1:   .ascii "Can't boot kernel which was bu << 
106 msg1_end:                                      << 
107                                                    29 
108 $cpu_ok:                                       !!  30         /*
109 #endif                                         !!  31          * inputs are the text nasid in t1, data nasid in t2.
110                                                !!  32          */
111         .level  PA_ASM_LEVEL                   !!  33         .macro MAPPED_KERNEL_SETUP_TLB
112                                                !!  34 #ifdef CONFIG_MAPPED_KERNEL
113         /* Initialize startup VM. Just map fir !!  35         /*
114         load32          PA(swapper_pg_dir),%r4 !!  36          * This needs to read the nasid - assume 0 for now.
115         mtctl           %r4,%cr24       /* Ini !!  37          * Drop in 0xffffffffc0000000 in tlbhi, 0+VG in tlblo_0,
116         mtctl           %r4,%cr25       /* Ini !!  38          * 0+DVG in tlblo_1.
117                                                !!  39          */
118 #if CONFIG_PGTABLE_LEVELS == 3                 !!  40         dli     t0, 0xffffffffc0000000
119         /* Set pmd in pgd */                   !!  41         dmtc0   t0, CP0_ENTRYHI
120         load32          PA(pmd0),%r5           !!  42         li      t0, 0x1c000             # Offset of text into node memory
121         shrd            %r5,PxD_VALUE_SHIFT,%r !!  43         dsll    t1, NASID_SHFT          # Shift text nasid into place
122         ldo             (PxD_FLAG_PRESENT+PxD_ !!  44         dsll    t2, NASID_SHFT          # Same for data nasid
123         stw             %r3,ASM_PGD_ENTRY*ASM_ !!  45         or      t1, t1, t0              # Physical load address of kernel text
124         ldo             ASM_PMD_ENTRY*ASM_PMD_ !!  46         or      t2, t2, t0              # Physical load address of kernel data
                                                   >>  47         dsrl    t1, 12                  # 4K pfn
                                                   >>  48         dsrl    t2, 12                  # 4K pfn
                                                   >>  49         dsll    t1, 6                   # Get pfn into place
                                                   >>  50         dsll    t2, 6                   # Get pfn into place
                                                   >>  51         li      t0, ((_PAGE_GLOBAL|_PAGE_VALID| _CACHE_CACHABLE_COW) >> 6)
                                                   >>  52         or      t0, t0, t1
                                                   >>  53         mtc0    t0, CP0_ENTRYLO0        # physaddr, VG, cach exlwr
                                                   >>  54         li      t0, ((_PAGE_GLOBAL|_PAGE_VALID| _PAGE_DIRTY|_CACHE_CACHABLE_COW) >> 6)
                                                   >>  55         or      t0, t0, t2
                                                   >>  56         mtc0    t0, CP0_ENTRYLO1        # physaddr, DVG, cach exlwr
                                                   >>  57         li      t0, 0x1ffe000           # MAPPED_KERN_TLBMASK, TLBPGMASK_16M
                                                   >>  58         mtc0    t0, CP0_PAGEMASK
                                                   >>  59         li      t0, 0                   # KMAP_INX
                                                   >>  60         mtc0    t0, CP0_INDEX
                                                   >>  61         li      t0, 1
                                                   >>  62         mtc0    t0, CP0_WIRED
                                                   >>  63         tlbwi
125 #else                                              64 #else
126         /* 2-level page table, so pmd == pgd * !!  65         mtc0    zero, CP0_WIRED
127         ldo             ASM_PGD_ENTRY*ASM_PGD_ << 
128 #endif                                             66 #endif
                                                   >>  67         .endm
129                                                    68 
130         /* Fill in pmd with enough pte directo !!  69         /*
131         load32          PA(pg0),%r1            !!  70          * For the moment disable interrupts, mark the kernel mode and
132         SHRREG          %r1,PxD_VALUE_SHIFT,%r !!  71          * set ST0_KX so that the CPU does not spit fire when using
133         ldo             (PxD_FLAG_PRESENT+PxD_ !!  72          * 64-bit addresses.  A full initialization of the CPU's status
134                                                !!  73          * register is done later in per_cpu_trap_init().
135         ldi             ASM_PT_INITIAL,%r1     !!  74          */
136                                                !!  75         .macro  setup_c0_status set clr
137 1:                                             !!  76         .set    push
138         stw             %r3,0(%r4)             !!  77 #ifdef CONFIG_MIPS_MT_SMTC
139         ldo             (PAGE_SIZE >> PxD_VALU !!  78         /*
140         addib,>         -1,%r1,1b              !!  79          * For SMTC, we need to set privilege and disable interrupts only for
141 #if CONFIG_PGTABLE_LEVELS == 3                 !!  80          * the current TC, using the TCStatus register.
142         ldo             ASM_PMD_ENTRY_SIZE(%r4 !!  81          */
                                                   >>  82         mfc0    t0, CP0_TCSTATUS
                                                   >>  83         /* Fortunately CU 0 is in the same place in both registers */
                                                   >>  84         /* Set TCU0, TMX, TKSU (for later inversion) and IXMT */
                                                   >>  85         li      t1, ST0_CU0 | 0x08001c00
                                                   >>  86         or      t0, t1
                                                   >>  87         /* Clear TKSU, leave IXMT */
                                                   >>  88         xori    t0, 0x00001800
                                                   >>  89         mtc0    t0, CP0_TCSTATUS
                                                   >>  90         _ehb
                                                   >>  91         /* We need to leave the global IE bit set, but clear EXL...*/
                                                   >>  92         mfc0    t0, CP0_STATUS
                                                   >>  93         or      t0, ST0_CU0 | ST0_EXL | ST0_ERL | \set | \clr
                                                   >>  94         xor     t0, ST0_EXL | ST0_ERL | \clr
                                                   >>  95         mtc0    t0, CP0_STATUS
143 #else                                              96 #else
144         ldo             ASM_PGD_ENTRY_SIZE(%r4 !!  97         mfc0    t0, CP0_STATUS
                                                   >>  98         or      t0, ST0_CU0|\set|0x1f|\clr
                                                   >>  99         xor     t0, 0x1f|\clr
                                                   >> 100         mtc0    t0, CP0_STATUS
                                                   >> 101         .set    noreorder
                                                   >> 102         sll     zero,3                          # ehb
145 #endif                                            103 #endif
                                                   >> 104         .set    pop
                                                   >> 105         .endm
146                                                   106 
147                                                !! 107         .macro  setup_c0_status_pri
148         /* Now initialize the PTEs themselves. !! 108 #ifdef CONFIG_64BIT
149          * everything ... it will get remapped !! 109         setup_c0_status ST0_KX 0
150         ldo             0+_PAGE_KERNEL_RWX(%r0 !! 110 #else
151         load32          (1<<(KERNEL_INITIAL_OR !! 111         setup_c0_status 0 0
152         load32          PA(pg0),%r1            << 
153                                                << 
154 $pgt_fill_loop:                                << 
155         STREGM          %r3,ASM_PTE_ENTRY_SIZE << 
156         ldo             (1<<PFN_PTE_SHIFT)(%r3 << 
157         addib,>         -1,%r11,$pgt_fill_loop << 
158         nop                                    << 
159                                                << 
160         /* Load the return address...er...cras << 
161         copy            %r0,%r2                << 
162                                                << 
163         /* And the RFI Target address too */   << 
164         load32          start_parisc,%r11      << 
165                                                << 
166         /* And the initial task pointer */     << 
167         load32          init_task,%r6          << 
168         mtctl           %r6,%cr30              << 
169                                                << 
170         /* And the stack pointer too */        << 
171         load32          init_stack,%sp         << 
172         tophys_r1       %sp                    << 
173 #if defined(CONFIG_64BIT) && defined(CONFIG_FU << 
174         .import _mcount,data                   << 
175         /* initialize mcount FPTR */           << 
176         /* Get the global data pointer */      << 
177         loadgp                                 << 
178         load32          PA(_mcount), %r10      << 
179         std             %dp,0x18(%r10)         << 
180 #endif                                            112 #endif
                                                   >> 113         .endm
181                                                   114 
182 #define MEM_PDC_LO 0x388                       !! 115         .macro  setup_c0_status_sec
183 #define MEM_PDC_HI 0x35C                       << 
184 #ifdef CONFIG_64BIT                               116 #ifdef CONFIG_64BIT
185         /* Get PDCE_PROC for monarch CPU. */   !! 117         setup_c0_status ST0_KX ST0_BEV
186         ldw             MEM_PDC_LO(%r0),%r3    !! 118 #else
187         ldw             MEM_PDC_HI(%r0),%r10   !! 119         setup_c0_status 0 ST0_BEV
188         depd            %r10, 31, 32, %r3      << 
189 #endif                                            120 #endif
                                                   >> 121         .endm
190                                                   122 
191                                                !! 123 #ifndef CONFIG_NO_EXCEPT_FILL
192 #ifdef CONFIG_SMP                              !! 124         /*
193         /* Set the smp rendezvous address into !! 125          * Reserved space for exception handlers.
194         ** It would be safer to do this in ini !! 126          * Necessary for machines which link their kernels at KSEG0.
195         ** it's just way easier to deal with h !! 127          */
196         ** of 64-bit function ptrs and the add !! 128         .fill   0x400
197         */                                     << 
198         load32          PA(smp_slave_stext),%r << 
199         stw             %r10,0x10(%r0)  /* MEM << 
200         stw             %r0,0x28(%r0)   /* MEM << 
201                                                << 
202         /* FALLTHROUGH */                      << 
203         .procend                               << 
204                                                << 
205 #ifdef CONFIG_HOTPLUG_CPU                      << 
206         /* common_stext is far away in another << 
207         load32          PA(common_stext), %rp  << 
208         bv,n            (%rp)                  << 
209                                                << 
210         /* common_stext and smp_slave_stext ne << 
211         .text                                  << 
212 #endif                                            129 #endif
213                                                   130 
214         /*                                     !! 131 EXPORT(_stext)
215         ** Code Common to both Monarch and Sla << 
216         ** Entry:                              << 
217         **                                     << 
218         **  1.1:                               << 
219         **    %r11 must contain RFI target add << 
220         **    %r25/%r26 args to pass to target << 
221         **    %r2  in case rfi target decides  << 
222         **                                     << 
223         **  2.0w:                              << 
224         **    %r3  PDCE_PROC address           << 
225         **    %r11 RFI target address          << 
226         **                                     << 
227         ** Caller must init: SR4-7, %sp, %r10, << 
228         */                                     << 
229 common_stext:                                  << 
230         .proc                                  << 
231         .callinfo                              << 
232 #else                                          << 
233         /* Clear PDC entry point - we won't us << 
234         stw             %r0,0x10(%r0)   /* MEM << 
235         stw             %r0,0x28(%r0)   /* MEM << 
236 #endif /*CONFIG_SMP*/                          << 
237                                                   132 
238 #ifdef CONFIG_64BIT                            !! 133 #ifdef CONFIG_BOOT_RAW
239         mfctl           %cr30,%r6              !! 134         /*
240         tophys_r1       %r6                    !! 135          * Give us a fighting chance of running if execution beings at the
                                                   >> 136          * kernel load address.  This is needed because this platform does
                                                   >> 137          * not have a ELF loader yet.
                                                   >> 138          */
                                                   >> 139 FEXPORT(__kernel_entry)
                                                   >> 140         j       kernel_entry
                                                   >> 141 #endif
241                                                   142 
242         /* Save the rfi target address */      !! 143         __REF
243         STREG           %r11,  TASK_PT_GR11(%r << 
244         /* Switch to wide mode Superdome doesn << 
245         ** calls.                              << 
246         */                                     << 
247 1:      mfia            %rp             /* cle << 
248         ldo             2f-1b(%rp),%rp         << 
249         depdi           0,31,32,%rp            << 
250         bv              (%rp)                  << 
251         ssm             PSW_SM_W,%r0           << 
252                                                << 
253         /* Set Wide mode as the "Default" (eg  << 
254         ** First trap occurs *right* after (or << 
255         ** Someday, palo might not do this for << 
256         */                                     << 
257 2:                                             << 
258                                                   144 
259         ldo             PDC_PSW(%r0),%arg0     !! 145 NESTED(kernel_entry, 16, sp)                    # kernel entry point
260         ldo             PDC_PSW_SET_DEFAULTS(% << 
261         ldo             PDC_PSW_WIDE_BIT(%r0), << 
262         load32          PA(stext_pdc_ret), %rp << 
263         bv              (%r3)                  << 
264         copy            %r0,%arg3              << 
265                                                << 
266 stext_pdc_ret:                                 << 
267         LDREG           TASK_PT_GR11(%r6), %r1 << 
268         tovirt_r1       %r6                    << 
269         mtctl           %r6,%cr30              << 
270 #endif                                         << 
271                                                   146 
272 #ifndef CONFIG_64BIT                           !! 147         kernel_entry_setup                      # cpu specific setup
273         /* clear all BTLBs */                  << 
274         ldi             PDC_BLOCK_TLB,%arg0    << 
275         load32          PA(stext_pdc_btlb_ret) << 
276         ldw             MEM_PDC_LO(%r0),%r3    << 
277         bv              (%r3)                  << 
278         ldi             PDC_BTLB_PURGE_ALL,%ar << 
279 stext_pdc_btlb_ret:                            << 
280 #endif                                         << 
281                                                   148 
282         /* PARANOID: clear user scratch/user s !! 149         setup_c0_status_pri
283         mtsp    %r0,%sr0                       << 
284         mtsp    %r0,%sr1                       << 
285         mtsp    %r0,%sr2                       << 
286         mtsp    %r0,%sr3                       << 
287                                                << 
288         /* Initialize Protection Registers */  << 
289         mtctl   %r0,%cr8                       << 
290         mtctl   %r0,%cr9                       << 
291         mtctl   %r0,%cr12                      << 
292         mtctl   %r0,%cr13                      << 
293                                                   150 
294         /* Initialize the global data pointer  !! 151         /* We might not get launched at the address the kernel is linked to,
295         loadgp                                 !! 152            so we jump there.  */
                                                   >> 153         PTR_LA  t0, 0f
                                                   >> 154         jr      t0
                                                   >> 155 0:
296                                                   156 
297         /* Set up our interrupt table.  HPMCs  !! 157 #ifdef CONFIG_MIPS_MT_SMTC
                                                   >> 158         /*
                                                   >> 159          * In SMTC kernel, "CLI" is thread-specific, in TCStatus.
                                                   >> 160          * We still need to enable interrupts globally in Status,
                                                   >> 161          * and clear EXL/ERL.
298          *                                        162          *
299          * We need to install the correct iva  !! 163          * TCContext is used to track interrupt levels under
300          * following short sequence of instruc !! 164          * service in SMTC kernel. Clear for boot TC before
301          * (without being illegal on a PA1.1 m !! 165          * allowing any interrupts.
302          */                                       166          */
303 #ifndef CONFIG_64BIT                           !! 167         mtc0    zero, CP0_TCCONTEXT
304         ldi             32,%r10                << 
305         mtctl           %r10,%cr11             << 
306         .level 2.0                             << 
307         mfctl,w         %cr11,%r10             << 
308         .level 1.1                             << 
309         comib,<>,n      0,%r10,$is_pa20        << 
310         ldil            L%PA(fault_vector_11), << 
311         b               $install_iva           << 
312         ldo             R%PA(fault_vector_11)( << 
313                                                << 
314 $is_pa20:                                      << 
315         .level          PA_ASM_LEVEL /* restor << 
316 #endif /*!CONFIG_64BIT*/                       << 
317         load32          PA(fault_vector_20),%r << 
318                                                << 
319 $install_iva:                                  << 
320         mtctl           %r10,%cr14             << 
321                                                << 
322         b               aligned_rfi  /* Prepar << 
323         nop                                    << 
324                                                << 
325         .align 128                             << 
326 aligned_rfi:                                   << 
327         pcxt_ssm_bug                           << 
328                                                << 
329         copy            %r3, %arg0      /* PDC << 
330                                                << 
331         rsm             PSW_SM_QUIET,%r0       << 
332         /* Don't need NOPs, have 8 compliant i << 
333                                                << 
334         mtctl           %r0,%cr17       /* Cle << 
335         mtctl           %r0,%cr17       /* Cle << 
336                                                << 
337         /* Load RFI target into PC queue */    << 
338         mtctl           %r11,%cr18      /* IIA << 
339         ldo             4(%r11),%r11           << 
340         mtctl           %r11,%cr18      /* IIA << 
341                                                << 
342         load32          KERNEL_PSW,%r10        << 
343         mtctl           %r10,%ipsw             << 
344                                                << 
345         tovirt_r1       %sp                    << 
346                                                << 
347         /* Jump through hyperspace to Virt Mod << 
348         rfi                                    << 
349         nop                                    << 
350                                                << 
351         .procend                               << 
352                                                   168 
353 #ifdef CONFIG_SMP                              !! 169         mfc0    t0, CP0_STATUS
354                                                !! 170         ori     t0, t0, 0xff1f
355         .import smp_init_current_idle_task,dat !! 171         xori    t0, t0, 0x001e
356         .import smp_callin,code                !! 172         mtc0    t0, CP0_STATUS
                                                   >> 173 #endif /* CONFIG_MIPS_MT_SMTC */
                                                   >> 174 
                                                   >> 175         PTR_LA          t0, __bss_start         # clear .bss
                                                   >> 176         LONG_S          zero, (t0)
                                                   >> 177         PTR_LA          t1, __bss_stop - LONGSIZE
                                                   >> 178 1:
                                                   >> 179         PTR_ADDIU       t0, LONGSIZE
                                                   >> 180         LONG_S          zero, (t0)
                                                   >> 181         bne             t0, t1, 1b
                                                   >> 182 
                                                   >> 183         LONG_S          a0, fw_arg0             # firmware arguments
                                                   >> 184         LONG_S          a1, fw_arg1
                                                   >> 185         LONG_S          a2, fw_arg2
                                                   >> 186         LONG_S          a3, fw_arg3
                                                   >> 187 
                                                   >> 188         MTC0            zero, CP0_CONTEXT       # clear context register
                                                   >> 189         PTR_LA          $28, init_thread_union
                                                   >> 190         /* Set the SP after an empty pt_regs.  */
                                                   >> 191         PTR_LI          sp, _THREAD_SIZE - 32 - PT_SIZE
                                                   >> 192         PTR_ADDU        sp, $28
                                                   >> 193         back_to_back_c0_hazard
                                                   >> 194         set_saved_sp    sp, t0, t1
                                                   >> 195         PTR_SUBU        sp, 4 * SZREG           # init stack pointer
357                                                   196 
358 #ifndef CONFIG_64BIT                           !! 197         j               start_kernel
359 smp_callin_rtn:                                !! 198         END(kernel_entry)
360         .proc                                  << 
361         .callinfo                              << 
362         break   1,1             /*  Break if r << 
363         nop                                    << 
364         nop                                    << 
365         .procend                               << 
366 #endif /*!CONFIG_64BIT*/                       << 
367                                                << 
368 /********************************************* << 
369 * smp_slave_stext is executed by all non-monar << 
370 * pokes the slave CPUs in smp.c:smp_boot_cpus( << 
371 *                                              << 
372 * Once here, registers values are initialized  << 
373 * mode. Once all available/eligible CPUs are i << 
374 * released and start out by executing their ow << 
375 ********************************************** << 
376 smp_slave_stext:                               << 
377         .proc                                  << 
378         .callinfo                              << 
379                                                   199 
380         /*                                     !! 200         __CPUINIT
381         ** Initialize Space registers          << 
382         */                                     << 
383         mtsp       %r0,%sr4                    << 
384         mtsp       %r0,%sr5                    << 
385         mtsp       %r0,%sr6                    << 
386         mtsp       %r0,%sr7                    << 
387                                                   201 
388 #ifdef CONFIG_64BIT                            !! 202 #ifdef CONFIG_SMP
                                                   >> 203 /*
                                                   >> 204  * SMP slave cpus entry point.  Board specific code for bootstrap calls this
                                                   >> 205  * function after setting up the stack and gp registers.
                                                   >> 206  */
                                                   >> 207 NESTED(smp_bootstrap, 16, sp)
                                                   >> 208 #ifdef CONFIG_MIPS_MT_SMTC
389         /*                                        209         /*
390          *  Enable Wide mode early, in case th !! 210          * Read-modify-writes of Status must be atomic, and this
391          *  task in smp_init_current_idle_task !! 211          * is one case where CLI is invoked without EXL being
                                                   >> 212          * necessarily set. The CLI and setup_c0_status will
                                                   >> 213          * in fact be redundant for all but the first TC of
                                                   >> 214          * each VPE being booted.
392          */                                       215          */
393 1:      mfia            %rp             /* cle !! 216         DMT     10      # dmt t2 /* t0, t1 are used by CLI and setup_c0_status() */
394         ldo             2f-1b(%rp),%rp         !! 217         jal     mips_ihb
395         depdi           0,31,32,%rp            !! 218 #endif /* CONFIG_MIPS_MT_SMTC */
396         bv              (%rp)                  !! 219         setup_c0_status_sec
397         ssm             PSW_SM_W,%r0           !! 220         smp_slave_setup
                                                   >> 221 #ifdef CONFIG_MIPS_MT_SMTC
                                                   >> 222         andi    t2, t2, VPECONTROL_TE
                                                   >> 223         beqz    t2, 2f
                                                   >> 224         EMT             # emt
398 2:                                                225 2:
399 #endif                                         !! 226 #endif /* CONFIG_MIPS_MT_SMTC */
400                                                !! 227         j       start_secondary
401         /*  Initialize the SP - monarch sets u !! 228         END(smp_bootstrap)
402         load32          PA(smp_init_current_id << 
403         LDREG           0(%r6),%r6             << 
404         mtctl           %r6,%cr30              << 
405         tophys_r1       %r6                    << 
406         LDREG           TASK_STACK(%r6),%sp    << 
407         tophys_r1       %sp                    << 
408         ldo             FRAME_SIZE(%sp),%sp    << 
409                                                << 
410         /* point CPU to kernel page tables */  << 
411         load32          PA(swapper_pg_dir),%r4 << 
412         mtctl           %r4,%cr24       /* Ini << 
413         mtctl           %r4,%cr25       /* Ini << 
414                                                << 
415 #ifdef CONFIG_64BIT                            << 
416         /* Setup PDCE_PROC entry */            << 
417         copy            %arg0,%r3              << 
418 #else                                          << 
419         /* Load RFI *return* address in case s << 
420         load32          smp_callin_rtn,%r2     << 
421 #endif                                         << 
422                                                << 
423         /* Load RFI target address.  */        << 
424         load32          smp_callin,%r11        << 
425                                                << 
426         /* ok...common code can handle the res << 
427         b               common_stext           << 
428         nop                                    << 
429                                                << 
430         .procend                               << 
431 #endif /* CONFIG_SMP */                           229 #endif /* CONFIG_SMP */
432                                                   230 
433 #ifndef CONFIG_64BIT                           !! 231         __FINIT
434         .section .data..ro_after_init          << 
435                                                << 
436         .align  4                              << 
437         .export $global$,data                  << 
438                                                << 
439         .type   $global$,@object               << 
440         .size   $global$,4                     << 
441 $global$:                                      << 
442         .word 0                                << 
443 #endif /*!CONFIG_64BIT*/                       << 
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php