Signed-off-by: Alexandre Derumier <aderum...@odiso.com> --- src/PVE/ProcFSTools.pm | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+)
diff --git a/src/PVE/ProcFSTools.pm b/src/PVE/ProcFSTools.pm index 3826fcc..f491452 100644 --- a/src/PVE/ProcFSTools.pm +++ b/src/PVE/ProcFSTools.pm @@ -21,12 +21,15 @@ my $clock_ticks = POSIX::sysconf(&POSIX::_SC_CLK_TCK); my $cpuinfo; sub read_cpuinfo { + my ($msr) = @_; + my $fn = '/proc/cpuinfo'; return $cpuinfo if $cpuinfo; my $res = { user_hz => $clock_ticks, + vendor => 'unknown', model => 'unknown', mhz => 0, cpus => 1, @@ -45,6 +48,8 @@ sub read_cpuinfo { $count++; } elsif ($line =~ m/^model\s+name\s*:\s*(.*)\s*$/i) { $res->{model} = $1 if $res->{model} eq 'unknown'; + } elsif ($line =~ m/^vendor_id\s*:\s*(.*)\s*$/i) { + $res->{vendor} = $1 if $res->{vendor} eq 'unknown'; } elsif ($line =~ m/^cpu\s+MHz\s*:\s*(\d+\.\d+)\s*$/i) { $res->{mhz} = $1 if !$res->{mhz}; } elsif ($line =~ m/^flags\s*:\s*(.*)$/) { @@ -70,9 +75,45 @@ sub read_cpuinfo { $cpuinfo = $res; + return $res if !$msr; + + if ($cpuinfo->{vendor} eq 'GenuineIntel') { + $res->{msr} = read_cpu_intel_msr(); + } + return $res; } +sub read_msr { + my ($fh, $offset) = @_; + + my $value = undef; + seek $fh, $offset,0; + read $fh, $value, 8; + return unpack("Q", $value) if $value; +} + +sub read_cpu_intel_msr { + my $msr = {}; + my $spectr_msr = undef; + my $capabilities_msr = undef; + my $fn = '/dev/cpu/0/msr'; + + if (!-d $fn) { + eval { + system("/sbin/modprobe msr >/dev/null 2>/dev/null"); + }; + } + return if !$fn; + + my $fh = IO::File->new ($fn, "r"); + return if !$fh; + $msr->{'spec-ctrl'} = read_msr($fh, 0x48); + $msr->{'arch-capabilities'} = read_msr($fh, 0x10a); + close $fh; + return $msr; +} + sub read_proc_uptime { my $ticks = shift; -- 2.30.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel