Article View: net.bugs.2bsd
Article #169Serious mapping problem with 2.9
From: ps
Date: Tue, 23 Oct 1984 23:41
Date: Tue, 23 Oct 1984 23:41
76 lines
2998 bytes
2998 bytes
Subject: panic: trap type 11
Index: /usr/include/sys/seg.h 2.9bsd
Description:
The system crashes with a 'panic: trap type 11'. This is
quite possible on a system compiled with NOKA5 undefined
and data extending up into the fifth segment. (> 40K data+bss)
The machine may also just stop without saying very much (anything?)
if you get two segmentation violations in a short period of time.
In this last case, the machine will not even reboot itself because
it is spinning in trap().
Repeat-By:
Hard to repeat on demand. This problem seems to be timing
dependant. A possible scenario is:
buffer gets mapped in:
*KDSD5 = (BSIZE << 2) | RW
*KDSA5 = click address in buffer pool
... (copying buffer)
clock interrupts:
map[0].se_addr = *KDSA5;
map[0].se_desc = *KDSD5;
*KDSD5 = seg5.se_desc;
*KDSA5 = seg5.se_addr;
... (handle 1 second clock processing)
... ((++lbolt >= hz) && BASEPRI(ps)) is true
... drop the priority to spl1().
... finish processing, start the restormap stuff
*KDSD5 = map[0].se_desc;
disk interrupts:
calls wakeup to notify process of completion of I/O
no Savemap() done because *KDSA5 == seg5.se_addr
and KDSD5 is not checked.
(notice, KDSD5 wrong, KDSA5 correct)
wakeup tries to reference something beyond the size
of a buffer in the fifth segment,
segmentation violation!
Fix:
The solution appears to be to change the savemap() macro
in /usr/include/sys/seg.h. Both the address and descriptor
registers need to be checked when deciding whether to call
Savemap().
It was:
#define savemap(map) {if (*KDSA5 != seg5.se_addr) Savemap(map); \
else map[0].se_desc = NOMAP; }
It should be changed to:
#define savemap(map) \
{\
if (*KDSA5 != seg5.se_addr || *KDSD5 != seg5.se_desc)\
Savemap(map);\
else\
map[0].se_desc = NOMAP;\
}
There is also a small problem in sys/machdep.c in the Restormap()
routine. The code to restore the values of KDS?5 is done in the
wrong order and should be reversed.
It was:
*KDSA5 = map[0].se_addr;
*KDSD5 = map[0].se_desc;
It should be:
*KDSD5 = map[0].se_desc;
*KDSA5 = map[0].se_addr;
We have been running on a kernel with these changes for about two
weeks with no apparent problems. Prior to making these changes,
we would crash at random times, varying from about 5 minutes to 48
hours.
Technical Details
Message-ID:
<18300002@uok.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxj!ihnp4!inuxc!pur-ee!uiucdcs!uok!psShow Full Headers
Complete Article Headers
Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: Notesfiles $Revision: 1.6.2.17 $; site uok.UUCP Path: arc1-ca.pugleaf.net!utzoo!watmath!clyde!burl!ulysses!mhuxj!ihnp4!inuxc!pur-ee!uiucdcs!uok!ps From: ps@uok.UUCP Newsgroups: net.bugs.2bsd Subject: Serious mapping problem with 2.9 Message-ID: <18300002@uok.UUCP> Date: Tue, 23-Oct-84 19:41:00 EDT Article-I.D.: uok.18300002 Posted: Tue Oct 23 19:41:00 1984 Date-Received: Fri, 26-Oct-84 02:50:25 EDT Lines: 77 Nf-ID: #N:uok:18300002:000:2371 Nf-From: uok!ps Oct 23 18:41:00 1984