[comp.os.minix] Protected mode MINIX for 80286 Part 8 - By Bruce Evans

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 8 (of 10)."
# Contents:  kerneldif/protect.c.cdif kerneldif/rs2.x.cdif
#   kerneldif/rs232.c.cdif kerneldif/sconst.h.cdif
#   kerneldif/sglo.h.cdif kerneldif/xt_wini.c.cdif libdif/head.s.cdif
#   toolsdif/fsck1.s.cdif
# Wrapped by sys@besplex on Sun Mar 26 06:34:29 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'kerneldif/protect.c.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'kerneldif/protect.c.cdif'\"
else
echo shar: Extracting \"'kerneldif/protect.c.cdif'\" \(9757 characters\)
sed "s/^X//" >'kerneldif/protect.c.cdif' <<'END_OF_FILE'
X*** /dev/null	Thu Oct 13 22:40:42 1988
X--- kernel/protect.c	Fri Mar 24 01:58:15 1989
X***************
X*** 0 ****
X--- 1,309 ----
X+ /* This file contains most of the static initialization for protected mode
X+  * (some is done in mpx286.x), and routines to initialize the code and data
X+  * segment descriptors for new processes.
X+  */
X+ 
X+ #include "../h/const.h"
X+ #include "../h/type.h"
X+ #include "const.h"
X+ #include "type.h"
X+ #include "glo.h"
X+ #include "proc.h"
X+ #include "protect.h"
X+ 
X+ struct desctableptr_s {
X+   u16_t limit;
X+   u32_t base;			/* really u24_t + pad for 286 */
X+ };
X+ 
X+ struct gatedesc_s {
X+   u16_t offset_low;
X+   u16_t selector;
X+   u8_t pad;			/* |000|XXXXX| ig & trpg, |XXXXXXXX| task g */
X+   u8_t p_dpl_type;		/* |P|DL|0|TYPE| */
X+   u16_t reserved;
X+ };
X+ 
X+ struct tss286_s {
X+   u16_t backlink;
X+   u16_t sp0;
X+   u16_t ss0;
X+   u16_t sp1;
X+   u16_t ss1;
X+   u16_t sp2;
X+   u16_t ss2;
X+   u16_t ip;
X+   u16_t flags;
X+   u16_t ax;
X+   u16_t cx;
X+   u16_t dx;
X+   u16_t bx;
X+   u16_t sp;
X+   u16_t bp;
X+   u16_t si;
X+   u16_t di;
X+   u16_t es;
X+   u16_t cs;
X+   u16_t ss;
X+   u16_t ds;
X+   u16_t ldt;
X+ };
X+ 
X+ union tss_u {
X+   struct tss286_s t2;
X+ };
X+ 
X+ /* PRIVATE int gdt_pad = 0;	/* attempt to align gdt on long boundary */
X+ PUBLIC struct segdesc_s gdt[GDT_SIZE] = { 0, };
X+ 				/* temporary initialize it to get it in data
X+ 				 * segment for better control over alignment
X+ 				 */
X+ PRIVATE struct gatedesc_s idt[IDT_SIZE];  /* zero-init so none present */
X+ PUBLIC union tss_u tss;		/* zero init */
X+ 
X+ #ifdef DEBUGGER
X+ #define IF 0x0200
X+ PUBLIC union tss_u db_tss;	/* zero init */
X+ extern char db_stacktop[];
X+ #endif
X+ 
X+ extern void divide_error();
X+ extern void debug2_exception();
X+ extern void debug3_exception();
X+ extern void nmi();
X+ extern void breakpoint();
X+ extern void overflow();
X+ extern void bounds_check();
X+ extern void inval_opcode();
X+ extern void copr_not_available();
X+ extern void double_fault();
X+ extern void copr_seg_overrun();
X+ extern void inval_tss();
X+ extern void segment_not_present();
X+ extern void stack_exception();
X+ extern void general_protection();
X+ extern void page_fault();
X+ extern void copr_error();
X+ 
X+ extern void clock_int();
X+ extern void tty_int();
X+ extern void psecondary_int();
X+ extern void prs232_int();
X+ extern void disk_int();
X+ extern void lpr_int();
X+ extern void wini_int();
X+ 
X+ extern void p2_s_call();
X+ extern void p3_s_call();
X+ 
X+ FORWARD void sdesc();
X+ FORWARD void task_gate();
X+ 
X+ PRIVATE void int_gate( vec_nr, base, dpl_type )
X+ unsigned vec_nr;
X+ offset_t base;
X+ unsigned dpl_type;
X+ {
X+   /* Build descriptor for an interrupt gate. */
X+ 
X+   register struct gatedesc_s *idp;
X+ 
X+   idp = &idt[vec_nr];
X+   idp->offset_low = base;
X+   idp->selector = CS_SELECTOR;
X+   idp->p_dpl_type = dpl_type;
X+ }
X+ 
X+ PUBLIC void init_codeseg( segdp, base, size, privilege )
X+ register struct segdesc_s *segdp;
X+ offset_t base;
X+ offset_t size;
X+ int privilege;
X+ {
X+   /* Build descriptor for a code segment. */
X+ 
X+   sdesc( segdp, base, size );
X+   segdp->access = (privilege << DPL_SHIFT)
X+ 		| (PRESENT | SEGMENT | EXECUTABLE | READABLE);
X+ 		/* CONFORMING = 0, ACCESSED = 0 */
X+ }
X+ 
X+ PUBLIC void init_dataseg( segdp, base, size, privilege )
X+ register struct segdesc_s *segdp;
X+ offset_t base;
X+ offset_t size;
X+ int privilege;
X+ {
X+   /* Build descriptor for a data segment. */
X+ 
X+   sdesc( segdp, base, size );
X+   segdp->access = (privilege << DPL_SHIFT) | (PRESENT | SEGMENT | WRITEABLE);
X+ 		/* EXECUTABLE = 0, EXPAND_DOWN = 0, ACCESSED = 0 */
X+ }
X+ 
X+ PUBLIC void prot_init()
X+ {
X+   /* Set up tables for protected mode, even if they will not be used.
X+    * All GDT slots are allocated at compile time.
X+    */
X+ 
X+   offset_t codebase;
X+   offset_t code_bytes;
X+   offset_t database;
X+   offset_t data_bytes;
X+   int gate_nr;
X+   u8_t type3_bit;
X+   unsigned ldt_selector;
X+   register struct proc *rp;
X+ 
X+   static struct
X+   {
X+     unsigned vec_nr;
X+     void (*gate)();
X+   }
X+   gate_table[] =
X+   {
X+     DIVIDE_VECTOR, divide_error,
X+     NMI_VECTOR, nmi,
X+     OVERFLOW_VECTOR, overflow,
X+     BOUNDS_VECTOR, bounds_check,
X+     INVAL_OP_VECTOR, inval_opcode,
X+     COPROC_NOT_VECTOR, copr_not_available,
X+     DOUBLE_FAULT_VECTOR, double_fault,
X+     COPROC_SEG_VECTOR, copr_seg_overrun,
X+     INVAL_TSS_VECTOR, inval_tss,
X+     SEG_NOT_VECTOR, segment_not_present,
X+     STACK_FAULT_VECTOR, stack_exception,
X+     PROTECTION_VECTOR, general_protection,
X+     IRQ0_VECTOR + CLOCK_IRQ, clock_int,
X+     IRQ0_VECTOR + KEYBOARD_IRQ, tty_int,
X+     IRQ0_VECTOR + SECONDARY_IRQ, psecondary_int,
X+     IRQ0_VECTOR + RS232_IRQ, prs232_int,
X+     IRQ0_VECTOR + FLOPPY_IRQ, disk_int,
X+     IRQ0_VECTOR + PRINTER_IRQ, lpr_int,
X+     IRQ8_VECTOR + AT_WINI_IRQ - 8, wini_int,
X+   };
X+ 
X+   /* This is called early and can't use tables set up by main(). */
X+   codebase = (offset_t) codeseg() << HCLICK_SHIFT;
X+   database = (offset_t) dataseg() << HCLICK_SHIFT;
X+   data_bytes = (offset_t) sizes[1] << CLICK_SHIFT;
X+   if (sizes[0] == 0)
X+     code_bytes = data_bytes;	/* common I&D */
X+   else
X+     code_bytes = (offset_t) sizes[0] << CLICK_SHIFT;
X+ 
X+   /* Build temporary gdt and idt pointers in GDT where BIOS needs them. */
X+   ((struct desctableptr_s *) &gdt[GDT_INDEX])->limit = sizeof gdt - 1;
X+   ((struct desctableptr_s *) &gdt[GDT_INDEX])->base =
X+ 					       database + (offset_t) gdt;
X+   ((struct desctableptr_s *) &gdt[IDT_INDEX])->limit = sizeof idt - 1;
X+   ((struct desctableptr_s *) &gdt[IDT_INDEX])->base =
X+ 					       database + (offset_t) idt;
X+ 
X+   /* Build segment descriptors for tasks and interrupt handlers. */
X+   init_dataseg( &gdt[DS_INDEX], database, data_bytes, INTR_PRIVILEGE );
X+   init_dataseg( &gdt[ES_INDEX], database, data_bytes, INTR_PRIVILEGE );
X+   init_dataseg( &gdt[SS_INDEX], database, data_bytes, INTR_PRIVILEGE );
X+   init_codeseg( &gdt[CS_INDEX], codebase, code_bytes, INTR_PRIVILEGE );
X+ 
X+   /* Build scratch descriptors for functions in klib286. */
X+   init_dataseg( &gdt[DS_286_INDEX], (offset_t) 0, (offset_t) MAX_286_SEG_SIZE,
X+ 		TASK_PRIVILEGE );
X+   init_dataseg( &gdt[ES_286_INDEX], (offset_t) 0, (offset_t) MAX_286_SEG_SIZE,
X+ 		TASK_PRIVILEGE );
X+ 
X+   /* Build descriptors for video segments. */
X+   init_dataseg( &gdt[COLOR_INDEX], (offset_t) COLOR_BASE,
X+ 		(offset_t) COLOR_SIZE, TASK_PRIVILEGE );
X+   init_dataseg( &gdt[MONO_INDEX], (offset_t) MONO_BASE,
X+ 		(offset_t) MONO_SIZE, TASK_PRIVILEGE );
X+ 
X+   /* Build segment descriptors for switching to real mode.
X+    * They are only used by the debugger, which only works on 386's.
X+    */
X+   init_codeseg( &gdt[REAL_CS_INDEX], codebase, (offset_t) REAL_SEG_SIZE,
X+ 		INTR_PRIVILEGE );
X+   init_dataseg( &gdt[REAL_DS_INDEX], database, (offset_t) REAL_SEG_SIZE,
X+ 		INTR_PRIVILEGE );
X+ 
X+   /* Build main TSS.  This is used only to record the stack pointer to
X+    * be used after an interrupt.  This pointer is set up so that an
X+    * interrupt automatically saves the current process' registers
X+    * eip:cs:ef:esp:ss in the correct slots in the process table.
X+    */
X+   tss.t2.ss0 = DS_SELECTOR;
X+   type3_bit = 0;
X+   init_dataseg( &gdt[TSS_INDEX], database + (offset_t) &tss,
X+ 		(offset_t) sizeof tss, INTR_PRIVILEGE );
X+   gdt[TSS_INDEX].access = PRESENT | (INTR_PRIVILEGE << DPL_SHIFT)
X+ 			  | AVL_286_TSS | type3_bit;
X+ 
X+ #ifdef DEBUGGER
X+   /* Build TSS and task gates for debugger. */
X+   init_dataseg( &gdt[DB_TSS_INDEX], database + (offset_t) &db_tss,
X+ 		(offset_t) sizeof db_tss, INTR_PRIVILEGE );
X+   gdt[DB_TSS_INDEX].access = PRESENT | (INTR_PRIVILEGE << DPL_SHIFT)
X+ 			     | AVL_286_TSS | type3_bit;
X+   task_gate( &idt[DEBUG_VECTOR], DB_TSS_SELECTOR, USER_PRIVILEGE );
X+   task_gate( &idt[BREAKPOINT_VECTOR], DB_TSS_SELECTOR, USER_PRIVILEGE );
X+   db_tss.t2.cs = CS_SELECTOR;
X+   db_tss.t2.ip = (u16_t) debug2_exception;
X+   db_tss.t2.flags = INIT_PSW & ~IF;
X+   db_tss.t2.ds =
X+   db_tss.t2.es =
X+   db_tss.t2.ss = DS_SELECTOR;
X+   db_tss.t2.sp = (u16_t) db_stacktop;
X+ #endif
X+ 
X+   /* Build local descriptors in GDT for LDT's in process table.
X+    * The LDT's are allocated at compile time in the process table, and
X+    * initialized whenever a process' map is initialized or changed.
X+    */
X+   for ( rp = BEG_PROC_ADDR, ldt_selector = FIRST_LDT_INDEX * DESC_SIZE;
X+ 	rp < END_PROC_ADDR; ++rp, ldt_selector += DESC_SIZE )
X+   {
X+     init_dataseg( &gdt[ldt_selector / DESC_SIZE],
X+ 		  database + (offset_t) rp->p_ldt,
X+ 		  (offset_t) sizeof rp->p_ldt, INTR_PRIVILEGE );
X+     gdt[ldt_selector / DESC_SIZE].access = PRESENT | LDT;
X+     rp->p_ldt_sel = ldt_selector;
X+   }
X+ 
X+   /* Build descriptors for interrupt gates in IDT. */
X+   for ( gate_nr = 0; gate_nr < sizeof gate_table / sizeof gate_table[0];
X+ 	++gate_nr )
X+   {
X+     int_gate( gate_table[gate_nr].vec_nr, (offset_t) gate_table[gate_nr].gate,
X+ 	      PRESENT | (INTR_PRIVILEGE << DPL_SHIFT) |
X+ 	      INT_286_GATE | type3_bit );
X+   }
X+   int_gate( SYS_VECTOR, (offset_t)
X+ 	    p2_s_call,
X+ 	    PRESENT | (USER_PRIVILEGE << DPL_SHIFT) |
X+ 	    INT_286_GATE | type3_bit );
X+ }
X+ 
X+ PRIVATE void sdesc( segdp, base, size )
X+ register struct segdesc_s *segdp;
X+ offset_t base;
X+ offset_t size;
X+ {
X+   /* Fill in size fields (base and limit) of a descriptor. */
X+ 
X+   segdp->base_low = base;
X+   segdp->base_middle = base >> BASE_MIDDLE_SHIFT;
X+   segdp->limit_low = size - 1;
X+ }
X+ 
X+ PRIVATE void task_gate( gatedp, selector, privilege )
X+ register struct gatedesc_s *gatedp;
X+ unsigned selector;
X+ int privilege;
X+ {
X+   /* Build descriptor for a task gate. */
X+ 
X+   gatedp->selector = selector;
X+   gatedp->p_dpl_type = (privilege << DPL_SHIFT) | PRESENT | TASK_GATE;
X+ 		     /* SEGMENT = 0 */
X+ }
END_OF_FILE
if test 9757 -ne `wc -c <'kerneldif/protect.c.cdif'`; then
    echo shar: \"'kerneldif/protect.c.cdif'\" unpacked with wrong size!
