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:
2014-02-18 11:25:02 +01:00
parent 5d04b92e06
commit cfd3379bb1
29 changed files with 608 additions and 485 deletions
+13 -14
View File
@@ -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
View File
@@ -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
View File
@@ -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);