worsley@ditmela.oz (Andrew Worsley) (05/18/89)
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 2 (of 10)."
# Contents: kerneldif/CHANGES fsdif/cache.c.cdif fsdif/inode.c.cdif
# fsdif/main.c.cdif fsdif/misc.c.cdif fsdif/pipe.c.cdif
# fsdif/super.c.cdif fsdif/table.c.cdif fsdif/utility.c.cdif
# hdif/boot.h.cdif hdif/com.h.cdif hdif/const.h.cdif
# kerneldif/Bconsole.c.cdi kerneldif/Brs232.c.cdif
# Wrapped by sys@besplex on Sun Mar 26 06:33:48 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'kerneldif/CHANGES' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'kerneldif/CHANGES'\"
else
echo shar: Extracting \"'kerneldif/CHANGES'\" \(13586 characters\)
sed "s/^X//" >'kerneldif/CHANGES' <<'END_OF_FILE'
XGeneral:
X o Used the macros in proc.h to avoid magic numbers all over.
X The old macro for proc_addr() was slow (array indexing).
X The old conversion from a proc pointer to a proc number was even
X slower (pointer subtraction).
X The new macro for proc_addr() is unfortunately slower for constant
X process numbers so cproc_addr() is used for those.
X o Eliminated most of the hardware segment arithmetic.
X This was the main thing standing between the C code and protected
X mode.
X WARNING: Amoeba still has some, so won't work with this kernel.
X o Changed interrupt handling to better suit level sensitive
X interrupts on PS/2's and to reduce latency.
X WARNING: even PS/2-30's (which used to work) may be broken.
X WARNING: The ethernet driver needs some minor changes to match.
X o Converted all assembler (.s) files to preprocessor (.x) files.
X This greatly simplifies the maintenance of constants across C and
X assembler code.
X The header file 'sglo.h' is used to centralize all declarations
X of assembler variables.
X o Started to remove saving and restoring of the interrupt enable
X state (1.2 did it better).
X The state should always be known since disabling interrupts for a
X whole function call is bad.
Xaxmakefile:
X o NEW, the complicated makefile which I use to build many variations
X of the kernel.
X See the installation guide.
Xconst.h:
X o Changed almost everything.
X o INIT_SP is fixed.
X o Hardware VECTOR's are parametrized by IRQ's since this kernel needs
X to change the vector bases.
X o Introduced HCLICK_SIZE since CLICK_SIZE was being confused with
X the hardware click size.
X o Made the requirement for stack alignment explicit.
Xglo.h:
X o Removed globals realtime, lost_ticks, cur_proc, prev_proc, int_mess.
X Interrupt() no longer has to know about the internals of the
X clock task.
X Much time is saved by always using proc_ptr to access the current
X process.
X Interrupt messages are no longer necessary, they are passed around
X as numbers.
X o Added some new globals and centralized some other declarations.
X Things like umap() are redeclared too often.
X The 'snow' flag should be set for cheap CGA's (in console.c).
X The old console driver incorrectly assumed snow removal was
X necessary on non-mono non-EGA's.
Xproc.h:
X o Replaced the array of registers by a union and merged the pc_psw
X structure with it.
X It was inconsistent to treat pc_psw specially (the processor
X decides the order of pc_psw but in practice pc_psw is copied
X elsewhere in real mode and the processor decides the best order
X of all the registers in protected mode).
X The union could be a structure in this implementation.
X o Added fields for p_ldt_sel and p_ldt for protected mode segments.
X o Added fields p_int_blocked, p_int_held and p_next_held for new
X interrupt handling.
X o Added field p_pendcount and defined SIG_PENDING for signal handling
X bug fix.
X o Defined many macros to eliminate magic numbers.
X o Eliminated busy_map and task_message globals.
X The use of these was the worst bottleneck in the old interrupt().
Xsconst.h:
X o NEW, constants and macros not already defined in the C header
X files are defined here along with some macros for 286 code.
X There are also macros to let me use my 386 assembler instead
X of asld.
X Unfortunately, DOS assemblers like MASM are too different to
X use the same trick.
X Unfortunately, asld wants "[]" for parentheses in expressions,
X so some of the C definitions had to be explicit constants
X rather than expressions, to avoid breaking either cc or asld.
X o WARNING: there are still lots of magic numbers in the old klib88
X code.
Xsglo.h:
X o NEW, ALL globals used by the assembler code are declared here.
X A macro trick like "#define EXTERN" for the C code is used to
X set up the correct .define's and .extern's.
Xtype.h:
X o Deleted struct pc_psw (now part of stack frame structure).
X o Deleted struct sig_info (already no longer used).
X o Added typedef's for scalar types of size 8, 16, 32 bits.
X Using chars, shorts, ints and longs directly leaves too many
X things dependent on the compiler.
X o Added stack frame structure suitable for 8088 through 80286.
X o Added segment descriptor structure for protected mode.
X Most protected mode things are in protect.h and protect.c, but
X this structure is needed in the process table.
Xat_wini.c:
X o Deleted all explicit locking.
X The task provides adequate protection.
X o Changed dma_read() to port_read() for protected mode.
X o Same for dma_write().
X o Fixed bug with port_read() and win_results() done in wrong order.
X The interrupt happens when the data is ready, not when it is read.
X o Changed win_results() to old_win_results() so new one could do more.
X o Wrapped some code with #ifdef STUPID_WINI_ADJUST.
X The offending code causes the first sector on partitions starting
X on an odd boundary to be lost.
X There is still a problem if the total number of sectors on the
X partition is odd.
X o Added a new win_results() for the new interrupt handling scheme.
X Same as old one except that it clears the AT wini interrupt mask.
X There are too many exit points in the old win_results() to do this
X conveniently directly.
Xclock.c:
X o Replaced CLOCK_TICK with HARD_INT.
X It was slower to distinguish them.
X o Deleted FLUSH_MASK and flush_flag.
X They really belong to TTY.
X o Defined TIMER_COUNT for cleaner init.
X o Made globals realtime and lost_ticks into private variables.
X The locking is tricky enough when they are private!
X Lost_ticks is renamed pending_ticks and made a long.
X o Moved printer restart logic to PRINTER task.
X o Rewrote init_clock().
X o Did accounting() inline.
X o Added low level clock interrupt handler.
X See code for comments - there are many races to guard against.
Xconsole.c:
X WARNING: These changes are half-hearted since I usually use the
X console.c posted with my tty driver.
X o Extra initialization for protected mode.
X Special video segments have to be used for protected mode.
X COLOR_BASE and MONO_BASE are defined (differently, in phys_bytes)
X in const.h for experimentally using screen memory for programs.
X o Added locking to keyboard().
X Keyboard() may now be interrupted by RS232.
X o Removed segment arithmetic and replaced get_byte() by
X get_physbyte() for protected mode.
X o Added enable_irq() so main.c doesn't have to enable keyboard
X interrupt too early.
X o Added scan_keyboard() for wreboot to use.
Xdmp.c:
X o Changed output formatting for larger numbers in protected mode.
X o Changed references to registers in process table.
X o Cleaned up click to K conversions.
X o Fixed wild array index in aout[NSIZE].
X o Made other unnecessary changes to simplify code.
Xexception.c:
X o NEW, replaces some exception handlers in main.c
X This should eventually contain stack fault handlers and page
X fault handlers, etc.
Xfloppy.c:
X o Deleted redundant olivetti variable.
X o Deleted all explicit locking, changed fdc_results().
X Same as for at_wini.c
Xi8259.c:
X o NEW, handles initialization of the interrupt controller.
X Needed since the BIOS init mixes hardware interrupts into vectors
X reserved for exceptions (and used on 286's and above).
Xklib286.x:
X o NEW, duplicates all functions in klib88.x which have to be
X implemented differently in protected mode.
X It contains an initialization routine which applies the necessary
X patches.
Xklib88.x:
X o NEW, a rewrite of klib88.s.
X Many routines are new or totally rewritten and/or renamed
X for compatibility with protected mode.
X WARNING: klib88.s will be obliterated when 'make' is run.
Xmain.c:
X o Moved trap() and unexpected_int() to exception.c.
X o Included boot.h to get at limit on processor type.
X 386 and 286 systems need to be run as 8088's for testing.
X o Included debugger support.
X Rest of debugger is not in this posting.
X o Made many small changes.
X The memory maps were not initialized right.
X The 8259 mask was not initialized right.
Xmemory.c:
X o Fixed bugs in initialization of /dev/kmem.
X The bad use of get_base() is a good example of how the wrong
X approach leads to trouble for protected mode - and larger changes.
X o Initialized /dev/mem with size depending on processor.
X WARNING: the inode has the wrong size of 640K.
X o Added /dev/port.
X o Deleted special treatment of extended memory.
X Phys_copy() has extra intelligence to deal with it, and MM
X can map it now CLICK_SIZE is 256.
Xmisc.c:
X o NEW, now contains only a routine to initialize tables of memory.
Xmpx286.x:
X o NEW, duplicates all interrupt handlers and functions in mpx88.x
X which have to be implemented differently in protected mode.
X A few patches are necessary (they are done by klib286).
X The interrupt vectors do not need patching since a new interrupt
X table is set up in protect.c and loaded just once in p_restart.
Xmpx88.x:
X o NEW, a rewrite of mpx88.s.
X o The startup code copies the boot parameters (if any) provided by
X the boot loader.
X o All interrupt handlers now use the 8259 to stop nested interrupts
X from the same device, but allow interrupts from other devices.
X o Save and restart are rewritten for speed and to save registers
X in the same order as for protected mode (where the correct order
X is more important).
Xprinter.c:
X WARNING: these changes are not well tested since I rarely use the
X printer.
X o Fixed bug with no reply in default case of message handler.
X o Changed locking to use mask rather than lock everything.
X The printer code is still awful.
X o Eliminated segment arithmetic as for console.c.
X o Put message content in variable 'done_status' since new interrupt
X messages can have no content.
X o Checked for printer restart here instead of clock.c.
X The locking is very tricky and it is best for clock.c not to know.
Xproc.c:
X o Converted most of the public routines to locked variants.
X The way the system task (privilege 1 in protected mode) calls
X the kernel (context switcher, privilege 0) is potentially
X dangerous.
X o Rewrote interrupt() for speed.
X The method is simpler (particularly the way blocked interrupts
X are dispatched by the check in mini_rec()), but this is obscured
X by the complications needed to allow interrupt() to run with
X interrupts enabled.
X o Made many small changes to use proc pointers instead of proc
X numbers.
X o Passed return code from syscall() back to assembly code to handle.
X This is faster and reduces the number of registers that the C
X code has to know about.
X o Speeded up most of the smaller functions by avoiding index
X calculations.
X o Simplified pick_proc() by making IDLE a normal process.
X o Added function unhold() to finish off the new interrupt handling.
Xprotect.c:
X o NEW, initialization and segment building for protected mode.
Xprotect.h:
X o NEW, various constants for protected mode.
Xrs2.x:
X o NEW, replaces rs2.s for my tty driver.
Xrs232.c:
X WARNING: These changes are half-hearted since I usually use the
X rs232.c posted with my tty driver.
X This one remains full of bugs, mostly old but it's hard to tell.
X o Added lock()'s after calling interrupt() since new interrupt()
X may unlock().
X o Eliminated segment arithmetic as for console.c.
X o Fix attempted lock() around whole system call in tty_o_done().
X The new syscall handler unlocks, so a safer lock is required.
X o Added glue routines to match new interrupt handling.
Xsystem.c:
X o Added SYS_GBOOT, SYS_UMAP and SYS_MEM system calls.
X SYS_GBOOT to pass boot parameters to FS.
X SYS_UMAP and SYS_MEM to replace improper memory handling in FS
X and MM.
X o Changed references to registers in process table.
X WARNING: the types used by MM to share the stack pointer and
X signal catcher are bogus.
X There is only a conventional relationship between C pointers
X and machine registers.
X o Made many small changes to use register pointers more and eliminate
X local variables.
X o Locked access to user and system times in do_exec() and do_times().
X This is necessary because these times are now updated below the
X task level in the clock interrupt handler.
X o Changed do_fork(), do_exec(), do_sig() and cause_sig() as part
X of fix of signal handling bug.
X Processes undergoing signal handling are now kept off the ready
X queue by the SIG_PENDING flag and the p_pendcount count.
X MM has to send a message to say it is finished.
X A kludged form of SYS_SIG is used.
X o Called lockpick_proc() from inform() to run MM soon if inform()
X was invoked by an exception in a user process.
X o Added alloc_segments().
X All segment register setup is now done here.
X This is the only place in the old C code which is fundamentally
X different for protected mode.
Xtable.c:
X o Added IDLE task.
X o Moved declaration of kernel stack to assembler code.
X o Used a char array to allocate task stacks out of.
X The int array is only a kludge for word alignment and complicates
X the arithmetic in main.c and is inadequate for doubleword
X alignment for 386's.
Xtty.c:
X WARNING: These changes are half-hearted since I usually use the
X tty.c posted with my tty driver.
X There a few known bugs in tty, but it's probably safe to use it
X with the console driver (but not RS232).
X o Avoided getting the tty_driver_buf pointer out of the interrupt
X message since the new interrupt messages can have no content.
Xxt_wini.c:
X o Deleted all explicit locking, changed win_results().
X Same as for at_wini.c
X o Fixed the misspelled copy_param.
X This bug has been known for years.
X o Wrapped some code with #ifdef STUPID_WINI_ADJUST, as for at_wini.c.
END_OF_FILE
if test 13586 -ne `wc -c <'kerneldif/CHANGES'`; then
echo shar: \"'kerneldif/CHANGES'\" unpacked with wrong size!
fi
# end of 'kerneldif/CHANGES'
fi
if test -f 'fsdif/cache.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'fsdif/cache.c.cdif'\"
else
echo shar: Extracting \"'fsdif/cache.c.cdif'\" \(629 characters\)
sed "s/^X//" >'fsdif/cache.c.cdif' <<'END_OF_FILE'
X*** fs-1.3/cache.c Wed Aug 3 21:05:10 1988
X--- fs/cache.c Thu Jul 7 00:53:11 1988
X***************
X*** 17,18 ****
X--- 17,19 ----
X #include "../h/error.h"
X+ #include "../h/boot.h"
X #include "const.h"
X***************
X*** 212,217 ****
X minor = (int) (sp->s_dev >> MINOR) & BYTE;
X! if (sp->s_dev == ROOT_DEV)
X! printf("No space on root device (RAM disk)\n");
X! else
X! printf("No space on device %d/%d\n", major, minor);
X return(NO_ZONE);
X--- 213,216 ----
X minor = (int) (sp->s_dev >> MINOR) & BYTE;
X! printf("No space on %sdevice %d/%d\n",
X! sp->s_dev == ROOT_DEV ? "root " : "", major, minor);
X return(NO_ZONE);
END_OF_FILE
if test 629 -ne `wc -c <'fsdif/cache.c.cdif'`; then
echo shar: \"'fsdif/cache.c.cdif'\" unpacked with wrong size!
fi
# end of 'fsdif/cache.c.cdif'
fi
if test -f 'fsdif/inode.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'fsdif/inode.c.cdif'\"
else
echo shar: Extracting \"'fsdif/inode.c.cdif'\" \(651 characters\)
sed "s/^X//" >'fsdif/inode.c.cdif' <<'END_OF_FILE'
X*** fs-1.3/inode.c Thu Oct 6 22:19:28 1988
X--- fs/inode.c Fri Oct 7 22:28:02 1988
X***************
X*** 17,18 ****
X--- 17,19 ----
X #include "../h/error.h"
X+ #include "../h/boot.h"
X #include "const.h"
X***************
X*** 118,123 ****
X minor = (int) (sp->s_dev >> MINOR) & BYTE;
X! if (sp->s_dev == ROOT_DEV)
X! printf("Out of i-nodes on root device (RAM disk)\n");
X! else
X! printf("Out of i-nodes on device %d/%d\n", major, minor);
X return(NIL_INODE);
X--- 119,122 ----
X minor = (int) (sp->s_dev >> MINOR) & BYTE;
X! printf("Out of i-nodes on %sdevice %d/%d\n",
X! sp->s_dev == ROOT_DEV ? "root " : "", major, minor);
X return(NIL_INODE);
END_OF_FILE
if test 651 -ne `wc -c <'fsdif/inode.c.cdif'`; then
echo shar: \"'fsdif/inode.c.cdif'\" unpacked with wrong size!
fi
# end of 'fsdif/inode.c.cdif'
fi
if test -f 'fsdif/main.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'fsdif/main.c.cdif'\"
else
echo shar: Extracting \"'fsdif/main.c.cdif'\" \(7501 characters\)
sed "s/^X//" >'fsdif/main.c.cdif' <<'END_OF_FILE'
X*** fs-1.3/main.c Thu Oct 6 22:25:19 1988
X--- fs/main.c Wed Mar 22 15:15:27 1989
X***************
X*** 19,20 ****
X--- 19,21 ----
X #include "../h/error.h"
X+ #include "../h/boot.h"
X #include "const.h"
X***************
X*** 39,42 ****
X #ifdef i8088
X! #define EM_ORIGIN 0x100000 /* origin of extended memory RAM disk on AT */
X! #define MAX_CRD 255 /* if root fs > MAX_CRD, use extended mem */
X #endif
X--- 40,42 ----
X #ifdef i8088
X! FORWARD phys_bytes get_physbase();
X #endif
X***************
X*** 143,145 ****
X buf_pool(); /* initialize buffer pool */
X! load_ram(); /* Load RAM disk from root diskette. */
X load_super(); /* Load super block for root device */
X--- 143,146 ----
X buf_pool(); /* initialize buffer pool */
X! get_boot_parameters();
X! load_ram(); /* init RAM disk, load if it is root */
X load_super(); /* Load super block for root device */
X***************
X*** 184,186 ****
X phys_bytes org;
X- extern phys_clicks get_base();
X #endif
X--- 185,186 ----
X***************
X*** 203,205 ****
X for (bp = &buf[0]; bp < &buf[NR_BUFS]; bp++) {
X! org = get_base() << CLICK_SHIFT; /* phys addr where FS is */
X low_off = (vir_bytes) bp->b_data;
X--- 203,205 ----
X for (bp = &buf[0]; bp < &buf[NR_BUFS]; bp++) {
X! org = get_physbase(); /* phys addr where FS is */
X low_off = (vir_bytes) bp->b_data;
X***************
X*** 232,235 ****
X {
X! /* The root diskette contains a block-by-block image of the root file system
X! * starting at 0. Go get it and copy it to the RAM disk.
X */
X--- 232,236 ----
X {
X! /* If the root device is the RAM disk, copy the entire root image device
X! * block-by-block to a RAM disk with the same size as the image.
X! * Otherwise, just allocate a RAM disk with size given in the boot parameters.
X */
X***************
X*** 241,245 ****
X block_nr i;
X! dev_nr root_device;
X phys_clicks ram_clicks, init_org, init_text_clicks, init_data_clicks;
X- long base;
X extern phys_clicks data_org[INFO + 2];
X--- 242,245 ----
X block_nr i;
X! dev_nr root_device; /* this should be called boot_device */
X phys_clicks ram_clicks, init_org, init_text_clicks, init_data_clicks;
X extern phys_clicks data_org[INFO + 2];
X***************
X*** 251,255 ****
X init_data_clicks = data_org[INFO + 2];
X- base = (long) init_org + (long) init_text_clicks + (long) init_data_clicks;
X- base = base << CLICK_SHIFT;
X
X /* Get size of RAM disk by reading root file system's super block.
X--- 251,259 ----
X init_data_clicks = data_org[INFO + 2];
X
X+ /* If the root device is specified in the boot parameters, use it. */
X+ if (ROOT_DEV != DEV_RAM) {
X+ count = boot_parameters.bp_ramsize;
X+ goto got_root_dev; /* kludge to avoid excessive indent/diffs */
X+ }
X+
X /* Get size of RAM disk by reading root file system's super block.
X***************
X*** 279,297 ****
X count = sp->s_nzones << sp->s_log_zone_size; /* # blocks on root dev */
X if (count > MAX_RAM) panic("RAM disk is too big. # blocks = ", count);
X ram_clicks = count * (BLOCK_SIZE/CLICK_SIZE);
X- put_block(bp, FULL_DATA_BLOCK);
X
X- #ifdef i8088
X- /* There are two possibilities now (by convention):
X- * count < MAX_CRD ==> RAM disk is in core
X- * count >=MAX_CRD ==> RAM disk is in extended memory (AT only)
X- * In the latter case, tell MM that RAM disk size is 0 and tell the ram disk
X- * driver than the device begins at 1MB.
X- */
X- if (count > MAX_CRD) {
X- ram_clicks = 0; /* MM does not have to allocate any core */
X- base = EM_ORIGIN; /* tell RAM disk driver RAM disk origin */
X- }
X- #endif
X-
X /* Tell MM the origin and size of INIT, and the amount of memory used for the
X--- 283,289 ----
X count = sp->s_nzones << sp->s_log_zone_size; /* # blocks on root dev */
X+ put_block(bp, FULL_DATA_BLOCK);
X+ got_root_dev:
X if (count > MAX_RAM) panic("RAM disk is too big. # blocks = ", count);
X ram_clicks = count * (BLOCK_SIZE/CLICK_SIZE);
X
X /* Tell MM the origin and size of INIT, and the amount of memory used for the
X***************
X*** 310,315 ****
X
X! /* Tell RAM driver where RAM disk is and how big it is. */
X m1.m_type = DISK_IOCTL;
X m1.DEVICE = RAM_DEV;
X- m1.POSITION = base;
X m1.COUNT = count;
X--- 302,308 ----
X
X! /* Tell RAM driver where RAM disk is and how big it is. The BRK2 call has
X! * filled in the m1.POSITION field.
X! */
X m1.m_type = DISK_IOCTL;
X m1.DEVICE = RAM_DEV;
X m1.COUNT = count;
X***************
X*** 317,325 ****
X
X /* Copy the blocks one at a time from the root diskette to the RAM */
X- #ifdef i8088
X- if (ram_clicks == 0)
X- printf("RAM disk of %d blocks is in extended memory\n\n", count);
X- #endif
X #ifdef FASTLOAD
X! fastload(root_device, (char *)base);
X #else
X--- 310,318 ----
X
X+ /* If the root device is not the RAM disk, it doesn't need loading. */
X+ if (ROOT_DEV != DEV_RAM)
X+ return;
X+
X /* Copy the blocks one at a time from the root diskette to the RAM */
X #ifdef FASTLOAD
X! fastload(root_device, (char *) m1.POSITION); /* assumes 32 bit pointers */
X #else
X***************
X*** 327,328 ****
X--- 320,341 ----
X for (i = 0; i < count; i++) {
X+ /* Prefetch blocks into cache according to interleave.
X+ * The floppy driver should be rewritten to do this and should attain
X+ * an interleave of 1 even on slow PC's.
X+ * Here we can only handle interleave > 1.
X+ * 2 is good for AT's, but nothing seems to help PC's.
X+ * Assume standard DOS format with interleave of 1.
X+ */
X+ #define N_PREFETCH 11 /* prime > blocks/track on all floppy types */
X+ #define INTERLEAVE 2
X+ if (i % N_PREFETCH == 0) {
X+ int j, k;
X+
X+ for (k = j = 0; j < N_PREFETCH; ++j, k += INTERLEAVE) {
X+ if (k > N_PREFETCH)
X+ k -= N_PREFETCH;
X+ if (i + k < count)
X+ put_block(get_block(root_device, i + k,
X+ NORMAL), NORMAL);
X+ }
X+ }
X bp = get_block(root_device, (block_nr) i, NORMAL);
X***************
X*** 338,340 ****
X
X! if (root_device == BOOT_DEV)
X printf("\rRAM disk loaded. Please remove root diskette. \n\n");
X--- 351,353 ----
X
X! if ( ((root_device ^ DEV_FD0) & ~BYTE) == 0 )
X printf("\rRAM disk loaded. Please remove root diskette. \n\n");
X***************
X*** 506 ****
X--- 519,559 ----
X #endif FASTLOAD
X+
X+ /*===========================================================================*
X+ * get_boot_parameters *
X+ *===========================================================================*/
X+ PUBLIC struct bparam_s boot_parameters = /* overwritten if new kernel */
X+ {
X+ DROOTDEV, DRAMIMAGEDEV, DRAMSIZE, DSCANCODE,
X+ };
X+
X+ PRIVATE get_boot_parameters()
X+ {
X+ /* Ask kernel for boot parameters. */
X+
X+ struct bparam_s temp_parameters;
X+
X+ m1.m_type = SYS_GBOOT;
X+ m1.PROC1 = FS_PROC_NR;
X+ m1.MEM_PTR = (char *) &temp_parameters;
X+ if (sendrec(SYSTASK, &m1) == OK && m1.m_type == OK)
X+ boot_parameters = temp_parameters;
X+ }
X+
X+ #ifdef i8088
X+ /*===========================================================================*
X+ * get_physbase *
X+ *===========================================================================*/
X+ PRIVATE phys_bytes get_physbase()
X+ {
X+ /* Ask kernel for base of fs data space. */
X+
X+ m1.m_type = SYS_UMAP;
X+ m1.SRC_PROC_NR = FS_PROC_NR;
X+ m1.SRC_SPACE = D;
X+ m1.SRC_BUFFER = 0;
X+ m1.COPY_BYTES = 1;
X+ if (sendrec(SYSTASK, &m1) != OK || m1.SRC_BUFFER == 0)
X+ panic("Can't get fs base", NO_NUM);
X+ return m1.SRC_BUFFER;
X+ }
X+ #endif
END_OF_FILE
if test 7501 -ne `wc -c <'fsdif/main.c.cdif'`; then
echo shar: \"'fsdif/main.c.cdif'\" unpacked with wrong size!
fi
# end of 'fsdif/main.c.cdif'
fi
if test -f 'fsdif/misc.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'fsdif/misc.c.cdif'\"
else
echo shar: Extracting \"'fsdif/misc.c.cdif'\" \(200 characters\)
sed "s/^X//" >'fsdif/misc.c.cdif' <<'END_OF_FILE'
X*** fs-1.3/misc.c Wed Aug 3 21:05:13 1988
X--- fs/misc.c Thu Jul 7 02:14:48 1988
X***************
X*** 18,19 ****
X--- 18,20 ----
X #include "../h/error.h"
X+ #include "../h/boot.h"
X #include "const.h"
END_OF_FILE
if test 200 -ne `wc -c <'fsdif/misc.c.cdif'`; then
echo shar: \"'fsdif/misc.c.cdif'\" unpacked with wrong size!
fi
# end of 'fsdif/misc.c.cdif'
fi
if test -f 'fsdif/pipe.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'fsdif/pipe.c.cdif'\"
else
echo shar: Extracting \"'fsdif/pipe.c.cdif'\" \(733 characters\)
sed "s/^X//" >'fsdif/pipe.c.cdif' <<'END_OF_FILE'
X*** fs-1.3/pipe.c Wed Aug 3 21:05:15 1988
X--- fs/pipe.c Wed Oct 26 21:08:12 1988
X***************
X*** 23,24 ****
X--- 23,25 ----
X #include "type.h"
X+ #include "dev.h"
X #include "file.h"
X***************
X*** 247,251 ****
X mess.PROC_NR = proc_nr;
X! mess.COUNT = f->filp_mode; /* tell kernel whether R or W */
X mess.m_type = CANCEL;
X! rw_dev(task, &mess);
X revive(proc_nr, EINTR); /* signal interrupted call */
X--- 248,253 ----
X mess.PROC_NR = proc_nr;
X! /* Tell kernel whether R or W. Mode is from current call, not open. */
X! mess.COUNT = (rfp->fp_fd & BYTE) == READ ? R_BIT : W_BIT;
X mess.m_type = CANCEL;
X! (*dmap[(dev >> MAJOR) & BYTE].dmap_rw)(task, &mess);
X revive(proc_nr, EINTR); /* signal interrupted call */
END_OF_FILE
if test 733 -ne `wc -c <'fsdif/pipe.c.cdif'`; then
echo shar: \"'fsdif/pipe.c.cdif'\" unpacked with wrong size!
fi
# end of 'fsdif/pipe.c.cdif'
fi
if test -f 'fsdif/super.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'fsdif/super.c.cdif'\"
else
echo shar: Extracting \"'fsdif/super.c.cdif'\" \(202 characters\)
sed "s/^X//" >'fsdif/super.c.cdif' <<'END_OF_FILE'
X*** fs-1.3/super.c Wed Aug 3 21:05:17 1988
X--- fs/super.c Wed Feb 15 02:12:27 1989
X***************
X*** 19,20 ****
X--- 19,21 ----
X #include "../h/error.h"
X+ #include "../h/boot.h"
X #include "const.h"
END_OF_FILE
if test 202 -ne `wc -c <'fsdif/super.c.cdif'`; then
echo shar: \"'fsdif/super.c.cdif'\" unpacked with wrong size!
fi
# end of 'fsdif/super.c.cdif'
fi
if test -f 'fsdif/table.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'fsdif/table.c.cdif'\"
else
echo shar: Extracting \"'fsdif/table.c.cdif'\" \(596 characters\)
sed "s/^X//" >'fsdif/table.c.cdif' <<'END_OF_FILE'
X*** fs-1.3/table.c Wed Aug 3 21:05:17 1988
X--- fs/table.c Sat Oct 22 22:08:16 1988
X***************
X*** 117,119 ****
X * next entry is major device 1, etc. Character and block devices can be
X! * intermixed at random. If this ordering is changed, BOOT_DEV and ROOT_DEV
X * must be changed to correspond to the new values. Note that the major
X--- 117,119 ----
X * next entry is major device 1, etc. Character and block devices can be
X! * intermixed at random. If this ordering is changed, the devices in h/boot.h
X * must be changed to correspond to the new values. Note that the major
END_OF_FILE
if test 596 -ne `wc -c <'fsdif/table.c.cdif'`; then
echo shar: \"'fsdif/table.c.cdif'\" unpacked with wrong size!
fi
# end of 'fsdif/table.c.cdif'
fi
if test -f 'fsdif/utility.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'fsdif/utility.c.cdif'\"
else
echo shar: Extracting \"'fsdif/utility.c.cdif'\" \(206 characters\)
sed "s/^X//" >'fsdif/utility.c.cdif' <<'END_OF_FILE'
X*** fs-1.3/utility.c Wed Aug 3 21:05:18 1988
X--- fs/utility.c Wed Feb 15 02:09:50 1989
X***************
X*** 15,16 ****
X--- 15,17 ----
X #include "../h/error.h"
X+ #include "../h/boot.h"
X #include "const.h"
END_OF_FILE
if test 206 -ne `wc -c <'fsdif/utility.c.cdif'`; then
echo shar: \"'fsdif/utility.c.cdif'\" unpacked with wrong size!
fi
# end of 'fsdif/utility.c.cdif'
fi
if test -f 'hdif/boot.h.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'hdif/boot.h.cdif'\"
else
echo shar: Extracting \"'hdif/boot.h.cdif'\" \(1346 characters\)
sed "s/^X//" >'hdif/boot.h.cdif' <<'END_OF_FILE'
X*** /dev/null Thu Oct 13 22:40:42 1988
X--- h/boot.h Wed Mar 1 14:26:46 1989
X***************
X*** 0 ****
X--- 1,43 ----
X+ /* boot.h */
X+
X+ /* Redefine root and root image devices as variables.
X+ * This keeps the diffs small but may cause future confusion.
X+ */
X+ #define BOOT_DEV (boot_parameters.bp_ramimagedev)
X+ #define ROOT_DEV (boot_parameters.bp_rootdev)
X+
X+ /* Device numbers of RAM, floppy and hard disk devices.
X+ * h/com.h defines RAM_DEV but only as the minor number.
X+ */
X+ #define DEV_FD0 0x200
X+ #define DEV_HD0 0x300
X+ #define DEV_RAM 0x100
X+
X+ /* Default device numbers for root and root image.
X+ * Root image is only used when root is /dev/ram.
X+ */
X+ #define DRAMIMAGEDEV (DEV_FD0 + 0)
X+ #define DROOTDEV (DEV_RAM + 0)
X+
X+ /* Default RAM disk size.
X+ * Not used if root is /dev/ram when size is from root image.
X+ */
X+ #define DRAMSIZE 0
X+
X+ /* Default scan code to fake a PC keyboard. */
X+ #define DSCANCODE 13
X+
X+ /* Default processor type for no restriction (88 would force 386 to 88). */
X+ #define DPROCESSOR 0xFFFF
X+
X+ /* Structure to hold boot parameters. */
X+ struct bparam_s
X+ {
X+ dev_nr bp_rootdev;
X+ dev_nr bp_ramimagedev;
X+ unsigned bp_ramsize;
X+ unsigned bp_scancode; /* still put into BX for kernel */
X+ unsigned bp_processor;
X+ };
X+
X+ extern struct bparam_s boot_parameters;
END_OF_FILE
if test 1346 -ne `wc -c <'hdif/boot.h.cdif'`; then
echo shar: \"'hdif/boot.h.cdif'\" unpacked with wrong size!
fi
# end of 'hdif/boot.h.cdif'
fi
if test -f 'hdif/com.h.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'hdif/com.h.cdif'\"
else
echo shar: Extracting \"'hdif/com.h.cdif'\" \(1355 characters\)
sed "s/^X//" >'hdif/com.h.cdif' <<'END_OF_FILE'
X*** h-1.3/com.h Wed Aug 3 21:15:03 1988
X--- h/com.h Thu Mar 23 01:39:55 1989
X***************
X*** 50,51 ****
X--- 50,53 ----
X
X+ #define IDLE (AMOEBA_CLASS+1) /* task to run when there's nothing to run */
X+
X #define PRINTER -7 /* printer I/O class */
X***************
X*** 55,57 ****
X #define FLOPPY -5 /* floppy disk class */
X- # define DISKINT 1 /* fcn code for disk interrupt */
X # define DISK_READ 3 /* fcn code to DISK (must equal TTY_READ) */
X--- 57,58 ----
X***************
X*** 65,66 ****
X--- 66,70 ----
X # define NULL_DEV 3 /* minor device for /dev/null */
X+ #ifdef i8088
X+ # define PORT_DEV 4 /* minor device for /dev/port */
X+ #endif
X
X***************
X*** 68,70 ****
X # define SET_ALARM 1 /* fcn code to CLOCK, set up alarm */
X- # define CLOCK_TICK 2 /* fcn code for clock tick */
X # define GET_TIME 3 /* fcn code to CLOCK, get real time */
X--- 72,73 ----
X***************
X*** 85,86 ****
X--- 88,92 ----
X # define SYS_KILL 11 /* fcn code for sys_kill(proc, sig) */
X+ # define SYS_GBOOT 12 /* fcn code for sys_gboot(procno, bootptr) */
X+ # define SYS_UMAP 13 /* fcn code for sys_umap(procno, etc) */
X+ # define SYS_MEM 14 /* fcn code for sys_mem() */
X
X***************
X*** 154 ****
X--- 160,162 ----
X #endif AMOEBA
X+
X+ #define HARD_INT 2 /* fcn code for all hardware interrupts */
END_OF_FILE
if test 1355 -ne `wc -c <'hdif/com.h.cdif'`; then
echo shar: \"'hdif/com.h.cdif'\" unpacked with wrong size!
fi
# end of 'hdif/com.h.cdif'
fi
if test -f 'hdif/const.h.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'hdif/const.h.cdif'\"
else
echo shar: Extracting \"'hdif/const.h.cdif'\" \(1785 characters\)
sed "s/^X//" >'hdif/const.h.cdif' <<'END_OF_FILE'
X*** h-1.3/const.h Thu Oct 6 03:32:57 1988
X--- h/const.h Wed Jan 18 23:13:40 1989
X***************
X*** 31,37 ****
X #ifdef AM_KERNEL
X! #define NR_TASKS 13 /* must be 5 more than without amoeba */
X #else
X! #define NR_TASKS 8 /* number of tasks in the transfer vector */
X #endif
X! #define NR_PROCS 16 /* number of slots in proc table */
X #define NR_SEGS 3 /* # segments per process */
X--- 31,37 ----
X #ifdef AM_KERNEL
X! #define NR_TASKS 14 /* must be 5 more than without amoeba */
X #else
X! #define NR_TASKS 9 /* number of tasks in the transfer vector */
X #endif
X! #define NR_PROCS 32 /* number of slots in proc table */
X #define NR_SEGS 3 /* # segments per process */
X***************
X*** 45,48 ****
X #ifdef i8088
X! #define CLICK_SIZE 0020 /* unit in which memory is allocated */
X! #define CLICK_SHIFT 4 /* log2 of CLICK_SIZE */
X #endif
X--- 45,48 ----
X #ifdef i8088
X! #define CLICK_SIZE 256 /* unit in which memory is allocated */
X! #define CLICK_SHIFT 8 /* log2 of CLICK_SIZE */
X #endif
X***************
X*** 53,54 ****
X--- 53,62 ----
X
X+ #define click_to_round_k(n) \
X+ ((unsigned) ((((unsigned long) (n) << CLICK_SHIFT) + 512) / 1024))
X+ #if CLICK_SIZE < 1024
X+ #define k_to_click(n) ((n) * (1024 / CLICK_SIZE))
X+ #else
X+ #define k_to_click(n) ((n) / (CLICK_SIZE / 1024))
X+ #endif
X+
X /* Process numbers of some important processes */
X***************
X*** 77,82 ****
X #define MAX_ISTACK_BYTES 2048 /* maximum initial stack size for EXEC */
X-
X- /* Device numbers of root (RAM) and boot (fd0) devices. */
X- #define ROOT_DEV (dev_nr) 256 /* major-minor device number of root dev */
X- #define BOOT_DEV (dev_nr) 512 /* major-minor device number of boot diskette */
X
X--- 85,86 ----
END_OF_FILE
if test 1785 -ne `wc -c <'hdif/const.h.cdif'`; then
echo shar: \"'hdif/const.h.cdif'\" unpacked with wrong size!
fi
# end of 'hdif/const.h.cdif'
fi
if test -f 'kerneldif/Bconsole.c.cdi' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'kerneldif/Bconsole.c.cdi'\"
else
echo shar: Extracting \"'kerneldif/Bconsole.c.cdi'\" \(7608 characters\)
sed "s/^X//" >'kerneldif/Bconsole.c.cdi' <<'END_OF_FILE'
X*** kernel-1.3B/console.c Mon Jan 2 03:07:19 1989
X--- kernel/console.c Sun Mar 12 15:29:17 1989
X***************
X*** 13,14 ****
X--- 13,15 ----
X #include "proc.h"
X+ #include "protect.h"
X #include "tty.h"
X***************
X*** 20,23 ****
X /* Definitions used by the console driver. */
X- #define COLOR_BASE 0xB800 /* video ram paragraph for color display */
X- #define MONO_BASE 0xB000 /* video ram address for mono display */
X #define C_VID_MASK 0x3FFF /* mask for 16K video RAM */
X--- 21,22 ----
X***************
X*** 164,165 ****
X--- 163,169 ----
X
X+ #ifdef DEBUGGER
X+ /* Call debugger? (as early as practical, not in TTY which may be hung) */
X+ if (code == F10) db();
X+ #endif
X+
X /* Store the character in memory so the task can get at it later. */
X***************
X*** 168,170 ****
X if (kb->iptr < kb->ibufend) {
X! tty_events += EVENT_THRESHOLD;
X ++kb->iptr;
X--- 172,176 ----
X if (kb->iptr < kb->ibufend) {
X! lock(); /* protect shared variable */
X! tty_events += EVENT_THRESHOLD; /* C doesn't guarantee atomic */
X! unlock();
X ++kb->iptr;
X***************
X*** 275,276 ****
X--- 281,285 ----
X
X+ if ( c >= ' ' )
X+ goto into_slow_switch;
X+
X switch(c) {
X***************
X*** 329,330 ****
X--- 338,340 ----
X default: /* printable chars are stored in ramqueue */
X+ into_slow_switch:
X #ifndef LINEWRAP
X***************
X*** 825,826 ****
X--- 835,837 ----
X */
X+ #if 0
X port_out(vid_port + INDEX, reg); /* set the index register */
X***************
X*** 829,830 ****
X--- 840,844 ----
X port_out(vid_port + DATA, val&BYTE); /* output low byte */
X+ #else
X+ porti_out(vid_port + INDEX, (reg + 1) | (reg << 8), val);
X+ #endif
X }
X***************
X*** 933,935 ****
X if (color) {
X! vid_base = COLOR_BASE;
X vid_mask = C_VID_MASK;
X--- 947,949 ----
X if (color) {
X! vid_base = COLOR_BASE >> HCLICK_SHIFT;
X vid_mask = C_VID_MASK;
X***************
X*** 938,940 ****
X } else {
X! vid_base = MONO_BASE;
X vid_mask = M_VID_MASK;
X--- 952,954 ----
X } else {
X! vid_base = MONO_BASE >> HCLICK_SHIFT;
X vid_mask = M_VID_MASK;
X***************
X*** 949,950 ****
X--- 963,969 ----
X
X+ #ifdef i80286
X+ if (processor >= 286)
X+ vid_base = color ? COLOR_SELECTOR : MONO_SELECTOR;
X+ #endif
X+
X set_6845(CUR_SIZE, CURSOR_SHAPE); /* set cursor shape */
X***************
X*** 971,972 ****
X--- 990,992 ----
X
X+ scan_keyboard(); /* stop lockup from leftover keystroke */
X set_leds(); /* don't accept BIOS state */
X***************
X*** 1024,1025 ****
X--- 1044,1046 ----
X
X+ #ifndef DEBUGGER
X /*===========================================================================*
X***************
X*** 1038,1039 ****
X--- 1059,1061 ----
X }
X+ #endif /* DEBUGGER - putc() */
X
X***************
X*** 1070 ****
X--- 1092,1234 ----
X }
X+
X+
X+ /****************************************************************************/
X+
X+
X+ /* Bug fix for keyboard initialization. */
X+
X+ #ifndef DEBUGGER /* debugger already has it */
X+ /*==========================================================================*
X+ * scan_keyboard *
X+ *==========================================================================*/
X+ PUBLIC int scan_keyboard()
X+ {
X+ /* Fetch the character from the keyboard hardware and acknowledge it.
X+ * Code extracted from keyboard(). Keyboard() should call it instead.
X+ */
X+
X+ int code;
X+ int val;
X+
X+ port_in(KEYBD, &code); /* get the scan code for the key struck */
X+ port_in(PORT_B, &val); /* strobe the keyboard to ack the char */
X+ port_out(PORT_B, val | KBIT); /* strobe the bit high */
X+ port_out(PORT_B, val); /* now strobe it low */
X+ return code;
X+ }
X+ #endif /* DEBUGGER false - scan_keyboard() */
X+
X+
X+ /****************************************************************************/
X+
X+
X+ /* debugger hooks */
X+
X+ #ifdef DEBUGGER /* CONSOLE <--> debugger glue routines */
X+ /*==========================================================================*
X+ * kputc *
X+ *==========================================================================*/
X+ PUBLIC void kputc(c)
X+ int c;
X+ {
X+ out_char(&tty_struct[0], c);
X+ }
X+
X+
X+ typedef void (*pfv_t)(); /* helps broken compilers */
X+ PRIVATE pfv_t putc_func = kputc; /* swapped when debugger is active */
X+
X+
X+ /*==========================================================================*
X+ * putc *
X+ *==========================================================================*/
X+ PUBLIC void putc(c)
X+ int c;
X+ {
X+ /* Make putc() variable so dmp.c routines can be used by debugger. */
X+ (*putc_func)(c);
X+ }
X+
X+
X+ /* Db needs private tty variables since some hardware regs are write-only.
X+ * Use standard BIOS data area to communicate so db works on DOS too.
X+ */
X+
X+ #define BIOS_DATA_SEG 0x40 /* click */
X+ #define ACTIVE_PAGE 0x62 /* offset to unsigned char */
X+ #define ADDR_6845 0x63 /* offset to port_t (2 bytes) */
X+ #define CRT_COLS 0x4A /* offset to unsigned */
X+ #define CRT_LEN 0x4C /* offset to unsigned char */
X+ #define CRT_MODE 0x49 /* offset to unsigned char */
X+ #define CRT_MODE_SET 0x65 /* offset to unsigned char */
X+ #define CRT_START 0x4E /* offset to screenptr_t (2 bytes) */
X+ #define CURSOR_MODE 0x60 /* offset to unsigned */
X+ #define CRT_PALETTE 0x66 /* offset to unsigned char */
X+ #define CURSOR_POSN 0x50 /* offset to screenptr_t [8] */
X+
X+ #define KB_FLAG 0x17 /* offset to unsigned char */
X+ #define CAPS_SH 6 /* shifts for some state bits */
X+ #define NUM_SH 5
X+ #define SCROL_SH 4
X+ #define KB_FLAG_1 0x18 /* offset to unsigned char */
X+
X+
X+ /*==========================================================================*
X+ * get_kbd_state *
X+ *==========================================================================*/
X+ PUBLIC void get_kbd_state()
X+ {
X+ if ( vid_port != 0 )
X+ pokew( BIOS_DATA_SEG, KB_FLAG, (numlock<<NUM_SH) | (capslock<<CAPS_SH) );
X+ }
X+
X+
X+ /*==========================================================================*
X+ * get_scr_state *
X+ *==========================================================================*/
X+ PUBLIC void get_scr_state()
X+ {
X+ if ( vid_port != 0 ) /* console (just about) all initialized */
X+ {
X+ pokeb( BIOS_DATA_SEG, ACTIVE_PAGE, 0 );
X+ pokew( BIOS_DATA_SEG, ADDR_6845, vid_port );
X+ pokew( BIOS_DATA_SEG, CRT_COLS, LINE_WIDTH );
X+ pokeb( BIOS_DATA_SEG, CRT_MODE, color ? 3 : 7 );
X+ pokew( BIOS_DATA_SEG, CRT_START, tty_struct[0].tty_org );
X+ pokew( BIOS_DATA_SEG, CURSOR_MODE, CURSOR_SHAPE);
X+ pokew( BIOS_DATA_SEG, CURSOR_POSN + 0,
X+ tty_struct[0].tty_column | (tty_struct[0].tty_row << 8) );
X+ }
X+ }
X+
X+
X+ /*==========================================================================*
X+ * reset_kbd_state *
X+ *==========================================================================*/
X+ PUBLIC void reset_kbd_state()
X+ {
X+ control = alt = FALSE;
X+ if ( vid_port != 0 )
X+ set_leds();
X+ }
X+
X+
X+ /*==========================================================================*
X+ * set_db_putc *
X+ *==========================================================================*/
X+ PUBLIC void set_db_putc()
X+ {
X+ extern void outbyte();
X+
X+ putc_func = outbyte;
X+ }
X+
X+
X+ /*==========================================================================*
X+ * set_ker_putc *
X+ *==========================================================================*/
X+ PUBLIC void set_ker_putc()
X+ {
X+ putc_func = kputc;
X+ }
X+ #endif /* DEBUGGER - glue routines */
END_OF_FILE
if test 7608 -ne `wc -c <'kerneldif/Bconsole.c.cdi'`; then
echo shar: \"'kerneldif/Bconsole.c.cdi'\" unpacked with wrong size!
fi
# end of 'kerneldif/Bconsole.c.cdi'
fi
if test -f 'kerneldif/Brs232.c.cdif' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'kerneldif/Brs232.c.cdif'\"
else
echo shar: Extracting \"'kerneldif/Brs232.c.cdif'\" \(314 characters\)
sed "s/^X//" >'kerneldif/Brs232.c.cdif' <<'END_OF_FILE'
X*** kernel-1.3B/rs232.c Sat Dec 31 05:43:21 1988
X--- kernel/rs232.c Sat Mar 11 19:51:54 1989
X***************
X*** 669,671 ****
X--- 669,673 ----
X rs->ostate ^= (ODONE | OQUEUED); /* ODONE on, OQUEUED off */
X+ unlock(); /* safe, for complicated reasons */
X tty_wakeup();
X+ lock();
X }
END_OF_FILE
if test 314 -ne `wc -c <'kerneldif/Brs232.c.cdif'`; then
echo shar: \"'kerneldif/Brs232.c.cdif'\" unpacked with wrong size!
fi
# end of 'kerneldif/Brs232.c.cdif'
fi
echo shar: End of archive 2 \(of 10\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 10 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Division of Information Technology (Melbourne), Phone +61 3 347 8644
C.S.I.R.O. Fax +61 3 347 8987
55 Barry St. Telex AA 152914
Carlton, Vic, 3053, Australia E-mail: worsley@ditmela.oz.au