コード例 #1
0
ファイル: PMC.cs プロジェクト: L1ttleFlyyy/MetroCPU
        public bool GetPMCTSC(out ulong pmc_count, out ulong tsc_count)
        {
            uint eax_pmc = 0, edx_pmc = 0;
            uint eax_tsc = 0, edx_tsc = 0;

            try
            {
                if ((_ols.RdmsrTx(PMC_num_msr, ref eax_pmc, ref edx_pmc, pthread) > 0) &&
                    (_ols.RdtscTx(ref eax_tsc, ref edx_tsc, pthread) > 0))
                {
                    pmc_count = ((ulong)edx_pmc << 32) + eax_tsc;
                    tsc_count = ((ulong)edx_tsc << 32) + eax_tsc;
                    return(true);
                }
                else
                {
                    pmc_count = 0;
                }
                tsc_count = 0;
                return(false);
            }
            catch (Exception e)
            {
                ErrorMessage = e.Message;
                pmc_count    = 0;
                tsc_count    = 0;
                return(false);
            }
        }
コード例 #2
0
ファイル: PMC.cs プロジェクト: L1ttleFlyyy/MetroCPU
        public PMC(Ols ols, ManufacturerName Manufacturer, int thread, byte uMask, byte eventSelect)
        {
            _ols = ols;
            if (_ols.IsMsr() > 0)
            {
                switch (Manufacturer)
                {
                case ManufacturerName.GenuineIntel:
                    Thread      = thread;
                    pthread     = (UIntPtr)(1UL << Thread);
                    UMask       = uMask;
                    EventSelect = eventSelect;
                    uint eax = 0, edx = 0;
                    for (uint i = 0; i < 8; i++)
                    {
                        if (_ols.RdmsrTx(i + 0x186, ref eax, ref edx, (UIntPtr)(1UL << Thread)) > 0)
                        {
                            if (CPUinfo.BitsSlicer(eax, 22, 22) == 0)
                            {
                                PMC_num = i;
                                edx     = 0;
                                eax     = eventSelect + uMask * 256U + 0x43 * 256 * 256;
                                if (_ols.WrmsrTx(PMC_num + 0x186, eax, edx, (UIntPtr)(1UL << Thread)) == 0)
                                {
                                    ErrorMessage = "Wrmsr failed";
                                    Dispose();
                                    return;
                                }
                                PMC_num_msr = 0x0c1 + PMC_num;
                                break;
                            }
                        }
                        else
                        {
                            ErrorMessage = "No available PMC for this logical processor";
                            Dispose();
                        }
                    }
                    break;

                case ManufacturerName.AuthenticAMD:
                    Thread       = thread;
                    pthread      = (UIntPtr)(1UL << Thread);
                    ErrorMessage = "Unsupported cpu vendor";
                    Dispose();
                    break;

                default:
                    ErrorMessage = "Unsupported cpu vendor";
                    Dispose();
                    break;
                }
            }
        }
コード例 #3
0
        public float GetCurrentFrequencyRatio(out float error)
        {
            ulong mcnt_start, acnt_start, mcnt_stop, acnt_stop;
            ulong err_start, err_stop;

            do
            {
                uint eax_m = 0, edx_m = 0, eax_a = 0, edx_a = 0, eax_e = 0, edx_e = 0;
                ThreadAffinity.Set(ThreadAffinityMask);
                _ols.RdmsrTx(0xe8, ref eax_a, ref edx_a, PThread);
                _ols.RdmsrTx(0xe7, ref eax_m, ref edx_m, PThread);
                _ols.RdmsrTx(0xe8, ref eax_e, ref edx_e, PThread);
                mcnt_start = ((ulong)edx_m << 32) + eax_m;
                acnt_start = ((ulong)edx_a << 32) + eax_a;
                err_start  = ((ulong)edx_a << 32) + eax_e;
                System.Threading.Thread.Sleep(20);
                _ols.RdmsrTx(0xe8, ref eax_a, ref edx_a, PThread);
                _ols.RdmsrTx(0xe7, ref eax_m, ref edx_m, PThread);
                _ols.RdmsrTx(0xe8, ref eax_e, ref edx_e, PThread);
                mcnt_stop = ((ulong)edx_m << 32) + eax_m;
                acnt_stop = ((ulong)edx_a << 32) + eax_a;
                err_stop  = ((ulong)edx_a << 32) + eax_e;
                ThreadAffinity.Set(ThreadAffinityMask);
            } while (acnt_stop <= acnt_start || mcnt_stop <= mcnt_start);
            float res = (float)(acnt_stop - acnt_start) / (mcnt_stop - mcnt_start);

            error = Math.Abs(res - (float)(err_stop - err_start) / (mcnt_stop - mcnt_start)) / res;
            return(res);
        }
