A Package to Support VAX Compatability Mode on UNIX-32V Arthur W. Wetzel 735 LIS Bldg Interdisciplinary Department of Information Science University of Pittsburgh Pittsburgh, Pa. 15260 (412)-624-5203 This is a brief description of a package to support the exe- cution of PDP-11 programs on VAX UNIX-32V or Berkeley VMUNIX in compatability mode. The major functions are to 1) allocate a block of memory as the PDP-11 memory space (this must start at location 0), 2) read compatability mode program images into memory and lay them out properly (with arguments etc), 3) actually handle the change to and from compatability mode, 4) simulate system calls for what ever operating system is being simulated and 5) simulate floating point (FPU and FIS) instructions. Unfortunately programs requiring separated I/D space can not be run. Loading of the package is rather slow since the entire process is about 80K bytes (64K is the PDP-11 space). Once execution begins however, the speed is similar to a PDP-11/70. There is considerable overhead for each excep- tion condition so that programs with a lot of system calls or especially with floating point will be greatly slowed down. Note that the text segment must be writable since the PDP-11 memory space is there. Three quick changes to UNIX-32V and Berkeley VMUNIX were made in the course of constructing this package. First, it is necessary to patch a bug in the original mchdep.c. The bug in the sendsig routine is that the condition codes are masked out of the psl before it is stacked when catching signals. This affects all pro- grams not just compatability mode ones although is is not usually a frequent problem execept in this applica- tion. The mask which was 0xfff1 should be changed to 0xffff. If this is not done, the condition codes after a signal trap routine returns will always be cleared which can result in many strange problems when condi- tion codes are being checked in loops or in this case after an "illegal instruction" trap. This same bug remains in the Third Berkeley Software Tape version of Virtual Memory UNIX. Second, although it is easy to get into compatability mode one also needs a way to get back when an exception -2- condition arises. This can be done by changing another mask in the last line of the same routine. The 0x1f mask should be changed to 0x8000001f. This clears the compatability mode bit so that all signals are neces- sarily caught in native mode where native code can do something about the situation. Finally, if one wants compatibility mode programs to have SETUID and SETGID status, there must be a way to change the effective uid or gid without clobbering the real uid or gid. This is easily done by adding seteuid and setegid system calls to UNIX-32V. My method of doing this was to modify setuid and getuid so that the high order 16 bits of the argument in the actual system calls is a flag (uids and gids are only 16 bits in the low order part of the word) to indicate either a regu- lar setuid or getuid function or alternately a seteuid and setegid function. Appropriate functions seteuid() and setegid() have been added to our libc.a which auto- matically set up the flags while setuid() and setgid() insure that the flags are zeroed. Most of the programming was done in late August 1979 with additions being made occasionally thru August 1980. Compi- lation procedures are specified in Makefile. An effort was made to minimize the amount of assembly language coding so that only two small assembler routines are found here. One of these (memsiz.s) simply specifies how much memory is being allocated for PDP-11 images and makes it available through certain global variables. The other assembler file (compat.s) handles the protocol for getting into compatabil- ity mode at a certain pc and with a certain ps. It also includes a getreg function which copies machine registers into known places. The heart of the entire package is run- compat.c which is used for all RTSs (Run Time Systems). The function main here simply checks for the existence of the file to be executed and sets the required uid and gid. The execute function actually copies the file to memory and sets trap conditions. Finally illtrap() catches illegal instruc- tions and goes to the code appropriate for what is found as the illegal instruction. The bulk of the lines of C code are in unixtraps.c and dofloat.c which do UNIX system calls in either version 6 or 7 format and simulate floating point operations. (Since PWB-UNIX is upward compatable with ver- sion 6, the version 6 system support also includes PWB sys calls.) There are probably a number of bugs in the floating point simulation code just waiting to be found. If you are running programs which already include the PDP-11 floating point interpretation code, you may want to disable dofloat as the illegal instructions can be caught and simulated in the PDP-11 code. To do this just make dofloat.o with "cc -c -O -DNOFPSIM dofloat.c". A shell which will automatically invoke compatability mode -3- programs is in the modshell directory as difference listings from the original UNIX-32V shell. Most of the new code is in a new function compat.c. The automatic recognition of PDP-11 UNIX version 6/7 programs relies on the fact that the second word (16 bit) of a PDP-11 a.out file (text size) is nonzero whereas it is 0 for 32V a.outs. No easy distinction can be made between version 6 and version 7 a.outs so that a shell variable RTS sets up the name of a default Run Time System. On our system version 6 a.outs have been patched so that word 6 of the header which is unused is a 1. This hoaky? method seems to work just fine. A program v6flag.c is in the modshell directory to do this. One possible use of this package is to get programs like INGRES running on the VAX without going through what appears to be a nontrivial conversion effort. There are two ways of running such programs. Firstly if the shell is patched to automatically recognize and run compatability mode a.outs (as in modshell), the PDP-11 a.out files for the program can be just put on the system with their normal names and run as usual. Note however that you will be using the UNIX-32V shell so that any shell files from PDP-11 version 6 will have to be modified for this to work correctly with some- thing like INGRES. The second approach is to make a direc- tory hierarchy somewhere which corresponds to what would be on a PDP-11 including the appropriate PDP-11 shell. In that case just execute that shell in compatability mode with the root directory set to the top of the PDP-11 hierarchy. This is the quickest way to get something going in a hurry since no changes are required to existing PDP-11 code or shell files. Emulation of RT-11 system calls provided by Dan Strick are not being distributed at this time. Please foreward any comments, bug fixes or quick questions to the author at the above address.