1: /* 2: * Copyright (c) 1987 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifdef SYSLIBC_SCCS 8: _sccsid: <@(#)execle.s 2.6 (2.11BSD GTE) 1995/05/08\0> 9: .even 10: #endif SYSLIBC_SCCS 11: 12: /* 13: * XXX - this routine can't use SYSCALL!!! 14: */ 15: #include "SYS.h" 16: 17: ENTRY(execle) 18: tst -(sp) / leave space for environment pointer 19: mov sp,r0 / calculate address of first argv element 20: add $6.,r0 21: mov r0,-(sp) / (pass it) 22: 1: 23: tst (r0)+ / found the end of the argv list yet? 24: bne 1b / nope - keep looping 25: mov (r0),2(sp) / yeah, pass the user environment pointer 26: mov 6(sp),-(sp) / pass the name 27: tst -(sp) / simulate return address stack spacing 28: SYS(execve) / and go for it ... / / trap 59 -> [kernel] -> syscall() -> via sysent[] -> handler: execve / 29: add $8.,sp / if we get back it's an error 30: jmp x_error