1 /* SPDX-License-Identifier: GPL-2.0-or-later */
4 * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
6 * Rewritten by Cort Dougan (cort@cs.nmt.edu) for PReP
7 * Copyright (C) 1996 Cort Dougan <cort@cs.nmt.edu>
8 * Adapted for Power Macintosh by Paul Mackerras.
9 * Low-level exception handlers and MMU support
10 * rewritten by Paul Mackerras.
11 * Copyright (C) 1996 Paul Mackerras.
12 * MPC8xx modifications Copyright (C) 1997 Dan Malek (dmalek@jlc.net).
14 * This file contains the low-level support and setup for the
15 * PowerPC platform, including trap and interrupt dispatch.
16 * (The PPC 8xx embedded CPUs use head_8xx.S instead.)
19 #include <linux/init.h>
20 #include <linux/pgtable.h>
24 #include <asm/cputable.h>
25 #include <asm/cache.h>
26 #include <asm/thread_info.h>
27 #include <asm/ppc_asm.h>
28 #include <asm/asm-offsets.h>
29 #include <asm/ptrace.h>
31 #include <asm/kvm_book3s_asm.h>
32 #include <asm/export.h>
33 #include <asm/feature-fixups.h>
37 #define LOAD_BAT(n, reg, RA, RB) \
38 /* see the comment for clear_bats() -- Cort */ \
40 mtspr SPRN_IBAT##n##U,RA; \
41 mtspr SPRN_DBAT##n##U,RA; \
42 lwz RA,(n*16)+0(reg); \
43 lwz RB,(n*16)+4(reg); \
44 mtspr SPRN_IBAT##n##U,RA; \
45 mtspr SPRN_IBAT##n##L,RB; \
46 lwz RA,(n*16)+8(reg); \
47 lwz RB,(n*16)+12(reg); \
48 mtspr SPRN_DBAT##n##U,RA; \
49 mtspr SPRN_DBAT##n##L,RB
52 .stabs "arch/powerpc/kernel/",N_SO,0,0,0f
53 .stabs "head_book3s_32.S",N_SO,0,0,0f
58 * _start is defined this way because the XCOFF loader in the OpenFirmware
59 * on the powermac expects the entry point to be a procedure descriptor.
63 * These are here for legacy reasons, the kernel used to
64 * need to look like a coff function entry for the pmac
65 * but we're always started by some kind of bootloader now.
68 nop /* used by __secondary_hold on prep (mtx) and chrp smp */
69 nop /* used by __secondary_hold on prep (mtx) and chrp smp */
73 * Enter here with the kernel text, data and bss loaded starting at
74 * 0, running with virtual == physical mapping.
75 * r5 points to the prom entry point (the client interface handler
76 * address). Address translation is turned on, with the prom
77 * managing the hash table. Interrupts are disabled. The stack
78 * pointer (r1) points to just below the end of the half-meg region
79 * from 0x380000 - 0x400000, which is mapped in already.
81 * If we are booted from MacOS via BootX, we enter with the kernel
82 * image loaded somewhere, and the following values in registers:
83 * r3: 'BooX' (0x426f6f58)
84 * r4: virtual address of boot_infos_t
88 * This is jumped to on prep systems right after the kernel is relocated
89 * to its proper place in memory by the boot loader. The expected layout
91 * r3: ptr to residual data
92 * r4: initrd_start or if no initrd then 0
93 * r5: initrd_end - unused if r4 is 0
94 * r6: Start of command line string
95 * r7: End of command line string
97 * This just gets a minimal mmu environment setup so we can call
98 * start_here() to do the real work.
105 * We have to do any OF calls before we map ourselves to KERNELBASE,
106 * because OF may have I/O devices mapped into that area
107 * (particularly on CHRP).
112 #ifdef CONFIG_PPC_OF_BOOT_TRAMPOLINE
113 /* find out where we are now */
115 0: mflr r8 /* r8 = runtime addr here */
116 addis r8,r8,(_stext - 0b)@ha
117 addi r8,r8,(_stext - 0b)@l /* current runtime base addr */
119 #endif /* CONFIG_PPC_OF_BOOT_TRAMPOLINE */
121 /* We never return. We also hit that trap if trying to boot
122 * from OF while CONFIG_PPC_OF_BOOT_TRAMPOLINE isn't selected */
126 * Check for BootX signature when supporting PowerMac and branch to
127 * appropriate trampoline if it's present
129 #ifdef CONFIG_PPC_PMAC
136 #endif /* CONFIG_PPC_PMAC */
138 1: mr r31,r3 /* save device tree ptr */
142 * early_init() does the early machine identification and does
143 * the necessary low-level setup and clears the BSS
144 * -- Cort <cort@fsmlabs.com>
148 /* Switch MMU off, clear BATs and flush TLB. At this point, r3 contains
149 * the physical address we are running at, returned by early_init()
157 bl load_segment_registers
160 #if defined(CONFIG_BOOTX_TEXT)
163 #ifdef CONFIG_PPC_EARLY_DEBUG_CPM
166 #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
167 bl setup_usbgecko_bat
171 * Call setup_cpu for CPU 0 and initialize 6xx Idle
175 bl call_setup_cpu /* Call setup_cpu for this CPU */
181 * We need to run with _start at physical address 0.
182 * On CHRP, we are loaded at 0x10000 since OF on CHRP uses
183 * the exception vectors at 0 (and therefore this copy
184 * overwrites OF's exception vectors with our own).
185 * The MMU is off at this point.
189 addis r4,r3,KERNELBASE@h /* current address of _start */
190 lis r5,PHYSICAL_START@h
191 cmplw 0,r4,r5 /* already running at PHYSICAL_START? */
194 * we now have the 1st 16M of ram mapped with the bats.
195 * prep needs the mmu to be turned on here, but pmac already has it on.
196 * this shouldn't bother the pmac since it just gets turned on again
197 * as we jump to our code at KERNELBASE. -- Cort
198 * Actually no, pmac doesn't have it on any more. BootX enters with MMU
199 * off, and in other cases, we now turn it off before changing BATs above.
203 ori r0,r0,MSR_DR|MSR_IR|MSR_RI
206 ori r0,r0,start_here@l
208 rfi /* enables MMU */
211 * We need __secondary_hold as a place to hold the other cpus on
212 * an SMP machine, even when we are running a UP kernel.
214 . = 0xc0 /* for prep bootloader */
215 li r3,1 /* MTX only has 1 cpu */
216 .globl __secondary_hold
218 /* tell the master we're here */
219 stw r3,__secondary_hold_acknowledge@l(0)
222 /* wait until we're told to start */
225 /* our cpu # was at addr 0 - go */
226 mr r24,r3 /* cpu # */
230 #endif /* CONFIG_SMP */
232 .globl __secondary_hold_spinloop
233 __secondary_hold_spinloop:
235 .globl __secondary_hold_acknowledge
236 __secondary_hold_acknowledge:
240 /* core99 pmac starts the seconary here by changing the vector, and
241 putting it back to what it was (unknown_exception) when done. */
242 EXCEPTION(0x100, Reset, unknown_exception, EXC_XFER_STD)
246 * On CHRP, this is complicated by the fact that we could get a
247 * machine check inside RTAS, and we have no guarantee that certain
248 * critical registers will have the values we expect. The set of
249 * registers that might have bad values includes all the GPRs
250 * and all the BATs. We indicate that we are in RTAS by putting
251 * a non-zero value, the address of the exception frame to use,
252 * in thread.rtas_sp. The machine check handler checks thread.rtas_sp
253 * and uses its value if it is non-zero.
254 * (Other exception handlers assume that r1 is a valid kernel stack
255 * pointer when we take an exception from supervisor mode.)
262 #ifdef CONFIG_PPC_CHRP
263 mfspr r11, SPRN_SPRG_THREAD
264 lwz r11, RTAS_SP(r11)
267 #endif /* CONFIG_PPC_CHRP */
268 EXCEPTION_PROLOG_1 for_rtas=1
269 7: EXCEPTION_PROLOG_2
270 addi r3,r1,STACK_FRAME_OVERHEAD
271 #ifdef CONFIG_PPC_CHRP
272 #ifdef CONFIG_VMAP_STACK
273 mfspr r4, SPRN_SPRG_THREAD
278 beq cr1, machine_check_tramp
281 b machine_check_tramp
284 /* Data access exception. */
288 #ifdef CONFIG_VMAP_STACK
289 BEGIN_MMU_FTR_SECTION
290 mtspr SPRN_SPRG_SCRATCH2,r10
291 mfspr r10, SPRN_SPRG_THREAD
293 mfspr r10, SPRN_DSISR
295 andis. r10, r10, (DSISR_BAD_FAULT_32S | DSISR_DABRMATCH)@h
296 mfspr r10, SPRN_SPRG_THREAD
298 .Lhash_page_dsi_cont:
301 mfspr r10, SPRN_SPRG_SCRATCH2
304 ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE)
305 1: EXCEPTION_PROLOG_0 handle_dar_dsisr=1
307 b handle_page_fault_tramp_1
308 #else /* CONFIG_VMAP_STACK */
309 EXCEPTION_PROLOG handle_dar_dsisr=1
310 get_and_save_dar_dsisr_on_stack r4, r5, r11
311 BEGIN_MMU_FTR_SECTION
312 andis. r0, r5, (DSISR_BAD_FAULT_32S | DSISR_DABRMATCH)@h
313 bne handle_page_fault_tramp_2 /* if not, try to put a PTE */
314 rlwinm r3, r5, 32 - 15, 21, 21 /* DSISR_STORE -> _PAGE_RW */
316 b handle_page_fault_tramp_1
318 b handle_page_fault_tramp_2
319 ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_HPTE_TABLE)
320 #endif /* CONFIG_VMAP_STACK */
322 /* Instruction access exception. */
326 #ifdef CONFIG_VMAP_STACK
327 mtspr SPRN_SPRG_SCRATCH0,r10
328 mtspr SPRN_SPRG_SCRATCH1,r11
329 mfspr r10, SPRN_SPRG_THREAD
332 mfspr r11, SPRN_SRR1 /* check whether user or kernel */
335 BEGIN_MMU_FTR_SECTION
336 andis. r11, r11, SRR1_ISI_NOPT@h /* no pte found? */
338 .Lhash_page_isi_cont:
339 mfspr r11, SPRN_SRR1 /* check whether user or kernel */
340 END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
341 andi. r11, r11, MSR_PR
345 #else /* CONFIG_VMAP_STACK */
347 andis. r0,r9,SRR1_ISI_NOPT@h /* no pte found? */
348 beq 1f /* if so, try to put a PTE */
349 li r3,0 /* into the hash table */
350 mr r4,r12 /* SRR0 is fault address */
351 BEGIN_MMU_FTR_SECTION
353 END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
354 #endif /* CONFIG_VMAP_STACK */
356 andis. r5,r9,DSISR_SRR1_MATCH_32S@h /* Filter relevant SRR1 bits */
358 EXC_XFER_LITE(0x400, handle_page_fault)
360 /* External interrupt */
361 EXCEPTION(0x500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
363 /* Alignment exception */
367 EXCEPTION_PROLOG handle_dar_dsisr=1
368 save_dar_dsisr_on_stack r4, r5, r11
369 addi r3,r1,STACK_FRAME_OVERHEAD
370 b alignment_exception_tramp
372 /* Program check exception */
373 EXCEPTION(0x700, ProgramCheck, program_check_exception, EXC_XFER_STD)
375 /* Floating-point unavailable */
379 #ifdef CONFIG_PPC_FPU
382 * Certain Freescale cores don't have a FPU and treat fp instructions
383 * as a FP Unavailable exception. Redirect to illegal/emulation handling.
386 END_FTR_SECTION_IFSET(CPU_FTR_FPU_UNAVAILABLE)
389 bl load_up_fpu /* if from user, just load it up */
390 b fast_exception_return
391 1: addi r3,r1,STACK_FRAME_OVERHEAD
392 EXC_XFER_LITE(0x800, kernel_fp_unavailable_exception)
398 EXCEPTION(0x900, Decrementer, timer_interrupt, EXC_XFER_LITE)
400 EXCEPTION(0xa00, Trap_0a, unknown_exception, EXC_XFER_STD)
401 EXCEPTION(0xb00, Trap_0b, unknown_exception, EXC_XFER_STD)
409 EXCEPTION(0xd00, SingleStep, single_step_exception, EXC_XFER_STD)
410 EXCEPTION(0xe00, Trap_0e, unknown_exception, EXC_XFER_STD)
413 * The Altivec unavailable trap is at 0x0f20. Foo.
414 * We effectively remap it to 0x3000.
415 * We include an altivec unavailable exception vector even if
416 * not configured for Altivec, so that you can't panic a
417 * non-altivec kernel running on a machine with altivec just
418 * by executing an altivec instruction.
429 * Handle TLB miss for instruction on 603/603e.
430 * Note: we get an alternate set of r0 - r3 to use automatically.
436 * r1: linux style pte ( later becomes ppc hardware pte )
437 * r2: ptr to linux-style pte
440 /* Get PTE (linux-style) and check access */
442 #ifdef CONFIG_MODULES
443 lis r1, TASK_SIZE@h /* check if kernel address */
447 li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
448 rlwinm r2, r2, 28, 0xfffff000
449 #ifdef CONFIG_MODULES
451 lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */
452 addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */
454 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */
455 lwz r2,0(r2) /* get pmd entry */
456 rlwinm. r2,r2,0,0,19 /* extract address of pte page */
457 beq- InstructionAddressInvalid /* return if no mapping */
458 rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */
459 lwz r0,0(r2) /* get linux-style pte */
460 andc. r1,r1,r0 /* check access & ~permission */
461 bne- InstructionAddressInvalid /* return if access not permitted */
462 /* Convert linux-style PTE to low word of PPC-style PTE */
463 rlwimi r0,r0,32-2,31,31 /* _PAGE_USER -> PP lsb */
464 ori r1, r1, 0xe06 /* clear out reserved bits */
465 andc r1, r0, r1 /* PP = user? 1 : 0 */
467 rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
468 END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
471 mfspr r3,SPRN_SRR1 /* Need to restore CR0 */
474 InstructionAddressInvalid:
476 rlwinm r1,r3,9,6,6 /* Get load/store bit */
479 mtspr SPRN_DSISR,r1 /* (shouldn't be needed) */
480 andi. r2,r3,0xFFFF /* Clear upper bits of SRR1 */
483 mfspr r1,SPRN_IMISS /* Get failing address */
484 rlwinm. r2,r2,0,31,31 /* Check for little endian access */
485 rlwimi r2,r2,1,30,30 /* change 1 -> 3 */
487 mtspr SPRN_DAR,r1 /* Set fault address */
488 mfmsr r0 /* Restore "normal" registers */
489 xoris r0,r0,MSR_TGPR>>16
490 mtcrf 0x80,r3 /* Restore CR0 */
495 * Handle TLB miss for DATA Load operation on 603/603e
501 * r1: linux style pte ( later becomes ppc hardware pte )
502 * r2: ptr to linux-style pte
505 /* Get PTE (linux-style) and check access */
507 lis r1, TASK_SIZE@h /* check if kernel address */
510 li r1, _PAGE_PRESENT | _PAGE_ACCESSED
511 rlwinm r2, r2, 28, 0xfffff000
513 lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */
514 addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */
515 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */
516 lwz r2,0(r2) /* get pmd entry */
517 rlwinm. r2,r2,0,0,19 /* extract address of pte page */
518 beq- DataAddressInvalid /* return if no mapping */
519 rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */
520 lwz r0,0(r2) /* get linux-style pte */
521 andc. r1,r1,r0 /* check access & ~permission */
522 bne- DataAddressInvalid /* return if access not permitted */
524 * NOTE! We are assuming this is not an SMP system, otherwise
525 * we would need to update the pte atomically with lwarx/stwcx.
527 /* Convert linux-style PTE to low word of PPC-style PTE */
528 rlwinm r1,r0,32-9,30,30 /* _PAGE_RW -> PP msb */
529 rlwimi r0,r0,32-1,30,30 /* _PAGE_USER -> PP msb */
530 rlwimi r0,r0,32-1,31,31 /* _PAGE_USER -> PP lsb */
531 ori r1,r1,0xe04 /* clear out reserved bits */
532 andc r1,r0,r1 /* PP = user? rw? 1: 3: 0 */
534 rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
535 END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
537 mfspr r2,SPRN_SRR1 /* Need to restore CR0 */
539 BEGIN_MMU_FTR_SECTION
541 mfspr r1,SPRN_SPRG_603_LRU
542 rlwinm r2,r3,20,27,31 /* Get Address bits 15:19 */
546 mtspr SPRN_SPRG_603_LRU,r1
548 rlwimi r2,r0,31-14,14,14
550 END_MMU_FTR_SECTION_IFSET(MMU_FTR_NEED_DTLB_SW_LRU)
555 rlwinm r1,r3,9,6,6 /* Get load/store bit */
558 andi. r2,r3,0xFFFF /* Clear upper bits of SRR1 */
560 mfspr r1,SPRN_DMISS /* Get failing address */
561 rlwinm. r2,r2,0,31,31 /* Check for little endian access */
562 beq 20f /* Jump if big endian */
564 20: mtspr SPRN_DAR,r1 /* Set fault address */
565 mfmsr r0 /* Restore "normal" registers */
566 xoris r0,r0,MSR_TGPR>>16
567 mtcrf 0x80,r3 /* Restore CR0 */
572 * Handle TLB miss for DATA Store on 603/603e
578 * r1: linux style pte ( later becomes ppc hardware pte )
579 * r2: ptr to linux-style pte
582 /* Get PTE (linux-style) and check access */
584 lis r1, TASK_SIZE@h /* check if kernel address */
587 li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT | _PAGE_ACCESSED
588 rlwinm r2, r2, 28, 0xfffff000
590 lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */
591 addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */
592 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */
593 lwz r2,0(r2) /* get pmd entry */
594 rlwinm. r2,r2,0,0,19 /* extract address of pte page */
595 beq- DataAddressInvalid /* return if no mapping */
596 rlwimi r2,r3,22,20,29 /* insert next 10 bits of address */
597 lwz r0,0(r2) /* get linux-style pte */
598 andc. r1,r1,r0 /* check access & ~permission */
599 bne- DataAddressInvalid /* return if access not permitted */
601 * NOTE! We are assuming this is not an SMP system, otherwise
602 * we would need to update the pte atomically with lwarx/stwcx.
604 /* Convert linux-style PTE to low word of PPC-style PTE */
605 rlwimi r0,r0,32-2,31,31 /* _PAGE_USER -> PP lsb */
606 li r1,0xe06 /* clear out reserved bits & PP msb */
607 andc r1,r0,r1 /* PP = user? 1: 0 */
609 rlwinm r1,r1,0,~_PAGE_COHERENT /* clear M (coherence not required) */
610 END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT)
612 mfspr r2,SPRN_SRR1 /* Need to restore CR0 */
614 BEGIN_MMU_FTR_SECTION
616 mfspr r1,SPRN_SPRG_603_LRU
617 rlwinm r2,r3,20,27,31 /* Get Address bits 15:19 */
621 mtspr SPRN_SPRG_603_LRU,r1
623 rlwimi r2,r0,31-14,14,14
625 END_MMU_FTR_SECTION_IFSET(MMU_FTR_NEED_DTLB_SW_LRU)
629 #ifndef CONFIG_ALTIVEC
630 #define altivec_assist_exception unknown_exception
633 #ifndef CONFIG_TAU_INT
634 #define TAUException unknown_exception
637 EXCEPTION(0x1300, Trap_13, instruction_breakpoint_exception, EXC_XFER_STD)
638 EXCEPTION(0x1400, SMI, SMIException, EXC_XFER_STD)
639 EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_STD)
640 EXCEPTION(0x1600, Trap_16, altivec_assist_exception, EXC_XFER_STD)
641 EXCEPTION(0x1700, Trap_17, TAUException, EXC_XFER_STD)
642 EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_STD)
643 EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_STD)
644 EXCEPTION(0x1a00, Trap_1a, unknown_exception, EXC_XFER_STD)
645 EXCEPTION(0x1b00, Trap_1b, unknown_exception, EXC_XFER_STD)
646 EXCEPTION(0x1c00, Trap_1c, unknown_exception, EXC_XFER_STD)
647 EXCEPTION(0x1d00, Trap_1d, unknown_exception, EXC_XFER_STD)
648 EXCEPTION(0x1e00, Trap_1e, unknown_exception, EXC_XFER_STD)
649 EXCEPTION(0x1f00, Trap_1f, unknown_exception, EXC_XFER_STD)
650 EXCEPTION(0x2000, RunMode, RunModeException, EXC_XFER_STD)
651 EXCEPTION(0x2100, Trap_21, unknown_exception, EXC_XFER_STD)
652 EXCEPTION(0x2200, Trap_22, unknown_exception, EXC_XFER_STD)
653 EXCEPTION(0x2300, Trap_23, unknown_exception, EXC_XFER_STD)
654 EXCEPTION(0x2400, Trap_24, unknown_exception, EXC_XFER_STD)
655 EXCEPTION(0x2500, Trap_25, unknown_exception, EXC_XFER_STD)
656 EXCEPTION(0x2600, Trap_26, unknown_exception, EXC_XFER_STD)
657 EXCEPTION(0x2700, Trap_27, unknown_exception, EXC_XFER_STD)
658 EXCEPTION(0x2800, Trap_28, unknown_exception, EXC_XFER_STD)
659 EXCEPTION(0x2900, Trap_29, unknown_exception, EXC_XFER_STD)
660 EXCEPTION(0x2a00, Trap_2a, unknown_exception, EXC_XFER_STD)
661 EXCEPTION(0x2b00, Trap_2b, unknown_exception, EXC_XFER_STD)
662 EXCEPTION(0x2c00, Trap_2c, unknown_exception, EXC_XFER_STD)
663 EXCEPTION(0x2d00, Trap_2d, unknown_exception, EXC_XFER_STD)
664 EXCEPTION(0x2e00, Trap_2e, unknown_exception, EXC_XFER_STD)
665 EXCEPTION(0x2f00, Trap_2f, unknown_exception, EXC_XFER_STD)
670 EXC_XFER_STD(0x200, machine_check_exception)
672 alignment_exception_tramp:
673 EXC_XFER_STD(0x600, alignment_exception)
675 handle_page_fault_tramp_1:
676 #ifdef CONFIG_VMAP_STACK
677 EXCEPTION_PROLOG_2 handle_dar_dsisr=1
682 handle_page_fault_tramp_2:
683 EXC_XFER_LITE(0x300, handle_page_fault)
685 #ifdef CONFIG_VMAP_STACK
686 .macro save_regs_thread thread
687 stw r0, THR0(\thread)
688 stw r3, THR3(\thread)
689 stw r4, THR4(\thread)
690 stw r5, THR5(\thread)
691 stw r6, THR6(\thread)
692 stw r8, THR8(\thread)
693 stw r9, THR9(\thread)
695 stw r0, THLR(\thread)
697 stw r0, THCTR(\thread)
700 .macro restore_regs_thread thread
701 lwz r0, THLR(\thread)
703 lwz r0, THCTR(\thread)
705 lwz r0, THR0(\thread)
706 lwz r3, THR3(\thread)
707 lwz r4, THR4(\thread)
708 lwz r5, THR5(\thread)
709 lwz r6, THR6(\thread)
710 lwz r8, THR8(\thread)
711 lwz r9, THR9(\thread)
720 rlwinm r3, r3, 32 - 15, _PAGE_RW /* DSISR_STORE -> _PAGE_RW */
722 mfspr r10, SPRN_SPRG_THREAD
723 restore_regs_thread r10
724 b .Lhash_page_dsi_cont
728 mfspr r10, SPRN_SPRG_THREAD
734 mfspr r10, SPRN_SPRG_THREAD
735 restore_regs_thread r10
737 b .Lhash_page_isi_cont
739 .globl fast_hash_page_return
740 fast_hash_page_return:
741 andis. r10, r9, SRR1_ISI_NOPT@h /* Set on ISI, cleared on DSI */
742 mfspr r10, SPRN_SPRG_THREAD
743 restore_regs_thread r10
749 mfspr r10, SPRN_SPRG_SCRATCH2
754 mfspr r11, SPRN_SPRG_SCRATCH1
755 mfspr r10, SPRN_SPRG_SCRATCH0
759 vmap_stack_overflow_exception
764 #ifdef CONFIG_ALTIVEC
766 bl load_up_altivec /* if from user, just load it up */
767 b fast_exception_return
768 #endif /* CONFIG_ALTIVEC */
769 1: addi r3,r1,STACK_FRAME_OVERHEAD
770 EXC_XFER_LITE(0xf20, altivec_unavailable_exception)
774 addi r3,r1,STACK_FRAME_OVERHEAD
775 EXC_XFER_STD(0xf00, performance_monitor_exception)
779 * This code is jumped to from the startup code to copy
780 * the kernel image to physical address PHYSICAL_START.
783 addis r9,r26,klimit@ha /* fetch klimit */
785 addis r25,r25,-KERNELBASE@h
786 lis r3,PHYSICAL_START@h /* Destination base address */
787 li r6,0 /* Destination offset */
788 li r5,0x4000 /* # bytes of memory to copy */
789 bl copy_and_flush /* copy the first 0x4000 bytes */
790 addi r0,r3,4f@l /* jump to the address of 4f */
791 mtctr r0 /* in copy and do the rest. */
792 bctr /* jump to the copy */
794 bl copy_and_flush /* copy the rest */
798 * Copy routine used to copy the kernel to start at physical address 0
799 * and flush and invalidate the caches as needed.
800 * r3 = dest addr, r4 = source addr, r5 = copy limit, r6 = start offset
801 * on exit, r3, r4, r5 are unchanged, r6 is updated to be >= r5.
803 _ENTRY(copy_and_flush)
806 4: li r0,L1_CACHE_BYTES/4
808 3: addi r6,r6,4 /* copy a cache line */
812 dcbst r6,r3 /* write it to memory */
814 icbi r6,r3 /* flush the icache line */
817 sync /* additional sync needed on g4 */
824 .globl __secondary_start_mpc86xx
825 __secondary_start_mpc86xx:
827 stw r3, __secondary_hold_acknowledge@l(0)
828 mr r24, r3 /* cpu # */
831 .globl __secondary_start_pmac_0
832 __secondary_start_pmac_0:
833 /* NB the entries for cpus 0, 1, 2 must each occupy 8 bytes. */
842 /* on powersurge, we come in here with IR=0 and DR=1, and DBAT 0
843 set to map the 0xf0000000 - 0xffffffff region */
845 rlwinm r0,r0,0,28,26 /* clear DR (0x10) */
849 .globl __secondary_start
851 /* Copy some CPU settings from CPU 0 */
852 bl __restore_cpu_setup
856 bl call_setup_cpu /* Call setup_cpu for this CPU */
860 /* get current's stack and current */
861 lis r2,secondary_current@ha
863 lwz r2,secondary_current@l(r2)
865 lwz r1,TASK_STACK(r1)
868 addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
873 /* load up the MMU */
874 bl load_segment_registers
877 /* ptr to phys current thread */
879 addi r4,r4,THREAD /* phys address of our thread_struct */
880 mtspr SPRN_SPRG_THREAD,r4
881 BEGIN_MMU_FTR_SECTION
882 lis r4, (swapper_pg_dir - PAGE_OFFSET)@h
883 ori r4, r4, (swapper_pg_dir - PAGE_OFFSET)@l
884 rlwinm r4, r4, 4, 0xffff01ff
886 END_MMU_FTR_SECTION_IFCLR(MMU_FTR_HPTE_TABLE)
888 /* enable MMU and jump to start_secondary */
890 lis r3,start_secondary@h
891 ori r3,r3,start_secondary@l
895 #endif /* CONFIG_SMP */
897 #ifdef CONFIG_KVM_BOOK3S_HANDLER
898 #include "../kvm/book3s_rmhandlers.S"
902 * Load stuff into the MMU. Intended to be called with
906 sync /* Force all PTE updates to finish */
908 tlbia /* Clear all TLB entries */
909 sync /* wait for tlbia/tlbie to finish */
910 TLBSYNC /* ... on all CPUs */
911 /* Load the SDR1 register (hash table base & size) */
912 lis r6, early_hash - PAGE_OFFSET@h
913 ori r6, r6, 3 /* 256kB table */
918 sync /* Force all PTE updates to finish */
920 tlbia /* Clear all TLB entries */
921 sync /* wait for tlbia/tlbie to finish */
922 TLBSYNC /* ... on all CPUs */
923 BEGIN_MMU_FTR_SECTION
924 /* Load the SDR1 register (hash table base & size) */
929 END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
931 /* Load the BAT registers with the values set up by MMU_init. */
939 BEGIN_MMU_FTR_SECTION
944 END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS)
947 _GLOBAL(load_segment_registers)
948 li r0, NUM_USER_SEGMENTS /* load up user segment register values */
949 mtctr r0 /* for context 0 */
950 li r3, 0 /* Kp = 0, Ks = 0, VSID = 0 */
951 #ifdef CONFIG_PPC_KUEP
952 oris r3, r3, SR_NX@h /* Set Nx */
954 #ifdef CONFIG_PPC_KUAP
955 oris r3, r3, SR_KS@h /* Set Ks */
959 addi r3, r3, 0x111 /* increment VSID */
960 addis r4, r4, 0x1000 /* address of next segment */
962 li r0, 16 - NUM_USER_SEGMENTS /* load up kernel segment registers */
963 mtctr r0 /* for context 0 */
964 rlwinm r3, r3, 0, ~SR_NX /* Nx = 0 */
965 rlwinm r3, r3, 0, ~SR_KS /* Ks = 0 */
966 oris r3, r3, SR_KP@h /* Kp = 1 */
968 addi r3, r3, 0x111 /* increment VSID */
969 addis r4, r4, 0x1000 /* address of next segment */
974 * This is where the main kernel code starts.
979 ori r2,r2,init_task@l
980 /* Set up for using our exception vectors */
981 /* ptr to phys current thread */
983 addi r4,r4,THREAD /* init task's THREAD */
984 mtspr SPRN_SPRG_THREAD,r4
985 BEGIN_MMU_FTR_SECTION
986 lis r4, (swapper_pg_dir - PAGE_OFFSET)@h
987 ori r4, r4, (swapper_pg_dir - PAGE_OFFSET)@l
988 rlwinm r4, r4, 4, 0xffff01ff
990 END_MMU_FTR_SECTION_IFCLR(MMU_FTR_HPTE_TABLE)
993 lis r1,init_thread_union@ha
994 addi r1,r1,init_thread_union@l
996 stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
998 * Do early platform-specific initialization,
999 * and set up the MMU.
1009 bl MMU_init_hw_patch
1012 * Go back to running unmapped so we can load up new values
1013 * for SDR1 (hash table pointer) and the segment registers
1014 * and change to using our exception vectors.
1019 li r3,MSR_KERNEL & ~(MSR_IR|MSR_DR)
1025 /* Load up the kernel context */
1028 #ifdef CONFIG_BDI_SWITCH
1029 /* Add helper information for the Abatron bdiGDB debugger.
1030 * We do this here because we know the mmu is disabled, and
1031 * will be enabled for real in just a few instructions.
1033 lis r5, abatron_pteptrs@h
1034 ori r5, r5, abatron_pteptrs@l
1035 stw r5, 0xf0(0) /* This much match your Abatron config */
1036 lis r6, swapper_pg_dir@h
1037 ori r6, r6, swapper_pg_dir@l
1040 #endif /* CONFIG_BDI_SWITCH */
1042 /* Now turn on the MMU for real! */
1044 lis r3,start_kernel@h
1045 ori r3,r3,start_kernel@l
1051 * void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next);
1053 * Set up the segment registers for a new context.
1055 _ENTRY(switch_mmu_context)
1056 lwz r3,MMCONTEXTID(r4)
1059 mulli r3,r3,897 /* multiply context by skew factor */
1060 rlwinm r3,r3,4,8,27 /* VSID = (context & 0xfffff) << 4 */
1061 #ifdef CONFIG_PPC_KUEP
1062 oris r3, r3, SR_NX@h /* Set Nx */
1064 #ifdef CONFIG_PPC_KUAP
1065 oris r3, r3, SR_KS@h /* Set Ks */
1067 li r0,NUM_USER_SEGMENTS
1070 #ifdef CONFIG_BDI_SWITCH
1071 /* Context switch the PTE pointer for the Abatron BDI2000.
1072 * The PGDIR is passed as second argument.
1075 lis r5, abatron_pteptrs@ha
1076 stw r4, abatron_pteptrs@l + 0x4(r5)
1078 BEGIN_MMU_FTR_SECTION
1079 #ifndef CONFIG_BDI_SWITCH
1083 rlwinm r4, r4, 4, 0xffff01ff
1085 END_MMU_FTR_SECTION_IFCLR(MMU_FTR_HPTE_TABLE)
1090 addi r3,r3,0x111 /* next VSID */
1091 rlwinm r3,r3,0,8,3 /* clear out any overflow from VSID field */
1092 addis r4,r4,0x1000 /* address of next segment */
1098 EMIT_BUG_ENTRY 4b,__FILE__,__LINE__,0
1100 EXPORT_SYMBOL(switch_mmu_context)
1103 * An undocumented "feature" of 604e requires that the v bit
1104 * be cleared before changing BAT values.
1106 * Also, newer IBM firmware does not clear bat3 and 4 so
1107 * this makes sure it's done.
1113 mtspr SPRN_DBAT0U,r10
1114 mtspr SPRN_DBAT0L,r10
1115 mtspr SPRN_DBAT1U,r10
1116 mtspr SPRN_DBAT1L,r10
1117 mtspr SPRN_DBAT2U,r10
1118 mtspr SPRN_DBAT2L,r10
1119 mtspr SPRN_DBAT3U,r10
1120 mtspr SPRN_DBAT3L,r10
1121 mtspr SPRN_IBAT0U,r10
1122 mtspr SPRN_IBAT0L,r10
1123 mtspr SPRN_IBAT1U,r10
1124 mtspr SPRN_IBAT1L,r10
1125 mtspr SPRN_IBAT2U,r10
1126 mtspr SPRN_IBAT2L,r10
1127 mtspr SPRN_IBAT3U,r10
1128 mtspr SPRN_IBAT3L,r10
1129 BEGIN_MMU_FTR_SECTION
1130 /* Here's a tweak: at this point, CPU setup have
1131 * not been called yet, so HIGH_BAT_EN may not be
1132 * set in HID0 for the 745x processors. However, it
1133 * seems that doesn't affect our ability to actually
1134 * write to these SPRs.
1136 mtspr SPRN_DBAT4U,r10
1137 mtspr SPRN_DBAT4L,r10
1138 mtspr SPRN_DBAT5U,r10
1139 mtspr SPRN_DBAT5L,r10
1140 mtspr SPRN_DBAT6U,r10
1141 mtspr SPRN_DBAT6L,r10
1142 mtspr SPRN_DBAT7U,r10
1143 mtspr SPRN_DBAT7L,r10
1144 mtspr SPRN_IBAT4U,r10
1145 mtspr SPRN_IBAT4L,r10
1146 mtspr SPRN_IBAT5U,r10
1147 mtspr SPRN_IBAT5L,r10
1148 mtspr SPRN_IBAT6U,r10
1149 mtspr SPRN_IBAT6L,r10
1150 mtspr SPRN_IBAT7U,r10
1151 mtspr SPRN_IBAT7L,r10
1152 END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS)
1161 li r3, MSR_KERNEL & ~(MSR_IR | MSR_DR)
1162 rlwinm r0, r6, 0, ~MSR_RI
1163 rlwinm r0, r0, 0, ~MSR_EE
1174 LOAD_BAT(0, r3, r4, r5)
1175 LOAD_BAT(1, r3, r4, r5)
1176 LOAD_BAT(2, r3, r4, r5)
1177 LOAD_BAT(3, r3, r4, r5)
1178 BEGIN_MMU_FTR_SECTION
1179 LOAD_BAT(4, r3, r4, r5)
1180 LOAD_BAT(5, r3, r4, r5)
1181 LOAD_BAT(6, r3, r4, r5)
1182 LOAD_BAT(7, r3, r4, r5)
1183 END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS)
1184 li r3, MSR_KERNEL & ~(MSR_IR | MSR_DR | MSR_RI)
1192 1: addic. r10, r10, -0x1000
1199 addi r4, r3, __after_mmu_off - _start
1201 andi. r0,r3,MSR_DR|MSR_IR /* MMU enabled? */
1211 /* We use one BAT to map up to 256M of RAM at _PAGE_OFFSET */
1213 lis r11,PAGE_OFFSET@h
1216 ori r8,r8,0x12 /* R/W access, M=1 */
1218 ori r8,r8,2 /* R/W access */
1219 #endif /* CONFIG_SMP */
1220 ori r11,r11,BL_256M<<2|0x2 /* set up BAT registers for 604 */
1222 mtspr SPRN_DBAT0L,r8 /* N.B. 6xx have valid */
1223 mtspr SPRN_DBAT0U,r11 /* bit in upper BAT register */
1224 mtspr SPRN_IBAT0L,r8
1225 mtspr SPRN_IBAT0U,r11
1229 #ifdef CONFIG_BOOTX_TEXT
1232 * setup the display bat prepared for us in prom.c
1237 addis r8,r3,disp_BAT@ha
1238 addi r8,r8,disp_BAT@l
1243 mtspr SPRN_DBAT3L,r8
1244 mtspr SPRN_DBAT3U,r11
1246 #endif /* CONFIG_BOOTX_TEXT */
1248 #ifdef CONFIG_PPC_EARLY_DEBUG_CPM
1252 mtspr SPRN_DBAT1L, r8
1255 ori r11, r11, (BL_1M << 2) | 2
1256 mtspr SPRN_DBAT1U, r11
1261 #ifdef CONFIG_PPC_EARLY_DEBUG_USBGECKO
1263 /* prepare a BAT for early io */
1264 #if defined(CONFIG_GAMECUBE)
1266 #elif defined(CONFIG_WII)
1269 #error Invalid platform for USB Gecko based early debugging.
1272 * The virtual address used must match the virtual address
1273 * associated to the fixmap entry FIX_EARLY_DEBUG_BASE.
1275 lis r11, 0xfffe /* top 128K */
1276 ori r8, r8, 0x002a /* uncached, guarded ,rw */
1277 ori r11, r11, 0x2 /* 128K, Vs=1, Vp=0 */
1278 mtspr SPRN_DBAT1L, r8
1279 mtspr SPRN_DBAT1U, r11
1284 /* Jump into the system reset for the rom.
1285 * We first disable the MMU, and then jump to the ROM reset address.
1287 * r3 is the board info structure, r4 is the location for starting.
1288 * I use this for building a small kernel that can load other kernels,
1289 * rather than trying to write or rely on a rom monitor that can tftp load.
1294 rlwinm r0,r0,0,17,15 /* clear MSR_EE in r0 */
1298 mfspr r11, SPRN_HID0
1300 ori r10,r10,HID0_ICE|HID0_DCE
1302 mtspr SPRN_HID0, r11
1304 li r5, MSR_ME|MSR_RI
1306 addis r6,r6,-KERNELBASE@h
1320 * We put a few things here that have to be page-aligned.
1321 * This stuff goes at the beginning of the data segment,
1322 * which is page-aligned.
1327 .globl empty_zero_page
1330 EXPORT_SYMBOL(empty_zero_page)
1332 .globl swapper_pg_dir
1334 .space PGD_TABLE_SIZE
1336 /* Room for two PTE pointers, usually the kernel and current user pointers
1337 * to their respective root page table.