1/*
2 *  arch/ppc/kernel/misc.S
3 *
4 *
5 *
6 * This file contains miscellaneous low-level functions.
7 *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
8 *
9 * Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
10 * and Paul Mackerras.
11 * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com)
12 * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com)
13 *
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version
17 * 2 of the License, or (at your option) any later version.
18 *
19 */
20
21#include <linux/config.h>
22#include <linux/sys.h>
23#include <asm/unistd.h>
24#include <asm/errno.h>
25#include <asm/processor.h>
26#include <asm/page.h>
27#include <asm/cache.h>
28#include "ppc_asm.h"
29
30	.text
31
32/*
33 * Returns (address we're running at) - (address we were linked at)
34 * for use before the text and data are mapped to KERNELBASE.
35 */
36
37_GLOBAL(reloc_offset)
38	mflr	r0
39	bl	1f
401:	mflr	r3
41	LOADADDR(r4,1b)
42	sub	r3,r4,r3
43	mtlr	r0
44	blr
45
46_GLOBAL(get_msr)
47	mfmsr	r3
48	blr
49
50_GLOBAL(get_dar)
51	mfdar	r3
52	blr
53
54_GLOBAL(get_srr0)
55	mfsrr0  r3
56	blr
57
58_GLOBAL(get_srr1)
59	mfsrr1  r3
60	blr
61
62_GLOBAL(get_sp)
63	mr	r3,r1
64	blr
65
66#ifdef CONFIG_PPC_ISERIES
67/* unsigned long __no_use_save_flags(void) */
68_GLOBAL(__no_use_save_flags)
69	mfspr	r4,SPRG3
70	lbz	r3,PACAPROCENABLED(r4)
71	blr
72
73/* void __no_use_restore_flags(unsigned long flags) */
74_GLOBAL(__no_use_restore_flags)
75/*
76 * Just set/clear the MSR_EE bit through restore/flags but do not
77 * change anything else.  This is needed by the RT system and makes
78 * sense anyway.
79 *    -- Cort
80 */
81	mfspr	r6,SPRG3
82	lbz	r5,PACAPROCENABLED(r6)
83	 /* Check if things are setup the way we want _already_. */
84	cmpw	0,r3,r5
85	beqlr
86	/* are we enabling interrupts? */
87	cmpi	0,r3,0
88	stb	r3,PACAPROCENABLED(r6)
89	beqlr
90	/* Check pending interrupts */
91	CHECKANYINT(r4,r5)
92	beqlr
93
94	/*
95	 * Handle pending interrupts in interrupt context
96	 */
97	li	r0,0x5555
98	sc
99	blr
100
101_GLOBAL(__no_use_cli)
102	mfspr	r5,SPRG3
103	lbz	r3,PACAPROCENABLED(r5)
104	li	r4,0
105	stb	r4,PACAPROCENABLED(r5)
106	blr			/* Done */
107
108_GLOBAL(__no_use_sti)
109	mfspr	r6,SPRG3
110	li	r3,1
111	stb	r3,PACAPROCENABLED(r6)
112
113	/* Check for pending interrupts
114	 *   A decrementer, IPI or PMC interrupt may have occurred
115	 *   while we were in the hypervisor (which enables)
116	 */
117	CHECKANYINT(r4,r5)
118	beqlr
119
120	/*
121	 * Handle pending interrupts in interrupt context
122	 */
123	li	r0,0x5555
124	sc
125	blr
126#endif
127/*
128 * Flush instruction cache.
129 */
130_GLOBAL(flush_instruction_cache)
131
132/*
133 * This is called by kgdb code
134 * and should probably go away
135 * to be replaced by invalidating
136 * the cache lines that are actually
137 * modified
138 */
139	/* use invalidate-all bit in HID0
140	 *  - is this consistent across all 64-bit cpus?  -- paulus */
141	mfspr	r3,HID0
142	ori	r3,r3,HID0_ICFI
143	mtspr	HID0,r3
144	sync
145	isync
146	blr
147
148/*
149 * Write any modified data cache blocks out to memory
150 * and invalidate the corresponding instruction cache blocks.
151 *
152 * flush_icache_range(unsigned long start, unsigned long stop)
153 *
154 *   flush all bytes from start through stop-1 inclusive
155 */
156
157_GLOBAL(flush_icache_range)
158
159/*
160 * Flush the data cache to memory
161 *
162 * Different systems have different cache line sizes
163 * and in some cases i-cache and d-cache line sizes differ from
164 * each other.
165 */
166	LOADADDR(r10,naca)		/* Get Naca address */
167	ld	r10,0(r10)
168	lhz	r7,DCACHEL1LINESIZE(r10)	/* Get cache line size */
169	addi	r5,r7,-1
170	andc	r6,r3,r5		/* round low to line bdy */
171	subf	r8,r6,r4		/* compute length */
172	add	r8,r8,r5		/* ensure we get enough */
173	lhz	r9,DCACHEL1LOGLINESIZE(r10)	/* Get log-2 of cache line size */
174	srw.	r8,r8,r9		/* compute line count */
175	beqlr				/* nothing to do? */
176	mtctr	r8
1771:	dcbst	0,r6
178	add	r6,r6,r7
179	bdnz	1b
180	sync
181
182/* Now invalidate the instruction cache */
183
184	lhz	r7,ICACHEL1LINESIZE(r10)	/* Get Icache line size */
185	addi	r5,r7,-1
186	andc	r6,r3,r5		/* round low to line bdy */
187	subf	r8,r6,r4		/* compute length */
188	add	r8,r8,r5
189	lhz	r9,ICACHEL1LOGLINESIZE(r10)	/* Get log-2 of Icache line size */
190	srw.	r8,r8,r9		/* compute line count */
191	beqlr				/* nothing to do? */
192	mtctr	r8
1932:	icbi	0,r6
194	add	r6,r6,r7
195	bdnz	2b
196	isync
197	blr
198
199/*
200 * Like above, but only do the D-cache.
201 *
202 * flush_dcache_range(unsigned long start, unsigned long stop)
203 *
204 *    flush all bytes from start to stop-1 inclusive
205 */
206_GLOBAL(flush_dcache_range)
207
208/*
209 * Flush the data cache to memory
210 *
211 * Different systems have different cache line sizes
212 */
213	LOADADDR(r10,naca)		/* Get Naca address */
214	ld	r10,0(r10)
215	lhz	r7,DCACHEL1LINESIZE(r10)	/* Get dcache line size */
216	addi	r5,r7,-1
217	andc	r6,r3,r5		/* round low to line bdy */
218	subf	r8,r6,r4		/* compute length */
219	add	r8,r8,r5		/* ensure we get enough */
220	lhz	r9,DCACHEL1LOGLINESIZE(r10)	/* Get log-2 of dcache line size */
221	srw.	r8,r8,r9		/* compute line count */
222	beqlr				/* nothing to do? */
223	mtctr	r8
2240:	dcbst	0,r6
225	add	r6,r6,r7
226	bdnz	0b
227	sync
228	blr
229
230/*
231 * Flush a particular page from the data cache to RAM.
232 * Note: this is necessary because the instruction cache does *not*
233 * snoop from the data cache.
234 *
235 *	void __flush_dcache_icache(void *page)
236 */
237_GLOBAL(__flush_dcache_icache)
238/*
239 * Flush the data cache to memory
240 *
241 * Different systems have different cache line sizes
242 */
243
244/* Flush the dcache */
245	LOADADDR(r7,naca)
246	ld	r7,0(r7)
247	clrrdi	r3,r3,12           	    /* Page align */
248	lhz	r4,DCACHEL1LINESPERPAGE(r7)	/* Get # dcache lines per page */
249	lhz	r5,DCACHEL1LINESIZE(r7)		/* Get dcache line size */
250	mr	r6,r3
251	mtctr	r4
2520:	dcbst	0,r6
253	add	r6,r6,r5
254	bdnz	0b
255	sync
256
257/* Now invalidate the icache */
258
259	lhz	r4,ICACHEL1LINESPERPAGE(r7)	/* Get # icache lines per page */
260	lhz	r5,ICACHEL1LINESIZE(r7)		/* Get icache line size */
261	mtctr	r4
2621:	icbi	0,r3
263	add	r3,r3,r5
264	bdnz	1b
265	isync
266	blr
267
268/*
269 * Copy a whole page.  Assumes a 4096B page size.
270 */
271_GLOBAL(copy_page)
272	clrrdi	r3,r3,12           	    /* Page align */
273	clrrdi	r4,r4,12           	    /* Page align */
274	li	r5,256
275	mtctr	r5
276	addi	r3,r3,-8
277	addi	r4,r4,-8
278
2791:      ld 	r6,8(r4)
280        ldu	r7,16(r4)
281	std     r6,8(r3)
282	stdu    r7,16(r3)
283	bdnz+	1b
284	blr
285
286/*
287 * I/O string operations
288 *
289 * insb(port, buf, len)
290 * outsb(port, buf, len)
291 * insw(port, buf, len)
292 * outsw(port, buf, len)
293 * insl(port, buf, len)
294 * outsl(port, buf, len)
295 * insw_ns(port, buf, len)
296 * outsw_ns(port, buf, len)
297 * insl_ns(port, buf, len)
298 * outsl_ns(port, buf, len)
299 *
300 * The *_ns versions don't do byte-swapping.
301 */
302_GLOBAL(_insb)
303	cmpwi	0,r5,0
304	mtctr	r5
305	subi	r4,r4,1
306	blelr-
30700:	lbz	r5,0(r3)
308	eieio
309	stbu	r5,1(r4)
310	bdnz	00b
311	blr
312
313_GLOBAL(_outsb)
314	cmpwi	0,r5,0
315	mtctr	r5
316	subi	r4,r4,1
317	blelr-
31800:	lbzu	r5,1(r4)
319	stb	r5,0(r3)
320	eieio
321	bdnz	00b
322	blr
323
324_GLOBAL(_insw)
325	cmpwi	0,r5,0
326	mtctr	r5
327	subi	r4,r4,2
328	blelr-
32900:	lhbrx	r5,0,r3
330	eieio
331	sthu	r5,2(r4)
332	bdnz	00b
333	blr
334
335_GLOBAL(_outsw)
336	cmpwi	0,r5,0
337	mtctr	r5
338	subi	r4,r4,2
339	blelr-
34000:	lhzu	r5,2(r4)
341	eieio
342	sthbrx	r5,0,r3
343	bdnz	00b
344	blr
345
346_GLOBAL(_insl)
347	cmpwi	0,r5,0
348	mtctr	r5
349	subi	r4,r4,4
350	blelr-
35100:	lwbrx	r5,0,r3
352	eieio
353	stwu	r5,4(r4)
354	bdnz	00b
355	blr
356
357_GLOBAL(_outsl)
358	cmpwi	0,r5,0
359	mtctr	r5
360	subi	r4,r4,4
361	blelr-
36200:	lwzu	r5,4(r4)
363	stwbrx	r5,0,r3
364	eieio
365	bdnz	00b
366	blr
367
368_GLOBAL(ide_insw)
369_GLOBAL(_insw_ns)
370	cmpwi	0,r5,0
371	mtctr	r5
372	subi	r4,r4,2
373	blelr-
37400:	lhz	r5,0(r3)
375	eieio
376	sthu	r5,2(r4)
377	bdnz	00b
378	blr
379
380_GLOBAL(ide_outsw)
381_GLOBAL(_outsw_ns)
382	cmpwi	0,r5,0
383	mtctr	r5
384	subi	r4,r4,2
385	blelr-
38600:	lhzu	r5,2(r4)
387	sth	r5,0(r3)
388	eieio
389	bdnz	00b
390	blr
391
392_GLOBAL(_insl_ns)
393	cmpwi	0,r5,0
394	mtctr	r5
395	subi	r4,r4,4
396	blelr-
39700:	lwz	r5,0(r3)
398	eieio
399	stwu	r5,4(r4)
400	bdnz	00b
401	blr
402
403_GLOBAL(_outsl_ns)
404	cmpwi	0,r5,0
405	mtctr	r5
406	subi	r4,r4,4
407	blelr-
40800:	lwzu	r5,4(r4)
409	stw	r5,0(r3)
410	eieio
411	bdnz	00b
412	blr
413
414/*
415 * Extended precision shifts
416 *
417 * R3/R4 has 64 bit value
418 * R5    has shift count
419 * result in R3/R4
420 *
421 *  ashrdi3:     XXXYYY/ZZZAAA -> SSSXXX/YYYZZZ
422 *  ashldi3:     XXXYYY/ZZZAAA -> YYYZZZ/AAA000
423 *  lshrdi3:     XXXYYY/ZZZAAA -> 000XXX/YYYZZZ
424 */
425/* MIKEC: These may no longer be needed...what does gcc expect ? */
426
427_GLOBAL(__ashrdi3)
428	li	r6,32
429	sub	r6,r6,r5
430	slw	r7,r3,r6	/* isolate YYY */
431	srw	r4,r4,r5	/* isolate ZZZ */
432	or	r4,r4,r7	/* YYYZZZ */
433	sraw	r3,r3,r5	/* SSSXXX */
434	blr
435
436_GLOBAL(__ashldi3)
437	li	r6,32
438	sub	r6,r6,r5
439	srw	r7,r4,r6	/* isolate ZZZ */
440	slw	r4,r4,r5	/* AAA000 */
441	slw	r3,r3,r5	/* YYY--- */
442	or	r3,r3,r7	/* YYYZZZ */
443	blr
444
445_GLOBAL(__lshrdi3)
446	li	r6,32
447	sub	r6,r6,r5
448	slw	r7,r3,r6        /* isolate YYY */
449	srw	r4,r4,r5        /* isolate ZZZ */
450	or	r4,r4,r7        /* YYYZZZ */
451	srw	r3,r3,r5        /* 000XXX */
452	blr
453
454_GLOBAL(abs)
455	cmpi	0,r3,0
456	bge	10f
457	neg	r3,r3
45810:	blr
459
460_GLOBAL(_get_SP)
461	mr	r3,r1		/* Close enough */
462	blr
463
464_GLOBAL(_get_PVR)
465	mfspr	r3,PVR
466	blr
467
468_GLOBAL(_get_PIR)
469	mfspr	r3,PIR
470	blr
471
472_GLOBAL(_get_HID0)
473	mfspr	r3,HID0
474	blr
475
476_GLOBAL(cvt_fd)
477	lfd	0,-4(r5)	/* load up fpscr value */
478	mtfsf	0xff,0
479	lfs	0,0(r3)
480	stfd	0,0(r4)
481	mffs	0		/* save new fpscr value */
482	stfd	0,-4(r5)
483	blr
484
485_GLOBAL(cvt_df)
486	lfd	0,-4(r5)	/* load up fpscr value */
487	mtfsf	0xff,0
488	lfd	0,0(r3)
489	stfs	0,0(r4)
490	mffs	0		/* save new fpscr value */
491	stfd	0,-4(r5)
492	blr
493
494/*
495 * Create a kernel thread
496 *   kernel_thread(fn, arg, flags)
497 */
498_GLOBAL(kernel_thread)
499	mr	r6,r3		/* function */
500	ori	r3,r5,CLONE_VM	/* flags */
501	li	r0,__NR_clone
502	sc
503	cmpi	0,r3,0		/* parent or child? */
504	bnelr			/* return if parent */
505
506	li	r0,0		/* clear out p->thread.regs */
507	std	r0,THREAD+PT_REGS(r13)	/* since we don't have user ctx */
508	li	r0,RUN_FLAG		/* Run light on */
509	std	r0,THREAD+THREAD_FLAGS(r13)
510
511	ld	r2,8(r6)
512	ld	r6,0(r6)
513	mtlr	r6              /* fn addr in lr */
514	mr	r3,r4	        /* load arg and call fn */
515	blrl
516	li	r0,__NR_exit	/* exit after child exits */
517        li	r3,0
518	sc
519
520#ifdef CONFIG_BINFMT_ELF32
521/* Why isn't this a) automatic, b) written in 'C'? */
522	.balign 8
523_GLOBAL(sys_call_table32)
524	.llong .sys_ni_syscall	/* 0  -  old "setup()" system call */
525	.llong .sys32_exit
526	.llong .sys32_fork
527	.llong .sys_read
528	.llong .sys_write
529	.llong .sys32_open		/* 5 */
530	.llong .sys_close
531	.llong .sys32_waitpid
532	.llong .sys32_creat
533	.llong .sys_link
534	.llong .sys_unlink      	/* 10 */
535	.llong .sys32_execve
536	.llong .sys_chdir
537	.llong .sys32_time
538	.llong .sys32_mknod
539	.llong .sys32_chmod		/* 15 */
540	.llong .sys_lchown
541	.llong .sys_ni_syscall			/* old break syscall holder */
542	.llong .sys32_stat
543	.llong .sys32_lseek
544	.llong .sys_getpid              /* 20 */
545	.llong .sys32_mount
546	.llong .sys_oldumount
547	.llong .sys_setuid
548	.llong .sys_getuid
549	.llong .ppc64_sys32_stime       /* 25 */
550	.llong .sys32_ptrace
551	.llong .sys_alarm
552	.llong .sys32_fstat
553	.llong .sys32_pause
554	.llong .sys32_utime		/* 30 */
555	.llong .sys_ni_syscall			/* old stty syscall holder */
556	.llong .sys_ni_syscall			/* old gtty syscall holder */
557	.llong .sys32_access
558	.llong .sys32_nice
559	.llong .sys_ni_syscall	/* 35 */	/* old ftime syscall holder */
560	.llong .sys_sync
561	.llong .sys32_kill
562	.llong .sys_rename
563	.llong .sys32_mkdir
564	.llong .sys_rmdir		/* 40 */
565	.llong .sys_dup
566	.llong .sys_pipe
567	.llong .sys32_times
568	.llong .sys_ni_syscall			/* old prof syscall holder */
569	.llong .sys_brk		/* 45 */
570	.llong .sys_setgid
571	.llong .sys_getgid
572	.llong .sys_signal
573	.llong .sys_geteuid
574	.llong .sys_getegid  	/* 50 */
575	.llong .sys_acct
576	.llong .sys32_umount			/* recycled never used phys() */
577	.llong .sys_ni_syscall			/* old lock syscall holder */
578	.llong .sys32_ioctl
579	.llong .sys32_fcntl		/* 55 */
580	.llong .sys_ni_syscall			/* old mpx syscall holder */
581	.llong .sys32_setpgid
582	.llong .sys_ni_syscall			/* old ulimit syscall holder */
583	.llong .sys_olduname
584	.llong .sys32_umask		/* 60 */
585	.llong .sys_chroot
586	.llong .sys_ustat
587	.llong .sys_dup2
588	.llong .sys_getppid
589	.llong .sys_getpgrp	        /* 65 */
590	.llong .sys_setsid
591	.llong .sys32_sigaction
592	.llong .sys_sgetmask
593	.llong .sys32_ssetmask
594	.llong .sys_setreuid	        /* 70 */
595	.llong .sys_setregid
596	.llong .sys_sigsuspend
597	.llong .sys32_sigpending
598	.llong .sys32_sethostname
599	.llong .sys32_setrlimit	        /* 75 */
600	.llong .sys32_old_getrlimit
601	.llong .sys32_getrusage
602	.llong .sys32_gettimeofday
603	.llong .sys32_settimeofday
604	.llong .sys32_getgroups	        /* 80 */
605	.llong .sys32_setgroups
606	.llong .ppc32_select
607	.llong .sys_symlink
608	.llong .sys32_lstat
609	.llong .sys32_readlink	        /* 85 */
610	.llong .sys_uselib
611	.llong .sys32_swapon
612	.llong .sys32_reboot
613	.llong .old32_readdir
614	.llong .sys32_mmap		/* 90 */
615	.llong .sys_munmap
616	.llong .sys_truncate
617	.llong .sys_ftruncate
618	.llong .sys_fchmod
619	.llong .sys_fchown              /* 95 */
620	.llong .sys32_getpriority
621	.llong .sys32_setpriority
622	.llong .sys_ni_syscall			/* old profil syscall holder */
623	.llong .sys32_statfs
624	.llong .sys32_fstatfs	/* 100 */
625	.llong .sys32_ioperm
626	.llong .sys32_socketcall
627	.llong .sys32_syslog
628	.llong .sys32_setitimer
629	.llong .sys32_getitimer	/* 105 */
630	.llong .sys32_newstat
631	.llong .sys32_newlstat
632	.llong .sys32_newfstat
633	.llong .sys_uname
634	.llong .sys32_iopl		/* 110 */
635	.llong .sys_vhangup
636	.llong .sys_ni_syscall	/* old 'idle' syscall */
637	.llong .sys32_vm86
638	.llong .sys32_wait4
639	.llong .sys_swapoff	/* 115 */
640	.llong .sys32_sysinfo
641	.llong .sys32_ipc
642	.llong .sys_fsync
643	.llong .ppc32_sigreturn
644	.llong .sys32_clone		/* 120 */
645	.llong .sys32_setdomainname
646	.llong .ppc64_newuname
647	.llong .sys32_modify_ldt
648	.llong .sys32_adjtimex
649	.llong .sys_mprotect	/* 125 */
650	.llong .sys32_sigprocmask
651	.llong .sys32_create_module
652	.llong .sys32_init_module
653	.llong .sys32_delete_module
654	.llong .sys32_get_kernel_syms	/* 130 */
655	.llong .sys32_quotactl
656	.llong .sys32_getpgid
657	.llong .sys_fchdir
658	.llong .sys32_bdflush
659	.llong .sys32_sysfs		/* 135 */
660	.llong .sys32_personality
661	.llong .sys_ni_syscall	        /* for afs_syscall */
662	.llong .sys_setfsuid
663	.llong .sys_setfsgid
664	.llong .sys_llseek	        /* 140 */
665        .llong .sys32_getdents
666	.llong .ppc32_select
667	.llong .sys_flock
668	.llong .sys32_msync
669	.llong .sys32_readv		/* 145 */
670	.llong .sys32_writev
671	.llong .sys32_getsid
672	.llong .sys_fdatasync
673	.llong .sys32_sysctl
674	.llong .sys_mlock		/* 150 */
675	.llong .sys_munlock
676	.llong .sys32_mlockall
677	.llong .sys_munlockall
678	.llong .sys32_sched_setparam
679	.llong .sys32_sched_getparam	/* 155 */
680	.llong .sys32_sched_setscheduler
681	.llong .sys32_sched_getscheduler
682	.llong .sys_sched_yield
683	.llong .sys32_sched_get_priority_max
684	.llong .sys32_sched_get_priority_min  /* 160 */
685	.llong .sys32_sched_rr_get_interval
686	.llong .sys32_nanosleep
687	.llong .sys32_mremap
688	.llong .sys_setresuid
689	.llong .sys_getresuid	        /* 165 */
690	.llong .sys32_query_module
691	.llong .sys_poll
692	.llong .sys32_nfsservctl
693	.llong .sys_setresgid
694	.llong .sys_getresgid	        /* 170 */
695	.llong .sys32_prctl
696	.llong .ppc32_rt_sigreturn
697	.llong .sys32_rt_sigaction
698	.llong .sys32_rt_sigprocmask
699	.llong .sys32_rt_sigpending     /* 175 */
700	.llong .sys32_rt_sigtimedwait
701	.llong .sys32_rt_sigqueueinfo
702	.llong .sys32_rt_sigsuspend
703	.llong .sys32_pread
704	.llong .sys32_pwrite	        /* 180 */
705	.llong .sys_chown
706	.llong .sys_getcwd
707	.llong .sys_capget
708	.llong .sys_capset
709	.llong .sys32_sigaltstack	        /* 185 */
710	.llong .sys32_sendfile
711	.llong .sys_ni_syscall		/* streams1 */
712	.llong .sys_ni_syscall		/* streams2 */
713	.llong .sys32_vfork
714	.llong .sys32_getrlimit	        /* 190 */
715	.llong .sys_ni_syscall		/* 191 */	/* Unused */
716	.llong .sys_ni_syscall		/* 192 - reserved - mmap2 */
717	.llong .sys32_truncate64	/* 193 - truncate64 */
718	.llong .sys32_ftruncate64	/* 194 - ftruncate64 */
719	.llong .sys_stat64      	/* 195 - stat64 */
720	.llong .sys_lstat64     	/* 196 - lstat64 */
721	.llong .sys_fstat64		/* 197 - fstat64 */
722	.llong .sys32_pciconfig_read  	/* 198 */
723	.llong .sys32_pciconfig_write  	/* 199 */
724	.llong .sys_pciconfig_iobase 	/* 200 */
725	.llong .sys_ni_syscall		/* 201 - reserved - MacOnLinux - new */
726	.llong .sys_getdents64		/* 202 */
727	.llong .sys_pivot_root		/* 203 */
728	.llong .sys32_fcntl64		/* 204 */
729	.llong .sys_madvise		/* 205 */
730	.llong .sys_mincore		/* 206 */
731	.llong .sys_gettid		/* 207 */
732	.llong .sys_perfmonctl   /* Put this here for now ... */
733	.rept NR_syscalls-222
734		.llong .sys_ni_syscall
735	.endr
736#endif
737	.balign 8
738_GLOBAL(sys_call_table)
739	.llong .sys_ni_syscall	/* 0  -  old "setup()" system call */
740	.llong .sys_exit
741	.llong .sys_fork
742	.llong .sys_read
743	.llong .sys_write
744	.llong .sys_open		/* 5 */
745	.llong .sys_close
746	.llong .sys_waitpid
747	.llong .sys_creat
748	.llong .sys_link
749	.llong .sys_unlink	/* 10 */
750	.llong .sys_execve
751	.llong .sys_chdir
752	.llong .sys64_time
753	.llong .sys_mknod
754	.llong .sys_chmod		/* 15 */
755	.llong .sys_lchown
756	.llong .sys_ni_syscall			/* old break syscall holder */
757	.llong .sys_stat
758	.llong .sys_lseek
759	.llong .sys_getpid	/* 20 */
760	.llong .sys_mount
761	.llong .sys_oldumount
762	.llong .sys_setuid
763	.llong .sys_getuid
764	.llong .ppc64_sys_stime		/* 25 */
765	.llong .sys_ptrace
766	.llong .sys_alarm
767	.llong .sys_fstat
768	.llong .sys_pause
769	.llong .sys_utime		/* 30 */
770	.llong .sys_ni_syscall			/* old stty syscall holder */
771	.llong .sys_ni_syscall			/* old gtty syscall holder */
772	.llong .sys_access
773	.llong .sys_nice
774	.llong .sys_ni_syscall	/* 35 */	/* old ftime syscall holder */
775	.llong .sys_sync
776	.llong .sys_kill
777	.llong .sys_rename
778	.llong .sys_mkdir
779	.llong .sys_rmdir		/* 40 */
780	.llong .sys_dup
781	.llong .sys_pipe
782	.llong .sys_times
783	.llong .sys_ni_syscall			/* old prof syscall holder */
784	.llong .sys_brk		/* 45 */
785	.llong .sys_setgid
786	.llong .sys_getgid
787	.llong .sys_signal
788	.llong .sys_geteuid
789	.llong .sys_getegid	/* 50 */
790	.llong .sys_acct
791	.llong .sys_umount			/* recycled never used phys() */
792	.llong .sys_ni_syscall			/* old lock syscall holder */
793	.llong .sys_ioctl
794	.llong .sys_fcntl		/* 55 */
795	.llong .sys_ni_syscall			/* old mpx syscall holder */
796	.llong .sys_setpgid
797	.llong .sys_ni_syscall			/* old ulimit syscall holder */
798	.llong .sys_olduname
799	.llong .sys_umask		/* 60 */
800	.llong .sys_chroot
801	.llong .sys_ustat
802	.llong .sys_dup2
803	.llong .sys_getppid
804	.llong .sys_getpgrp	/* 65 */
805	.llong .sys_setsid
806	.llong .sys_sigaction
807	.llong .sys_sgetmask
808	.llong .sys_ssetmask
809	.llong .sys_setreuid	/* 70 */
810	.llong .sys_setregid
811	.llong .sys_sigsuspend
812	.llong .sys_sigpending
813	.llong .sys_sethostname
814	.llong .sys_setrlimit	/* 75 */
815	.llong .sys_old_getrlimit
816	.llong .sys_getrusage
817	.llong .sys_gettimeofday
818	.llong .sys_settimeofday
819	.llong .sys_getgroups	/* 80 */
820	.llong .sys_setgroups
821	.llong .sys_select
822	.llong .sys_symlink
823	.llong .sys_lstat
824	.llong .sys_readlink	/* 85 */
825	.llong .sys_uselib
826	.llong .sys_swapon
827	.llong .sys_reboot
828	.llong .old_readdir
829	.llong .sys_mmap	/* 90 */
830	.llong .sys_munmap
831	.llong .sys_truncate
832	.llong .sys_ftruncate
833	.llong .sys_fchmod
834	.llong .sys_fchown	/* 95 */
835	.llong .sys_getpriority
836	.llong .sys_setpriority
837	.llong .sys_ni_syscall			/* old profil syscall holder */
838	.llong .sys_statfs
839	.llong .sys_fstatfs	/* 100 */
840	.llong .sys_ioperm
841	.llong .sys_socketcall
842	.llong .sys_syslog
843	.llong .sys_setitimer
844	.llong .sys_getitimer	/* 105 */
845	.llong .sys_newstat
846	.llong .sys_newlstat
847	.llong .sys_newfstat
848	.llong .sys_uname
849	.llong .sys_iopl		/* 110 */
850	.llong .sys_vhangup
851	.llong .sys_ni_syscall	/* old 'idle' syscall */
852	.llong .sys_vm86
853	.llong .sys_wait4
854	.llong .sys_swapoff	/* 115 */
855	.llong .sys_sysinfo
856	.llong .sys_ipc
857	.llong .sys_fsync
858	.llong .ppc64_sigreturn
859	.llong .sys_clone		/* 120 */
860	.llong .sys_setdomainname
861	.llong .ppc64_newuname
862	.llong .sys_modify_ldt
863	.llong .sys_adjtimex
864	.llong .sys_mprotect	/* 125 */
865	.llong .sys_sigprocmask
866	.llong .sys_create_module
867	.llong .sys_init_module
868	.llong .sys_delete_module
869	.llong .sys_get_kernel_syms	/* 130 */
870	.llong .sys_quotactl
871	.llong .sys_getpgid
872	.llong .sys_fchdir
873	.llong .sys_bdflush
874	.llong .sys_sysfs		/* 135 */
875	.llong .sys_personality
876	.llong .sys_ni_syscall	        /* for afs_syscall */
877	.llong .sys_setfsuid
878	.llong .sys_setfsgid
879	.llong .sys_llseek	        /* 140 */
880        .llong .sys_getdents
881	.llong .sys_select
882	.llong .sys_flock
883	.llong .sys_msync
884	.llong .sys_readv		/* 145 */
885	.llong .sys_writev
886	.llong .sys_getsid
887	.llong .sys_fdatasync
888	.llong .sys_sysctl
889	.llong .sys_mlock		/* 150 */
890	.llong .sys_munlock
891	.llong .sys_mlockall
892	.llong .sys_munlockall
893	.llong .sys_sched_setparam
894	.llong .sys_sched_getparam	/* 155 */
895	.llong .sys_sched_setscheduler
896	.llong .sys_sched_getscheduler
897	.llong .sys_sched_yield
898	.llong .sys_sched_get_priority_max
899	.llong .sys_sched_get_priority_min  /* 160 */
900	.llong .sys_sched_rr_get_interval
901	.llong .sys_nanosleep
902	.llong .sys_mremap
903	.llong .sys_setresuid
904	.llong .sys_getresuid	        /* 165 */
905	.llong .sys_query_module
906	.llong .sys_poll
907	.llong .sys_nfsservctl
908	.llong .sys_setresgid
909	.llong .sys_getresgid	        /* 170 */
910	.llong .sys_prctl
911	.llong .ppc64_rt_sigreturn
912	.llong .sys_rt_sigaction
913	.llong .sys_rt_sigprocmask
914	.llong .sys_rt_sigpending	/* 175 */
915	.llong .sys_rt_sigtimedwait
916	.llong .sys_rt_sigqueueinfo
917	.llong .sys_rt_sigsuspend
918	.llong .sys_pread
919	.llong .sys_pwrite	        /* 180 */
920	.llong .sys_chown
921	.llong .sys_getcwd
922	.llong .sys_capget
923	.llong .sys_capset
924	.llong .sys_sigaltstack	        /* 185 */
925	.llong .sys_sendfile
926	.llong .sys_ni_syscall		/* streams1 */
927	.llong .sys_ni_syscall		/* streams2 */
928	.llong .sys_vfork
929	.llong .sys_getrlimit	        /* 190 */
930	.llong .sys_ni_syscall		/* 191 */	/* Unused */
931	.llong .sys_ni_syscall		/* 192 - reserved - mmap2 */
932	.llong .sys_ni_syscall		/* 193 - reserved - truncate64 */
933	.llong .sys_ni_syscall		/* 194 - reserved - ftruncate64 */
934	.llong .sys_ni_syscall		/* 195 - reserved - stat64 */
935	.llong .sys_ni_syscall		/* 196 - reserved - lstat64 */
936	.llong .sys_ni_syscall		/* 197 - reserved - fstat64 */
937	.llong .sys_pciconfig_read	/* 198 */
938	.llong .sys_pciconfig_write 	/* 199 */
939	.llong .sys_pciconfig_iobase 	/* 200 */
940	.llong .sys_ni_syscall		/* 201 - reserved - MacOnLinux - new */
941	.llong .sys_getdents64		/* 202 */
942	.llong .sys_pivot_root		/* 203 */
943	.llong .sys_ni_syscall		/* 204 */
944	.llong .sys_madvise		/* 205 */
945	.llong .sys_mincore		/* 206 */
946	.llong .sys_gettid		/* 207 */
947	.llong .sys_perfmonctl   /* Put this here for now ... */
948	.rept NR_syscalls-222
949	.llong .sys_ni_syscall
950	.endr
951