|
|
coherent
#include <stdio.h>
#include <sys/types.h>
#include <errno.h>
extern char *_brk();
#if Z8001
paddr_t
vtop( cp)
register unsigned long cp;
{
register unsigned int offs = cp;
cp >>= 8;
cp &= 0x7F0000L;
return( cp | offs);
}
char *
ptov( p)
register unsigned long p;
{
register unsigned int offs = p;
p <<=8;
p &= 0x7F000000L;
return( p | offs);
}
#else
#define vtop( A) ( (paddr_t)(A))
#define ptov( A) ( (char *)(A))
#endif
#if IAPX86
static char *minbrk = NULL; /* must init at run time */
static char *actbrk = NULL;
static char *reqbrk = NULL;
#else
extern char end[]; /* end of loaded private data */
static char *minbrk = end; /* can't brk before end */
static char *actbrk = end; /* actual end of private data */
static char *reqbrk = end; /* requested (virtual) end of p.d. */
#endif
int
brk( newbrk)
register char *newbrk;
{
register char *abrk;
errno = 0;
newbrk += (int)newbrk & 1;
#if IAPX86
if( minbrk == NULL)
minbrk = actbrk = reqbrk = _brk( NULL);
#endif
if( newbrk < minbrk) {
errno = EINVAL;
return( -1);
}
abrk = _brk( newbrk);
if( errno)
return( -1);
if( abrk < newbrk) {
errno = ENOMEM;
return( -1);
}
reqbrk = newbrk;
actbrk = abrk;
return( 0);
}
char *
sbrk( incr)
register unsigned int incr;
{
register paddr_t rbrk;
#if IAPX86
if( minbrk == NULL)
minbrk = actbrk = reqbrk = _brk(NULL);
#endif
incr += incr & 1;
rbrk = vtop( reqbrk);
if( rbrk + incr <= vtop( actbrk)) {
reqbrk = ptov( rbrk + incr);
return( ptov(rbrk));
}
#if Z8001
if( (rbrk+incr ^ rbrk) > 65536L && (int)rbrk+incr) {
rbrk += 65536L;
rbrk &= 0xFFFF0000L;
reqbrk = ptov( rbrk);
}
#endif
if( brk( ptov( rbrk + incr)))
return( (char *)-1);
return( ptov( rbrk));
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.