mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
167 lines
5.9 KiB
C#
167 lines
5.9 KiB
C#
using Cosmos.Core;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Cosmos.Core
|
|
{
|
|
// Must be static, memory management requires this
|
|
// Note we cannot allocate anything here, must wrap it very simply
|
|
public static class MultiBoot
|
|
{
|
|
[StructLayout(LayoutKind.Explicit, Size = 88)]
|
|
public struct Header
|
|
{
|
|
public const uint FLAGS_MEM = 0x00000001;
|
|
public const uint FLAGS_BOOT = 0x00000002;
|
|
public const uint FLAGS_CMDLINE = 0x00000004;
|
|
public const uint FLAGS_MODULES = 0x00000008;
|
|
public const uint FLAGS_AOUT = 0x00000010;
|
|
public const uint FLAGS_ELF = 0x00000020;
|
|
public const uint FLAGS_MMAP = 0x00000040;
|
|
public const uint FLAGS_DRIVES = 0x00000080;
|
|
public const uint FLAGS_CONFIG = 0x00000100;
|
|
public const uint FLAGS_LOADER = 0x00000200;
|
|
public const uint FLAGS_APM = 0x00000400;
|
|
public const uint FLAGS_VBE = 0x00000800;
|
|
|
|
[FieldOffset(0)]
|
|
public uint flags;
|
|
[FieldOffset(4)]
|
|
public uint mem_lower; // Valid if (flags & 0x00000001)
|
|
[FieldOffset(8)]
|
|
public uint mem_upper; // Valid if (flags & 0x00000001)
|
|
[FieldOffset(12)]
|
|
public uint boot_device; // Valid if (flags & 0x00000002)
|
|
[FieldOffset(16)]
|
|
public uint cmdline; // Valid if (flags & 0x00000004)
|
|
[FieldOffset(20)]
|
|
public uint mods_count; // Valid if (flags & 0x00000008)
|
|
[FieldOffset(24)]
|
|
public uint mods_addr; // Valid if (flags & 0x00000008)
|
|
[FieldOffset(28)]
|
|
public AOUT aout; // Valid if (flags & 0x00000010)
|
|
[FieldOffset(28)]
|
|
public ELF elf; // Valid if (flags & 0x00000020)
|
|
[FieldOffset(44)]
|
|
public uint mmap_length; // Valid if (flags & 0x00000040)
|
|
[FieldOffset(48)]
|
|
public uint mmap_address; // Valid if (flags & 0x00000040)
|
|
[FieldOffset(52)]
|
|
public uint drives_length; // Valid if (flags & 0x00000080)
|
|
[FieldOffset(56)]
|
|
public uint drives_address; // Valid if (flags & 0x00000080)
|
|
[FieldOffset(60)]
|
|
public uint config_table; // Valid if (flags & 0x00000100)
|
|
[FieldOffset(64)]
|
|
public uint boot_loader_name; // Valid if (flags & 0x00000200)
|
|
[FieldOffset(68)]
|
|
public uint apm_table; // Valid if (flags & 0x00000400)
|
|
[FieldOffset(72)]
|
|
public uint vbe_control_info; // Valid if (flags & 0x00000800)
|
|
[FieldOffset(76)]
|
|
public uint vbe_mode_info; // Valid if (flags & 0x00000800)
|
|
[FieldOffset(80)]
|
|
public ushort vbe_mode; // Valid if (flags & 0x00000800)
|
|
[FieldOffset(82)]
|
|
public ushort vbe_interface_seg; // Valid if (flags & 0x00000800)
|
|
[FieldOffset(84)]
|
|
public ushort vbe_interface_off; // Valid if (flags & 0x00000800)
|
|
[FieldOffset(86)]
|
|
public ushort vbe_interface_len; // Valid if (flags & 0x00000800)
|
|
}
|
|
[StructLayout(LayoutKind.Explicit, Size = 16)]
|
|
public struct Module
|
|
{
|
|
[FieldOffset(0)]
|
|
public uint mod_start;
|
|
[FieldOffset(4)]
|
|
public uint mod_end;
|
|
[FieldOffset(8)]
|
|
public uint cmdline;
|
|
[FieldOffset(12)]
|
|
public uint reserved;
|
|
}
|
|
[StructLayout(LayoutKind.Explicit, Size = 16)]
|
|
public struct AOUT
|
|
{
|
|
[FieldOffset(0)]
|
|
public uint tabsize;
|
|
[FieldOffset(4)]
|
|
public uint strsize;
|
|
[FieldOffset(8)]
|
|
public uint address;
|
|
[FieldOffset(12)]
|
|
public uint reserved;
|
|
}
|
|
[StructLayout(LayoutKind.Explicit, Size = 16)]
|
|
public struct ELF
|
|
{
|
|
[FieldOffset(0)]
|
|
public uint num;
|
|
[FieldOffset(4)]
|
|
public uint size;
|
|
[FieldOffset(8)]
|
|
public uint address;
|
|
[FieldOffset(12)]
|
|
public uint shndx;
|
|
}
|
|
[StructLayout(LayoutKind.Explicit, Size = 24)]
|
|
public struct Memory
|
|
{
|
|
public const uint TYPE_RESERVED = 0;
|
|
public const uint TYPE_AVAILABLE = 1;
|
|
public const uint TYPE_ACPI_RECLAIMABLE = 2;
|
|
public const uint TYPE_ACPI_HIBERNATION = 3;
|
|
|
|
[FieldOffset(0)]
|
|
public uint size;
|
|
[FieldOffset(4)]
|
|
public ulong address;
|
|
[FieldOffset(12)]
|
|
public ulong length;
|
|
[FieldOffset(20)]
|
|
public uint type;
|
|
}
|
|
[StructLayout(LayoutKind.Explicit)]
|
|
public struct Drive
|
|
{
|
|
public const byte MODE_CHS = 0;
|
|
public const byte MODE_LBA = 1;
|
|
|
|
[FieldOffset(0)]
|
|
public uint size;
|
|
[FieldOffset(4)]
|
|
public byte number;
|
|
[FieldOffset(5)]
|
|
public byte mode;
|
|
[FieldOffset(6)]
|
|
public ushort cylinders;
|
|
[FieldOffset(8)]
|
|
public byte heads;
|
|
[FieldOffset(9)]
|
|
public byte sectors;
|
|
}
|
|
[StructLayout(LayoutKind.Explicit, Size = 20)]
|
|
public struct APM
|
|
{
|
|
[FieldOffset(0)]
|
|
public ushort version;
|
|
[FieldOffset(2)]
|
|
public ushort cseg;
|
|
[FieldOffset(4)]
|
|
public uint offset;
|
|
[FieldOffset(8)]
|
|
public ushort cseg_16;
|
|
[FieldOffset(10)]
|
|
public ushort dseg;
|
|
[FieldOffset(12)]
|
|
public ushort flags;
|
|
[FieldOffset(14)]
|
|
public ushort cseg_len;
|
|
[FieldOffset(16)]
|
|
public ushort cseg_16_len;
|
|
[FieldOffset(18)]
|
|
public ushort dseg_len;
|
|
}
|
|
}
|
|
}
|