fi
# end of 'kerneldif/protect.c.cdif'
fi
if test -f 'kerneldif/rs2.x.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'kerneldif/rs2.x.cdif'\"
else
echo shar: Extracting \"'kerneldif/rs2.x.cdif'\" \(6495 characters\)
sed "s/^X//" >'kerneldif/rs2.x.cdif' <<'END_OF_FILE'
X*** /dev/null	Thu Oct 13 22:40:42 1988
X--- kernel/rs2.x	Sun Mar 12 15:27:29 1989
X***************
X*** 0 ****
X--- 1,304 ----
X+ |*===========================================================================*
X+ |*		rs232 interrupt handlers for real and protected modes	     *
X+ |*===========================================================================*
X+ 
X+ #include "../h/const.h"
X+ #include "const.h"
X+ #include "sconst.h"
X+ #define RS2 .define
X+ #include "sglo.h"
X+ 
X+ #undef MINOR
X+ 
X+ #ifdef ASLD
X+ #define add1_and_align(n)	[[[n]+1+1] / 2 * 2]	/* word alignment */
X+ #else
X+ #define add1_and_align(n)	(((n)+1+1) & !1)
X+ #endif
X+ 
X+ | These constants are defined in tty.h. That has C stuff so can't be included.
X+ EVENT_THRESHOLD		=	64
X+ RS_IBUFSIZE		=	128
X+ 
X+ | These constants are defined in rs232.c.
X+ IS_LINE_STATUS_CHANGE	=	6
X+ IS_MODEM_STATUS_CHANGE	=	0
X+ IS_NO_INTERRUPT		=	1
X+ IS_RECEIVER_READY	=	4
X+ IS_TRANSMITTER_READY	=	2
X+ LS_OVERRUN_ERR		=	2
X+ LS_PARITY_ERR		=	4
X+ LS_FRAMING_ERR		=	8
X+ LS_BREAK_INTERRUPT	=	0x10
X+ LS_TRANSMITTER_READY	=	0x20
X+ MC_DTR			=	1
X+ MC_OUT2			=	8
X+ MS_CTS			=	0x10
X+ ODEVREADY		=	MS_CTS
X+ ODONE			=	1
X+ OQUEUED			=	0x20
X+ ORAW			=	2
X+ OSWREADY		=	0x40
X+ OWAKEUP			=	4
X+ RS_IHIGHWATER		=	3*RS_IBUFSIZE/4
X+ 
X+ | These port offsets are hard-coded in rs232.c.
X+ XMIT_OFFSET		=	0
X+ RECV_OFFSET		=	0
X+ INT_ID_OFFSET		=	2
X+ MODEM_CTL_OFFSET	=	4
X+ LINE_STATUS_OFFSET	=	5
X+ MODEM_STATUS_OFFSET	=	6
X+ 
X+ | Offsets in struct rs232_s. They must match rs232.c
X+ MINOR			=	0
X+ IDEVREADY		=	MINOR+2
X+ ITTYREADY		=	IDEVREADY+1
X+ IBUF			=	add1_and_align(ITTYREADY)
X+ IBUFEND			=	IBUF+2
X+ IHIGHWATER		=	IBUFEND+2
X+ IPTR			=	IHIGHWATER+2
X+ OSTATE			=	IPTR+2
X+ OXOFF			=	OSTATE+1
X+ OBUFEND			=	add1_and_align(OXOFF)
X+ OPTR			=	OBUFEND+2
X+ XMIT_PORT		=	OPTR+2
X+ RECV_PORT		=	XMIT_PORT+2
X+ DIV_LOW_PORT		=	RECV_PORT+2
X+ DIV_HI_PORT		=	DIV_LOW_PORT+2
X+ INT_ENAB_PORT		=	DIV_HI_PORT+2
X+ INT_ID_PORT		=	INT_ENAB_PORT+2
X+ LINE_CTL_PORT		=	INT_ID_PORT+2
X+ MODEMCTL_PORT		=	LINE_CTL_PORT+2
X+ LINESTATUS_PORT		=	MODEMCTL_PORT+2
X+ MODEMSTATUS_PORT	=	LINESTATUS_PORT+2
X+ LSTATUS			=	MODEMSTATUS_PORT+2
X+ FRAMING_ERRORS		=	add1_and_align(LSTATUS)
X+ OVERRUN_ERRORS		=	FRAMING_ERRORS+2
X+ PARITY_ERRORS		=	OVERRUN_ERRORS+2
X+ BREAK_INTERRUPTS	=	PARITY_ERRORS+2
X+ IBUF1			=	BREAK_INTERRUPTS+2
X+ IBUF2			=	IBUF1+RS_IBUFSIZE+1
X+ SIZEOF_STRUCT_RS232_S	=	IBUF2+RS_IBUFSIZE+1
X+ 
X+ 	.text
X+ 
X+ #ifdef i80286
X+ | PUBLIC void interrupt _psecondary_int();
X+ 
X+ _psecondary_int:
X+ 	push	ds
X+ 	push	si
X+ 	mov	si,ss
X+ 	mov	ds,si
X+ 	mov	si,#_rs_lines+SIZEOF_STRUCT_RS232_S
X+ 	j	commonp
X+ #endif
X+ 
X+ | PUBLIC void interrupt _secondary_int();
X+ 
X+ _secondary_int:
X+ 	push	ds
X+ 	push	si
X+ 	mov	si,#_rs_lines+SIZEOF_STRUCT_RS232_S
X+ 	j	common
X+ 
X+ #ifdef i80286
X+ | PUBLIC void interrupt _prs232_int();
X+ 
X+ _prs232_int:
X+ 	push	ds
X+ 	push	si
X+ 	mov	si,ss
X+ 	mov	ds,si
X+ 	mov	si,#_rs_lines
X+ 	j	commonp
X+ #endif
X+ 
X+ | input interrupt
X+ 
X+ inint:
X+ 	addb	dl,#RECV_OFFSET-INT_ID_OFFSET
X+ 	in
X+ 	mov	bx,IPTR(si)
X+ 	movb	(bx),al
X+ 	cmp	bx,IBUFEND(si)
X+ 	jge	checkxoff
X+ 	inc	_tty_events
X+ 	inc	bx
X+ 	mov	IPTR(si),bx
X+ 	cmp	bx,IHIGHWATER(si)
X+ 	jne	checkxoff
X+ 	addb	dl,#MODEM_CTL_OFFSET-RECV_OFFSET
X+ 	movb	al,#MC_OUT2+MC_DTR
X+ 	out
X+ 	movb	IDEVREADY(si),#FALSE
X+ checkxoff:
X+ 	testb	ah,#ORAW
X+ 	jne	rsnext
X+ 	cmpb	al,OXOFF(si)
X+ 	je	gotxoff
X+ 	testb	ah,#OSWREADY
X+ 	jne	rsnext
X+ 	orb	ah,#OSWREADY
X+ 	mov	dx,LINESTATUS_PORT(si)
X+ 	in
X+ 	testb	al,#LS_TRANSMITTER_READY
X+ 	je	rsnext
X+ 	addb	dl,#XMIT_OFFSET-LINE_STATUS_OFFSET
X+ 	j	outint1
X+ 
X+ gotxoff:
X+ 	andb	ah,#notop(OSWREADY)
X+ 	j	rsnext
X+ 
X+ | PUBLIC void interrupt rs232_int();
X+ 
X+ _rs232_int:
X+ 	push	ds
X+ 	push	si
X+ 	mov	si,#_rs_lines
X+ common:
X+ 	seg	cs
X+ 	mov	ds,kernel_ds
X+ 	seg	cs
X+ commonp:
X+ 	push	ax
X+ 	push	bx
X+ 	push	dx
X+ 	movb	ah,OSTATE(si)
X+ 	mov	dx,INT_ID_PORT(si)
X+ 	in
X+ rsmore:
X+ 	cmpb	al,#IS_RECEIVER_READY
X+ 	je	inint
X+ 	cmpb	al,#IS_TRANSMITTER_READY
X+ 	je	outint
X+ 	cmpb	al,#IS_MODEM_STATUS_CHANGE
X+ 	je	modemint
X+ 	cmpb	al,#IS_LINE_STATUS_CHANGE
X+ 	jne	rsdone		| fishy
X+ 
X+ | line status change interrupt
X+ 
X+ 	addb	dl,#LINE_STATUS_OFFSET-INT_ID_OFFSET
X+ 	in
X+ 	testb	al,#LS_FRAMING_ERR
X+ 	je	over_framing_error
X+ 	inc	FRAMING_ERRORS(si)	
X+ over_framing_error:
X+ 	testb	al,#LS_OVERRUN_ERR
X+ 	je	over_overrun_error
X+ 	inc	OVERRUN_ERRORS(si)	
X+ over_overrun_error:
X+ 	testb	al,#LS_PARITY_ERR
X+ 	je	over_parity_error
X+ 	inc	PARITY_ERRORS(si)
X+ over_parity_error:
X+ 	testb	al,#LS_BREAK_INTERRUPT
X+ 	je	over_break_interrupt
X+ 	inc	BREAK_INTERRUPTS(si)
X+ over_break_interrupt:
X+ 
X+ rsnext:
X+ 	mov	dx,INT_ID_PORT(si)
X+ 	in
X+ 	cmpb	al,#IS_NO_INTERRUPT
X+ 	jne	rsmore
X+ rsdone:
X+ 	movb	al,#ENABLE
X+ 	out	INT_CTL
X+ 	testb	ah,#OWAKEUP
X+ 	jne	owakeup
X+ 	movb	OSTATE(si),ah
X+ 	pop	dx
X+ 	pop	bx
X+ 	pop	ax
X+ 	pop	si
X+ 	pop	ds
X+ rs2_iret:
X+ 	iret			| changed to iretd for 386 protected mode
X+ 	nop			| space for longer opcode
X+ 	nop			| padding since convenient to change 3 bytes
X+ 
X+ | output interrupt
X+ 
X+ outint:
X+ 	addb	dl,#XMIT_OFFSET-INT_ID_OFFSET
X+ outint1:
X+ 	cmpb	ah,#ODEVREADY+OQUEUED+OSWREADY
X+ 	jb	rsnext		| not all are set
X+ 	mov	bx,OPTR(si)
X+ 	movb	al,(bx)
X+ 	out
X+ 	inc	bx
X+ 	mov	OPTR(si),bx
X+ 	cmp	bx,OBUFEND(si)
X+ 	jb	rsnext
X+ 	add	_tty_events,#EVENT_THRESHOLD
X+ 	xorb	ah,#ODONE+OQUEUED+OWAKEUP	| OQUEUED off, others on
X+ 	j	rsnext		| direct exit might lose interrupt
X+ 
X+ | modem status change interrupt
X+ 
X+ modemint:
X+ 	addb	dl,#MODEM_STATUS_OFFSET-INT_ID_OFFSET
X+ 	in
X+ 	testb	al,#MS_CTS
X+ 	jne	m_devready
X+ 	andb	ah,#notop(ODEVREADY)
X+ 	j	rsnext
X+ 
X+ m_devready:
X+ 	testb	ah,#ODEVREADY
X+ 	jne	rsnext
X+ 	orb	ah,#ODEVREADY
X+ 	addb	dl,#LINE_STATUS_OFFSET-MODEM_STATUS_OFFSET
X+ 	in
X+ 	testb	al,#LS_TRANSMITTER_READY
X+ 	je	rsnext
X+ 	addb	dl,#XMIT_OFFSET-LINE_STATUS_OFFSET
X+ 	j	outint1
X+ 
X+ | special exit for output just completed
X+ 
X+ owakeup:
X+ 	andb	ah,#notop(OWAKEUP)
X+ 	movb	OSTATE(si),ah
X+ 
X+ | determine mask bit (it would be better to precalculate it in the struct)
X+ 
X+ 	movb	ah,#SECONDARY_MASK
X+ 	cmp	si,#_rs_lines
X+ 	jne	got_rs_mask
X+ 	movb	ah,#RS232_MASK
X+ got_rs_mask:
X+ 	mov	rs_mask,ax	| save ax to clear later
X+ 	in	INT_CTLMASK
X+ 	orb	al,ah
X+ 	out	INT_CTLMASK
X+ 
X+ | rearrange context to call tty_wakeup()
X+ 
X+ 	pop	dx
X+ 	pop	bx
X+ 	pop	ax
X+ 	pop	si
X+ 	pop	ds
X+ 	call	save
X+ 	push	rs_mask		| save the mask again, reentrantly
X+ 	sti
X+ 	call	_tty_wakeup
X+ 	cli
X+ 	pop	ax
X+ 	notb	ah		| return this
X+ 	in	INT_CTLMASK
X+ 	andb	al,ah
X+ 	out	INT_CTLMASK
X+ 	ret
X+ 
X+ 
X+ 	.data
X+ rs_mask:
X+ 	.space	2
X+ 	.space	2		| align
END_OF_FILE
if test 6495 -ne `wc -c <'kerneldif/rs2.x.cdif'`; then
    echo shar: \"'kerneldif/rs2.x.cdif'\" unpacked with wrong size!
