Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/* ------------------------------------------------------------------------------
 *
 * Linux/PARISC Project (http://www.thepuffingroup.com/parisc)
 *
 * System call entry code Copyright (c) Matthew Wilcox 1999 <willy@bofh.ai>
 * Licensed under the GNU GPL.
 * thanks to Philipp Rumpf, Mike Shaver and various others
 * sorry about the wall, puffin..
 */

#define __ASSEMBLY__
#include <asm/assembly.h>
#include <asm/offset.h>
#include <asm/unistd.h>
#include <asm/errno.h>

	.text

	.import hpux_call_table
	.import hpux_syscall_exit,code
	.export hpux_gateway_page

	.align 4096
hpux_gateway_page:
	nop
	mfsp	%sr7,%r1			;! we must set sr3 to the space
	mtsp	%r1,%sr3			;! of the user before the gate
#ifdef __LP64__
#warning NEEDS WORK for 64-bit
#endif
	ldw	-64(%r30), %r28			;! 8th argument
	ldw	-60(%r30), %r19			;! 7th argument
	ldw	-56(%r30), %r20			;! 6th argument
	ldw	-52(%r30), %r21			;! 5th argument
	gate	.+8, %r0			;! become privileged
	mtsp	%r0,%sr4			;! get kernel space into sr4
	mtsp	%r0,%sr5			;! get kernel space into sr5
	mtsp	%r0,%sr6			;! get kernel space into sr6
	mtsp	%r0,%sr7			;! get kernel space into sr7
	mfctl	%cr30,%r1			;! get the kernel task ptr
	mtctl	%r0,%cr30			;! zero it (flag)
	STREG	%r30,TASK_PT_GR30(%r1)		;! preserve userspace sp
	STREG	%r2,TASK_PT_GR2(%r1)		;! preserve rp
	STREG	%r27,TASK_PT_GR27(%r1)		;! user dp
	STREG	%r31,TASK_PT_GR31(%r1)		;! preserve syscall return ptr

	loadgp					;! setup kernel dp

	ldo	TASK_SZ_ALGN+64(%r1),%r30	;! set up kernel stack

	stw	%r21, -52(%r30)			;! 5th argument
	stw	%r20, -56(%r30)			;! 6th argument
	stw	%r19, -60(%r30)			;! 7th argument
	stw	%r28, -64(%r30)			;! 8th argument

	ldil	L%hpux_call_table, %r21
	ldo	R%hpux_call_table(%r21), %r21
	comiclr,>>=	__NR_HPUX_syscalls, %r22, %r0
	b,n	syscall_nosys
	ldwx,s	%r22(%r21), %r21
	ldil	L%hpux_syscall_exit,%r2
	be	0(%sr7,%r21)
	ldo	R%hpux_syscall_exit(%r2),%r2

syscall_nosys:
	ldil	L%hpux_syscall_exit,%r1
	be	R%hpux_syscall_exit(%sr7,%r1)
	ldo	-ENOSYS(%r0),%r28

	.align 4096
	.export end_hpux_gateway_page
end_hpux_gateway_page: