#!/usr/bin/perl
##
##  freebsd-irqs -- List IRQs Assignement Table after Booting
##  Copyright (c) 1998-2004 Ralf S. Engelschall <rse@engelschall.com>
##  
##  Redistribution and use in source and binary forms, with or without
##  modification, are permitted provided that the following conditions
##  are met:
##  1. Redistributions of source code must retain the above copyright
##     notice, this list of conditions and the following disclaimer.
##  2. Redistributions in binary form must reproduce the above copyright
##     notice, this list of conditions and the following disclaimer in the
##     documentation and/or other materials provided with the distribution.
##  
##  THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
##  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
##  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
##  ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
##  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
##  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
##  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
##  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
##  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
##  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
##  SUCH DAMAGE.
##

#   determine how to print in bold face
my $B = `shtool echo -n -e %B`;
my $N = `shtool echo -n -e %b`;

#   determine how the kernel assigned the IRQs 
#   (should be run immediately after booting or dmesg(8) no longer can show all details)
%irq = ();
$irq{0}  = '*timer*';  # always used by timer
$irq{2}  = 'N.A.';     # chains to the second PIC
$irq{8}  = '*rtc*';    # always used for real-time clock
$irq{13} = '*npx*';    # always used for math co-processor
foreach $l (`/sbin/dmesg`) {
    if ($l =~ m|^([^:\s]+).*irq\s+(\d+).*$|s) {
        my ($w, $i) = ($1, $2);
        $w .= " <$1>" if ($l =~ m|.*<([^>]+).*|s);
        if (defined($irq{$i})) { $irq{$i} .= ", $w"; }
        else                   { $irq{$i}  = "$w";   }
    }
}

#   display the complete IRQ table
for ($i = 0; $i < 32; $i++) {
    my $irq = ($irq{$i} || "${B}free${N}");
    $irq =~ s|, |\n    |sg;
    printf("%2d: %s\n", $i, $irq);
}

