Files
haiku-beta6/src/kernel/vm2/vpage.h
T
Michael Phipps d50d9a6a18 More code cleanup. Removing unused variables. Simplifying and shrinking
vpage to be nearly a TLB entry. Final stripping will occur with kernel
integration. More comments.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3042 a95241bf-73f2-0310-859d-f6bbb57e9c96
2003-03-26 04:00:38 +00:00

71 lines
2.9 KiB
C++

#ifndef VPAGE_H
#define VPAGE_H
#include <vm.h>
#include <pageManager.h>
#include <swapFileManager.h>
class areaManager;
class vpage : public node
{
private:
page *physPage;
vnode *backingNode;
char bits; // 0/1 are protection, 2 == dirty, 3 == swappable, 4 == locked
unsigned long start_address; //bye
public:
// Constructors and Destructors and related
vpage(void);
vpage(unsigned long address) {start_address=address-address%PAGE_SIZE;} // Only for lookups
// Setup should now only be called by the vpage manager...
void setup(unsigned long start,vnode *backing, page *physMem,protectType prot,pageState state, mmapSharing share=CLONEAREA); // backing and/or physMem can be NULL/0.
void cleanup(void);
// Mutators
void setProtection(protectType prot);
void flush(void); // write page to vnode, if necessary
void refresh(void); // Read page back in from vnode
bool lock(long flags); // lock this page into memory
void unlock(long flags); // unlock this page from memory
void dirty(bool yesOrNo) {if (yesOrNo) bits|=4; else bits &= ~4;}
void swappable(bool yesOrNo) {if (yesOrNo) bits|=8; else bits &= ~8;}
void locked(bool yesOrNo) {if (yesOrNo) bits|=16; else bits &= ~16;}
void protection(protectType prot) {bits|= (prot & 3);}
// Accessors
protectType getProtection(void) {return (protectType)(bits & 3);}
bool isDirty(void) {return bits & 4;}
bool isSwappable(void) {return bits & 8;}
bool isLocked(void) {return bits & 16;}
void *getStartAddress(void) {return (void *)start_address;}
page *getPhysPage(void) {return physPage;}
vnode *getBacking(void) {return backingNode;}
bool isMapped(void) {return (physPage);}
unsigned long end_address(void) {return start_address+PAGE_SIZE;}
// Comparisson with others
ulong hash(void) {return start_address >> BITS_IN_PAGE_SIZE;}
bool operator==(vpage &rhs) {return rhs.start_address==start_address; }
bool contains(uint32 address) { return ((start_address<=address) && (end_address()>=address)); }
// External methods for "server" type calls
bool fault(void *fault_address, bool writeError, int &in_count); // true = OK, false = panic.
bool pager(int desperation);
void saver(void);
// Debugging
void dump(void) {
error ("Dumping vpage %p, address = %lx, vnode-fd=%d, vnode-offset = %d, dirty = %d, swappable = %d, locked = %d\n",
this,start_address, ((backingNode)?(backingNode->fd):99999), ((backingNode)?(backingNode->offset):999999999),
isDirty(),isSwappable(),isLocked());
if (physPage)
physPage->dump();
else
error ("NULL\n");
}
char getByte(unsigned long offset,areaManager *manager); // This is for testing only
void setByte(unsigned long offset,char value,areaManager *manager); // This is for testing only
int getInt(unsigned long offset,areaManager *manager); // This is for testing only
void setInt(unsigned long offset,int value,areaManager *manager); // This is for testing only
};
#endif