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.
68 MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
69 IN ULONG NumberOfBytes,
70 IN BOOLEAN CacheEnable)
78 MmLockAddressSpace(MmGetKernelAddressSpace());
80 Status = MmCreateMemoryArea (NULL,
81 MmGetKernelAddressSpace(),
82 MEMORY_AREA_IO_MAPPING,
88 MmUnlockAddressSpace(MmGetKernelAddressSpace());
90 if (!NT_SUCCESS(STATUS_SUCCESS))
94 Attributes = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM;
97 Attributes |= (PAGE_NOCACHE | PAGE_WRITETHROUGH);
99 for (i = 0; (i < ((NumberOfBytes + PAGE_SIZE - 1) / PAGE_SIZE)); i++)
102 MmCreateVirtualMappingForKernel(Result + (i * PAGE_SIZE),
105 (PhysicalAddress.QuadPart +
107 if (!NT_SUCCESS(Status))
109 DbgPrint("Unable to create virtual mapping\n");
113 return ((PVOID)(Result + PhysicalAddress.QuadPart % PAGE_SIZE));
117 /**********************************************************************
122 * Unmaps a physical memory range from system space.
126 * The base virtual address which maps the region;
129 * Number of bytes to unmap.
135 * Code taken from ntoskrnl/mm/special.c.
141 MmUnmapIoSpace (IN PVOID BaseAddress,
142 IN ULONG NumberOfBytes)
144 (VOID)MmFreeMemoryArea(&PsGetCurrentProcess()->AddressSpace,
145 (PVOID)(((ULONG)BaseAddress / PAGE_SIZE) * PAGE_SIZE),
152 /**********************************************************************
154 * MmMapVideoDisplay@16
157 MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress,
158 IN ULONG NumberOfBytes,
159 IN MEMORY_CACHING_TYPE CacheType)
161 return MmMapIoSpace (PhysicalAddress, NumberOfBytes, CacheType);
166 MmUnmapVideoDisplay (IN PVOID BaseAddress,
167 IN ULONG NumberOfBytes)
169 MmUnmapIoSpace (BaseAddress, NumberOfBytes);