3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
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.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * PROJECT: ReactOS kernel
22 * FILE: ntoskrnl/mm/iospace.c
23 * PURPOSE: Mapping I/O space
24 * PROGRAMMER: David Welch (welch@mcmail.com)
29 /* INCLUDES *****************************************************************/
31 #include <ddk/ntddk.h>
32 #include <internal/mm.h>
33 #include <internal/ps.h>
36 #include <internal/debug.h>
38 /* FUNCTIONS *****************************************************************/
40 /**********************************************************************
45 * Maps a physical memory range into system space.
49 * First physical address to map;
52 * Number of bytes to map;
55 * TRUE if the range can be cached.
58 * The base virtual address which maps the region.
61 * Description moved here from include/ddk/mmfuncs.h.
62 * Code taken from ntoskrnl/mm/special.c.
69 MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
70 IN ULONG NumberOfBytes,
71 IN BOOLEAN CacheEnable)
79 MmLockAddressSpace(MmGetKernelAddressSpace());
81 Status = MmCreateMemoryArea (NULL,
82 MmGetKernelAddressSpace(),
83 MEMORY_AREA_IO_MAPPING,
90 MmUnlockAddressSpace(MmGetKernelAddressSpace());
92 if (!NT_SUCCESS(STATUS_SUCCESS))
96 Attributes = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM;
99 Attributes |= (PAGE_NOCACHE | PAGE_WRITETHROUGH);
101 for (i = 0; (i < (PAGE_ROUND_UP(NumberOfBytes) / PAGE_SIZE)); i++)
104 MmCreateVirtualMappingForKernel(Result + (i * PAGE_SIZE),
107 (PhysicalAddress.QuadPart +
109 if (!NT_SUCCESS(Status))
111 DbgPrint("Unable to create virtual mapping\n");
114 MmMarkPageMapped((PHYSICAL_ADDRESS) (PhysicalAddress.QuadPart +
117 return ((PVOID)(Result + PhysicalAddress.QuadPart % PAGE_SIZE));
121 /**********************************************************************
126 * Unmaps a physical memory range from system space.
130 * The base virtual address which maps the region;
133 * Number of bytes to unmap.
139 * Code taken from ntoskrnl/mm/special.c.
146 MmUnmapIoSpace (IN PVOID BaseAddress,
147 IN ULONG NumberOfBytes)
149 MmLockAddressSpace(MmGetKernelAddressSpace());
150 MmFreeMemoryArea(MmGetKernelAddressSpace(),
151 (PVOID)(((ULONG)BaseAddress / PAGE_SIZE) * PAGE_SIZE),
155 MmUnlockAddressSpace(MmGetKernelAddressSpace());
159 /**********************************************************************
161 * MmMapVideoDisplay@16
166 MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress,
167 IN ULONG NumberOfBytes,
168 IN MEMORY_CACHING_TYPE CacheType)
170 return MmMapIoSpace (PhysicalAddress, NumberOfBytes, CacheType);
178 MmUnmapVideoDisplay (IN PVOID BaseAddress,
179 IN ULONG NumberOfBytes)
181 MmUnmapIoSpace (BaseAddress, NumberOfBytes);