2  *  arch/ppc64/kernel/entry.S
 
   5  *    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 system call entry code, context switch
 
  15  *  code, and exception/interrupt return code for PowerPC.
 
  17  *  This program is free software; you can redistribute it and/or
 
  18  *  modify it under the terms of the GNU General Public License
 
  19  *  as published by the Free Software Foundation; either version
 
  20  *  2 of the License, or (at your option) any later version.
 
  23 #include <linux/config.h>
 
  24 #include <linux/errno.h>
 
  25 #include <asm/unistd.h>
 
  26 #include <asm/processor.h>
 
  29 #include <asm/thread_info.h>
 
  30 #include <asm/ppc_asm.h>
 
  31 #include <asm/asm-offsets.h>
 
  32 #include <asm/cputable.h>
 
  34 #ifdef CONFIG_PPC_ISERIES
 
  35 #define DO_SOFT_DISABLE
 
  43         .tc .sys_call_table[TC],.sys_call_table
 
  45 /* This value is used to mark exception frames on the stack. */
 
  47         .tc     ID_72656773_68657265[TC],0x7265677368657265
 
  54         .globl system_call_common
 
  58         addi    r1,r1,-INT_FRAME_SIZE
 
  92         addi    r9,r1,STACK_FRAME_OVERHEAD
 
  93         ld      r11,exception_marker@toc(r2)
 
  94         std     r11,-16(r9)             /* "regshere" marker */
 
  95 #ifdef CONFIG_PPC_ISERIES
 
  96         /* Hack for handling interrupts when soft-enabling on iSeries */
 
  97         cmpdi   cr1,r0,0x5555           /* syscall 0x5555 */
 
  98         andi.   r10,r12,MSR_PR          /* from kernel */
 
  99         crand   4*cr0+eq,4*cr1+eq,4*cr0+eq
 
 100         beq     hardware_interrupt_entry
 
 101         lbz     r10,PACAPROCENABLED(r13)
 
 113         addi    r9,r1,STACK_FRAME_OVERHEAD
 
 115         clrrdi  r11,r1,THREAD_SHIFT
 
 117         andi.   r11,r10,_TIF_SYSCALL_T_OR_A
 
 119 syscall_dotrace_cont:
 
 120         cmpldi  0,r0,NR_syscalls
 
 123 system_call:                    /* label this so stack traces look sane */
 
 125  * Need to vector to 32 Bit or default sys_call_table here,
 
 126  * based on caller's run-mode / personality.
 
 128         ld      r11,.SYS_CALL_TABLE@toc(2)
 
 129         andi.   r10,r10,_TIF_32BIT
 
 131         addi    r11,r11,8       /* use 32-bit syscall entries */
 
 140         ldx     r10,r11,r0      /* Fetch system call handler [ptr] */
 
 142         bctrl                   /* Call handler */
 
 147         bl      .do_show_syscall_exit
 
 150         clrrdi  r12,r1,THREAD_SHIFT
 
 152         /* disable interrupts so current_thread_info()->flags can't change,
 
 153            and so that we don't get interrupted after loading SRR0/1. */
 
 163         andi.   r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
 
 164         bne-    syscall_exit_work
 
 170         stdcx.  r0,0,r1                 /* to clear the reservation */
 
 173         beq-    1f                      /* only restore r13 if */
 
 174         ld      r13,GPR13(r1)           /* returning to usermode */
 
 178         mtmsrd  r11,1                   /* clear MSR.RI */
 
 185         b       .       /* prevent speculative execution */
 
 188         oris    r5,r5,0x1000    /* Set SO bit in CR */
 
 193 /* Traced system call support */
 
 196         addi    r3,r1,STACK_FRAME_OVERHEAD
 
 197         bl      .do_syscall_trace_enter
 
 198         ld      r0,GPR0(r1)     /* Restore original registers */
 
 205         addi    r9,r1,STACK_FRAME_OVERHEAD
 
 206         clrrdi  r10,r1,THREAD_SHIFT
 
 208         b       syscall_dotrace_cont
 
 215         /* If TIF_RESTOREALL is set, don't scribble on either r3 or ccr.
 
 216          If TIF_NOERROR is set, just save r3 as it is. */
 
 218         andi.   r0,r9,_TIF_RESTOREALL
 
 222 0:      cmpld   r3,r11          /* r10 is -LAST_ERRNO */
 
 224         andi.   r0,r9,_TIF_NOERROR
 
 228         oris    r5,r5,0x1000    /* Set SO bit in CR */
 
 231 2:      andi.   r0,r9,(_TIF_PERSYSCALL_MASK)
 
 234         /* Clear per-syscall TIF flags if any are set.  */
 
 236         li      r11,_TIF_PERSYSCALL_MASK
 
 237         addi    r12,r12,TI_FLAGS
 
 242         subi    r12,r12,TI_FLAGS
 
 244 4:      /* Anything else left to do? */
 
 245         andi.   r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
 
 246         beq     .ret_from_except_lite
 
 248         /* Re-enable interrupts */
 
 254         addi    r3,r1,STACK_FRAME_OVERHEAD
 
 255         bl      .do_syscall_trace_leave
 
 258 /* Save non-volatile GPRs, if not already saved. */
 
 270  * The sigsuspend and rt_sigsuspend system calls can call do_signal
 
 271  * and thus put the process into the stopped state where we might
 
 272  * want to examine its user state with ptrace.  Therefore we need
 
 273  * to save all the nonvolatile registers (r14 - r31) before calling
 
 274  * the C code.  Similarly, fork, vfork and clone need the full
 
 275  * register state on the stack so that it can be copied to the child.
 
 293 _GLOBAL(ppc32_swapcontext)
 
 295         bl      .compat_sys_swapcontext
 
 298 _GLOBAL(ppc64_swapcontext)
 
 303 _GLOBAL(ret_from_fork)
 
 310  * This routine switches between two different tasks.  The process
 
 311  * state of one is saved on its kernel stack.  Then the state
 
 312  * of the other is restored from its kernel stack.  The memory
 
 313  * management hardware is updated to the second process's state.
 
 314  * Finally, we can return to the second process, via ret_from_except.
 
 315  * On entry, r3 points to the THREAD for the current task, r4
 
 316  * points to the THREAD for the new task.
 
 318  * Note: there are two ways to get to the "going out" portion
 
 319  * of this code; either by coming in via the entry (_switch)
 
 320  * or via "fork" which must set up an environment equivalent
 
 321  * to the "_switch" path.  If you change this you'll have to change
 
 322  * the fork code also.
 
 324  * The code which creates the new task context is in 'copy_thread'
 
 325  * in arch/ppc64/kernel/process.c
 
 331         stdu    r1,-SWITCH_FRAME_SIZE(r1)
 
 332         /* r3-r13 are caller saved -- Cort */
 
 335         mflr    r20             /* Return to switch caller */
 
 338 #ifdef CONFIG_ALTIVEC
 
 340         oris    r0,r0,MSR_VEC@h /* Disable altivec */
 
 341         mfspr   r24,SPRN_VRSAVE /* save vrsave register value */
 
 342         std     r24,THREAD_VRSAVE(r3)
 
 343 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
 
 344 #endif /* CONFIG_ALTIVEC */
 
 353         std     r1,KSP(r3)      /* Set old stack pointer */
 
 356         /* We need a sync somewhere here to make sure that if the
 
 357          * previous task gets rescheduled on another CPU, it sees all
 
 358          * stores it has performed on this one.
 
 361 #endif /* CONFIG_SMP */
 
 363         addi    r6,r4,-THREAD   /* Convert THREAD to 'current' */
 
 364         std     r6,PACACURRENT(r13)     /* Set new 'current' */
 
 366         ld      r8,KSP(r4)      /* new stack pointer */
 
 368         clrrdi  r6,r8,28        /* get its ESID */
 
 369         clrrdi  r9,r1,28        /* get current sp ESID */
 
 370         clrldi. r0,r6,2         /* is new ESID c00000000? */
 
 371         cmpd    cr1,r6,r9       /* or is new ESID the same as current ESID? */
 
 373         beq     2f              /* if yes, don't slbie it */
 
 375         /* Bolt in the new stack SLB entry */
 
 376         ld      r7,KSP_VSID(r4) /* Get new stack's VSID */
 
 377         oris    r0,r6,(SLB_ESID_V)@h
 
 378         ori     r0,r0,(SLB_NUM_BOLTED-1)@l
 
 380         slbie   r6              /* Workaround POWER5 < DD2.1 issue */
 
 385 END_FTR_SECTION_IFSET(CPU_FTR_SLB)
 
 386         clrrdi  r7,r8,THREAD_SHIFT      /* base of new stack */
 
 387         /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
 
 388            because we don't need to leave the 288-byte ABI gap at the
 
 389            top of the kernel stack. */
 
 390         addi    r7,r7,THREAD_SIZE-SWITCH_FRAME_SIZE
 
 392         mr      r1,r8           /* start using new stack pointer */
 
 393         std     r7,PACAKSAVE(r13)
 
 398 #ifdef CONFIG_ALTIVEC
 
 400         ld      r0,THREAD_VRSAVE(r4)
 
 401         mtspr   SPRN_VRSAVE,r0          /* if G4, restore VRSAVE reg */
 
 402 END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
 
 403 #endif /* CONFIG_ALTIVEC */
 
 405         /* r3-r13 are destroyed -- Cort */
 
 409         /* convert old thread to its task_struct for return value */
 
 411         ld      r7,_NIP(r1)     /* Return to _switch caller in new task */
 
 413         addi    r1,r1,SWITCH_FRAME_SIZE
 
 417 _GLOBAL(ret_from_except)
 
 420         bne     .ret_from_except_lite
 
 423 _GLOBAL(ret_from_except_lite)
 
 425          * Disable interrupts so that current_thread_info()->flags
 
 426          * can't change between when we test it and when we return
 
 427          * from the interrupt.
 
 429         mfmsr   r10             /* Get current interrupt state */
 
 430         rldicl  r9,r10,48,1     /* clear MSR_EE */
 
 432         mtmsrd  r9,1            /* Update machine state */
 
 434 #ifdef CONFIG_PREEMPT
 
 435         clrrdi  r9,r1,THREAD_SHIFT      /* current_thread_info() */
 
 436         li      r0,_TIF_NEED_RESCHED    /* bits to check */
 
 439         /* Move MSR_PR bit in r3 to _TIF_SIGPENDING position in r0 */
 
 440         rlwimi  r0,r3,32+TIF_SIGPENDING-MSR_PR_LG,_TIF_SIGPENDING
 
 441         and.    r0,r4,r0        /* check NEED_RESCHED and maybe SIGPENDING */
 
 444 #else /* !CONFIG_PREEMPT */
 
 445         ld      r3,_MSR(r1)     /* Returning to user mode? */
 
 447         beq     restore         /* if not, just restore regs and return */
 
 449         /* Check current_thread_info()->flags */
 
 450         clrrdi  r9,r1,THREAD_SHIFT
 
 452         andi.   r0,r4,_TIF_USER_WORK_MASK
 
 457 #ifdef CONFIG_PPC_ISERIES
 
 461         /* Check for pending interrupts (iSeries) */
 
 462         ld      r3,PACALPPACAPTR(r13)
 
 463         ld      r3,LPPACAANYINT(r3)
 
 465         beq+    4f                      /* skip do_IRQ if no interrupts */
 
 468         stb     r3,PACAPROCENABLED(r13) /* ensure we are soft-disabled */
 
 470         mtmsrd  r10                     /* hard-enable again */
 
 471         addi    r3,r1,STACK_FRAME_OVERHEAD
 
 473         b       .ret_from_except_lite           /* loop back and handle more */
 
 475 4:      stb     r5,PACAPROCENABLED(r13)
 
 485          * r13 is our per cpu area, only restore it if we are returning to
 
 500         stdcx.  r0,0,r1         /* to clear the reservation */
 
 522         b       .       /* prevent speculative execution */
 
 524 /* Note: this must change if we start using the TIF_NOTIFY_RESUME bit */
 
 526 #ifdef CONFIG_PREEMPT
 
 527         andi.   r0,r3,MSR_PR    /* Returning to user mode? */
 
 529         /* Check that preempt_count() == 0 and interrupts are enabled */
 
 530         lwz     r8,TI_PREEMPT(r9)
 
 532 #ifdef CONFIG_PPC_ISERIES
 
 538         crandc  eq,cr1*4+eq,eq
 
 540         /* here we are preempting the current task */
 
 542 #ifdef CONFIG_PPC_ISERIES
 
 544         stb     r0,PACAPROCENABLED(r13)
 
 547         mtmsrd  r10,1           /* reenable interrupts */
 
 550         clrrdi  r9,r1,THREAD_SHIFT
 
 551         rldicl  r10,r10,48,1    /* disable interrupts again */
 
 555         andi.   r0,r4,_TIF_NEED_RESCHED
 
 561         /* Enable interrupts */
 
 565         andi.   r0,r4,_TIF_NEED_RESCHED
 
 568         b       .ret_from_except_lite
 
 572         addi    r4,r1,STACK_FRAME_OVERHEAD
 
 577         addi    r3,r1,STACK_FRAME_OVERHEAD
 
 578         bl      .unrecoverable_exception
 
 581 #ifdef CONFIG_PPC_RTAS
 
 583  * On CHRP, the Run-Time Abstraction Services (RTAS) have to be
 
 584  * called with the MMU off.
 
 586  * In addition, we need to be in 32b mode, at least for now.
 
 588  * Note: r3 is an input parameter to rtas, so don't trash it...
 
 593         stdu    r1,-RTAS_FRAME_SIZE(r1) /* Save SP and create stack space. */
 
 595         /* Because RTAS is running in 32b mode, it clobbers the high order half
 
 596          * of all registers that it saves.  We therefore save those registers
 
 597          * RTAS might touch to the stack.  (r0, r3-r13 are caller saved)
 
 599         SAVE_GPR(2, r1)                 /* Save the TOC */
 
 600         SAVE_GPR(13, r1)                /* Save paca */
 
 601         SAVE_8GPRS(14, r1)              /* Save the non-volatiles */
 
 602         SAVE_10GPRS(22, r1)             /* ditto */
 
 619         /* There is no way it is acceptable to get here with interrupts enabled,
 
 620          * check it with the asm equivalent of WARN_ON
 
 625 .section __bug_table,"a"
 
 626         .llong  1b,__LINE__ + 0x1000000, 1f, 2f
 
 630 2:      .asciz "enter_rtas"
 
 633         /* Unfortunately, the stack pointer and the MSR are also clobbered,
 
 634          * so they are saved in the PACA which allows us to restore
 
 635          * our original state after RTAS returns.
 
 638         std     r6,PACASAVEDMSR(r13)
 
 640         /* Setup our real return addr */        
 
 641         LOAD_REG_ADDR(r4,.rtas_return_loc)
 
 642         clrldi  r4,r4,2                 /* convert to realmode address */
 
 646         ori     r0,r0,MSR_EE|MSR_SE|MSR_BE|MSR_RI
 
 650         rldicr  r9,r9,MSR_SF_LG,(63-MSR_SF_LG)
 
 651         ori     r9,r9,MSR_IR|MSR_DR|MSR_FE0|MSR_FE1|MSR_FP
 
 654         sync                            /* disable interrupts so SRR0/1 */
 
 655         mtmsrd  r0                      /* don't get trashed */
 
 657         LOAD_REG_ADDR(r4, rtas)
 
 658         ld      r5,RTASENTRY(r4)        /* get the rtas->entry value */
 
 659         ld      r4,RTASBASE(r4)         /* get the rtas->base value */
 
 664         b       .       /* prevent speculative execution */
 
 666 _STATIC(rtas_return_loc)
 
 667         /* relocation is off at this point */
 
 668         mfspr   r4,SPRN_SPRG3           /* Get PACA */
 
 669         clrldi  r4,r4,2                 /* convert to realmode address */
 
 677         ld      r1,PACAR1(r4)           /* Restore our SP */
 
 678         LOAD_REG_IMMEDIATE(r3,.rtas_restore_regs)
 
 679         ld      r4,PACASAVEDMSR(r4)     /* Restore our MSR */
 
 684         b       .       /* prevent speculative execution */
 
 686 _STATIC(rtas_restore_regs)
 
 687         /* relocation is on at this point */
 
 688         REST_GPR(2, r1)                 /* Restore the TOC */
 
 689         REST_GPR(13, r1)                /* Restore paca */
 
 690         REST_8GPRS(14, r1)              /* Restore the non-volatiles */
 
 691         REST_10GPRS(22, r1)             /* ditto */
 
 710         addi    r1,r1,RTAS_FRAME_SIZE   /* Unstack our frame */
 
 711         ld      r0,16(r1)               /* get return address */
 
 714         blr                             /* return to caller */
 
 716 #endif /* CONFIG_PPC_RTAS */
 
 718 #ifdef CONFIG_PPC_MULTIPLATFORM
 
 723         stdu    r1,-PROM_FRAME_SIZE(r1) /* Save SP and create stack space */
 
 725         /* Because PROM is running in 32b mode, it clobbers the high order half
 
 726          * of all registers that it saves.  We therefore save those registers
 
 727          * PROM might touch to the stack.  (r0, r3-r13 are caller saved)
 
 750         /* Get the PROM entrypoint */
 
 754         /* Switch MSR to 32 bits mode
 
 758         rldicr  r12,r12,MSR_SF_LG,(63-MSR_SF_LG)
 
 761         rldicr  r12,r12,MSR_ISF_LG,(63-MSR_ISF_LG)
 
 766         /* Restore arguments & enter PROM here... */
 
 770         /* Just make sure that r1 top 32 bits didn't get
 
 775         /* Restore the MSR (back to 64 bits) */
 
 780         /* Restore other registers */
 
 800         addi    r1,r1,PROM_FRAME_SIZE
 
 805 #endif  /* CONFIG_PPC_MULTIPLATFORM */