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:
parent
00d8dd899b
commit
c601b93f3a
|
|
@ -1,18 +1,18 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
|
|
||||||
W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1988
|
W E G A - Quelle (C) ZFT/KEAW Abt. Basissoftware - 1988
|
||||||
|
|
||||||
KERN 3.2 Modul: sys1.c
|
KERN 3.2 Modul: sys1.c
|
||||||
|
|
||||||
|
|
||||||
Bearbeiter:
|
Bearbeiter:
|
||||||
Datum: $D$
|
Datum: $D$
|
||||||
Version: $R$
|
Version: $R$
|
||||||
|
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
char sys1wstr[] = "@[$]sys1.c Rev : 4.1 09/28/83 00:28:52";
|
char sys1wstr[] = "@[$]sys1.c Rev : 4.1 09/28/83 00:28:52";
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue