1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright 2019-2020, Intel Corporation */
5 * libpmem2.h -- definitions of libpmem2 entry points
7 * This library provides support for programming with persistent memory (pmem).
9 * libpmem2 provides support for using raw pmem directly.
11 * See libpmem2(7) for details.
21 #include <pmemcompat.h>
24 #define pmem2_source_device_id pmem2_source_device_idW
25 #define pmem2_errormsg pmem2_errormsgW
26 #define pmem2_perror pmem2_perrorW
28 #define pmem2_source_device_id pmem2_source_device_idU
29 #define pmem2_errormsg pmem2_errormsgU
30 #define pmem2_perror pmem2_perrorU
39 #define PMEM2_E_UNKNOWN (-100000)
40 #define PMEM2_E_NOSUPP (-100001)
41 #define PMEM2_E_FILE_HANDLE_NOT_SET (-100003)
42 #define PMEM2_E_INVALID_FILE_HANDLE (-100004)
43 #define PMEM2_E_INVALID_FILE_TYPE (-100005)
44 #define PMEM2_E_MAP_RANGE (-100006)
45 #define PMEM2_E_MAPPING_EXISTS (-100007)
46 #define PMEM2_E_GRANULARITY_NOT_SET (-100008)
47 #define PMEM2_E_GRANULARITY_NOT_SUPPORTED (-100009)
48 #define PMEM2_E_OFFSET_OUT_OF_RANGE (-100010)
49 #define PMEM2_E_OFFSET_UNALIGNED (-100011)
50 #define PMEM2_E_INVALID_ALIGNMENT_FORMAT (-100012)
51 #define PMEM2_E_INVALID_ALIGNMENT_VALUE (-100013)
52 #define PMEM2_E_INVALID_SIZE_FORMAT (-100014)
53 #define PMEM2_E_LENGTH_UNALIGNED (-100015)
54 #define PMEM2_E_MAPPING_NOT_FOUND (-100016)
55 #define PMEM2_E_BUFFER_TOO_SMALL (-100017)
56 #define PMEM2_E_SOURCE_EMPTY (-100018)
57 #define PMEM2_E_INVALID_SHARING_VALUE (-100019)
58 #define PMEM2_E_SRC_DEVDAX_PRIVATE (-100020)
59 #define PMEM2_E_INVALID_ADDRESS_REQUEST_TYPE (-100021)
60 #define PMEM2_E_ADDRESS_UNALIGNED (-100022)
61 #define PMEM2_E_ADDRESS_NULL (-100023)
62 #define PMEM2_E_DEEP_FLUSH_RANGE (-100024)
63 #define PMEM2_E_INVALID_REGION_FORMAT (-100025)
64 #define PMEM2_E_DAX_REGION_NOT_FOUND (-100026)
65 #define PMEM2_E_INVALID_DEV_FORMAT (-100027)
66 #define PMEM2_E_CANNOT_READ_BOUNDS (-100028)
67 #define PMEM2_E_NO_BAD_BLOCK_FOUND (-100029)
68 #define PMEM2_E_LENGTH_OUT_OF_RANGE (-100030)
69 #define PMEM2_E_INVALID_PROT_FLAG (-100031)
70 #define PMEM2_E_NO_ACCESS (-100032)
71 #define PMEM2_E_VM_RESERVATION_NOT_EMPTY (-100033)
72 #define PMEM2_E_MAP_EXISTS (-100034)
73 #define PMEM2_E_FILE_DESCRIPTOR_NOT_SET (-100035)
79 int pmem2_source_from_fd(struct pmem2_source
**src
, int fd
);
80 int pmem2_source_from_anon(struct pmem2_source
**src
, size_t size
);
82 int pmem2_source_from_handle(struct pmem2_source
**src
, HANDLE handle
);
83 int pmem2_source_get_handle(const struct pmem2_source
*src
, HANDLE
*h
);
85 int pmem2_source_get_fd(const struct pmem2_source
*src
, int *fd
);
88 int pmem2_source_size(const struct pmem2_source
*src
, size_t *size
);
90 int pmem2_source_alignment(const struct pmem2_source
*src
,
93 int pmem2_source_delete(struct pmem2_source
**src
);
95 /* vm reservation setup */
97 struct pmem2_vm_reservation
;
99 void *pmem2_vm_reservation_get_address(struct pmem2_vm_reservation
*rsv
);
101 size_t pmem2_vm_reservation_get_size(struct pmem2_vm_reservation
*rsv
);
103 int pmem2_vm_reservation_new(struct pmem2_vm_reservation
**rsv_ptr
,
104 void *addr
, size_t size
);
106 int pmem2_vm_reservation_delete(struct pmem2_vm_reservation
**rsv_ptr
);
112 int pmem2_config_new(struct pmem2_config
**cfg
);
114 int pmem2_config_delete(struct pmem2_config
**cfg
);
116 enum pmem2_granularity
{
117 PMEM2_GRANULARITY_BYTE
,
118 PMEM2_GRANULARITY_CACHE_LINE
,
119 PMEM2_GRANULARITY_PAGE
,
122 int pmem2_config_set_required_store_granularity(struct pmem2_config
*cfg
,
123 enum pmem2_granularity g
);
125 int pmem2_config_set_offset(struct pmem2_config
*cfg
, size_t offset
);
127 int pmem2_config_set_length(struct pmem2_config
*cfg
, size_t length
);
129 enum pmem2_sharing_type
{
134 int pmem2_config_set_sharing(struct pmem2_config
*cfg
,
135 enum pmem2_sharing_type type
);
137 #define PMEM2_PROT_EXEC (1U << 29)
138 #define PMEM2_PROT_READ (1U << 30)
139 #define PMEM2_PROT_WRITE (1U << 31)
140 #define PMEM2_PROT_NONE 0
142 int pmem2_config_set_protection(struct pmem2_config
*cfg
,
145 int pmem2_config_set_vm_reservation(struct pmem2_config
*cfg
,
146 struct pmem2_vm_reservation
*rsv
, size_t offset
);
151 int pmem2_map_from_existing(struct pmem2_map
**map
,
152 const struct pmem2_source
*src
, void *addr
, size_t len
,
153 enum pmem2_granularity gran
);
155 int pmem2_map_new(struct pmem2_map
**map_ptr
, const struct pmem2_config
*cfg
,
156 const struct pmem2_source
*src
);
158 int pmem2_map_delete(struct pmem2_map
**map_ptr
);
160 void *pmem2_map_get_address(struct pmem2_map
*map
);
162 size_t pmem2_map_get_size(struct pmem2_map
*map
);
164 enum pmem2_granularity
pmem2_map_get_store_granularity(struct pmem2_map
*map
);
168 typedef void (*pmem2_persist_fn
)(const void *ptr
, size_t size
);
170 typedef void (*pmem2_flush_fn
)(const void *ptr
, size_t size
);
172 typedef void (*pmem2_drain_fn
)(void);
174 pmem2_persist_fn
pmem2_get_persist_fn(struct pmem2_map
*map
);
176 pmem2_flush_fn
pmem2_get_flush_fn(struct pmem2_map
*map
);
178 pmem2_drain_fn
pmem2_get_drain_fn(struct pmem2_map
*map
);
180 #define PMEM2_F_MEM_NODRAIN (1U << 0)
182 #define PMEM2_F_MEM_NONTEMPORAL (1U << 1)
183 #define PMEM2_F_MEM_TEMPORAL (1U << 2)
185 #define PMEM2_F_MEM_WC (1U << 3)
186 #define PMEM2_F_MEM_WB (1U << 4)
188 #define PMEM2_F_MEM_NOFLUSH (1U << 5)
190 #define PMEM2_F_MEM_VALID_FLAGS (PMEM2_F_MEM_NODRAIN | \
191 PMEM2_F_MEM_NONTEMPORAL | \
192 PMEM2_F_MEM_TEMPORAL | \
197 typedef void *(*pmem2_memmove_fn
)(void *pmemdest
, const void *src
, size_t len
,
200 typedef void *(*pmem2_memcpy_fn
)(void *pmemdest
, const void *src
, size_t len
,
203 typedef void *(*pmem2_memset_fn
)(void *pmemdest
, int c
, size_t len
,
206 pmem2_memmove_fn
pmem2_get_memmove_fn(struct pmem2_map
*map
);
208 pmem2_memcpy_fn
pmem2_get_memcpy_fn(struct pmem2_map
*map
);
210 pmem2_memset_fn
pmem2_get_memset_fn(struct pmem2_map
*map
);
214 int pmem2_deep_flush(struct pmem2_map
*map
, void *ptr
, size_t size
);
217 int pmem2_source_device_id(const struct pmem2_source
*src
,
218 char *id
, size_t *len
);
220 int pmem2_source_device_idW(const struct pmem2_source
*src
,
221 wchar_t *id
, size_t *len
);
223 int pmem2_source_device_idU(const struct pmem2_source
*src
,
224 char *id
, size_t *len
);
227 int pmem2_source_device_usc(const struct pmem2_source
*src
, uint64_t *usc
);
229 struct pmem2_badblock_context
;
231 struct pmem2_badblock
{
236 int pmem2_badblock_context_new(struct pmem2_badblock_context
**bbctx
,
237 const struct pmem2_source
*src
);
239 int pmem2_badblock_next(struct pmem2_badblock_context
*bbctx
,
240 struct pmem2_badblock
*bb
);
242 void pmem2_badblock_context_delete(
243 struct pmem2_badblock_context
**bbctx
);
245 int pmem2_badblock_clear(struct pmem2_badblock_context
*bbctx
,
246 const struct pmem2_badblock
*bb
);
251 const char *pmem2_errormsg(void);
253 const char *pmem2_errormsgU(void);
255 const wchar_t *pmem2_errormsgW(void);
258 int pmem2_err_to_errno(int);
261 void pmem2_perror(const char *format
,
262 ...) __attribute__((__format__(__printf__
, 1, 2)));
264 void pmem2_perrorU(const char *format
, ...);
266 void pmem2_perrorW(const wchar_t *format
, ...);
272 #endif /* libpmem2.h */