コード例 #4
0
ファイル: WinRing0Sample.cs プロジェクト: Chinoyan/TempServe
        private unsafe void Init()
        {
            this.textBox.Text = "";
            this.textBox.Refresh();

            Cursor.Current = Cursors.WaitCursor;

            try
            {
                //-----------------------------------------------------------------------------
                // Initialize
                //-----------------------------------------------------------------------------
                Ols ols = new Ols();

                // Check support library sutatus
                switch (ols.GetStatus())
                {
                    case (uint)Ols.Status.NO_ERROR:
                        break;
                    case (uint)Ols.Status.DLL_NOT_FOUND:
                        MessageBox.Show("Status Error!! DLL_NOT_FOUND");
                        Environment.Exit(0);
                        break;
                    case (uint)Ols.Status.DLL_INCORRECT_VERSION:
                        MessageBox.Show("Status Error!! DLL_INCORRECT_VERSION");
                        Environment.Exit(0);
                        break;
                    case (uint)Ols.Status.DLL_INITIALIZE_ERROR:
                        MessageBox.Show("Status Error!! DLL_INITIALIZE_ERROR");
                        Environment.Exit(0);
                        break;
                }

                // Check WinRing0 status
                switch (ols.GetDllStatus())
                {
                    case (uint)Ols.OlsDllStatus.OLS_DLL_NO_ERROR:
                        break;
                    case (uint)Ols.OlsDllStatus.OLS_DLL_DRIVER_NOT_LOADED:
                        MessageBox.Show("DLL Status Error!! OLS_DRIVER_NOT_LOADED");
                        Environment.Exit(0);
                        break;
                    case (uint)Ols.OlsDllStatus.OLS_DLL_UNSUPPORTED_PLATFORM:
                        MessageBox.Show("DLL Status Error!! OLS_UNSUPPORTED_PLATFORM");
                        Environment.Exit(0);
                        break;
                    case (uint)Ols.OlsDllStatus.OLS_DLL_DRIVER_NOT_FOUND:
                        MessageBox.Show("DLL Status Error!! OLS_DLL_DRIVER_NOT_FOUND");
                        Environment.Exit(0);
                        break;
                    case (uint)Ols.OlsDllStatus.OLS_DLL_DRIVER_UNLOADED:
                        MessageBox.Show("DLL Status Error!! OLS_DLL_DRIVER_UNLOADED");
                        Environment.Exit(0);
                        break;
                    case (uint)Ols.OlsDllStatus.OLS_DLL_DRIVER_NOT_LOADED_ON_NETWORK:
                        MessageBox.Show("DLL Status Error!! DRIVER_NOT_LOADED_ON_NETWORK");
                        Environment.Exit(0);
                        break;
                    case (uint)Ols.OlsDllStatus.OLS_DLL_UNKNOWN_ERROR:
                        MessageBox.Show("DLL Status Error!! OLS_DLL_UNKNOWN_ERROR");
                        Environment.Exit(0);
                        break;
                }

                String str = "";
                //-----------------------------------------------------------------------------
                // DLL Information
                //-----------------------------------------------------------------------------
                byte major = 0, minor = 0, revision = 0, release = 0;

                str += "[DLL Version]\r\n";
                ols.GetDllVersion(ref major, ref minor, ref revision, ref release);
                str += major.ToString()
                    + "." + minor.ToString()
                    + "." + revision.ToString()
                    + "." + release.ToString()
                    + "\r\n";

                str += "[Device Driver Version]\r\n";
                ols.GetDriverVersion(ref major, ref minor, ref revision, ref release);
                str += major.ToString()
                    + "." + minor.ToString()
                    + "." + revision.ToString()
                    + "." + release.ToString()
                    + "\r\n";

                str += "[Device Driver Type]\r\n";
                switch (ols.GetDriverType())
                {
                    case (uint)Ols.OlsDriverType.OLS_DRIVER_TYPE_WIN_9X:
                        str += "OLS_DRIVER_TYPE_WIN_9X\r\n";
                        break;
                    case (uint)Ols.OlsDriverType.OLS_DRIVER_TYPE_WIN_NT:
                        str += "OLS_DRIVER_TYPE_WIN_NT\r\n";
                        break;
                    case (uint)Ols.OlsDriverType.OLS_DRIVER_TYPE_WIN_NT_X64:
                        str += "OLS_DRIVER_TYPE_WIN_NT_X64\r\n";
                        break;
                    case (uint)Ols.OlsDriverType.OLS_DRIVER_TYPE_WIN_NT_IA64:
                        str += "OLS_DRIVER_TYPE_WIN_NT_IA64\r\n";
                        break;
                    default:
                        str += "OLS_DRIVER_TYPE_UNKNOWN\r\n";
                        break;
                }

                //-----------------------------------------------------------------------------
                // TSC
                //-----------------------------------------------------------------------------
                uint index = 0, eax = 0, ebx = 0, ecx = 0, edx = 0;

                str += "[TSC]\r\n";
                if (ols.RdtscPx(ref eax, ref edx, (UIntPtr)1) != 0)
                {
                    str += "index     63-32    31-0\r\n";
                    str += index.ToString("X8") + ": " + edx.ToString("X8")
                        + " " + eax.ToString("X8") + "\r\n";
                }
                else
                {
                    str += "Failure : Change Process Affinity Mask\r\n";
                }

                //-----------------------------------------------------------------------------
                // MSR
                //-----------------------------------------------------------------------------
                str += "[MSR]\r\n";
                index = 0x00000010; // Time Stamp Counter
                if (ols.RdmsrTx(index, ref eax, ref edx, (UIntPtr)1) != 0)
                {
                    str += "index     63-32    31-0\r\n";
                    str += index.ToString("X8") + ": " + edx.ToString("X8")
                        + " " + eax.ToString("X8") + "\r\n";
                }
                else
                {
                    str += "Failure : Change Thread Affinity Mask\r\n";
                }

                //-----------------------------------------------------------------------------
                // CPUID (Standard/Extended)
                //-----------------------------------------------------------------------------
                uint maxCpuid = 0, maxCpuidEx = 0;

                str += "[CPUID]\r\n";
                str += "index     EAX      EBX      ECX      EDX  \r\n";

                // Standard
                ols.CpuidPx(0x00000000, ref maxCpuid, ref ebx, ref ecx, ref edx, (UIntPtr)1);
                for (index = 0x00000000; index <= maxCpuid; index++)
                {
                    ols.CpuidPx(index, ref eax, ref ebx, ref ecx, ref edx, (UIntPtr)1);
                    str += index.ToString("X8") + ": "
                        + eax.ToString("X8") + " " + ebx.ToString("X8") + " "
                        + ecx.ToString("X8") + " " + edx.ToString("X8") + "\r\n";
                }
                // Extended
                ols.CpuidPx(0x80000000, ref maxCpuidEx, ref ebx, ref ecx, ref edx, (UIntPtr)1);
                for (index = 0x80000000; index <= maxCpuidEx; index++)
                {
                    ols.CpuidPx(index, ref eax, ref ebx, ref ecx, ref edx, (UIntPtr)1);
                    str += index.ToString("X8") + ": "
                        + eax.ToString("X8") + " " + ebx.ToString("X8") + " "
                        + ecx.ToString("X8") + " " + edx.ToString("X8") + "\r\n";
                }

                //-----------------------------------------------------------------------------
                // I/O (Beep)
                //-----------------------------------------------------------------------------

                var port = new IndexedIOPort
                {
                  BaseAddress = 0x290,
                  AddressPortOffset = 5,
                  DataPortOffset = 6,
                  BankSelect = 0x4e
                };

                port.Select(1);
                var cputin = port.Read(0x50) + (port.Read(0x51) >> 7) * 0.5;

                port.Select(2);
                var auxtin = port.Read(0x50) + (port.Read(0x51) >> 7) * 0.5;

                port.Select(0);
                var systin = port.Read(0x27);

                var cpufanout0 = port.Read(0x29);
                var cpufanout0div = ((port.Read(0x47) >> 6) & 3) | (((port.Read(0x5d) >> 6) & 1) << 2);

                var cpufanout0rpm = 1.35e6 / (cpufanout0 * (1 << cpufanout0div));

                var sysfanout = port.Read(0x28);
                var sysfanoutdiv = ((port.Read(0x47) >> 4) & 3) | (((port.Read(0x5d) >> 5) & 1) << 2); ;

                var sysfanoutrpm = 1.35e6 / (sysfanout * (1 << sysfanoutdiv));

                var auxfanout0 = port.Read(0x2a);
                var auxfanout0div = ((port.Read(0x4b) >> 6) & 3) | (((port.Read(0x5d) >> 7) & 1) << 2); ;

                var auxfanout0rpm = 1.35e6 / (auxfanout0 * (1 << auxfanout0div));

                var cpufanout1 = port.Read(0x3f);
                var cpufanout1div = ((port.Read(0x59) >> 0) & 3) | (((port.Read(0x4c) >> 7) & 1) << 2);

                var cpufanout1rpm = 1.35e6 / (cpufanout1 * (1 << cpufanout1div));

                port.Select(5);
                var auxfanout1 = port.Read(0x53);
                port.Select(0);
                var auxfanout1div = (port.Read(0x59) >> 2) & 3;

                var vcore = port.Read(0x20) * 0.008;
                var vin0_12v = port.Read(0x21) * 0.008 * 7;
                var avcc = port.Read(0x22) * 0.008;
                var vcc_3_3v = port.Read(0x23) * 0.008 * 2;
                var vin1_5v = port.Read(0x24) * 0.008 * 3;
                var vin2_2_5v = port.Read(0x25) * 0.008;
                var vin3 = port.Read(0x26) * 0.008;

                //ols.WriteIoPortByte(LPCINDEX, 0xFE);
                //var dts = ols.ReadIoPortByte(LPCDATA);

                //uint freq = 1193180000 / 440000; // 440Hz

                //ols.WriteIoPortByte(0x43, 0xB6);
                //ols.WriteIoPortByte(0x42, (byte)(freq & 0xFF));
                //ols.WriteIoPortByte(0x42, (byte)(freq >> 9));

                //System.Threading.Thread.Sleep(100);

                //ols.WriteIoPortByte(0x61, (byte)(ols.ReadIoPortByte(0x61) | 0x03));

                //System.Threading.Thread.Sleep(1000);

                //ols.WriteIoPortByte(0x61, (byte)(ols.ReadIoPortByte(0x61) & 0xFC));

                //str += "[I/O]\r\nBeep 440Hz\r\n";

                //-----------------------------------------------------------------------------
                // PCI
                //-----------------------------------------------------------------------------
                uint address, value;

                str += "[PCI]\r\n";

                // All Device
                str += "Bus Dev Fnc VendorDevice\r\n";
                for (uint bus = 0; bus <= 128; bus++)
                {
                    for (uint dev = 0; dev < 32; dev++)
                    {
                        for (uint func = 0; func < 8; func++)
                        {
                            address = ols.PciBusDevFunc(bus, dev, func);
                            value = ols.ReadPciConfigDword(address, 0x00);
                            if ((value & 0xFFFF) != 0xFFFF && (value & 0xFFFF) != 0x0000)
                            {
                                str += ols.PciGetBus(address).ToString("X2") + "h "
                                    + ols.PciGetDev(address).ToString("X2") + "h "
                                    + ols.PciGetFunc(address).ToString("X2") + "h "
                                    + ((uint)(value & 0x0000FFFF)).ToString("X04") + "h "
                                    + ((uint)((value >> 16) & 0x0000FFFF)).ToString("X04") + "h\r\n";
                            }
                        }
                    }
                }

                // Host Bridge
                address = ols.FindPciDeviceByClass( 0x06, 0x00, 0x00, 0);
                if (address != 0xFFFFFFFF)
                {
                    str += "[PCI Confguration Space Dump] HostBridge\r\n";
                    str += "    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n";
                    str += "---------------------------------------------------\r\n";

                    for (int i = 0; i < 256; i += 16)
                    {
                        str += i.ToString("X2") + "|";
                        for (int j = 0; j < 16; j++)
                        {
                            str += " " + (ols.ReadPciConfigByte(address, (byte)(i + j))).ToString("X2");
                        }
                        str += "\r\n";
                    }
                }

                this.textBox.Text = str;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error");
                Environment.Exit(0);
            }

            Cursor.Current = Cursors.Default;
        }