mem.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <strings.h>
  4. #include <stdlib.h>
  5. #include <stdint.h>
  6. #include <fcntl.h>
  7. #include <unistd.h>
  8. #include <sys/ioctl.h>
  9. #include <sys/mman.h>
  10. #include <errno.h>
  11. #include <assert.h>
  12. #include "pcilib.h"
  13. #include "locking.h"
  14. #include "mem.h"
  15. #include "error.h"
  16. #include "pci.h"
  17. void *pcilib_map_area(pcilib_t *ctx, uintptr_t addr, size_t size) {
  18. void *res;
  19. int err, ret;
  20. err = pcilib_lock_global(ctx);
  21. if (err) {
  22. pcilib_error("Error (%i) acquiring mmap lock", err);
  23. return NULL;
  24. }
  25. ret = ioctl( ctx->handle, PCIDRIVER_IOC_MMAP_MODE, PCIDRIVER_MMAP_AREA );
  26. if (ret) {
  27. pcilib_unlock_global(ctx);
  28. pcilib_error("PCIDRIVER_IOC_MMAP_MODE ioctl have failed");
  29. return NULL;
  30. }
  31. res = mmap( 0, size, PROT_WRITE | PROT_READ, MAP_SHARED, ctx->handle, addr );
  32. pcilib_unlock_global(ctx);
  33. if ((!res)||(res == MAP_FAILED)) {
  34. pcilib_error("Failed to mmap area 0x%lx of size %zu bytes", addr, size);
  35. return NULL;
  36. }
  37. return res;
  38. }
  39. void pcilib_unmap_area(pcilib_t *ctx, void *addr, size_t size) {
  40. munmap(addr, size);
  41. }