/* Copyright (c) 2008, Sandia National Laboratories */ #ifndef _LWK_PMEM_H #define _LWK_PMEM_H /** * Physical memory types. */ typedef enum { PMEM_TYPE_BOOTMEM = 0, /* memory allocated at boot-time */ PMEM_TYPE_BIGPHYSAREA = 1, /* memory set-aside for a device/driver */ PMEM_TYPE_INITRD = 2, /* initrd image provided by bootloader */ PMEM_TYPE_INIT_TASK = 3, /* memory used by the initial task */ PMEM_TYPE_KMEM = 4, /* memory managed by the kernel */ PMEM_TYPE_UMEM = 5, /* memory managed by user-space */ } pmem_type_t; /** * Defines a physical memory region. */ struct pmem_region { paddr_t start; /* region occupies: [start, end) */ paddr_t end; bool type_is_set; /* type field is set? */ pmem_type_t type; /* physical memory type */ bool lgroup_is_set; /* lgroup field is set? */ lgroup_t lgroup; /* locality group region is in */ bool allocated_is_set; /* allocated field set? */ bool allocated; /* region is allocated? */ bool name_is_set; /* name field is set? */ char name[32]; /* human-readable name of region */ }; /** * Core physical memory management functions. */ int pmem_add(const struct pmem_region *rgn); int pmem_update(const struct pmem_region *update); int pmem_query(const struct pmem_region *query, struct pmem_region *result); int pmem_alloc(size_t size, size_t alignment, const struct pmem_region *constraint, struct pmem_region *result); /** * Convenience functions. */ void pmem_region_unset_all(struct pmem_region *rgn); const char *pmem_type_to_string(pmem_type_t type); int pmem_alloc_umem(size_t size, size_t alignment, struct pmem_region *rgn); bool pmem_is_umem(paddr_t start, size_t extent); #ifdef __KERNEL__ /** * System call handlers. */ int sys_pmem_add(const struct pmem_region __user * rgn); int sys_pmem_update(const struct pmem_region __user * update); int sys_pmem_query(const struct pmem_region __user * query, struct pmem_region __user * result); int sys_pmem_alloc(size_t size, size_t alignment, const struct pmem_region __user *constraint, struct pmem_region __user *result); #endif #endif