Reorganised cache segment data structure
[reactos.git] / reactos / ntoskrnl / mm / iospace.c
1 /*
2 * ReactOS kernel
3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
4 *
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.
9 *
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.
14 *
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.
18 */
19 /* $Id: iospace.c,v 1.10 2001/04/09 02:45:04 dwelch Exp $
20 *
21 * PROJECT: ReactOS kernel
22 * FILE: ntoskrnl/mm/iospace.c
23 * PURPOSE: Mapping I/O space
24 * PROGRAMMER: David Welch (welch@mcmail.com)
25 * UPDATE HISTORY:
26 * Created 22/05/98
27 */
28
29 /* INCLUDES *****************************************************************/
30
31 #include <ddk/ntddk.h>
32 #include <internal/mm.h>
33 #include <internal/ps.h>
34
35 #define NDEBUG
36 #include <internal/debug.h>
37
38 /* FUNCTIONS *****************************************************************/
39
40 /**********************************************************************
41 * NAME EXPORTED
42 * MmMapIoSpace@16
43 *
44 * DESCRIPTION
45 * Maps a physical memory range into system space.
46 *
47 * ARGUMENTS
48 * PhysicalAddress
49 * First physical address to map;
50 *
51 * NumberOfBytes
52 * Number of bytes to map;
53 *
54 * CacheEnable
55 * TRUE if the range can be cached.
56 *
57 * RETURN VALUE
58 * The base virtual address which maps the region.
59 *
60 * NOTE
61 * Description moved here from include/ddk/mmfuncs.h.
62 * Code taken from ntoskrnl/mm/special.c.
63 *
64 * REVISIONS
65 *
66 */
67 PVOID STDCALL
68 MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress,
69 IN ULONG NumberOfBytes,
70 IN BOOLEAN CacheEnable)
71 {
72 PVOID Result;
73 MEMORY_AREA* marea;
74 NTSTATUS Status;
75 ULONG i;
76 ULONG Attributes;
77
78 Result = NULL;
79 Status = MmCreateMemoryArea (NULL,
80 MmGetKernelAddressSpace(),
81 MEMORY_AREA_IO_MAPPING,
82 &Result,
83 NumberOfBytes,
84 0,
85 &marea,
86 FALSE);
87 if (!NT_SUCCESS(STATUS_SUCCESS))
88 {
89 return (NULL);
90 }
91 Attributes = PAGE_EXECUTE_READWRITE | PAGE_SYSTEM;
92 if (!CacheEnable)
93 {
94 Attributes |= (PAGE_NOCACHE | PAGE_WRITETHROUGH);
95 }
96 for (i = 0; (i <= (NumberOfBytes / PAGESIZE)); i++)
97 {
98 Status =
99 MmCreateVirtualMapping (NULL,
100 (Result + (i * PAGESIZE)),
101 Attributes,
102 PhysicalAddress.u.LowPart + (i * PAGESIZE));
103 if (!NT_SUCCESS(Status))
104 {
105 DbgPrint("Unable to create virtual mapping\n");
106 KeBugCheck(0);
107 }
108 }
109 return ((PVOID)Result);
110 }
111
112
113 /**********************************************************************
114 * NAME EXPORTED
115 * MmUnmapIoSpace@8
116 *
117 * DESCRIPTION
118 * Unmaps a physical memory range from system space.
119 *
120 * ARGUMENTS
121 * BaseAddress
122 * The base virtual address which maps the region;
123 *
124 * NumberOfBytes
125 * Number of bytes to unmap.
126 *
127 * RETURN VALUE
128 * None.
129 *
130 * NOTE
131 * Code taken from ntoskrnl/mm/special.c.
132 *
133 * REVISIONS
134 *
135 */
136 VOID STDCALL
137 MmUnmapIoSpace (IN PVOID BaseAddress,
138 IN ULONG NumberOfBytes)
139 {
140 (VOID)MmFreeMemoryArea(&PsGetCurrentProcess()->AddressSpace,
141 BaseAddress,
142 NumberOfBytes,
143 NULL,
144 NULL);
145 }
146
147
148 /**********************************************************************
149 * NAME EXPORTED
150 * MmMapVideoDisplay@16
151 */
152 PVOID STDCALL
153 MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress,
154 IN ULONG NumberOfBytes,
155 IN MEMORY_CACHING_TYPE CacheType)
156 {
157 return MmMapIoSpace (PhysicalAddress, NumberOfBytes, CacheType);
158 }
159
160
161 VOID STDCALL
162 MmUnmapVideoDisplay (IN PVOID BaseAddress,
163 IN ULONG NumberOfBytes)
164 {
165 MmUnmapIoSpace (BaseAddress, NumberOfBytes);
166 }
167
168
169 /* EOF */