add WEGA 3.2 file
This commit is contained in:
parent
2f58177899
commit
8a33d69c1e
|
|
@ -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();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue