pre2.0.31-2

Philip Gladstone (philip@raptor.com)
Wed, 04 Jun 1997 11:58:24 -0400


This is a multi-part message in MIME format.

--------------3ECC4B4B14F
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

The following problems are in pre-2.0.31-2:

1) The memory mapped by 'vremap' is marked cacheable. This
is (almost certainly) incorrect as it is memory that is
actually device memory. Note that the mmap call used by
X servers marks the memory as uncached.

This *may* be the cause of the unreliability of the NCR83xxx
SCSI drivers when in memory-mapped mode

See mm.pf below.

2) The auto_irq bug is still present. This can cause a
system hang during bootup when ethernet devices try and
detect their interrupt line. (Particularly noticeable with
the lance chip). [the auto_irq code fails to disable the
interrupt after detecting it.]

See auto_irq.pf below.

3) The protocol number filled into the arp skb is incorrect.

See arp.pf below

4) The ptrace problem with using exit_sig rather than SIGCHLD
is fixed by exit_sig.pf below. This will help strace.
However, I am not happy about the behaviour of wait4 and
the __WCLONE flag. I suspect that this behaviour needs to
be changed, but I am not sure how.

See exit_sig.pf below.

5) I am not happy about the new local port number allocation
code. It has extended the range of local "don't care"
port numbers to include such reserved port numbers as 6000.
I would much prefer that the Solaris range was used
(32768-65534) rather than the range now in use. Alternatively,
this range should be controllable via sysctl. [Some care
needs to be taken to prevent it from overlapping with
the PORT_MASQ range].

I suspect that this change will impact packet filtering
applications.

6) Now that good_socknum can return 0 (meaning no local sockets)
this return code ought to be checked in inet_bind -- rather
than just binding to port 0!

Philip

-- 
Philip Gladstone                           +1 617 487 7700
Raptor Systems, Waltham, MA         http://www.raptor.com/

--------------3ECC4B4B14F Content-Type: text/plain; charset=us-ascii; name="mm.pf" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mm.pf"

