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.
19 /* $Id: iospace.c,v 1.10 2001/04/09 02:45:04 dwelch Exp $
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
)
79 Status
= MmCreateMemoryArea (NULL
,
80 MmGetKernelAddressSpace(),
81 MEMORY_AREA_IO_MAPPING
,
87 if (!NT_SUCCESS(STATUS_SUCCESS
))
91 Attributes
= PAGE_EXECUTE_READWRITE
| PAGE_SYSTEM
;
94 Attributes
|= (PAGE_NOCACHE
| PAGE_WRITETHROUGH
);
96 for (i
= 0; (i
<= (NumberOfBytes
/ PAGESIZE
)); i
++)
99 MmCreateVirtualMapping (NULL
,
100 (Result
+ (i
* PAGESIZE
)),
102 PhysicalAddress
.u
.LowPart
+ (i
* PAGESIZE
));
103 if (!NT_SUCCESS(Status
))
105 DbgPrint("Unable to create virtual mapping\n");
109 return ((PVOID
)Result
);
113 /**********************************************************************
118 * Unmaps a physical memory range from system space.
122 * The base virtual address which maps the region;
125 * Number of bytes to unmap.
131 * Code taken from ntoskrnl/mm/special.c.
137 MmUnmapIoSpace (IN PVOID BaseAddress
,
138 IN ULONG NumberOfBytes
)
140 (VOID
)MmFreeMemoryArea(&PsGetCurrentProcess()->AddressSpace
,
148 /**********************************************************************
150 * MmMapVideoDisplay@16
153 MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress
,
154 IN ULONG NumberOfBytes
,
155 IN MEMORY_CACHING_TYPE CacheType
)
157 return MmMapIoSpace (PhysicalAddress
, NumberOfBytes
, CacheType
);
162 MmUnmapVideoDisplay (IN PVOID BaseAddress
,
163 IN ULONG NumberOfBytes
)
165 MmUnmapIoSpace (BaseAddress
, NumberOfBytes
);