git-svn-id: file:///srv/svn/repos/haiku/trunk/current@329 a95241bf-73f2-0310-859d-f6bbb57e9c96
128 lines
2.9 KiB
C++
128 lines
2.9 KiB
C++
#include "vmInterface.h"
|
|
#include "areaManager.h"
|
|
#include "mman.h"
|
|
|
|
areaManager am;
|
|
|
|
areaManager *getAM(void)
|
|
{
|
|
// Normally, we would go to the current user process to get this. Since there no such thing exists here...
|
|
return &am;
|
|
}
|
|
|
|
int vmInterface::getAreaByAddress(void *address)
|
|
{
|
|
area *myArea = getAM()->findArea(address);
|
|
if (myArea)
|
|
return myArea->getAreaID();
|
|
else
|
|
return B_ERROR;
|
|
}
|
|
|
|
status_t vmInterface::setAreaProtection(int Area,protectType prot)
|
|
{
|
|
area *myArea = getAM()->findArea(Area);
|
|
if (myArea)
|
|
return myArea->setProtection(prot);
|
|
else
|
|
return B_ERROR;
|
|
}
|
|
|
|
status_t vmInterface::resizeArea(int Area,size_t size)
|
|
{
|
|
area *oldArea;
|
|
oldArea=getAM()->findArea(Area);
|
|
if (oldArea)
|
|
return oldArea->resize(size);
|
|
else
|
|
return B_ERROR;
|
|
}
|
|
|
|
int vmInterface::createArea(char *AreaName,int pageCount,void **address, addressSpec addType,pageState state,protectType protect)
|
|
{
|
|
area *newArea = new area(getAM());
|
|
newArea->createArea(AreaName,pageCount,address,addType,state,protect);
|
|
newArea->setAreaID(nextAreaID++); // THIS IS NOT THREAD SAFE
|
|
getAM()->addArea(newArea);
|
|
return newArea->getAreaID();
|
|
}
|
|
|
|
void vmInterface::freeArea(int Area)
|
|
{
|
|
area *oldArea=getAM()->findArea(Area);
|
|
getAM()->removeArea(oldArea);
|
|
delete oldArea;
|
|
}
|
|
|
|
status_t vmInterface::getAreaInfo(int Area,area_info *dest)
|
|
{
|
|
area *oldArea=getAM()->findArea(Area);
|
|
return oldArea->getInfo(dest);
|
|
}
|
|
|
|
status_t vmInterface::getNextAreaInfo(int process,int32 *cookie,area_info *dest)
|
|
// Left for later..
|
|
{
|
|
;
|
|
}
|
|
|
|
int vmInterface::getAreaByName(char *name)
|
|
{
|
|
return getAM()->findArea(name)->getAreaID();
|
|
}
|
|
|
|
int vmInterface::cloneArea(int area,char *AreaName,void **address, addressSpec addType=ANY, pageState state=NO_LOCK, protectType prot=writable)
|
|
{
|
|
;
|
|
}
|
|
|
|
void vmInterface::pager(void)
|
|
{
|
|
// This should iterate over all processes...
|
|
while (1)
|
|
{
|
|
am.pager(pageMan.desperation());
|
|
snooze(250000);
|
|
}
|
|
}
|
|
|
|
void vmInterface::saver(void)
|
|
{
|
|
// This should iterate over all processes...
|
|
while (1)
|
|
{
|
|
am.saver();
|
|
snooze(250000);
|
|
}
|
|
}
|
|
|
|
void vmInterface::cleaner(void)
|
|
{
|
|
// This loops on its own
|
|
pageMan.cleaner();
|
|
}
|
|
|
|
void *vmInterface::mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
|
|
{
|
|
char name[MAXPATHLEN];
|
|
// Get the filename from fd...
|
|
strcpy( name,"mmap - need to include fileName");
|
|
|
|
addressSpec addType=((flags|MAP_FIXED)?EXACT:ANY);
|
|
protectType protType=(prot|PROT_WRITE)?writable:(prot|PROT_READ)?readable:none;
|
|
// Not doing anything with MAP_SHARED and MAP_COPY - needs to be done
|
|
if (flags | MAP_ANON)
|
|
{
|
|
createArea(name,(int)((len+PAGE_SIZE-1)/PAGE_SIZE),&addr, addType ,LAZY,protType);
|
|
return addr;
|
|
}
|
|
|
|
area *newArea = new area(getAM());
|
|
newArea->createAreaMappingFile(name,(int)((len+PAGE_SIZE-1)/PAGE_SIZE),&addr,addType,LAZY,protType,fd,offset);
|
|
newArea->setAreaID(nextAreaID++); // THIS IS NOT THREAD SAFE
|
|
getAM()->addArea(newArea);
|
|
newArea->getAreaID();
|
|
return addr;
|
|
|
|
}
|