diff -u --recursive --new-file v1.0.4/linux/Makefile linux/Makefile --- v1.0.4/linux/Makefile Mon Mar 28 17:43:13 1994 +++ linux/Makefile Sat Mar 26 14:14:50 1994 @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 0 -SUBLEVEL = 4 +SUBLEVEL = 5 all: Version zImage @@ -74,6 +74,7 @@ AS =as LD =ld +LDFLAGS =#-qmagic HOSTCC =gcc CC =gcc -D__KERNEL__ MAKE =make diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/README linux/drivers/FPU-emu/README --- v1.0.4/linux/drivers/FPU-emu/README Mon Feb 14 13:10:44 1994 +++ linux/drivers/FPU-emu/README Sat Mar 26 14:04:23 1994 @@ -47,7 +47,7 @@ --Bill Metzenthen - Feb 1994 + March 1994 ----------------------- Internals of wm-FPU-emu ----------------------- @@ -92,7 +92,7 @@ ----------------------- Limitations of wm-FPU-emu ----------------------- There are a number of differences between the current wm-FPU-emu -(version beta 1.10) and the 80486 FPU (apart from bugs). Some of the +(version beta 1.11) and the 80486 FPU (apart from bugs). Some of the more important differences are listed below: The Roundup flag does not have much meaning for the transcendental @@ -144,6 +144,17 @@ exception. For this case, the emulator cannot emulate the behaviour of an 80486DX. +Handling of the address size override prefix byte (0x67) has not been +extensively tested yet. A major problem exists because using it in +vm86 mode can cause a general protection fault. Address offsets +greater than 0xffff appear to be illegal in vm86 mode but are quite +acceptable (and work) in real mode. A small test program developed to +check the addressing, and which runs successfully in real mode, +crashes dosemu under Linux and also brings Windows down with a general +protection fault message when run under the MS-DOS prompt of Windows +3.1. (The program simply reads data from a valid address). + + ----------------------- Performance of wm-FPU-emu ----------------------- Speed. @@ -310,6 +321,7 @@ Hamish Coleman, t933093@minyos.xx.rmit.oz.au Bruce Evans, bde@kralizec.zeta.org.au Timo Korvola, Timo.Korvola@hut.fi +Rick Lyons, rick@razorback.brisnet.org.au ...and numerous others who responded to my request for help with a real 80486. diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/fpu_emu.h linux/drivers/FPU-emu/fpu_emu.h --- v1.0.4/linux/drivers/FPU-emu/fpu_emu.h Wed Feb 16 13:07:55 1994 +++ linux/drivers/FPU-emu/fpu_emu.h Sat Mar 26 14:04:23 1994 @@ -87,6 +87,7 @@ #define PREFIX_FS_ 4 #define PREFIX_GS_ 5 #define PREFIX_SS_ 6 +#define PREFIX_DEFAULT 7 /* These are to defeat the default action, giving the instruction no net effect: */ diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/fpu_entry.c linux/drivers/FPU-emu/fpu_entry.c --- v1.0.4/linux/drivers/FPU-emu/fpu_entry.c Fri Mar 18 10:21:32 1994 +++ linux/drivers/FPU-emu/fpu_entry.c Sat Mar 26 14:04:24 1994 @@ -239,7 +239,7 @@ RE_ENTRANT_CHECK_OFF; FPU_code_verify_area(1); - FPU_modrm = get_fs_byte((unsigned short *) FPU_EIP); + FPU_modrm = get_fs_byte((unsigned char *) FPU_EIP); RE_ENTRANT_CHECK_ON; FPU_EIP++; @@ -281,6 +281,9 @@ FPU_EIP = FPU_ORIG_EIP; /* Point to current FPU instruction. */ + if ( addr_modes.vm86 ) + FPU_EIP -= FPU_CS << 4; + RE_ENTRANT_CHECK_OFF; current->tss.trap_no = 16; current->tss.error_code = 0; @@ -303,6 +306,7 @@ get_address_16(FPU_modrm, &FPU_EIP, addr_modes); else get_address(FPU_modrm, &FPU_EIP, addr_modes); + if ( !(byte1 & 1) ) { unsigned short status1 = partial_status; @@ -563,7 +567,7 @@ unsigned char byte; unsigned char *ip = *fpu_eip; - *override = (overrides) { 0, 0, PREFIX_DS_ }; /* defaults */ + *override = (overrides) { 0, 0, PREFIX_DEFAULT }; /* defaults */ RE_ENTRANT_CHECK_OFF; FPU_code_verify_area(1); @@ -597,9 +601,9 @@ case PREFIX_GS: override->segment = PREFIX_GS_; goto do_next_byte; - - case PREFIX_DS: /* Redundant unless preceded by another override. */ + case PREFIX_DS: override->segment = PREFIX_DS_; + goto do_next_byte; /* lock is not a valid prefix for FPU instructions, let the cpu handle it to generate a SIGILL. */ diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/get_address.c linux/drivers/FPU-emu/get_address.c --- v1.0.4/linux/drivers/FPU-emu/get_address.c Wed Feb 16 13:07:56 1994 +++ linux/drivers/FPU-emu/get_address.c Sat Mar 26 14:04:24 1994 @@ -45,7 +45,8 @@ offsetof(struct info,___vm86_es), offsetof(struct info,___vm86_fs), offsetof(struct info,___vm86_gs), - offsetof(struct info,___ss) + offsetof(struct info,___ss), + offsetof(struct info,___vm86_ds) }; #define VM86_REG_(x) (*(unsigned short *) \ @@ -285,9 +286,13 @@ break; case 2: offset += FPU_info->___ebp + FPU_info->___esi; + if ( addr_modes.override.segment == PREFIX_DEFAULT ) + addr_modes.override.segment = PREFIX_SS_; break; case 3: offset += FPU_info->___ebp + FPU_info->___edi; + if ( addr_modes.override.segment == PREFIX_DEFAULT ) + addr_modes.override.segment = PREFIX_SS_; break; case 4: offset += FPU_info->___esi; @@ -297,6 +302,8 @@ break; case 6: offset += FPU_info->___ebp; + if ( addr_modes.override.segment == PREFIX_DEFAULT ) + addr_modes.override.segment = PREFIX_SS_; break; case 7: offset += FPU_info->___ebx; @@ -313,4 +320,3 @@ FPU_data_address = (void *)offset ; } - diff -u --recursive --new-file v1.0.4/linux/drivers/FPU-emu/version.h linux/drivers/FPU-emu/version.h --- v1.0.4/linux/drivers/FPU-emu/version.h Mon Feb 14 13:10:47 1994 +++ linux/drivers/FPU-emu/version.h Sat Mar 26 14:04:24 1994 @@ -9,5 +9,5 @@ | | +---------------------------------------------------------------------------*/ -#define FPU_VERSION "wm-FPU-emu version Beta 1.10" +#define FPU_VERSION "wm-FPU-emu version Beta 1.11" diff -u --recursive --new-file v1.0.4/linux/drivers/char/tty_ioctl.c linux/drivers/char/tty_ioctl.c --- v1.0.4/linux/drivers/char/tty_ioctl.c Tue Mar 1 19:00:15 1994 +++ linux/drivers/char/tty_ioctl.c Sat Mar 26 15:13:09 1994 @@ -487,7 +487,10 @@ sizeof (pid_t)); if (retval) return retval; - if (current->tty != termios_dev) + /* If a master pty, return the slave's tpgid. + If not, only return the tpgid if this is + the controlling tty. */ + if (tty == termios_tty && current->tty != dev) return -ENOTTY; put_fs_long(termios_tty->pgrp, (pid_t *) arg); return 0; diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/Makefile linux/drivers/scsi/Makefile --- v1.0.4/linux/drivers/scsi/Makefile Wed Dec 1 14:44:15 1993 +++ linux/drivers/scsi/Makefile Sat Mar 26 15:08:15 1994 @@ -9,7 +9,7 @@ #AHA152X = -DDEBUG -DAUTOCONF -DIRQ=11 -DSCSI_ID=7 -DRECONNECT=0 \ # -DPORTBASE=0x340 -DSKIP_BIOSTEST -DDONT_SNARF -AHA152X = -DDEBUG -DAUTOCONF +AHA152X = -DDEBUG_AHA152X -DAUTOCONF SCSI_OBJS = SCSI_SRCS = diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/aha152x.c linux/drivers/scsi/aha152x.c --- v1.0.4/linux/drivers/scsi/aha152x.c Mon Jan 3 07:45:32 1994 +++ linux/drivers/scsi/aha152x.c Sat Mar 26 15:08:16 1994 @@ -1,6 +1,6 @@ /* aha152x.c -- Adaptec AHA-152x driver * Author: Juergen E. Fischer, fischer@server.et-inf.fho-emden.de - * Copyright 1993 Juergen E. Fischer + * Copyright 1993, 1994 Juergen E. Fischer * * * This driver is based on @@ -20,10 +20,17 @@ * General Public License for more details. * - * $Id: aha152x.c,v 0.101 1993/12/13 01:16:27 root Exp $ + * $Id: aha152x.c,v 1.0 1994/03/25 12:52:00 root Exp $ * * $Log: aha152x.c,v $ + * Revision 1.0 1994/03/25 12:52:00 root + * - Fixed "more data than expected" problem + * - added new BIOS signatures + * + * Revision 0.102 1994/01/31 20:44:12 root + * - minor changes in insw/outsw handling + * * Revision 0.101 1993/12/13 01:16:27 root * - fixed STATUS phase (non-GOOD stati were dropped sometimes; * fixes problems with CD-ROM sector size detection & media change) @@ -189,7 +196,7 @@ /* I use this when I'm looking for weird bugs */ #define DEBUG_TIMING -#if defined(DEBUG) +#if defined(DEBUG_AHA152X) #undef SKIP_PORTS /* don't display ports */ @@ -228,7 +235,7 @@ #define P_BUSFREE 1 #define P_PARITY 2 -char *aha152x_id = "Adaptec 152x SCSI driver; $Revision: 0.101 $\n"; +static char *aha152x_id = AHA152X_REVID; static int port_base = 0; static int this_host = 0; @@ -308,27 +315,26 @@ /* possible interrupt channels */ static unsigned short ints[] = { 9, 10, 11, 12 }; -/* signatures for various AIC-6260 based controllers */ +/* signatures for various AIC-6[23]60 based controllers. + The point in detecting signatures is to avoid useless + and maybe harmful probes on ports. I'm not sure that + all listed boards pass auto-configuration. For those + which fail the BIOS signature is obsolete, because + user intervention to supply the configuration is + needed anyway. */ static struct signature { char *signature; int sig_offset; int sig_length; } signatures[] = { - { - "Adaptec AHA-1520 BIOS\r\n\0\ -Version 1.4 \r\n\0\ -Copyright 1990 Adaptec, Inc.\r\n\ -All Rights Reserved\r\n \r\n \r\n", 0x102e, 101 - }, /* Adaptec 152x */ - { - "Adaptec ASW-B626 BIOS\r\n\0\ -Version 1.0 \r\n\0\ -Copyright 1990 Adaptec, Inc.\r\n\ -All Rights Reserved\r\n\0 \r\n \r\n", 0x1029, 102 - }, /* on-board controller */ - { "Adaptec BIOS: ASW-B626", 0x0F, 22}, /* on-board controller */ - { "Adaptec ASW-B626 S2 BIOS", 0x2e6c, 24}, /* on-board controller */ + { "Adaptec AHA-1520 BIOS", 0x102e, 21 }, /* Adaptec 152x */ + { "Adaptec ASW-B626 BIOS", 0x1029, 21 }, /* on-board controller */ + { "Adaptec BIOS: ASW-B626", 0x0f, 22 }, /* on-board controller */ + { "Adaptec ASW-B626 S2", 0x2e6c, 19 }, /* on-board controller */ + { "Adaptec BIOS:AIC-6360", 0xc, 21 }, /* on-board controller */ + { "ScsiPro SP-360 BIOS", 0x2873, 19 }, /* ScsiPro-Controller with AIC-6360 */ + { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 }, /* Gigabyte Local-Bus-SCSI */ }; #define SIGNATURE_COUNT (sizeof( signatures ) / sizeof( struct signature )) @@ -498,11 +504,9 @@ enter_driver("detect"); #endif - printk("aha152x: Probing: "); - if(setup_called) { - printk("processing commandline: "); + printk("aha152x: processing commandline: "); if(setup_called!=4) { @@ -551,12 +555,11 @@ printk("reconnect %d should be 0 or 1\n", can_disconnect); panic("aha152x panics in line %d", __LINE__); } - printk("ok, "); + printk("ok\n"); } else { #if !defined(SKIP_BIOSTEST) - printk("BIOS test: "); ok=0; for( i=0; i < ADDRESS_COUNT && !ok; i++) for( j=0; (j < SIGNATURE_COUNT) && !ok; j++) @@ -572,7 +575,9 @@ printk("failed\n"); return 0; } - printk("ok, "); + printk("aha152x: BIOS test: passed, "); +#else + printk("aha152x: "); #endif /* !SKIP_BIOSTEST */ #if !defined(PORTBASE) @@ -685,14 +690,6 @@ */ const char *aha152x_info(void) { -#if defined(DEBUG_RACE) - enter_driver("info"); - leave_driver("info"); -#else -#if defined(DEBUG_INFO) - printk("\naha152x: info()\n"); -#endif -#endif return(aha152x_id); } @@ -791,7 +788,7 @@ cli(); #if defined(DEBUG_ABORT) - printk("aha152x: abort(), SCpnt=0x%08x, ", (unsigned long) SCpnt ); + printk("aha152x: abort(), SCpnt=0x%08x, ", (unsigned int) SCpnt ); #endif show_queues(); @@ -962,16 +959,8 @@ */ int aha152x_biosparam( int size, int dev, int *info_array ) { -#if defined(DEBUG_RACE) - enter_driver("biosparam"); -#else -#if defined(DEBUG_BIOSPARAM) - printk("\naha152x: biosparam(), "); -#endif -#endif - #if defined(DEBUG_BIOSPARAM) - printk("dev=%x, size=%d, ", dev, size); + printk("aha152x_biosparam: dev=%x, size=%d, ", dev, size); #endif /* I took this from other SCSI drivers, since it provides @@ -986,9 +975,6 @@ printk("WARNING: check, if the bios geometry is correct.\n"); #endif -#if defined(DEBUG_RACE) - leave_driver("biosparam"); -#endif return 0; } @@ -1708,7 +1694,7 @@ ; if( TESTHI( DMASTAT, DFIFOFULL ) ) - fifodata=132; + fifodata=GETPORT(FIFOSTAT); else { /* wait for SCSI fifo to get empty */ @@ -1786,13 +1772,18 @@ } } - /* rare (but possible) status bytes (probably also DISCONNECT - messages) get transfered in the data phase, so I assume 1 - additional byte is ok */ - if(fifodata>1) + /* + * Fifo should be empty + */ + if(fifodata>0) { printk("aha152x: more data than expected (%d bytes)\n", GETPORT(FIFOSTAT)); + SETBITS(DMACNTRL0, _8BIT ); + printk("aha152x: data ( "); + while(fifodata--) + printk("%2x ", GETPORT( DATAPORT )); + printk(")\n"); } #if defined(DEBUG_DATAI) @@ -2302,7 +2293,7 @@ int i; printk("0x%08x: target=%d; lun=%d; cmnd=( ", - (unsigned long) ptr, ptr->target, ptr->lun); + (unsigned int) ptr, ptr->target, ptr->lun); for(i=0; icmnd[0]); i++) printk("%02x ", ptr->cmnd[i]); @@ -2346,7 +2337,7 @@ if(ptr->SCp.phase & (1<<16)) printk("; phaseend"); } - printk("; next=0x%08x\n", (unsigned long) ptr->host_scribble); + printk("; next=0x%08x\n", (unsigned int) ptr->host_scribble); } /* diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/aha152x.h linux/drivers/scsi/aha152x.h --- v1.0.4/linux/drivers/scsi/aha152x.h Wed Dec 1 14:44:16 1993 +++ linux/drivers/scsi/aha152x.h Sat Mar 26 15:08:16 1994 @@ -2,7 +2,7 @@ #define _AHA152X_H /* - * $Id: aha152x.h,v 0.2 1993/10/03 00:58:03 root Exp $ + * $Id: aha152x.h,v 1.0 1994/03/25 12:52:00 root Exp $ */ #include "../block/blk.h" @@ -22,8 +22,10 @@ (unless we support more than 1 cmd_per_lun this should do) */ #define AHA152X_MAXQUEUE 7 +#define AHA152X_REVID "Adaptec 152x SCSI driver; $Revision: 1.0 $" + /* Initial value of Scsi_Host entry */ -#define AHA152X { /* name */ "Adaptec 152x SCSI driver", \ +#define AHA152X { /* name */ AHA152X_REVID, \ /* detect */ aha152x_detect, \ /* info */ aha152x_info, \ /* command */ aha152x_command, \ diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/aha1542.c linux/drivers/scsi/aha1542.c --- v1.0.4/linux/drivers/scsi/aha1542.c Mon Feb 14 22:06:26 1994 +++ linux/drivers/scsi/aha1542.c Sat Mar 26 15:58:41 1994 @@ -95,28 +95,51 @@ printk("status=%x intrflags=%x\n", s, i, WAITnexttimeout-WAITtimeout); */ } +/* This is a bit complicated, but we need to make sure that an interrupt + routine does not send something out while we are in the middle of this. + Fortunately, it is only at boot time that multi-byte messages + are ever sent. */ static int aha1542_out(unsigned int base, unchar *cmdp, int len) { + if(len == 1) { + while(1==1){ + WAIT(STATUS(base), CDF, 0, CDF); + cli(); + if(inb(STATUS(base)) & CDF) {sti(); continue;} + outb(*cmdp, DATA(base)); + sti(); + return 0; + } + } else { + cli(); while (len--) { - WAIT(STATUS(base), CDF, 0, CDF); - outb(*cmdp++, DATA(base)); + WAIT(STATUS(base), CDF, 0, CDF); + outb(*cmdp++, DATA(base)); } + sti(); + } return 0; fail: + sti(); printk("aha1542_out failed(%d): ", len+1); aha1542_stat(); return 1; } +/* Only used at boot time, so we do not need to worry about latency as much + here */ static int aha1542_in(unsigned int base, unchar *cmdp, int len) { + cli(); while (len--) { WAIT(STATUS(base), DF, DF, 0); *cmdp++ = inb(DATA(base)); } + sti(); return 0; fail: + sti(); printk("aha1542_in failed(%d): ", len+1); aha1542_stat(); return 1; } diff -u --recursive --new-file v1.0.4/linux/drivers/scsi/fdomain.c linux/drivers/scsi/fdomain.c --- v1.0.4/linux/drivers/scsi/fdomain.c Mon Jan 24 13:31:37 1994 +++ linux/drivers/scsi/fdomain.c Thu Mar 24 06:29:50 1994 @@ -510,7 +510,7 @@ port_base = ports[i]; if (check_region( port_base, 0x10 )) { #if DEBUG_DETECT - printf( " (%x inuse),", port_base ); + printk( " (%x inuse),", port_base ); #endif continue; } diff -u --recursive --new-file v1.0.4/linux/fs/proc/array.c linux/fs/proc/array.c --- v1.0.4/linux/fs/proc/array.c Thu Feb 17 10:36:54 1994 +++ linux/fs/proc/array.c Mon Mar 28 11:40:19 1994 @@ -88,28 +88,38 @@ static int get_kstat(char * buffer) { - return sprintf(buffer, "cpu %u %u %u %lu\n" - "disk %u %u %u %u\n" - "page %u %u\n" - "swap %u %u\n" - "intr %u\n" - "ctxt %u\n" - "btime %lu\n", - kstat.cpu_user, - kstat.cpu_nice, - kstat.cpu_system, - jiffies - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system), - kstat.dk_drive[0], - kstat.dk_drive[1], - kstat.dk_drive[2], - kstat.dk_drive[3], - kstat.pgpgin, - kstat.pgpgout, - kstat.pswpin, - kstat.pswpout, - kstat.interrupts, - kstat.context_swtch, - xtime.tv_sec - jiffies / HZ); + int i, len; + unsigned sum = 0; + + for (i = 0 ; i < 16 ; i++) + sum += kstat.interrupts[i]; + len = sprintf(buffer, + "cpu %u %u %u %lu\n" + "disk %u %u %u %u\n" + "page %u %u\n" + "swap %u %u\n" + "%u", + kstat.cpu_user, + kstat.cpu_nice, + kstat.cpu_system, + jiffies - (kstat.cpu_user + kstat.cpu_nice + kstat.cpu_system), + kstat.dk_drive[0], + kstat.dk_drive[1], + kstat.dk_drive[2], + kstat.dk_drive[3], + kstat.pgpgin, + kstat.pgpgout, + kstat.pswpin, + kstat.pswpout, + sum); + for (i = 0 ; i < 16 ; i++) + len += sprintf(buffer + len, " %u", kstat.interrupts[i]); + len += sprintf(buffer + len, + "\nctxt %u\n" + "btime %lu\n", + kstat.context_swtch, + xtime.tv_sec - jiffies / HZ); + return len; } diff -u --recursive --new-file v1.0.4/linux/include/linux/fs.h linux/include/linux/fs.h --- v1.0.4/linux/include/linux/fs.h Wed Feb 16 09:29:36 1994 +++ linux/include/linux/fs.h Sat Mar 26 14:44:57 1994 @@ -200,6 +200,7 @@ struct nfs_inode_info nfs_i; struct xiafs_inode_info xiafs_i; struct sysv_inode_info sysv_i; + void * generic_ip; } u; }; @@ -260,6 +261,7 @@ struct nfs_sb_info nfs_sb; struct xiafs_sb_info xiafs_sb; struct sysv_sb_info sysv_sb; + void *generic_sbp; } u; }; diff -u --recursive --new-file v1.0.4/linux/include/linux/kernel_stat.h linux/include/linux/kernel_stat.h --- v1.0.4/linux/include/linux/kernel_stat.h Tue Feb 1 09:19:34 1994 +++ linux/include/linux/kernel_stat.h Mon Mar 28 11:21:52 1994 @@ -14,7 +14,7 @@ unsigned int dk_drive[DK_NDRIVE]; unsigned int pgpgin, pgpgout; unsigned int pswpin, pswpout; - unsigned int interrupts; + unsigned int interrupts[16]; unsigned int ipackets, opackets; unsigned int ierrors, oerrors; unsigned int collisions; diff -u --recursive --new-file v1.0.4/linux/init/main.c linux/init/main.c --- v1.0.4/linux/init/main.c Mon Feb 7 16:07:01 1994 +++ linux/init/main.c Sat Mar 26 14:33:31 1994 @@ -120,6 +120,7 @@ #define MAX_INIT_ARGS 8 #define MAX_INIT_ENVS 8 #define COMMAND_LINE ((char *) (PARAM+2048)) +#define COMMAND_LINE_SIZE 256 extern void time_init(void); @@ -149,7 +150,7 @@ static char fpu_error = 0; -static char command_line[80] = { 0, }; +static char command_line[COMMAND_LINE_SIZE] = { 0, }; char *get_options(char *str, int *ints) { @@ -329,12 +330,19 @@ static void copy_options(char * to, char * from) { char c = ' '; + int len = 0; - do { - if (c == ' ' && !memcmp("mem=", from, 4)) + for (;;) { + if (c == ' ' && *(unsigned long *)from == *(unsigned long *)"mem=") memory_end = simple_strtoul(from+4, &from, 0); - c = *(to++) = *(from++); - } while (c); + c = *(from++); + if (!c) + break; + if (COMMAND_LINE_SIZE <= ++len) + break; + *(to++) = c; + } + *to = '\0'; } static void copro_timeout(void) diff -u --recursive --new-file v1.0.4/linux/kernel/irq.c linux/kernel/irq.c --- v1.0.4/linux/kernel/irq.c Tue Feb 1 09:05:00 1994 +++ linux/kernel/irq.c Mon Mar 28 11:21:52 1994 @@ -201,7 +201,7 @@ { struct sigaction * sa = irq + irq_sigaction; - kstat.interrupts++; + kstat.interrupts[irq]++; sa->sa_handler((int) regs); } @@ -214,7 +214,7 @@ { struct sigaction * sa = irq + irq_sigaction; - kstat.interrupts++; + kstat.interrupts[irq]++; sa->sa_handler(irq); }