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

@ -241,10 +241,10 @@ register unsigned nargc;
unsigned long bss_size;
int scn, nseg, cseg;
int segment;
int stackno, offs;
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,127 +278,130 @@ bad0: u.u_error = ENOEXEC;
return ovly;
}
switch (magic){
case S_MAGIC3: sepid++;
case S_MAGIC1: scn = -1;
for (i=0; i < (nseg+1)/2; i++){
for(j = 0; ; j++){
if ( j <= 1){
segment = u.u_exdata.segtable[j].sg_segno;
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 */
break;
} else
break;
segno[++scn] = segment;
segmts[scn] = 0;
/* 11 */ if (u.u_exdata.segtable[j].sg_atr & SG_CODE){
segmts[scn] = stext;
/* 12 */ if (sepid){
segno[scn] |= 0x80;
code_size += (unsigned long)stext;
/* 13 */ if (sestabur(lbtoc((long)stext), segno[scn], scn, 0))
goto bad0;
else
continue;
} else {
u.u_tseg = segno[scn];
u.u_toff = lbtoc((long)stext);
data_size += stext;
if (sdata == 0 && sbss == 0)
if (sestabur(lbtoc((long)stext), segno[scn], scn, 1))
goto bad0;
case S_MAGIC3:
sepid++;
case S_MAGIC1:
scn = -1;
for (i=0; i < (nseg+1)/2; i++){
for(j = 0;; j++){
if ( j <= 1){
segment = u.u_exdata.segtable[j].sg_segno;
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)
break;
} else
break;
segno[++scn] = segment;
segmts[scn] = 0;
if (u.u_exdata.segtable[j].sg_atr & SG_CODE){
segmts[scn] = stext;
if (sepid){
segno[scn] |= 0x80;
code_size += (unsigned long)stext;
if (sestabur(lbtoc((long)stext), segno[scn], scn, 0))
goto bad0;
else
continue;
} else {
u.u_tseg = segno[scn];
u.u_toff = lbtoc((long)stext);
data_size += stext;
if (sdata == 0 && sbss == 0)
if (sestabur(lbtoc((long)stext), segno[scn], scn, 1))
goto bad0;
}
}
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){
u.u_error = ENOMEM;
return ovly;
}
data_size += sdata;
bss_size += sbss;
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;
if (sestabur(lbtoc((long)(sbss + stext)), segno[scn], scn, 1))
goto bad0;
}
}
}
u.u_base.l = (caddr_t)u.u_exdata.segtable;
u.u_count = 32;
u.u_segflg = 1;
readi(ip);
u.u_segflg = 0;
}
}
/* 17 */ 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){
if (code_size && (ip->i_flag & ITEXT) == 0 && ip->i_count != 1){
u.u_error = ETXTBSY;
return ovly;
}
ussize = lbtoc((long)nargc) + SSIZE;
u.u_stakseg = stackno;
if (sestabur(ussize, stackno, 0, 0))
goto bad0;
utsize = lbtoc((long)code_size);
udsize = lbtoc((long)(data_size + bss_size));
if ((utsize+USIZE+udsize+ussize) > umemory){
u.u_error = ENOMEM;
return ovly;
}
data_size += sdata;
bss_size += sbss;
/* 19 */ 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))
goto bad0;
u.u_segmented = 1;
setscr();
u.u_exdsz = u.u_exdata.s_exc.s_segt + 24;
u.u_nsegs = nseg;
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;
u.u_nprof = 0;
xfree();
i = udsize + USIZE + ussize;
expand(i);
while (--i >= USIZE)
clearseg(u.u_procp->p_addr + i);
xalloc(ip, code_size, &segmts[0]);
if (code_size == 0){
invsdrs();
segureg();
}
}
u.u_offset = u.u_exdsz;
for (scn = 0;scn < nseg; scn++){
if (u.u_segno[scn] & 0x80){
u.u_offset += segmts[scn];
sestabur(u.u_segmts[scn].sg_limit+1, u.u_segno[scn], scn, 1);
} else {
u.u_base.left = ctob(u.u_segno[scn] & 0x7f);
u.u_base.right = 0;
u.u_count = segmts[scn];
readi(ip);
}
}
if ((u.u_procp->p_flag & STRC) == 0){
if ((ip->i_mode & ISUID) && (u.u_uid)){
u.u_uid = ip->i_uid;
u.u_procp->p_uid = ip->i_uid;
}
if (ip->i_mode & ISGID)
u.u_gid = ip->i_gid;
} else
psignal(u.u_procp, SIGTRAP);
u.u_dsize = u.u_tsize = utsize;
u.u_ssize = ussize;
segureg();
return ovly;
case S_MAGIC4:
default:
u.u_error = ENOEXEC;
return ovly;
}
u.u_base.l = (caddr_t)u.u_exdata.segtable;
u.u_count = 32;
u.u_segflg = 1;
readi(ip);
u.u_segflg = 0;
}
if (code_size && (ip->i_flag & ITEXT) == 0 && ip->i_count != 1){
u.u_error = ENOSEG;
return ovly;
}
ussize = lbtoc((long)nargc) + SSIZE;
u.u_stakseg = stackno;
/* 25*/ if (sestabur(ussize, stackno, 0, 0))
goto bad0;
utsize = lbtoc((long)code_size);
udsize = lbtoc((long)(data_size + bss_size));
if ((utsize+USIZE+udsize+ussize) > umemory){
u.u_error = ENOMEM;
return ovly;
}
u.u_segmented = 1;
setscr();
u.u_exdsz = u.u_exdata.s_exc.s_segt + 24;
u.u_nsegs = nseg;
/* 27*/ 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;
u.u_nprof = 0;
xfree();
i = udsize + USIZE + ussize;
expand(i);
while (--i >= USIZE)
clearseg(u.u_procp->p_addr + i);
xalloc(ip, code_size, &segmts[0]);
if (code_size == 0){
invsdrs();
segureg();
}
u.u_offset = u.u_exdsz;
for (scn = 0;scn < nseg; scn++){
if (u.u_segno[scn] & 0x80){
u.u_offset += segmts[scn];
sestabur(u.u_segmts[scn].sg_limit+1, u.u_segno[scn], scn, 1);
} else {
u.u_base.left = ctob(u.u_segno[scn] & 0x7f);
u.u_base.right = 0;
u.u_count = segmts[scn];
readi(ip);
}
}
if ((u.u_procp->p_flag & STRC) == 0){
if ((ip->i_mode & ISUID) && (u.u_uid)){
u.u_uid = ip->i_uid;
u.u_procp->p_uid = ip->i_uid;
}
if (ip->i_mode & ISGID)
u.u_gid = ip->i_gid;
} else
psignal(u.u_procp, SIGTRAP);
u.u_dsize = u.u_tsize = utsize;
u.u_ssize = ussize;
segureg();
return ovly;
case S_MAGIC4:
default: u.u_error = ENOEXEC;
return ovly;
}
} else /* von b3 */
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;
@ -409,38 +412,34 @@ bad0: u.u_error = ENOEXEC;
if (head_size == sizeof(struct segt))
u.u_exdsz -= head_size;
switch(magic){
case N_MAGIC1:
{ data_size = curdsiz = data_size + code_size;
u.u_exdata.segtable[0].sg_data = curdsiz;
if ((unsigned)curdsiz != curdsiz){
u.u_error = ENOMEM;
case N_MAGIC1:
data_size = curdsiz = data_size + code_size;
u.u_exdata.segtable[0].sg_data = curdsiz;
if ((unsigned)curdsiz != curdsiz){
u.u_error = ENOMEM;
return ovly;
}
code_size=0;
u.u_exdata.segtable[0].sg_code=0;
break;
case N_MAGIC3:
sepid++;
break;
case N_MAGIC4:
ovly++;
break;
default:
u.u_error = ENOEXEC;
return ovly;
}
code_size=0;
u.u_exdata.segtable[0].sg_code=0;
break;
}
case N_MAGIC4:
{ ovly++;
break;
}
case N_MAGIC3:
{ sepid++;
break;
}
default:
{ 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,17 +471,22 @@ 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)){
u.u_uid = ip->i_uid;
u.u_procp->p_uid = ip->i_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;
}
if (ip->i_mode & ISGID)
u.u_gid = ip->i_gid;
} else