
define lsmod
   set $file = linker_files.tqh_first
   while $file != 0x0
      printf "File: %s @ 0x%x - 0x%x\n", $file->filename, $file->address, $file->address + $file->size - 1
      set $mod = $file->modules.tqh_first
      while $mod != 0x0 && $mod->file == $file
         printf "\tModule: %s\n", $mod->name
         set $mod = $mod->link.tqe_next
      end
      set $file = $file->link.tqe_next
   end
end

define add-module-symbols
   set $file = linker_files.tqh_first
   while $file != 0x0
      if $file != linker_files.tqh_first
         set $filename = $file->filename
         if ( *$filename       == 'w' && *($filename + 1) == 's' && \
              *($filename + 2) == 's' && *($filename + 3) == '.' && \
              *($filename + 4) == 'k' && *($filename + 5) == 'o' )
            shell objdump --headers /modules/wss.ko | grep ' .text' | awk '{print "add-symbol-file /modules/wss.ko \$file->address+0x" $4}' > .ams
            source .ams
         else
            if ( *$filename       == 'e' && *($filename + 1) == 'v' && \
                 *($filename + 2) == 'e' && *($filename + 3) == 'n' && \
                 *($filename + 4) == 't' && *($filename + 5) == 'f' && \
                 *($filename + 6) == 's' && *($filename + 7) == '.' && \
                 *($filename + 8) == 'k' && *($filename + 9) == 'o' )
               shell objdump --headers /modules/eventfs.ko | grep ' .text' | awk '{print "add-symbol-file /modules/eventfs.ko \$file->address+0x" $4}' > .ams
               source .ams
            end
         end
      end
      set $file = $file->link.tqe_next
   end
end

define list-wrapper-modules
   set $mod = wss_module_list
   printf "Wrapper Modules\n"
   while $mod != 0x0
      printf "%3d : ", $mod->wrm_id
      if ($mod->wrm_type == 1)
         printf "wrapper : "
      end
      if ($mod->wrm_type == 2)
         printf "    act : "
      end
      if ($mod->wrm_type == 4)
         printf "library : "
      end
      if ($mod->wrm_type == 8)
         printf "  deact : "
      end
      set $linker = $mod->wrm_linked
      printf "0x%8.8x - 0x%8.8x : %s\n", $linker->linker_file_addr.addr, $linker->linker_file_addr.addr + $linker->linker_file_size - 1, $linker->linker_file_name
      set $mod = $mod->wrm_next
   end
end

define find-wrapper-process
   set $wrp = (wss_proc_t *) wss_proc_list.lh_first
   while $wrp != 0x0
      if $wrp->wrp_p == $arg0
         print-wrapper-process $wrp
         set $wrp = 0x0
      else
         set $wrp = $wrp->wrp_p_list.le_next
      end
   end
end

define print-wrapper-process
   if $arg0 != 0x0
      set $wrp = (wss_proc_t *) $arg0
      printf "[Wrapper Process: 0x%8.8x]\n", $wrp
      printf "wrp_p_list:\n"
      printf "   .le_next: 0x%8.8x\n", $wrp->wrp_p_list.le_next
      printf "wrp_refcount:\n"
      printf "   .un.ref_count: %d\n", $wrp->wrp_refcount->un.ref_count
      printf "wrp_cwd: %s\n", $wrp->wrp_cwd
      printf "wrp_wi_list: 0x%8.8x\n", $wrp->wrp_wi_list
      printf "wrp_arg_list: 0x%8.8x\n", $wrp->wrp_arg_list
      printf "wrp_viewer: 0x%8.8x\n", $wrp->wrp_viewer
      printf "wrp_pid: %d\n", $wrp->wrp_pid
      printf "wrp_path: "
      if $wrp->wrp_path != 0x0
         printf "%s\n", $wrp->wrp_path
      else
         printf "(null)\n"
      end
      printf "wrp_oldpath: "
      if $wrp->wrp_oldpath != 0x0
         printf "%s\n", $wrp->wrp_oldpath
      else
         printf "(null)\n"
      end
      printf "wrp_progname: %s\n", $wrp->wrp_progname
      printf "wrp_p: 0x%8.8x\n", $wrp->wrp_p
      printf "wrp_opaque: 0x%8.8x\n", $wrp->wrp_opaque
   end
end

define print-wrapper-process-opaque
   if $arg0 != 0x0
      set $wrpi = (wsi_proc_t *) $arg0
      printf "[Wrapper Process Opaque: 0x%8.8x]\n", $wrpi
      print-sysentvec $wrpi->sysent
   end
end

define print-sysentvec
   printf "sysent: 0x%8.8x\n", $arg0
   if $arg0 != 0x0
      set $sv = (struct sysentvec *) $arg0
      printf "   sv_size: %d\n", $sv->sv_size
      printf "   sv_table: 0x%8.8x\n", $sv->sv_table
      printf "   sv_mask: %ud\n", $sv->sv_mask
      printf "   sv_sigsize: %d\n", $sv->sv_sigsize
      printf "   sv_sigtbl: 0x%8.8x\n", $sv->sv_sigtbl
      printf "   sv_errsize: %d\n", $sv->sv_errsize
      printf "   sv_errtbl: 0x%8.8x\n", $sv->sv_errtbl
      printf "   sv_transtrap: 0x%8.8x\n", $sv->sv_transtrap
      printf "   sv_fixup: 0x%8.8x\n", $sv->sv_fixup
      printf "   sv_sendsig: 0x%8.8x\n", $sv->sv_sendsig
      printf "   sv_sigcode: 0x%8.8x\n", $sv->sv_sigcode
      printf "   sv_szsigcode: 0x%8.8x\n", $sv->sv_szsigcode
      printf "   sv_prepsyscall: 0x%8.8x\n", $sv->sv_prepsyscall
      printf "   sv_name: %s\n", $sv->sv_name
      printf "   sv_codedump: 0x%8.8x\n", $sv->sv_coredump
      printf "   sv_imgact_try: 0x%8.8x\n", $sv->sv_imgact_try
      printf "   sv_minsigstksz: %d\n", $sv->sv_minsigstksz
   end
end