--- ./mm/vmalloc.c.30 Sat May 17 08:31:07 1997 +++ ./mm/vmalloc.c Thu May 22 10:01:16 1997 @@ -176,6 +176,20 @@ unsigned long offset) { unsigned long end; + pgprot_t pgprot; + +#if defined(__i386__) +#if defined(__i486__) + pgprot = PAGE_KERNEL_HIGH; +#else + if (x86 > 3) + pgprot = PAGE_KERNEL_HIGH; + else + pgprot = PAGE_KERNEL; +#endif +#else + pgprot = PAGE_KERNEL; +#endif address &= ~PMD_MASK; end = address + size; @@ -184,7 +198,7 @@ do { if (!pte_none(*pte)) printk("remap_area_pte: page already exists\n"); - set_pte(pte, mk_pte(offset, PAGE_KERNEL)); + set_pte(pte, mk_pte(offset, pgprot)); address += PAGE_SIZE; offset += PAGE_SIZE; pte++; --- ./include/asm-i386/pgtable.h.30 Sat May 17 08:42:27 1997 +++ ./include/asm-i386/pgtable.h Sat May 17 08:44:34 1997 @@ -220,6 +220,7 @@ #define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED) #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED) #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED) +#define PAGE_KERNEL_HIGH __pgprot(_PAGE_PCD | _PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED) /* * The i386 can't do page protection for execute, and considers that the same are read.

--------------3ECC4B4B14F Content-Type: text/plain; charset=us-ascii; name="auto_irq.pf" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="auto_irq.pf"

--- linux-pre2/drivers/net/auto_irq.c Fri Mar 1 00:50:43 1996 +++ linux-2.0.30/drivers/net/auto_irq.c Thu May 8 13:50:40 1997 @@ -54,17 +54,23 @@ { irq_number = irq; set_bit(irq, (void *)&irq_bitmap); /* irq_bitmap |= 1 << irq; */ - disable_irq(irq); + /* This code used to disable the irq. However, the interrupt stub + * would then re-enable the interrupt with (potentially) disastrous + * consequences + */ + free_irq(irq, dev_id); return; } int autoirq_setup(int waittime) { - int i, mask; + int i; int timeout = jiffies + waittime; int boguscount = (waittime*loops_per_sec) / 100; irq_handled = 0; + irq_bitmap = 0; + for (i = 0; i < 16; i++) { if (test_bit(i, &irqs_busy) == 0 && request_irq(i, autoirq_probe, SA_INTERRUPT, "irq probe", NULL) == 0) @@ -72,22 +78,15 @@ } /* Update our USED lists. */ irqs_used |= ~irq_handled; - irq_number = 0; - irq_bitmap = 0; /* Hang out at least <waittime> jiffies waiting for bogus IRQ hits. */ while (timeout > jiffies && --boguscount > 0) ; - for (i = 0, mask = 0x01; i < 16; i++, mask <<= 1) { - if (irq_bitmap & irq_handled & mask) { - irq_handled &= ~mask; -#ifdef notdef - printk(" Spurious interrupt on IRQ %d\n", i); -#endif - free_irq(i, NULL); - } - } + irq_handled &= ~irq_bitmap; + + irq_number = 0; /* We are interested in new interrupts from now on */ + return irq_handled; } @@ -102,6 +101,8 @@ while (timeout > jiffies && --boguscount > 0) if (irq_number) break; + + irq_handled &= ~irq_bitmap; /* This eliminates the already reset handlers */ /* Retract the irq handlers that we installed. */ for (i = 0; i < 16; i++) {

--------------3ECC4B4B14F Content-Type: text/plain; charset=us-ascii; name="arp.pf" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="arp.pf"

--- linux-pre2/net/ipv4/arp.c.pre2 Wed Jun 4 11:01:28 1997 +++ linux-pre2/net/ipv4/arp.c Wed Jun 4 11:01:58 1997 @@ -1704,7 +1704,7 @@ skb->arp = 1; skb->dev = dev; skb->free = 1; - skb->protocol = htons (ETH_P_IP); + skb->protocol = htons (ETH_P_ARP); /* * Fill the device header for the ARP frame

--------------3ECC4B4B14F Content-Type: text/plain; charset=us-ascii; name="exit_sig.pf" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="exit_sig.pf"

--- linux-pre2/arch/i386/kernel/ptrace.c Wed Sep 11 10:57:13 1996 +++ linux-2.0.30/arch/i386/kernel/ptrace.c Tue Jun 3 17:28:24 1997 @@ -530,12 +530,19 @@ asmlinkage void syscall_trace(void) { + int exit_signal; + if ((current->flags & (PF_PTRACED|PF_TRACESYS)) != (PF_PTRACED|PF_TRACESYS)) return; current->exit_code = SIGTRAP; current->state = TASK_STOPPED; + + exit_signal = current->exit_signal; + current->exit_signal = SIGCHLD; notify_parent(current); + current->exit_signal = exit_signal; + schedule(); /* * this isn't the same as continuing with a signal, but it will do --- linux-pre2/arch/i386/kernel/signal.c Wed Dec 11 09:41:01 1996 +++ linux-2.0.30/arch/i386/kernel/signal.c Tue Jun 3 17:38:57 1997 @@ -284,9 +284,13 @@ sa = current->sig->action + signr; signr++; if ((current->flags & PF_PTRACED) && signr != SIGKILL) { + int exit_signal; current->exit_code = signr; current->state = TASK_STOPPED; + exit_signal = current->exit_signal; + current->exit_signal = SIGCHLD; notify_parent(current); + current->exit_signal = exit_signal; schedule(); if (!(signr = current->exit_code)) continue; @@ -323,8 +327,14 @@ current->state = TASK_STOPPED; current->exit_code = signr; if (!(current->p_pptr->sig->action[SIGCHLD-1].sa_flags & - SA_NOCLDSTOP)) + SA_NOCLDSTOP)) { + int exit_signal; + + exit_signal = current->exit_signal; + current->exit_signal = SIGCHLD; notify_parent(current); + current->exit_signal = exit_signal; + } schedule(); continue;

--------------3ECC4B4B14F--