blob: 041aac9c81818b2a2cbfa4d9510dd1318c8a311c [file] [log] [blame]
Philipp Deppenwiesed8fe4432016-03-18 00:52:54 +01001/* intelmetool
2 *
3 * Copyright (C) 2013-2015 Damien Zammit <damien@zamaudio.com>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of
8 * the License, or any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#include "mmap.h"
17#include <errno.h>
18
19#ifndef __DARWIN__
20int fd_mem;
21
Paul Menzel1e7911e2016-12-27 15:24:02 +010022void *map_physical_exact(off_t phys_addr, void *mapto, size_t len) {
Philipp Deppenwiesed8fe4432016-03-18 00:52:54 +010023 void *virt_addr;
24 int err;
25
Paul Menzel1e7911e2016-12-27 15:24:02 +010026 virt_addr = mmap(mapto, len, PROT_WRITE | PROT_READ,
27 MAP_SHARED | MAP_FIXED, fd_mem, phys_addr);
Philipp Deppenwiesed8fe4432016-03-18 00:52:54 +010028
29 if (virt_addr == MAP_FAILED) {
30 err = errno;
Paul Menzel1e7911e2016-12-27 15:24:02 +010031 printf("Error mapping physical memory 0x%016jd [0x%zx] ERRNO=%d\n",
32 (intmax_t)phys_addr, len, err);
Philipp Deppenwiesed8fe4432016-03-18 00:52:54 +010033 return NULL;
34 }
35
36 return virt_addr;
37}
38
Paul Menzel1e7911e2016-12-27 15:24:02 +010039void *map_physical(off_t phys_addr, size_t len) {
Philipp Deppenwiesed8fe4432016-03-18 00:52:54 +010040 void *virt_addr;
41 int err;
42
Paul Menzel1e7911e2016-12-27 15:24:02 +010043 virt_addr = mmap(NULL, len, PROT_WRITE | PROT_READ, MAP_SHARED, fd_mem, phys_addr);
Philipp Deppenwiesed8fe4432016-03-18 00:52:54 +010044
45 if (virt_addr == MAP_FAILED) {
46 err = errno;
Paul Menzel1e7911e2016-12-27 15:24:02 +010047 printf("Error mapping physical memory 0x%016jd [0x%zx] ERRNO=%d\n",
48 (intmax_t)phys_addr, len, err);
Philipp Deppenwiesed8fe4432016-03-18 00:52:54 +010049 return NULL;
50 }
51
52 return virt_addr;
53}
54
55void unmap_physical(void *virt_addr, size_t len) {
56 munmap(virt_addr, len);
57}
58#endif