fi
# end of 'kerneldif/rs2.x.cdif'
fi
if test -f 'kerneldif/rs232.c.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'kerneldif/rs232.c.cdif'\"
else
echo shar: Extracting \"'kerneldif/rs232.c.cdif'\" \(3649 characters\)
sed "s/^X//" >'kerneldif/rs232.c.cdif' <<'END_OF_FILE'
X*** kernel-1.3/rs232.c	Fri Dec  9 02:21:32 1988
X--- kernel/rs232.c	Sun Mar 12 00:08:06 1989
X***************
X*** 173,174 ****
X--- 173,175 ----
X    interrupt(TTY, &rs232_rd_mess);	/* send a message to the tty task */
X+   lock();			/* new interrupt() may unlock() */
X  }
X***************
X*** 229,230 ****
X--- 230,232 ----
X  	interrupt(TTY, &rs232_wt_mess);	/* send the message to the tty task */
X+ 	lock();			/* new interrupt() may unlock() */
X    } else {
X***************
X*** 279,281 ****
X    char c, *limit;
X!   unsigned short segment, offset, offset1;
X    register struct rs_struct *rs;
X--- 281,283 ----
X    char c, *limit;
X!   unsigned long offset, offset1;
X    register struct rs_struct *rs;
X***************
X*** 290,293 ****
X    limit = &rs->rs_buf[RS_BUF_SIZE - SPARE];
X!   segment = (tp->tty_phys >> 4) & WORD_MASK;
X!   offset = tp->tty_phys & OFF_MASK;
X    offset1 = offset;
X--- 292,294 ----
X    limit = &rs->rs_buf[RS_BUF_SIZE - SPARE];
X!   offset = tp->tty_phys;
X    offset1 = offset;
X***************
X*** 296,298 ****
X    while (tp->tty_outleft > 0 && rs->rs_next + rs->rs_left < limit) {
X! 	c = get_byte(segment, offset);	/* fetch 1 byte */
X  	offset++;
X--- 297,299 ----
X    while (tp->tty_outleft > 0 && rs->rs_next + rs->rs_left < limit) {
X! 	c = get_phys_byte(offset);	/* fetch 1 byte */
X  	offset++;
X***************
X*** 322,324 ****
X   *===========================================================================*/
X! PRIVATE rs_out_char(tp, c)
X  register struct tty_struct *tp;	/* pointer to tty struct */
X--- 323,325 ----
X   *===========================================================================*/
X! PUBLIC rs_out_char(tp, c)
X  register struct tty_struct *tp;	/* pointer to tty struct */
X***************
X*** 420,425 ****
X  		caller = (int) tp->tty_outproc;
X- 		tty_reply(REVIVE, replyee, caller, tp->tty_cum, 0L, 0L);
X  		tp->tty_waiting = NOT_WAITING;
X  		output_done--;
X! 		restore(old_state);
X  		return(1);
X--- 421,426 ----
X  		caller = (int) tp->tty_outproc;
X  		tp->tty_waiting = NOT_WAITING;
X  		output_done--;
X! 		restore(old_state);	/* don't try to lock the reply */
X! 		tty_reply(REVIVE, replyee, caller, tp->tty_cum, 0L, 0L);
X  		return(1);
X***************
X*** 453,455 ****
X   *===========================================================================*/
X! PRIVATE	init_rs232()
X  {
X--- 454,456 ----
X   *===========================================================================*/
X! PUBLIC init_rs232()
X  {
X***************
X*** 491,492 ****
X--- 492,499 ----
X    }
X+ #if NR_RS_LINES > 0
X+     enable_irq( RS232_IRQ );
X+ #endif
X+ #if NR_RS_LINES > 1
X+     enable_irq( SECONDARY_IRQ );
X+ #endif
X  }
X***************
X*** 497,499 ****
X   *===========================================================================*/
X! PRIVATE set_uart(line, mode, speeds)
X  int line;			/* which line number (>= NR_CONS) */
X--- 504,506 ----
X   *===========================================================================*/
X! PUBLIC set_uart(line, mode, speeds)
X  int line;			/* which line number (>= NR_CONS) */
X***************
X*** 565,566 ****
X--- 572,604 ----
X    port_out(base + RS232_LINE_CONTROL, line_controls);
X+ }
X+ 
X+ 
X+ /* Kludges to get this old tty version to work with the protected kernel. */
X+ 
X+ PUBLIC rs232_1handler()
X+ {
X+   rs232(1);
X+ }
X+ 
X+ 
X+ PUBLIC rs232_2handler()
X+ {
X+   rs232(2);
X+ }
X+ 
X+ 
X+ PUBLIC tty_wakeup()
X+ {
X+ /* Wake up TTY after a timeout if there is something to flush. */
X+ 
X+ #define WAKEUP_TIMEOUT (8*HZ/60)
X+ 
X+   static unsigned wakeup_timeout = WAKEUP_TIMEOUT;
X+ 
X+   lock();
X+   if (flush_flag && --wakeup_timeout == 0) {
X+ 	wakeup_timeout = WAKEUP_TIMEOUT;
X+ 	rs_flush();
X+   }
X+   unlock();
X  }
END_OF_FILE
if test 3649 -ne `wc -c <'kerneldif/rs232.c.cdif'`; then
    echo shar: \"'kerneldif/rs232.c.cdif'\" unpacked with wrong size!
fi
# end of 'kerneldif/rs232.c.cdif'
fi
if test -f 'kerneldif/sconst.h.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'kerneldif/sconst.h.cdif'\"
else
echo shar: Extracting \"'kerneldif/sconst.h.cdif'\" \(5266 characters\)
sed "s/^X//" >'kerneldif/sconst.h.cdif' <<'END_OF_FILE'
X*** /dev/null	Thu Oct 13 22:40:42 1988
X--- kernel/sconst.h	Sun Mar 26 01:22:20 1989
X***************
X*** 0 ****
X--- 1,168 ----
X+ /* Miscellaneous constants used in assembler code. */
X+ #define DS_286_OFFSET DS_286_INDEX*DESC_SIZE
X+ #define EM_MASK		0xFFF0	/* extended memory mask for hi word */
X+ #define ES_286_OFFSET ES_286_INDEX*DESC_SIZE
X+ #define HCHIGH_MASK	0x0F	/* h/w click mask for low byte of hi word */
X+ #define HCLOW_MASK	0xF0	/* h/w click mask for low byte of low word */
X+ #define Msize		12	/* size of a message in 16-bit words */
X+ #define OFF_MASK	0x000F	/* offset mask for long -> hclick:offset */
X+ #define TEST1PATTERN	0x55	/* memory test pattern 1 */
X+ #define TEST2PATTERN	0xAA	/* memory test pattern 2 */
X+ 
X+ /* Opcodes (used in patching). */
X+ #define IRET_OPCODE	0xCF
X+ #define JMP_OPCODE	0xE9
X+ #define NOP_OPCODE	0x90
X+ 
X+ /* BIOS numbers. */
X+ #define EM_XFER_VEC	0x15	/* copy (normal or extended) memory */
X+ #define EM_XFER_FUNC	0x87
X+ #define GET_EXTMEM_VEC	0x15	/* get extended memory size */
X+ #define GET_EXTMEM_FUNC	0x88
X+ #define GET_MEM_VEC	0x12	/* get memory size */
X+ #define SET_PROTECT_VEC	0x15	/* set protected mode */
X+ #define SET_PROTECT_FUNC 0x89
X+ 
X+ /* 8259 mask bits. */
X+ #define AT_WINI_MASK	0x40	/* (1 << (AT_WINI_IRQ & 0x07)), etc */
X+ #define CLOCK_MASK	0x01
X+ #define ETHER_MASK	0x08
X+ #define FLOPPY_MASK	0x40
X+ #define KEYBOARD_MASK	0x02
X+ #define PRINTER_MASK	0x80
X+ #define RS232_MASK	0x10
X+ #define SECONDARY_MASK	0x08
X+ #define XT_WINI_MASK	0x20
X+ 
X+ /* Offsets in struct proc. They MUST match proc.h. Use '=' to define them
X+  * instead of '#define', so they can be built cumulatively (for easy changes)
X+  * without producing large macro expansions.
X+  */
X+ #if 0 /* uurghh, the duplicated labels cause asld to run out of memory */
X+ P_STACKBASE	=	0
X+ ESREG		=	P_STACKBASE
X+ DSREG		=	ESREG + 2
X+ DIREG		=	DSREG + 2
X+ SIREG		=	DIREG + 2
X+ BPREG		=	SIREG + 2
X+ STREG		=	BPREG + 2	/* hole for another SP */
X+ BXREG		=	STREG + 2
X+ DXREG		=	BXREG + 2
X+ CXREG		=	DXREG + 2
X+ AXREG		=	CXREG + 2
X+ RETADR		=	AXREG + 2	/* return address for save() call */
X+ PCREG		=	RETADR + 2
X+ CSREG		=	PCREG + 2
X+ PSWREG		=	CSREG + 2
X+ SPREG		=	PSWREG + 2
X+ SSREG		=	SPREG + 2
X+ P_STACKTOP	=	SSREG + 2
X+ P_NR		=	P_STACKTOP
X+ P_LDT_SEL	=	P_NR + 2	/* assumes 16 bit ints */
X+ P_LDT		=	P_LDT_SEL + 2
X+ P_SPLIMIT	=	P_LDT_SEL + 16
X+ #endif
X+ 
X+ #define P_STACKBASE	0
X+ #define ESREG		0
X+ #define DSREG		2
X+ #define DIREG		4
X+ #define SIREG		6
X+ #define BPREG		8
X+ #define STREG		10	/* hole for another SP */
X+ #define BXREG		12
X+ #define DXREG		14
X+ #define CXREG		16
X+ #define AXREG		18
X+ #define RETADR		20	/* return address for save() call */
X+ #define PCREG		22
X+ #define CSREG		24
X+ #define PSWREG		26
X+ #define SPREG		28
X+ #define SSREG		30
X+ #define P_STACKTOP	32
X+ #define P_NR		32
X+ #define P_LDT_SEL	34	/* assumes 16 bit ints */
X+ #define P_LDT		36
X+ #define P_SPLIMIT	52
X+ 
X+ /* 286 tss offsets. */
X+ #define TSS2_S_BACKLINK	0
X+ #define TSS2_S_SP0	2
X+ #define TSS2_S_SS0	4
X+ #define TSS2_S_SP1	6
X+ #define TSS2_S_SS1	8
X+ #define TSS2_S_SP2	10
X+ #define TSS2_S_SS2	12
X+ #define TSS2_S_IP	14
X+ #define TSS2_S_FLAGS	16
X+ #define TSS2_S_AX	18
X+ #define TSS2_S_CX	20
X+ #define TSS2_S_DX	22
X+ #define TSS2_S_BX	24
X+ #define TSS2_S_SP	26
X+ #define TSS2_S_BP	28
X+ #define TSS2_S_SI	30
X+ #define TSS2_S_DI	32
X+ #define TSS2_S_ES	34
X+ #define TSS2_S_CS	36
X+ #define TSS2_S_SS	38
X+ #define TSS2_S_DS	40
X+ #define TSS2_S_LDT	42
X+ #define SIZEOF_TSS2_S	44
X+ 
X+ /* Macros to get some 8086 instructions through asld. */
X+ #ifdef ASLD
X+ #define callfar(s,o)	calli	o,s
X+ #define callfarptr(v)	calli	@v
X+ #define jmpfar(s,o)	jmpi	o,s
X+ #define jmpmem(adr)	jmp	@adr
X+ #define jmpreg(reg)	jmp	(reg)
X+ #define notop(n)	[-[n]-1]
X+ #define orop		+	/* used only if same as add */
X+ #else
X+ #define callfar(s,o)	call	s:o
X+ #define callfarptr(v)	call	far [v]
X+ #define jmpfar(s,o)	jmp	s:o
X+ #define jmpmem(adr)	jmp	adr
X+ #define jmpreg(reg)	jmp	reg
X+ #define notop(n)	(!(n))
X+ #define orop		\	/* don't expose '\' to end of line */
X+ #endif /* ASLD */
X+ 
X+ /* Macros to get some 286 instructions through asld.
X+  * Some are used without i80286.
X+  */
X+ #ifdef ASLD
X+ #define ESC2		.byte	0x0F	/* escape for some 286 instructions */
X+ #define defsgdt(adr)	ESC2;	add	adr,ax	/* may not be general */
X+ #define insw		.byte	0x6D
X+ #define outsw		.byte	0x6F
X+ #else
X+ #define defsgdt(adr)	sgdt	adr
X+ #endif
X+ 
X+ #ifdef i80286
X+ #ifdef ASLD
X+ #define deflgdt(adr)	ESC2;	add	adr,dx	/* may not be general */
X+ #define deflidt(adr)	ESC2;	add	adr,bx	/* may not be general */
X+ #define deflldt(adr)	ESC2;	addb	adr,dl	/* may not be general */
X+ #define defltrax	ESC2;	.byte	0x00,0xD8
X+ #define defsidt(adr)	ESC2;	add	adr,cx	/* may not be general */
X+ #define defsldt(adr)	ESC2;	addb	adr,al	/* may not be general */
X+ #define popa		.byte	0x61
X+ #define pusha		.byte	0x60
X+ #define pushi8(n)	.byte	0x6A;	.byte	n
X+ #define pushi16(n)	.byte	0x68;	.word	n
X+ #define use32
X+ #else
X+ #define deflgdt(adr)	lgdt	adr
X+ #define deflidt(adr)	lidt	adr
X+ #define deflldt(adr)	lldt	adr
X+ #define defltrax	ltr	ax
X+ #define defsidt(adr)	sidt	adr
X+ #define defsldt(adr)	sldt	adr
X+ #define pushi8(n)	push	#n
X+ #define pushi16(n)	push	#n
X+ #endif /* ASLD */
X+ #endif /* i80286 */
END_OF_FILE
if test 5266 -ne `wc -c <'kerneldif/sconst.h.cdif'`; then
    echo shar: \"'kerneldif/sconst.h.cdif'\" unpacked with wrong size!
fi
# end of 'kerneldif/sconst.h.cdif'
fi
if test -f 'kerneldif/sglo.h.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'kerneldif/sglo.h.cdif'\"
else
echo shar: Extracting \"'kerneldif/sglo.h.cdif'\" \(4801 characters\)
sed "s/^X//" >'kerneldif/sglo.h.cdif' <<'END_OF_FILE'
X*** /dev/null	Thu Oct 13 22:40:42 1988
X--- kernel/sglo.h	Sun Mar 26 01:14:24 1989
X***************
X*** 0 ****
X--- 1,250 ----
X+ /* Functions, variables and data structures defined in various assembler
X+  * files. Each file should have a define like "#define KLIB88 .define" to
X+  * say what it is defining.
X+  */
X+ 
X+ 	.text
X+ 
X+ #ifndef DB286
X+ #define DB286 .extern
X+ #endif
X+ #ifndef KLIB88
X+ #define KLIB88 .extern
X+ #endif
X+ #ifndef KLIB286
X+ #define KLIB286 .extern
X+ #endif
X+ #ifndef MPX88
X+ #define MPX88 .extern
X+ #endif
X+ #ifndef MPX286
X+ #define MPX286 .extern
X+ #endif
X+ #ifndef RS2
X+ #define RS2 .extern
X+ #endif
X+ 
X+ /* Functions defined in db286.x. */
X+ 
X+ #ifdef i80286
X+ #ifdef DEBUGGER
X+ DB286		_debug2_exception
X+ DB286		_patch_phys_copy
X+ DB286		_unpatch_phys_copy
X+ #endif
X+ #endif
X+ 
X+ /* Functions defined in klib88.x. */
X+ 
X+ KLIB88		_ack_char
X+ KLIB88		_build_sig
X+ KLIB88		_check_mem
X+ KLIB88		_cim_at_wini
X+ KLIB88		_cim_printer
X+ KLIB88		_cim_xt_wini
X+ KLIB88		_cp_mess
X+ KLIB88		cret
X+ KLIB88		csv
X+ KLIB88		_exit
X+ KLIB88		.fat
X+ KLIB88		_get_phys_byte
X+ KLIB88		_get_chrome
X+ KLIB88		_get_ega
X+ KLIB88		_get_extmemsize
X+ KLIB88		_get_memsize
X+ KLIB88		_lock
X+ KLIB88		_phys_copy
X+ KLIB88		_porti_out
X+ KLIB88		_port_read
X+ KLIB88		_port_write
X+ KLIB88		_reboot
X+ KLIB88		_restore
X+ KLIB88		_save_tty_vec
X+ KLIB88		_scr_down
X+ KLIB88		_scr_up
X+ KLIB88		_sim_printer
X+ KLIB88		_tasim_printer
X+ KLIB88		_test_and_set
X+ KLIB88		.trp
X+ KLIB88		_unlock
X+ KLIB88		_vid_copy
X+ KLIB88		_wait_retrace
X+ KLIB88		_wreboot
X+ 
X+ #ifndef DEBUGGER
X+ KLIB88		_codeseg
X+ KLIB88		_dataseg
X+ KLIB88		_get_processor
X+ KLIB88		_inportb
X+ #endif
X+ 
X+ /* Functions defined in klib286.x. */
X+ 
X+ #ifdef i80286
X+ KLIB286		_klib286_init		/* this patches the rest */
X+ #endif
X+ 
X+ /* Functions defined in mpx88.x. */
X+ 
X+ MPX88		begtext
X+ MPX88		_idle_task
X+ MPX88		kernel_ds
X+ MPX88		_restart
X+ MPX88		save
X+ 
X+ MPX88		_int00			/* exception handlers */
X+ MPX88		_int01
X+ MPX88		_int02
X+ MPX88		_int03
X+ MPX88		_int04
X+ MPX88		_int05
X+ MPX88		_int06
X+ MPX88		_int07
X+ MPX88		_int08
X+ MPX88		_int09
X+ MPX88		_int10
X+ MPX88		_int11
X+ MPX88		_int12
X+ MPX88		_int13
X+ MPX88		_int14
X+ MPX88		_int15
X+ MPX88		_int16
X+ MPX88		_trp
X+ 
X+ MPX88		_clock_int		/* interrupt handlers */
X+ MPX88		_tty_int
X+ #ifdef C_RS232_INT_HANDLERS
X+ MPX88		_secondary_int
X+ MPX88		_rs232_int
X+ #ifdef i80286
X+ MPX88		_psecondary_int
X+ MPX88		_prs232_int
X+ #endif
X+ #endif
X+ MPX88		_wini_int
X+ MPX88		_disk_int
X+ MPX88		_lpr_int
X+ 
X+ MPX88		_s_call			/* trap handlers */
X+ 
X+ /* Functions defined in mpx286.x. */
X+ 
X+ #ifdef i80286
X+ MPX286		p2_errexception
X+ MPX286		p2_save
X+ MPX286		p2_resdone
X+ MPX286		p_restart
X+ 
X+ MPX286		_divide_error		/* exception handlers */
X+ MPX286		_nmi
X+ MPX286		_overflow
X+ MPX286		_bounds_check
X+ MPX286		_inval_opcode
X+ MPX286		_copr_not_available
X+ MPX286		_double_fault
X+ MPX286		_copr_seg_overrun
X+ MPX286		_inval_tss
X+ MPX286		_segment_not_present
X+ MPX286		_stack_exception
X+ MPX286		_general_protection
X+ 
X+ MPX286		_p2_s_call		/* trap handlers */
X+ #endif /* i80286 */
X+ 
X+ /* Functions defined in rs2.x. */
X+ 
X+ #ifndef C_RS232_INT_HANDLERS
X+ #ifdef i80286
X+ RS2		_prs232_int
X+ RS2		_psecondary_int
X+ RS2		rs2_iret
X+ #endif
X+ RS2		_rs232_int
X+ RS2		_secondary_int
X+ #endif
X+ 
X+ /* C functions. */
X+ 
X+ .extern		_clock_handler
X+ #ifdef DEBUGGER
X+ .extern		_db_main	/* old real mode debugger */
X+ #endif
X+ .extern		_dp8390_int
X+ .extern		_eth_stp
X+ .extern		_exception
X+ .extern		_init_8259
X+ .extern		_interrupt
X+ .extern		_keyboard
X+ .extern		_main
X+ .extern		_panic
X+ .extern		_pr_char
X+ #ifdef C_RS232_INT_HANDLERS
X+ #ifdef OLD_TTY
X+ .extern		_rs232
X+ #else
X+ .extern		_rs232_1handler
X+ .extern		_rs232_2handler
X+ #endif
X+ #endif
X+ .extern		_scan_keyboard
X+ .extern		_sys_call
X+ #ifndef OLD_TTY
X+ .extern		_tty_wakeup
X+ #endif
X+ .extern		_unhold
X+ 
X+ 		.bss
X+ 
X+ /* Variables defined in klib88.x. */
X+ 
X+ KLIB88		splimit
X+ KLIB88		_vec_table
X+ 
X+ /* Variables defined in mpx88.x. */
X+ 
X+ MPX88		begbss
X+ MPX88		begdata
X+ MPX88		k_stktop
X+ MPX88		_sizes
X+ 
X+ /* Variables defined in mpx286.x. */
X+ 
X+ #ifdef i80286
X+ MPX286		ds_ex_number
X+ MPX286		trap_errno
X+ #endif
X+ 
X+ /* C variables. */
X+ 
X+ .extern		_blank_color
X+ .extern		_boot_parameters
X+ .extern		_held_head
X+ .extern		_held_tail
X+ .extern		_k_reenter
X+ .extern		_pc_at
X+ .extern		_port_65
X+ .extern		_proc_ptr
X+ .extern		_processor
X+ .extern		_ps
X+ .extern		_scan_code
X+ .extern		_sizeof_bparam
X+ .extern		_snow
X+ #ifndef C_RS232_INT_HANDLERS
X+ .extern		_rs_lines
X+ .extern		_tty_events
X+ #endif
X+ .extern		_vid_mask
X+ .extern		_vid_port
X+ 
X+ #ifdef i80286
X+ #ifdef DEBUGGER
X+ .extern		_bits32
X+ .extern		_db_processor
X+ .extern		_db_tss
X+ .extern		_protected
X+ #endif
X+ .extern		_gdt
X+ .extern		_tss
X+ #endif
X+ 
X+ 	.text
END_OF_FILE
if test 4801 -ne `wc -c <'kerneldif/sglo.h.cdif'`; then
    echo shar: \"'kerneldif/sglo.h.cdif'\" unpacked with wrong size!
fi
# end of 'kerneldif/sglo.h.cdif'
fi
if test -f 'kerneldif/xt_wini.c.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'kerneldif/xt_wini.c.cdif'\"
else
echo shar: Extracting \"'kerneldif/xt_wini.c.cdif'\" \(4227 characters\)
sed "s/^X//" >'kerneldif/xt_wini.c.cdif' <<'END_OF_FILE'
X*** kernel-1.3/xt_wini.c	Sat Oct 15 20:17:38 1988
X--- kernel/xt_wini.c	Sun Mar 26 01:30:14 1989
X***************
X*** 247,249 ****
X  
X!   int mode, low_addr, high_addr, top_addr, low_ct, high_ct, top_end, old_state;
X    vir_bytes vir, ct;
X--- 247,249 ----
X  
X!   int mode, low_addr, high_addr, top_addr, low_ct, high_ct, top_end;
X    vir_bytes vir, ct;
X***************
X*** 273,275 ****
X    /* Now set up the DMA registers. */
X-   old_state = lock();
X    port_out(DMA_M2, mode);	/* set the DMA mode */
X--- 273,274 ----
X***************
X*** 281,283 ****
X    port_out(DMA_COUNT, high_ct);	/* output high 8 bits of count - 1 */
X-   restore(old_state);
X  }
X--- 280,281 ----
X***************
X*** 319,323 ****
X  /*===========================================================================*
X!  *				win_results					 * 
X   *===========================================================================*/
X! PRIVATE int win_results(wn)
X  register struct wini *wn;	/* pointer to the drive struct */
X--- 317,321 ----
X  /*===========================================================================*
X!  *				old_win_results					 * 
X   *===========================================================================*/
X! PRIVATE int old_win_results(wn)
X  register struct wini *wn;	/* pointer to the drive struct */
X***************
X*** 479,482 ****
X  {
X-   int old_state;
X- 
X    command[0] = WIN_SPECIFY;		/* Specify some parameters */
X--- 477,478 ----
X***************
X*** 486,488 ****
X  		return(ERR);
X- 	old_state = lock();
X  
X--- 482,483 ----
X***************
X*** 511,513 ****
X    win_out(paramp->max_ecc);
X- 	restore(old_state);
X  
X--- 506,507 ----
X***************
X*** 601,603 ****
X  	register int i;
X! 	int r, old_state;
X  
X--- 595,597 ----
X  	register int i;
X! 	int r;
X  
X***************
X*** 617,620 ****
X  
X- 	old_state = lock();
X- 
X  	for (i=0; i<6; i++) {
X--- 611,612 ----
X***************
X*** 632,635 ****
X  
X- 	restore(old_state);
X- 
X  	if(i != 6) {
X--- 624,625 ----
X***************
X*** 644,645 ****
X--- 634,636 ----
X   *===========================================================================*/
X+ 
X  PRIVATE init_params()
X***************
X*** 656,658 ****
X    /* Get the number of drives from the bios */
X!   phys_copy(0x475L, umap(proc_addr(WINCHESTER), D, buf, 1), 1L);
X    nr_drives = (int) *buf > MAX_DRIVES ? MAX_DRIVES : (int) *buf;
X--- 647,649 ----
X    /* Get the number of drives from the bios */
X!   phys_copy(0x475L, umap(cproc_addr(WINCHESTER), D, buf, 1), 1L);
X    nr_drives = (int) *buf > MAX_DRIVES ? MAX_DRIVES : (int) *buf;
X***************
X*** 731,733 ****
X    address = ((phys_bytes)segment << 4) + offset;
X!   phys_copy(address, umap(proc_addr(WINCHESTER), D, buf, 64), 64L);
X  
X--- 722,724 ----
X    address = ((phys_bytes)segment << 4) + offset;
X!   phys_copy(address, umap(cproc_addr(WINCHESTER), D, buf, 64), 64L);
X  
X***************
X*** 783,787 ****
X  /*==========================================================================*
X!  *								copy_params					 				*
X   *==========================================================================*/
X! PRIVATE copy_params(src, dest)
X  register unsigned char *src;
X--- 774,778 ----
X  /*==========================================================================*
X!  *								copy_param					 				*
X   *==========================================================================*/
X! PRIVATE copy_param(src, dest)
X  register unsigned char *src;
X***************
X*** 820,821 ****
X--- 811,813 ----
X  	wn->wn_low = *(long *)&buf[offset];
X+ #ifdef STUPID_WINI_ADJUST
X  	if ((wn->wn_low % (BLOCK_SIZE/SECTOR_SIZE)) != 0) {
X***************
X*** 825,826 ****
X--- 817,819 ----
X  	}
X+ #endif
X  	wn->wn_size = *(long *)&buf[offset + sizeof(long)] - adjust;
X***************
X*** 853 ****
X--- 846,863 ----
X  
X+ 
X+ /*==========================================================================*
X+  *				win_results				    *
X+  *==========================================================================*/
X+ PRIVATE int win_results(wn)
X+ register struct wini *wn;	/* pointer to the drive struct */
X+ {
X+ /* Extract results from the controller after an operation, then reenable the
X+  * interrupt controller.
X+  */
X+ 
X+   int r;
X+ 
X+   r = old_win_results(wn);
X+   cim_xt_wini();
X+   return(r);
X+ }
END_OF_FILE
if test 4227 -ne `wc -c <'kerneldif/xt_wini.c.cdif'`; then
    echo shar: \"'kerneldif/xt_wini.c.cdif'\" unpacked with wrong size!
fi
# end of 'kerneldif/xt_wini.c.cdif'
fi
if test -f 'libdif/head.s.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'libdif/head.s.cdif'\"
else
echo shar: Extracting \"'libdif/head.s.cdif'\" \(1162 characters\)
sed "s/^X//" >'libdif/head.s.cdif' <<'END_OF_FILE'
X*** lib-1.3/IBM_PC/head.s	Wed Nov  2 09:00:07 1988
X--- lib/IBM_PC/head.s	Thu Feb 16 02:07:37 1989
X***************
X*** 4,6 ****
X  	jmp L0
X! 	.zerow 7		| kernel uses this area as stack for inital IRET
X  L0:	mov sp,_stackpt
X--- 4,8 ----
X  	jmp L0
X! 	.zerow 13		| stack for inital IRET when common I&D
X! 				| also padding to make INIT_SP same as
X! 				| for separate I&D
X  L0:	mov sp,_stackpt
X***************
X*** 12,15 ****
X  _data_org:			| fs needs to know where build stuffed table
X! .word 0xDADA,0,0,0,0,0,0,0	| first 8 words of MM, FS, INIT are for stack
X! 				| 0xDADA is magic number for build
X  .bss
X--- 14,25 ----
X  _data_org:			| fs needs to know where build stuffed table
X! .word 0xDADA			| magic number for build
X! .word 8				| CLICK_SHIFT to check - must match h/const.h
X! .word 0,0,0			| used by FS only for sizes of init
X! 				| stack for separate I&D follows
X! .word 0,0,0			| for ip:ss:f pushed by debugger traps
X! .word 0,0,0			| for cs:ds:ret adr in save()
X! 				| this was missing - a bug as late as V1.3c
X! 				| for ds for new restart() as well
X! .word 0,0,0			| for ip:ss:f built by restart()
X! 				| so INIT_SP in const.h must be 0x1C
X  .bss
END_OF_FILE
if test 1162 -ne `wc -c <'libdif/head.s.cdif'`; then
    echo shar: \"'libdif/head.s.cdif'\" unpacked with wrong size!
fi
# end of 'libdif/head.s.cdif'
fi
if test -f 'toolsdif/fsck1.s.cdif' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'toolsdif/fsck1.s.cdif'\"
else
echo shar: Extracting \"'toolsdif/fsck1.s.cdif'\" \(462 characters\)
sed "s/^X//" >'toolsdif/fsck1.s.cdif' <<'END_OF_FILE'
X*** tools-1.3/fsck1.s	Wed Nov  2 09:00:07 1988
X--- tools/fsck1.s	Wed Mar 22 05:04:23 1989
X***************
X*** 25,26 ****
X--- 33,40 ----
X  	mov	bx,ax		| put scan code for '=' in bx
X+ 	sub	ax,ax		| ax == 0 to show new boot (was scan code)
X+ 	mov	si,#_boot_parameters	| pointer to boot parameters in di:si
X+ 	mov	di,ds
X+ 	mov	cx,#10		| sizeof structure in cx
X+ 				| next 'cli' and setting up segs is redundant
X+ 				| and the segments are wrong for sep I&D
X  	cli
END_OF_FILE
if test 462 -ne `wc -c <'toolsdif/fsck1.s.cdif'`; then
    echo shar: \"'toolsdif/fsck1.s.cdif'\" unpacked with wrong size!
fi
# end of 'toolsdif/fsck1.s.cdif'
fi
echo shar: End of archive 8 \(of 10\).
cp /dev/null ark8isdone
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