Package: xosview Version: 1.8.3+debian-6 Severity: normal Tags: patch xosview has a fixed-size array mapping numbers from /proc/interrupts to interrupt indicator positions. The size of this map is 1024. On some x86-64 system (and probably modern i386 systems too) with PCI express, the interrupt numbers the kernel uses for the Message Signalled Interrupt might well exceed 1024.
The appended patch makes xosview use a dynamic map instead of an static array. -- System Information: Debian Release: lenny/sid APT prefers testing APT policy: (990, 'testing'), (500, 'stable'), (490, 'unstable'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 2.6.25 (SMP w/2 CPU cores) Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages xosview depends on: ii libc6 2.7-10 GNU C Library: Shared libraries ii libgcc1 1:4.3.0-3 GCC support library ii libstdc++6 4.3.0-3 The GNU Standard C++ Library v3 ii libx11-6 2:1.0.3-7 X11 client-side library xosview recommends no packages. -- no debconf information #! /bin/sh /usr/share/dpatch/dpatch-run ## handle_high_irq_numbers.dpatch by <[EMAIL PROTECTED]> ## ## Uses a dynamic map instead of a fixed-size array for interrupt mapping, ## as some x86-64 systems have the MSI interrupts way beyond 1024. @DPATCH@ diff -urNad xosview-1.8.3+debian~/linux/intmeter.cc xosview-1.8.3+debian/linux/intmeter.cc --- xosview-1.8.3+debian~/linux/intmeter.cc 2008-05-31 12:25:04.656454148 +0200 +++ xosview-1.8.3+debian/linux/intmeter.cc 2008-05-31 12:27:10.861106922 +0200 @@ -11,13 +11,14 @@ #include "cpumeter.h" #include <fstream> #include <sstream> +#include <map> #include <stdlib.h> static const char *INTFILE = "/proc/interrupts"; static const char *VERSIONFILE = "/proc/version"; -static int realintnum[1024]; +std::map<int,int> realintnum; IntMeter::IntMeter( XOSView *parent, int cpu) : BitMeter( parent, "INTS", "", 1, @@ -114,10 +115,11 @@ setNumBits(n+1); std::ostringstream os; - os << "INTs (0-16" ; - for (int i=16; i<1024; i++) { - if (realintnum[i]) - os << ", " << (i) ; + os << "INTs (0-15" ; + for (std::map<int,int>::const_iterator it = realintnum.upper_bound(15), + end = realintnum.end(); + it != end; ++it) { + os << ", " << it->first ; } os << ")" << std::ends; @@ -161,11 +163,8 @@ } if (!_old) { - for (i=0; i<1024; i++) // init index into int array - if (i < 16) // first 16 map directly - realintnum[i] = i; - else - realintnum[i] = 0; + for (i=0; i<16; i++) // Map first 16 interrupts directly + realintnum[i] = i; intfile.ignore(1024, '\n'); } -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]