1 /* 2 * Copyright 2008-2011, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de. 4 * Distributed under the terms of the MIT License. 5 * 6 * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. 7 * Distributed under the terms of the NewOS License. 8 */ 9 #ifndef _KERNEL_VM_STORE_ANONYMOUS_H 10 #define _KERNEL_VM_STORE_ANONYMOUS_H 11 12 13 #include <vm/VMCache.h> 14 15 16 #if ENABLE_SWAP_SUPPORT 17 18 typedef uint32 swap_addr_t; 19 // TODO: Should be wider, but RadixBitmap supports only a 32 bit type ATM! 20 struct swap_block; 21 struct system_memory_info; 22 23 24 extern "C" { 25 void swap_init(void); 26 void swap_init_post_modules(void); 27 bool swap_free_page_swap_space(vm_page* page); 28 uint32 swap_available_pages(void); 29 uint32 swap_total_swap_pages(void); 30 } 31 32 33 class VMAnonymousCache : public VMCache { 34 public: 35 virtual ~VMAnonymousCache(); 36 37 status_t Init(bool canOvercommit, 38 int32 numPrecommittedPages, 39 int32 numGuardPages, 40 uint32 allocationFlags); 41 42 virtual status_t Resize(off_t newSize, int priority); 43 virtual status_t Rebase(off_t newBase, int priority); 44 virtual status_t Adopt(VMCache* source, off_t offset, 45 off_t size, off_t newOffset); 46 47 virtual status_t Commit(off_t size, int priority); 48 virtual bool HasPage(off_t offset); 49 virtual bool DebugHasPage(off_t offset); 50 51 virtual int32 GuardSize() { return fGuardedSize; } 52 virtual void SetGuardSize(int32 guardSize) 53 { fGuardedSize = guardSize; } 54 55 virtual status_t Read(off_t offset, const generic_io_vec* vecs, 56 size_t count, uint32 flags, 57 generic_size_t* _numBytes); 58 virtual status_t Write(off_t offset, const generic_io_vec* vecs, 59 size_t count, uint32 flags, 60 generic_size_t* _numBytes); 61 virtual status_t WriteAsync(off_t offset, 62 const generic_io_vec* vecs, size_t count, 63 generic_size_t numBytes, uint32 flags, 64 AsyncIOCallback* callback); 65 virtual bool CanWritePage(off_t offset); 66 67 virtual int32 MaxPagesPerAsyncWrite() const; 68 69 virtual status_t Fault(struct VMAddressSpace* aspace, 70 off_t offset); 71 72 virtual void Merge(VMCache* source); 73 74 protected: 75 virtual void DeleteObject(); 76 77 private: 78 class WriteCallback; 79 friend class WriteCallback; 80 81 void _SwapBlockBuild(off_t pageIndex, 82 swap_addr_t slotIndex, uint32 count); 83 void _SwapBlockFree(off_t pageIndex, uint32 count); 84 swap_addr_t _SwapBlockGetAddress(off_t pageIndex); 85 status_t _Commit(off_t size, int priority); 86 87 void _MergePagesSmallerSource( 88 VMAnonymousCache* source); 89 void _MergePagesSmallerConsumer( 90 VMAnonymousCache* source); 91 void _MergeSwapPages(VMAnonymousCache* source); 92 93 void _FreeSwapPageRange(off_t fromOffset, 94 off_t toOffset, bool skipBusyPages = true); 95 96 private: 97 friend bool swap_free_page_swap_space(vm_page* page); 98 99 bool fCanOvercommit; 100 bool fHasPrecommitted; 101 uint8 fPrecommittedPages; 102 int32 fGuardedSize; 103 off_t fCommittedSwapSize; 104 off_t fAllocatedSwapSize; 105 }; 106 107 #endif // ENABLE_SWAP_SUPPORT 108 109 110 extern "C" void swap_get_info(system_info* info); 111 112 113 #endif /* _KERNEL_VM_STORE_ANONYMOUS_H */ 114