osunixmap.c revision 1.1.1.2
1/****************************************************************************** 2 * 3 * Module Name: osunixmap - Unix OSL for file mappings 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2014, 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 _FreeBSD 48#include <sys/param.h> 49#endif 50 51#define _COMPONENT ACPI_OS_SERVICES 52 ACPI_MODULE_NAME ("osunixmap") 53 54 55#ifndef O_BINARY 56#define O_BINARY 0 57#endif 58 59#ifdef _FreeBSD 60#define MMAP_FLAGS MAP_SHARED 61#else 62#define MMAP_FLAGS MAP_PRIVATE 63#endif 64 65#define SYSTEM_MEMORY "/dev/mem" 66 67 68/******************************************************************************* 69 * 70 * FUNCTION: AcpiOsGetPageSize 71 * 72 * PARAMETERS: None 73 * 74 * RETURN: Page size of the platform. 75 * 76 * DESCRIPTION: Obtain page size of the platform. 77 * 78 ******************************************************************************/ 79 80static ACPI_SIZE 81AcpiOsGetPageSize ( 82 void) 83{ 84 85#ifdef PAGE_SIZE 86 return PAGE_SIZE; 87#else 88 return sysconf (_SC_PAGESIZE); 89#endif 90} 91 92 93/****************************************************************************** 94 * 95 * FUNCTION: AcpiOsMapMemory 96 * 97 * PARAMETERS: Where - Physical address of memory to be mapped 98 * Length - How much memory to map 99 * 100 * RETURN: Pointer to mapped memory. Null on error. 101 * 102 * DESCRIPTION: Map physical memory into local address space. 103 * 104 *****************************************************************************/ 105 106void * 107AcpiOsMapMemory ( 108 ACPI_PHYSICAL_ADDRESS Where, 109 ACPI_SIZE Length) 110{ 111 UINT8 *MappedMemory; 112 ACPI_PHYSICAL_ADDRESS Offset; 113 ACPI_SIZE PageSize; 114 int fd; 115 116 117 fd = open (SYSTEM_MEMORY, O_RDONLY | O_BINARY); 118 if (fd < 0) 119 { 120 fprintf (stderr, "Cannot open %s\n", SYSTEM_MEMORY); 121 return (NULL); 122 } 123 124 /* Align the offset to use mmap */ 125 126 PageSize = AcpiOsGetPageSize (); 127 Offset = Where % PageSize; 128 129 /* Map the table header to get the length of the full table */ 130 131 MappedMemory = mmap (NULL, (Length + Offset), PROT_READ, MMAP_FLAGS, 132 fd, (Where - Offset)); 133 if (MappedMemory == MAP_FAILED) 134 { 135 fprintf (stderr, "Cannot map %s\n", SYSTEM_MEMORY); 136 close (fd); 137 return (NULL); 138 } 139 140 close (fd); 141 return (ACPI_CAST8 (MappedMemory + Offset)); 142} 143 144 145/****************************************************************************** 146 * 147 * FUNCTION: AcpiOsUnmapMemory 148 * 149 * PARAMETERS: Where - Logical address of memory to be unmapped 150 * Length - How much memory to unmap 151 * 152 * RETURN: None. 153 * 154 * DESCRIPTION: Delete a previously created mapping. Where and Length must 155 * correspond to a previous mapping exactly. 156 * 157 *****************************************************************************/ 158 159void 160AcpiOsUnmapMemory ( 161 void *Where, 162 ACPI_SIZE Length) 163{ 164 ACPI_PHYSICAL_ADDRESS Offset; 165 ACPI_SIZE PageSize; 166 167 168 PageSize = AcpiOsGetPageSize (); 169 Offset = (ACPI_PHYSICAL_ADDRESS) Where % PageSize; 170 munmap ((UINT8 *) Where - Offset, (Length + Offset)); 171} 172