-
Notifications
You must be signed in to change notification settings - Fork 549
/
Bootstrap.cs
70 lines (61 loc) · 2.55 KB
/
Bootstrap.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using Cosmos.Debug.Kernel;
namespace Cosmos.Core
{
/// <summary>
/// Bootstrap class. Used to invoke pre-boot methods.
/// </summary>
/// <remarks>Bootstrap is a class designed only to get the essentials done.</remarks>
public unsafe static class Bootstrap
{
// See note in Global - these are a "hack" for now so
// we dont force static init of Global, and it "pulls" these later till
// we eventually eliminate them
/// <summary>
/// PIC interrupt.
/// </summary>
static public PIC PIC;
// Has to be static for now, ZeroFill gets called before the Init.
/// <summary>
/// CPU.
/// </summary>
static public readonly CPU CPU = new CPU();
/// <summary>
/// Multiboot header pointer.
/// </summary>
public static Multiboot.Header* MultibootHeader;
/// <summary>
/// VBE mode info pointer.
/// </summary>
public static VBE.ModeInfo* modeinfo;
/// <summary>
/// VBE controller info pointer.
/// </summary>
public static VBE.ControllerInfo* controllerinfo;
// Bootstrap is a class designed only to get the essentials done.
// ie the stuff needed to "pre boot". Do only the very minimal here.
// IDT, PIC, and Float
// Note: This is changing a bit GDT (already) and IDT are moving to a real preboot area.
/// <summary>
/// Init the boot strap. Invoke pre-boot methods.
/// </summary>
public static void Init()
{
// Drag this stuff in to the compiler manually until we add the always include attrib
INTs.Dummy();
PIC = new PIC();
CPU.UpdateIDT(true);
/* TODO check using CPUID that SSE2 is supported */
CPU.InitSSE();
/*
* We liked to use SSE for all floating point operation and end to mix SSE / x87 in Cosmos code
* but sadly in x86 this resulte impossible as Intel not implemented some needed instruction (for example conversion
* for long to double) so - in some rare cases - x87 continue to be used. I hope passing to the x32 or x64 IA will solve
* definively this problem.
*/
CPU.InitFloat();
MultibootHeader = (Multiboot.Header*)Multiboot.GetMBIAddress();
modeinfo = (Core.VBE.ModeInfo*)MultibootHeader->vbeModeInfo;
controllerinfo = (Core.VBE.ControllerInfo*)MultibootHeader->vbeControlInfo;
}
}
}