summaryrefslogtreecommitdiff
path: root/eeprom/decode-dimms
diff options
context:
space:
mode:
Diffstat (limited to 'eeprom/decode-dimms')
-rwxr-xr-xeeprom/decode-dimms28
1 files changed, 21 insertions, 7 deletions
diff --git a/eeprom/decode-dimms b/eeprom/decode-dimms
index c2fd253..4a77ff8 100755
--- a/eeprom/decode-dimms
+++ b/eeprom/decode-dimms
@@ -5,7 +5,7 @@
# Copyright 1998, 1999 Philip Edelbrock <phil@netroedge.com>
# modified by Christian Zuckschwerdt <zany@triq.net>
# modified by Burkart Lingner <burkart@bollchen.de>
-# Copyright (C) 2005-2017 Jean Delvare <jdelvare@suse.de>
+# Copyright (C) 2005-2019 Jean Delvare <jdelvare@suse.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -2362,9 +2362,13 @@ sub spd_sizes($)
sub readspd($$$)
{
my ($offset, $size, $dimm_i) = @_;
- my @bytes;
+ my (@bytes, $read);
if ($use_hexdump) {
@bytes = read_hexdump($dimm_i);
+ if (@bytes < $offset + $size) {
+ print STDERR "WARNING: Dump file $dimm_i is truncated\n";
+ $size = @bytes - $offset;
+ }
return @bytes[$offset..($offset + $size - 1)];
} elsif ($use_sysfs) {
# Kernel 2.6 with sysfs
@@ -2373,9 +2377,12 @@ sub readspd($$$)
binmode HANDLE;
sysseek(HANDLE, $offset, SEEK_SET)
or die "Cannot seek $dimm_i/eeprom";
- sysread(HANDLE, my $eeprom, $size)
- or die "Cannot read $dimm_i/eeprom";
+ $read = sysread(HANDLE, my $eeprom, $size)
+ or die "Cannot read $dimm_i/eeprom";
close HANDLE;
+ if ($read < $size) {
+ print STDERR "WARNING: $dimm_i/eeprom is smaller than expected\n";
+ }
@bytes = unpack("C*", $eeprom);
} else {
# Kernel 2.4 with procfs
@@ -2666,11 +2673,14 @@ for $current (0 .. $#dimm) {
printl("Total number of bytes in EEPROM", $spd_size);
# If there's more data than what we've read, let's
- # read it now. DDR3 will need this data.
+ # read it now. DDR3 and DDR4 will need this data.
if ($spd_used > @bytes) {
push (@bytes,
readspd(@bytes, $spd_used - @bytes,
$dimm[$current]->{file}));
+ if (@bytes < $spd_used) {
+ print STDERR "WARNING: Fewer data bytes available (".(scalar @bytes).") than needed ($spd_used)\n";
+ }
}
}
@@ -2703,14 +2713,18 @@ for $current (0 .. $#dimm) {
if ($type eq "DDR3 SDRAM") {
# Decode DDR3-specific manufacturing data in bytes
# 117-149
- decode_ddr3_mfg_data(\@bytes)
+ if (@bytes >= 150) {
+ decode_ddr3_mfg_data(\@bytes)
+ }
} elsif ($type eq "DDR4 SDRAM" ||
$type eq "DDR4E SDRAM" ||
$type eq "LPDDR4 SDRAM" ||
$type eq "LPDDR4X SDRAM") {
# Decode DDR4-specific manufacturing data in bytes
# 320-383
- decode_ddr4_mfg_data(\@bytes)
+ if (@bytes >= 384) {
+ decode_ddr4_mfg_data(\@bytes);
+ }
} else {
# Decode next 35 bytes (64-98, common to most
# memory types)