⛏️ index : haiku.git

/*
 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef VM_USER_ADDRESS_SPACE_H
#define VM_USER_ADDRESS_SPACE_H


#include <vm/VMAddressSpace.h>

#include "VMUserArea.h"


struct VMUserAddressSpace final : VMAddressSpace {
public:
								VMUserAddressSpace(team_id id, addr_t base,
									size_t size);
	virtual						~VMUserAddressSpace();

	virtual	VMArea*				FirstArea() const;
	virtual	VMArea*				NextArea(VMArea* area) const;

	virtual	VMArea*				LookupArea(addr_t address) const;
	virtual	VMArea*				FindClosestArea(addr_t address, bool less)
									const;
	virtual	VMArea*				CreateArea(const char* name, uint32 wiring,
									uint32 protection, uint32 allocationFlags);
	virtual	void				DeleteArea(VMArea* area,
									uint32 allocationFlags);
	virtual	status_t			InsertArea(VMArea* area, size_t size,
									const virtual_address_restrictions*
										addressRestrictions,
									uint32 allocationFlags, void** _address);
	virtual	void				RemoveArea(VMArea* area,
									uint32 allocationFlags);

	virtual	bool				CanResizeArea(VMArea* area, size_t newSize);
	virtual	status_t			ResizeArea(VMArea* area, size_t newSize,
									uint32 allocationFlags);
	virtual	status_t			ShrinkAreaHead(VMArea* area, size_t newSize,
									uint32 allocationFlags);
	virtual	status_t			ShrinkAreaTail(VMArea* area, size_t newSize,
									uint32 allocationFlags);

	virtual	status_t			ReserveAddressRange(size_t size,
									const virtual_address_restrictions*
										addressRestrictions,
									uint32 flags, uint32 allocationFlags,
									void** _address);
	virtual	status_t			UnreserveAddressRange(addr_t address,
									size_t size, uint32 allocationFlags);
	virtual	void				UnreserveAllAddressRanges(
									uint32 allocationFlags);

	virtual	void				Dump() const;

private:
	inline	bool				_IsRandomized(uint32 addressSpec) const;
	static	addr_t				_RandomizeAddress(addr_t start, addr_t end,
									size_t alignment, bool initial = false);

			status_t			_InsertAreaIntoReservedRegion(addr_t start,
									size_t size, VMUserArea* area,
									uint32 allocationFlags);
			status_t			_InsertAreaSlot(addr_t start, addr_t size,
									addr_t end, uint32 addressSpec,
									size_t alignment, VMUserArea* area,
									uint32 allocationFlags);

private:
	static	const addr_t		kMaxRandomize;
	static	const addr_t		kMaxInitialRandomize;

			VMUserAreaTree		fAreas;
			addr_t				fNextInsertHint;
};


#endif	/* VM_USER_ADDRESS_SPACE_H */