singrdk/base/Kernel/Singularity/BootInfo.cs

317 lines
12 KiB
C#
Raw Normal View History

2008-03-05 09:52:00 -05:00
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
namespace Microsoft.Singularity
{
[StructLayout(LayoutKind.Sequential, Pack=4)]
[CLSCompliant(false)]
public struct BootInfo
{
//
// These constants control the gross layout of physical memory.
//
// Physical Addresses
// 00000000..000fffff Reserved for boot loaders
// 00007000..00017fff 16-bit segment
// 00007b00..0000efff 16-bit real-mode code
// 0000f000..00017fff 16-bit stack
// 00018000..0005ffff boot heap
// 00060000..000affff 32-bit boot loader code (undump)
//
// 00100000..001fffff Reserved for ? (1MB..)
//
// 00200000..002fffff Kernel stack (1MB..2MB)
// 00310000..004fffff Kernel code & static Data (2MB..4MB...)
//
// 00500000..?? Mp ABI stub (haryadi)
//
// 04000000..07ffffff Runtime heaps preferred memory (64MB..128MB)
//
// top-size..top ram minidump load.
//
// fe000000..ffffffff Uncached mapped memory
// Memory Layout Constants
[AccessedByRuntime("referenced in c++")]
// 4KB is currently the only supported size
internal const uint PAGE_SIZE = 0x00001000; // 4KB
// Make sure zero through this address is always unmapped
[AccessedByRuntime("referenced in c++")]
internal const uint PHYSICAL_DISABLED = 0x00004000;
[AccessedByRuntime("referenced in c++")]
internal const uint REAL_CODE_BASE = 0x00007b00;
[AccessedByRuntime("referenced in c++")]
internal const uint REAL_STACK = 0x00017FF0;
[AccessedByRuntime("referenced in c++")]
internal const uint REAL_PBOOTINFO = 0x00017FF8;
[AccessedByRuntime("referenced in c++")]
internal const uint REAL_HEAP = 0x00018000;
[AccessedByRuntime("referenced in c++")]
internal const uint DUMP_CODE_BASE = 0x00060000;
// Addresses for hypervisor overlay pages
[AccessedByRuntime("referenced in c++")]
internal const uint HYPERCALL_PAGE = 0x00100000;
[AccessedByRuntime("referenced in c++")]
internal const uint HYPERVISOR_SIM_PAGE = 0x00101000;
[AccessedByRuntime("referenced in c++")]
internal const uint HYPERVISOR_SIEF_PAGE= 0x00102000;
[AccessedByRuntime("referenced in c++")]
internal const uint KERNEL_LOGREC_BEGIN = 0x00200000;
[AccessedByRuntime("referenced in c++")]
internal const uint KERNEL_LOGREC_LIMIT = 0x00220000;
[AccessedByRuntime("referenced in c++")]
internal const uint KERNEL_LOGTXT_BEGIN = 0x00220000;
[AccessedByRuntime("referenced in c++")]
internal const uint KERNEL_LOGTXT_LIMIT = 0x00240000;
[AccessedByRuntime("referenced in c++")]
internal const uint KERNEL_STACK_BEGIN = 0x00240000;
[AccessedByRuntime("referenced in c++")]
internal const uint KERNEL_STACK = 0x002ff000;
[AccessedByRuntime("referenced in c++")]
internal const uint KERNEL_STACK_LIMIT = 0x00300000;
[AccessedByRuntime("referenced in c++")]
internal const uint KERNEL_BASE = 0x00310000;
// haryadi -- this is the ABI Stub (MpSyscalls.x86)
[AccessedByRuntime("referenced in c++")]
internal const uint MP_ABI_BASE = 0x00600000;
// The physical address and extent of the high-memory
// range to map into the Kernel space, and mark
// "uncached". This window is for communicating with
// hardware.
[AccessedByRuntime("referenced in c++")]
internal const uint UNCACHED_PHYSICAL = 0xFE000000;
[AccessedByRuntime("referenced in c++")]
internal const uint UNCACHED_MAPPED = 0x02000000;
// This is the amount of *contiguous, physical* memory
// to reserve at boot for use as I/O memory
internal const uint IO_MEMORY_SIZE = 0x00800000; // 8MB
//
// These constants control the gross layout of *virtual*
// memory
//
// This is the maximum size of a communication-heap
// (used to reserve enough space in virtual address
// spaces to map in communication heaps as necessary)
// For ease of mapping, this should be a multiple of 2MB
internal const uint COMM_HEAP_MAX_SIZE = 0x02000000; // 32MB
// This determines where the kernel/user boundary is.
// Currently, it needs to be multiple of 1GB.
internal const uint KERNEL_BOUNDARY = 0x40000000; // 1GB
// This determines the maximum virtual address
// we will use. Setting this to less than the
// machine's maximum pointer size can reduce the
// overhead of paging structures.
//
// NOTE we are not currently safe to use the top
// bit of addresses (because of the "mark" bit in the
// multi-use word header), so restrict ourselves to the
// bottom 2GB.
[AccessedByRuntime("referenced in c++")]
internal const uint MAX_VIRTUAL_ADDR = 0x80000000; // 2GB
// Exit Codes:
[AccessedByRuntime("referenced in c++")]
internal const int EXIT_AND_RESTART = 0x1fff;
[AccessedByRuntime("referenced in c++")]
internal const int EXIT_AND_SHUTDOWN = 0x1ffe;
[AccessedByRuntime("referenced in c++")]
internal const int EXIT_AND_WARMBOOT = 0x1ffd;
[AccessedByRuntime("referenced in c++")]
internal const int EXIT_AND_HALT = 0x1ffc;
// Sanity Check
[AccessedByRuntime("referenced in c++")]
internal uint RecSize;
// IDT and PIC
[AccessedByRuntime("referenced in c++")]
internal X86.IDTP BiosIdtPtr;
[AccessedByRuntime("referenced in c++")]
internal ushort BiosPicMask;
[AccessedByRuntime("referenced in c++")]
internal byte BiosWarmResetCmos;
[AccessedByRuntime("referenced in c++")]
internal uint BiosWarmResetVector;
[AccessedByRuntime("referenced in c++")]
internal uint Info16;
// Debug Stub Information
[AccessedByRuntime("referenced in c++")]
internal ushort DebugBasePort;
// Temporary IDT
[AccessedByRuntime("referenced in c++")]
internal ulong IdtEnter0;
[AccessedByRuntime("referenced in c++")]
internal ulong IdtEnter1;
[AccessedByRuntime("referenced in c++")]
internal ulong IdtEnterN;
[AccessedByRuntime("referenced in c++")]
internal ulong IdtTarget;
// Self-descriptive information
[AccessedByRuntime("referenced in c++")]
internal ulong Info32;
[AccessedByRuntime("referenced in c++")]
internal ulong Kill32;
[AccessedByRuntime("referenced in c++")]
internal uint KillAction;
// MP specific variables
[AccessedByRuntime("referenced in c++")]
public ulong MpEnter32; // Entry point
[AccessedByRuntime("referenced in c++")]
public uint MpCpuCount; // No of AP's booted
[AccessedByRuntime("referenced in c++")]
public uint MpStatus32; // Error indicator
[AccessedByRuntime("referenced in c++")]
public ulong MpStartupLock32; // Pointer to MP init lock var
[AccessedByRuntime("referenced in c++")]
public ulong MpBootInfo32; // Pointer to MpBootInfo
// Per CPU state - in initialization order (CPU0 = BSP, CPUX = AP)
[AccessedByRuntime("referenced in c++")]
public CpuInfo Cpu0;
#if SINGULARITY_MP
[AccessedByRuntime("referenced in c++")]
public CpuInfo Cpu1;
[AccessedByRuntime("referenced in c++")]
public CpuInfo Cpu2;
[AccessedByRuntime("referenced in c++")]
public CpuInfo Cpu3;
# if !MAX_CPU2 && !MAX_CPU3 && !MAX_CPU4
# error "MAX_CPUx value is either not defined or not supported."
# endif // MAX_CPUx
#endif // SINGULARITY_MP
[AccessedByRuntime("referenced in c++")]
internal ulong Pdpt32;
[AccessedByRuntime("referenced in c++")]
internal ulong Undump;
// Location (in high memory) of the executable
// images
[AccessedByRuntime("referenced in c++")]
internal ulong DumpAddr32;
// Extent of that data
[AccessedByRuntime("referenced in c++")]
internal uint DumpSize32;
[AccessedByRuntime("referenced in c++")]
internal ulong DumpRemainder;
// Start of the undumped kernel image
[AccessedByRuntime("referenced in c++")]
internal ulong DumpBase;
// Marks the highest address used by the
// kernel image (undumped from high memory)
[AccessedByRuntime("referenced in c++")]
internal ulong DumpLimit;
//
[AccessedByRuntime("referenced in c++")]
internal ulong Heap32;
// PCI Information (V2.0+)
[AccessedByRuntime("referenced in c++")]
internal uint PciBiosAX;
[AccessedByRuntime("referenced in c++")]
internal uint PciBiosBX;
[AccessedByRuntime("referenced in c++")]
internal uint PciBiosCX;
[AccessedByRuntime("referenced in c++")]
internal uint PciBiosEDX;
// BIOS Information
[AccessedByRuntime("referenced in c++")]
public ulong AcpiRoot32;
[AccessedByRuntime("referenced in c++")]
internal ulong PnpNodesAddr32;
[AccessedByRuntime("referenced in c++")]
internal uint PnpNodesSize32;
[AccessedByRuntime("referenced in c++")]
internal ulong SmbiosRoot32;
[AccessedByRuntime("referenced in c++")]
internal ulong DmiRoot32;
[AccessedByRuntime("referenced in c++")]
internal uint IsaCsns;
[AccessedByRuntime("referenced in c++")]
internal ushort IsaReadPort;
[AccessedByRuntime("referenced in c++")]
internal uint Ebda32;
[AccessedByRuntime("referenced in c++")]
public uint MpFloat32;
// SMAP Information
[AccessedByRuntime("referenced in c++")]
internal uint SmapCount;
[AccessedByRuntime("referenced in c++")]
internal ulong SmapData32;
// 1394 Information
[AccessedByRuntime("referenced in c++")]
internal ulong Ohci1394Base;
[AccessedByRuntime("referenced in c++")]
internal ulong Ohci1394BufferAddr32;
[AccessedByRuntime("referenced in c++")]
internal uint Ohci1394BufferSize32;
// File image table
[AccessedByRuntime("referenced in c++")]
internal ulong FileImageTableBase32;
[AccessedByRuntime("referenced in c++")]
internal uint FileImageTableEntries;
// BOOT Information
[AccessedByRuntime("referenced in c++")]
internal ulong CmdLine32;
[AccessedByRuntime("referenced in c++")]
internal uint BootCount;
[MethodImpl(MethodImplOptions.InternalCall)]
[StackBound(8)]
[NoHeapAllocation]
internal static unsafe extern BootInfo * HalGetBootInfo();
[NoHeapAllocation]
public static unsafe BootInfo GetBootInfo()
{
BootInfo *ptr;
ptr = HalGetBootInfo();
return *ptr;
}
[NoHeapAllocation]
public unsafe CpuInfo GetCpuInfo(int processorId)
{
fixed (CpuInfo* ci = &Cpu0)
{
return *(ci + processorId);
}
}
}
}