Skip to content

Instantly share code, notes, and snippets.

@azat
Last active July 13, 2018 10:22
Show Gist options
  • Save azat/4aab7c82a7da5956f79df0a656b71d34 to your computer and use it in GitHub Desktop.
Save azat/4aab7c82a7da5956f79df0a656b71d34 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
function usage()
{
cat - <<EOL
Get DIMM Bank Locator (via dmidecode) by ADDR from mcelog
(tested with dmidecode 3.1)
Usage: $0 <addr>
EOL
cat - <<'EOL'
Example:
$ fgrep ' ADDR' /var/log/mcelog | awk '{print $NF}' | sort -u | xargs -n1 /tmp/dimm-decode.sh | sort -u
EOL
}
# DMI types
MEMORY_DEVICE=17
MEMORY_ARRAY_MAPPED_ADDRESS=19
MEMORY_DEVICE_MAPPED_ADDRESS=20
function mem_array_handles()
{ dmidecode -t $MEMORY_ARRAY_MAPPED_ADDRESS | awk -F'[ ,]' '/^Handle / { print $2 }'; }
function mem_phy()
{ dmidecode -t $MEMORY_DEVICE | grep "Handle $*," -A22; }
function mem_array()
{ dmidecode -t $MEMORY_ARRAY_MAPPED_ADDRESS | fgrep "Handle $*," -A6; }
function mem_device()
{ dmidecode -t $MEMORY_DEVICE_MAPPED_ADDRESS | grep "Memory Array Mapped Address Handle: $*$" -B4; }
function mem_device_uniq()
{
local size=$(dmidecode -t $MEMORY_DEVICE_MAPPED_ADDRESS | fgrep 'Starting Address' | wc -l)
local uniq=$(dmidecode -t $MEMORY_DEVICE_MAPPED_ADDRESS | fgrep 'Starting Address' | sort -u | wc -l)
[ $size -eq $uniq ]
}
function main()
{
local addr=$1
shift || {
usage
return 1
}
[ ${addr:0:2} != "0x" ] && addr="0x$addr"
local uniq=$(mem_device_uniq && echo 1 || echo 0)
local a
for a in $(mem_array_handles); do
local start=0
if [ $uniq -eq 0 ]; then
start=$(mem_array $a | fgrep Starting | awk '{print $NF}')
fi
# TODO: use long field names
local phy=$(mem_device $a | awk -vs=$start -va=$addr --non-decimal-data '/Starting/ { start=$NF; } /Ending/ { end=$NF; if (a >= start+s && a < end+s) m=1; } /Physical/ { if (m) print $NF; m=0; } ')
mem_phy $phy | fgrep 'Bank Locator'
done
}
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment