#include <asm/page.h>
#include <asm/cache.h>
#include <asm/ppc_asm.h>
-#include <asm/offsets.h>
+#include <asm/asm-offsets.h>
#include <asm/cputable.h>
+#include <asm/thread_info.h>
.text
_GLOBAL(get_sp)
mr r3,r1
blr
-
-#ifdef CONFIG_PPC_ISERIES
-/* unsigned long local_save_flags(void) */
-_GLOBAL(local_get_flags)
- lbz r3,PACAPROCENABLED(r13)
- blr
-
-/* unsigned long local_irq_disable(void) */
-_GLOBAL(local_irq_disable)
- lbz r3,PACAPROCENABLED(r13)
- li r4,0
- stb r4,PACAPROCENABLED(r13)
- blr /* Done */
-
-/* void local_irq_restore(unsigned long flags) */
-_GLOBAL(local_irq_restore)
- lbz r5,PACAPROCENABLED(r13)
- /* Check if things are setup the way we want _already_. */
- cmpw 0,r3,r5
- beqlr
- /* are we enabling interrupts? */
- cmpdi 0,r3,0
- stb r3,PACAPROCENABLED(r13)
- beqlr
- /* Check pending interrupts */
- /* A decrementer, IPI or PMC interrupt may have occurred
- * while we were in the hypervisor (which enables) */
- ld r4,PACALPPACA+LPPACAANYINT(r13)
- cmpdi r4,0
- beqlr
-
- /*
- * Handle pending interrupts in interrupt context
- */
- li r0,0x5555
- sc
- blr
-#endif /* CONFIG_PPC_ISERIES */
#ifdef CONFIG_IRQSTACKS
_GLOBAL(call_do_softirq)
* flush all bytes from start through stop-1 inclusive
*/
-_GLOBAL(__flush_icache_range)
+_KPROBE(__flush_icache_range)
/*
* Flush the data cache to memory
bdnz 2b
isync
blr
-
+ .previous .text
/*
* Like above, but only do the D-cache.
*
/* Flush the dcache */
ld r7,PPC64_CACHES@toc(r2)
- clrrdi r3,r3,12 /* Page align */
+ clrrdi r3,r3,PAGE_SHIFT /* Page align */
lwz r4,DCACHEL1LINESPERPAGE(r7) /* Get # dcache lines per page */
lwz r5,DCACHEL1LINESIZE(r7) /* Get dcache line size */
mr r6,r3
ld r30,-16(r1)
blr
+/*
+ * disable_kernel_fp()
+ * Disable the FPU.
+ */
+_GLOBAL(disable_kernel_fp)
+ mfmsr r3
+ rldicl r0,r3,(63-MSR_FP_LG),1
+ rldicl r3,r0,(MSR_FP_LG+1),0
+ mtmsrd r3 /* disable use of fpu now */
+ isync
+ blr
+
+/*
+ * giveup_fpu(tsk)
+ * Disable FP for the task given as the argument,
+ * and save the floating-point registers in its thread_struct.
+ * Enables the FPU for use in the kernel on return.
+ */
+_GLOBAL(giveup_fpu)
+ mfmsr r5
+ ori r5,r5,MSR_FP
+ mtmsrd r5 /* enable use of fpu now */
+ isync
+ cmpdi 0,r3,0
+ beqlr- /* if no previous owner, done */
+ addi r3,r3,THREAD /* want THREAD of task */
+ ld r5,PT_REGS(r3)
+ cmpdi 0,r5,0
+ SAVE_32FPRS(0, r3)
+ mffs fr0
+ stfd fr0,THREAD_FPSCR(r3)
+ beq 1f
+ ld r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+ li r3,MSR_FP|MSR_FE0|MSR_FE1
+ andc r4,r4,r3 /* disable FP for previous task */
+ std r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+1:
+#ifndef CONFIG_SMP
+ li r5,0
+ ld r4,last_task_used_math@got(r2)
+ std r5,0(r4)
+#endif /* CONFIG_SMP */
+ blr
+
+#ifdef CONFIG_ALTIVEC
+
+#if 0 /* this has no callers for now */
+/*
+ * disable_kernel_altivec()
+ * Disable the VMX.
+ */
+_GLOBAL(disable_kernel_altivec)
+ mfmsr r3
+ rldicl r0,r3,(63-MSR_VEC_LG),1
+ rldicl r3,r0,(MSR_VEC_LG+1),0
+ mtmsrd r3 /* disable use of VMX now */
+ isync
+ blr
+#endif /* 0 */
+
+/*
+ * giveup_altivec(tsk)
+ * Disable VMX for the task given as the argument,
+ * and save the vector registers in its thread_struct.
+ * Enables the VMX for use in the kernel on return.
+ */
+_GLOBAL(giveup_altivec)
+ mfmsr r5
+ oris r5,r5,MSR_VEC@h
+ mtmsrd r5 /* enable use of VMX now */
+ isync
+ cmpdi 0,r3,0
+ beqlr- /* if no previous owner, done */
+ addi r3,r3,THREAD /* want THREAD of task */
+ ld r5,PT_REGS(r3)
+ cmpdi 0,r5,0
+ SAVE_32VRS(0,r4,r3)
+ mfvscr vr0
+ li r4,THREAD_VSCR
+ stvx vr0,r4,r3
+ beq 1f
+ ld r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+ lis r3,MSR_VEC@h
+ andc r4,r4,r3 /* disable FP for previous task */
+ std r4,_MSR-STACK_FRAME_OVERHEAD(r5)
+1:
+#ifndef CONFIG_SMP
+ li r5,0
+ ld r4,last_task_used_altivec@got(r2)
+ std r5,0(r4)
+#endif /* CONFIG_SMP */
+ blr
+
+#endif /* CONFIG_ALTIVEC */
+
+_GLOBAL(__setup_cpu_power3)
+ blr
+
+_GLOBAL(execve)
+ li r0,__NR_execve
+ sc
+ bnslr
+ neg r3,r3
+ blr
+
/* kexec_wait(phys_cpu)
*
* wait for the flag to change, indicating this kernel is going away but
.llong .ppc_fork
.llong .sys_read
.llong .sys_write
- .llong .sys32_open /* 5 */
+ .llong .compat_sys_open /* 5 */
.llong .sys_close
- .llong .sys32_waitpid
- .llong .sys32_creat
+ .llong .compat_sys_waitpid
+ .llong .compat_sys_creat
.llong .sys_link
.llong .sys_unlink /* 10 */
- .llong .sys32_execve
+ .llong .compat_sys_execve
.llong .sys_chdir
.llong .compat_sys_time
.llong .sys_mknod
.llong .sys_setuid
.llong .sys_getuid
.llong .compat_sys_stime /* 25 */
- .llong .sys32_ptrace
+ .llong .compat_sys_ptrace
.llong .sys_alarm
.llong .sys_ni_syscall /* old fstat syscall */
- .llong .sys32_pause
- .llong .compat_sys_utime /* 30 */
+ .llong .compat_sys_pause
+ .llong .compat_sys_utime /* 30 */
.llong .sys_ni_syscall /* old stty syscall */
.llong .sys_ni_syscall /* old gtty syscall */
- .llong .sys32_access
- .llong .sys32_nice
+ .llong .compat_sys_access
+ .llong .compat_sys_nice
.llong .sys_ni_syscall /* 35 - old ftime syscall */
.llong .sys_sync
- .llong .sys32_kill
+ .llong .compat_sys_kill
.llong .sys_rename
- .llong .sys32_mkdir
+ .llong .compat_sys_mkdir
.llong .sys_rmdir /* 40 */
.llong .sys_dup
.llong .sys_pipe
.llong .compat_sys_ioctl
.llong .compat_sys_fcntl /* 55 */
.llong .sys_ni_syscall /* old mpx syscall */
- .llong .sys32_setpgid
+ .llong .compat_sys_setpgid
.llong .sys_ni_syscall /* old ulimit syscall */
- .llong .sys32_olduname
- .llong .sys32_umask /* 60 */
+ .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 .sys32_sigaction
+ .llong .compat_sys_sigaction
.llong .sys_sgetmask
- .llong .sys32_ssetmask
+ .llong .compat_sys_ssetmask
.llong .sys_setreuid /* 70 */
.llong .sys_setregid
.llong .ppc32_sigsuspend
.llong .compat_sys_sigpending
- .llong .sys32_sethostname
- .llong .compat_sys_setrlimit /* 75 */
+ .llong .compat_sys_sethostname
+ .llong .compat_sys_setrlimit /* 75 */
.llong .compat_sys_old_getrlimit
.llong .compat_sys_getrusage
- .llong .sys32_gettimeofday
- .llong .sys32_settimeofday
- .llong .sys32_getgroups /* 80 */
- .llong .sys32_setgroups
+ .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 .sys32_readlink /* 85 */
+ .llong .compat_sys_readlink /* 85 */
.llong .sys_uselib
.llong .sys_swapon
.llong .sys_reboot
.llong .sys_ftruncate
.llong .sys_fchmod
.llong .sys_fchown /* 95 */
- .llong .sys32_getpriority
- .llong .sys32_setpriority
+ .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 .compat_sys_fstatfs /* 100 */
.llong .sys_ni_syscall /* old ioperm syscall */
.llong .compat_sys_socketcall
- .llong .sys32_syslog
+ .llong .compat_sys_syslog
.llong .compat_sys_setitimer
- .llong .compat_sys_getitimer /* 105 */
+ .llong .compat_sys_getitimer /* 105 */
.llong .compat_sys_newstat
.llong .compat_sys_newlstat
.llong .compat_sys_newfstat
- .llong .sys32_uname
+ .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 .sys32_sysinfo
+ .llong .compat_sys_sysinfo
.llong .sys32_ipc
.llong .sys_fsync
.llong .ppc32_sigreturn
.llong .ppc_clone /* 120 */
- .llong .sys32_setdomainname
- .llong .ppc64_newuname
+ .llong .compat_sys_setdomainname
+ .llong .ppc_newuname
.llong .sys_ni_syscall /* old modify_ldt syscall */
- .llong .sys32_adjtimex
+ .llong .compat_sys_adjtimex
.llong .sys_mprotect /* 125 */
.llong .compat_sys_sigprocmask
.llong .sys_ni_syscall /* old create_module syscall */
.llong .sys_delete_module
.llong .sys_ni_syscall /* 130 old get_kernel_syms syscall */
.llong .sys_quotactl
- .llong .sys32_getpgid
+ .llong .compat_sys_getpgid
.llong .sys_fchdir
.llong .sys_bdflush
- .llong .sys32_sysfs /* 135 */
+ .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 .sys32_getdents
+ .llong .compat_sys_getdents
.llong .ppc32_select
.llong .sys_flock
.llong .sys_msync
.llong .compat_sys_readv /* 145 */
.llong .compat_sys_writev
- .llong .sys32_getsid
+ .llong .compat_sys_getsid
.llong .sys_fdatasync
- .llong .sys32_sysctl
+ .llong .compat_sys_sysctl
.llong .sys_mlock /* 150 */
.llong .sys_munlock
.llong .sys_mlockall
.llong .sys_munlockall
- .llong .sys32_sched_setparam
- .llong .sys32_sched_getparam /* 155 */
- .llong .sys32_sched_setscheduler
- .llong .sys32_sched_getscheduler
+ .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 .sys32_sched_get_priority_max
- .llong .sys32_sched_get_priority_min /* 160 */
- .llong .sys32_sched_rr_get_interval
+ .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 .compat_sys_nfsservctl
.llong .sys_setresgid
.llong .sys_getresgid /* 170 */
- .llong .sys32_prctl
+ .llong .compat_sys_prctl
.llong .ppc32_rt_sigreturn
- .llong .sys32_rt_sigaction
- .llong .sys32_rt_sigprocmask
- .llong .sys32_rt_sigpending /* 175 */
+ .llong .compat_sys_rt_sigaction
+ .llong .compat_sys_rt_sigprocmask
+ .llong .compat_sys_rt_sigpending /* 175 */
.llong .compat_sys_rt_sigtimedwait
- .llong .sys32_rt_sigqueueinfo
+ .llong .compat_sys_rt_sigqueueinfo
.llong .ppc32_rt_sigsuspend
- .llong .sys32_pread64
- .llong .sys32_pwrite64 /* 180 */
+ .llong .compat_sys_pread64
+ .llong .compat_sys_pwrite64 /* 180 */
.llong .sys_chown
.llong .sys_getcwd
.llong .sys_capget
.llong .sys_capset
- .llong .sys32_sigaltstack /* 185 */
- .llong .sys32_sendfile
+ .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 .sys32_readahead
- .llong .sys32_mmap2
- .llong .sys32_truncate64
- .llong .sys32_ftruncate64
+ .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 .sys32_pciconfig_read
- .llong .sys32_pciconfig_write
- .llong .sys32_pciconfig_iobase /* 200 - pciconfig_iobase */
+ .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_sched_getaffinity
.llong .sys_ni_syscall
.llong .sys_ni_syscall /* 225 - reserved for tux */
- .llong .sys32_sendfile64
+ .llong .compat_sys_sendfile64
.llong .compat_sys_io_setup
.llong .sys_io_destroy
.llong .compat_sys_io_getevents
.llong .compat_sys_timer_gettime
.llong .sys_timer_getoverrun
.llong .sys_timer_delete
- .llong .compat_sys_clock_settime /* 245 */
+ .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 .sys32_tgkill /* 250 */
- .llong .sys32_utimes
+ .llong .compat_sys_tgkill /* 250 */
+ .llong .compat_sys_utimes
.llong .compat_sys_statfs64
.llong .compat_sys_fstatfs64
- .llong .ppc32_fadvise64_64 /* 32bit only fadvise64_64 */
+ .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 .compat_sys_mq_notify
.llong .compat_sys_mq_getsetattr
.llong .compat_sys_kexec_load
- .llong .sys32_add_key
- .llong .sys32_request_key /* 270 */
+ .llong .compat_sys_add_key
+ .llong .compat_sys_request_key /* 270 */
.llong .compat_sys_keyctl
.llong .compat_sys_waitid
- .llong .sys32_ioprio_set
- .llong .sys32_ioprio_get
+ .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
.llong .sys_ni_syscall
.llong .ppc_clone /* 120 */
.llong .sys_setdomainname
- .llong .ppc64_newuname
+ .llong .ppc_newuname
.llong .sys_ni_syscall /* old modify_ldt syscall */
.llong .sys_adjtimex
.llong .sys_mprotect /* 125 */
.llong .sys_ni_syscall /* 195 - 32bit only stat64 */
.llong .sys_ni_syscall /* 32bit only lstat64 */
.llong .sys_ni_syscall /* 32bit only fstat64 */
- .llong .sys_ni_syscall /* 32bit only pciconfig_read */
- .llong .sys_ni_syscall /* 32bit only pciconfig_write */
- .llong .sys_ni_syscall /* 32bit only pciconfig_iobase */
+ .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