aboutsummaryrefslogtreecommitdiff
path: root/doc/ports/notes.i386
diff options
context:
space:
mode:
Diffstat (limited to 'doc/ports/notes.i386')
-rw-r--r--doc/ports/notes.i3861124
1 files changed, 1124 insertions, 0 deletions
diff --git a/doc/ports/notes.i386 b/doc/ports/notes.i386
new file mode 100644
index 00000000..0ab05de0
--- /dev/null
+++ b/doc/ports/notes.i386
@@ -0,0 +1,1124 @@
+Sun 386i (RoadRunner) Sun/IRAF port. Begin 5 Oct 88.
+--------------------------------------------------------
+
+ o Created the IRAF root directory at /files/vol/iraf in accordance
+ with the recommendations in the administration guide for 3rd party
+ software.
+
+ o Moved in a copy of iraf from tucana.
+ o Installed the SunOS 4.0 mods made earlier on taurus.
+
+sun/hlib/libc/iraf.h
+ Manually edited for the new root.
+
+/etc/fstab
+/usr/include/iraf.h +
+ Installed a symbolic link for iraf.h in /usr/include. In order to
+ do this on the 386i, I had to remount the /usr file system read-write;
+ it was read-only at first for some reason.
+
+unix/bin.i386 +
+unix/as.i386 +
+ Added these directories. "mach" is "i386" on the 386i.
+
+unix/as.i386/zsvjmp.s
+ Figured out enough of the 386i assembler to write a stubbed out
+ zsvjmp routine. Will have to write a real one later.
+
+unix/sun/Makefile
+ Changed the float option to -fsingle as for the Sun4.
+ Added a "-o `mach` = "i386" condition to test for SunOS 4.0.
+
+------------------------
+Compiled GTERM and IMTOOL. They seem to work!.
+Did a bootstrap. Completed normally except that the library scanning code
+in MKPKG did not compile, no doubt due to the COFF objects on the 386i.
+Did an INSTALL to install the iraf links, GTERM, IMTOOL, etc.
+
+ o Configured /usr/local.
+ o Reconfigured my .sunview file (used to be .suntools) to use GTERM and
+ IMTOOL as on the Sun-3; came up ok.
+
+PROBLEMS
+ Window refresh is abysmally slow on the 386i.
+ Perfmeters sometimes core dump and die after running fine for a while.
+
+unix/hlib/irafuser.csh
+ Deleted the "-fsoft" entries - not used on the 386i. (10/19)
+
+unix/boot/mkpkg/scanlib.c
+ Had to add
+
+ #ifdef i386
+ #define PORTAR 1
+ #endif
+
+ at the top of the file to get include <ar.h> to define the appropriate
+ library format. Also, on the 386i, the code which scans the library
+ has to deal with the following peculiarities:
+
+ o The first "file" in the archive is a dummy entry containing
+ symbol information; the name field is null, hence the code
+ can skip this entry by checking for archive members with
+ null-string names.
+
+ o The names of the archive members now have a trailing /,
+ e.g., "file.o/", followed by blank padding. Previously
+ only the blank padding was there. I modified the code to
+ accept either / or blank as the name delimiter.
+
+ I also added some debug code which prints the name and date of each
+ archive member as the library is scanned, if debug > 1. These
+ changes should be portable to other systems. (10/19)
+
+SUNBUG - f77
+ The command "f77 -c -O file.c" produces the following:
+
+ Assembler: /tmp/optim.01231.5.s
+ aline 1 : Warning: cannot field update- '.file' not
+ on first line
+
+ This prevents use of f77 to compile C files, at least on the 386i!
+ (It works if the optimizer is not used). Will have to modify XC to
+ use CC instead. (10/19)
+
+unix/boot/spp/xc.c
+ 1. Hacked XC to use F77 only to compile Fortran source files, and to
+ use CC for everything else.
+ 2. Added /usr/local/bin to the list of directories to be searched for
+ commands like XPP and RPP.
+ 3. Changed the defined names from "xpp.e" and "rpp.e" to "xpp" and
+ "rpp", since this is how they appear in /usr/local/bin. (10/19)
+
+unix/hlib/mkpkg.inc
+unix/hlib/mkpkg.sf.I386 +
+ Added code for case FPU = i386 (not really an fpu), plus a special
+ file list for the 386. (10/19)
+
+unix/hlib/cl.csh
+ Added a case for the i386, similar to that for sparc. (10/19)
+
+---------------------
+Sysgen completed with a half a dozen files with errors, but no executables
+were linked due to a library conflict with the dummy zsvjmp.s I wrote. (10/20)
+
+unix/as/zsvjmp.s
+unix/as/zzdebug.c
+ Wrote a ZSVJMP.S for the 386i (80386), plus a little test program to
+ make sure it works. (10/20)
+
+---------------------
+Linked x_system.e and it runs on the first attempt!! (10/20)
+Start another sysgen - ignore files that didn't compile for now, until we
+see which executables they prevent from being linked.
+
+sys/vops/acht.gx
+ On the 386i, statements of the form "b[i] = a[i]", where B was
+ COMPLEX and A was INTEGER*2, revealed a compiler error in the
+ 386i Fortran compiler (the error was a syntax error in the assembler
+ code input to the system assembler). I decided that assigning
+ an integer*2 to a complex in a straight assignment wasn't a very
+ safe thing to do anyhow, so the generic source was changed to
+ generate "b[i] = complex(real(a[i]),0.0)" instead, whenever B
+ is complex and A isn't. (10/20)
+
+sys/vops/amod.gx
+ No changes here, just logging the compiler bug. The code is as
+ follows:
+
+ do 110 i = 1, npix
+ c(i) = mod (a(i), b(i))
+
+ where A, B, and C are integer*2. Once again, the compiler is
+ generating incorrect assembler for this case, causing a "syntax error"
+ from the assembler (evidently, because of the rather restrictive
+ instruction set of the 80386). I am not sure there is anything in
+ IRAF that uses this routine anyhow, so we will try to ignore it for
+ now. (10/20)
+
+unix/hlib/mach.h
+ 1. Set the BYTE_SWAP[24] flags to YES - forgot to do that before the
+ sysgen, unfortunately.
+ 2. Changed MAX_EXPONENTD and related variables (MAX_DOUBLE, INDEFD)
+ to reflect the fact that the max exponent for IEEE double is 2**1023
+ or 10**307. (10/21)
+
+unix/hlib/mkpkg.sf.I386
+ Commented out the entries for as$ishift.s for now. (10/21)
+
+noao/astutil/pdm/pdmstatistics.x pdmstats.x
+noao/digiphot/apphot/center/apcentercolon.x apcencolon.x
+noao/digiphot/apphot/center/aprefitcenter.x aprefitcen.x
+noao/digiphot/apphot/center/apfitcenter.x apfitcen.x
+noao/proto/t_mkhistogram.x t_mkhgm.x
+ Shortened the names of the above source files. These will not compile
+ on the 386i, which has a limit of 14 characters for the names of
+ modules in object libraries (which are COFF format libraries from
+ Sys V, hence the 14 char limit). (10/21)
+
+unix/hlib/mpkg.sf.I386
+ Turned off the optimizer for conrec.f, srface.f, pwrzi.f. An apparent
+ optimizer bug was causing declaration of an external which would cause
+ an unsatisfied exernal error at link time. (10/21)
+
+pkg/images/iminfo/t_imstat.x
+ Replaced some ==INDEF constructs by IS_INDEF, and took the n=n+1 out
+ of the inner loop, since it isn't needed. (10/21)
+
+unix/boot/mkpkg/host.c
+ Disabled the ranlib (library rebuild) on the 386, since it uses COFF
+ type libraries, which don't need to be ranlib-ed. (10/21)
+
+unix/hlib/mach.h
+ For the moment, restored the former, incorrect for IEEE, values of
+ the machine constants for type double. There are obviously a number
+ of bugs in the system where code assumes that the values for types
+ real and double are the same. This will have to be addressed later
+ when there is more time to debug this. (10/21)
+
+unix/hlib/mpkg.sf.I386
+unix/as/amods.s +
+ Edited the assembler for the VOPS amods routine (to work around the
+ compiler bug mentioned above) and placed the assembler version in
+ AS and added the file to the special file list for the 386i. (10/21)
+
+-------------------
+ As far as I know, all bugs are now fixed and the system is up on
+ the 386i, although there is still a lot of work to be done on improving
+ the installation procedures, optimization to reduce paging, etc.
+ A full system mkpkg/relink (no compiles) took 23 minutes on the 386i.
+ (10/21)
+
+buglog
+ Cannot access 5!mta, although page 5!dev$devices works. (10/22)
+ (May be VOS bug not 386i bug?).
+
+sys/fio/mkpkg
+sys/fio/ungetci.x +
+ Added a new routine UNGETCI to FIO. Since there is an ungetc for getc,
+ there should be an ungetci for getci. (10/22)
+
+buglog
+ The statement
+
+ if (1)
+ ...
+
+ does NOT result in any errors or warnings from the Fortran compiler.
+ (10/22)
+
+unix/hlib/libc/*.h
+unix/hlib/irafuser.csh
+ In order to remove the need to modify anything in /usr (which wants
+ to be mounted read-only in the latest SunOS), I modified the HSI to
+ call the C compiler in such a way that $hlib/libc is searched for
+ include files, as well as the system directories. This is done via
+ the HSI_CF environment definition in $hlib/irafuser.csh, which adds
+ $hlib/libc to the list of directories to be searched. The C compiler,
+ presented with #include <iraf.h>, will load $hlib/iraf.h To avoid
+ having the compiler resolve files like <stdio.h> etc. to $hlib/libc
+ as well, I had to prefix the names of all these files with a "u",
+ e.g., "ustdio.h", modifing the references in <iraf.h> as well.
+ Since the files are referenced only in <iraf.h>, this change should
+ be completely transparent. (10/23)
+
+sys/memio/salloc.x
+ Hard to believe, but it appears that buffers allocated on the stack
+ are not necessarily aligned to TY_DOUBLE (proper alignment would
+ result for anything smaller). (10/24)
+
+unix/boot/spp/xc.c
+ Added a link time -align mem_ switch to double word (actually page)
+ align the MEM common. (11/11)
+
+unix/os/irafpath.c
+ Added a #ifdef i386 case. (11/14)
+
+unix/boot/mkpkg/host.c
+ Added support for IRAFULIB (a user defined private library) to
+ the $checkout and $checkin directives. For example, in
+
+ $checkout libex.a lib$
+
+ if file libex.a is found in IRAFULIB, that version is checked out,
+ rather than the one in the system directory lib$. (11/15)
+
+-------------------------
+Log of changes for the Sun/IRAF shared library facility. This was developed
+on the 386i initially. This log was written on 28 December and summarizes the
+revisions made during the period Tue 20 Dec to Wed 28 Dec 1988.
+
+[background]
+ Although SunOS 4.0 supports dynamic linking, mapped files, and shared
+ libraries, currently only the C compiler can generate position
+ independent code (PIC). Sun Fortran does not currently support shared
+ libraries since it cannot yet generate PIC code. In any case, PIC
+ code executes less efficiently than nonrelocatable code, and the
+ dynamic linking required by relocatable shared libraries slows down
+ process startup.
+
+ Our strategy is to implement the equivalent of a shared library by
+ building a *nonrelocatable* shareable image (executable process),
+ and mapping it to a fixed address in the address space of client
+ processes at process startup time. A transfer vector is used to
+ vector procedure calls to arbitrary offsets in the shared image,
+ allowing new shared images to be installed without having to relink
+ client processes (in most cases). The mapped file feature of SunOS
+ 4.0 is the only thing essential for this scheme to work, and it is
+ the lack of the mapped file capability which has prevented us from
+ implementing a shared library up until now.
+
+ Even when (and if) Sun/Fortran eventually adds support for PIC and
+ shared libraries, the mapped image approach we have followed here
+ may still be the best choice. Despite the slight loss of execution
+ efficiency caused by the use of position independent code, use of
+ PIC is not likely to be a serious drawback. More serious drawbacks
+ derive from the use of global data, and dynamic linking at runtime.
+ Dynamic linking, e.g., to set the address of a global variable for
+ which the location is not known until runtime, requires the
+ modification of every text page containing code which references the
+ variable. Aside from the obvious time penalty during process startup
+ while this linking and page copying is taking place, modification of
+ a text page defeats shared text, increasing memory and paging
+ requirements.
+
+ Trying to avoid this problem in a relocatable shared library can be
+ very difficult, requiring modification to source code if it can be
+ done at all. The nonrelocatable approach we have followed guarantees
+ sharing of the entire text of the shared image and does not require
+ any changes to system or applications source code (provided no
+ interfaces have been violated). There are other advantages which
+ derive from the facility being part of the Sun/IRAF HSI, e.g., if
+ iraf is linked on an NOAO node and later installed with a different
+ root on a remote node, there is no problem locating the shared library
+ at runtime. Furthermore, since our approach requires on the part of
+ the host system only the ability to map files to fixed addresses,
+ and the ability to specify the base address of the text segment of
+ an image at link time, it should be applicable to other (non-Sun)
+ systems which may provide these capabilities but not shared libraries.
+
+unix/as.i386/zsvjmp.s
+ After a little experimentation I found that the .SET assembler macro
+ could be used to set the value of absolute symbols. This allows MEM
+ to be located at virtual address 0, making shared libraries possible
+ for the 386i, and improving assembly level debugging as well.
+
+unix/shlib/README
+unix/shlib/S.nm.i386 external names in 386i shared library
+unix/shlib/S.nm.mc68020 external names in Sun-3 shared library
+unix/shlib/S.ver.i386 386i shared library version number
+unix/shlib/S.ver.mc68020 Sun-3 shared library version number
+unix/shlib/Slib.c support code
+unix/shlib/aout.c utility to decode a.out format process headers
+unix/shlib/coff.c utility to decode COFF format process headers
+unix/shlib/edsym.c called by XC to edit symbol table of .e file
+unix/shlib/mkpkg mkpkg tie-in
+unix/shlib/mkpkg.sh called to boostrap edsym.e
+unix/shlib/mkshlib.csh script which does it all
+unix/shlib/omit.i386 external names to be excluded from 386i shlib
+unix/shlib/omit.mc68020 external names to be excluded from Sun-3 shlib
+
+ This directory contains all the code needed to build and maintain the
+ shared library. The shell script mkshlib.csh, normally called via
+ the mkpkg, does all the work. This constructs a name list for the
+ shared library, generates the assembler required for the transfer
+ vector modules (V.s and S.s), and links the shared image (S.e).
+
+ When building a new shared library, mkshlib checks to see if any
+ externals have been deleted from or added to the name list of the
+ old shared library. If any externals have been deleted, the version
+ number is incremented and any applications linked with the shared
+ library will have to be relinked. If there were no changes to the
+ name list or new externals have been added, then the version number
+ is not incremented, and existing applications are permitted to use
+ the new shared image without having to be relinked. The shared image
+ is linked -Bstatic, meaning that any required host library procedures
+ are bound at link time.
+
+ Only Fortran or Fortran-like externals are permitted, i.e., exported
+ from the shared image to the client via the transfer vector. This is
+ necessary to permit clients to be linked -Bdyamic, allowing use of
+ the host system shared libraries (otherwise name conflicts would
+ occur at link time).
+
+ The objects produced by the SHLIB code are libshare.a (the shared
+ library) and S.e (the shareable image), discussed further below.
+
+bin/S.e +
+ The shared image. This gets mapped into the address space of any
+ process linked with the shared library. It is also a runnable process
+ in its own right; if run directly, it prints out some information
+ about itself and exits. The full contents (minus the omitted
+ externals) of the EX, SYS, VOPS, and OS libraries are currently
+ linked into this image; other libraries may be added in the future,
+ e.g., some of the MATH libraries. The transfer vector module V.o,
+ located at a fixed (absolute) offset in the image, is used to vector
+ procedure calls from the client process into the shared image.
+
+lib/libshare.a
+ The shared library. This contains several object modules, including
+ a single object S.o consisting of a short header plus a name list
+ containing all the externals exported by the shared image. Each
+ external (i.e., VOS procedure such as 'clgeti' etc.) appears in S.o
+ as an absolute symbol, pointing to a fixed location in the transfer
+ vector in the shared image. Note that externals appear in S.o only
+ as symbols, hence no actual executable code gets linked into the
+ client process. To link with the shared library, XC links with
+ libshare.a instead of libex.a,libsys.a,libvops.a,libos.a.
+
+unix/os/zmain.c
+ The zmain is the main procedure for an iraf process. The first thing
+ the zmain does now is call ZZSTRT, which is described below. Some
+ code was moved out of the zmain into ZZSTRT, and all references to
+ global variables in the kernel had to be eliminated, since the zmain
+ is no longer linked with the kernel procedures (which are off in the
+ shared image). Other changes included the addition of calls to ZZSETK
+ to set the values of the kernel variables, and changes to the calling
+ sequence of IRAFMN to permit the address of SYSRUK and ONENTRY to be
+ passed in the argument list, rather than being bound at link time.
+
+unix/os/zzstrt.c
+ The function of this procedure, which has been a no-op in UNIX/IRAF
+ up until now, is to perform any runtime initialization of the kernel.
+ Currently, ZZSTRT maps and initializes the shared image, sets the
+ desired IEEE exceptions (partially implemented at present), sets the
+ process working set soft limits, and sets the default values of the
+ kernel variables via the new ZZSETK procedure.
+
+ Mapping and initializing the shared image is similar to what unix
+ does during startup of a normal process. The shared image file is
+ opened, and the header is read to determine the sizes of the text,
+ data (initialized data), and bss (unitialized data) segments.
+ IRAF uses an additional shared image header segment containing the
+ file header and the FIO common (fiocom), which has to be directly
+ accessed by the client, making it necessary to locate it at a fixed
+ address in virtual memory.
+
+ The header segment containing the FIO common is then mapped read-write
+ private, meaning that if any pages are modified the client gets a
+ private copy of the page. The text segment of the shared image is
+ mapped read-only shared. The data segment is mapped read-write
+ private; pages are shared until modified by the client at runtime.
+ The BSS segment is then mapped onto an arbitrary file offset (zero)
+ and promptly zeroed, causing all of the pages to belong to the client.
+ Finally, the addresses of the unix malloc, realloc, and free procedures
+ are passed into the shared image (dynamic memory allocation must be
+ in the data space of the client), and the environment pointer in the
+ shared image is set to point to the environment of the client, so that
+ the VOS will see the host environment and command line arguments seen
+ by the client.
+
+ Both ZMAIN and ZZSTRT are linked directly into each client process,
+ since they are required to map in and initialize the shared image.
+ (S.e has its own private copies, of course).
+
+unix/os/zlocpr.c
+ ZLOCPR had to be modified to deal with the transfer vector.
+ The problem is that calls to ZLOCPR in the client image and in the
+ shared image must return the same value, since equality comparisons
+ of procedure entry points are are used to determine, e.g., if a
+ particular file driver is referenced. ZLOCPR was modified to check
+ if the referenced procedure is actually a transfer vector entry,
+ returning the address of the actual procedure in the shared image
+ if so. Since this is a host level procedure, this is done by
+ disassembling the JMP instruction in the transfer vector.
+
+unix/os/zshlib.c +
+ This object contains everything needed to link a process against the
+ standard libraries, ignoring the shared library. Dummy shared image
+ descriptors and procedure entry points are defined so that the code
+ in ZMAIN and ZZSTRT will link properly. At runtime, the startup code
+ determines that the shared library is not in use, skipping the map and
+ initialize operations.
+
+unix/os/zzsetk.c +
+ This new kernel procedure is used to initialize the values of all the
+ global kernel variables formerly initialized via EXTERN references in
+ the zmain. A procedure (with transfer vector) must be used instead
+ of a series of global data references in order to be able to link
+ against the shared library.
+
+unix/boot/spp/xc.c
+ 1. XC was modified to link against the shared library by default.
+ The new switch -z (as in VMS/IRAF) is used to link without using
+ the shared library. Both the shared library and the shared image
+ may be in an IRAFULIB directory if desired.
+
+ 2. If linking against the shared library, XC will by default call
+ EDSYM to edit the symbol table of the new executable, renaming the
+ symbols pointing to transfer vectors by prefixing a "V", and adding
+ new symbols to point into the shared image to the actual locations
+ of the VOS procedures referenced by the transfer vector. This provides
+ symbols for debugging executables that used the shared image.
+
+ New XC switches:
+
+ -e do not call edsym to do symbol editing
+ -s strip executable (UNIX linker switch; for XC, defeats
+ call to edsym).
+
+ edsym switches (accepted by XC):
+
+ -d print symbol table
+ -k do not delete "uninteresting" symbols
+ -n do not modify any files
+ -t omit transfer vector symbols to save some space
+ -T delete all symbols associated with the shared library
+
+ 3. The -align switch, formerly passed to the 386i linker to page
+ align the MEM common, was deleted since MEM is now assigned to
+ location zero with a .SET.
+
+sys/etc/main.x
+sys/etc/xmjbuf.x +
+ 1. The calling sequence of the iraf main was modified to add sys_runtask
+ (SYSRUK) and onentry (ONENTY) as arguments, allowing a runtime rather
+ than link time reference. This was necessary for the shared library
+ since SYSRUK and ONENTY are client symbols but are called by the iraf
+ main, which is in the shared image. The new scheme is more flexible
+ in any case.
+ 2. The new procedure XMJBUF is used to get an XCHAR pointer to the
+ zsvjmp/zdojmp context vector used by the iraf main for interrupt and
+ error recovery. Again, a runtime procedural reference using a pointer
+ is necessary since the global data area cannot be referenced at link
+ time. The CL uses both a custom onentry and a custom zdojmp context
+ vector in order to gain full control over command interpretation.
+
+unix/hlib/libc/libc.h
+unix/hlib/libc/knames.h
+unix/hlib/libc/xnames.h
+ 1. In libc.h, the ZJUCOM reference was deleted since the XMJBUF
+ procedure is now used to access the interpreter context vector.
+ 2. Entries for the new VOS and kernel procedures were added to
+ [xk]names.h.
+
+unix/hlib/irafuser.csh
+unix/hlib/mkpkg.inc
+mkpkg [at iraf root]
+ 1. The -z flag (no shared library) was added to the HSI_XF flags in
+ irafuser.csh, so that HSI executables will not use the shared image.
+ 2. The mkpkg.inc now includes a switch USE_SHLIB, which if set causes
+ mkpkg to automatically update the shared library and shared image
+ during a sysgen. This switch does not actually determine whether the
+ shared library is *used*, since that is determined by the -z switch
+ to XC at link time.
+ 3. For Sun/IRAF, the switch -/Bstatic was added to LFLAGS so that
+ the iraf executables will be statically linked, rather than using the
+ SunOS shared library (e.g., libc.a). This was not necessary - there
+ is no conflict between the iraf and SunOS shared libraries - but was
+ done to save disk space (see CAVEATS, below).
+
+unix/mkpkg.sh
+unix/shlib/mkpkg.sh
+ Will build the edsym.e utility and install it in HBIN during a
+ bootstrap.
+
+unix/hlib/install
+ Will make a link for EDSYM in the local/bin directory.
+
+pkg/cl/main.c
+ A call to XMJBUF was added to convert to a vectored procedure reference
+ to the main interpreter context vector.
+
+sys/gio/cursor/prpsinit.x
+sys/gio/cursor/mkpkg
+sys/etc/mkpkg
+sys/etc/prfindpr.x
+sys/etc/propcpr.x
+sys/etc/prsignal.x
+sys/etc/prfilbuf.x
+sys/etc/prgline.x
+sys/etc/prupdate.x
+sys/etc/prclcpr.x
+sys/etc/prstati.x
+sys/etc/prredir.x
+sys/etc/prgredir.x
+sys/etc/prclose.x
+sys/etc/proscmd.x [moved from gio/cursor to ETC]
+sys/etc/prpsio.x [moved from gio/cursor to ETC]
+sys/etc/prc.com [moved from LIB to ETC]
+sys/etc/prpsload.x +
+ Most of the "pr" prefixed files, e.g., PRPSIO, were moved from
+ gio/cursor to ETC, and the file prc.com (the PR common) was moved
+ from LIB to ETC, making it a private common. This was necessary
+ to avoid the global data reference, which would cause the process
+ control code to fail at runtime due to the client and shared image
+ having separate copies of the PRC common (another reason to not use
+ commons!). PRPSIO was modified to use a loadable driver to provide
+ a runtime technique for linking to the graphics pseudofile i/o
+ procedures in gio/cursor. In addition to making the shared library
+ cleaner to implement, this collects all of the process control code
+ together in one place in the VOS (in ETC - libsys.a), avoids some
+ circular library references, and makes it possible to use LIBC/stdio
+ in applications processes without an unresolved linker reference
+ to PRPSIO (STScI has run into this).
+
+ PRPSINIT is a procedure called by the CL at startup time to load
+ the gio/cursor graphics pseudofile i/o driver into PRPSIO.
+
+lib/syserr.h
+lib/syserrmsg
+ A new error SYS_PRPSIOEPA was added, in support of the above
+ modifications.
+
+pkg/images/filters/mkpkg
+pkg/images/filters/convolve.x
+pkg/images/filters/radcnvr.x [used to be called acnvrr.x]
+ This code contained a routine ACNVRR which redefined a VOPS library
+ procedure, causing a multiply defined linker error when linking with
+ the shared library. The offending procedure was renamed CNV_RADCNVR
+ (radially symmetric convolve, type real). Applications should not
+ use reserved package prefixes.
+
+unix/os/zfunc.c +
+ A set of new kernel primitives ZFUNC1, ZFUNC2, ... ZFUNC9 were added.
+ These are similar to ZCALL[1-9], but allow calling of functions by
+ their LOCPR entry point address, as has long been possible with
+ subroutines and ZCALL.
+
+CAVEATS - Shared libraries
+ Several interesting things about SunOS were learned in the process of
+ implementing the Sun/IRAF shared library.
+
+ 1. Linker Bug. There is a bug in the SunOS linker. The size of the
+ BSS area is not being computed accurately. For processes with a very
+ small BSS section, this can lead to a BSS size of zero being computed.
+ Normally this does not cause a problem, since a small BSS area will
+ usually fit into the last page of the data area. In some cases,
+ however, the small BSS area is in an additional page, but since BSS
+ is zero no BSS area is allocated during process startup, causing a
+ segmentation violation when the unix code tries to set the value of
+ the BSS global variable "environ" during process startup. I managed
+ to avoid this problem by the subtle kludge of adding the following
+ declaration to the ZZSTRT object (which is linked into every iraf
+ process):
+
+ int BSS_kludge[256];
+
+ This provides the process with enough BSS storage (statically allocated
+ unitialized data space) to avoid having the size of the BSS segment
+ being set to zero at link time.
+
+ 2. Does using the SunOS shared libraries really save space?
+ For some reason which I was not able to determine, a small iraf
+ process linked -Bdyamic (the default, i.e., use the SunOS shared
+ libraries) always has a text segment of 75-85 Kb, even though the
+ sum of all the objects therein may be much less. It appears that
+ the linker may be incorrectly computing the size of the text segment,
+ causing it to effectively be padded out to a size considerably larger
+ than what it should be. Linking the process -Bstatic (no SunOS
+ shared libraries) avoids the bug, yielding a much smaller executable
+ file, even though more text space is actually required due to the
+ need to link in modules from the SunOS libraries which would otherwise
+ be shared.
+
+ 3. Processes with a large BSS segment execute slowly. One thing which
+ became very clear to me while working on image execution was that
+ processes with a large BSS segment take a long time to execute.
+ The reason is that the BSS segment must be zeroed during process
+ startup. Zeroing a large region of mapped memory involves both the
+ cpu time required to zero the storage, plus all the mapped file i/o
+ (paging) required to initialize the mapped swap file pages. This is
+ not a big deal for processes with a BSS segment in the N*10K region,
+ but if the BSS is N*100K or N*1000K, then it can take seconds. The
+ moral is USE DYNAMICALLY RATHER THAN STATICALLY ALLOCATED BUFFERS.
+ I am going to modify some of the system code as a result of this
+ lesson, e.g., the CL currently statically allocates about 250K of
+ combined stack and dictionary buffer space. In applications, BSS
+ storage is most commonly found as declarations of the form
+
+ char fname[SZ_FNAME]
+ char line[SZ_LINE]
+
+ and so on. This is of no consequence for small individual programs,
+ but can add up to a lot of BSS for large packages. The unix "size"
+ utility may be used to determine the BSS requirements of a process.
+
+unix/boot/mkpkg/tok.c
+ An unrelated bug in MKPKG was fixed, which would cause one or the
+ other of IFOLDER or IFNEWER to fail, when presented with a list of
+ files to be compared. The bug was that IFOLDER is not equivalent
+ to !IFNEWER when more than one file must be compared. (12/28)
+
+unix/as.i386/README
+unix/as.i386/aclrb.c
+unix/as.i386/aclrc.c
+unix/as.i386/bytmov.c
+unix/as.i386/aclrs.c
+unix/as.i386/aclri.c
+unix/as.i386/aclrl.c
+unix/as.i386/aclrr.c
+unix/as.i386/aclrd.c
+unix/as.i386/amovc.c
+unix/as.i386/amovs.c
+unix/as.i386/amovi.c
+unix/as.i386/amovl.c
+unix/as.i386/amovr.c
+unix/as.i386/amovd.c
+unix/hlib/mkpkg.sf.I386
+ In an unrelated optimization, the above zero and move procedures
+ were added to AS. These are written to use calls to the host
+ BZERO and BCOPY functions to zero or copy blocks of memory, taking
+ advantage of the special repeat-string-op instructions provided by
+ the 80386 cpu. (12/28)
+
+sys/ki/irafks.x
+ In the open-binary-file code, the fprintf debug message was incorrectly
+ passing arg1 rather than arg2 as the file access mode. (12/29)
+
+unix/boot/mkpkg/tok.c
+ In the $ifeq code, strcmp() would be called with a NULL string pointer
+ if the referenced environment variable was undefined. (1/2)(1989)
+
+---------------------
+Moved shared library stuff to tucana (Sun-3) over the period 30Dec-2Jan.
+Reworked mkshlib.csh, edsym.c, zzstrt.c etc. for the "a.out" format object
+files used on the Sun-3; these are quite different than the Sys V COFF
+object format used on the 386i.
+
+---------------------
+Moved everything back to the 386i, rebuilt the shared library, and relinked
+the system. Merged in all recent changes from tucana. (1/3)
+
+---------------------
+Begin changes to better support layered external software. (1/28)
+
+unix/os/zgtenv.c
+sys/etc/environ.x
+sys/etc/envgets.x
+ ZGTENV, ENVFIND, and ENVGETS were changed to make it possible to
+ discriminate between undefined environment variables, and variables
+ that have a null string value. ERR is returned if the variable does
+ not exist; 0 if exists but has a null value. Since most programs
+ do a <= 0 test to check for valid environment definitions, this should
+ be a fairly safe change, although some programs may be affected
+ (i.e., any program that only does an == 0 test). (1/28)
+
+sys/libc/cenvget.c
+pkg/cl/builtin.c
+ Minor changes to allow for null valued environment variables. (1/28)
+
+sys/fio/vfntrans.x
+ Added a new feature to virtual filename translation, to provide general
+ environment symbol replacement during translation. This was needed to
+ support multiple architectures, e.g., different version of the PKG and
+ LIB directories, but it is a general facility which will be useful
+ for multiple versions of other types of directories and files as well.
+
+ For example, one might make the following definitions:
+
+ set arch = ""
+ set bin = iraf$bin(arch)/
+ set lib = iraf$lib(arch)/
+
+ Which become iraf$bin/ and iraf$lib/ by default. If arch is defined
+ as, for example, ".ffpa", then we have iraf$bin.ffpa/ and likewise
+ for lib. The default case, where arch is the null string, is what
+ required the revisions discussed earlier. (1/28)
+
+-----------------
+The following revisions were made all together over a period of a couple
+of weeks and summarized on 2/21.
+
+pkg/system/help/helpdb.x
+pkg/system/help/helpdir.x
+pkg/system/help/modlist.x
+pkg/system/help/modtemp.x
+pkg/system/help/prdir.x
+pkg/system/help/prfile.x
+pkg/system/help/prhlpblk.x
+pkg/system/help/prsummary.x
+pkg/system/help/t_help.x
+pkg/system/help/tlist.x
+pkg/system/mkhelpdb.par
+ 1. The compiled help database files are now stored externally in a
+ machine independent format.
+
+ 2. HELP now permits multiple compiled help database files. The
+ parameter / environment variable `helpdb' is now a file template
+ (e.g., a comma delimited list of files) specifying the helpdb files
+ to be combined to produce the composite help database to be used
+ at runtime. HELP takes a little longer to respond the first time
+ while it is reading and combining all the files, but once the
+ composite database has been generated in-core all is as it was before.
+ If any of the helpdb files are modified, or if new files are added,
+ the incore composite database is automatically regenerated.
+
+ It is still necessary that all package names be unique; this
+ restriction will be removed in a future implementation but it is
+ too difficult to fix in the current program.
+
+dev/help.db -
+lib/helpdb.mip +
+ The old core sytem help database file dev$help.db has been deleted
+ and replaced by the new machine independent file lib$helpdb.mip,
+ which now contains only entries for core system help modules.
+ Each external layered package (noao, local, stsdas, etc.) will
+ have its own lib/helpdb.mip.
+
+mkpkg
+ 1. All references to the noao and local packages have been removed
+ from the root mkpkg file. Layered packages are maintained
+ independently of the core system and separate mkpkg sysgens,
+ etc, are required for each package.
+ 2. The `stripall' entry has been deleted leaving only `mkpkg strip'
+ for stripping the system.
+
+noao/README
+ Completely new README for the reorganized NOAO package.
+
+noao/bin +
+noao/bin.i386 +
+ NOAO now has its own BIN directory. For Sun/IRAF, `bin' is a
+ symbolic link to the bin directory for the architecture for which
+ the system is currently configured, bin.i386 on my development
+ system.
+
+noao/lib/helpdb.mip + compiled help database
+noao/lib/mkpkg.inc + global mkpkg definitions for noao
+noao/lib/mkpkg.sf.I386 + special file lists for various architectures
+noao/lib/mkpkg.sf.SUN3 + "
+noao/lib/mkpkg.sf.SUN4 + "
+noao/lib/root.hd + root help directory for the noao packages
+noao/lib/strip.noao + stripper file for the noao directories
+
+ The above files were added to noao$lib, the global library for the
+ NOAO packages. All files are maintained in a machine independent
+ format and may be included in distributions. Files like the mkpkg.*
+ include machine dependent information but are easily modified or
+ extended to support new architectures - there is no better way,
+ one must have things like special file lists for different
+ architectures (if there isn't one, as in a new port, the application
+ will still sysgen but there is a real possibility of undetected
+ compiler bugs).
+
+ The helpdb.mip is machine independent as well, and should be generated
+ by the developers of an exportable package, and included in the
+ distribution. The ".mip" extension tells the HSI utilities such as
+ WTAR that it is a machine independent file and can be included in
+ "source only" archives. It can be generated under V2.8 with a command
+ such as
+
+ cl> mkhelpdb helpdir=noao$lib/root.hd helpdb=noao$lib/helpdb.mip
+
+ By default, MKHELPDB will generate the core system help database.
+
+noao/mkpkg
+ Added a `mkpkg strip' entry. Other entries will need to be added
+ in the future to support multiple architecture switching for Sun/IRAF.
+
+noao/noao.cl
+ Added the following lines to the noao.cl file:
+
+ set noaobin = "noao$bin(arch)/"
+ package noao, bin = noaobin$
+
+ The bin= argument to package is required to tell the CL that noao
+ has its own bin directory and is discussed below. The `noaobin'
+ definition permits user redefinition of the noao BIN directory,
+ as well as specification of the architecture for all packages
+ via the environment variable `arch', which is defined in terms
+ of `mach', which defines the machine architecture.
+
+pkg/cl/bkg.c
+pkg/cl/builtin.c
+pkg/cl/exec.c
+pkg/cl/main.c
+pkg/cl/prcache.c
+pkg/cl/task.c
+pkg/cl/task.h
+ The CL was modified to generalize the BIN directory scheme. Formerly
+ executables could be stored either in the package directory or in BIN.
+ The same is true now except that there can be multiple BIN directories.
+ By default bin is iraf$bin/. This may be overridden for a package by
+ specifying the package bin directory with a bin=bindir argument to
+ the PACKAGE directive (see example above). The new bin will be used
+ for the referenced package and all subpackages of that package, unless
+ overridden by another PACKAGE directive. Note that no bin-path
+ searching is involved; the CL never has more than two directories to
+ look in for a given executable, since every package has a well defined,
+ unique BIN directory.
+
+sys/etc/envgets.x
+sys/etc/environ.h
+sys/etc/environ.x
+sys/etc/envscan.x
+ 1. ENVFIND will now return ERR if the named variable does not exist,
+ and a string length of zero if the variable exists but has a null
+ string value.
+ 2. ENVSCAN now permits newline to be escaped in the value field,
+ permitting arbitrarily long value strings. Leading whitespace is
+ discarded in each continuation line, allowing continuation text to
+ be left justified at any arbitrary column for readibility.
+ 3. ENVSCAN recognizes both SET and RESET.
+ 4. ENVSCAN now supports the "set @filename" syntax for inclusion
+ of other files containing set environment definitions. All non
+ set or reset statements are ignored.
+ 5. The max size value string is increased to 512 chars.
+
+ All of these changes hold also for the HSI version of ENVSCAN
+ (see the bootlib.envinit.c notes below).
+
+sys/fio/vfntrans.x
+ General environment variable replacement is now supported within
+ virtual filenames via the syntax "(envvar)", which is replaced
+ by the value of the named environment variable "envvar". This is
+ different from logical directory replacement which replaces
+ everything to the left of the $. (Perhaps we should have simply
+ used the unix symbol replacement syntax in the first place, but
+ it is too late to change now). For example,
+
+ set mach = f68881
+ set arch = .(mach)
+ set bin = iraf$bin(arch)/
+
+ This point of this facility is that it allows any field of a filename
+ to be parameterized with an environment variable. If the named
+ variable does not exist the null string is used.
+
+sys/imio/iki/ikiopen.x
+sys/libc/cenvget.c
+ Replaced an "envfind() == 0" by "envfind() <= 0" to reflect the fact
+ that ENVFIND can now return a negative value.
+
+unix/boot/bootlib/mkpkg
+unix/boot/bootlib/bootlib.h
+unix/boot/bootlib/osfn2vfn.c
+unix/boot/bootlib/vfn2osfn.c
+ The UNIX/IRAF HSI has been modified to use VOS filename mapping,
+ to facilitate use of the zzsetenv.def and extern.pkg logical directory
+ definitions, as well as all the other semantics of general filename
+ mapping. Note that this requires use of libsys.a (etc.), but it
+ was done in such a way that if the library does not exist, bootstrap
+ filename mapping is used. VOS filename mapping is used only if the
+ environment variable NOVOS is not defined at HSI bootstrap time; this
+ variable is defined in the file hlib$irafuser.csh which is assumed
+ to be referenced at login time by the account of whoever is doing
+ the bootstrap (normally user iraf).
+
+ A true bootstrap is performed with VOS filename mapping disabled,
+ and then repeated once a sysgen has been performed to generate the
+ VOS system libraries. The HSI bootstrap filename mapping facilites
+ are adequate to compile the VOS but do not support external layered
+ packages.
+
+unix/boot/bootlib/envinit.c
+ This routine is used by the HSI to read the zzsetenv.def file.
+ This cannot be done with the VOS, even when VOS filename mapping
+ is in use, because the VOS routine envscan uses FIO (the filename
+ mapping primitives are much lower level, being layered on the kernel).
+ I made all the same changes as for ENVSCAN above, so that the
+ environment variables defined in hlib$extern.pkg will be defined
+ in the HSI.
+
+unix/boot/bootlib/osfpathname.c
+ 1. Modified to avoid the null filename bug that appeared in VMS/IRAF
+ long ago (VMS/IRAF also uses VOS filename mapping).
+ 2. Fixed a second bug that would probably only affect UNIX/IRAF.
+ The filename ".." was not being mapped properly on UNIX/IRAF, whereas
+ it worked fine on VMS/IRAF. This was because on UNIX/IRAF the call
+ to vfn2osfn to translate the ".." to the pathname of the previous
+ directory, whereas on VMS/IRAF all it would do is pass it on, to be
+ used in the later call to ZFSUBD.
+
+unix/boot/bootlib/ossysfile.c
+ Added support for an applications defined system library search path,
+ e.g., for XC command line -llib library references, or <file.h> global
+ include file references. LIB, HLIB, and any other system libraries
+ are searched first, followed by any package libraries as specified
+ by the environment variable `pkglibs'. The latter is defined in
+ extern.pkg and this mechanism is intended as a way of extending the
+ global library mechanism to support applications libraries. There is
+ a flaw - a search path opens the possibility of file name collisions,
+ resulting in the wrong file being used. At least this will be obvious
+ if it occurs, and the search path is the simplest mechanism in this
+ case.
+
+ This HSI level library search path mechanism should not be confused
+ with the IRAFULIB facility used in UNIX/IRAF. Any IRAFULIB directories
+ are searched *before* the system libraries, allowing custom versions
+ of system library files for testing or development purposes. In the
+ case of the `pkglibs' the system libraries are searched first, with the
+ full search order being the IRAFULIBs, followed by the system libraries
+ (LIB, HLIB, and also BIN, bin.`mach` etc. for Sun/IRAF), and lastly
+ the package libraries in the order in which they appear in pkglibs.
+ There should be minimal execution time penalty from adding pkglibs
+ searching, since most global file references will be satisfied early
+ in the search by a system library.
+
+unix/boot/bootlib/osgetenv.c
+ Added VOS and NOVOS cases. The VOS case calls ENVFIND to lookup
+ environment names. This is required to make the environment used
+ for VOS filename mapping available in the HSI utilities, e.g.,
+ in mkpkg.
+
+unix/boot/mkpkg/mkpkg
+unix/boot/generic/mkpkg.sh
+unix/boot/mkpkg/mkpkg.sh
+unix/boot/rmbin/mkpkg.sh
+unix/boot/rmfiles/mkpkg.sh
+unix/boot/rtar/mkpkg.sh
+unix/boot/spp/mkpkg.sh
+unix/boot/spp/mkxc.sh
+unix/boot/spp/xpp/mkpkg.sh
+unix/boot/wtar/mkpkg.sh
+ All these files had to be modified to parameterize the list of
+ libraries to be used to link HSI executables. Formerly libboot
+ and libos were being referenced explicitly, but now that the HSI
+ can be linked either VOS or NOVOS, the list can also include
+ libsys and libvops. The parameter is the unix environment variable
+ HSI_LIBS defined in hlib$irafuser.csh.
+
+unix/hlib/clpackage.cl
+unix/hlib/clpackage.hd
+ Removed all references to local, noao, and stsdas. External packages
+ now have their own root help directories and help database files, so
+ no entry in the clpackage.hd is required. The external packages are
+ picked up by clpackage.cl by the following statements:
+
+ # Define the external (user-configurable) packages.
+ cl < hlib$extern.pkg
+
+ which executes the TASK statements in the extern.pkg to define the
+ external packages. The environment variables in extern.pkg will
+ already have been defined by the zzsetenv.def @extern.pkg include,
+ so they are reset harmlessly when extern.pkg is reinterpreted by
+ the CL.
+
+unix/hlib/extern.pkg +
+unix/hlib/zzsetenv.def
+ 1. Removed all references to noao, local, and stsdas from zzsetenv.def,
+ replacing these by the statement
+
+ set @hlib$extern.pkg
+
+ which includes set (actually reset) statements defining the root
+ directory of each external package.
+
+ For HELP, deleted the entries for helpdir and helpdb. The helpdir
+ environment variable is no longer used, and helpdb has been moved
+ to extern.pkg.
+
+ 2. Added the file hlib$extern.pkg, which is the sole link between the
+ core system and external packages. To install an external package,
+ ALL that should be required is to make an entry in this file, after
+ reading the files onto disk (a mkpkg at the package root will also
+ be required if the package is distributed in source only form).
+ To deinstall a package, all one need do is comment out or delete
+ the related entries in extern.pkg, and backup and delete the external
+ package directory tree. The core iraf system can be updated without
+ affecting external packages.
+
+ These things are possible ONLY if we strictly localize package files
+ to package trees, i.e., do not install library files and executables
+ from an external package in core system directories, do not rebuild
+ a central help database file, etc. A further major advantage for
+ NOAO is that we can easily maintain private LOCAL packages, have
+ STSDAS on disk for our users, etc., without making modifications to
+ our export systems which would affect our distribution tapes.
+ By localizing the changes required to interface an external package
+ to a single file, we need only replace that one file to make a
+ distribution tape from one of our master systems.
+
+ For software maintenance purposes, developers should assume that ONLY
+ the root directory of their package tree is globally defined in the
+ HSI, and use only references such as "noao$lib/", "-llib", or
+ "<file.h>" in their applications (any VOS pathname relative to the
+ package root is acceptable). Note that a package global library
+ may be set up by adding the path of the library directory (e.g.,
+ "noao$lib/") to the `pkglibs' entry in the extern.pkg.
+
+ Additional logical directories may be defined in the global package
+ mkpkg.inc and used in mkpkg files, but these logical directory names
+ will not be propagated to XC hence cannot be used in include file
+ references etc. Additional environment variables could in principle
+ be added to the entry for the package in the extern.pkg, but I would
+ like to keep the interface as small as possible, localizing all
+ package information in the package itself as far as possible.
+
+ VMS/IRAF users should note that since XC executes in the context of
+ MKPKG in VMS/IRAF, mkpkg definitions may be propagated to XC (I
+ haven't tested this), but to make use of this side effect of how XC
+ is implemented in VMS/IRAF would be nonportable.
+
+unix/hlib/gripes.cl
+unix/hlib/gripesfile-
+ Commented out the code which appends gripes to the gripesfile, and
+ deleted the gripesfile. We will use only electronic mail to enter
+ gripes from here on.
+
+unix/hlib/irafuser.csh
+ 1. Added NOVOS and HSI_LIBS entries to define whether or not VOS file
+ name mapping is to be used in the HSI, and to list the libraries
+ to be searched to link HSI executables. If libsys.a does not exist
+ NOVOS is automatically set, hence bootstrapping UNIX/IRAF on a source
+ only system will automatically generate the HSI without the VOS.
+ Redoing the bootstrap once the VOS is compiled will cause the HSI
+ to be rebuilt with VOS filename mapping, as may be required to compile
+ any external packages (the core system does not require VOS filename
+ mapping in the HSI).
+
+ 2. Added a couple of utility command aliases. `mkv' runs mkpkg with
+ the link flags set in such a way that the resultant executable has
+ symbols for the transfer vector entries. This is necessary to be
+ able to see what VOS routines are being called from an application
+ when debugging (otherwise one sees an offset from vshlib_). Perhaps
+ I should make this the default on our development system, even though
+ it almost doubles the size of the symbol table in each executable.
+
+ A second utility definition `mkz' runs mkpkg, linking without the
+ shared library (like xc -z). These name may change but they should
+ serve to illustrate how to use the linker options for debugging.
+
+unix/hlib/libc/knames.h
+ Made several new entries.
+
+unix/hlib/login.cl
+ Added commented out commands to load the `noao' and `tv' packages.
+
+unix/hlib/mkpkg.inc
+unix/hlib/mkpkg.sf.I386
+unix/hlib/mkpkg.sf.OS4
+unix/hlib/mkpkg.sf.S34
+unix/hlib/mkpkg.sf.SUN3
+ 1. In the mkpkg.inc, changed the FPU definition to MACH, since FPU
+ is too restrictive a name for what we use this switch for; MACH for
+ machine architecture comes closer. Possible values of MACH are
+ f68881, ffpa etc. for Sun-3 hardware options, sparc for the Sun-4,
+ i386 for the Sun-386, vax for the VAX, and so on. This switch is
+ used to select default compile and link flags, determine which
+ special file list to load, etc., allowing the generation of relatively
+ machine independent mkpkg definition files.
+
+unix/hlib/strip.iraf
+ 1. Changed the name from stripper to strip.iraf (strip.noao etc. for
+ other packages.). Deleted the stripall since I have never been happy
+ with what that level of stripping anyhow. Still need to review the
+ action of the strip file to ensure that everything that can be deleted
+ is being deleted, to add something to strip executables on unix
+ systems, and so on.
+ 2. Deleted all entries for the noao and local packages. These packages
+ now have their own strip files.
+
+unix/os/zfacss.c
+ Modified to test for the null filename and return NO in that case.
+
+unix/os/zgtenv.c
+ Will now return ERR for a undefined variable, and 0 for a defined
+ variable with a null string value.
+
+unix/os/zmain.c
+unix/os/zshlib.c [DEBUGGING POINTER]
+unix/os/zzstrt.c
+ Added a new command line switch "-w" to the zmain. Currently this is
+ only used in Sun/IRAF. Specifying -w causes the shared image text to
+ be mapped with write permission, allowing breakpoints to be set in
+ VOS routines. This cannot be done by default because one has to
+ reserve swap space for the entire shared image text segment in order
+ to have write (copy on modify) permission.
+
+unix/shlib/mkpkg
+ Fixed a bug in the code used to delete old versions of the S.e shared
+ image files in BIN.
+
+--------- (end of accumulated notes) ------------