Re: Kernel >1.3.7X Breaks DOSEMU

Speed Racer (shagboy@thecia.net)
Wed, 3 Apr 1996 20:53:15 -0500 (EST)


On Mon, 1 Apr 1996, Joel Maslak wrote:

> I can't compile 1.3.79 (don't want to do surgery), haven't tried 1.3.78.
>
> 1.3.80, 1.3.81 cause DOSEMU to do wierd things. I no longer can run
> TradeWars 2.0 or Word Perfect 5.1! Interestingly, I get a DOS prompt, can
> load 'EDIT' and 'MSD'. I can also compile dosemu under 1.3.80, but that
> doesn't help.
>
> I noticed many things -- sockets, network, and pipes -- changed.
> Something broke it. Unfortunately, so much has changed between versions I
> can't simply swap files arround.
>
> Is this related to the sendmail problem?

I dunno about that, but I was able to track the problem down... It seems
that the behavior of the request_irq/free_irq functions in the kernel
changed somewhere about 1.3.80 or so (date was Mar 27 I think) to make
them take an extra argument. Needless to say, any program calling these
functions will have problems...

Here is a patch that at least makes it compile. DANGER: I HAVE NOT
TESTED IT THOROUGHLY AND HAVE NOT IDEA IF IT'S THE RIGHT THING TO DO!
YOU HAVE BEEN WARNED!
that being said, here goes...

root@mossad:/usr/src/dosemu-0.60.4/emumod => # diff -c emusys.c~ emusys.c
*** emusys.c~ Sat Nov 4 12:46:45 1995
--- emusys.c Tue Apr 2 02:09:24 1996
***************
*** 98,110 ****
case EMUSYS_REQUEST_IRQ: {
if (tasks[irqnumber]) return -1;
irqbits &= ~(1 << irqnumber);
! if (request_irq(irqnumber, &irq_handler, 0, ID_STRING )) return -1;
tasks[irqnumber] = current;
return irqnumber;
}
case EMUSYS_FREE_IRQ: {
if (!tasks[irqnumber]) return -1;
! free_irq(irqnumber);
tasks[irqnumber] = 0;
irqbits &= ~(1 << irqnumber);
return irqnumber;
--- 98,110 ----
case EMUSYS_REQUEST_IRQ: {
if (tasks[irqnumber]) return -1;
irqbits &= ~(1 << irqnumber);
! if (request_irq(irqnumber, &irq_handler, 0, ID_STRING, NULL )) return -1;
tasks[irqnumber] = current;
return irqnumber;
}
case EMUSYS_FREE_IRQ: {
if (!tasks[irqnumber]) return -1;
! free_irq(irqnumber, NULL);
tasks[irqnumber] = 0;
irqbits &= ~(1 << irqnumber);
return irqnumber;
***************
*** 118,124 ****
{
int i;
for (i=3; i<16; i++) if (tasks[i]) {
! free_irq(i);
tasks[i]=0;
}
irqbits = 0;
--- 118,124 ----
{
int i;
for (i=3; i<16; i++) if (tasks[i]) {
! free_irq(i, NULL);
tasks[i]=0;
}
irqbits = 0;

The problem is the extra argument, which is supposed to be a void* to
dev_id. I couldn't find any documentation of dev_id anywhere in the
kernel source tree; perhaps I didn't look hard enough? From what I can
tell from looking at linux/arch/i386/kernel/irq.c, it doesn't look like
dev_id is ever looked at, but I can't be sure of that.

I have no idea how well dosemu will work with this; I still can't get it
to work (it complains about "emumodule not loaded" and if I try to load
the module I get "gcc2_compiled undefined", "symbols from 1.3.79 don't
match those from 1.3.79", etc. I thought this problem had been fixed
already. If anyone wants to help, here's my setup:

linux-1.3.79
libc-5.3.8
gcc-2.7.2 (perhaps I need 2.7.2.l.3?)
modules-1.3.69f
dosemu-0.60.4

shag

Judd Bourgeois shagboy@mossad.thecia.net
Finger for PGP public key
It is one of the superstitions of the human mind to have imagined that
virginity could be a virtue.
-- Voltaire