========================================================================== ***** MK Version MK43 (rpd) ***** New features: --- -------- I revised the AST interface. Now there is a machine-independent function, ast_taken, which handles ASTs. Also the idle thread will process network ASTs. I changed the network code to use ASTs to run packets through the packet filters and send IPC messages. The network thread only runs when more message buffers must be allocated. The network code now keeps two queues of packets, for low and high priority packets. If it runs out of free buffers, it will recycle packets in the low-priority queue. The network drivers currently mark broadcast packets as low priority. These changes greatly reduce the number of dropped high-priority packets and the amount of memory consumed by packet buffers. More paths through the kernel use explicit continuations now. I changed the scheduling state machine so that swapped threads can live on the run queues. Now the kernel uses explicit continuations for threads blocked in (user) message receive threads blocked in exceptions threads blocked in (user) page faults kernel threads (including the idle thread) blocking for more work preemptive scheduling thread_switch and friends These cases account for >99% of all context-switches. I changed the interface to machine-dependent context-switch functions. The two main functions now are stack_handoff and switch_context. These functions are also responsible for changing address spaces. switch_context returns the previously running thread (instead of calling thread_continue, like the old interface). stack_handoff accounts for >99% of all context-switches. I changed how the IPC system caches message buffers. Now it uses a per-processor cache, instead of a per-thread cache. The per-processor cache uses less memory and has a better hit rate. [PMAX,I386] I pulled floating-point state out of the pcbs. Now space for FP registers is only allocated for threads which actually use FP. [PMAX] I changed how the mips code handles the FP registers, to remove FP overhead from the context-switch path. Bug fixes: --- ----- I fixed a bug ipc_entry_grow_table, which causes a panic when the default pager tries to grow its table and there aren't enough free pages. Now ipc_entry_grow_table uses a new function, kmem_realloc, to grow large tables. I also reorganized the kmem_alloc interface, so that those functions have real return codes now. kmem_alloc allocates a new object and kmem_alloc_wired uses the kernel-object. Both functions do not zero the new memory. I fixed a page leak. Copy-on-write faults left the original page off the paging queues. Related changes to vm_page_deactivate and how vm_object_terminate and the pageout daemon interact. I fixed the ioctl definitions for Ansi C. I changed the default value of db_maxoff to 4K. I fixed ddb to catch exceptions that occur in ddb commands. Typos in arguments to "show foo" are no longer fatal. I fixed the default pager's initialization of pager structures. I fixed memory_object_data_provided to only return success when it consumes its copy object, so erroneous data-provided's don't crash the kernel. I fixed vm_fault_page to give vm_pageout_page busy pages. I fixed kmem_alloc and friends to not hold object locks across pmap_enter. Fix for vm_map_entry_delete's use of vm_object_page_remove from dlb. Fix for vm_map_fork/VM_INHERIT_COPY of wired entries from dlb. Fix for boot_printf from sumitomo. Fix for read_emulator_symbols (to not panic if there is no emulator) from jsb. [SUN3] I fixed the pmap module to initialize new pmaps correctly. [SUN3] I fixed locore to not leave thread->recover set across system calls. [PMAX] I picked up a couple more spl/interrupt-race fixes from af. [PMAX] I fixed switch_context and call_continuation so stack traces in ddb terminate correctly. [I386] I fixed several floating-point bugs. Now multiple threads can use FP without stepping on each other. [I386] Fixed kdb_trap to disable interrupts and skip permanent breakpoints. [I386] I fixed switch_context and call_continuation so stack traces in ddb terminate correctly. Organizational changes: -------------- ------- device/tape_status.h is exported to the release directory now. I changed the definition of REG_EXP, to make it .* on all platforms. If you have an old make, you may need to override this definition with REG_EXP=\* on your make command line. I also fixed the Makeconf created in the build directory to define REG_EXP, so builds initiated in the build directory work. Special notes: ------- ----- I only tested briefly on the Vax and Sun 3. ========================================================================== ***** MK Version MK44 (dbg) ***** New features: --- -------- The kernel now runs on at least two multiprocessors: the Sequent (i386), and R2D2 (Vax 8200). The machine-independent portions of the kernel should now be OK for multiprocessor work. CPU_SUBTYPE_SYMMETRY is now defined. [I386] We now support the Sequent Symmetry i386 multiprocessor. To build for the Sequent, specify "CONFIG=STD+SQT+32". The config program now assumes that "MACHINE sqt" is a Symmetry: it uses the conf/*.i386 files, not the (non-existent) conf/*.sqt files. [VAX] The Vax kernel can now be built with GCC: add '+gcc' to the configuration name. However, getting a proper GCC for the VAX was difficult, since the GCC in the .gnu-comp collection does not talk correctly to CMU Make. To get the proper GCC compiler, you must set up your environment as follows: setpath -i0 /afs/cs/project/mach-7/release/vax_mach/latest; setenv GCC_EXEC_PREFIX /afs/cs/project/mach-7/release/vax_mach/latest/lib/gcc- (because GCC doesn't really look down LPATH for the compiler pieces). And the VAX assembler code is still built with the BSD assembler, because there are too many bugs in GAS. The VAX now uses Rich Draves' stack switching code. This leaves only the SUN3 (soon to be decommissioned?) and the i860 defining KEEP_STACKS. (vm/vm_object.c tripped over a VAX GCC bug; I had to partially rewrite one routine as a result. vm_object_enter should be further rewritten anyway to separate the internal and external cases, since they have very little in common.) Bug fixes: --- ----- Network packets sent to multiple filters all have the correct packet size (thanks, DPJ). The control ports for all CPUs are now created when the system is started, not when the CPU is started. The old method gave the outside world no way to talk to a CPU that hadn't been started yet. The ports also remain when the CPU is shut down. (WARNING - the shutdown code doesn't work yet - it will crash the system). Volatile declarations have been added where needed. Choose_pset_thread and its callers (thread_select) have been rewritten to avoid confusing a pset with its runq (buggy C code). [I386] The floating-point code has been rewritten to always save the FPU state in memory on context switch. It's slower, but there were two problems with the old method: 1: It's unknown what happens when the i386 switches mappings while the i387 has a store instruction (e.g. fbstp) in progress. Where does the data go? 2: On a multiprocessor, we'd need interprocessor interrupts to fetch a thread's FP state from the CPU it last ran on. Exiting an interrupt routine correctly leaves processor interrupts disabled until the IRET instruction. The PMAP bug that would occasionally cause the machine to reboot has been fixed. We now switch to the kernel's page directory at PMAP_DEACTIVATE, instead of leaving a dangling reference to a task page directory that may be about to vanish. The cthreads library now uses locking instructions to unlock locks. I'm not sure this is necessary for the Sequent, but it may be on other machines, depending on hwo they implement locking. [VAX] The ugly 'br' and 'cvec' global register variables have been moved to memory to accommodate GCC. The disassembler now correctly displays instructions using indexing. Organizational changes: -------------- ------- kern/lock.h now imports when building for multiprocessors (NCPUS > 1). This is the place to put machine-specific definitions of a simple_lock (e.g. for the HPPA), or GCC inline-assembler definitions of simple_lock and simple_unlock. The files exist for the VAX and I386. [I386] Files in the i386 directory are common to the various i386 machines: the PC-AT compatibles (i386at), the Intel Hypercube (i386ipsc), and the Sequent (sqt*). Code that differs from machine to machine has been moved to the machine-specific directories as much as possible. This includes the assembly code to get bootup parameters (*/asm_startup.h), the C initialization and shutdown code (*/model_dep.c), and interrupt and SPL handling (*/interrupt.s, */spl.s). The i386 directory does contain code that is shared by the i386at and i386ipsc implementations. This is interrupt-handling and timer code that runs on the Intel interrupt handler (8259) and timer (8254) chips that both of these machines use. If (when?) I merge in support for the Corollary, it will also use these routines. Locore.s and friends are now built with normal Make rules. The 'makeboot' program is needed to fix the executable file for the Sequent, which uses a special magic number for kernel boot files. [VAX] Locore.s and friends are now built with normal Make rules. The initialization code in vax_init.c has been rewritten in assembler (vax_init.s). It runs in physical mode, and tripped over GCC, which doesn't agree with PCC about what constructs generate PC-relative addresses (which would give physical addresses in this context) and which generate absolute addresses (which always give virtual addresses). The awk script for vaxfloat.sa has disappeared. The file is now vaxfloat.s, and uses C preprocessor macros. When building with GCC, the inline program is no longer used. Various VAX header files now use the GCC inline assembler macros instead. There is a global inline-substition file, vax/gcc_asm.h, which is included in every kernel file through some GCC tricks. Special notes: ------- ----- The system should now be built and tested in the following configurations: PMAX: STD+ANY (decstations) I386: STD+WS (PC-compatible i386 boxes) STD+SQT+32 the Symmetry STD+NORMA+iPSC the Intel Hypercube (NOT TESTED FOR THIS RELEASE) VAX: STD+VAX6bb+gcc (microvaxen) STD+16+fixpri+VAX6bb+BI+de+gcc (R2D2) SUN3: STD+SWS i860: ??? ========================================================================== ***** MK Version MK45 (af) ***** Mostly fixes and extensions for PMAX (scsi driver & co). CMU&CMUCS Cleanup rerun. New features: --- -------- [PMAX] SCSI driver much improved: does disconnect/reconnect, handles more device types (tk50 and Exabyte tapes, CD-ROMS, many more disks including the HP 1Gb), does automatic bad-block replacement, handles powering on/off devices gracefully (3max only), watchdog to guard against bus lockups (hitachi), many configuration options, extremely pipelined copy operations (esp fast are WRITEs on 3max) and double-buffering which makes it much faster than .. competitors :-) Added new copy routine that speeds up aligned copy operations, used by the SCSI driver and the pmap module. Made modem control code optional, so that 3max can use serial lines without contortions. You can use the mouse with emacs with the console terminal emulator. Bug fixes: --- ----- [PMAX] Fixed multibyte commands to the keyboard, and the mouse lazyness. Fixed re-enabling of interrupts on exception returns to kernel. Fixed dispatching of interrupts to only handle one interrupt at a time, to make sure we do not handle the same interrupt twice or worse yet reenter an interrupt handling routine. Old code kept, disabled. Organizational changes: -------------- ------- Got rid once and forall of the "CMU" and "CMUCS" conditionals. Special notes: ------- ----- Built for: PMAX: STD+ANY check I386: STD+WS (PC-compatible i386 boxes) check STD+SQT+32 the Symmetry check STD+NORMA+iPSC the Intel Hypercube check VAX: STD+VAX6bb check STD+VAX6bb+gcc (microvaxen) check STD+16+fixpri+VAX6bb+BI+de+gcc (R2D2) check SUN3: STD+SWS check Tested on PMAX only, there where no major MI changes. ========================================================================== ***** MK Version MK46 (mrt) ***** New features: --- -------- none Bug fixes: --- ----- Corrected all the Mach free copyright messages to have "AS IS" and Carnegie Mellon instead of just Carnegie. [VAX] Put the restrictive copyrights back on the few files that erroneously gotton the free copyright. Special notes: ------- ----- In the future, be very careful that you get the correct style of copyright on to any files you add to the mk tree. For license-free c files you can use conf/copyright, or use /afs/cs/mach/src/copyright/{c,shell,roff}. If you pick one up from there add a Mach Operating System line to the beginning. If a file contains a restrictive BSD copyright or any restrictive manafacturer's copyright, use the old Mach licensed one. Built for all 8 configurations. Compared the .o files to be sure nothing had changed. ========================================================================== ***** MK Version MK47 (rpd) ***** Bug fixes: --- ----- I fixed a pageout deadlock which crept in with default_pager_object_create. It turns out to be quite difficult to have the default pager handle "external" objects in addition to "internal" objects. Now the default pager is multi-threaded and separate threads handle "internal" and "external" objects. boot_ufs/ code picked up some locking. I changed pagein to use fictitious pages for busy/absent pages. Real pages get allocated when the pager calls data-provided or data-unavailable. To prevent the default pager from using all the pages, pagein of "internal" objects still allocates real pages. The association between physical pages and page structures changes dynamically, so this won't hamper page "stealing" on the data-provided path. I changed the pageout daemon pretty significantly, to remove some deadlocks and to make it behave better under heavy paging loads. Now vm_page_inactive_target is calculated dynamically and pages trickle from the active list to the inactive list, instead of getting dumped in big bursts. The code also dynamically adjusts vm_pageout_burst_wait, the amount of time it pauses per dirty page, so it isn't as important that this number be tuned right. I changed the pmap interface. pmap_bootstrap, pmap_valid_page, pmap_map, and pmap_update are out. pmap_init changed. pmap_startup, pmap_steal_memory, and pmap_free_pages (or possibly pmap_virtual_space and pmap_next_page instead of pmap_startup and pmap_steal_memory) are in. The pmap_startup/pmap_steal_memory system has two main advantages over the old system. First, machine-independent code doesn't assume quasi-contiguous physical memory. Second, machine-dependent code can implement pmap_steal_memory to allocate memory more efficiently than vanilla kernel VM (for example, using no/fewer TLB entries, not backed by page structures). The zone package gets 420K from pmap_steal_memory. I fixed a deadlock problem in kmem_alloc. It can't hold a kernel map locked while allocating memory. I fixed vm_page_deactivate as suggested by rfr, to clear the reference bit on inactive/referenced pages. I changed the stack-privilege algorithm, which reserves kernel stacks for important kernel threads like the idle threads, pageout deamon, etc. The old method had a bug that could result in stack_alloc_try panics. I fixed kernel stack allocation so that non-page-sized stacks work. All current architectures use page-sized stacks by default. I beefed-up the simple-lock debugging code. Now it keeps track of which locks are held and who took the locks. check_simple_locks() should be used in code which may block, to check that no simple locks are held. I changed the timeout/timer code to use a fixed-size array of timers instead of a zone, because it allocates timers from interrupt handlers. Only device drivers use this code. I changed all machine-independent uses of timers to use "private" timers. In particular, priority depression timeouts use another timer in the thread structure. If possible, this timer should be merged with the previous per-thread timer. I didn't fix the long-standing races in the timeout code. I fixed host_set_time to update the mapped time value. I changed the mapped time value to include a check field, so readers can get a consistent value without locking. I picked up a processor_doaction fix from dlb. I made some minor changes to the xpr code so that recorded xpr activity can survive across a reboot and be examined. I cleaned up the semantics of the syscall forms of kernel RPCs, so that they better mimic the RPC forms. If the syscall can't handle request, it returns MACH_SEND_INTERRUPTED. This is a backwards compatible change, because current user stubs check for any non-success return. They should be changed to check for send-interrupted specifically. This will not be compatible with older kernels, but it will fix a bug. (For example, the current ipc_test binaries in the release area report a problem because they are linked with syscall forms that don't have quite the right semantics. The corresponding change in libmach for the user stubs fixes ipc_test.) [PMAX] I simplified the handling to tlb misses. This made the user tlb-miss handler faster. It fixed a bug; now VM exceptions always have the correct address. [PMAX] I removed spls in the pmap module. [PMAX] I put a nop after splhigh so that it can be stepped through. [SUN3] I converted the remaining uses of vm_map_find to vm_map_enter. [SUN3] I removed a debugging panic in the user breakpoint path. [SUN3] I fixed the fpa conditionals in genassym. Special notes: ------- ----- Tested on rpd, waldo, rocky, nova, r2d2, boris. ========================================================================== ***** MK Version MK48 (jsb) ***** New features: --- -------- This merge mostly contains NORMA work, including Whizzy fast internode IPC, Rough cut at VM support for fast internode IPC, and Beginnings of internode task creation. Added task_get_emulation_vector; previously, it was impossible to obtain this information, making task migration impossible. For symmetry, added task_set_emulation_vector. Task_set_emulation is now a call to task_set_emulation_vector. Added a gets function in kern/printf.c (derived from boot_gets). Bug fixes: --- ----- [i386] Defined SPLVM, SPLX as null (vs. splvm, splx) in uniprocessor case. Organizational changes: -------------- ------- Added MACH_CLTASK conditional. Added a kernel/norma/ directory for norma-specific files. I'll be moving more things into this directory in subsequent releases. Added mach/mach_norma.defs, for NORMA specific kernel functions. Added mach/norma_task.defs, for task creation upcalls. [i386] Moved i386/read_fault.c to intel/read_fault.c so that i860 can use it as well. [i386] Added spldcm to i386/spl.s. ========================================================================== ***** MK Version MK49 (jsb) ***** New features: --- -------- First cut at NORMA vm support. Uses mythical xmm technology. [I860] Merged in i860 code from March, when I MK43ified what Intel had at the time. The next merge will have the most recent Intel code, plus friendlier licensing language. [I860] Wrote an (unoptimized) internode ipc driver for the i860, based on Intel code for old internode ipc protocol. Bug fixes: --- ----- Updated ddb man page. Added documentation for continue/c, match, search, and watchpoints. I've not actually explained what a watchpoint is; maybe Rich can do that (since he added them in the first place). [I860] Better trap handling code, adopted from Intel's NX OS. [I860] Use new (delta-compatible) booting technology. [I386] Use new (delta-compatible) booting technology. Organizational changes: -------------- ------- Renamed NORMA conditionals; for example, MACH_CLPORT becomes NORMA_IPC. Better support for partial enabling of NORMA support; for example, one should now be able to build with just NORMA_IPC. Moved NORMA ipc support from ipc directory to norma directory. [I860] Rearranged dev_forward_name.c table for non-integrated I/O nodes. Special notes: ------- ----- Everything in this merge is either i860 dependent or hidden under NORMA conditionals. I built and tested on i860 (dimitri), i386 (dimitri and ubik), andmips (jsb). The i860ipsc console driver is flaky. This will be fixed in the next merge, when I pick up the newest Intel code. ========================================================================== ***** MK Version MK50 (jsb) ***** New copyright from Intel: i860, i860ipsc, i386ipsc, and ipsc directories now contain freely distributable files. Unfortunately, the i386ipsc ethernet driver is still encumbered, so I've stuffed it into its own directory, i386ipsc/cnp. Also picked up recent i860 fixes from Intel. Bug fixes: --- ----- [I860] Many. Organizational changes: -------------- ------- [I386] Moved i386ipsc/if_cnp.[ch] to i386ipsc/cnp/if_cnp.[ch]. Tested On: ------ -- [I386] dimitri (i386ipsc), ubik. [I860] dimitri. [PMAX] jsb. ========================================================================== ***** MK Version MK51 (rvb) ***** New features: --- -------- [VAX] We now support the VAXSTATION 3100. This is a Vax processor with PMAX peripherals Bug fixes: --- ----- [SUN3] [VAX] Now build again. And I build a STD+BI+16 and discovered that it could never have been built; it now can. Organizational changes: -------------- ------- Two big ones: 1. Since the pmax and vaxstation 3100 now share the same devices and since we believe that in the future that machines will be made of off the shelf chips, we pulled out almost all of the files in mips/PMAX and moved them to either the scsi/ toplevel directory or the chips/ toplevel directory. Note also that scsi/ has an "adapters" subdirectory. 2. In setting up the chips/ directory, we puked over having to include "cputypes.h" so that we could differentiate some lines of code that were necessary for DECSTATIONS vs VAXSTATION. So we globally changes cputypes.h to platforms.h. Special notes: ------- ----- ========================================================================== ***** MK Version MK52 (rvb) ***** THESE CHANGES ARE MIPS AND VAX ONLY. Mainly we forgot to export the include files into the release/chips and release/scsi directories that had been in release/mips/PMAX. This means trouble for the unix server and other users of release. Also a few tweaks from sandro for mips. NOTE: only the 3100 platforms were compiled for. ALSO NOTE: on the previous release MK51, we build for sun3, i386, sqt, mips, vax6bb and r2d2. We tested on mips and vax6bb. ========================================================================== ***** MK Version MK53 (rvb) ***** Bug fixes: --- ----- Organizational changes: -------------- ------- [VAX] [PMAX] Well, the last release defuncted busses.[ch] from the mips/PMAX/ directory and as luck would have it there was still one reference in the tree to it. ========================================================================== ***** MK Version MK54 (rpd) ***** New features: --- -------- Mig now understands a new option, "-sheader ", which causes it to output a header file containing declarations/prototypes of server-side functions. I restored the prototypes in the standard header file ("-header "), which contains declarations for the user-side stubs. I removed some old code which caused Mig to produce an "init_" function in the user file. It hasn't done anything in a long time and nobody should be calling it. I hacked Mig to use the type "ipc_port_t" instead of "mach_port_t" in appropriate places when generating files for the kernel. This way prototypes use the right type and I could remove a bunch of casts from the kernel, especially in the vm system. Bug fixes: --- ----- I fixed a bug in the message-buffer caching code from MK43. I picked up a fix from dlb for no-op assignments of threads to processor sets. In MK47, I changed the kernel so that syscall forms of kernel RPCs return MACH_SEND_INTERRUPTED to indicate that libmach should retry. In this merge, I made the companion fix to libmach to check for MACH_SEND_INTERRUPTED instead of any non-success return code. A Unix server built with this release won't work on pre-MK47 kernels. I picked up some minor changes from jsb so that the norma/ directory is only used when building NORMA configurations. [VAX] I fixed files in the chips/ and scsi/ directories so that they compile with gcc. I fixed a problem with the recent vaxstation support that screwed up r2d2. [I386] A minor fix so that STD+WS+TEST works. I added kernel/src/makeboot to the appropriate Directories/ files. [PMAX] I fixed the mips/PMAX/boot/ directory so that people without dot in their paths can build it. Special notes: ------- ----- I tested the following configurations: vax STD+VAX6bb+gcc nova, sf STD+16+fixpri+VAX6bb+BI+de+gcc r2d2 i386 STD+WS waldo STD+SQT+32 boris STD+iPSC+NORMA dimitri sun3 STD+SWS rocky pmax STD+ANY rpd ========================================================================== ***** MK Version MK55 (jsb) ***** Bug fixes: --- ----- NORMA_VM: Eliminated leaks; cleaned up implementation. NORMA_IPC: Improved buffer management code. New features: --- -------- From David Black: memory_object_data_supply, and generalization of NORMA_IPC page list technology. Code currently turned off by default. More details when I pick up the rest of David's work. Special notes: ------- ----- Built for and tested on ubik i386 STD+WS jsb pmax STD+ANY dimitri i386ipsc STD+iPSC+NORMA Build, not tested: vax STD+16+fixpri+VAX6bb+BI+de sun3 STD+SWS I could not build STD+16+fixpri+VAX6bb+BI+de+gcc because the build died on gcc -ES ... locore.s. It looks like gcc doesn't know what a '-ES' means. (Perhaps ius3 has an old gcc?) ========================================================================== ***** MK Version MK56 (danner) ***** New features: --- -------- The purpose of this release is essentially to get the luna88k code under source control. Other minor upgrades occured in the process. The code is incomplete and currently broken. The luna build environment is still less than ideal. If your are interested in building such kernels, please contact me or bob. The software single step code is now smart enough to avoid putting breakpoints directly after unconditional flow transfer instructions. This causes problems on both the pmax and luna. DDB can now take a table of machine specific commands to be installed in addition to the normal commands under the command prefix "machine". This necessitated some changes to the ddb header files. See luna88k/db_interface.c for a use of the functionality. The SSSCSI (Sandro Spiffy SCSI) code now understands dec, omron and bsd labels, which form a maze of disk labels, all alike. Copyrights on the omron code are somewhat suspect, and I expect I caused retrograde motion on several MI file copyrights. Apologies in advance. Built on amalia.mach (luna), and booted single, dual, and quad cpu. Works as well as ever. (gets through SCSI autoconfig, finds paging file, dies). Built and booted on rvb4.mach.cs.cmu.edu (Decstation 5000). DDB changes tested. Comes up multiuser. Built STD+VAX6bb on sf.mach.cs.cmu.edu. Bug fixes: --- ----- Organizational changes: -------------- ------- A bunch of luna specific directories were created. Special notes: ------- ----- I created an new version of the utils/mktree.sh script that is used to create kernel trees. Gratitously replicated directory creation code has been collapsed to loops. Until Mary or someone can figure out how to install this in its proper place (/afs/cs/project/mach-7/mk/bin/mktree), please manually pull the script out of /afs/cs/project/mach-7/mk/src/latest/utils/mktree.sh. ========================================================================== ***** MK Version MK57 (danner) ***** Bug fixes: --- ----- Fixed Copyrights for mrt. Built nowhere. Tested nowhere. ========================================================================== ***** MK Version MK58 (rvb) ***** UX25 and MK58 have been built and tested together on all 4 major(?) architectures, i386, pmax, vax, sun3. They can be built and they are consistent. (Also we added a few minor changes.)