XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESystem

【Rust】XFE系统,基于Rust和汇编

公开
关注 0 Fork 0 Star 0
UTF-8
using XFESystem.Core;
using Xunit;

namespace XFESystem.Core.Tests;

public sealed class PciGpuDiscoveryTests
{
    private static PciGpuDiscovery Device(params PciGpuMemoryBar[] bars) => new(
        "0000:01:00.0", 0x10DE, 0x2B85, 0x03, 0, true, 8, bars);
    private static PciGpuMemoryBar Registers() => new(0, true, false, false, false, 0xF0000000, 0x1000000);

    [Fact]
    public void Discovers64BitFramebufferWithoutTruncatingItsAddress()
    {
        var device = Device(Registers(), new(1, true, false, true, true, 0x4000000000, 0x800000000),
            new(2, false, false, false, false, 0, 0));
        Assert.True(device.IsNvidiaDisplayController);
        Assert.Empty(device.ValidateRegisterWindow());
        Assert.Equal(0x4000000000ul, device.Bars[1].Address);
    }

    [Theory]
    [InlineData(0x1002, 0x03)]
    [InlineData(0x10DE, 0x04)]
    public void RejectsOtherVendorsAndNvidiaAudioFunctions(int vendor, int classCode)
    {
        var device = Device(Registers()) with { VendorId = (ushort)vendor, ClassCode = (byte)classCode };
        Assert.False(device.IsNvidiaDisplayController);
        Assert.Contains("Not an NVIDIA", device.ValidateRegisterWindow());
    }

    [Fact]
    public void RejectsFramebufferApertureInPlaceOfRegisterBar()
    {
        Assert.Contains("BAR 0", Device(Registers() with { IsPrefetchable = true }).ValidateRegisterWindow());
        Assert.Contains("BAR 0", Device(Registers() with { IsIo = true }).ValidateRegisterWindow());
        Assert.Contains("BAR 0", Device(Registers() with { IsAssigned = false }).ValidateRegisterWindow());
    }

    [Fact]
    public void RejectsOverflowRatherThanMappingWrappedPhysicalAddress()
    {
        var overflow = new PciGpuMemoryBar(1, true, false, true, true, ulong.MaxValue - 127, 256);
        Assert.Contains("overflowing", Device(Registers(), overflow).ValidateRegisterWindow());
    }

    [Fact]
    public void Rejects32BitWindowBeyondAddressWidth()
    {
        Assert.Contains("4 GiB", Device(Registers() with { Address = 0x100000000 }).ValidateRegisterWindow());
    }

    [Theory]
    [InlineData(0xF0001000ul, 0x1000000ul)]
    [InlineData(0xF0000000ul, 0x1800ul)]
    public void RejectsMisalignedOrNonPowerOfTwoResource(ulong address, ulong length)
    {
        Assert.Contains("aligned", Device(Registers() with { Address = address, Length = length }).ValidateRegisterWindow());
    }

    [Fact]
    public void RejectsMissingExpressCapabilityAndDuplicateSlots()
    {
        Assert.Contains("PCI Express", (Device(Registers()) with { PciExpress = false }).ValidateRegisterWindow());
        Assert.Contains("Duplicate", Device(Registers(), Registers()).ValidateRegisterWindow());
        Assert.Contains("snapshot", Device().ValidateRegisterWindow());
    }
}