Bug Fixes and Changes in 4.1BSD
Recovered from Gould UNIX version 6.8, for the Gould 9540. File appears in the standard distribution as /usr/doc/4.1bsd.
Bug fixes and changes in 4.1bsd May 10, 1981 Bill Joy Computer Systems Research Group ABSTRACT This document describes briefly the changes in the Berkeley system for the VAX between the fourth distribution of November 1980 (known origi- nally as 4BSD, and hereinafter referred to as 4.0bsd) and this, its revision of April 1981. It attempts to be summarize, without going into great detail, the changes which have been made. Notable improvements + Performance of the system under heavy paging load has been substantially improved by correcting a problem with placement of pre-paged pages. The system now pre-pages more data, greatly benefitting processes which have locality in their behavior. System degrada- tion due to pre-paging has been reduced (even though more pre-paging is done), by placing the pre-paged pages as the bottom of the free-list, rather than in the systems global clock replacement loop. + Processes which serially reference large amounts of virtual memory may now declare themselves to be sequen- tial (see vadvise(2)), causing the paging algorithm to be adjusted to be more appropriate for such behavior.* Processes which are known to need only a small amount of memory, but which tend to accumulate large amounts of memory due to strange page referencing patterns may declare a soft limit on the amount of memory to be used, see vlimit(2) or do ``limit memoryuse nk'' in csh(1). If the system needs memory, and there are processes which are over their declared limits, the __________________________ * Future versions of the system will detect strongly sequential behavior and adapt themselves accordingly, so this call will no longer be necessary. July 14, 1981 - 2 - system tends to take pages from these processes first. By saying that these limits are soft, we mean that on a system where physical memory is not scarce, processes with limits can still acquire as much physical memory as they require. + The system is now compiled from a description of the local machine which includes information about avail- able devices and the maximum number of users to be sup- ported on the system. It is no longer necessary to adjust an armful of constants to re-size the system; normal time-sharing systems are parameterized from a single ``maxusers'' constant. The system also adjusts the parameters of the paging subsystem based on avail- able memory; it is no longer necessary to adjust these for machines with very small or very large amounts of available memory. + The system now handles multiple uba's and mba's and mixing of devices on mba's. A number of new devices are supported: RK07's and TS-11's which come in the standard 11/750 packages, UNIBUS TM-11 tape emulators (e.g. the EMULEX TC-11 with a KENNEDY 9300 transport). Line printer and C/A/T phototypesetter drivers are included in the system, and modem control for the DH-11 using the DM-11 has been integrated and tested. The new RM-80 Winchester drive from DEC is supported. Not- ably unsupported are the 11/750 console casettes. A single distribution system boots on all supported hardware configurations by determining the available devices and selecting a root device at boot time. + The tar program has been changed to allow update of magnetic tape archives, adding to the end of the exist- ing tape archive. This uses tape control facilities newly added in this version of the system, but the created tapes are readable on all versions of UNIX. Since blocked tapes are inherently more efficient and fully functional, tar now creates blocked tapes by default. + Shell scripts are now potentially executable. A file which begins with the characters ``#!'' followed by some amount of white space and the name of an inter- preter is executed directly by the system. The stan- dard version 7 shell, /bin/sh, has been changed to recognize a # as a comment character. It is desirable that users change existing shell script so that the first line of each shell script begins with ``#!'' and the name of the proper shell to execute. + Two new documents have been added to Volume 2c: a manual for the crt screen package -lcurses, and a docu- ment describing the rogue game. July 14, 1981 - 3 - Major bug fixes + A number of bugs have been fixed in the FORTRAN com- piler F77; these caused some block data routiens and main programs to fail to compile. Other bugs related to use of the symbolic debugger with FORTRAN have been fixed (see f77 in ``Section 1'' below.) + A bug which caused the C compiler to complain ``expres- sion too complicated'' when an expression contained an embedded structure assignment has been fixed. + A kernel bug which caused approximately 1/8'th of data collected during program profiling to be lost has been corrected. + A very confusing bug in the tset manual page has been corrected: in the example where it uses the setenv com- mand it should rather use the set command: ``set noglob; eval ...''. The alternate form does not work on a number of terminals. + Due to a inconsistency between the 11/780 and the 11/750 in the interpretation of the movtuc instruction, all binaries from the third distribution tape (of January 1980) and the fourth distribution tape (of November 1980) will NOT run correctly on the 11/750. The 4.1bsd distribution tape includes a new version of the standard i/o library which avoids use of this troublesome instruction, and it is recommended that all programs be recompiled from scratch to use this new library to elim- inate non-portable UNIX binaries as soon as possible. The problem is that when there appears to be a chance that the operands to movtuc will overlap, but they in fact do not (because the pattern string to printf is terminated by a null), the 11/750 does not execute the movtuc as though a shorter string length were specified which did not imply potential overlap. Thus this instruction which is in the inner loop of printf on the 4bsd tape, and which works fine on an 11/780, malfunc- tions on an 11/750 causing strange and awful behavior. + (The following change is applicable only to systems bootstrapped from the 4.1bsd release tape; systems upgraded from 4.0bsd may or may not include this change.) The standard i/o library has been made more compatible with the PDP-11 version 7 system and now sup- ports concurrent read and write access to files (see fopen(3s) for details). This caused a change in an internal data structure which is visible to compiled programs through the macros in <stdio.h>, and thus necessitates discarding of old .o files and July 14, 1981 - 4 - recompilation. Note that this standard i/o library now replaces the old -lNS library which was in 3bsd but was deleted from 4bsd pending the inclusion of read-write capability in stdio. Section 1 adb A bug which prevented programs loaded with the -N loader option from having breakpoints set on them has been fixed. A bug which prevented backtraces of programs which are stopped at interrupt level (after a signal) has been fixed by teaching adb how to step across the interrupt stack frame. The system now makes available and the $? command in adb interprets more precise codes when SIGILL and SIGFPE exceptions occur. Thus if you divide by zero, you can find out that this was what caused a floating point exception. A bug which prevented format repetition counts (e.g. the 10 in ``0/10X'') from working has been fixed. A bug related to adb has been fixed that prevented any sensible traceback after a FORTRAN-77 runtime error which trapped an exception or fault (e.g. a floating point divide by 0). A bug which caused the maps to be set improperly when debugging the kernel on a crash dump has been fixed. New commands have been added to adb to facilitate writing adb procedures stored in files: see the descriptions of $<<, the register >9, and the # operator in the revised adb manual page. awk Has moved from /usr/bin to /bin because it is needed during bootstrap procedures. bc Now takes the new C syntax operators: ``=op'' as well as (for history's sake) the old syntax ``op=''. calendar Several bugs have been fixed in the internals of the calendar program. In addition it is now pos- sible to have a calendar entry consisting of merely a date (with no month specified) and have this entry occur each month. cc A bug has been fixed in the C optimizer which caused strange things to happen when long vari- able names were used. The size of the internal ``dimension'' table has been increased to allow more structure fields to be declared. A problem which caused the compiler to print ``expression causes compiler loop'' when structure assignment July 14, 1981 - 5 - was embedded in an expression context has been fixed. A bug in the code generator tables which affected certain FORTRAN constructs has also been fixed. checknr Es versteht -mm. csh A cosmetic bug which prevented the distributed source from compiling has been fixed. A bug which caused argument lists including the strings ``{'' or ``{}'' to sometimes fail saying ``No match'' has been fixed. A bug which caused a strange state to result when a command of the form ``(a; b; c)'' was stopped from the keyboard has been fixed. The shell has been fixed so that it prefers to make stopped jobs the new current jobs after the current job has terminated. The construct ``${TERM}'' no longer yields an extra ``}'' when the variable expanded is from the environment. Previously undocumented was the shell variable histchars; it can be set to two characters, and the first is then a replacement for the normal ! history character and the second for the ^ quick history substitution character. Thus after ``set histchars=,;'' the command ``,,'' repeats the previous command, as ``!!'' would normally have done. ctags Now takes an option -v to produce output suitable for input to vgrind(1). cu Now honors uucp's locking protocol for the dialout lines. Several bugs relating to internal buffer overruns have been fixed. An option -b has been added which causes the BREAK key to gen- erate breaks (by turning input null characters into breaks sent over the line). delivermail Some bugs which caused strange loops when aliases were self-referential have been fixed. diff Some bugs related to directory diffs when the -h option was used have been fixed; previously the -h option was non-functional. dump An obnoxious bug in the dump program where it would wrongly suggest that further dump tapes were needed after a multi-tape dump had already completed has been fixed. The dump program no longer attempts to time tape rewinds itself, but uses a mechanism which does not depend on the July 14, 1981 - 6 - speed of the tape drive to determine when a rewind is complete. error Has been taught about the error message formats of the PDP-11 C compiler. expand A internal error check which was incorrect has been fixed. f77 Has had a bug fixed which caused some block data subroutines and main programs to not compile (the sympton was a diagnostic of the form ``Undefined: LWM%d''. A number of minor bugs which combined to make sdb function poorly with f77 have been fixed. The result of these bugs were that if file names were longer than 6 characters sdb could not read the symbol table of the resulting FORTRAN binary. An i/o library bug which caused numbers of the form ``-1.2'' to convert improperly in list- directed input (reading as ``-0.8'', taking the mantissa as positive) has been fixed. ld If you are using the -r flag and there remain undefined symbols you no longer get a spurious error return. Now respects modes of existing files and your file-creation mask more. lisp The functions +, /, -, *, 1+, 1- now expect fix- num arguments, for interpreted functons as well as compiled ones. The source for the VMS and UNIX versions of lisp have been combined and syn- chronized. The construction of very large integers has been altered to use regular dotted pairs in a non-standard way, so that fewer gar- bage collections will occur. (It is no longer safe to use ``car'' and ``cdr'' to disect large integers). Mixed-mode arithmetic has been made faster. There is a new compiler option (liszt -r) which allows you to create small lisp appli- cation programs (with a mechanism other than ``dumplisp'', which tends to create very large binaries). When the result of such a compilation is executed directly, it execs /usr/ucb/lisp and then fast loads the file you asked to be exe- cuted. A new flag $ldprint has been added to control the printing of fasl/load messages. New functions (purecopy), (getdata), (putdata), and (removeaddress) have been added. A number of minor bugs have been fixed. July 14, 1981 - 7 - lpr Has been modified to work on both DECWRITER type devices at 1200 baud masquerading as printers and also on real line printers. The queueing algo- rithm has been made first-come-first-serve (replacing the old random job first algorithm), and a line printer driver is now available in the standard distributed system. ls A bug has been fixed which caused essentially random numbers to be printed for the size of spe- cial files. The size now prints as 0. make A spelling error has been fixed which had the variable EC initialized to f77 rather than FC=f77. man A bug which caused it to core dump when reformat- ting a manual page whose source macros were inac- cessible has been fixed. mt Is a new command which provides easy access to operations such as forward and backward spacing of files and records on magnetic tape. mv Has been changed to have a option ``-'' which means that all the following arguments are file names. A bug has been fixed which caused strange behaviour when the -i option was used on direc- tories. A bug which prevented renaming of sub- directories to which you had no write access has been fixed. oldcsh Which was non-functional due to a change in a internal library interface which it had taken advantage of has been fixed to work. od New options O, X, and D print 32 bit integers in octal hex and decimal format; an option w has been added to cause 132 column output rather than the default 80 column oriented output. pc/pi A number of bugs in the sdb symbol table produced have been fixed. Structured types may now exceed 65k bytes in size, but in that case may not be passed by value nor assigned by simple assign- ment. Structured types are properly returned from recursive functions. Minor bugs in passing function parameters have been fixed, and there still exist some more minor bugs here. Runtime tests can be now be enabled or disabled on a per routine basis. Runtime checks are now done prop- erly on builtin functions. Warnings (or stan- dards violations) are now produced for extensions to the language. Some inconsistencies in dealing July 14, 1981 - 8 - with running out of memory have been fixed. Some bugs are known: invoking a formal routine from inside a formal invocation of the same rou- tine will mess up. In pc only: linking seperately compiled modules from other than the current directory only works if you give full path names (or the same relative paths) for the compilation and the linking. Some changes are planned soon: for-loop variables and with pointers will be allocated to registers. The formal routine syntax is currently as in Jen- sen and Wirth, but will soon be changed to the the syntax of the proposed standards, in which parameters to formals must be given. It is planned that pc will soon do compile time con- stant folding. pmerge Is a new program which can convert large Pascal programs back into a single file, eliminating the header files and separate source files normally used for separate compilation. prof A bug which caused prof to loop when a file- static function was profiled has been fixed. A bug in the kernel which caused the results of prof to be inaccurate has also been fixed. ps Has been changed to work with the new kernel and is no longer dependent on system sizing; thus it is no longer necessary to recompile ps when the system tables are made larger. A bug in the s option which caused the computed stack size to be a constant 512 bytes too large has been fixed. The ``STAT'' field now shows ``>'' in the second position for programs which are using more memory than their memoryuse limit (see vlimit(2)). It also shows ``S'' in the fourth position for processes which have declared themselves to be strongly sequential (see vadvise(2)). Under the v option, the SWRSS field has been replaced by a new field ``LIM'' which shows the limit on memor- yuse if there is a limit, or xx if there is not. px Is now written in C, is much more portable, and shares the runtime library used by the compiler. It is, unfortunately, somewhat slower now. ranlib No longer considers it a fatal error that an archive member defines no symbols. July 14, 1981 - 9 - reset Has been changed to invoke the command tset -Q -I so that all terminal modes will be reset. rm Now has a - option to indicate that all the fol- lowing parameters are to be treated as file names. It can be used when file names begin with ``-''. rmdir Now works correctly when arguments end in one or more ``/'' characters. sdb Has been fixed to be able to deal with ``interrupt-stack-frames'', so that it is possi- ble to set breakpoints on and get backtraces from routines called while a signal is being pro- cessed. Now handles binaries which are mode 0407 (resulting from ``ld -N'') properly. sh Has been changed so that ``#'' begins a comment. Shell scripts to be executed by /bin/sh should begin ``#! /bin/sh'' on the first line. tar Now defaults to blocked tape and can update blocked tapes (finally!). When reading tape tar defaults to the raw tape and figures out what is going on with blocksize so it need not be speci- fied. Thus the only commands which should be needed are the simple ``tar t'', ``tar c'', ``tar u'' and ``tar x''. uusend Now uses the -r option of uux to prevent present- ing extreme load to the connected system. vmstat Has been changed so that the system's device names are printed for the disks rather than D0, D1, D2, D3. The old format output of the -i option is no longer available. The fields related to paging activity are now all given in pages (of 1024 bytes). In particular, the fields ``pi'' and ``po'' which previously showed the number of pagein and pageout events now show pages, and ``sr'' which previously gave the clock scan rate in revolutions-per-minute now gives the scan rate in pages scanned per second. To provide the extra space needed to present this information, the swap in/out information, which was only marginally interesting, is no longer printed. July 14, 1981 - 10 - w Has been modified so that it no longer needs to be recompiled when the kernel tables change in size. wall Now checks that the message is not too long for its internal buffer, rather than just overrunning the buffer. It handles running out of processes by pausing, so it is possible to use it when there are more than 25 users logged in and you are not the super-user. It also gives the machine name you are on in the broadcast mes- sages. who ``Who am I'' now prints your machine and login name (the first word of its output) in a format suitable for use with uucp. write Now checks that you do not have write permission disabled and doesn't let you write to someone if they can't write back. Section 2. intro Now correctly reflects that argument lists may be upto 10240 characters long. exec Has been changed so that if a file being executed begins with the magic characters #!, the rest of the line is understood to be the name of an interpreter for the executed file. Previously (and in fact still) the shell did much of this job; it automatically executed itself on a text file with executable mode when the text file's name was typed as a command. Putting the facil- ity into the system gives the following benefits. 1) It makes shell scripts more like real exe- cutable files, because they can be the sub- ject of 'exec.' 2) If you do a 'ps' while such a command is running, its real name appears instead of 'sh'. Likewise, accounting is done on the basis of the real name. 3) Shell scripts can be set-user-ID. 4) It is simpler to have alternate shells available; e.g. if you like the Berkeley csh there is no question about which shell is to interpret a file. July 14, 1981 - 11 - 5) It will allow other interpreters to fit in more smoothly. To take advantage of this wonderful opportunity, put #! /bin/sh at the left margin of the first line of your shell scripts. Blanks after ! are OK. Use a complete pathname (no search is done). At the moment the whole line is restricted to 32 charac- ters. A single argument may be specified for the interpreter, thus: #! /bin/csh -f is very useful, avoiding reading .cshrc which is often not wanted. kill Has been changed so that when broadcasting sig- nals universally the signal being broadcast is not sent to the broadcaster. This is used by the halt(8), shutdown(8), and reboot(8) commands. reboot Has been changed to reflect the now more limited number of option flags available to the system call due to the nature of the console interface on the VAX 11/750. sigsys Reflects the fact that the system now passes in to a signal handler an indication of what excep- tion really happened when a SIGFPE or SIGILL is generated. The call interface at the point of a signal handler call is now specified. Section 3 curses A large number of bug fixes have been incor- porated, and the documentation has been greatly improved. The library is now much more solid than that originally distributed. fopen Reflects the new open options which allow simul- taneous read-write to files; these extensions are being incorporated to bring compatibility with the standard version 7 PDP-11 UNIX and to replace the (now defunct) -lNS. July 14, 1981 - 12 - printf A bug in the documentation which incorrectly stated that a %c format would not put out a null character has been fixed. Section 4 The system now supports a number of new devices and has capability for detecting the device's presence and interrupt vectors at boot time. The system also has capability to do device location at boot time so that a system description as supplied to config(8) can take advantage of available hardware redundancy. Each configurable device driver in this section now includes a SYNOPSIS giving sample lines to be included in a system configuration. Drivers also indicate the error mes- sages which they produce and describe each error. ct A driver for a C/A/T phototypesetter interface. dh Now includes handling of dm-11 modem control hardware. Optional flags to the configuration program can also be given to supply hardware car- rier easily for lines where wiring is inadequate. hp Includes rm80 support. lp Drives standard line printers, and has been improved to cut the interrupt load by a factor of 20. mt Describes the standard tape drive interface, which now includes ioctl operations for raw magtape allowing such standard operations as for- ward and backward spacing over files and records, writing of end-of-file marks, rewinds, rewinding and offlining, and sensing of tape status. These operations are used by the mt(1) program which can be used to easily manipulate tape files, and by the tar(1) program to allow updates to blocked tapes. tm Supports the UNIBUS TM/11 emulating tape con- trollers (e.g. EMULEX TC-11 with a KENNEDY 9300 drive). ts Supports the UNIBUS TS/11 tape drive and tran- sport. tty Now provides a LDECCTLQ option which causes ^S and ^Q to function as necessary for the VT100 to work properly. July 14, 1981 - 13 - up A driver for a EMULEX SC-11 or SC-21 UNIBUS disk controller with storage module (e.g. Ampex 9300) disk drives. va A varian raster plotter. Section 5 No changes. Section 6 chase Is a game where robots try to eat you. hangman Is now screen oriented. rain Drops keep falling on my head. rogue Is a new and very popular screen-oriented game, see rogue(6) or ``A Guide to the Dungeons of Doom.'' worm Is a game where you see how long you can get the worm to grow. worms Is an amusement where the worms chase each other around the screen. Section 7 No changes. Section 8 Major changes affecting system operations include: * The system is configured from a single per-cpu specifi- cation file which includes all locally relevant infor- mation: desired devices, size of the maximum user load, timezone information, etc. The system determines at boot time the size of the file system buffer cache based on the amount of physical memory available and sizes the system data structures based on the specifi- cation of the maximum number of active users; it is no longer necessary to juggle an armful of constants to enlarge the system. The sizes of system tables are no longer compiled into programs such as ps and w. * System error log information is saved across system crashes provided no power failure occurs, as the error log is kept in-core in the last 1024 bytes of memory. Error messages to the console are in a standard format, July 14, 1981 - 14 - of the form: device: message Messages have error registers decoded as bits, so that they are readable, and no-longer refer to devices by their major/minor device numbers, rather using device names. Error messages about file system problems (dev- ice full, out of inodes, etc) are referred to with the mounted file system name, and a message is sent directly to a user if his/her process writes to a file system when it is full. All error diagnostics printed by drivers are documented in section 4 of the manual. * DEC standard bad block forwarding is supported on all DEC disks except the RP06; the code which implements this can be easily moved into the drivers for the UNIBUS storage module disks; this is planned. * Core dumps are saved after system crashes automatically as the system writes a core image to a portion of the swap area from which it is recovered after reboot. The system then transfers these core images to a specified UNIX directory, saving also the version of the system associated with the crash. The system also maintains an error log /usr/adm/shutdownlog which records all system crashes and reboots with the information about the causes. analyze Now has an option -u to print page numbers of the u. areas. A bug which prevented the distributed analyze from working has been fixed. bad144 Is a new program which prints out the DEC- standard bad block information for a disk, or puts it back if it gets clobbered. The name of the program comes from the fact that the program deals with ``DEC standard 144'' format. badsect Creates a file in a file system which contains a specified disk sector of that file system. This is a primitive way of dealing with bad sectors, but works on drivers which don't (yet) have bad block forwarding according to the standard. getty No longer prints ``Virtual'' in front of the sys- tem identification, since there are no swap sys- tems in sight anymore. halt Now properly shuts down the system; see reboot below for details. July 14, 1981 - 15 - icheck Now properly sets the tfree field in the super- block. init Now interacts with halt, reboot and shutdown to bring about orderly system shutdowns. No longer writes entries in the /usr/adm/wtmp accounting file when a getty process dies without a user logging in on a terminal. Prints a warning mes- sage (on the console) if a terminal exists, is enabled, but the open returns an error, and waits for terminal to be openable, checking each minute, to prevent thrashing in this case. last Now distinguishes between system shutdowns and system crashes. lastcomm A bug causing a core dump if user id's not present in the password file were encountered has been fixed. login Now interacts with the shutdown command to forbid logins (except by the super-user) in the last 5 minutes before a shutdown (detected by the pres- ence of the file /etc/nologin, which also con- tains a message about why the system is shutting down which is presented to the rejected users.) Implements a notion of ``secure terminals''; if the file /etc/securetty exists, then it should contain a list of the secure terminals where root is allowed to login. If this file does not exist, then root can log in anywhere, as before. If a user tries to login but can't get to their home directory they are left in the root direc- tory and warned, so that they have some chance to send mail about or fix the problem themselves. If a file .hushlogin exists in a users home directory the the message of the day and other such information designed for human users will not be printed at login time. This is specifi- cally designed for the user uucp which is another computer and just ignores such stuff anyways. Finally a bug has been fixed which cause login to core dump if there were tabs in the file /etc/ttytype. mkfs Now works properly when given a proto argument; previously it complained because it didn't know that the format of the file /usr/mdec/uboot had been changed. pstat Has new flags -m and -g which interpret the mul- tiplexor data structures. July 14, 1981 - 16 - reboot Now shuts the system down cleanly, stopping all system activity before initiating the reboot pro- cedure. Normally, however, the new shutdown com- mand is used to take the system down, notifying the users of the impending downtime. The options -s and -a options to reboot are no longer avail- able, as it will not be possible to provide them on all VAX cpu's due to the way the console interface works. Instead, you can halt the pro- cessor using halt which puts the system into a tight loop, and then perform the desired reboot sequence manually at the console. This works on both 11/750 and 11/780 processors. renice Has been modified for the new kernel and is no longer dependent on system configuration parame- ters; it no longer needs to be recompiled when system table sizes change. restor Now properly handles the case where dump files are contained in dump tapes; previously the end of the embedded dump would confuse restor and cause the rest of the dump tape to be inaccessi- ble. sa Now correctly handles an arbitrary number of com- mands and users. Two new options have been added -v and -f giving it a googol+2 options. See sa(8) for details. savecore Is a new program which runs after a reboot to save check to see if the system had crashed and, if it had, to save any core image which was suc- cessfully written to the paging area. See savecore(8) for a full description. shutdown Is a new command which shuts the system down at a specified time. It broadcasts messages to users warning them as the downtime approaches, records the reason for the reboot in a log file, and cooperates with init in a cleanly shutdown (e.g. during the last 2 minutes of system operation, users attempting to log in are told that the sys- tem is going down and the reason for the shutdown but not allowed to log in.) July 14, 1981