1/****************************************************************************** 2 * 3 * Module Name: osunixmap - Unix OSL for file mappings 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2015, Intel Corp. 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions, and the following disclaimer, 16 * without modification. 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18 * substantially similar to the "NO WARRANTY" disclaimer below 19 * ("Disclaimer") and any redistribution must be conditioned upon 20 * including a substantially similar Disclaimer requirement for further 21 * binary redistribution. 22 * 3. Neither the names of the above-listed copyright holders nor the names 23 * of any contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * Alternatively, this software may be distributed under the terms of the 27 * GNU General Public License ("GPL") version 2 as published by the Free 28 * Software Foundation. 29 * 30 * NO WARRANTY 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41 * POSSIBILITY OF SUCH DAMAGES. 42 */ 43 44#include "acpidump.h" 45#include <unistd.h> 46#include <sys/mman.h> 47#ifdef _free_BSD 48#include <sys/param.h> 49#endif 50 51#define _COMPONENT ACPI_OS_SERVICES 52ACPI_MODULE_NAME("osunixmap") 53 54#ifndef O_BINARY 55#define O_BINARY 0 56#endif 57#ifdef _free_BSD 58#define MMAP_FLAGS MAP_SHARED 59#else 60#define MMAP_FLAGS MAP_PRIVATE 61#endif 62#define SYSTEM_MEMORY "/dev/mem" 63/******************************************************************************* 64 * 65 * FUNCTION: acpi_os_get_page_size 66 * 67 * PARAMETERS: None 68 * 69 * RETURN: Page size of the platform. 70 * 71 * DESCRIPTION: Obtain page size of the platform. 72 * 73 ******************************************************************************/ 74static acpi_size acpi_os_get_page_size(void) 75{ 76 77#ifdef PAGE_SIZE 78 return PAGE_SIZE; 79#else 80 return sysconf(_SC_PAGESIZE); 81#endif 82} 83 84/****************************************************************************** 85 * 86 * FUNCTION: acpi_os_map_memory 87 * 88 * PARAMETERS: where - Physical address of memory to be mapped 89 * length - How much memory to map 90 * 91 * RETURN: Pointer to mapped memory. Null on error. 92 * 93 * DESCRIPTION: Map physical memory into local address space. 94 * 95 *****************************************************************************/ 96 97void *acpi_os_map_memory(acpi_physical_address where, acpi_size length) 98{ 99 u8 *mapped_memory; 100 acpi_physical_address offset; 101 acpi_size page_size; 102 int fd; 103 104 fd = open(SYSTEM_MEMORY, O_RDONLY | O_BINARY); 105 if (fd < 0) { 106 fprintf(stderr, "Cannot open %s\n", SYSTEM_MEMORY); 107 return (NULL); 108 } 109 110 /* Align the offset to use mmap */ 111 112 page_size = acpi_os_get_page_size(); 113 offset = where % page_size; 114 115 /* Map the table header to get the length of the full table */ 116 117 mapped_memory = mmap(NULL, (length + offset), PROT_READ, MMAP_FLAGS, 118 fd, (where - offset)); 119 if (mapped_memory == MAP_FAILED) { 120 fprintf(stderr, "Cannot map %s\n", SYSTEM_MEMORY); 121 close(fd); 122 return (NULL); 123 } 124 125 close(fd); 126 return (ACPI_CAST8(mapped_memory + offset)); 127} 128 129/****************************************************************************** 130 * 131 * FUNCTION: acpi_os_unmap_memory 132 * 133 * PARAMETERS: where - Logical address of memory to be unmapped 134 * length - How much memory to unmap 135 * 136 * RETURN: None. 137 * 138 * DESCRIPTION: Delete a previously created mapping. Where and Length must 139 * correspond to a previous mapping exactly. 140 * 141 *****************************************************************************/ 142 143void acpi_os_unmap_memory(void *where, acpi_size length) 144{ 145 acpi_physical_address offset; 146 acpi_size page_size; 147 148 page_size = acpi_os_get_page_size(); 149 offset = ACPI_TO_INTEGER(where) % page_size; 150 munmap((u8 *)where - offset, (length + offset)); 151} 152