195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2506f57ddSLv Zheng /******************************************************************************
3506f57ddSLv Zheng *
4506f57ddSLv Zheng * Module Name: osunixmap - Unix OSL for file mappings
5506f57ddSLv Zheng *
6*612c2932SBob Moore * Copyright (C) 2000 - 2023, Intel Corp.
7506f57ddSLv Zheng *
895857638SErik Schmauss *****************************************************************************/
9506f57ddSLv Zheng
10506f57ddSLv Zheng #include "acpidump.h"
11506f57ddSLv Zheng #include <unistd.h>
12506f57ddSLv Zheng #include <sys/mman.h>
13506f57ddSLv Zheng #ifdef _free_BSD
14506f57ddSLv Zheng #include <sys/param.h>
15506f57ddSLv Zheng #endif
16506f57ddSLv Zheng
17506f57ddSLv Zheng #define _COMPONENT ACPI_OS_SERVICES
18506f57ddSLv Zheng ACPI_MODULE_NAME("osunixmap")
19506f57ddSLv Zheng
20506f57ddSLv Zheng #ifndef O_BINARY
21506f57ddSLv Zheng #define O_BINARY 0
22506f57ddSLv Zheng #endif
2353c78d75SWill Miles #if defined(_dragon_fly) || defined(_free_BSD) || defined(_QNX)
24506f57ddSLv Zheng #define MMAP_FLAGS MAP_SHARED
25506f57ddSLv Zheng #else
26506f57ddSLv Zheng #define MMAP_FLAGS MAP_PRIVATE
27506f57ddSLv Zheng #endif
28506f57ddSLv Zheng #define SYSTEM_MEMORY "/dev/mem"
29506f57ddSLv Zheng /*******************************************************************************
30506f57ddSLv Zheng *
31506f57ddSLv Zheng * FUNCTION: acpi_os_get_page_size
32506f57ddSLv Zheng *
33506f57ddSLv Zheng * PARAMETERS: None
34506f57ddSLv Zheng *
35506f57ddSLv Zheng * RETURN: Page size of the platform.
36506f57ddSLv Zheng *
37506f57ddSLv Zheng * DESCRIPTION: Obtain page size of the platform.
38506f57ddSLv Zheng *
39506f57ddSLv Zheng ******************************************************************************/
acpi_os_get_page_size(void)40506f57ddSLv Zheng static acpi_size acpi_os_get_page_size(void)
41506f57ddSLv Zheng {
42506f57ddSLv Zheng
43506f57ddSLv Zheng #ifdef PAGE_SIZE
44506f57ddSLv Zheng return PAGE_SIZE;
45506f57ddSLv Zheng #else
46506f57ddSLv Zheng return sysconf(_SC_PAGESIZE);
47506f57ddSLv Zheng #endif
48506f57ddSLv Zheng }
49506f57ddSLv Zheng
50506f57ddSLv Zheng /******************************************************************************
51506f57ddSLv Zheng *
52506f57ddSLv Zheng * FUNCTION: acpi_os_map_memory
53506f57ddSLv Zheng *
54506f57ddSLv Zheng * PARAMETERS: where - Physical address of memory to be mapped
55506f57ddSLv Zheng * length - How much memory to map
56506f57ddSLv Zheng *
57506f57ddSLv Zheng * RETURN: Pointer to mapped memory. Null on error.
58506f57ddSLv Zheng *
59506f57ddSLv Zheng * DESCRIPTION: Map physical memory into local address space.
60506f57ddSLv Zheng *
61506f57ddSLv Zheng *****************************************************************************/
62506f57ddSLv Zheng
acpi_os_map_memory(acpi_physical_address where,acpi_size length)63506f57ddSLv Zheng void *acpi_os_map_memory(acpi_physical_address where, acpi_size length)
64506f57ddSLv Zheng {
65506f57ddSLv Zheng u8 *mapped_memory;
66506f57ddSLv Zheng acpi_physical_address offset;
67506f57ddSLv Zheng acpi_size page_size;
68506f57ddSLv Zheng int fd;
69506f57ddSLv Zheng
70506f57ddSLv Zheng fd = open(SYSTEM_MEMORY, O_RDONLY | O_BINARY);
71506f57ddSLv Zheng if (fd < 0) {
72506f57ddSLv Zheng fprintf(stderr, "Cannot open %s\n", SYSTEM_MEMORY);
73506f57ddSLv Zheng return (NULL);
74506f57ddSLv Zheng }
75506f57ddSLv Zheng
76506f57ddSLv Zheng /* Align the offset to use mmap */
77506f57ddSLv Zheng
78506f57ddSLv Zheng page_size = acpi_os_get_page_size();
79506f57ddSLv Zheng offset = where % page_size;
80506f57ddSLv Zheng
81506f57ddSLv Zheng /* Map the table header to get the length of the full table */
82506f57ddSLv Zheng
83506f57ddSLv Zheng mapped_memory = mmap(NULL, (length + offset), PROT_READ, MMAP_FLAGS,
84506f57ddSLv Zheng fd, (where - offset));
85506f57ddSLv Zheng if (mapped_memory == MAP_FAILED) {
86506f57ddSLv Zheng fprintf(stderr, "Cannot map %s\n", SYSTEM_MEMORY);
87506f57ddSLv Zheng close(fd);
88506f57ddSLv Zheng return (NULL);
89506f57ddSLv Zheng }
90506f57ddSLv Zheng
91506f57ddSLv Zheng close(fd);
92506f57ddSLv Zheng return (ACPI_CAST8(mapped_memory + offset));
93506f57ddSLv Zheng }
94506f57ddSLv Zheng
95506f57ddSLv Zheng /******************************************************************************
96506f57ddSLv Zheng *
97506f57ddSLv Zheng * FUNCTION: acpi_os_unmap_memory
98506f57ddSLv Zheng *
99506f57ddSLv Zheng * PARAMETERS: where - Logical address of memory to be unmapped
100506f57ddSLv Zheng * length - How much memory to unmap
101506f57ddSLv Zheng *
102506f57ddSLv Zheng * RETURN: None.
103506f57ddSLv Zheng *
104506f57ddSLv Zheng * DESCRIPTION: Delete a previously created mapping. Where and Length must
105506f57ddSLv Zheng * correspond to a previous mapping exactly.
106506f57ddSLv Zheng *
107506f57ddSLv Zheng *****************************************************************************/
108506f57ddSLv Zheng
acpi_os_unmap_memory(void * where,acpi_size length)109506f57ddSLv Zheng void acpi_os_unmap_memory(void *where, acpi_size length)
110506f57ddSLv Zheng {
111506f57ddSLv Zheng acpi_physical_address offset;
112506f57ddSLv Zheng acpi_size page_size;
113506f57ddSLv Zheng
114506f57ddSLv Zheng page_size = acpi_os_get_page_size();
115e0423edfSLv Zheng offset = ACPI_TO_INTEGER(where) % page_size;
116506f57ddSLv Zheng munmap((u8 *)where - offset, (length + offset));
117506f57ddSLv Zheng }
118