Removing CSU patches
* Removed startup code patches in lib/csu regarding kernel to userland
ABI.
* Aligned stack layout on NetBSD stack layout.
* Generate valid stack pointers instead of offsets by taking into account
_minix_kerninfo->kinfo->user_sp.
* Refactored stack generation, by moving part of execve in two
functions {minix_stack_params(), minix_stack_fill()} and using them
in execve(), rs and vm.
* Changed load offset of rtld (ld.so) to:
execi.args.stack_high - execi.args.stack_size - 0xa00000
which is 10MB below the main executable stack.
Change-Id: I839daf3de43321cded44105634102d419cb36cec
This commit is contained in:
+13
-14
@@ -48,6 +48,7 @@ int do_exec()
|
||||
m.PM_FRAME = m_in.frame_ptr;
|
||||
m.PM_FRAME_LEN = m_in.msg_frame_len;
|
||||
m.PM_EXECFLAGS = m_in.PMEXEC_FLAGS;
|
||||
m.PM_PS_STR = (vir_bytes)m_in.m1_p4; /* ps_strings pointer into the frame. */
|
||||
|
||||
tell_vfs(mp, &m);
|
||||
|
||||
@@ -59,7 +60,7 @@ int do_exec()
|
||||
/*===========================================================================*
|
||||
* do_newexec *
|
||||
*===========================================================================*/
|
||||
int do_newexec()
|
||||
int do_newexec(void)
|
||||
{
|
||||
int proc_e, proc_n, allow_setuid;
|
||||
char *ptr;
|
||||
@@ -127,24 +128,25 @@ int do_newexec()
|
||||
/*===========================================================================*
|
||||
* do_execrestart *
|
||||
*===========================================================================*/
|
||||
int do_execrestart()
|
||||
int do_execrestart(void)
|
||||
{
|
||||
int proc_e, proc_n, result;
|
||||
struct mproc *rmp;
|
||||
vir_bytes pc;
|
||||
vir_bytes pc, ps_str;
|
||||
|
||||
if (who_e != RS_PROC_NR)
|
||||
return EPERM;
|
||||
|
||||
proc_e= m_in.EXC_RS_PROC;
|
||||
proc_e = m_in.EXC_RS_PROC;
|
||||
if (pm_isokendpt(proc_e, &proc_n) != OK) {
|
||||
panic("do_execrestart: got bad endpoint: %d", proc_e);
|
||||
}
|
||||
rmp= &mproc[proc_n];
|
||||
result= m_in.EXC_RS_RESULT;
|
||||
pc= (vir_bytes)m_in.EXC_RS_PC;
|
||||
rmp = &mproc[proc_n];
|
||||
result = m_in.EXC_RS_RESULT;
|
||||
pc = (vir_bytes)m_in.EXC_RS_PC;
|
||||
ps_str = (vir_bytes)m_in.EXC_RS_PS_STR;
|
||||
|
||||
exec_restart(rmp, result, pc, rmp->mp_frame_addr);
|
||||
exec_restart(rmp, result, pc, rmp->mp_frame_addr, ps_str);
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -153,11 +155,8 @@ int do_execrestart()
|
||||
/*===========================================================================*
|
||||
* exec_restart *
|
||||
*===========================================================================*/
|
||||
void exec_restart(rmp, result, pc, vfs_newsp)
|
||||
struct mproc *rmp;
|
||||
int result;
|
||||
vir_bytes pc;
|
||||
vir_bytes vfs_newsp;
|
||||
void exec_restart(struct mproc *rmp, int result, vir_bytes pc, vir_bytes sp,
|
||||
vir_bytes ps_str)
|
||||
{
|
||||
int r, sn;
|
||||
|
||||
@@ -199,7 +198,7 @@ vir_bytes vfs_newsp;
|
||||
#endif /* USE_TRACE */
|
||||
|
||||
/* Call kernel to exec with SP and PC set by VFS. */
|
||||
r= sys_exec(rmp->mp_endpoint, (char *) vfs_newsp, rmp->mp_name, pc);
|
||||
r = sys_exec(rmp->mp_endpoint, (char *) sp, rmp->mp_name, pc, ps_str);
|
||||
if (r != OK) panic("sys_exec failed: %d", r);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -434,7 +434,7 @@ static void handle_vfs_reply()
|
||||
|
||||
case PM_EXEC_REPLY:
|
||||
exec_restart(rmp, m_in.PM_STATUS, (vir_bytes)m_in.PM_PC,
|
||||
(vir_bytes)m_in.PM_NEWSP);
|
||||
(vir_bytes)m_in.PM_NEWSP, (vir_bytes)m_in.PM_NEWPS_STR);
|
||||
|
||||
break;
|
||||
|
||||
|
||||
+2
-1
@@ -20,7 +20,8 @@ int do_brk(void);
|
||||
int do_exec(void);
|
||||
int do_newexec(void);
|
||||
int do_execrestart(void);
|
||||
void exec_restart(struct mproc *rmp, int result, vir_bytes pc, vir_bytes sp);
|
||||
void exec_restart(struct mproc *rmp, int result, vir_bytes pc, vir_bytes sp,
|
||||
vir_bytes ps_str);
|
||||
|
||||
/* forkexit.c */
|
||||
int do_fork(void);
|
||||
|
||||
Reference in New Issue
Block a user