mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 04:33:32 +00:00
[NTOS:KE][HALX86] Implement AP startup code (#5879)
Co-authored-by: Victor Perevertkin <victor.perevertkin@reactos.org> Introduce the initial changes needed to get other processors up and into kernel mode. This only supports x86 as of now but is the first real step towards using other system processors.
This commit is contained in:
parent
9e42809fc1
commit
516ccad340
30 changed files with 799 additions and 135 deletions
|
@ -64,81 +64,6 @@ typedef struct
|
|||
#define TYPE_CODE (0x10 | DESCRIPTOR_CODE | DESCRIPTOR_EXECUTE_READ)
|
||||
#define TYPE_DATA (0x10 | DESCRIPTOR_READ_WRITE)
|
||||
|
||||
FORCEINLINE
|
||||
PKGDTENTRY
|
||||
KiGetGdtEntry(
|
||||
IN PVOID pGdt,
|
||||
IN USHORT Selector)
|
||||
{
|
||||
return (PKGDTENTRY)((ULONG_PTR)pGdt + (Selector & ~RPL_MASK));
|
||||
}
|
||||
|
||||
FORCEINLINE
|
||||
VOID
|
||||
KiSetGdtDescriptorBase(
|
||||
IN OUT PKGDTENTRY Entry,
|
||||
IN ULONG32 Base)
|
||||
{
|
||||
Entry->BaseLow = (USHORT)(Base & 0xffff);
|
||||
Entry->HighWord.Bytes.BaseMid = (UCHAR)((Base >> 16) & 0xff);
|
||||
Entry->HighWord.Bytes.BaseHi = (UCHAR)((Base >> 24) & 0xff);
|
||||
// Entry->BaseUpper = (ULONG)(Base >> 32);
|
||||
}
|
||||
|
||||
FORCEINLINE
|
||||
VOID
|
||||
KiSetGdtDescriptorLimit(
|
||||
IN OUT PKGDTENTRY Entry,
|
||||
IN ULONG Limit)
|
||||
{
|
||||
if (Limit < 0x100000)
|
||||
{
|
||||
Entry->HighWord.Bits.Granularity = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Limit >>= 12;
|
||||
Entry->HighWord.Bits.Granularity = 1;
|
||||
}
|
||||
Entry->LimitLow = (USHORT)(Limit & 0xffff);
|
||||
Entry->HighWord.Bits.LimitHi = ((Limit >> 16) & 0x0f);
|
||||
}
|
||||
|
||||
VOID
|
||||
KiSetGdtEntryEx(
|
||||
IN OUT PKGDTENTRY Entry,
|
||||
IN ULONG32 Base,
|
||||
IN ULONG Limit,
|
||||
IN UCHAR Type,
|
||||
IN UCHAR Dpl,
|
||||
IN BOOLEAN Granularity,
|
||||
IN UCHAR SegMode) // 0: 16-bit, 1: 32-bit, 2: 64-bit
|
||||
{
|
||||
KiSetGdtDescriptorBase(Entry, Base);
|
||||
KiSetGdtDescriptorLimit(Entry, Limit);
|
||||
Entry->HighWord.Bits.Type = (Type & 0x1f);
|
||||
Entry->HighWord.Bits.Dpl = (Dpl & 0x3);
|
||||
Entry->HighWord.Bits.Pres = (Type != 0); // Present, must be 1 when the GDT entry is valid.
|
||||
Entry->HighWord.Bits.Sys = 0; // System
|
||||
Entry->HighWord.Bits.Reserved_0 = 0; // LongMode = !!(SegMode & 1);
|
||||
Entry->HighWord.Bits.Default_Big = !!(SegMode & 2);
|
||||
Entry->HighWord.Bits.Granularity |= !!Granularity; // The flag may have been already set by KiSetGdtDescriptorLimit().
|
||||
// Entry->MustBeZero = 0;
|
||||
}
|
||||
|
||||
FORCEINLINE
|
||||
VOID
|
||||
KiSetGdtEntry(
|
||||
IN OUT PKGDTENTRY Entry,
|
||||
IN ULONG32 Base,
|
||||
IN ULONG Limit,
|
||||
IN UCHAR Type,
|
||||
IN UCHAR Dpl,
|
||||
IN UCHAR SegMode) // 0: 16-bit, 1: 32-bit, 2: 64-bit
|
||||
{
|
||||
KiSetGdtEntryEx(Entry, Base, Limit, Type, Dpl, FALSE, SegMode);
|
||||
}
|
||||
|
||||
#if 0
|
||||
VOID
|
||||
DumpGDTEntry(ULONG_PTR Base, ULONG Selector)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue