/* intelmetool
 *
 * Copyright (C) 2013-2015 Damien Zammit <damien@zamaudio.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 */

#include "mmap.h"
#include <errno.h>

#ifndef __DARWIN__
int fd_mem;

void *map_physical_exact(off_t phys_addr, void *mapto, size_t len) {
  void *virt_addr;
  int err;

  virt_addr = mmap(mapto, len, PROT_WRITE | PROT_READ,
                    MAP_SHARED | MAP_FIXED, fd_mem, phys_addr);

  if (virt_addr == MAP_FAILED) {
    err = errno;
    printf("Error mapping physical memory 0x%016jd [0x%zx] ERRNO=%d\n",
            (intmax_t)phys_addr, len, err);
    return NULL;
  }

  return virt_addr;
}

void *map_physical(off_t phys_addr, size_t len) {
  void *virt_addr;
  int err;

  virt_addr = mmap(NULL, len, PROT_WRITE | PROT_READ, MAP_SHARED, fd_mem, phys_addr);

  if (virt_addr == MAP_FAILED) {
    err = errno;
    printf("Error mapping physical memory 0x%016jd [0x%zx] ERRNO=%d\n",
            (intmax_t)phys_addr, len, err);
    return NULL;
  }

  return virt_addr;
}

void unmap_physical(void *virt_addr, size_t len) {
  munmap(virt_addr, len);
}
#endif
