using System.Runtime.InteropServices; using XFESystem.Boot; using Xunit; namespace XFESystem.Boot.Tests; public unsafe class FirmwareGpuTests { static void Write64(byte* target, ulong value) { for (int i = 0; i < 8; i++) target[i] = (byte)(value >> (i * 8)); } static void Descriptor(byte* data, ulong address, ulong length, byte type = 0) { for (int i = 0; i < 48; i++) data[i] = 0; data[0] = 0x8a; data[1] = 43; data[3] = type; Write64(data + 6, type == 1 ? 0UL : address > uint.MaxValue ? 64UL : 32UL); Write64(data + 14, address); Write64(data + 22, length - 1); Write64(data + 38, length); data[46] = 0x79; } [Fact] public void ExactPointerFreeAbiFitsFirmwareAllocation() { Assert.Equal(24, sizeof(FirmwareGpuBar)); Assert.Equal(176, sizeof(FirmwareGpuDevice)); Assert.Equal(1440, sizeof(FirmwareGpuHandoff)); Assert.Equal(24, (int)Marshal.OffsetOf(nameof(FirmwareGpuHandoff.Checksum))); Assert.Equal(32, (int)Marshal.OffsetOf(nameof(FirmwareGpuHandoff.Devices))); } [Fact] public void Exact64BitFirmwareResourceMatchesLiveBar() { byte* data = stackalloc byte[48]; FirmwareGpuBar bar; Descriptor(data, 0x4000000000, 0x800000000); Assert.True(FirmwareGpuResources.DecodeBarDescriptor(data, 48, 1, 0xc, 0x40, &bar)); Assert.Equal(0x4000000000UL, bar.Address); Assert.Equal(0x800000000UL, bar.Bytes); Assert.Equal(1u, bar.Index); Assert.Equal(27u, bar.Flags); } [Fact] public void OrdinaryBar0NeedsNoDestructiveProbe() { byte* data = stackalloc byte[48]; FirmwareGpuBar bar; Descriptor(data, 0xfc000000, 0x1000000); Assert.True(FirmwareGpuResources.DecodeBarDescriptor(data, 48, 0, 0xfc000000, 0, &bar)); Assert.Equal(0x1000000UL, bar.Bytes); Assert.Equal(3u, bar.Flags); } [Fact] public void IoApertureCannotBecomeMmio() { byte* data = stackalloc byte[48]; FirmwareGpuBar bar; Descriptor(data, 0x2000, 0x80, 1); Assert.True(FirmwareGpuResources.DecodeBarDescriptor(data, 48, 5, 0x2001, 0, &bar)); Assert.Equal(FirmwareGpuResources.Valid | FirmwareGpuResources.Io, bar.Flags); data[3] = 0; Assert.False(FirmwareGpuResources.DecodeBarDescriptor(data, 48, 5, 0x2001, 0, &bar)); Assert.Equal(0UL, bar.Bytes); } [Theory] [InlineData(0)] [InlineData(1)] [InlineData(2)] [InlineData(3)] [InlineData(4)] [InlineData(5)] [InlineData(6)] [InlineData(7)] [InlineData(8)] [InlineData(9)] [InlineData(10)] [InlineData(11)] [InlineData(12)] [InlineData(13)] [InlineData(14)] public void RejectsUntrustedDescriptorGeometry(int mutation) { byte* data = stackalloc byte[48]; FirmwareGpuBar bar; Descriptor(data, 0xfc000000, 0x1000000); uint bytes = 48, index = 0, low = 0xfc000000, high = 0; switch (mutation) { case 0: bytes = 47; break; case 1: index = 6; break; case 2: data[0] = 0x87; break; case 3: data[1] = 42; break; case 4: data[2] = 1; break; case 5: data[3] = 1; break; case 6: data[46] = 0; break; case 7: Write64(data + 30, 0x1000); break; case 8: Write64(data + 14, 0xfb000000); break; case 9: Write64(data + 22, 0xfd000000); break; case 10: Write64(data + 38, 0); break; case 11: Write64(data + 38, 0x1000001); break; case 12: index = 5; low |= 4; break; case 13: low |= 2; break; case 14: Descriptor(data, 0xffffff0000000000, 0x20000000000); low = 4; high = 0xffffff00; break; } Assert.False(FirmwareGpuResources.DecodeBarDescriptor(data, bytes, index, low, high, &bar)); Assert.Equal(0u, bar.Flags); Assert.Equal(0UL, bar.Address); } [Fact] public void HandoffChecksumProtectsFullDeviceTableAndHeader() { FirmwareGpuHandoff report = default; report.Magic = FirmwareGpuHandoff.Signature; report.Version = 1; report.Bytes = FirmwareGpuHandoff.TotalBytes; report.Checksum = FirmwareGpuResources.Checksum((byte*)&report, report.Bytes); Assert.True(FirmwareGpuResources.Validate(&report, report.Bytes)); for (uint i = 0; i < report.Bytes; i++) { byte* data = (byte*)&report; data[i] ^= 1; Assert.False(FirmwareGpuResources.Validate(&report, FirmwareGpuHandoff.TotalBytes)); data[i] ^= 1; } Assert.False(FirmwareGpuResources.Validate(&report, report.Bytes - 1)); } [Fact] public void RecomputedChecksumDoesNotAuthorizeBadSchema() { FirmwareGpuHandoff report = default; report.Magic = FirmwareGpuHandoff.Signature; report.Version = 1; report.Bytes = FirmwareGpuHandoff.TotalBytes; report.Count = 9; report.Checksum = FirmwareGpuResources.Checksum((byte*)&report, report.Bytes); Assert.False(FirmwareGpuResources.Validate(&report, report.Bytes)); report.Count = 1; report.Reserved = 1; report.Checksum = FirmwareGpuResources.Checksum((byte*)&report, report.Bytes); Assert.False(FirmwareGpuResources.Validate(&report, report.Bytes)); } }