STATUS: 78%

0000 T _exec		compatible
    0010 T _exece		99% compatible - uses a different temp. reg.
    0618 T _getxfile		not compatible
    0fe8 T _setregs		compatible
    1164 T _rexit		compatible
    118c T _exit		compatible
    1374 T _wait		compatible
    1428 T _freeproc		compatible
    14a2 T _fork		compatible
This commit is contained in:
Oliver Lehmann 2008-06-07 13:32:15 +00:00
parent 00d8dd899b
commit c601b93f3a
1 changed files with 158 additions and 154 deletions

View File

@ -244,7 +244,7 @@ register unsigned nargc;
int stackno, offs;
char segno[NUSEGS];
int j;
unsigned int segmts[NUSEGS-1];
unsigned int segmts[NUSEGS];
unsigned int stext;
unsigned int sdata;
unsigned int sbss;
@ -255,7 +255,7 @@ register unsigned nargc;
u.u_segflg = 1;
readi();
u.u_segflg = 0;
if (u.u_error) /* 1 */
if (u.u_error)
return ovly;
if (u.u_count){
bad0: u.u_error = ENOEXEC;
@ -278,8 +278,10 @@ bad0: u.u_error = ENOEXEC;
return ovly;
}
switch (magic){
case S_MAGIC3: sepid++;
case S_MAGIC1: scn = -1;
case S_MAGIC3:
sepid++;
case S_MAGIC1:
scn = -1;
for (i=0; i < (nseg+1)/2; i++){
for(j = 0;; j++){
if ( j <= 1){
@ -287,18 +289,18 @@ bad0: u.u_error = ENOEXEC;
stext = u.u_exdata.segtable[j].sg_code;
sdata = u.u_exdata.segtable[j].sg_data;
sbss = u.u_exdata.segtable[j].sg_bss;
if (++cseg > nseg) /* 10 */
if (++cseg > nseg)
break;
} else
break;
segno[++scn] = segment;
segmts[scn] = 0;
/* 11 */ if (u.u_exdata.segtable[j].sg_atr & SG_CODE){
if (u.u_exdata.segtable[j].sg_atr & SG_CODE){
segmts[scn] = stext;
/* 12 */ if (sepid){
if (sepid){
segno[scn] |= 0x80;
code_size += (unsigned long)stext;
/* 13 */ if (sestabur(lbtoc((long)stext), segno[scn], scn, 0))
if (sestabur(lbtoc((long)stext), segno[scn], scn, 0))
goto bad0;
else
continue;
@ -311,7 +313,7 @@ bad0: u.u_error = ENOEXEC;
goto bad0;
}
}
/* 17 */ if (u.u_exdata.segtable[j].sg_atr & SG_DATA){
if (u.u_exdata.segtable[j].sg_atr & SG_DATA){
segmts[scn] += sdata;
curdsiz = (unsigned long)segmts[scn] + (unsigned long)sbss;
if ((unsigned)curdsiz != curdsiz){
@ -320,12 +322,12 @@ bad0: u.u_error = ENOEXEC;
}
data_size += sdata;
bss_size += sbss;
/* 19 */ if (sestabur(lbtoc((long)(segmts[scn]+sbss)), segno[scn], scn, 1))
if (sestabur(lbtoc((long)(segmts[scn]+sbss)), segno[scn], scn, 1))
goto bad0;
} else {
if (u.u_exdata.segtable[j].sg_atr & SG_BSS){
bss_size += sbss;
/* 21 */ if (sestabur(lbtoc((long)(sbss + stext)), segno[scn], scn, 1))
if (sestabur(lbtoc((long)(sbss + stext)), segno[scn], scn, 1))
goto bad0;
}
}
@ -337,12 +339,12 @@ bad0: u.u_error = ENOEXEC;
u.u_segflg = 0;
}
if (code_size && (ip->i_flag & ITEXT) == 0 && ip->i_count != 1){
u.u_error = ENOSEG;
u.u_error = ETXTBSY;
return ovly;
}
ussize = lbtoc((long)nargc) + SSIZE;
u.u_stakseg = stackno;
/* 25*/ if (sestabur(ussize, stackno, 0, 0))
if (sestabur(ussize, stackno, 0, 0))
goto bad0;
utsize = lbtoc((long)code_size);
udsize = lbtoc((long)(data_size + bss_size));
@ -354,7 +356,7 @@ bad0: u.u_error = ENOEXEC;
setscr();
u.u_exdsz = u.u_exdata.s_exc.s_segt + 24;
u.u_nsegs = nseg;
/* 27*/ for (i = 0; i < nseg; i++)
for (i = 0; i < nseg; i++)
u.u_segno[i] = segno[i];
u.u_sep = (unsigned char)sepid;
u.u_prof[0].pr_scale = 0;
@ -395,10 +397,11 @@ bad0: u.u_error = ENOEXEC;
segureg();
return ovly;
case S_MAGIC4:
default: u.u_error = ENOEXEC;
default:
u.u_error = ENOEXEC;
return ovly;
}
} else /* von b3 */
} else
code_size = u.u_exdata.segtable[0].sg_code;
if ((head_size = u.u_exdata.s_exc.s_segt) == sizeof(struct segt) || (magic == N_MAGIC1))
data_size = u.u_exdata.segtable[0].sg_data;
@ -410,7 +413,7 @@ bad0: u.u_error = ENOEXEC;
u.u_exdsz -= head_size;
switch(magic){
case N_MAGIC1:
{ data_size = curdsiz = data_size + code_size;
data_size = curdsiz = data_size + code_size;
u.u_exdata.segtable[0].sg_data = curdsiz;
if ((unsigned)curdsiz != curdsiz){
u.u_error = ENOMEM;
@ -419,28 +422,24 @@ bad0: u.u_error = ENOEXEC;
code_size=0;
u.u_exdata.segtable[0].sg_code=0;
break;
}
case N_MAGIC4:
{ ovly++;
break;
}
case N_MAGIC3:
{ sepid++;
sepid++;
break;
case N_MAGIC4:
ovly++;
break;
}
default:
{ u.u_error = ENOEXEC;
u.u_error = ENOEXEC;
return ovly;
}
}
if (code_size && (ip->i_flag & ITEXT) == 0 &&
if ((code_size) && (ip->i_flag & ITEXT) == 0 &&
ip->i_count!=(cnt_t)1){
u.u_error = ENOSEG;
u.u_error = ETXTBSY;
return ovly;
}
utsize = lbtoc((long)code_size);
curdsiz = data_size + bss_size;
/* 45 */if ((unsigned)curdsiz != curdsiz){
if ((unsigned)curdsiz != curdsiz){
u.u_error = ENOMEM;
return ovly;
}
@ -454,7 +453,7 @@ bad0: u.u_error = ENOEXEC;
u.u_error = ENOMEM;
return ovly;
}
/* 49 */if (nargc){
if (nargc){
u.u_error = ENOMEM;
return ovly;
}
@ -472,14 +471,19 @@ bad0: u.u_error = ENOEXEC;
while (--i >= USIZE)
clearseg(u.u_procp->p_addr + i);
xalloc(ip, code_size);
estabur(0, udsize, 0, 1);
/* read in data segment */
estabur((unsigned)0, udsize, (unsigned)0, 1);
u.u_base.left = USEGW;
u.u_base.right = 0;
u.u_offset = (unsigned long)(u.u_exdsz+(unsigned)code_size);
u.u_count = data_size;
readi(ip);
/* 51 */ if ((u.u_procp->p_flag & STRC)==0){
if ((ip->i_mode & ISUID) && (u.u_uid)){
/*
* set SUID/SGID protections, if no tracing
*/
if ((u.u_procp->p_flag & STRC)==0){
if (ip->i_mode & ISUID)
if (u.u_uid){
u.u_uid = ip->i_uid;
u.u_procp->p_uid = ip->i_uid;
}