Re: [OOPS] repeatable 2.4.8-ac7, 2.4.7-ac6 just run xdos

Brian Gerst
2001-08-22T12:01:21Z

Andi Kleen wrote:
>
> Brian Gerst <bgerst@didntduck.org> writes:
>
> > >
> > > CPU: 0
> > > EIP: 0010:[<c0180a18>]
> > > Using defaults from ksymoops -t elf32-i386 -a i386
> > > EFLAGS: 00010002
> > > eax: 00001000 ebx: c4562368 ecx: 00000000 edx: 00000001
> > > esi: c4562368 edi: c4a954d4 ebp: 00000001 esp: c6887d88
> > > ds: 008 es: 0000 ss: 0018
> > ^^^^
> > Here is your problem. %es is set to the null segment. I had my
> > suspicions about the segment reload optimisation in the -ac kernels, and
> > this proves it. Try backing out the changes to arch/i386/kernel/entry.S
> > and include/asm-i386/hw_irq.h and see if that fixes the problem.
>
> This patch should fix the problem. One assumption coded into the reload
> optimization is violated by vm86 mode. Please test.

Yes. What happened here is that %ds and %es were not being updated
atomically. Under normal operation, this would just leave %es with
USER_DS, which is sufficiently equivalent to KERNEL_DS to not cause a
fault. Coming out of vm86 mode however forces the data segment
registers to null after saving the real mode values on the stack. If an
interrupt happened between setting %ds and %es (what are the odds?) then
that assumption would fail and leave %es null, causing the next string
instruction to go boom. The same fix should be applied to entry.S as
well.

--

Brian Gerst