[NTOSKRNL]

- Add KiGetSecondLevelDCacheSize (for all the available architectures) and MiGetPdeOffset macros.
- Remove conflicting PDE_SIZE definitions (both aren't used anywhere).
- Fix ValidKernelPde, PointerPte and PointerPde types and correct their use (mminit.c).
- Thanks to the work that was done over the recent commits (in the header branch) and this one, the kernel now builds (but doesn't link yet) for ARM.

svn path=/branches/header-work/; revision=47258
This commit is contained in:
Amine Khaldi 2010-05-17 21:26:51 +00:00
parent 995ef3a334
commit e83facdb84
9 changed files with 44 additions and 19 deletions

View file

@ -116,6 +116,12 @@ extern ULONG KeI386CpuStep;
#define KeGetContextSwitches(Prcb) \ #define KeGetContextSwitches(Prcb) \
(Prcb->KeContextSwitches) (Prcb->KeContextSwitches)
//
// Macro to get the second level cache size field name which differs between
// CISC and RISC architectures, as the former has unified I/D cache
//
#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelCacheSize
#define KeGetExceptionFrame(Thread) \ #define KeGetExceptionFrame(Thread) \
(PKEXCEPTION_FRAME)((ULONG_PTR)KeGetTrapFrame(Thread) - \ (PKEXCEPTION_FRAME)((ULONG_PTR)KeGetTrapFrame(Thread) - \
sizeof(KEXCEPTION_FRAME)) sizeof(KEXCEPTION_FRAME))

View file

@ -112,6 +112,8 @@ MiIsPdeForAddressValid(PVOID Address)
#define ADDR_TO_PDE_OFFSET(v) ((((ULONG_PTR)(v)) / (512 * PAGE_SIZE))) #define ADDR_TO_PDE_OFFSET(v) ((((ULONG_PTR)(v)) / (512 * PAGE_SIZE)))
#define ADDR_TO_PTE_OFFSET(v) ((((ULONG_PTR)(v)) % (512 * PAGE_SIZE)) / PAGE_SIZE) #define ADDR_TO_PTE_OFFSET(v) ((((ULONG_PTR)(v)) % (512 * PAGE_SIZE)) / PAGE_SIZE)
#define MiGetPdeOffset ADDR_TO_PDE_OFFSET
#define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF) #define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF)
#define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF) #define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF)
#define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF) #define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF)

View file

@ -55,6 +55,12 @@
#define KeGetContextSwitches(Prcb) \ #define KeGetContextSwitches(Prcb) \
CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches
//
// Macro to get the second level cache size field name which differs between
// CISC and RISC architectures, as the former has unified I/D cache
//
#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelDcacheSize
// //
// Returns the Interrupt State from a Trap Frame. // Returns the Interrupt State from a Trap Frame.
// ON = TRUE, OFF = FALSE // ON = TRUE, OFF = FALSE

View file

@ -1,10 +1,6 @@
#pragma once #pragma once
//
// Number of bits corresponding to the area that a PDE entry represents (1MB)
//
#define PDE_SHIFT 20 #define PDE_SHIFT 20
#define PDE_SIZE (1 << PDE_SHIFT)
// //
// Number of bits corresponding to the area that a coarse page table entry represents (4KB) // Number of bits corresponding to the area that a coarse page table entry represents (4KB)

View file

@ -59,6 +59,12 @@
#define KeGetContextSwitches(Prcb) \ #define KeGetContextSwitches(Prcb) \
CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches
//
// Macro to get the second level cache size field name which differs between
// CISC and RISC architectures, as the former has unified I/D cache
//
#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelCacheSize
// //
// Returns the Interrupt State from a Trap Frame. // Returns the Interrupt State from a Trap Frame.
// ON = TRUE, OFF = FALSE // ON = TRUE, OFF = FALSE

View file

@ -36,6 +36,8 @@ PULONG MmGetPageDirectory(VOID);
#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) #define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE)))
#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE) #define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE)
#define MiGetPdeOffset ADDR_TO_PDE_OFFSET
/* Easy accessing PFN in PTE */ /* Easy accessing PFN in PTE */
#define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber)

View file

@ -41,6 +41,12 @@ extern ULONG KePPCCacheAlignment;
//#define KD_BREAKPOINT_SIZE //#define KD_BREAKPOINT_SIZE
//#define KD_BREAKPOINT_VALUE //#define KD_BREAKPOINT_VALUE
//
// Macro to get the second level cache size field name which differs between
// CISC and RISC architectures, as the former has unified I/D cache
//
#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelDcacheSize
// //
// Macros for getting and setting special purpose registers in portable code // Macros for getting and setting special purpose registers in portable code
// //

View file

@ -42,8 +42,7 @@
#define _1KB (1024) #define _1KB (1024)
#define _1MB (1024 * _1KB) #define _1MB (1024 * _1KB)
/* Size of a PDE directory, and size of a page table */ /* Size of a page table */
#define PDE_SIZE (PDE_COUNT * sizeof(MMPDE))
#define PT_SIZE (PTE_COUNT * sizeof(MMPTE)) #define PT_SIZE (PTE_COUNT * sizeof(MMPTE))
/* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */ /* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */
@ -169,7 +168,7 @@ typedef struct _MMCOLOR_TABLES
} MMCOLOR_TABLES, *PMMCOLOR_TABLES; } MMCOLOR_TABLES, *PMMCOLOR_TABLES;
extern MMPTE HyperTemplatePte; extern MMPTE HyperTemplatePte;
extern MMPTE ValidKernelPde; extern MMPDE ValidKernelPde;
extern MMPTE ValidKernelPte; extern MMPTE ValidKernelPte;
extern ULONG MmSizeOfNonPagedPoolInBytes; extern ULONG MmSizeOfNonPagedPoolInBytes;

