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