173884e62SMichal Berger#!/usr/bin/env perl 2*588dfe31SMichal Berger# SPDX-License-Identifier: BSD-3-Clause 3*588dfe31SMichal Berger# Copyright (C) 2020 Intel Corporation. 4*588dfe31SMichal Berger# All rights reserved. 5*588dfe31SMichal Berger 673884e62SMichal Berger 773884e62SMichal Bergeruse strict; 873884e62SMichal Bergeruse warnings; 973884e62SMichal Berger 1073884e62SMichal Bergeruse constant SEEK_CUR => 1; 1173884e62SMichal Berger 1273884e62SMichal Berger( @ARGV == 2 ) || exit(1); 1373884e62SMichal Berger 1473884e62SMichal Bergermy $cpu_path = sprintf( "/dev/cpu/%u/msr", shift() ); 1573884e62SMichal Bergermy $msr = hex( shift() ); 1673884e62SMichal Bergermy $reg_size = 8; 1773884e62SMichal Bergermy ( @msr, $msr_buf, $reg ); 1873884e62SMichal Berger 1973884e62SMichal Bergerunless ( -e $cpu_path ) { 2073884e62SMichal Berger printf STDERR "$cpu_path doesn't exist\n"; 2173884e62SMichal Berger exit(1); 2273884e62SMichal Berger} 2373884e62SMichal Berger 2473884e62SMichal Bergeropen( MSR, "<", $cpu_path ); 2573884e62SMichal Bergersysseek( MSR, $msr, SEEK_CUR ); 2673884e62SMichal Bergersysread( MSR, $msr_buf, $reg_size ); 2773884e62SMichal Berger@msr = unpack( "C*", $msr_buf ); 2873884e62SMichal Berger 2973884e62SMichal Bergerunless ( @msr == $reg_size ) { 3073884e62SMichal Berger printf STDERR "Failed to read $cpu_path\n"; 3173884e62SMichal Berger exit(1); 3273884e62SMichal Berger} 3373884e62SMichal Berger 3473884e62SMichal Bergerfor ( my $byte = @msr - 1 ; $byte >= 0 ; $byte-- ) { 3573884e62SMichal Berger $reg |= $msr[$byte] << ( $byte * 8 ); 3673884e62SMichal Berger} 3773884e62SMichal Berger 3873884e62SMichal Bergerprintf( "0x%x\n", $reg ); 39