View file

@ -314,13 +314,13 @@ MiSyncARM3WithROS(IN PVOID AddressStart,
// //
// Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder
// //
ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart); ULONG Pde = MiGetPdeOffset(AddressStart);
while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd)) while (Pde <= MiGetPdeOffset(AddressEnd))
{ {
// //
// This both odious and heinous // This both odious and heinous
// //
extern ULONG MmGlobalKernelPageDirectory[1024]; extern ULONG MmGlobalKernelPageDirectory[];
MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde]; MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde];
Pde++; Pde++;
} }
@ -360,10 +360,10 @@ MiComputeColorInformation(VOID)
if (!MmSecondaryColors) if (!MmSecondaryColors)
{ {
/* Get L2 cache information */ /* Get L2 cache information */
L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; L2Associativity = KiGetSecondLevelDCacheSize();
/* The number of colors is the number of cache bytes by set/way */ /* The number of colors is the number of cache bytes by set/way */
MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; MmSecondaryColors = KiGetSecondLevelDCacheSize();
if (L2Associativity) MmSecondaryColors /= L2Associativity; if (L2Associativity) MmSecondaryColors /= L2Associativity;
} }
@ -681,7 +681,7 @@ MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
/* Yes we do, set it up */ /* Yes we do, set it up */
Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex);
Pfn1->u4.PteFrame = StartupPdIndex; Pfn1->u4.PteFrame = StartupPdIndex;
Pfn1->PteAddress = PointerPde; Pfn1->PteAddress = (PMMPTE)PointerPde;
Pfn1->u2.ShareCount++; Pfn1->u2.ShareCount++;
Pfn1->u3.e2.ReferenceCount = 1; Pfn1->u3.e2.ReferenceCount = 1;
Pfn1->u3.e1.PageLocation = ActiveAndValid; Pfn1->u3.e1.PageLocation = ActiveAndValid;
@ -764,7 +764,7 @@ MiBuildPfnDatabaseZeroPage(VOID)
/* Make it a bogus page to catch errors */ /* Make it a bogus page to catch errors */
PointerPde = MiAddressToPde(0xFFFFFFFF); PointerPde = MiAddressToPde(0xFFFFFFFF);
Pfn1->u4.PteFrame = PFN_FROM_PTE(PointerPde); Pfn1->u4.PteFrame = PFN_FROM_PTE(PointerPde);
Pfn1->PteAddress = PointerPde; Pfn1->PteAddress = (PMMPTE)PointerPde;
Pfn1->u2.ShareCount++; Pfn1->u2.ShareCount++;
Pfn1->u3.e2.ReferenceCount = 0xFFF0; Pfn1->u3.e2.ReferenceCount = 0xFFF0;
Pfn1->u3.e1.PageLocation = ActiveAndValid; Pfn1->u3.e1.PageLocation = ActiveAndValid;
@ -1404,8 +1404,10 @@ VOID
NTAPI NTAPI
MiBuildPagedPool(VOID) MiBuildPagedPool(VOID)
{ {
PMMPTE PointerPte, PointerPde; PMMPTE PointerPte;
PMMPDE PointerPde;
MMPTE TempPte = ValidKernelPte; MMPTE TempPte = ValidKernelPte;
MMPDE TempPde = ValidKernelPde;
PFN_NUMBER PageFrameIndex; PFN_NUMBER PageFrameIndex;
KIRQL OldIrql; KIRQL OldIrql;
ULONG Size, BitMapSize; ULONG Size, BitMapSize;
@ -1506,10 +1508,10 @@ MiBuildPagedPool(VOID)
// Allocate a page and map the first paged pool PDE // Allocate a page and map the first paged pool PDE
// //
PageFrameIndex = MmAllocPage(MC_NPPOOL); PageFrameIndex = MmAllocPage(MC_NPPOOL);
TempPte.u.Hard.PageFrameNumber = PageFrameIndex; TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
ASSERT(PointerPde->u.Hard.Valid == 0); ASSERT(PointerPde->u.Hard.Valid == 0);
ASSERT(TempPte.u.Hard.Valid == 1); ASSERT(TempPde.u.Hard.Valid == 1);
*PointerPde = TempPte; *PointerPde = TempPde;
// //
// Release the PFN database lock // Release the PFN database lock
@ -1521,7 +1523,7 @@ MiBuildPagedPool(VOID)
// will be allocated to handle paged pool growth. This is where they'll have // will be allocated to handle paged pool growth. This is where they'll have
// to start. // to start.
// //
MmPagedPoolInfo.NextPdeForPagedPoolExpansion = PointerPde + 1; MmPagedPoolInfo.NextPdeForPagedPoolExpansion = (PMMPTE)(PointerPde + 1);
// //
// We keep track of each page via a bit, so check how big the bitmap will // We keep track of each page via a bit, so check how big the bitmap will