
#ifndef _REGION_H
#define _REGION_H 1

struct phys_block {
#if SANITYCHECKS
	u32_t			seencount;
#endif
	vir_bytes		offset;	/* offset from start of vir region */
	vir_bytes		length;	/* no. of contiguous bytes */
	phys_bytes		phys;	/* physical memory */
	u8_t			refcount;	/* Refcount of these pages */

	/* first in list of phys_regions that reference this block */
	struct phys_region	*firstregion;	
};

struct phys_region {
	struct phys_region	*next;	/* next contiguous block */
	struct phys_block	*ph;
	struct vir_region	*parent; /* Region that owns this phys_region. */

	/* list of phys_regions that reference the same phys_block */
	struct phys_region	*next_ph_list;	
};

struct vir_region {
	struct vir_region *next; /* next virtual region in this process */
	vir_bytes	vaddr;	/* virtual address, offset from pagetable */
	vir_bytes	length;	/* length in bytes */
	struct	phys_region *first; /* phys regions in vir region */
	u16_t		flags;
	u32_t tag;		/* Opaque to mapping code. */
	struct vmproc *parent;	/* Process that owns this vir_region. */
};

/* Mapping flags: */
#define VR_WRITABLE	0x01	/* Process may write here. */
#define VR_NOPF		0x02	/* May not generate page faults. */
#define VR_PHYS64K	0x04	/* Physical memory must be 64k aligned. */

/* Mapping type: */
#define VR_ANON		0x10	/* Memory to be cleared and allocated */
#define VR_DIRECT	0x20	/* Mapped, but not managed by VM */

/* Tag values: */
#define VRT_NONE	0xBEEF0000
#define VRT_HEAP	0xBEEF0001
#define VRT_CODE	0xBEEF0002

/* map_page_region flags */
#define MF_PREALLOC	0x01
#define MF_CONTIG	0x02

#endif

