xref: /netbsd/sys/arch/m68k/m68k/reenter_syscall.s (revision 6550d01e)
1/*	$NetBSD: reenter_syscall.s,v 1.2 1999/11/10 23:17:21 thorpej Exp $	*/
2
3/*
4 * Written by ITOH Yasufumi.
5 * Public domain.
6 */
7
8#include <m68k/asm.h>
9
10/*
11 * void reenter_syscall(struct frame *fp, int stkadj)
12 *					__attribute__((__noreturn__));
13 *
14 * Move stack frame by stkadj bytes and re-enter syscall().
15 *
16 * XXX This is a kludge.
17 */
18
19ENTRY_NOPROFILE(reenter_syscall)
20	addql	#4,%sp			| pop PC
21	movel	%sp@+,%a0		| current frame addr
22	movel	%sp@,%d1		| stkadj
23
24| The m68k frame (struct trapframe) format:
25|	16:l	d0-d7/a0-a6/usp
26|	1:w	(pad)
27|	1:w	stkadj
28|	1:w	sr
29|	1:l	pc
30|	1:w	format/vector
31
32	moveal	%a0,%a1
33	subal	%d1,%a1			| new frame address
34	moveal	%a1,%sp			| set SP
35
36	| copy down frame (16*4 + 2 + 2 + 2 + 4 + 2 = 76 bytes = 19 longs)
37	moveq	#19-1,%d0
38Lcpfr:	movel	%a0@+,%a1@+
39	dbra	%d0,Lcpfr
40
41	movew	%d1,%sp@(16*4+2)	| set stack adjust count
42	movel	%sp@,%sp@-		| push syscall no (original d0 value)
43	jbsr	_C_LABEL(syscall)	| re-enter syscall()
44	addql	#4,%sp			| pop syscall no
45#ifdef DEBUG
46	tstw	%sp@(16*4+2)		| stack adjust must be zero
47	jeq	Ladjzero
48	PANIC("reenter_syscall")
49Ladjzero:
50#endif
51	moveal	%sp@(15*4),%a0		| grab and restore
52	movel	%a0,%usp		|   user SP
53	moveml	%sp@+,#0x7FFF		| restore user registers
54	addql	#8,%sp			| pop SP and stack adjust
55	jra	_ASM_LABEL(rei)		| rte
56
57