#!/bin/bash

#
# Dump kernel memory from /dev/kmem.
# Addresses can be numeric or symbolic.
# For example:
#
#   > dkmem allocated_irqs+0x40 8 4
#   0xc082e134+0000: ffffffff ffffffff ffffffff 000ffbff
#   0xc082e134+0010: 00000000 00000000 00000000 00000000
#

if [ "$#" = "0" ]; then
  echo "usage: $0 [ /path/to/mem ] <address|symbol>[+offset] [ count [ num ] ]"
  exit 1
fi

memdev="/dev/kmem"

if [ "${1#/}" != "${1}" -a -r "${1}" ]; then
   memdev="${1}"
   shift
fi

if [ ! -r "${memdev}" ]; then
   echo "$0: no ${memdev}"
   exit 1
fi

match="$(grep -e '[0-9a-f]* . '${1/+*}'[\s]*' /proc/kallsyms 2>/dev/null)"
if [ "0" = "$?" ]; then
  let addr=0x${match/ *}
else
  let addr=${1/+*}
fi

if [ "$1" != "${1/+*}" ]; then
  let addr+=${1/*+}
fi
hexaddr=$(printf "0x%08x" $addr)

let nfmt=2*${3:-4}
if [ "$2" != "" ]; then
  let nfields=16/${3:-4}
  if [ $nfields -gt $2 ]; then
    nfields=$2
  fi
fi

fmt=-e\ '"'$hexaddr'+%04_ax: " '${nfields:-1}'/'${3:-4}' "%0'${nfmt}'x " "\n"'

/ciena/bin/skipper ${memdev} $hexaddr ${3:-4} $((${2:-1} * ${3:-4})) 2>/dev/null | hexdump -v "$fmt"

