[PATCH] ppc64: use the merged syscall table
Stephen Rothwell
sfr at canb.auug.org.au
Wed Oct 26 16:12:53 EST 2005
This allows us to also use entry_64.S and setup_64.c from the merged
tree.
Signed-off-by: Stephen Rothwell <sfr at canb.auug.org.au>
---
arch/powerpc/kernel/Makefile | 8
arch/ppc64/Makefile | 1
arch/ppc64/kernel/Makefile | 2
arch/ppc64/kernel/entry.S | 845 ---------------------------
arch/ppc64/kernel/misc.S | 563 ------------------
arch/ppc64/kernel/setup.c | 1307 ------------------------------------------
6 files changed, 7 insertions(+), 2719 deletions(-)
delete mode 100644 arch/ppc64/kernel/entry.S
delete mode 100644 arch/ppc64/kernel/setup.c
--
Cheers,
Stephen Rothwell sfr at canb.auug.org.au
http://www.canb.auug.org.au/~sfr/
67f19b6ed6aca7158adcd696fa35bc8f755907dd
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -12,7 +12,8 @@ endif
obj-y := semaphore.o cputable.o ptrace.o syscalls.o \
signal_32.o pmc.o
-obj-$(CONFIG_PPC64) += binfmt_elf32.o sys_ppc32.o ptrace32.o
+obj-$(CONFIG_PPC64) += binfmt_elf32.o sys_ppc32.o ptrace32.o \
+ setup_64.o systbl.o
obj-$(CONFIG_ALTIVEC) += vecemu.o vector.o
obj-$(CONFIG_POWER4) += idle_power4.o
obj-$(CONFIG_PPC_OF) += of_device.o
@@ -31,9 +32,9 @@ extra-$(CONFIG_PPC_FPU) += fpu.o
extra-y += vmlinux.lds
obj-y += process.o init_task.o time.o \
- prom.o systbl.o traps.o
+ prom.o traps.o
obj-$(CONFIG_PPC32) += entry_32.o idle_6xx.o setup_32.o misc_32.o
-obj-$(CONFIG_PPC64) += setup_64.o misc_64.o
+obj-$(CONFIG_PPC64) += misc_64.o
obj-$(CONFIG_PPC_OF) += prom_init.o
obj-$(CONFIG_MODULES) += ppc_ksyms.o
obj-$(CONFIG_BOOTX_TEXT) += btext.o
@@ -47,6 +48,7 @@ else
# stuff used from here for ARCH=ppc or ARCH=ppc64
obj-$(CONFIG_PPC64) += traps.o process.o init_task.o time.o
+extra-$(CONFIG_PPC64) += entry_64.o
fpux-$(CONFIG_PPC32) += fpu.o
extra-$(CONFIG_PPC_FPU) += $(fpux-y)
diff --git a/arch/ppc64/Makefile b/arch/ppc64/Makefile
--- a/arch/ppc64/Makefile
+++ b/arch/ppc64/Makefile
@@ -80,6 +80,7 @@ endif
CFLAGS += $(call cc-option,-funit-at-a-time)
head-y := arch/ppc64/kernel/head.o
+head-y += arch/powerpc/kernel/entry_64.o
libs-y += arch/ppc64/lib/
core-y += arch/ppc64/kernel/ arch/powerpc/kernel/
diff --git a/arch/ppc64/kernel/Makefile b/arch/ppc64/kernel/Makefile
--- a/arch/ppc64/kernel/Makefile
+++ b/arch/ppc64/kernel/Makefile
@@ -7,7 +7,7 @@ ifneq ($(CONFIG_PPC_MERGE),y)
EXTRA_CFLAGS += -mno-minimal-toc
extra-y := head.o vmlinux.lds
-obj-y := setup.o entry.o misc.o prom.o
+obj-y := misc.o prom.o
endif
diff --git a/arch/ppc64/kernel/entry.S b/arch/ppc64/kernel/entry.S
deleted file mode 100644
--- a/arch/ppc64/kernel/entry.S
+++ /dev/null
@@ -1,845 +0,0 @@
-/*
- * arch/ppc64/kernel/entry.S
- *
- * PowerPC version
- * Copyright (C) 1995-1996 Gary Thomas (gdt at linuxppc.org)
- * Rewritten by Cort Dougan (cort at cs.nmt.edu) for PReP
- * Copyright (C) 1996 Cort Dougan <cort at cs.nmt.edu>
- * Adapted for Power Macintosh by Paul Mackerras.
- * Low-level exception handlers and MMU support
- * rewritten by Paul Mackerras.
- * Copyright (C) 1996 Paul Mackerras.
- * MPC8xx modifications Copyright (C) 1997 Dan Malek (dmalek at jlc.net).
- *
- * This file contains the system call entry code, context switch
- * code, and exception/interrupt return code for PowerPC.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#include <linux/config.h>
-#include <linux/errno.h>
-#include <asm/unistd.h>
-#include <asm/processor.h>
-#include <asm/page.h>
-#include <asm/mmu.h>
-#include <asm/thread_info.h>
-#include <asm/ppc_asm.h>
-#include <asm/asm-offsets.h>
-#include <asm/cputable.h>
-
-#ifdef CONFIG_PPC_ISERIES
-#define DO_SOFT_DISABLE
-#endif
-
-/*
- * System calls.
- */
- .section ".toc","aw"
-.SYS_CALL_TABLE:
- .tc .sys_call_table[TC],.sys_call_table
-
-.SYS_CALL_TABLE32:
- .tc .sys_call_table32[TC],.sys_call_table32
-
-/* This value is used to mark exception frames on the stack. */
-exception_marker:
- .tc ID_72656773_68657265[TC],0x7265677368657265
-
- .section ".text"
- .align 7
-
-#undef SHOW_SYSCALLS
-
- .globl system_call_common
-system_call_common:
- andi. r10,r12,MSR_PR
- mr r10,r1
- addi r1,r1,-INT_FRAME_SIZE
- beq- 1f
- ld r1,PACAKSAVE(r13)
-1: std r10,0(r1)
- std r11,_NIP(r1)
- std r12,_MSR(r1)
- std r0,GPR0(r1)
- std r10,GPR1(r1)
- std r2,GPR2(r1)
- std r3,GPR3(r1)
- std r4,GPR4(r1)
- std r5,GPR5(r1)
- std r6,GPR6(r1)
- std r7,GPR7(r1)
- std r8,GPR8(r1)
- li r11,0
- std r11,GPR9(r1)
- std r11,GPR10(r1)
- std r11,GPR11(r1)
- std r11,GPR12(r1)
- std r9,GPR13(r1)
- crclr so
- mfcr r9
- mflr r10
- li r11,0xc01
- std r9,_CCR(r1)
- std r10,_LINK(r1)
- std r11,_TRAP(r1)
- mfxer r9
- mfctr r10
- std r9,_XER(r1)
- std r10,_CTR(r1)
- std r3,ORIG_GPR3(r1)
- ld r2,PACATOC(r13)
- addi r9,r1,STACK_FRAME_OVERHEAD
- ld r11,exception_marker at toc(r2)
- std r11,-16(r9) /* "regshere" marker */
-#ifdef CONFIG_PPC_ISERIES
- /* Hack for handling interrupts when soft-enabling on iSeries */
- cmpdi cr1,r0,0x5555 /* syscall 0x5555 */
- andi. r10,r12,MSR_PR /* from kernel */
- crand 4*cr0+eq,4*cr1+eq,4*cr0+eq
- beq hardware_interrupt_entry
- lbz r10,PACAPROCENABLED(r13)
- std r10,SOFTE(r1)
-#endif
- mfmsr r11
- ori r11,r11,MSR_EE
- mtmsrd r11,1
-
-#ifdef SHOW_SYSCALLS
- bl .do_show_syscall
- REST_GPR(0,r1)
- REST_4GPRS(3,r1)
- REST_2GPRS(7,r1)
- addi r9,r1,STACK_FRAME_OVERHEAD
-#endif
- clrrdi r11,r1,THREAD_SHIFT
- li r12,0
- ld r10,TI_FLAGS(r11)
- stb r12,TI_SC_NOERR(r11)
- andi. r11,r10,_TIF_SYSCALL_T_OR_A
- bne- syscall_dotrace
-syscall_dotrace_cont:
- cmpldi 0,r0,NR_syscalls
- bge- syscall_enosys
-
-system_call: /* label this so stack traces look sane */
-/*
- * Need to vector to 32 Bit or default sys_call_table here,
- * based on caller's run-mode / personality.
- */
- ld r11,.SYS_CALL_TABLE at toc(2)
- andi. r10,r10,_TIF_32BIT
- beq 15f
- ld r11,.SYS_CALL_TABLE32 at toc(2)
- clrldi r3,r3,32
- clrldi r4,r4,32
- clrldi r5,r5,32
- clrldi r6,r6,32
- clrldi r7,r7,32
- clrldi r8,r8,32
-15:
- slwi r0,r0,3
- ldx r10,r11,r0 /* Fetch system call handler [ptr] */
- mtctr r10
- bctrl /* Call handler */
-
-syscall_exit:
-#ifdef SHOW_SYSCALLS
- std r3,GPR3(r1)
- bl .do_show_syscall_exit
- ld r3,GPR3(r1)
-#endif
- std r3,RESULT(r1)
- ld r5,_CCR(r1)
- li r10,-_LAST_ERRNO
- cmpld r3,r10
- clrrdi r12,r1,THREAD_SHIFT
- bge- syscall_error
-syscall_error_cont:
-
- /* check for syscall tracing or audit */
- ld r9,TI_FLAGS(r12)
- andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
- bne- syscall_exit_trace
-syscall_exit_trace_cont:
-
- /* disable interrupts so current_thread_info()->flags can't change,
- and so that we don't get interrupted after loading SRR0/1. */
- ld r8,_MSR(r1)
- andi. r10,r8,MSR_RI
- beq- unrecov_restore
- mfmsr r10
- rldicl r10,r10,48,1
- rotldi r10,r10,16
- mtmsrd r10,1
- ld r9,TI_FLAGS(r12)
- andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED)
- bne- syscall_exit_work
- ld r7,_NIP(r1)
- stdcx. r0,0,r1 /* to clear the reservation */
- andi. r6,r8,MSR_PR
- ld r4,_LINK(r1)
- beq- 1f /* only restore r13 if */
- ld r13,GPR13(r1) /* returning to usermode */
-1: ld r2,GPR2(r1)
- li r12,MSR_RI
- andc r10,r10,r12
- mtmsrd r10,1 /* clear MSR.RI */
- ld r1,GPR1(r1)
- mtlr r4
- mtcr r5
- mtspr SPRN_SRR0,r7
- mtspr SPRN_SRR1,r8
- rfid
- b . /* prevent speculative execution */
-
-syscall_enosys:
- li r3,-ENOSYS
- std r3,RESULT(r1)
- clrrdi r12,r1,THREAD_SHIFT
- ld r5,_CCR(r1)
-
-syscall_error:
- lbz r11,TI_SC_NOERR(r12)
- cmpwi 0,r11,0
- bne- syscall_error_cont
- neg r3,r3
- oris r5,r5,0x1000 /* Set SO bit in CR */
- std r5,_CCR(r1)
- b syscall_error_cont
-
-/* Traced system call support */
-syscall_dotrace:
- bl .save_nvgprs
- addi r3,r1,STACK_FRAME_OVERHEAD
- bl .do_syscall_trace_enter
- ld r0,GPR0(r1) /* Restore original registers */
- ld r3,GPR3(r1)
- ld r4,GPR4(r1)
- ld r5,GPR5(r1)
- ld r6,GPR6(r1)
- ld r7,GPR7(r1)
- ld r8,GPR8(r1)
- addi r9,r1,STACK_FRAME_OVERHEAD
- clrrdi r10,r1,THREAD_SHIFT
- ld r10,TI_FLAGS(r10)
- b syscall_dotrace_cont
-
-syscall_exit_trace:
- std r3,GPR3(r1)
- bl .save_nvgprs
- addi r3,r1,STACK_FRAME_OVERHEAD
- bl .do_syscall_trace_leave
- REST_NVGPRS(r1)
- ld r3,GPR3(r1)
- ld r5,_CCR(r1)
- clrrdi r12,r1,THREAD_SHIFT
- b syscall_exit_trace_cont
-
-/* Stuff to do on exit from a system call. */
-syscall_exit_work:
- std r3,GPR3(r1)
- std r5,_CCR(r1)
- b .ret_from_except_lite
-
-/* Save non-volatile GPRs, if not already saved. */
-_GLOBAL(save_nvgprs)
- ld r11,_TRAP(r1)
- andi. r0,r11,1
- beqlr-
- SAVE_NVGPRS(r1)
- clrrdi r0,r11,1
- std r0,_TRAP(r1)
- blr
-
-/*
- * The sigsuspend and rt_sigsuspend system calls can call do_signal
- * and thus put the process into the stopped state where we might
- * want to examine its user state with ptrace. Therefore we need
- * to save all the nonvolatile registers (r14 - r31) before calling
- * the C code. Similarly, fork, vfork and clone need the full
- * register state on the stack so that it can be copied to the child.
- */
-_GLOBAL(ppc32_sigsuspend)
- bl .save_nvgprs
- bl .compat_sys_sigsuspend
- b 70f
-
-_GLOBAL(ppc64_rt_sigsuspend)
- bl .save_nvgprs
- bl .sys_rt_sigsuspend
- b 70f
-
-_GLOBAL(ppc32_rt_sigsuspend)
- bl .save_nvgprs
- bl .compat_sys_rt_sigsuspend
-70: cmpdi 0,r3,0
- /* If it returned an error, we need to return via syscall_exit to set
- the SO bit in cr0 and potentially stop for ptrace. */
- bne syscall_exit
- /* If sigsuspend() returns zero, we are going into a signal handler. We
- may need to call audit_syscall_exit() to mark the exit from sigsuspend() */
-#ifdef CONFIG_AUDIT
- ld r3,PACACURRENT(r13)
- ld r4,AUDITCONTEXT(r3)
- cmpdi 0,r4,0
- beq .ret_from_except /* No audit_context: Leave immediately. */
- li r4, 2 /* AUDITSC_FAILURE */
- li r5,-4 /* It's always -EINTR */
- bl .audit_syscall_exit
-#endif
- b .ret_from_except
-
-_GLOBAL(ppc_fork)
- bl .save_nvgprs
- bl .sys_fork
- b syscall_exit
-
-_GLOBAL(ppc_vfork)
- bl .save_nvgprs
- bl .sys_vfork
- b syscall_exit
-
-_GLOBAL(ppc_clone)
- bl .save_nvgprs
- bl .sys_clone
- b syscall_exit
-
-_GLOBAL(ppc32_swapcontext)
- bl .save_nvgprs
- bl .compat_sys_swapcontext
- b 80f
-
-_GLOBAL(ppc64_swapcontext)
- bl .save_nvgprs
- bl .sys_swapcontext
- b 80f
-
-_GLOBAL(ppc32_sigreturn)
- bl .compat_sys_sigreturn
- b 80f
-
-_GLOBAL(ppc32_rt_sigreturn)
- bl .compat_sys_rt_sigreturn
- b 80f
-
-_GLOBAL(ppc64_rt_sigreturn)
- bl .sys_rt_sigreturn
-
-80: cmpdi 0,r3,0
- blt syscall_exit
- clrrdi r4,r1,THREAD_SHIFT
- ld r4,TI_FLAGS(r4)
- andi. r4,r4,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
- beq+ 81f
- addi r3,r1,STACK_FRAME_OVERHEAD
- bl .do_syscall_trace_leave
-81: b .ret_from_except
-
-_GLOBAL(ret_from_fork)
- bl .schedule_tail
- REST_NVGPRS(r1)
- li r3,0
- b syscall_exit
-
-/*
- * This routine switches between two different tasks. The process
- * state of one is saved on its kernel stack. Then the state
- * of the other is restored from its kernel stack. The memory
- * management hardware is updated to the second process's state.
- * Finally, we can return to the second process, via ret_from_except.
- * On entry, r3 points to the THREAD for the current task, r4
- * points to the THREAD for the new task.
- *
- * Note: there are two ways to get to the "going out" portion
- * of this code; either by coming in via the entry (_switch)
- * or via "fork" which must set up an environment equivalent
- * to the "_switch" path. If you change this you'll have to change
- * the fork code also.
- *
- * The code which creates the new task context is in 'copy_thread'
- * in arch/ppc64/kernel/process.c
- */
- .align 7
-_GLOBAL(_switch)
- mflr r0
- std r0,16(r1)
- stdu r1,-SWITCH_FRAME_SIZE(r1)
- /* r3-r13 are caller saved -- Cort */
- SAVE_8GPRS(14, r1)
- SAVE_10GPRS(22, r1)
- mflr r20 /* Return to switch caller */
- mfmsr r22
- li r0, MSR_FP
-#ifdef CONFIG_ALTIVEC
-BEGIN_FTR_SECTION
- oris r0,r0,MSR_VEC at h /* Disable altivec */
- mfspr r24,SPRN_VRSAVE /* save vrsave register value */
- std r24,THREAD_VRSAVE(r3)
-END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
-#endif /* CONFIG_ALTIVEC */
- and. r0,r0,r22
- beq+ 1f
- andc r22,r22,r0
- mtmsrd r22
- isync
-1: std r20,_NIP(r1)
- mfcr r23
- std r23,_CCR(r1)
- std r1,KSP(r3) /* Set old stack pointer */
-
-#ifdef CONFIG_SMP
- /* We need a sync somewhere here to make sure that if the
- * previous task gets rescheduled on another CPU, it sees all
- * stores it has performed on this one.
- */
- sync
-#endif /* CONFIG_SMP */
-
- addi r6,r4,-THREAD /* Convert THREAD to 'current' */
- std r6,PACACURRENT(r13) /* Set new 'current' */
-
- ld r8,KSP(r4) /* new stack pointer */
-BEGIN_FTR_SECTION
- clrrdi r6,r8,28 /* get its ESID */
- clrrdi r9,r1,28 /* get current sp ESID */
- clrldi. r0,r6,2 /* is new ESID c00000000? */
- cmpd cr1,r6,r9 /* or is new ESID the same as current ESID? */
- cror eq,4*cr1+eq,eq
- beq 2f /* if yes, don't slbie it */
-
- /* Bolt in the new stack SLB entry */
- ld r7,KSP_VSID(r4) /* Get new stack's VSID */
- oris r0,r6,(SLB_ESID_V)@h
- ori r0,r0,(SLB_NUM_BOLTED-1)@l
- slbie r6
- slbie r6 /* Workaround POWER5 < DD2.1 issue */
- slbmte r7,r0
- isync
-
-2:
-END_FTR_SECTION_IFSET(CPU_FTR_SLB)
- clrrdi r7,r8,THREAD_SHIFT /* base of new stack */
- /* Note: this uses SWITCH_FRAME_SIZE rather than INT_FRAME_SIZE
- because we don't need to leave the 288-byte ABI gap at the
- top of the kernel stack. */
- addi r7,r7,THREAD_SIZE-SWITCH_FRAME_SIZE
-
- mr r1,r8 /* start using new stack pointer */
- std r7,PACAKSAVE(r13)
-
- ld r6,_CCR(r1)
- mtcrf 0xFF,r6
-
-#ifdef CONFIG_ALTIVEC
-BEGIN_FTR_SECTION
- ld r0,THREAD_VRSAVE(r4)
- mtspr SPRN_VRSAVE,r0 /* if G4, restore VRSAVE reg */
-END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
-#endif /* CONFIG_ALTIVEC */
-
- /* r3-r13 are destroyed -- Cort */
- REST_8GPRS(14, r1)
- REST_10GPRS(22, r1)
-
- /* convert old thread to its task_struct for return value */
- addi r3,r3,-THREAD
- ld r7,_NIP(r1) /* Return to _switch caller in new task */
- mtlr r7
- addi r1,r1,SWITCH_FRAME_SIZE
- blr
-
- .align 7
-_GLOBAL(ret_from_except)
- ld r11,_TRAP(r1)
- andi. r0,r11,1
- bne .ret_from_except_lite
- REST_NVGPRS(r1)
-
-_GLOBAL(ret_from_except_lite)
- /*
- * Disable interrupts so that current_thread_info()->flags
- * can't change between when we test it and when we return
- * from the interrupt.
- */
- mfmsr r10 /* Get current interrupt state */
- rldicl r9,r10,48,1 /* clear MSR_EE */
- rotldi r9,r9,16
- mtmsrd r9,1 /* Update machine state */
-
-#ifdef CONFIG_PREEMPT
- clrrdi r9,r1,THREAD_SHIFT /* current_thread_info() */
- li r0,_TIF_NEED_RESCHED /* bits to check */
- ld r3,_MSR(r1)
- ld r4,TI_FLAGS(r9)
- /* Move MSR_PR bit in r3 to _TIF_SIGPENDING position in r0 */
- rlwimi r0,r3,32+TIF_SIGPENDING-MSR_PR_LG,_TIF_SIGPENDING
- and. r0,r4,r0 /* check NEED_RESCHED and maybe SIGPENDING */
- bne do_work
-
-#else /* !CONFIG_PREEMPT */
- ld r3,_MSR(r1) /* Returning to user mode? */
- andi. r3,r3,MSR_PR
- beq restore /* if not, just restore regs and return */
-
- /* Check current_thread_info()->flags */
- clrrdi r9,r1,THREAD_SHIFT
- ld r4,TI_FLAGS(r9)
- andi. r0,r4,_TIF_USER_WORK_MASK
- bne do_work
-#endif
-
-restore:
-#ifdef CONFIG_PPC_ISERIES
- ld r5,SOFTE(r1)
- cmpdi 0,r5,0
- beq 4f
- /* Check for pending interrupts (iSeries) */
- ld r3,PACALPPACA+LPPACAANYINT(r13)
- cmpdi r3,0
- beq+ 4f /* skip do_IRQ if no interrupts */
-
- li r3,0
- stb r3,PACAPROCENABLED(r13) /* ensure we are soft-disabled */
- ori r10,r10,MSR_EE
- mtmsrd r10 /* hard-enable again */
- addi r3,r1,STACK_FRAME_OVERHEAD
- bl .do_IRQ
- b .ret_from_except_lite /* loop back and handle more */
-
-4: stb r5,PACAPROCENABLED(r13)
-#endif
-
- ld r3,_MSR(r1)
- andi. r0,r3,MSR_RI
- beq- unrecov_restore
-
- andi. r0,r3,MSR_PR
-
- /*
- * r13 is our per cpu area, only restore it if we are returning to
- * userspace
- */
- beq 1f
- REST_GPR(13, r1)
-1:
- ld r3,_CTR(r1)
- ld r0,_LINK(r1)
- mtctr r3
- mtlr r0
- ld r3,_XER(r1)
- mtspr SPRN_XER,r3
-
- REST_8GPRS(5, r1)
-
- stdcx. r0,0,r1 /* to clear the reservation */
-
- mfmsr r0
- li r2, MSR_RI
- andc r0,r0,r2
- mtmsrd r0,1
-
- ld r0,_MSR(r1)
- mtspr SPRN_SRR1,r0
-
- ld r2,_CCR(r1)
- mtcrf 0xFF,r2
- ld r2,_NIP(r1)
- mtspr SPRN_SRR0,r2
-
- ld r0,GPR0(r1)
- ld r2,GPR2(r1)
- ld r3,GPR3(r1)
- ld r4,GPR4(r1)
- ld r1,GPR1(r1)
-
- rfid
- b . /* prevent speculative execution */
-
-/* Note: this must change if we start using the TIF_NOTIFY_RESUME bit */
-do_work:
-#ifdef CONFIG_PREEMPT
- andi. r0,r3,MSR_PR /* Returning to user mode? */
- bne user_work
- /* Check that preempt_count() == 0 and interrupts are enabled */
- lwz r8,TI_PREEMPT(r9)
- cmpwi cr1,r8,0
-#ifdef CONFIG_PPC_ISERIES
- ld r0,SOFTE(r1)
- cmpdi r0,0
-#else
- andi. r0,r3,MSR_EE
-#endif
- crandc eq,cr1*4+eq,eq
- bne restore
- /* here we are preempting the current task */
-1:
-#ifdef CONFIG_PPC_ISERIES
- li r0,1
- stb r0,PACAPROCENABLED(r13)
-#endif
- ori r10,r10,MSR_EE
- mtmsrd r10,1 /* reenable interrupts */
- bl .preempt_schedule
- mfmsr r10
- clrrdi r9,r1,THREAD_SHIFT
- rldicl r10,r10,48,1 /* disable interrupts again */
- rotldi r10,r10,16
- mtmsrd r10,1
- ld r4,TI_FLAGS(r9)
- andi. r0,r4,_TIF_NEED_RESCHED
- bne 1b
- b restore
-
-user_work:
-#endif
- /* Enable interrupts */
- ori r10,r10,MSR_EE
- mtmsrd r10,1
-
- andi. r0,r4,_TIF_NEED_RESCHED
- beq 1f
- bl .schedule
- b .ret_from_except_lite
-
-1: bl .save_nvgprs
- li r3,0
- addi r4,r1,STACK_FRAME_OVERHEAD
- bl .do_signal
- b .ret_from_except
-
-unrecov_restore:
- addi r3,r1,STACK_FRAME_OVERHEAD
- bl .unrecoverable_exception
- b unrecov_restore
-
-#ifdef CONFIG_PPC_RTAS
-/*
- * On CHRP, the Run-Time Abstraction Services (RTAS) have to be
- * called with the MMU off.
- *
- * In addition, we need to be in 32b mode, at least for now.
- *
- * Note: r3 is an input parameter to rtas, so don't trash it...
- */
-_GLOBAL(enter_rtas)
- mflr r0
- std r0,16(r1)
- stdu r1,-RTAS_FRAME_SIZE(r1) /* Save SP and create stack space. */
-
- /* Because RTAS is running in 32b mode, it clobbers the high order half
- * of all registers that it saves. We therefore save those registers
- * RTAS might touch to the stack. (r0, r3-r13 are caller saved)
- */
- SAVE_GPR(2, r1) /* Save the TOC */
- SAVE_GPR(13, r1) /* Save paca */
- SAVE_8GPRS(14, r1) /* Save the non-volatiles */
- SAVE_10GPRS(22, r1) /* ditto */
-
- mfcr r4
- std r4,_CCR(r1)
- mfctr r5
- std r5,_CTR(r1)
- mfspr r6,SPRN_XER
- std r6,_XER(r1)
- mfdar r7
- std r7,_DAR(r1)
- mfdsisr r8
- std r8,_DSISR(r1)
- mfsrr0 r9
- std r9,_SRR0(r1)
- mfsrr1 r10
- std r10,_SRR1(r1)
-
- /* There is no way it is acceptable to get here with interrupts enabled,
- * check it with the asm equivalent of WARN_ON
- */
- mfmsr r6
- andi. r0,r6,MSR_EE
-1: tdnei r0,0
-.section __bug_table,"a"
- .llong 1b,__LINE__ + 0x1000000, 1f, 2f
-.previous
-.section .rodata,"a"
-1: .asciz __FILE__
-2: .asciz "enter_rtas"
-.previous
-
- /* Unfortunately, the stack pointer and the MSR are also clobbered,
- * so they are saved in the PACA which allows us to restore
- * our original state after RTAS returns.
- */
- std r1,PACAR1(r13)
- std r6,PACASAVEDMSR(r13)
-
- /* Setup our real return addr */
- SET_REG_TO_LABEL(r4,.rtas_return_loc)
- SET_REG_TO_CONST(r9,KERNELBASE)
- sub r4,r4,r9
- mtlr r4
-
- li r0,0
- ori r0,r0,MSR_EE|MSR_SE|MSR_BE|MSR_RI
- andc r0,r6,r0
-
- li r9,1
- rldicr r9,r9,MSR_SF_LG,(63-MSR_SF_LG)
- ori r9,r9,MSR_IR|MSR_DR|MSR_FE0|MSR_FE1|MSR_FP
- andc r6,r0,r9
- ori r6,r6,MSR_RI
- sync /* disable interrupts so SRR0/1 */
- mtmsrd r0 /* don't get trashed */
-
- SET_REG_TO_LABEL(r4,rtas)
- ld r5,RTASENTRY(r4) /* get the rtas->entry value */
- ld r4,RTASBASE(r4) /* get the rtas->base value */
-
- mtspr SPRN_SRR0,r5
- mtspr SPRN_SRR1,r6
- rfid
- b . /* prevent speculative execution */
-
-_STATIC(rtas_return_loc)
- /* relocation is off at this point */
- mfspr r4,SPRN_SPRG3 /* Get PACA */
- SET_REG_TO_CONST(r5, KERNELBASE)
- sub r4,r4,r5 /* RELOC the PACA base pointer */
-
- mfmsr r6
- li r0,MSR_RI
- andc r6,r6,r0
- sync
- mtmsrd r6
-
- ld r1,PACAR1(r4) /* Restore our SP */
- LOADADDR(r3,.rtas_restore_regs)
- ld r4,PACASAVEDMSR(r4) /* Restore our MSR */
-
- mtspr SPRN_SRR0,r3
- mtspr SPRN_SRR1,r4
- rfid
- b . /* prevent speculative execution */
-
-_STATIC(rtas_restore_regs)
- /* relocation is on at this point */
- REST_GPR(2, r1) /* Restore the TOC */
- REST_GPR(13, r1) /* Restore paca */
- REST_8GPRS(14, r1) /* Restore the non-volatiles */
- REST_10GPRS(22, r1) /* ditto */
-
- mfspr r13,SPRN_SPRG3
-
- ld r4,_CCR(r1)
- mtcr r4
- ld r5,_CTR(r1)
- mtctr r5
- ld r6,_XER(r1)
- mtspr SPRN_XER,r6
- ld r7,_DAR(r1)
- mtdar r7
- ld r8,_DSISR(r1)
- mtdsisr r8
- ld r9,_SRR0(r1)
- mtsrr0 r9
- ld r10,_SRR1(r1)
- mtsrr1 r10
-
- addi r1,r1,RTAS_FRAME_SIZE /* Unstack our frame */
- ld r0,16(r1) /* get return address */
-
- mtlr r0
- blr /* return to caller */
-
-#endif /* CONFIG_PPC_RTAS */
-
-#ifdef CONFIG_PPC_MULTIPLATFORM
-
-_GLOBAL(enter_prom)
- mflr r0
- std r0,16(r1)
- stdu r1,-PROM_FRAME_SIZE(r1) /* Save SP and create stack space */
-
- /* Because PROM is running in 32b mode, it clobbers the high order half
- * of all registers that it saves. We therefore save those registers
- * PROM might touch to the stack. (r0, r3-r13 are caller saved)
- */
- SAVE_8GPRS(2, r1)
- SAVE_GPR(13, r1)
- SAVE_8GPRS(14, r1)
- SAVE_10GPRS(22, r1)
- mfcr r4
- std r4,_CCR(r1)
- mfctr r5
- std r5,_CTR(r1)
- mfspr r6,SPRN_XER
- std r6,_XER(r1)
- mfdar r7
- std r7,_DAR(r1)
- mfdsisr r8
- std r8,_DSISR(r1)
- mfsrr0 r9
- std r9,_SRR0(r1)
- mfsrr1 r10
- std r10,_SRR1(r1)
- mfmsr r11
- std r11,_MSR(r1)
-
- /* Get the PROM entrypoint */
- ld r0,GPR4(r1)
- mtlr r0
-
- /* Switch MSR to 32 bits mode
- */
- mfmsr r11
- li r12,1
- rldicr r12,r12,MSR_SF_LG,(63-MSR_SF_LG)
- andc r11,r11,r12
- li r12,1
- rldicr r12,r12,MSR_ISF_LG,(63-MSR_ISF_LG)
- andc r11,r11,r12
- mtmsrd r11
- isync
-
- /* Restore arguments & enter PROM here... */
- ld r3,GPR3(r1)
- blrl
-
- /* Just make sure that r1 top 32 bits didn't get
- * corrupt by OF
- */
- rldicl r1,r1,0,32
-
- /* Restore the MSR (back to 64 bits) */
- ld r0,_MSR(r1)
- mtmsrd r0
- isync
-
- /* Restore other registers */
- REST_GPR(2, r1)
- REST_GPR(13, r1)
- REST_8GPRS(14, r1)
- REST_10GPRS(22, r1)
- ld r4,_CCR(r1)
- mtcr r4
- ld r5,_CTR(r1)
- mtctr r5
- ld r6,_XER(r1)
- mtspr SPRN_XER,r6
- ld r7,_DAR(r1)
- mtdar r7
- ld r8,_DSISR(r1)
- mtdsisr r8
- ld r9,_SRR0(r1)
- mtsrr0 r9
- ld r10,_SRR1(r1)
- mtsrr1 r10
-
- addi r1,r1,PROM_FRAME_SIZE
- ld r0,16(r1)
- mtlr r0
- blr
-
-#endif /* CONFIG_PPC_MULTIPLATFORM */
diff --git a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S
--- a/arch/ppc64/kernel/misc.S
+++ b/arch/ppc64/kernel/misc.S
@@ -918,566 +918,3 @@ _GLOBAL(kexec_sequence)
li r5,0
blr /* image->start(physid, image->start, 0); */
#endif /* CONFIG_KEXEC */
-
-/* Why isn't this a) automatic, b) written in 'C'? */
- .balign 8
-_GLOBAL(sys_call_table32)
- .llong .sys_restart_syscall /* 0 */
- .llong .sys_exit
- .llong .ppc_fork
- .llong .sys_read
- .llong .sys_write
- .llong .compat_sys_open /* 5 */
- .llong .sys_close
- .llong .compat_sys_waitpid
- .llong .compat_sys_creat
- .llong .sys_link
- .llong .sys_unlink /* 10 */
- .llong .compat_sys_execve
- .llong .sys_chdir
- .llong .compat_sys_time
- .llong .sys_mknod
- .llong .sys_chmod /* 15 */
- .llong .sys_lchown
- .llong .sys_ni_syscall /* old break syscall */
- .llong .sys_ni_syscall /* old stat syscall */
- .llong .ppc32_lseek
- .llong .sys_getpid /* 20 */
- .llong .compat_sys_mount
- .llong .sys_oldumount
- .llong .sys_setuid
- .llong .sys_getuid
- .llong .compat_sys_stime /* 25 */
- .llong .compat_sys_ptrace
- .llong .sys_alarm
- .llong .sys_ni_syscall /* old fstat syscall */
- .llong .compat_sys_pause
- .llong .compat_sys_utime /* 30 */
- .llong .sys_ni_syscall /* old stty syscall */
- .llong .sys_ni_syscall /* old gtty syscall */
- .llong .compat_sys_access
- .llong .compat_sys_nice
- .llong .sys_ni_syscall /* 35 - old ftime syscall */
- .llong .sys_sync
- .llong .compat_sys_kill
- .llong .sys_rename
- .llong .compat_sys_mkdir
- .llong .sys_rmdir /* 40 */
- .llong .sys_dup
- .llong .sys_pipe
- .llong .compat_sys_times
- .llong .sys_ni_syscall /* old prof syscall */
- .llong .sys_brk /* 45 */
- .llong .sys_setgid
- .llong .sys_getgid
- .llong .sys_signal
- .llong .sys_geteuid
- .llong .sys_getegid /* 50 */
- .llong .sys_acct
- .llong .sys_umount
- .llong .sys_ni_syscall /* old lock syscall */
- .llong .compat_sys_ioctl
- .llong .compat_sys_fcntl /* 55 */
- .llong .sys_ni_syscall /* old mpx syscall */
- .llong .compat_sys_setpgid
- .llong .sys_ni_syscall /* old ulimit syscall */
- .llong .sys_olduname
- .llong .compat_sys_umask /* 60 */
- .llong .sys_chroot
- .llong .sys_ustat
- .llong .sys_dup2
- .llong .sys_getppid
- .llong .sys_getpgrp /* 65 */
- .llong .sys_setsid
- .llong .compat_sys_sigaction
- .llong .sys_sgetmask
- .llong .compat_sys_ssetmask
- .llong .sys_setreuid /* 70 */
- .llong .sys_setregid
- .llong .ppc32_sigsuspend
- .llong .compat_sys_sigpending
- .llong .compat_sys_sethostname
- .llong .compat_sys_setrlimit /* 75 */
- .llong .compat_sys_old_getrlimit
- .llong .compat_sys_getrusage
- .llong .compat_sys_gettimeofday
- .llong .compat_sys_settimeofday
- .llong .compat_sys_getgroups /* 80 */
- .llong .compat_sys_setgroups
- .llong .sys_ni_syscall /* old select syscall */
- .llong .sys_symlink
- .llong .sys_ni_syscall /* old lstat syscall */
- .llong .compat_sys_readlink /* 85 */
- .llong .sys_uselib
- .llong .sys_swapon
- .llong .sys_reboot
- .llong .old32_readdir
- .llong .sys_mmap /* 90 */
- .llong .sys_munmap
- .llong .sys_truncate
- .llong .sys_ftruncate
- .llong .sys_fchmod
- .llong .sys_fchown /* 95 */
- .llong .compat_sys_getpriority
- .llong .compat_sys_setpriority
- .llong .sys_ni_syscall /* old profil syscall */
- .llong .compat_sys_statfs
- .llong .compat_sys_fstatfs /* 100 */
- .llong .sys_ni_syscall /* old ioperm syscall */
- .llong .compat_sys_socketcall
- .llong .compat_sys_syslog
- .llong .compat_sys_setitimer
- .llong .compat_sys_getitimer /* 105 */
- .llong .compat_sys_newstat
- .llong .compat_sys_newlstat
- .llong .compat_sys_newfstat
- .llong .sys_uname
- .llong .sys_ni_syscall /* 110 old iopl syscall */
- .llong .sys_vhangup
- .llong .sys_ni_syscall /* old idle syscall */
- .llong .sys_ni_syscall /* old vm86 syscall */
- .llong .compat_sys_wait4
- .llong .sys_swapoff /* 115 */
- .llong .compat_sys_sysinfo
- .llong .sys32_ipc
- .llong .sys_fsync
- .llong .ppc32_sigreturn
- .llong .ppc_clone /* 120 */
- .llong .compat_sys_setdomainname
- .llong .ppc_newuname
- .llong .sys_ni_syscall /* old modify_ldt syscall */
- .llong .compat_sys_adjtimex
- .llong .sys_mprotect /* 125 */
- .llong .compat_sys_sigprocmask
- .llong .sys_ni_syscall /* old create_module syscall */
- .llong .sys_init_module
- .llong .sys_delete_module
- .llong .sys_ni_syscall /* 130 old get_kernel_syms syscall */
- .llong .sys_quotactl
- .llong .compat_sys_getpgid
- .llong .sys_fchdir
- .llong .sys_bdflush
- .llong .compat_sys_sysfs /* 135 */
- .llong .ppc64_personality
- .llong .sys_ni_syscall /* for afs_syscall */
- .llong .sys_setfsuid
- .llong .sys_setfsgid
- .llong .sys_llseek /* 140 */
- .llong .compat_sys_getdents
- .llong .ppc32_select
- .llong .sys_flock
- .llong .sys_msync
- .llong .compat_sys_readv /* 145 */
- .llong .compat_sys_writev
- .llong .compat_sys_getsid
- .llong .sys_fdatasync
- .llong .compat_sys_sysctl
- .llong .sys_mlock /* 150 */
- .llong .sys_munlock
- .llong .sys_mlockall
- .llong .sys_munlockall
- .llong .compat_sys_sched_setparam
- .llong .compat_sys_sched_getparam /* 155 */
- .llong .compat_sys_sched_setscheduler
- .llong .compat_sys_sched_getscheduler
- .llong .sys_sched_yield
- .llong .compat_sys_sched_get_priority_max
- .llong .compat_sys_sched_get_priority_min /* 160 */
- .llong .compat_sys_sched_rr_get_interval
- .llong .compat_sys_nanosleep
- .llong .sys_mremap
- .llong .sys_setresuid
- .llong .sys_getresuid /* 165 */
- .llong .sys_ni_syscall /* old query_module syscall */
- .llong .sys_poll
- .llong .compat_sys_nfsservctl
- .llong .sys_setresgid
- .llong .sys_getresgid /* 170 */
- .llong .compat_sys_prctl
- .llong .ppc32_rt_sigreturn
- .llong .compat_sys_rt_sigaction
- .llong .compat_sys_rt_sigprocmask
- .llong .compat_sys_rt_sigpending /* 175 */
- .llong .compat_sys_rt_sigtimedwait
- .llong .compat_sys_rt_sigqueueinfo
- .llong .ppc32_rt_sigsuspend
- .llong .compat_sys_pread64
- .llong .compat_sys_pwrite64 /* 180 */
- .llong .sys_chown
- .llong .sys_getcwd
- .llong .sys_capget
- .llong .sys_capset
- .llong .compat_sys_sigaltstack /* 185 */
- .llong .compat_sys_sendfile
- .llong .sys_ni_syscall /* reserved for streams1 */
- .llong .sys_ni_syscall /* reserved for streams2 */
- .llong .ppc_vfork
- .llong .compat_sys_getrlimit /* 190 */
- .llong .compat_sys_readahead
- .llong .compat_sys_mmap2
- .llong .compat_sys_truncate64
- .llong .compat_sys_ftruncate64
- .llong .sys_stat64 /* 195 */
- .llong .sys_lstat64
- .llong .sys_fstat64
- .llong .compat_sys_pciconfig_read
- .llong .compat_sys_pciconfig_write
- .llong .compat_sys_pciconfig_iobase /* 200 - pciconfig_iobase */
- .llong .sys_ni_syscall /* reserved for MacOnLinux */
- .llong .sys_getdents64
- .llong .sys_pivot_root
- .llong .compat_sys_fcntl64
- .llong .sys_madvise /* 205 */
- .llong .sys_mincore
- .llong .sys_gettid
- .llong .sys_tkill
- .llong .sys_setxattr
- .llong .sys_lsetxattr /* 210 */
- .llong .sys_fsetxattr
- .llong .sys_getxattr
- .llong .sys_lgetxattr
- .llong .sys_fgetxattr
- .llong .sys_listxattr /* 215 */
- .llong .sys_llistxattr
- .llong .sys_flistxattr
- .llong .sys_removexattr
- .llong .sys_lremovexattr
- .llong .sys_fremovexattr /* 220 */
- .llong .compat_sys_futex
- .llong .compat_sys_sched_setaffinity
- .llong .compat_sys_sched_getaffinity
- .llong .sys_ni_syscall
- .llong .sys_ni_syscall /* 225 - reserved for tux */
- .llong .compat_sys_sendfile64
- .llong .compat_sys_io_setup
- .llong .sys_io_destroy
- .llong .compat_sys_io_getevents
- .llong .compat_sys_io_submit
- .llong .sys_io_cancel
- .llong .sys_set_tid_address
- .llong .ppc32_fadvise64
- .llong .sys_exit_group
- .llong .ppc32_lookup_dcookie /* 235 */
- .llong .sys_epoll_create
- .llong .sys_epoll_ctl
- .llong .sys_epoll_wait
- .llong .sys_remap_file_pages
- .llong .ppc32_timer_create /* 240 */
- .llong .compat_sys_timer_settime
- .llong .compat_sys_timer_gettime
- .llong .sys_timer_getoverrun
- .llong .sys_timer_delete
- .llong .compat_sys_clock_settime/* 245 */
- .llong .compat_sys_clock_gettime
- .llong .compat_sys_clock_getres
- .llong .compat_sys_clock_nanosleep
- .llong .ppc32_swapcontext
- .llong .compat_sys_tgkill /* 250 */
- .llong .compat_sys_utimes
- .llong .compat_sys_statfs64
- .llong .compat_sys_fstatfs64
- .llong .ppc_fadvise64_64 /* 32bit only fadvise64_64 */
- .llong .ppc_rtas /* 255 */
- .llong .sys_ni_syscall /* 256 reserved for sys_debug_setcontext */
- .llong .sys_ni_syscall /* 257 reserved for vserver */
- .llong .sys_ni_syscall /* 258 reserved for new sys_remap_file_pages */
- .llong .compat_sys_mbind
- .llong .compat_sys_get_mempolicy /* 260 */
- .llong .compat_sys_set_mempolicy
- .llong .compat_sys_mq_open
- .llong .sys_mq_unlink
- .llong .compat_sys_mq_timedsend
- .llong .compat_sys_mq_timedreceive /* 265 */
- .llong .compat_sys_mq_notify
- .llong .compat_sys_mq_getsetattr
- .llong .compat_sys_kexec_load
- .llong .compat_sys_add_key
- .llong .compat_sys_request_key /* 270 */
- .llong .compat_sys_keyctl
- .llong .compat_sys_waitid
- .llong .compat_sys_ioprio_set
- .llong .compat_sys_ioprio_get
- .llong .sys_inotify_init /* 275 */
- .llong .sys_inotify_add_watch
- .llong .sys_inotify_rm_watch
-
- .balign 8
-_GLOBAL(sys_call_table)
- .llong .sys_restart_syscall /* 0 */
- .llong .sys_exit
- .llong .ppc_fork
- .llong .sys_read
- .llong .sys_write
- .llong .sys_open /* 5 */
- .llong .sys_close
- .llong .sys_waitpid
- .llong .sys_creat
- .llong .sys_link
- .llong .sys_unlink /* 10 */
- .llong .sys_execve
- .llong .sys_chdir
- .llong .sys64_time
- .llong .sys_mknod
- .llong .sys_chmod /* 15 */
- .llong .sys_lchown
- .llong .sys_ni_syscall /* old break syscall */
- .llong .sys_ni_syscall /* old stat syscall */
- .llong .sys_lseek
- .llong .sys_getpid /* 20 */
- .llong .sys_mount
- .llong .sys_ni_syscall /* old umount syscall */
- .llong .sys_setuid
- .llong .sys_getuid
- .llong .sys_stime /* 25 */
- .llong .sys_ptrace
- .llong .sys_alarm
- .llong .sys_ni_syscall /* old fstat syscall */
- .llong .sys_pause
- .llong .sys_utime /* 30 */
- .llong .sys_ni_syscall /* old stty syscall */
- .llong .sys_ni_syscall /* old gtty syscall */
- .llong .sys_access
- .llong .sys_nice
- .llong .sys_ni_syscall /* 35 - old ftime syscall */
- .llong .sys_sync
- .llong .sys_kill
- .llong .sys_rename
- .llong .sys_mkdir
- .llong .sys_rmdir /* 40 */
- .llong .sys_dup
- .llong .sys_pipe
- .llong .sys_times
- .llong .sys_ni_syscall /* old prof syscall */
- .llong .sys_brk /* 45 */
- .llong .sys_setgid
- .llong .sys_getgid
- .llong .sys_signal
- .llong .sys_geteuid
- .llong .sys_getegid /* 50 */
- .llong .sys_acct
- .llong .sys_umount
- .llong .sys_ni_syscall /* old lock syscall */
- .llong .sys_ioctl
- .llong .sys_fcntl /* 55 */
- .llong .sys_ni_syscall /* old mpx syscall */
- .llong .sys_setpgid
- .llong .sys_ni_syscall /* old ulimit syscall */
- .llong .sys_ni_syscall /* old uname syscall */
- .llong .sys_umask /* 60 */
- .llong .sys_chroot
- .llong .sys_ustat
- .llong .sys_dup2
- .llong .sys_getppid
- .llong .sys_getpgrp /* 65 */
- .llong .sys_setsid
- .llong .sys_ni_syscall
- .llong .sys_sgetmask
- .llong .sys_ssetmask
- .llong .sys_setreuid /* 70 */
- .llong .sys_setregid
- .llong .sys_ni_syscall
- .llong .sys_ni_syscall
- .llong .sys_sethostname
- .llong .sys_setrlimit /* 75 */
- .llong .sys_ni_syscall /* old getrlimit syscall */
- .llong .sys_getrusage
- .llong .sys_gettimeofday
- .llong .sys_settimeofday
- .llong .sys_getgroups /* 80 */
- .llong .sys_setgroups
- .llong .sys_ni_syscall /* old select syscall */
- .llong .sys_symlink
- .llong .sys_ni_syscall /* old lstat syscall */
- .llong .sys_readlink /* 85 */
- .llong .sys_uselib
- .llong .sys_swapon
- .llong .sys_reboot
- .llong .sys_ni_syscall /* old readdir syscall */
- .llong .sys_mmap /* 90 */
- .llong .sys_munmap
- .llong .sys_truncate
- .llong .sys_ftruncate
- .llong .sys_fchmod
- .llong .sys_fchown /* 95 */
- .llong .sys_getpriority
- .llong .sys_setpriority
- .llong .sys_ni_syscall /* old profil syscall holder */
- .llong .sys_statfs
- .llong .sys_fstatfs /* 100 */
- .llong .sys_ni_syscall /* old ioperm syscall */
- .llong .sys_socketcall
- .llong .sys_syslog
- .llong .sys_setitimer
- .llong .sys_getitimer /* 105 */
- .llong .sys_newstat
- .llong .sys_newlstat
- .llong .sys_newfstat
- .llong .sys_ni_syscall /* old uname syscall */
- .llong .sys_ni_syscall /* 110 old iopl syscall */
- .llong .sys_vhangup
- .llong .sys_ni_syscall /* old idle syscall */
- .llong .sys_ni_syscall /* old vm86 syscall */
- .llong .sys_wait4
- .llong .sys_swapoff /* 115 */
- .llong .sys_sysinfo
- .llong .sys_ipc
- .llong .sys_fsync
- .llong .sys_ni_syscall
- .llong .ppc_clone /* 120 */
- .llong .sys_setdomainname
- .llong .ppc_newuname
- .llong .sys_ni_syscall /* old modify_ldt syscall */
- .llong .sys_adjtimex
- .llong .sys_mprotect /* 125 */
- .llong .sys_ni_syscall
- .llong .sys_ni_syscall /* old create_module syscall */
- .llong .sys_init_module
- .llong .sys_delete_module
- .llong .sys_ni_syscall /* 130 old get_kernel_syms syscall */
- .llong .sys_quotactl
- .llong .sys_getpgid
- .llong .sys_fchdir
- .llong .sys_bdflush
- .llong .sys_sysfs /* 135 */
- .llong .ppc64_personality
- .llong .sys_ni_syscall /* for afs_syscall */
- .llong .sys_setfsuid
- .llong .sys_setfsgid
- .llong .sys_llseek /* 140 */
- .llong .sys_getdents
- .llong .sys_select
- .llong .sys_flock
- .llong .sys_msync
- .llong .sys_readv /* 145 */
- .llong .sys_writev
- .llong .sys_getsid
- .llong .sys_fdatasync
- .llong .sys_sysctl
- .llong .sys_mlock /* 150 */
- .llong .sys_munlock
- .llong .sys_mlockall
- .llong .sys_munlockall
- .llong .sys_sched_setparam
- .llong .sys_sched_getparam /* 155 */
- .llong .sys_sched_setscheduler
- .llong .sys_sched_getscheduler
- .llong .sys_sched_yield
- .llong .sys_sched_get_priority_max
- .llong .sys_sched_get_priority_min /* 160 */
- .llong .sys_sched_rr_get_interval
- .llong .sys_nanosleep
- .llong .sys_mremap
- .llong .sys_setresuid
- .llong .sys_getresuid /* 165 */
- .llong .sys_ni_syscall /* old query_module syscall */
- .llong .sys_poll
- .llong .sys_nfsservctl
- .llong .sys_setresgid
- .llong .sys_getresgid /* 170 */
- .llong .sys_prctl
- .llong .ppc64_rt_sigreturn
- .llong .sys_rt_sigaction
- .llong .sys_rt_sigprocmask
- .llong .sys_rt_sigpending /* 175 */
- .llong .sys_rt_sigtimedwait
- .llong .sys_rt_sigqueueinfo
- .llong .ppc64_rt_sigsuspend
- .llong .sys_pread64
- .llong .sys_pwrite64 /* 180 */
- .llong .sys_chown
- .llong .sys_getcwd
- .llong .sys_capget
- .llong .sys_capset
- .llong .sys_sigaltstack /* 185 */
- .llong .sys_sendfile64
- .llong .sys_ni_syscall /* reserved for streams1 */
- .llong .sys_ni_syscall /* reserved for streams2 */
- .llong .ppc_vfork
- .llong .sys_getrlimit /* 190 */
- .llong .sys_readahead
- .llong .sys_ni_syscall /* 32bit only mmap2 */
- .llong .sys_ni_syscall /* 32bit only truncate64 */
- .llong .sys_ni_syscall /* 32bit only ftruncate64 */
- .llong .sys_ni_syscall /* 195 - 32bit only stat64 */
- .llong .sys_ni_syscall /* 32bit only lstat64 */
- .llong .sys_ni_syscall /* 32bit only fstat64 */
- .llong .sys_pciconfig_read
- .llong .sys_pciconfig_write
- .llong .sys_pciconfig_iobase /* 200 - pciconfig_iobase */
- .llong .sys_ni_syscall /* reserved for MacOnLinux */
- .llong .sys_getdents64
- .llong .sys_pivot_root
- .llong .sys_ni_syscall /* 32bit only fcntl64 */
- .llong .sys_madvise /* 205 */
- .llong .sys_mincore
- .llong .sys_gettid
- .llong .sys_tkill
- .llong .sys_setxattr
- .llong .sys_lsetxattr /* 210 */
- .llong .sys_fsetxattr
- .llong .sys_getxattr
- .llong .sys_lgetxattr
- .llong .sys_fgetxattr
- .llong .sys_listxattr /* 215 */
- .llong .sys_llistxattr
- .llong .sys_flistxattr
- .llong .sys_removexattr
- .llong .sys_lremovexattr
- .llong .sys_fremovexattr /* 220 */
- .llong .sys_futex
- .llong .sys_sched_setaffinity
- .llong .sys_sched_getaffinity
- .llong .sys_ni_syscall
- .llong .sys_ni_syscall /* 225 - reserved for tux */
- .llong .sys_ni_syscall /* 32bit only sendfile64 */
- .llong .sys_io_setup
- .llong .sys_io_destroy
- .llong .sys_io_getevents
- .llong .sys_io_submit /* 230 */
- .llong .sys_io_cancel
- .llong .sys_set_tid_address
- .llong .sys_fadvise64
- .llong .sys_exit_group
- .llong .sys_lookup_dcookie /* 235 */
- .llong .sys_epoll_create
- .llong .sys_epoll_ctl
- .llong .sys_epoll_wait
- .llong .sys_remap_file_pages
- .llong .sys_timer_create /* 240 */
- .llong .sys_timer_settime
- .llong .sys_timer_gettime
- .llong .sys_timer_getoverrun
- .llong .sys_timer_delete
- .llong .sys_clock_settime /* 245 */
- .llong .sys_clock_gettime
- .llong .sys_clock_getres
- .llong .sys_clock_nanosleep
- .llong .ppc64_swapcontext
- .llong .sys_tgkill /* 250 */
- .llong .sys_utimes
- .llong .sys_statfs64
- .llong .sys_fstatfs64
- .llong .sys_ni_syscall /* 32bit only fadvise64_64 */
- .llong .ppc_rtas /* 255 */
- .llong .sys_ni_syscall /* 256 reserved for sys_debug_setcontext */
- .llong .sys_ni_syscall /* 257 reserved for vserver */
- .llong .sys_ni_syscall /* 258 reserved for new sys_remap_file_pages */
- .llong .sys_mbind
- .llong .sys_get_mempolicy /* 260 */
- .llong .sys_set_mempolicy
- .llong .sys_mq_open
- .llong .sys_mq_unlink
- .llong .sys_mq_timedsend
- .llong .sys_mq_timedreceive /* 265 */
- .llong .sys_mq_notify
- .llong .sys_mq_getsetattr
- .llong .sys_kexec_load
- .llong .sys_add_key
- .llong .sys_request_key /* 270 */
- .llong .sys_keyctl
- .llong .sys_waitid
- .llong .sys_ioprio_set
- .llong .sys_ioprio_get
- .llong .sys_inotify_init /* 275 */
- .llong .sys_inotify_add_watch
- .llong .sys_inotify_rm_watch
diff --git a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c
deleted file mode 100644
--- a/arch/ppc64/kernel/setup.c
+++ /dev/null
@@ -1,1307 +0,0 @@
-/*
- *
- * Common boot and setup code.
- *
- * Copyright (C) 2001 PPC64 Team, IBM Corp
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
-
-#undef DEBUG
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/sched.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/reboot.h>
-#include <linux/delay.h>
-#include <linux/initrd.h>
-#include <linux/ide.h>
-#include <linux/seq_file.h>
-#include <linux/ioport.h>
-#include <linux/console.h>
-#include <linux/utsname.h>
-#include <linux/tty.h>
-#include <linux/root_dev.h>
-#include <linux/notifier.h>
-#include <linux/cpu.h>
-#include <linux/unistd.h>
-#include <linux/serial.h>
-#include <linux/serial_8250.h>
-#include <asm/io.h>
-#include <asm/prom.h>
-#include <asm/processor.h>
-#include <asm/pgtable.h>
-#include <asm/bootinfo.h>
-#include <asm/smp.h>
-#include <asm/elf.h>
-#include <asm/machdep.h>
-#include <asm/paca.h>
-#include <asm/ppcdebug.h>
-#include <asm/time.h>
-#include <asm/cputable.h>
-#include <asm/sections.h>
-#include <asm/btext.h>
-#include <asm/nvram.h>
-#include <asm/setup.h>
-#include <asm/system.h>
-#include <asm/rtas.h>
-#include <asm/iommu.h>
-#include <asm/serial.h>
-#include <asm/cache.h>
-#include <asm/page.h>
-#include <asm/mmu.h>
-#include <asm/lmb.h>
-#include <asm/iSeries/ItLpNaca.h>
-#include <asm/firmware.h>
-
-#ifdef DEBUG
-#define DBG(fmt...) udbg_printf(fmt)
-#else
-#define DBG(fmt...)
-#endif
-
-/*
- * Here are some early debugging facilities. You can enable one
- * but your kernel will not boot on anything else if you do so
- */
-
-/* This one is for use on LPAR machines that support an HVC console
- * on vterm 0
- */
-extern void udbg_init_debug_lpar(void);
-/* This one is for use on Apple G5 machines
- */
-extern void udbg_init_pmac_realmode(void);
-/* That's RTAS panel debug */
-extern void call_rtas_display_status_delay(unsigned char c);
-/* Here's maple real mode debug */
-extern void udbg_init_maple_realmode(void);
-
-#define EARLY_DEBUG_INIT() do {} while(0)
-
-#if 0
-#define EARLY_DEBUG_INIT() udbg_init_debug_lpar()
-#define EARLY_DEBUG_INIT() udbg_init_maple_realmode()
-#define EARLY_DEBUG_INIT() udbg_init_pmac_realmode()
-#define EARLY_DEBUG_INIT() \
- do { udbg_putc = call_rtas_display_status_delay; } while(0)
-#endif
-
-/* extern void *stab; */
-extern unsigned long klimit;
-
-extern void mm_init_ppc64(void);
-extern void stab_initialize(unsigned long stab);
-extern void htab_initialize(void);
-extern void early_init_devtree(void *flat_dt);
-extern void unflatten_device_tree(void);
-
-extern void smp_release_cpus(void);
-
-int have_of = 1;
-int boot_cpuid = 0;
-int boot_cpuid_phys = 0;
-dev_t boot_dev;
-u64 ppc64_pft_size;
-
-struct ppc64_caches ppc64_caches;
-EXPORT_SYMBOL_GPL(ppc64_caches);
-
-/*
- * These are used in binfmt_elf.c to put aux entries on the stack
- * for each elf executable being started.
- */
-int dcache_bsize;
-int icache_bsize;
-int ucache_bsize;
-
-/* The main machine-dep calls structure
- */
-struct machdep_calls ppc_md;
-EXPORT_SYMBOL(ppc_md);
-
-#ifdef CONFIG_MAGIC_SYSRQ
-unsigned long SYSRQ_KEY;
-#endif /* CONFIG_MAGIC_SYSRQ */
-
-
-static int ppc64_panic_event(struct notifier_block *, unsigned long, void *);
-static struct notifier_block ppc64_panic_block = {
- .notifier_call = ppc64_panic_event,
- .priority = INT_MIN /* may not return; must be done last */
-};
-
-/*
- * Perhaps we can put the pmac screen_info[] here
- * on pmac as well so we don't need the ifdef's.
- * Until we get multiple-console support in here
- * that is. -- Cort
- * Maybe tie it to serial consoles, since this is really what
- * these processors use on existing boards. -- Dan
- */
-struct screen_info screen_info = {
- .orig_x = 0,
- .orig_y = 25,
- .orig_video_cols = 80,
- .orig_video_lines = 25,
- .orig_video_isVGA = 1,
- .orig_video_points = 16
-};
-
-#ifdef CONFIG_SMP
-
-static int smt_enabled_cmdline;
-
-/* Look for ibm,smt-enabled OF option */
-static void check_smt_enabled(void)
-{
- struct device_node *dn;
- char *smt_option;
-
- /* Allow the command line to overrule the OF option */
- if (smt_enabled_cmdline)
- return;
-
- dn = of_find_node_by_path("/options");
-
- if (dn) {
- smt_option = (char *)get_property(dn, "ibm,smt-enabled", NULL);
-
- if (smt_option) {
- if (!strcmp(smt_option, "on"))
- smt_enabled_at_boot = 1;
- else if (!strcmp(smt_option, "off"))
- smt_enabled_at_boot = 0;
- }
- }
-}
-
-/* Look for smt-enabled= cmdline option */
-static int __init early_smt_enabled(char *p)
-{
- smt_enabled_cmdline = 1;
-
- if (!p)
- return 0;
-
- if (!strcmp(p, "on") || !strcmp(p, "1"))
- smt_enabled_at_boot = 1;
- else if (!strcmp(p, "off") || !strcmp(p, "0"))
- smt_enabled_at_boot = 0;
-
- return 0;
-}
-early_param("smt-enabled", early_smt_enabled);
-
-/**
- * setup_cpu_maps - initialize the following cpu maps:
- * cpu_possible_map
- * cpu_present_map
- * cpu_sibling_map
- *
- * Having the possible map set up early allows us to restrict allocations
- * of things like irqstacks to num_possible_cpus() rather than NR_CPUS.
- *
- * We do not initialize the online map here; cpus set their own bits in
- * cpu_online_map as they come up.
- *
- * This function is valid only for Open Firmware systems. finish_device_tree
- * must be called before using this.
- *
- * While we're here, we may as well set the "physical" cpu ids in the paca.
- */
-static void __init setup_cpu_maps(void)
-{
- struct device_node *dn = NULL;
- int cpu = 0;
- int swap_cpuid = 0;
-
- check_smt_enabled();
-
- while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
- u32 *intserv;
- int j, len = sizeof(u32), nthreads;
-
- intserv = (u32 *)get_property(dn, "ibm,ppc-interrupt-server#s",
- &len);
- if (!intserv)
- intserv = (u32 *)get_property(dn, "reg", NULL);
-
- nthreads = len / sizeof(u32);
-
- for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
- cpu_set(cpu, cpu_present_map);
- set_hard_smp_processor_id(cpu, intserv[j]);
-
- if (intserv[j] == boot_cpuid_phys)
- swap_cpuid = cpu;
- cpu_set(cpu, cpu_possible_map);
- cpu++;
- }
- }
-
- /* Swap CPU id 0 with boot_cpuid_phys, so we can always assume that
- * boot cpu is logical 0.
- */
- if (boot_cpuid_phys != get_hard_smp_processor_id(0)) {
- u32 tmp;
- tmp = get_hard_smp_processor_id(0);
- set_hard_smp_processor_id(0, boot_cpuid_phys);
- set_hard_smp_processor_id(swap_cpuid, tmp);
- }
-
- /*
- * On pSeries LPAR, we need to know how many cpus
- * could possibly be added to this partition.
- */
- if (systemcfg->platform == PLATFORM_PSERIES_LPAR &&
- (dn = of_find_node_by_path("/rtas"))) {
- int num_addr_cell, num_size_cell, maxcpus;
- unsigned int *ireg;
-
- num_addr_cell = prom_n_addr_cells(dn);
- num_size_cell = prom_n_size_cells(dn);
-
- ireg = (unsigned int *)
- get_property(dn, "ibm,lrdr-capacity", NULL);
-
- if (!ireg)
- goto out;
-
- maxcpus = ireg[num_addr_cell + num_size_cell];
-
- /* Double maxcpus for processors which have SMT capability */
- if (cpu_has_feature(CPU_FTR_SMT))
- maxcpus *= 2;
-
- if (maxcpus > NR_CPUS) {
- printk(KERN_WARNING
- "Partition configured for %d cpus, "
- "operating system maximum is %d.\n",
- maxcpus, NR_CPUS);
- maxcpus = NR_CPUS;
- } else
- printk(KERN_INFO "Partition configured for %d cpus.\n",
- maxcpus);
-
- for (cpu = 0; cpu < maxcpus; cpu++)
- cpu_set(cpu, cpu_possible_map);
- out:
- of_node_put(dn);
- }
-
- /*
- * Do the sibling map; assume only two threads per processor.
- */
- for_each_cpu(cpu) {
- cpu_set(cpu, cpu_sibling_map[cpu]);
- if (cpu_has_feature(CPU_FTR_SMT))
- cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]);
- }
-
- systemcfg->processorCount = num_present_cpus();
-}
-#endif /* CONFIG_SMP */
-
-extern struct machdep_calls pSeries_md;
-extern struct machdep_calls pmac_md;
-extern struct machdep_calls maple_md;
-extern struct machdep_calls bpa_md;
-extern struct machdep_calls iseries_md;
-
-/* Ultimately, stuff them in an elf section like initcalls... */
-static struct machdep_calls __initdata *machines[] = {
-#ifdef CONFIG_PPC_PSERIES
- &pSeries_md,
-#endif /* CONFIG_PPC_PSERIES */
-#ifdef CONFIG_PPC_PMAC
- &pmac_md,
-#endif /* CONFIG_PPC_PMAC */
-#ifdef CONFIG_PPC_MAPLE
- &maple_md,
-#endif /* CONFIG_PPC_MAPLE */
-#ifdef CONFIG_PPC_BPA
- &bpa_md,
-#endif
-#ifdef CONFIG_PPC_ISERIES
- &iseries_md,
-#endif
- NULL
-};
-
-/*
- * Early initialization entry point. This is called by head.S
- * with MMU translation disabled. We rely on the "feature" of
- * the CPU that ignores the top 2 bits of the address in real
- * mode so we can access kernel globals normally provided we
- * only toy with things in the RMO region. From here, we do
- * some early parsing of the device-tree to setup out LMB
- * data structures, and allocate & initialize the hash table
- * and segment tables so we can start running with translation
- * enabled.
- *
- * It is this function which will call the probe() callback of
- * the various platform types and copy the matching one to the
- * global ppc_md structure. Your platform can eventually do
- * some very early initializations from the probe() routine, but
- * this is not recommended, be very careful as, for example, the
- * device-tree is not accessible via normal means at this point.
- */
-
-void __init early_setup(unsigned long dt_ptr)
-{
- struct paca_struct *lpaca = get_paca();
- static struct machdep_calls **mach;
-
- /*
- * Enable early debugging if any specified (see top of
- * this file)
- */
- EARLY_DEBUG_INIT();
-
- DBG(" -> early_setup()\n");
-
- /*
- * Fill the default DBG level (do we want to keep
- * that old mecanism around forever ?)
- */
- ppcdbg_initialize();
-
- /*
- * Do early initializations using the flattened device
- * tree, like retreiving the physical memory map or
- * calculating/retreiving the hash table size
- */
- early_init_devtree(__va(dt_ptr));
-
- /*
- * Iterate all ppc_md structures until we find the proper
- * one for the current machine type
- */
- DBG("Probing machine type for platform %x...\n",
- systemcfg->platform);
-
- for (mach = machines; *mach; mach++) {
- if ((*mach)->probe(systemcfg->platform))
- break;
- }
- /* What can we do if we didn't find ? */
- if (*mach == NULL) {
- DBG("No suitable machine found !\n");
- for (;;);
- }
- ppc_md = **mach;
-
- DBG("Found, Initializing memory management...\n");
-
- /*
- * Initialize stab / SLB management
- */
- if (!firmware_has_feature(FW_FEATURE_ISERIES))
- stab_initialize(lpaca->stab_real);
-
- /*
- * Initialize the MMU Hash table and create the linear mapping
- * of memory
- */
- htab_initialize();
-
- DBG(" <- early_setup()\n");
-}
-
-
-/*
- * Initialize some remaining members of the ppc64_caches and systemcfg structures
- * (at least until we get rid of them completely). This is mostly some
- * cache informations about the CPU that will be used by cache flush
- * routines and/or provided to userland
- */
-static void __init initialize_cache_info(void)
-{
- struct device_node *np;
- unsigned long num_cpus = 0;
-
- DBG(" -> initialize_cache_info()\n");
-
- for (np = NULL; (np = of_find_node_by_type(np, "cpu"));) {
- num_cpus += 1;
-
- /* We're assuming *all* of the CPUs have the same
- * d-cache and i-cache sizes... -Peter
- */
-
- if ( num_cpus == 1 ) {
- u32 *sizep, *lsizep;
- u32 size, lsize;
- const char *dc, *ic;
-
- /* Then read cache informations */
- if (systemcfg->platform == PLATFORM_POWERMAC) {
- dc = "d-cache-block-size";
- ic = "i-cache-block-size";
- } else {
- dc = "d-cache-line-size";
- ic = "i-cache-line-size";
- }
-
- size = 0;
- lsize = cur_cpu_spec->dcache_bsize;
- sizep = (u32 *)get_property(np, "d-cache-size", NULL);
- if (sizep != NULL)
- size = *sizep;
- lsizep = (u32 *) get_property(np, dc, NULL);
- if (lsizep != NULL)
- lsize = *lsizep;
- if (sizep == 0 || lsizep == 0)
- DBG("Argh, can't find dcache properties ! "
- "sizep: %p, lsizep: %p\n", sizep, lsizep);
-
- systemcfg->dcache_size = ppc64_caches.dsize = size;
- systemcfg->dcache_line_size =
- ppc64_caches.dline_size = lsize;
- ppc64_caches.log_dline_size = __ilog2(lsize);
- ppc64_caches.dlines_per_page = PAGE_SIZE / lsize;
-
- size = 0;
- lsize = cur_cpu_spec->icache_bsize;
- sizep = (u32 *)get_property(np, "i-cache-size", NULL);
- if (sizep != NULL)
- size = *sizep;
- lsizep = (u32 *)get_property(np, ic, NULL);
- if (lsizep != NULL)
- lsize = *lsizep;
- if (sizep == 0 || lsizep == 0)
- DBG("Argh, can't find icache properties ! "
- "sizep: %p, lsizep: %p\n", sizep, lsizep);
-
- systemcfg->icache_size = ppc64_caches.isize = size;
- systemcfg->icache_line_size =
- ppc64_caches.iline_size = lsize;
- ppc64_caches.log_iline_size = __ilog2(lsize);
- ppc64_caches.ilines_per_page = PAGE_SIZE / lsize;
- }
- }
-
- /* Add an eye catcher and the systemcfg layout version number */
- strcpy(systemcfg->eye_catcher, "SYSTEMCFG:PPC64");
- systemcfg->version.major = SYSTEMCFG_MAJOR;
- systemcfg->version.minor = SYSTEMCFG_MINOR;
- systemcfg->processor = mfspr(SPRN_PVR);
-
- DBG(" <- initialize_cache_info()\n");
-}
-
-static void __init check_for_initrd(void)
-{
-#ifdef CONFIG_BLK_DEV_INITRD
- u64 *prop;
-
- DBG(" -> check_for_initrd()\n");
-
- if (of_chosen) {
- prop = (u64 *)get_property(of_chosen,
- "linux,initrd-start", NULL);
- if (prop != NULL) {
- initrd_start = (unsigned long)__va(*prop);
- prop = (u64 *)get_property(of_chosen,
- "linux,initrd-end", NULL);
- if (prop != NULL) {
- initrd_end = (unsigned long)__va(*prop);
- initrd_below_start_ok = 1;
- } else
- initrd_start = 0;
- }
- }
-
- /* If we were passed an initrd, set the ROOT_DEV properly if the values
- * look sensible. If not, clear initrd reference.
- */
- if (initrd_start >= KERNELBASE && initrd_end >= KERNELBASE &&
- initrd_end > initrd_start)
- ROOT_DEV = Root_RAM0;
- else
- initrd_start = initrd_end = 0;
-
- if (initrd_start)
- printk("Found initrd at 0x%lx:0x%lx\n", initrd_start, initrd_end);
-
- DBG(" <- check_for_initrd()\n");
-#endif /* CONFIG_BLK_DEV_INITRD */
-}
-
-/*
- * Do some initial setup of the system. The parameters are those which
- * were passed in from the bootloader.
- */
-void __init setup_system(void)
-{
- DBG(" -> setup_system()\n");
-
- /*
- * Unflatten the device-tree passed by prom_init or kexec
- */
- unflatten_device_tree();
-
- /*
- * Fill the ppc64_caches & systemcfg structures with informations
- * retreived from the device-tree. Need to be called before
- * finish_device_tree() since the later requires some of the
- * informations filled up here to properly parse the interrupt
- * tree.
- * It also sets up the cache line sizes which allows to call
- * routines like flush_icache_range (used by the hash init
- * later on).
- */
- initialize_cache_info();
-
-#ifdef CONFIG_PPC_RTAS
- /*
- * Initialize RTAS if available
- */
- rtas_initialize();
-#endif /* CONFIG_PPC_RTAS */
-
- /*
- * Check if we have an initrd provided via the device-tree
- */
- check_for_initrd();
-
- /*
- * Do some platform specific early initializations, that includes
- * setting up the hash table pointers. It also sets up some interrupt-mapping
- * related options that will be used by finish_device_tree()
- */
- ppc_md.init_early();
-
- /*
- * "Finish" the device-tree, that is do the actual parsing of
- * some of the properties like the interrupt map
- */
- finish_device_tree();
-
-#ifdef CONFIG_BOOTX_TEXT
- init_boot_display();
-#endif
-
- /*
- * Initialize xmon
- */
-#ifdef CONFIG_XMON_DEFAULT
- xmon_init(1);
-#endif
- /*
- * Register early console
- */
- register_early_udbg_console();
-
- /* Save unparsed command line copy for /proc/cmdline */
- strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
-
- parse_early_param();
-
-#ifdef CONFIG_SMP
- /*
- * iSeries has already initialized the cpu maps at this point.
- */
- setup_cpu_maps();
-
- /* Release secondary cpus out of their spinloops at 0x60 now that
- * we can map physical -> logical CPU ids
- */
- smp_release_cpus();
-#endif
-
- printk("Starting Linux PPC64 %s\n", system_utsname.version);
-
- printk("-----------------------------------------------------\n");
- printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size);
- printk("ppc64_debug_switch = 0x%lx\n", ppc64_debug_switch);
- printk("ppc64_interrupt_controller = 0x%ld\n", ppc64_interrupt_controller);
- printk("systemcfg = 0x%p\n", systemcfg);
- printk("systemcfg->platform = 0x%x\n", systemcfg->platform);
- printk("systemcfg->processorCount = 0x%lx\n", systemcfg->processorCount);
- printk("systemcfg->physicalMemorySize = 0x%lx\n", systemcfg->physicalMemorySize);
- printk("ppc64_caches.dcache_line_size = 0x%x\n",
- ppc64_caches.dline_size);
- printk("ppc64_caches.icache_line_size = 0x%x\n",
- ppc64_caches.iline_size);
- printk("htab_address = 0x%p\n", htab_address);
- printk("htab_hash_mask = 0x%lx\n", htab_hash_mask);
- printk("-----------------------------------------------------\n");
-
- mm_init_ppc64();
-
- DBG(" <- setup_system()\n");
-}
-
-/* also used by kexec */
-void machine_shutdown(void)
-{
- if (ppc_md.nvram_sync)
- ppc_md.nvram_sync();
-}
-
-void machine_restart(char *cmd)
-{
- machine_shutdown();
- ppc_md.restart(cmd);
-#ifdef CONFIG_SMP
- smp_send_stop();
-#endif
- printk(KERN_EMERG "System Halted, OK to turn off power\n");
- local_irq_disable();
- while (1) ;
-}
-
-void machine_power_off(void)
-{
- machine_shutdown();
- ppc_md.power_off();
-#ifdef CONFIG_SMP
- smp_send_stop();
-#endif
- printk(KERN_EMERG "System Halted, OK to turn off power\n");
- local_irq_disable();
- while (1) ;
-}
-/* Used by the G5 thermal driver */
-EXPORT_SYMBOL_GPL(machine_power_off);
-
-void machine_halt(void)
-{
- machine_shutdown();
- ppc_md.halt();
-#ifdef CONFIG_SMP
- smp_send_stop();
-#endif
- printk(KERN_EMERG "System Halted, OK to turn off power\n");
- local_irq_disable();
- while (1) ;
-}
-
-static int ppc64_panic_event(struct notifier_block *this,
- unsigned long event, void *ptr)
-{
- ppc_md.panic((char *)ptr); /* May not return */
- return NOTIFY_DONE;
-}
-
-
-#ifdef CONFIG_SMP
-DEFINE_PER_CPU(unsigned int, pvr);
-#endif
-
-static int show_cpuinfo(struct seq_file *m, void *v)
-{
- unsigned long cpu_id = (unsigned long)v - 1;
- unsigned int pvr;
- unsigned short maj;
- unsigned short min;
-
- if (cpu_id == NR_CPUS) {
- seq_printf(m, "timebase\t: %lu\n", ppc_tb_freq);
-
- if (ppc_md.show_cpuinfo != NULL)
- ppc_md.show_cpuinfo(m);
-
- return 0;
- }
-
- /* We only show online cpus: disable preempt (overzealous, I
- * knew) to prevent cpu going down. */
- preempt_disable();
- if (!cpu_online(cpu_id)) {
- preempt_enable();
- return 0;
- }
-
-#ifdef CONFIG_SMP
- pvr = per_cpu(pvr, cpu_id);
-#else
- pvr = mfspr(SPRN_PVR);
-#endif
- maj = (pvr >> 8) & 0xFF;
- min = pvr & 0xFF;
-
- seq_printf(m, "processor\t: %lu\n", cpu_id);
- seq_printf(m, "cpu\t\t: ");
-
- if (cur_cpu_spec->pvr_mask)
- seq_printf(m, "%s", cur_cpu_spec->cpu_name);
- else
- seq_printf(m, "unknown (%08x)", pvr);
-
-#ifdef CONFIG_ALTIVEC
- if (cpu_has_feature(CPU_FTR_ALTIVEC))
- seq_printf(m, ", altivec supported");
-#endif /* CONFIG_ALTIVEC */
-
- seq_printf(m, "\n");
-
- /*
- * Assume here that all clock rates are the same in a
- * smp system. -- Cort
- */
- seq_printf(m, "clock\t\t: %lu.%06luMHz\n", ppc_proc_freq / 1000000,
- ppc_proc_freq % 1000000);
-
- seq_printf(m, "revision\t: %hd.%hd\n\n", maj, min);
-
- preempt_enable();
- return 0;
-}
-
-static void *c_start(struct seq_file *m, loff_t *pos)
-{
- return *pos <= NR_CPUS ? (void *)((*pos)+1) : NULL;
-}
-static void *c_next(struct seq_file *m, void *v, loff_t *pos)
-{
- ++*pos;
- return c_start(m, pos);
-}
-static void c_stop(struct seq_file *m, void *v)
-{
-}
-struct seq_operations cpuinfo_op = {
- .start =c_start,
- .next = c_next,
- .stop = c_stop,
- .show = show_cpuinfo,
-};
-
-/*
- * These three variables are used to save values passed to us by prom_init()
- * via the device tree. The TCE variables are needed because with a memory_limit
- * in force we may need to explicitly map the TCE are at the top of RAM.
- */
-unsigned long memory_limit;
-unsigned long tce_alloc_start;
-unsigned long tce_alloc_end;
-
-#ifdef CONFIG_PPC_ISERIES
-/*
- * On iSeries we just parse the mem=X option from the command line.
- * On pSeries it's a bit more complicated, see prom_init_mem()
- */
-static int __init early_parsemem(char *p)
-{
- if (!p)
- return 0;
-
- memory_limit = ALIGN(memparse(p, &p), PAGE_SIZE);
-
- return 0;
-}
-early_param("mem", early_parsemem);
-#endif /* CONFIG_PPC_ISERIES */
-
-#ifdef CONFIG_PPC_MULTIPLATFORM
-static int __init set_preferred_console(void)
-{
- struct device_node *prom_stdout = NULL;
- char *name;
- u32 *spd;
- int offset = 0;
-
- DBG(" -> set_preferred_console()\n");
-
- /* The user has requested a console so this is already set up. */
- if (strstr(saved_command_line, "console=")) {
- DBG(" console was specified !\n");
- return -EBUSY;
- }
-
- if (!of_chosen) {
- DBG(" of_chosen is NULL !\n");
- return -ENODEV;
- }
- /* We are getting a weird phandle from OF ... */
- /* ... So use the full path instead */
- name = (char *)get_property(of_chosen, "linux,stdout-path", NULL);
- if (name == NULL) {
- DBG(" no linux,stdout-path !\n");
- return -ENODEV;
- }
- prom_stdout = of_find_node_by_path(name);
- if (!prom_stdout) {
- DBG(" can't find stdout package %s !\n", name);
- return -ENODEV;
- }
- DBG("stdout is %s\n", prom_stdout->full_name);
-
- name = (char *)get_property(prom_stdout, "name", NULL);
- if (!name) {
- DBG(" stdout package has no name !\n");
- goto not_found;
- }
- spd = (u32 *)get_property(prom_stdout, "current-speed", NULL);
-
- if (0)
- ;
-#ifdef CONFIG_SERIAL_8250_CONSOLE
- else if (strcmp(name, "serial") == 0) {
- int i;
- u32 *reg = (u32 *)get_property(prom_stdout, "reg", &i);
- if (i > 8) {
- switch (reg[1]) {
- case 0x3f8:
- offset = 0;
- break;
- case 0x2f8:
- offset = 1;
- break;
- case 0x898:
- offset = 2;
- break;
- case 0x890:
- offset = 3;
- break;
- default:
- /* We dont recognise the serial port */
- goto not_found;
- }
- }
- }
-#endif /* CONFIG_SERIAL_8250_CONSOLE */
-#ifdef CONFIG_PPC_PSERIES
- else if (strcmp(name, "vty") == 0) {
- u32 *reg = (u32 *)get_property(prom_stdout, "reg", NULL);
- char *compat = (char *)get_property(prom_stdout, "compatible", NULL);
-
- if (reg && compat && (strcmp(compat, "hvterm-protocol") == 0)) {
- /* Host Virtual Serial Interface */
- int offset;
- switch (reg[0]) {
- case 0x30000000:
- offset = 0;
- break;
- case 0x30000001:
- offset = 1;
- break;
- default:
- goto not_found;
- }
- of_node_put(prom_stdout);
- DBG("Found hvsi console at offset %d\n", offset);
- return add_preferred_console("hvsi", offset, NULL);
- } else {
- /* pSeries LPAR virtual console */
- of_node_put(prom_stdout);
- DBG("Found hvc console\n");
- return add_preferred_console("hvc", 0, NULL);
- }
- }
-#endif /* CONFIG_PPC_PSERIES */
-#ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
- else if (strcmp(name, "ch-a") == 0)
- offset = 0;
- else if (strcmp(name, "ch-b") == 0)
- offset = 1;
-#endif /* CONFIG_SERIAL_PMACZILOG_CONSOLE */
- else
- goto not_found;
- of_node_put(prom_stdout);
-
- DBG("Found serial console at ttyS%d\n", offset);
-
- if (spd) {
- static char __initdata opt[16];
- sprintf(opt, "%d", *spd);
- return add_preferred_console("ttyS", offset, opt);
- } else
- return add_preferred_console("ttyS", offset, NULL);
-
- not_found:
- DBG("No preferred console found !\n");
- of_node_put(prom_stdout);
- return -ENODEV;
-}
-console_initcall(set_preferred_console);
-#endif /* CONFIG_PPC_MULTIPLATFORM */
-
-#ifdef CONFIG_IRQSTACKS
-static void __init irqstack_early_init(void)
-{
- unsigned int i;
-
- /*
- * interrupt stacks must be under 256MB, we cannot afford to take
- * SLB misses on them.
- */
- for_each_cpu(i) {
- softirq_ctx[i] = (struct thread_info *)__va(lmb_alloc_base(THREAD_SIZE,
- THREAD_SIZE, 0x10000000));
- hardirq_ctx[i] = (struct thread_info *)__va(lmb_alloc_base(THREAD_SIZE,
- THREAD_SIZE, 0x10000000));
- }
-}
-#else
-#define irqstack_early_init()
-#endif
-
-/*
- * Stack space used when we detect a bad kernel stack pointer, and
- * early in SMP boots before relocation is enabled.
- */
-static void __init emergency_stack_init(void)
-{
- unsigned long limit;
- unsigned int i;
-
- /*
- * Emergency stacks must be under 256MB, we cannot afford to take
- * SLB misses on them. The ABI also requires them to be 128-byte
- * aligned.
- *
- * Since we use these as temporary stacks during secondary CPU
- * bringup, we need to get at them in real mode. This means they
- * must also be within the RMO region.
- */
- limit = min(0x10000000UL, lmb.rmo_size);
-
- for_each_cpu(i)
- paca[i].emergency_sp = __va(lmb_alloc_base(PAGE_SIZE, 128,
- limit)) + PAGE_SIZE;
-}
-
-/*
- * Called from setup_arch to initialize the bitmap of available
- * syscalls in the systemcfg page
- */
-void __init setup_syscall_map(void)
-{
- unsigned int i, count64 = 0, count32 = 0;
- extern unsigned long *sys_call_table;
- extern unsigned long *sys_call_table32;
- extern unsigned long sys_ni_syscall;
-
-
- for (i = 0; i < __NR_syscalls; i++) {
- if (sys_call_table[i] == sys_ni_syscall)
- continue;
- count64++;
- systemcfg->syscall_map_64[i >> 5] |= 0x80000000UL >> (i & 0x1f);
- }
- for (i = 0; i < __NR_syscalls; i++) {
- if (sys_call_table32[i] == sys_ni_syscall)
- continue;
- count32++;
- systemcfg->syscall_map_32[i >> 5] |= 0x80000000UL >> (i & 0x1f);
- }
- printk(KERN_INFO "Syscall map setup, %d 32 bits and %d 64 bits syscalls\n",
- count32, count64);
-}
-
-/*
- * Called into from start_kernel, after lock_kernel has been called.
- * Initializes bootmem, which is unsed to manage page allocation until
- * mem_init is called.
- */
-void __init setup_arch(char **cmdline_p)
-{
- extern void do_init_bootmem(void);
-
- ppc64_boot_msg(0x12, "Setup Arch");
-
- *cmdline_p = cmd_line;
-
- /*
- * Set cache line size based on type of cpu as a default.
- * Systems with OF can look in the properties on the cpu node(s)
- * for a possibly more accurate value.
- */
- dcache_bsize = ppc64_caches.dline_size;
- icache_bsize = ppc64_caches.iline_size;
-
- /* reboot on panic */
- panic_timeout = 180;
-
- if (ppc_md.panic)
- notifier_chain_register(&panic_notifier_list, &ppc64_panic_block);
-
- init_mm.start_code = PAGE_OFFSET;
- init_mm.end_code = (unsigned long) _etext;
- init_mm.end_data = (unsigned long) _edata;
- init_mm.brk = klimit;
-
- irqstack_early_init();
- emergency_stack_init();
-
- stabs_alloc();
-
- /* set up the bootmem stuff with available memory */
- do_init_bootmem();
- sparse_init();
-
- /* initialize the syscall map in systemcfg */
- setup_syscall_map();
-
-#ifdef CONFIG_DUMMY_CONSOLE
- conswitchp = &dummy_con;
-#endif
-
- ppc_md.setup_arch();
-
- /* Use the default idle loop if the platform hasn't provided one. */
- if (NULL == ppc_md.idle_loop) {
- ppc_md.idle_loop = default_idle;
- printk(KERN_INFO "Using default idle loop\n");
- }
-
- paging_init();
- ppc64_boot_msg(0x15, "Setup Done");
-}
-
-
-/* ToDo: do something useful if ppc_md is not yet setup. */
-#define PPC64_LINUX_FUNCTION 0x0f000000
-#define PPC64_IPL_MESSAGE 0xc0000000
-#define PPC64_TERM_MESSAGE 0xb0000000
-
-static void ppc64_do_msg(unsigned int src, const char *msg)
-{
- if (ppc_md.progress) {
- char buf[128];
-
- sprintf(buf, "%08X\n", src);
- ppc_md.progress(buf, 0);
- snprintf(buf, 128, "%s", msg);
- ppc_md.progress(buf, 0);
- }
-}
-
-/* Print a boot progress message. */
-void ppc64_boot_msg(unsigned int src, const char *msg)
-{
- ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_IPL_MESSAGE|src, msg);
- printk("[boot]%04x %s\n", src, msg);
-}
-
-/* Print a termination message (print only -- does not stop the kernel) */
-void ppc64_terminate_msg(unsigned int src, const char *msg)
-{
- ppc64_do_msg(PPC64_LINUX_FUNCTION|PPC64_TERM_MESSAGE|src, msg);
- printk("[terminate]%04x %s\n", src, msg);
-}
-
-#ifndef CONFIG_PPC_ISERIES
-/*
- * This function can be used by platforms to "find" legacy serial ports.
- * It works for "serial" nodes under an "isa" node, and will try to
- * respect the "ibm,aix-loc" property if any. It works with up to 8
- * ports.
- */
-
-#define MAX_LEGACY_SERIAL_PORTS 8
-static struct plat_serial8250_port serial_ports[MAX_LEGACY_SERIAL_PORTS+1];
-static unsigned int old_serial_count;
-
-void __init generic_find_legacy_serial_ports(u64 *physport,
- unsigned int *default_speed)
-{
- struct device_node *np;
- u32 *sizeprop;
-
- struct isa_reg_property {
- u32 space;
- u32 address;
- u32 size;
- };
- struct pci_reg_property {
- struct pci_address addr;
- u32 size_hi;
- u32 size_lo;
- };
-
- DBG(" -> generic_find_legacy_serial_port()\n");
-
- *physport = 0;
- if (default_speed)
- *default_speed = 0;
-
- np = of_find_node_by_path("/");
- if (!np)
- return;
-
- /* First fill our array */
- for (np = NULL; (np = of_find_node_by_type(np, "serial"));) {
- struct device_node *isa, *pci;
- struct isa_reg_property *reg;
- unsigned long phys_size, addr_size, io_base;
- u32 *rangesp;
- u32 *interrupts, *clk, *spd;
- char *typep;
- int index, rlen, rentsize;
-
- /* Ok, first check if it's under an "isa" parent */
- isa = of_get_parent(np);
- if (!isa || strcmp(isa->name, "isa")) {
- DBG("%s: no isa parent found\n", np->full_name);
- continue;
- }
-
- /* Now look for an "ibm,aix-loc" property that gives us ordering
- * if any...
- */
- typep = (char *)get_property(np, "ibm,aix-loc", NULL);
-
- /* Get the ISA port number */
- reg = (struct isa_reg_property *)get_property(np, "reg", NULL);
- if (reg == NULL)
- goto next_port;
- /* We assume the interrupt number isn't translated ... */
- interrupts = (u32 *)get_property(np, "interrupts", NULL);
- /* get clock freq. if present */
- clk = (u32 *)get_property(np, "clock-frequency", NULL);
- /* get default speed if present */
- spd = (u32 *)get_property(np, "current-speed", NULL);
- /* Default to locate at end of array */
- index = old_serial_count; /* end of the array by default */
-
- /* If we have a location index, then use it */
- if (typep && *typep == 'S') {
- index = simple_strtol(typep+1, NULL, 0) - 1;
- /* if index is out of range, use end of array instead */
- if (index >= MAX_LEGACY_SERIAL_PORTS)
- index = old_serial_count;
- /* if our index is still out of range, that mean that
- * array is full, we could scan for a free slot but that
- * make little sense to bother, just skip the port
- */
- if (index >= MAX_LEGACY_SERIAL_PORTS)
- goto next_port;
- if (index >= old_serial_count)
- old_serial_count = index + 1;
- /* Check if there is a port who already claimed our slot */
- if (serial_ports[index].iobase != 0) {
- /* if we still have some room, move it, else override */
- if (old_serial_count < MAX_LEGACY_SERIAL_PORTS) {
- DBG("Moved legacy port %d -> %d\n", index,
- old_serial_count);
- serial_ports[old_serial_count++] =
- serial_ports[index];
- } else {
- DBG("Replacing legacy port %d\n", index);
- }
- }
- }
- if (index >= MAX_LEGACY_SERIAL_PORTS)
- goto next_port;
- if (index >= old_serial_count)
- old_serial_count = index + 1;
-
- /* Now fill the entry */
- memset(&serial_ports[index], 0, sizeof(struct plat_serial8250_port));
- serial_ports[index].uartclk = clk ? *clk : BASE_BAUD * 16;
- serial_ports[index].iobase = reg->address;
- serial_ports[index].irq = interrupts ? interrupts[0] : 0;
- serial_ports[index].flags = ASYNC_BOOT_AUTOCONF;
-
- DBG("Added legacy port, index: %d, port: %x, irq: %d, clk: %d\n",
- index,
- serial_ports[index].iobase,
- serial_ports[index].irq,
- serial_ports[index].uartclk);
-
- /* Get phys address of IO reg for port 1 */
- if (index != 0)
- goto next_port;
-
- pci = of_get_parent(isa);
- if (!pci) {
- DBG("%s: no pci parent found\n", np->full_name);
- goto next_port;
- }
-
- rangesp = (u32 *)get_property(pci, "ranges", &rlen);
- if (rangesp == NULL) {
- of_node_put(pci);
- goto next_port;
- }
- rlen /= 4;
-
- /* we need the #size-cells of the PCI bridge node itself */
- phys_size = 1;
- sizeprop = (u32 *)get_property(pci, "#size-cells", NULL);
- if (sizeprop != NULL)
- phys_size = *sizeprop;
- /* we need the parent #addr-cells */
- addr_size = prom_n_addr_cells(pci);
- rentsize = 3 + addr_size + phys_size;
- io_base = 0;
- for (;rlen >= rentsize; rlen -= rentsize,rangesp += rentsize) {
- if (((rangesp[0] >> 24) & 0x3) != 1)
- continue; /* not IO space */
- io_base = rangesp[3];
- if (addr_size == 2)
- io_base = (io_base << 32) | rangesp[4];
- }
- if (io_base != 0) {
- *physport = io_base + reg->address;
- if (default_speed && spd)
- *default_speed = *spd;
- }
- of_node_put(pci);
- next_port:
- of_node_put(isa);
- }
-
- DBG(" <- generic_find_legacy_serial_port()\n");
-}
-
-static struct platform_device serial_device = {
- .name = "serial8250",
- .id = PLAT8250_DEV_PLATFORM,
- .dev = {
- .platform_data = serial_ports,
- },
-};
-
-static int __init serial_dev_init(void)
-{
- return platform_device_register(&serial_device);
-}
-arch_initcall(serial_dev_init);
-
-#endif /* CONFIG_PPC_ISERIES */
-
-int check_legacy_ioport(unsigned long base_port)
-{
- if (ppc_md.check_legacy_ioport == NULL)
- return 0;
- return ppc_md.check_legacy_ioport(base_port);
-}
-EXPORT_SYMBOL(check_legacy_ioport);
-
-#ifdef CONFIG_XMON
-static int __init early_xmon(char *p)
-{
- /* ensure xmon is enabled */
- if (p) {
- if (strncmp(p, "on", 2) == 0)
- xmon_init(1);
- if (strncmp(p, "off", 3) == 0)
- xmon_init(0);
- if (strncmp(p, "early", 5) != 0)
- return 0;
- }
- xmon_init(1);
- debugger(NULL);
-
- return 0;
-}
-early_param("xmon", early_xmon);
-#endif
-
-void cpu_die(void)
-{
- if (ppc_md.cpu_die)
- ppc_md.cpu_die();
-}
More information about the Linuxppc64-dev
mailing list