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; unsigned long bss_size;
int scn, nseg, cseg; int scn, nseg, cseg;
int segment; int segment;
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,127 +278,130 @@ 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++;
for (i=0; i < (nseg+1)/2; i++){ case S_MAGIC1:
for(j = 0; ; j++){ scn = -1;
if ( j <= 1){ for (i=0; i < (nseg+1)/2; i++){
segment = u.u_exdata.segtable[j].sg_segno; for(j = 0;; j++){
stext = u.u_exdata.segtable[j].sg_code; if ( j <= 1){
sdata = u.u_exdata.segtable[j].sg_data; segment = u.u_exdata.segtable[j].sg_segno;
sbss = u.u_exdata.segtable[j].sg_bss; stext = u.u_exdata.segtable[j].sg_code;
if (++cseg > nseg) /* 10 */ sdata = u.u_exdata.segtable[j].sg_data;
break; sbss = u.u_exdata.segtable[j].sg_bss;
} else if (++cseg > nseg)
break; break;
segno[++scn] = segment; } else
segmts[scn] = 0; break;
/* 11 */ if (u.u_exdata.segtable[j].sg_atr & SG_CODE){ segno[++scn] = segment;
segmts[scn] = stext; segmts[scn] = 0;
/* 12 */ if (sepid){ if (u.u_exdata.segtable[j].sg_atr & SG_CODE){
segno[scn] |= 0x80; segmts[scn] = stext;
code_size += (unsigned long)stext; if (sepid){
/* 13 */ if (sestabur(lbtoc((long)stext), segno[scn], scn, 0)) segno[scn] |= 0x80;
goto bad0; code_size += (unsigned long)stext;
else if (sestabur(lbtoc((long)stext), segno[scn], scn, 0))
continue; goto bad0;
} else { else
u.u_tseg = segno[scn]; continue;
u.u_toff = lbtoc((long)stext); } else {
data_size += stext; u.u_tseg = segno[scn];
if (sdata == 0 && sbss == 0) u.u_toff = lbtoc((long)stext);
if (sestabur(lbtoc((long)stext), segno[scn], scn, 1)) data_size += stext;
goto bad0; 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;
} }
} if (code_size && (ip->i_flag & ITEXT) == 0 && ip->i_count != 1){
/* 17 */ if (u.u_exdata.segtable[j].sg_atr & SG_DATA){ u.u_error = ETXTBSY;
segmts[scn] += sdata; return ovly;
curdsiz = (unsigned long)segmts[scn] + (unsigned long)sbss; }
if ((unsigned)curdsiz != curdsiz){ 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; u.u_error = ENOMEM;
return ovly; return ovly;
} }
data_size += sdata; u.u_segmented = 1;
bss_size += sbss; setscr();
/* 19 */ if (sestabur(lbtoc((long)(segmts[scn]+sbss)), segno[scn], scn, 1)) u.u_exdsz = u.u_exdata.s_exc.s_segt + 24;
goto bad0; u.u_nsegs = nseg;
} else { for (i = 0; i < nseg; i++)
if (u.u_exdata.segtable[j].sg_atr & SG_BSS){ u.u_segno[i] = segno[i];
bss_size += sbss; u.u_sep = (unsigned char)sepid;
/* 21 */ if (sestabur(lbtoc((long)(sbss + stext)), segno[scn], scn, 1)) u.u_prof[0].pr_scale = 0;
goto bad0; 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 } 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; 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;
@ -409,38 +412,34 @@ bad0: u.u_error = ENOEXEC;
if (head_size == sizeof(struct segt)) if (head_size == sizeof(struct segt))
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;
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; return ovly;
}
code_size=0;
u.u_exdata.segtable[0].sg_code=0;
break;
} }
case N_MAGIC4: if ((code_size) && (ip->i_flag & ITEXT) == 0 &&
{ ovly++;
break;
}
case N_MAGIC3:
{ sepid++;
break;
}
default:
{ u.u_error = ENOEXEC;
return ovly;
}
}
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,17 +471,22 @@ 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
u.u_uid = ip->i_uid; */
u.u_procp->p_uid = ip->i_uid; 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) if (ip->i_mode & ISGID)
u.u_gid = ip->i_gid; u.u_gid = ip->i_gid;
} else } else