diff --git a/src/kernel/vm2/area.C b/src/kernel/vm2/area.C index 62f705b858..a06e465f7d 100644 --- a/src/kernel/vm2/area.C +++ b/src/kernel/vm2/area.C @@ -1,3 +1,4 @@ +#include #include "area.h" #include "areaManager.h" #include "vpage.h" @@ -52,11 +53,11 @@ status_t area::createAreaMappingFile(char *inName, int pageCount,void **address, unsigned long base=mapAddressSpecToAddress(type,requested,pageCount); for (int i=0;ifd=fd; newVnode->offset=offset+PAGE_SIZE*i; newVnode->valid=true; - newPage=vpagePool.get(); + newPage=new (vpagePool.get()) vpage; newPage->setup(base+PAGE_SIZE*i,newVnode,NULL,protect,inState); vpages.add(newPage); // printf ("New vnode with fd %d, offset = %d\n",fd,newVnode->offset); @@ -86,7 +87,7 @@ status_t area::createArea(char *inName, int pageCount,void **address, addressSpe for (int i=0;isetup(base+PAGE_SIZE*i,NULL,NULL,protect,inState); vpages.add(newPage); } @@ -118,7 +119,7 @@ status_t area::cloneArea(area *origArea, char *inName, void **address, addressSp { vpage *newPage,*page=(vpage *)cur; // Cloned area has the same physical page and backing store... - newPage=vpagePool.get(); + newPage=new (vpagePool.get()) vpage; newPage->setup(base,page->getBacking(),page->getPhysPage(),protect,inState); vpages.add(newPage); base+=PAGE_SIZE; @@ -202,7 +203,7 @@ status_t area::resize(size_t newSize) vpage *newPage; for (int i=0;isetup(end_address+PAGE_SIZE*i-1,NULL,NULL,protection,state); vpages.add(newPage); } diff --git a/src/kernel/vm2/areaManager.C b/src/kernel/vm2/areaManager.C index a92918b553..d7f6eff370 100644 --- a/src/kernel/vm2/areaManager.C +++ b/src/kernel/vm2/areaManager.C @@ -1,8 +1,9 @@ #include "areaManager.h" areaManager::areaManager(void) -{ +{ team=0; // should be proc_get_current_proc_id() + myLock=0; myLock=create_sem(1,"Area Manager Semaphore"); // Should have team name in it. } diff --git a/src/kernel/vm2/cacheManager.C b/src/kernel/vm2/cacheManager.C index 1ac64504d4..4e7bc4f7c5 100644 --- a/src/kernel/vm2/cacheManager.C +++ b/src/kernel/vm2/cacheManager.C @@ -1,3 +1,4 @@ +#include #include #include @@ -36,7 +37,7 @@ void *cacheManager::createBlock(vnode *target,bool readOnly) } lock(); // Create a vnode here - vpage *newPage = vpagePool.get(); + vpage *newPage = new (vpagePool.get()) vpage; newPage->setup(begin,target,NULL,((readOnly)?readable:writable),NO_LOCK); vpages.add(newPage); cacheMembers.add(newPage); diff --git a/src/kernel/vm2/page.h b/src/kernel/vm2/page.h index 9a886e9793..8d655bf35d 100644 --- a/src/kernel/vm2/page.h +++ b/src/kernel/vm2/page.h @@ -8,7 +8,8 @@ class page : public node { void *physicalAddress; public: int count; - page(void *address) : physicalAddress(address) {count=0;} ; + page(void) {cpuSpecific=NULL;physicalAddress=NULL;}; + void setup (void *address) {count=0;physicalAddress=address;}; void zero(void); unsigned long getAddress(void) {return (unsigned long)physicalAddress;} void dump(void) { printf ("Page %x, physicalAddress = %x\n",this,getAddress()); } diff --git a/src/kernel/vm2/pageManager.C b/src/kernel/vm2/pageManager.C index 3960e387be..e1f46fbd1c 100644 --- a/src/kernel/vm2/pageManager.C +++ b/src/kernel/vm2/pageManager.C @@ -6,6 +6,7 @@ void *addOffset(void *base,unsigned long offset) { return (void *)(((unsigned long)base+offset)); } + pageManager::pageManager(int pages) { // This is compatability for in BeOS usage only... @@ -16,9 +17,17 @@ pageManager::pageManager(int pages) exit(1); } printf ("Allocated an area. Address = %x\n",area); - for (int i=0;isetup(addOffset(area,(i+pageOverhead)*PAGE_SIZE)); + printf ("newPage = %x, setup = %x\n",newPage,addOffset(area,(i+pageOverhead)*PAGE_SIZE)); + printf ("i = %d, sizeof(page) = %x, pageOverhead = %d\n",i,sizeof(page),pageOverhead); + newPage->dump(); + unused.add(addOffset(area,i*sizeof(page))); + } cleanLock=create_sem (1,"clean_lock"); unusedLock=create_sem (1,"unused_lock"); diff --git a/src/kernel/vm2/swapFileManager.C b/src/kernel/vm2/swapFileManager.C index d51002900f..5bbeba4e59 100644 --- a/src/kernel/vm2/swapFileManager.C +++ b/src/kernel/vm2/swapFileManager.C @@ -2,6 +2,7 @@ #include #include #include +#include #include extern poolvnode vnodePool; @@ -47,7 +48,7 @@ vnode &swapFileManager::findNode(void) Unlock(); if (!newNode) { - newNode=vnodePool.get(); + newNode=new (vnodePool.get()) vnode; newNode->fd=swapFile; newNode->offset=maxNode+=PAGE_SIZE; //printf (" New One: %d\n",newNode->offset); diff --git a/src/kernel/vm2/test.C b/src/kernel/vm2/test.C index c23ce611fe..829d8731ac 100644 --- a/src/kernel/vm2/test.C +++ b/src/kernel/vm2/test.C @@ -153,12 +153,12 @@ int main(int argc,char **argv) loopTestParameters mmap1Params={"mmap",500000,8192,400000,1000000}; loopTestParameters clone1Params={"clone1",200000,2,300000,400000}; - //resume_thread(spawn_thread(loopTest,"area test 1",0,&area1Params)); - //resume_thread(spawn_thread(loopTest,"area test 2",0,&area2Params)); - //resume_thread(spawn_thread(loopTest,"area test 3",0,&area3Params)); - //resume_thread(spawn_thread(getInfoTest,"info test 1",0,&info1Params)); + resume_thread(spawn_thread(loopTest,"area test 1",0,&area1Params)); + resume_thread(spawn_thread(loopTest,"area test 2",0,&area2Params)); + resume_thread(spawn_thread(loopTest,"area test 3",0,&area3Params)); + resume_thread(spawn_thread(getInfoTest,"info test 1",0,&info1Params)); resume_thread(spawn_thread(mmapTest,"mmap test 1",0,&mmap1Params)); - //resume_thread(spawn_thread(cloneTest,"clone test 1",0,&clone1Params)); + resume_thread(spawn_thread(cloneTest,"clone test 1",0,&clone1Params)); snooze(1000000000); diff --git a/src/kernel/vm2/vmInterface.C b/src/kernel/vm2/vmInterface.C index f9e0f3c48d..bcd55e3265 100644 --- a/src/kernel/vm2/vmInterface.C +++ b/src/kernel/vm2/vmInterface.C @@ -1,5 +1,6 @@ #include "vmInterface.h" //#include "areaManager.h" +#include #include "mman.h" #include "area.h" #include "areaPool.h" @@ -85,7 +86,7 @@ status_t vmInterface::resizeArea(int Area,size_t size) int vmInterface::createArea(char *AreaName,int pageCount,void **address, addressSpec addType,pageState state,protectType protect) { - area *newArea = areaPool.get(); + area *newArea = new (areaPool.get()) area; newArea->setup(getAM()); newArea->createArea(AreaName,pageCount,address,addType,state,protect); newArea->setAreaID(nextAreaID++); // THIS IS NOT THREAD SAFE @@ -139,7 +140,7 @@ int vmInterface::getAreaByName(char *name) int vmInterface::cloneArea(int newAreaID,char *AreaName,void **address, addressSpec addType=ANY, pageState state=NO_LOCK, protectType prot=writable) { - area *newArea = areaPool.get(); + area *newArea = new (areaPool.get()) area; newArea->setup(getAM()); area *oldArea=getAM()->findArea(newAreaID); newArea->cloneArea(oldArea,AreaName,address,addType,state,prot); @@ -190,7 +191,7 @@ void *vmInterface::mmap(void *addr, size_t len, int prot, int flags, int fd, off return addr; } - area *newArea = areaPool.get(); + area *newArea = new (areaPool.get()) area; newArea->setup(getAM()); //printf ("area = %x, start = %x\n",newArea, newArea->getStartAddress()); newArea->createAreaMappingFile(name,(int)((len+PAGE_SIZE-1)/PAGE_SIZE),&addr,addType,LAZY,protType,fd,offset); diff --git a/src/kernel/vm2/vpage.C b/src/kernel/vm2/vpage.C index cc4a85b220..fc90542afb 100644 --- a/src/kernel/vm2/vpage.C +++ b/src/kernel/vm2/vpage.C @@ -18,6 +18,12 @@ void vpage::refresh(void) vpage::vpage(void) { + physPage=NULL; + backingNode=NULL; + protection=none; + dirty=false; + swappable=false; + start_address=end_address=0; } // backing and/or physMem can be NULL/0.