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