From 8a33d69c1ec256517064128dc3a5ce81fc9615b5 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Sat, 31 May 2008 21:08:37 +0000 Subject: [PATCH] add WEGA 3.2 file --- WEGA/src/uts/sys/break.c | 172 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 WEGA/src/uts/sys/break.c diff --git a/WEGA/src/uts/sys/break.c b/WEGA/src/uts/sys/break.c new file mode 100644 index 0000000..ddf8957 --- /dev/null +++ b/WEGA/src/uts/sys/break.c @@ -0,0 +1,172 @@ +/****************************************************************************** +******************************************************************************* + + W E G A - Quelle + + KERN 3.2 Modul: break.c + + + Bearbeiter: O. Lehmann + Datum: 30.05.08 + Version: 1.0 + +******************************************************************************* +******************************************************************************/ + +char breakwstr[] = "@[$]break.c Rev : 4.1 08/27/83 11:54:02"; + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +sbreak() +{ + register int l,r; + register unsigned i; + struct a { + saddr_t segaddr; + } *uap; + + uap = (struct a *)u.u_ap; + r = lbtoc((long)uap->segaddr.right); + if(u.u_segmented) { + if(!uap->segaddr.l) { + for(i=0;isegaddr.left >> 8; + for(i=0;ipar1; + + for(i=0;ipar2); + if(a) { + break_handler(j,b+a,i); + if(u.u_error) + return; + } + u.u_r.r_val1 = uap->par1<<8; + u.u_r.r_val2 = b<<8; +} + +break_handler(l,r,i) +register int l; +register unsigned r; +register int i; +{ + register int foo1,foo2,b; + int size; + struct proc *p; + extern int maxmem; + + p = u.u_procp; + if(r > 0x100) { + u.u_error = ENOMEM; + return; + } + if(u.u_segmented) { + if(!u.u_segmts[i].sg_limit && u.u_segmts[i].sg_attr&0x14) + b=r; + else + b=r-(u.u_segmts[i].sg_limit+1); + if((u.u_tsize + USIZE + u.u_dsize + u.u_ssize + b) > maxmem) { + u.u_error = ENOMEM; + return; + } + size = p->p_addr + p->p_size; + if(!u.u_segmts[i].sg_limit && u.u_segmts[i].sg_attr&0x14) + size -= u.u_segmts[i].sg_base; + else + size -= u.u_segmts[i].sg_base+u.u_segmts[i].sg_limit+1; + sestabur(r,u.u_segno[i],i,0); + if(u.u_error) + return; + + u.u_dsize += b; + shufflecore(p->p_size+b,p->p_size,size); + } else { + b = r - u.u_dsize; + if(estabur(u.u_tsize,r,u.u_ssize,1)) + return; + u.u_dsize = r; + shufflecore(p->p_size+b,p->p_size,u.u_ssize); + } +} + +shufflecore(a,b,c) +register a,b,c; +{ + register d,e; + + e=a-b; + if(e>0) { + expand(a); + d=u.u_procp->p_addr+a; + while(c--) { + d--; + copyseg(d-e,d); + } + while(e--){ + d--; + clearseg(d); + } + } else { + if(e<0) { + while(c--) { + copyseg((u.u_procp->p_addr+b-1)-c,(u.u_procp->p_addr+a-1)-c); + } + expand(a); + } + } + + if(!u.u_segmented) + return; + invsdrs(); + segureg(); +}