#include <stdlib.h>
#include <stdbool.h>
#include <err.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <assert.h>
#include <inttypes.h>
#include "common.h"
#include "output.h"
#include "info.h"
static void
info_cto_descriptor(struct pmem_info *pip)
{
int v = VERBOSE_DEFAULT;
if (!outv_check(v))
return;
outv(v, "\nPMEM CTO Header:\n");
struct pmemcto *pcp = pip->cto.pcp;
uint8_t *hdrptr = (uint8_t *)pcp + sizeof(pcp->hdr);
size_t hdrsize = sizeof(*pcp) - sizeof(pcp->hdr);
size_t hdroff = sizeof(pcp->hdr);
outv_hexdump(pip->args.vhdrdump, hdrptr, hdrsize, hdroff, 1);
char *layout = util_check_memory((uint8_t *)pcp->layout,
sizeof(pcp->layout), 0) ?
pcp->layout : "(null)";
outv_field(v, "Layout", "%s", layout);
outv_field(v, "Base address", "%p", (void *)pcp->addr);
outv_field(v, "Size", "0x%zx", (size_t)pcp->size);
outv_field(v, "Consistent", "%d", pcp->consistent);
outv_field(v, "Root pointer", "%p", (void *)pcp->root);
}
int
pmempool_info_cto(struct pmem_info *pip)
{
pip->cto.pcp = pool_set_file_map(pip->pfile, 0);
if (pip->cto.pcp == NULL)
return -1;
pip->cto.size = pip->pfile->size;
info_cto_descriptor(pip);
return 0;
}