add WEGA 3.2 file

This commit is contained in:
Oliver Lehmann 2008-05-31 21:08:37 +00:00
parent 2f58177899
commit 8a33d69c1e
1 changed files with 172 additions and 0 deletions

172
WEGA/src/uts/sys/break.c Normal file
View File

@ -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 <sys/param.h>
#include <sys/sysparm.h>
#include <sys/sysinfo.h>
#include <sys/systm.h>
#include <sys/dir.h>
#include <sys/mmu.h>
#include <sys/buf.h>
#include <sys/conf.h>
#include <sys/proc.h>
#include <sys/s.out.h>
#include <sys/user.h>
#include <sys/map.h>
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;i<u.u_nsegs;i++) {
if (((int)u.u_segno[i] & 0x80) == 0){
u.u_r.r_val1 = u.u_segno[i]<<8;
u.u_r.r_val2 = (u.u_segmts[i].sg_limit+1)<<8;
}
}
return;
} else {
l = uap->segaddr.left >> 8;
for(i=0;i<u.u_nsegs;i++) {
if(u.u_segno[i] == l)
break;
}
if(i==u.u_nsegs) {
u.u_error = ENOMEM;
return;
}
}
}
break_handler(l,r,i);
}
ssgbrk()
{
register int a,j,b,i;
struct a {
int par1;
unsigned par2;
} *uap;
uap = (struct a *)u.u_ap;
j = uap->par1;
for(i=0;i<u.u_nsegs;i++) {
if(u.u_segno[i] == j)
break;
}
if(i==u.u_nsegs) {
u.u_error = ENOMEM;
return;
}
if(!u.u_segmts[i].sg_limit && u.u_segmts[i].sg_attr&0x14)
b=0;
else
b=(u.u_segmts[i].sg_limit&0xff)+1;
a=lbtoc((long)uap->par2);
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();
}