From 4907b7ddcbc5cd0f693afbb420f67f6742982c0f Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Thu, 5 Jun 2008 19:58:26 +0000 Subject: [PATCH] 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 --- WEGA/src/uts/sys/sig.c | 62 ++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/WEGA/src/uts/sys/sig.c b/WEGA/src/uts/sys/sig.c index b8bd516..0277e81 100644 --- a/WEGA/src/uts/sys/sig.c +++ b/WEGA/src/uts/sys/sig.c @@ -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);