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