STATUS: 70%

0000 T _signal		compatible
    0052 T _psignal		compatible
    00b6 T _issig		compatible
    0186 T _stop		compatible
    0216 T _psig		compatible
    02d4 T _fsig		compatible
    031e T _core		not compatible
    0512 T _grow		not compatible
    0640 T _ptrace		not compatible
    075c T _procxmt		compatible
This commit is contained in:
Oliver Lehmann 2008-06-05 19:58:26 +00:00
parent 66432140c3
commit 4907b7ddcb
1 changed files with 39 additions and 23 deletions

View File

@ -288,45 +288,62 @@ core()
*/
grow(sp)
unsigned sp;
int sp;
{
register j, si, i;
register struct proc *p;
register a;
register int a;
/* FIXME: somehow goto out should do the job but then everything gets
ordered different in the ASM listing
this needs more work...
*/
if(sp >= ctob(CPAS - (u.u_ssize-1)))
if(sp >= ctob(256-(u.u_ssize-1)))
return(0);
for(j=6;;) {
--j;
if(!j)
if(!j--)
return(0);
si=(CPAS - btoc(sp))-u.u_ssize+j;
if(si <= 0)
si=(256-btoc(sp))-u.u_ssize+j;
if(si<=0)
continue;
if(!u.u_segmented) {
if((u.u_ssize + USIZE + si + u.u_dsize) >= CPAS)
if(!u.u_segmented){
if((u.u_ssize + USIZE + si + u.u_dsize) >= 0x100)
continue;
/* if(estabur(u.u_tsize,u.u_dsize,u.u_ssize+i,1))
goto out;
/* if(!estabur(u.u_tsize,u.u_dsize,u.u_ssize+si,1))
break;
*/ estabur(u.u_tsize,u.u_dsize,u.u_ssize+si,1);
} else {
if(u.u_ssize + si > CPAS) {
if(u.u_ssize + si > 0x100)
continue;
} else {
u.u_segmts[NUSEGS-1].sg_limit = (CPAS - (u.u_ssize+si));
/* goto out;*/
}
u.u_segmts[NUSEGS-1].sg_limit = 256 - (u.u_ssize+si);
break;
}
}
/* correct code based on the asm listing but gets ordered differently
because of the optimizer
j=6;
goto count;
not_seg:
if((u.u_ssize + USIZE + si + u.u_dsize) >= 0x100)
goto count;
if(estabur(u.u_tsize,u.u_dsize,u.u_ssize+si,1))
goto out;
count:
if(!j--)
return(0);
si=(256-btoc(sp))-u.u_ssize+j;
if(si<=0)
goto count;
if(!u.u_segmented)
goto not_seg;
if(u.u_ssize + si > 0x100)
continue;
u.u_segmts[NUSEGS-1].sg_limit = 256 - (u.u_ssize+si);
*/
out:
p = u.u_procp;
expand(p->p_size+si);
a=p->p_addr+p->p_size;
for(i=u.u_ssize; i; i--) {
a--;
copyseg(a-si, a);
@ -336,7 +353,6 @@ out:
u.u_ssize += si;
return(1);
}
/*
* sys-trace system call.
*/
@ -368,7 +384,7 @@ ptrace()
sleep((caddr_t)&ipc, IPCPRI);
ipc.ip_lock = p->p_pid;
ipc.ip_data = uap->data;
ipc.ip_addr.l = uap->addr.left&0x7f00; /* FIXME: not compatible */
ipc.ip_addr.l = (caddr_t)((long)uap->addr.l & 0x7F00FFFF); /* FIXME: not compatible */
ipc.ip_req = uap->req;
p->p_flag &= ~SWTED;
setrun(p);