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