mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 23:06:00 +00:00
[NTOSKRNL]
- Add MM_HAL_VA_END and use it in MiAddHalIoMappings instead of making assumptions about the page tables - Add MM_SHARED_USER_DATA_VA for x86 - use MM_SHARED_USER_DATA_VA in Mm to avoid ambiguities - fix or comment out USER_SHARED_DATA in asm headers, as it should be the kernel mode address here - set Teb->ExceptionList to NULL on amd64, it is used as a link to the Wow64 TEB, if any svn path=/trunk/; revision=55445
This commit is contained in:
parent
a10e76cc38
commit
83904f66db
11 changed files with 28 additions and 16 deletions
|
@ -19,10 +19,10 @@
|
||||||
const UCHAR HalpClockVector = 0xD1;
|
const UCHAR HalpClockVector = 0xD1;
|
||||||
BOOLEAN HalpClockSetMSRate;
|
BOOLEAN HalpClockSetMSRate;
|
||||||
UCHAR HalpNextMSRate;
|
UCHAR HalpNextMSRate;
|
||||||
UCHAR HalpCurrentRate = 9; /* Initial rate 9: 128 Hz / 7,8 ms */
|
UCHAR HalpCurrentRate = 9; /* Initial rate 9: 128 Hz / 7.8 ms */
|
||||||
ULONG HalpCurrentTimeIncrement;
|
ULONG HalpCurrentTimeIncrement;
|
||||||
static UCHAR RtcMinimumClockRate = 6; /* Minimum rate 6: 16 Hz / 62,5 ms */
|
static UCHAR RtcMinimumClockRate = 6; /* Minimum rate 6: 16 Hz / 62.5 ms */
|
||||||
static UCHAR RtcMaximumClockRate = 10; /* Maximum rate 10: 256 Hz / 3,9 ms */
|
static UCHAR RtcMaximumClockRate = 10; /* Maximum rate 10: 256 Hz / 3.9 ms */
|
||||||
|
|
||||||
|
|
||||||
ULONG
|
ULONG
|
||||||
|
@ -131,7 +131,7 @@ HalpClockInterruptHandler(IN PKTRAP_FRAME TrapFrame)
|
||||||
if (HalpClockSetMSRate)
|
if (HalpClockSetMSRate)
|
||||||
{
|
{
|
||||||
/* Set new clock rate */
|
/* Set new clock rate */
|
||||||
RtcSetClockRate(HalpCurrentRate);
|
RtcSetClockRate(HalpNextMSRate);
|
||||||
|
|
||||||
/* We're done */
|
/* We're done */
|
||||||
HalpClockSetMSRate = FALSE;
|
HalpClockSetMSRate = FALSE;
|
||||||
|
|
|
@ -240,7 +240,7 @@ CONSTANT(Executive),
|
||||||
CONSTANT(FALSE),
|
CONSTANT(FALSE),
|
||||||
CONSTANT(TRUE),
|
CONSTANT(TRUE),
|
||||||
CONSTANT(DBG_STATUS_CONTROL_C),
|
CONSTANT(DBG_STATUS_CONTROL_C),
|
||||||
CONSTANTPTR(USER_SHARED_DATA),
|
//CONSTANTPTR(USER_SHARED_DATA), // FIXME: we need the kernel mode address here!
|
||||||
//CONSTANT(MM_SHARED_USER_DATA_VA),
|
//CONSTANT(MM_SHARED_USER_DATA_VA),
|
||||||
CONSTANT(PAGE_SIZE),
|
CONSTANT(PAGE_SIZE),
|
||||||
//CONSTANT(KERNEL_STACK_CONTROL_LARGE_STACK),
|
//CONSTANT(KERNEL_STACK_CONTROL_LARGE_STACK),
|
||||||
|
|
|
@ -164,6 +164,7 @@ Author:
|
||||||
#define INITIAL_STALL_COUNT 100
|
#define INITIAL_STALL_COUNT 100
|
||||||
#define HYPERSPACE_BASE 0xfffff70000000000ULL
|
#define HYPERSPACE_BASE 0xfffff70000000000ULL
|
||||||
#define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */
|
#define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */
|
||||||
|
#define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL
|
||||||
#define APIC_BASE 0xFFFFFFFFFFFE0000ULL
|
#define APIC_BASE 0xFFFFFFFFFFFE0000ULL
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -142,6 +142,7 @@ Author:
|
||||||
#define HYPERSPACE_BASE 0xc0800000
|
#define HYPERSPACE_BASE 0xc0800000
|
||||||
#endif
|
#endif
|
||||||
#define MM_HAL_VA_START 0xFFC00000
|
#define MM_HAL_VA_START 0xFFC00000
|
||||||
|
#define MM_HAL_VA_END 0xFFFFFFFF
|
||||||
#define APIC_BASE 0xFFFE0000
|
#define APIC_BASE 0xFFFE0000
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -31,6 +31,11 @@ Author:
|
||||||
#define MM_ALLOCATION_GRANULARITY 0x10000
|
#define MM_ALLOCATION_GRANULARITY 0x10000
|
||||||
#define MM_ALLOCATION_GRANULARITY_SHIFT 16L
|
#define MM_ALLOCATION_GRANULARITY_SHIFT 16L
|
||||||
|
|
||||||
|
//
|
||||||
|
// Address of the shared user page
|
||||||
|
//
|
||||||
|
#define MM_SHARED_USER_DATA_VA 0x7FFE0000
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sanity checks for Paging Macros
|
// Sanity checks for Paging Macros
|
||||||
//
|
//
|
||||||
|
|
|
@ -182,7 +182,7 @@ Executive = 0x0
|
||||||
FALSE = 0x0
|
FALSE = 0x0
|
||||||
TRUE = 0x1
|
TRUE = 0x1
|
||||||
DBG_STATUS_CONTROL_C = 0x1
|
DBG_STATUS_CONTROL_C = 0x1
|
||||||
USER_SHARED_DATA = 0x7ffe0000
|
USER_SHARED_DATA = 0xffdf0000
|
||||||
PAGE_SIZE = 0x1000
|
PAGE_SIZE = 0x1000
|
||||||
MAXIMUM_IDTVECTOR = 0xff
|
MAXIMUM_IDTVECTOR = 0xff
|
||||||
PRIMARY_VECTOR_BASE = 0x30
|
PRIMARY_VECTOR_BASE = 0x30
|
||||||
|
|
|
@ -182,7 +182,7 @@ Executive = 0x0
|
||||||
FALSE = 0x0
|
FALSE = 0x0
|
||||||
TRUE = 0x1
|
TRUE = 0x1
|
||||||
DBG_STATUS_CONTROL_C = 0x1
|
DBG_STATUS_CONTROL_C = 0x1
|
||||||
USER_SHARED_DATA = 0x7ffe0000
|
USER_SHARED_DATA = 0xffdf0000
|
||||||
PAGE_SIZE = 0x1000
|
PAGE_SIZE = 0x1000
|
||||||
MAXIMUM_IDTVECTOR = 0xff
|
MAXIMUM_IDTVECTOR = 0xff
|
||||||
PRIMARY_VECTOR_BASE = 0x30
|
PRIMARY_VECTOR_BASE = 0x30
|
||||||
|
|
|
@ -1284,9 +1284,9 @@ INIT_FUNCTION
|
||||||
MiAddHalIoMappings(VOID)
|
MiAddHalIoMappings(VOID)
|
||||||
{
|
{
|
||||||
PVOID BaseAddress;
|
PVOID BaseAddress;
|
||||||
PMMPDE PointerPde;
|
PMMPDE PointerPde, LastPde;
|
||||||
PMMPTE PointerPte;
|
PMMPTE PointerPte;
|
||||||
ULONG i, j, PdeCount;
|
ULONG j;
|
||||||
PFN_NUMBER PageFrameIndex;
|
PFN_NUMBER PageFrameIndex;
|
||||||
|
|
||||||
/* HAL Heap address -- should be on a PDE boundary */
|
/* HAL Heap address -- should be on a PDE boundary */
|
||||||
|
@ -1295,8 +1295,9 @@ MiAddHalIoMappings(VOID)
|
||||||
|
|
||||||
/* Check how many PDEs the heap has */
|
/* Check how many PDEs the heap has */
|
||||||
PointerPde = MiAddressToPde(BaseAddress);
|
PointerPde = MiAddressToPde(BaseAddress);
|
||||||
PdeCount = PDE_COUNT - MiGetPdeOffset(BaseAddress);
|
LastPde = MiAddressToPde((PVOID)MM_HAL_VA_END);
|
||||||
for (i = 0; i < PdeCount; i++)
|
|
||||||
|
while (PointerPde <= LastPde)
|
||||||
{
|
{
|
||||||
/* Does the HAL own this mapping? */
|
/* Does the HAL own this mapping? */
|
||||||
if ((PointerPde->u.Hard.Valid == 1) &&
|
if ((PointerPde->u.Hard.Valid == 1) &&
|
||||||
|
|
|
@ -56,7 +56,7 @@ MiCheckVirtualAddress(IN PVOID VirtualAddress,
|
||||||
ASSERT(MI_IS_SESSION_ADDRESS(VirtualAddress) == FALSE);
|
ASSERT(MI_IS_SESSION_ADDRESS(VirtualAddress) == FALSE);
|
||||||
|
|
||||||
/* Special case for shared data */
|
/* Special case for shared data */
|
||||||
if (PAGE_ALIGN(VirtualAddress) == (PVOID)USER_SHARED_DATA)
|
if (PAGE_ALIGN(VirtualAddress) == (PVOID)MM_SHARED_USER_DATA_VA)
|
||||||
{
|
{
|
||||||
/* It's a read-only page */
|
/* It's a read-only page */
|
||||||
*ProtectCode = MM_READONLY;
|
*ProtectCode = MM_READONLY;
|
||||||
|
|
|
@ -29,7 +29,7 @@ MiRosTakeOverSharedUserPage(IN PEPROCESS Process)
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PMEMORY_AREA MemoryArea;
|
PMEMORY_AREA MemoryArea;
|
||||||
PHYSICAL_ADDRESS BoundaryAddressMultiple;
|
PHYSICAL_ADDRESS BoundaryAddressMultiple;
|
||||||
PVOID AllocatedBase = (PVOID)USER_SHARED_DATA;
|
PVOID AllocatedBase = (PVOID)MM_SHARED_USER_DATA_VA;
|
||||||
BoundaryAddressMultiple.QuadPart = 0;
|
BoundaryAddressMultiple.QuadPart = 0;
|
||||||
|
|
||||||
Status = MmCreateMemoryArea(&Process->Vm,
|
Status = MmCreateMemoryArea(&Process->Vm,
|
||||||
|
@ -830,7 +830,11 @@ MmCreateTeb(IN PEPROCESS Process,
|
||||||
//
|
//
|
||||||
// Set TIB Data
|
// Set TIB Data
|
||||||
//
|
//
|
||||||
|
#ifdef _M_AMD64
|
||||||
|
Teb->NtTib.ExceptionList = NULL;
|
||||||
|
#else
|
||||||
Teb->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
|
Teb->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
|
||||||
|
#endif
|
||||||
Teb->NtTib.Self = (PNT_TIB)Teb;
|
Teb->NtTib.Self = (PNT_TIB)Teb;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -2360,7 +2360,7 @@ MiQueryMemoryBasicInformation(IN HANDLE ProcessHandle,
|
||||||
|
|
||||||
/* Check for illegal addresses in user-space, or the shared memory area */
|
/* Check for illegal addresses in user-space, or the shared memory area */
|
||||||
if ((BaseAddress > MM_HIGHEST_VAD_ADDRESS) ||
|
if ((BaseAddress > MM_HIGHEST_VAD_ADDRESS) ||
|
||||||
(PAGE_ALIGN(BaseAddress) == (PVOID)USER_SHARED_DATA))
|
(PAGE_ALIGN(BaseAddress) == (PVOID)MM_SHARED_USER_DATA_VA))
|
||||||
{
|
{
|
||||||
Address = PAGE_ALIGN(BaseAddress);
|
Address = PAGE_ALIGN(BaseAddress);
|
||||||
|
|
||||||
|
@ -2370,9 +2370,9 @@ MiQueryMemoryBasicInformation(IN HANDLE ProcessHandle,
|
||||||
MemoryInfo.Type = MEM_PRIVATE;
|
MemoryInfo.Type = MEM_PRIVATE;
|
||||||
|
|
||||||
/* Special case for shared data */
|
/* Special case for shared data */
|
||||||
if (Address == (PVOID)USER_SHARED_DATA)
|
if (Address == (PVOID)MM_SHARED_USER_DATA_VA)
|
||||||
{
|
{
|
||||||
MemoryInfo.AllocationBase = (PVOID)USER_SHARED_DATA;
|
MemoryInfo.AllocationBase = (PVOID)MM_SHARED_USER_DATA_VA;
|
||||||
MemoryInfo.State = MEM_COMMIT;
|
MemoryInfo.State = MEM_COMMIT;
|
||||||
MemoryInfo.Protect = PAGE_READONLY;
|
MemoryInfo.Protect = PAGE_READONLY;
|
||||||
MemoryInfo.RegionSize = PAGE_SIZE;
|
MemoryInfo.RegionSize = PAGE_SIZE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue