Path: utzoo!utgpu!water!watmath!clyde!att!pacbell!ames!ubvax!vsi1!altnet!uunet!mcvax!botter!star.cs.vu.nl!ast@cs.vu.nl
From: ast@cs.vu.nl (Andy Tanenbaum)
Newsgroups: comp.os.minix
Subject: V1.3 posting #28 - revision to kernel directory (except tty.c)
Message-ID: <855@ast.cs.vu.nl>
Date: 14 Jul 88 12:25:29 GMT
Sender: ast@cs.vu.nl
Reply-To: ast@cs.vu.nl (Andy Tanenbaum)
Organization: VU Informatica, Amsterdam
Lines: 1104
: This is a shar archive. Extract with sh, not csh.
: This archive ends with exit, so do not worry about trailing junk.
: --------------------------- cut here --------------------------
PATH=/bin:/usr/bin:/usr/ucb
echo Extracting 'LISTING'
sed 's/^X//' > 'LISTING' << '+ END-OF-FILE ''LISTING'
X-rw-r--r-- 1 ast 3370 Jul 14 14:21 at_wini.c.cdif
X-rw-r--r-- 1 ast 2324 Jul 14 14:21 clock.c.cdif
X-rw-r--r-- 1 ast 540 Jul 14 14:21 dmp.c.cdif
X-rw-r--r-- 1 ast 4409 Jul 14 14:21 floppy.c.cdif
X-rw-r--r-- 1 ast 3587 Jul 14 14:21 klib88.s.cdif
X-rw-r--r-- 1 ast 3477 Jul 14 14:21 main.c.cdif
X-rw-r--r-- 1 ast 2549 Jul 14 14:21 mpx88.s.cdif
X-rw-r--r-- 1 ast 1953 Jul 14 14:21 printer.c.cdif
X-rw-r--r-- 1 ast 8615 Jul 14 14:22 proc.c.cdif
X-rw-r--r-- 1 ast 543 Jul 14 14:22 table.c.cdif
X-rw-r--r-- 1 ast 55255 Jul 14 14:22 tty.c.cdif
X-rw-r--r-- 1 ast 16044 Jul 14 14:22 wini.c.new
+ END-OF-FILE LISTING
chmod 'u=rw,g=r,o=r' 'LISTING'
set `wc -c 'LISTING'`
count=$1
case $count in
694) :;;
*) echo 'Bad character count in ''LISTING' >&2
echo 'Count should be 694' >&2
esac
echo Extracting 'at_wini.c.cdif'
sed 's/^X//' > 'at_wini.c.cdif' << '+ END-OF-FILE ''at_wini.c.cdif'
X*** /local/ast/minix/tape3a/kernel/at_wini.c Sun Jun 26 23:10:37 1988
X--- at_wini.c Wed Jul 13 16:59:17 1988
X***************
X*** 189,195 ****
X {
X extern phys_bytes umap();
X phys_bytes usr_buf = umap(proc_addr(wn->wn_procnr), D, wn->wn_address, BLOCK_SIZE);
X! register int i;
X int r = 0;
X
X /* The command is issued by outputing 7 bytes to the controller chip. */
X--- 189,195 ----
X {
X extern phys_bytes umap();
X phys_bytes usr_buf = umap(proc_addr(wn->wn_procnr), D, wn->wn_address, BLOCK_SIZE);
X! register int i, old_state;
X int r = 0;
X
X /* The command is issued by outputing 7 bytes to the controller chip. */
X***************
X*** 212,220 ****
X if (wn->wn_opcode == DISK_READ) {
X for (i=0; i> 4), (unsigned)(usr_buf & 0x0F));
X! unlock();
X usr_buf += 0x200;
X if (win_results() != OK) {
X w_need_reset = TRUE;
X--- 212,220 ----
X if (wn->wn_opcode == DISK_READ) {
X for (i=0; i> 4), (unsigned)(usr_buf & 0x0F));
X! restore(old_state);
X usr_buf += 0x200;
X if (win_results() != OK) {
X w_need_reset = TRUE;
X***************
X*** 230,238 ****
X return(ERR);
X }
X for (i=0; i> 4), (unsigned)(usr_buf & 0x0F));
X! unlock();
X usr_buf += 0x200;
X receive(HARDWARE, &w_mess);
X if (win_results() != OK) {
X--- 230,238 ----
X return(ERR);
X }
X for (i=0; i> 4), (unsigned)(usr_buf&0x0F));
X! restore(old_state);
X usr_buf += 0x200;
X receive(HARDWARE, &w_mess);
X if (win_results() != OK) {
X***************
X*** 257,271 ****
X * like the controller refusing to respond.
X */
X
X! int i, r;
X
X /* Strobe reset bit low. */
X! lock();
X port_out(WIN_REG9, 4);
X for (i = 0; i < 10; i++)
X ;
X port_out(WIN_REG9, wini[0].wn_ctlbyte & 0x0F);
X! unlock();
X for (i = 0; i < MAX_WIN_RETRY && drive_busy(); i++)
X ;
X if (drive_busy()) {
X--- 257,271 ----
X * like the controller refusing to respond.
X */
X
X! int i, r, old_state;
X
X /* Strobe reset bit low. */
X! old_state = lock();
X port_out(WIN_REG9, 4);
X for (i = 0; i < 10; i++)
X ;
X port_out(WIN_REG9, wini[0].wn_ctlbyte & 0x0F);
X! restore(old_state);
X for (i = 0; i < MAX_WIN_RETRY && drive_busy(); i++)
X ;
X if (drive_busy()) {
X***************
X*** 385,391 ****
X {
X /* Output the command block to the winchester controller and return status */
X
X! register int i;
X int r;
X
X if (drive_busy()) {
X--- 385,391 ----
X {
X /* Output the command block to the winchester controller and return status */
X
X! register int i, old_state;
X int r;
X
X if (drive_busy()) {
X***************
X*** 393,403 ****
X return(ERR);
X }
X r = WIN_REG2;
X! lock();
X port_out(WIN_REG9, command[0]);
X for (i=1; i<8; i++, r++)
X port_out(r, command[i]);
X! unlock();
X return(OK);
X }
X
X--- 393,403 ----
X return(ERR);
X }
X r = WIN_REG2;
X! old_state = lock();
X port_out(WIN_REG9, command[0]);
X for (i=1; i<8; i++, r++)
X port_out(r, command[i]);
X! restore(old_state);
X return(OK);
X }
X
+ END-OF-FILE at_wini.c.cdif
chmod 'u=rw,g=r,o=r' 'at_wini.c.cdif'
set `wc -c 'at_wini.c.cdif'`
count=$1
case $count in
3370) :;;
*) echo 'Bad character count in ''at_wini.c.cdif' >&2
echo 'Count should be 3370' >&2
esac
echo Extracting 'clock.c.cdif'
sed 's/^X//' > 'clock.c.cdif' << '+ END-OF-FILE ''clock.c.cdif'
X*** /local/ast/minix/tape3a/kernel/clock.c Fri Jun 3 21:40:38 1988
X--- clock.c Thu Jul 14 00:00:18 1988
X***************
X*** 53,58 ****
X--- 53,59 ----
X PRIVATE struct proc *prev_ptr; /* last user process run by clock task */
X PRIVATE message mc; /* message buffer for both input and output */
X PRIVATE int (*watch_dog[NR_TASKS+1])(); /* watch_dog functions to call */
X+ extern int flush_flag; /* tells clock when to flush the tty buf */
X
X /*===========================================================================*
X * clock_task *
X***************
X*** 189,194 ****
X--- 190,196 ----
X }
X
X accounting(); /* keep track of who is using the cpu */
X+ if (flush_flag) rs_flush(); /* flush accumulated tty input */
X
X /* If a user process has been running too long, pick another one. */
X if (--sched_ticks == 0) {
X***************
X*** 203,223 ****
X
X }
X
X /*===========================================================================*
X * accounting *
X *===========================================================================*/
X PRIVATE accounting()
X {
X! /* Update user and system accounting times. The variable 'bill_ptr' is always
X! * kept pointing to the process to charge for CPU usage. If the CPU was in
X! * user code prior to this clock tick, charge the tick as user time, otherwise
X! * charge it as system time.
X */
X
X! if (prev_proc >= LOW_USER)
X! bill_ptr->user_time++; /* charge CPU time */
X! else
X! bill_ptr->sys_time++; /* charge system time */
X }
X
X
X--- 205,232 ----
X
X }
X
X+
X /*===========================================================================*
X * accounting *
X *===========================================================================*/
X PRIVATE accounting()
X {
X! /*
X! * Update user and system accounting times. Charge the current process for
X! * user time or system time. In addition, if the current proces (i.e.
X! * prev_proc, because cur_proc is always CLOCK) is a task, charge it too.
X! * This is just for the F1 display.
X */
X
X! register struct proc *rp;
X!
X! if (prev_proc >= LOW_USER) {
X! bill_ptr->user_time++; /* user time */
X! } else {
X! bill_ptr->sys_time++; /* system time */
X! rp = proc_addr(prev_proc);
X! if (prev_proc != IDLE) rp->sys_time++;
X! }
X }
X
X
+ END-OF-FILE clock.c.cdif
chmod 'u=rw,g=r,o=r' 'clock.c.cdif'
set `wc -c 'clock.c.cdif'`
count=$1
case $count in
2324) :;;
*) echo 'Bad character count in ''clock.c.cdif' >&2
echo 'Count should be 2324' >&2
esac
echo Extracting 'dmp.c.cdif'
sed 's/^X//' > 'dmp.c.cdif' << '+ END-OF-FILE ''dmp.c.cdif'
X*** /local/ast/minix/tape3a/kernel/dmp.c Fri Jun 3 21:40:39 1988
X--- dmp.c Wed Jul 13 16:59:18 1988
X***************
X*** 32,38 ****
X extern phys_bytes umap();
X
X printf(
X! "\nproc -pid- -pc- -sp- flag user -sys- base limit recv command\n");
X
X dst = umap(proc_addr(SYSTASK), D, (vir_bytes)nbuff, NSIZE);
X
X--- 32,38 ----
X extern phys_bytes umap();
X
X printf(
X! "\nproc -pid- -pc- -sp- flag user -sys- base limit recv command\r\n");
X
X dst = umap(proc_addr(SYSTASK), D, (vir_bytes)nbuff, NSIZE);
X
+ END-OF-FILE dmp.c.cdif
chmod 'u=rw,g=r,o=r' 'dmp.c.cdif'
set `wc -c 'dmp.c.cdif'`
count=$1
case $count in
540) :;;
*) echo 'Bad character count in ''dmp.c.cdif' >&2
echo 'Count should be 540' >&2
esac
echo Extracting 'floppy.c.cdif'
sed 's/^X//' > 'floppy.c.cdif' << '+ END-OF-FILE ''floppy.c.cdif'
X*** /local/ast/minix/tape3a/kernel/floppy.c Sun Jun 26 23:10:39 1988
X--- floppy.c Wed Jul 13 16:59:18 1988
X***************
X*** 283,289 ****
X * 512-byte block starting at physical address 65520).
X */
X
X! int mode, low_addr, high_addr, top_addr, low_ct, high_ct, top_end;
X vir_bytes vir, ct;
X phys_bytes user_phys;
X extern phys_bytes umap();
X--- 283,289 ----
X * 512-byte block starting at physical address 65520).
X */
X
X! int mode, low_addr, high_addr, top_addr, low_ct, high_ct, top_end, s;
X vir_bytes vir, ct;
X phys_bytes user_phys;
X extern phys_bytes umap();
X***************
X*** 308,314 ****
X if (top_end != top_addr) panic("Trying to DMA across 64K boundary", top_addr);
X
X /* Now set up the DMA registers. */
X! lock();
X port_out(DMA_M2, mode); /* set the DMA mode */
X port_out(DMA_M1, mode); /* set it again */
X port_out(DMA_ADDR, low_addr); /* output low-order 8 bits */
X--- 308,314 ----
X if (top_end != top_addr) panic("Trying to DMA across 64K boundary", top_addr);
X
X /* Now set up the DMA registers. */
X! s = lock();
X port_out(DMA_M2, mode); /* set the DMA mode */
X port_out(DMA_M1, mode); /* set it again */
X port_out(DMA_ADDR, low_addr); /* output low-order 8 bits */
X***************
X*** 316,322 ****
X port_out(DMA_TOP, top_addr); /* output highest 4 bits */
X port_out(DMA_COUNT, low_ct); /* output low 8 bits of count - 1 */
X port_out(DMA_COUNT, high_ct); /* output high 8 bits of count - 1 */
X! unlock();
X port_out(DMA_INIT, 2); /* initialize DMA */
X }
X
X--- 316,322 ----
X port_out(DMA_TOP, top_addr); /* output highest 4 bits */
X port_out(DMA_COUNT, low_ct); /* output low 8 bits of count - 1 */
X port_out(DMA_COUNT, high_ct); /* output high 8 bits of count - 1 */
X! restore(s);
X port_out(DMA_INIT, 2); /* initialize DMA */
X }
X
X***************
X*** 339,347 ****
X * turning off motors while we are testing the bits.
X */
X
X! int motor_bit, running, send_mess();
X
X! lock(); /* no interrupts while checking out motor */
X motor_bit = 1 << (fp->fl_drive + 4); /* bit mask for this drive */
X motor_goal = motor_bit | ENABLE_INT | fp->fl_drive;
X if (motor_status & prev_motor) motor_goal |= prev_motor;
X--- 339,347 ----
X * turning off motors while we are testing the bits.
X */
X
X! int motor_bit, running, send_mess(), old_state;
X
X! old_state = lock(); /* no interrupts while checking out motor */
X motor_bit = 1 << (fp->fl_drive + 4); /* bit mask for this drive */
X motor_goal = motor_bit | ENABLE_INT | fp->fl_drive;
X if (motor_status & prev_motor) motor_goal |= prev_motor;
X***************
X*** 349,355 ****
X port_out(DOR, motor_goal);
X motor_status = motor_goal;
X prev_motor = motor_bit; /* record motor started for next time */
X! unlock();
X
X /* If the motor was already running, we don't have to wait for it. */
X if (running) return; /* motor was already running */
X--- 349,355 ----
X port_out(DOR, motor_goal);
X motor_status = motor_goal;
X prev_motor = motor_bit; /* record motor started for next time */
X! restore(old_state);
X
X /* If the motor was already running, we don't have to wait for it. */
X if (running) return; /* motor was already running */
X***************
X*** 581,596 ****
X * like the controller refusing to respond.
X */
X
X! int i, r, status;
X register struct floppy *fp;
X /* Disable interrupts and strobe reset bit low. */
X need_reset = FALSE;
X! lock();
X motor_status = 0;
X motor_goal = 0;
X port_out(DOR, 0); /* strobe reset bit low */
X port_out(DOR, ENABLE_INT); /* strobe it high again */
X! unlock(); /* interrupts allowed again */
X receive(HARDWARE, &mess); /* collect the RESET interrupt */
X
X /* Interrupt from the reset has been received. Continue resetting. */
X--- 581,597 ----
X * like the controller refusing to respond.
X */
X
X! int i, r, status, old_state;
X register struct floppy *fp;
X+
X /* Disable interrupts and strobe reset bit low. */
X need_reset = FALSE;
X! old_state = lock();
X motor_status = 0;
X motor_goal = 0;
X port_out(DOR, 0); /* strobe reset bit low */
X port_out(DOR, ENABLE_INT); /* strobe it high again */
X! restore(old_state); /* interrupts allowed again */
X receive(HARDWARE, &mess); /* collect the RESET interrupt */
X
X /* Interrupt from the reset has been received. Continue resetting. */
+ END-OF-FILE floppy.c.cdif
chmod 'u=rw,g=r,o=r' 'floppy.c.cdif'
set `wc -c 'floppy.c.cdif'`
count=$1
case $count in
4409) :;;
*) echo 'Bad character count in ''floppy.c.cdif' >&2
echo 'Count should be 4409' >&2
esac
echo Extracting 'klib88.s.cdif'
sed 's/^X//' > 'klib88.s.cdif' << '+ END-OF-FILE ''klib88.s.cdif'
X*** /local/ast/minix/tape3a/kernel/klib88.s Fri Jun 3 21:40:50 1988
X--- klib88.s Wed Jul 13 16:59:16 1988
X***************
X*** 6,12 ****
X | port_out: outputs data on an I/O port
X | port_in: inputs data from an I/O port
X | lock: disable interrupts
X- | unlock: enable interrupts
X | restore: restore interrupts (enable/disabled) as they were before lock()
X | build_sig: build 4 word structure pushed onto stack for signals
X | csv: procedure prolog to save the registers
X--- 6,11 ----
X***************
X*** 23,29 ****
X | em_xfer: read or write AT extended memory using the BIOS
X
X | The following procedures are defined in this file and called from outside it.
X! .globl _phys_copy, _cp_mess, _port_out, _port_in, _lock, _unlock, _restore
X .globl _build_sig, csv, cret, _get_chrome, _vid_copy, _get_byte, _reboot
X .globl _wreboot, _dma_read, _dma_write, _em_xfer, _scr_up, _scr_down
X
X--- 22,28 ----
X | em_xfer: read or write AT extended memory using the BIOS
X
X | The following procedures are defined in this file and called from outside it.
X! .globl _phys_copy, _cp_mess, _port_out, _port_in, _lock, _restore
X .globl _build_sig, csv, cret, _get_chrome, _vid_copy, _get_byte, _reboot
X .globl _wreboot, _dma_read, _dma_write, _em_xfer, _scr_up, _scr_down
X
X***************
X*** 221,250 ****
X |*===========================================================================*
X |* lock *
X |*===========================================================================*
X! | Disable CPU interrupts.
X _lock:
X pushf | save flags on stack
X cli | disable interrupts
X! pop lockvar | save flags for possible restoration later
X ret | return to caller
X
X
X |*===========================================================================*
X- |* unlock *
X- |*===========================================================================*
X- | Enable CPU interrupts.
X- _unlock:
X- sti | enable interrupts
X- ret | return to caller
X-
X-
X- |*===========================================================================*
X |* restore *
X |*===========================================================================*
X! | Restore enable/disable bit to the value it had before last lock.
X _restore:
X! push lockvar | push flags as they were before previous lock
X popf | restore flags
X ret | return to caller
X
X
X--- 220,243 ----
X |*===========================================================================*
X |* lock *
X |*===========================================================================*
X! | Disable CPU interrupts. Return old psw as function value.
X _lock:
X pushf | save flags on stack
X cli | disable interrupts
X! pop ax | return flags for restoration later
X ret | return to caller
X
X
X |*===========================================================================*
X |* restore *
X |*===========================================================================*
X! | restore enable/disable bit to the value it had before last lock.
X _restore:
X! push bp | save it
X! mov bp,sp | set up base for indexing
X! push 4(bp) | bp is the psw to be restored
X popf | restore flags
X+ pop bp | restore bp
X ret | return to caller
X
X
X***************
X*** 773,779 ****
X jmp _exit
X
X .data
X- lockvar: .word 0 | place to store flags for lock()/restore()
X vidlock: .word 0 | dummy variable for use with lock prefix
X splimit: .word 0 | stack limit for current task (kernel only)
X tmp: .word 0 | count of bytes already copied
X--- 766,771 ----
+ END-OF-FILE klib88.s.cdif
chmod 'u=rw,g=r,o=r' 'klib88.s.cdif'
set `wc -c 'klib88.s.cdif'`
count=$1
case $count in
3587) :;;
*) echo 'Bad character count in ''klib88.s.cdif' >&2
echo 'Count should be 3587' >&2
esac
echo Extracting 'main.c.cdif'
sed 's/^X//' > 'main.c.cdif' << '+ END-OF-FILE ''main.c.cdif'
X*** /local/ast/minix/tape3a/kernel/main.c Mon Jun 27 22:39:00 1988
X--- main.c Wed Jul 13 16:59:19 1988
X***************
X*** 5,12 ****
X *
X * The entries into this file are:
X * main: MINIX main program
X! * unexpected_int: called when an interrupt to an unused vector < 16 occurs
X! * trap: called when an unexpected trap to a vector >= 16 occurs
X * panic: abort MINIX due to a fatal error
X */
X
X--- 5,12 ----
X *
X * The entries into this file are:
X * main: MINIX main program
X! * unexpected_int: called on an interrupt to an unused vector < 16 occurs
X! * trap: called on an unexpected trap to a vector >= 16 occurs
X * panic: abort MINIX due to a fatal error
X */
X
X***************
X*** 47,53 ****
X
X register struct proc *rp;
X register int t;
X! int i;
X vir_clicks size;
X phys_clicks base_click, mm_base, previous_base;
X phys_bytes phys_b;
X--- 47,53 ----
X
X register struct proc *rp;
X register int t;
X! int i, old_state;
X vir_clicks size;
X phys_clicks base_click, mm_base, previous_base;
X phys_bytes phys_b;
X***************
X*** 56,62 ****
X extern unsigned sizes[8]; /* table filled in by build */
X extern int color, vec_table[], get_chrome();
X extern int s_call(), disk_int(), tty_int(), clock_int(), disk_int();
X! extern int wini_int(), lpr_int(), trp(), rs232_int();
X extern phys_bytes umap();
X extern char get_byte();
X extern struct tasktab tasktab[]; /* see table.c */
X--- 56,62 ----
X extern unsigned sizes[8]; /* table filled in by build */
X extern int color, vec_table[], get_chrome();
X extern int s_call(), disk_int(), tty_int(), clock_int(), disk_int();
X! extern int wini_int(), lpr_int(), trp(), rs232_int(), secondary_int();
X extern phys_bytes umap();
X extern char get_byte();
X extern struct tasktab tasktab[]; /* see table.c */
X***************
X*** 76,82 ****
X * the words at 0x000A, 0x000C, and 0x000E free.
X */
X
X! lock(); /* we can't handle interrupts yet */
X base_click = BASE >> CLICK_SHIFT;
X size = sizes[0] + sizes[1]; /* kernel text + data size in clicks */
X mm_base = base_click + size; /* place where MM starts (in clicks) */
X--- 76,82 ----
X * the words at 0x000A, 0x000C, and 0x000E free.
X */
X
X! old_state = lock(); /* we can't handle interrupts yet */
X base_click = BASE >> CLICK_SHIFT;
X size = sizes[0] + sizes[1]; /* kernel text + data size in clicks */
X mm_base = base_click + size; /* place where MM starts (in clicks) */
X***************
X*** 154,165 ****
X set_vec(SYS_VECTOR, s_call, base_click);
X set_vec(CLOCK_VECTOR, clock_int, base_click);
X set_vec(KEYBOARD_VECTOR, tty_int, base_click);
X set_vec(RS232_VECTOR, rs232_int, base_click);
X set_vec(FLOPPY_VECTOR, disk_int, base_click);
X set_vec(PRINTER_VECTOR, lpr_int, base_click);
X #ifdef AM_KERNEL
X #ifndef NONET
X! set_vec(ETHER_VECTOR, eth_int, base_click);
X #endif
X #endif
X if (pc_at) {
X--- 154,166 ----
X set_vec(SYS_VECTOR, s_call, base_click);
X set_vec(CLOCK_VECTOR, clock_int, base_click);
X set_vec(KEYBOARD_VECTOR, tty_int, base_click);
X+ set_vec(SECONDARY_VECTOR, secondary_int, base_click);
X set_vec(RS232_VECTOR, rs232_int, base_click);
X set_vec(FLOPPY_VECTOR, disk_int, base_click);
X set_vec(PRINTER_VECTOR, lpr_int, base_click);
X #ifdef AM_KERNEL
X #ifndef NONET
X! set_vec(ETHER_VECTOR, eth_int, base_click); /* overwrites RS232 port 2 */
X #endif
X #endif
X if (pc_at) {
+ END-OF-FILE main.c.cdif
chmod 'u=rw,g=r,o=r' 'main.c.cdif'
set `wc -c 'main.c.cdif'`
count=$1
case $count in
3477) :;;
*) echo 'Bad character count in ''main.c.cdif' >&2
echo 'Count should be 3477' >&2
esac
echo Extracting 'mpx88.s.cdif'
sed 's/^X//' > 'mpx88.s.cdif' << '+ END-OF-FILE ''mpx88.s.cdif'
X*** /local/ast/minix/tape3a/kernel/mpx88.s Sun Jun 26 23:13:45 1988
X--- mpx88.s Wed Jul 13 16:59:15 1988
X***************
X*** 10,16 ****
X | The external entry points into this file are:
X | s_call: process or task wants to send or receive a message
X | tty_int: interrupt routine for each key depression and release
X! | rs232_int: interrupt routine for each rs232 interrupt
X | lpr_int: interrupt routine for each line printer interrupt
X | disk_int: disk interrupt routine
X | wini_int: winchester interrupt routine
X--- 10,17 ----
X | The external entry points into this file are:
X | s_call: process or task wants to send or receive a message
X | tty_int: interrupt routine for each key depression and release
X! | rs232_int: interrupt routine for each rs232 interrupt on port 1
X! | secondary: interrupt routine for each rs232 interrupt on port 2
X | lpr_int: interrupt routine for each line printer interrupt
X | disk_int: disk interrupt routine
X | wini_int: winchester interrupt routine
X***************
X*** 31,37 ****
X
X | The following procedures are defined in this file and called from outside it.
X .globl _tty_int, _rs232_int, _lpr_int, _clock_int, _disk_int, _wini_int
X! .globl _eth_int, _s_call, _trp, _restart
X .globl _int00, _int01, _int02, _int03, _int04, _int05, _int06, _int07
X .globl _int08, _int09, _int10, _int11, _int12, _int13, _int14, _int15
X
X--- 32,38 ----
X
X | The following procedures are defined in this file and called from outside it.
X .globl _tty_int, _rs232_int, _lpr_int, _clock_int, _disk_int, _wini_int
X! .globl _eth_int, _s_call, _trp, _restart, _secondary_int
X .globl _int00, _int01, _int02, _int03, _int04, _int05, _int06, _int07
X .globl _int08, _int09, _int10, _int11, _int12, _int13, _int14, _int15
X
X***************
X*** 106,111 ****
X--- 107,123 ----
X _rs232_int: | Interrupt routine for rs232 I/O.
X call save | save the machine state
X mov ax,#1 | which unit caused the interrupt
X+ push ax | pass it as a parameter
X+ call _rs232 | process a rs232 interrupt
X+ jmp _restart | continue execution
X+
X+
X+ |*============================================================================
X+ |* secondary_int *
X+ |*============================================================================
X+ _secondary_int: | Interrupt routine for rs232 port 2
X+ call save | save the machine state
X+ mov ax,#2 | which unit caused the interrupt
X push ax | pass it as a parameter
X call _rs232 | process a rs232 interrupt
X jmp _restart | continue execution
+ END-OF-FILE mpx88.s.cdif
chmod 'u=rw,g=r,o=r' 'mpx88.s.cdif'
set `wc -c 'mpx88.s.cdif'`
count=$1
case $count in
2549) :;;
*) echo 'Bad character count in ''mpx88.s.cdif' >&2
echo 'Count should be 2549' >&2
esac
echo Extracting 'printer.c.cdif'
sed 's/^X//' > 'printer.c.cdif' << '+ END-OF-FILE ''printer.c.cdif'
X*** /local/ast/minix/tape3a/kernel/printer.c Fri Jun 3 21:40:44 1988
X--- printer.c Wed Jul 13 16:59:19 1988
X***************
X*** 90,96 ****
X {
X /* The printer is used by sending TTY_WRITE messages to it. Process one. */
X
X! int i, j, r, value;
X struct proc *rp;
X phys_bytes phys;
X extern phys_bytes umap();
X--- 90,96 ----
X {
X /* The printer is used by sending TTY_WRITE messages to it. Process one. */
X
X! int i, j, r, value, old_state;
X struct proc *rp;
X phys_bytes phys;
X extern phys_bytes umap();
X***************
X*** 98,104 ****
X r = OK; /* so far, no errors */
X
X /* Reject command if printer is busy or count is not positive. */
X! if (pr_busy) r = EAGAIN;
X if (m_ptr->COUNT <= 0) r = EINVAL;
X
X /* Compute the physical address of the data buffer within user space. */
X--- 98,104 ----
X r = OK; /* so far, no errors */
X
X /* Reject command if printer is busy or count is not positive. */
X! if (pr_busy) r = EIO;
X if (m_ptr->COUNT <= 0) r = EINVAL;
X
X /* Compute the physical address of the data buffer within user space. */
X***************
X*** 108,114 ****
X
X if (r == OK) {
X /* Save information needed later. */
X! lock(); /* no interrupts now please */
X caller = m_ptr->m_source;
X proc_nr = m_ptr->PROC_NR;
X pcount = m_ptr->COUNT;
X--- 108,114 ----
X
X if (r == OK) {
X /* Save information needed later. */
X! old_state = lock(); /* no interrupts now please */
X caller = m_ptr->m_source;
X proc_nr = m_ptr->PROC_NR;
X pcount = m_ptr->COUNT;
X***************
X*** 137,143 ****
X }
X
X /* Reply to FS, no matter what happened. */
X! if ((value&STATUS_MASK) == BUSY_STATUS) r = EAGAIN;
X reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r);
X }
X
X--- 137,143 ----
X }
X
X /* Reply to FS, no matter what happened. */
X! if ((value&STATUS_MASK) == BUSY_STATUS) r = EIO;
X reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r);
X }
X
+ END-OF-FILE printer.c.cdif
chmod 'u=rw,g=r,o=r' 'printer.c.cdif'
set `wc -c 'printer.c.cdif'`
count=$1
case $count in
1953) :;;
*) echo 'Bad character count in ''printer.c.cdif' >&2
echo 'Count should be 1953' >&2
esac
echo Extracting 'proc.c.cdif'
sed 's/^X//' > 'proc.c.cdif' << '+ END-OF-FILE ''proc.c.cdif'
X*** /local/ast/minix/tape3a/kernel/proc.c Mon Jun 27 22:39:00 1988
X--- proc.c Wed Jul 13 16:59:20 1988
X***************
X*** 114,120 ****
X }
X
X if (function & RECEIVE) {
X! n = mini_rec(caller, src_dest, m_ptr); /* func = RECEIVE or BOTH */
X rp->p_reg[RET_REG] = n;
X }
X }
X--- 114,120 ----
X }
X
X if (function & RECEIVE) {
X! n = mini_rec(caller, src_dest, m_ptr); /* func = RECEIVE or BOTH*/
X rp->p_reg[RET_REG] = n;
X }
X }
X***************
X*** 148,155 ****
X len = caller_ptr->p_map[D].mem_len;
X vb = (vir_bytes) m_ptr;
X vlo = vb >> CLICK_SHIFT; /* vir click for bottom of message */
X! vhi = (vb + MESS_SIZE - 1) >> CLICK_SHIFT; /* vir click for top of message */
X! if (vhi < vlo || vhi - caller_ptr->p_map[D].mem_vir >= len)return(E_BAD_ADDR);
X
X /* Check for deadlock by 'caller' and 'dest' sending to each other. */
X if (dest_ptr->p_flags & SENDING) {
X--- 148,155 ----
X len = caller_ptr->p_map[D].mem_len;
X vb = (vir_bytes) m_ptr;
X vlo = vb >> CLICK_SHIFT; /* vir click for bottom of message */
X! vhi = (vb + MESS_SIZE - 1) >> CLICK_SHIFT; /* vir click for top of msg */
X! if (vhi < vlo || vhi - caller_ptr->p_map[D].mem_vir >=len)return(E_BAD_ADDR);
X
X /* Check for deadlock by 'caller' and 'dest' sending to each other. */
X if (dest_ptr->p_flags & SENDING) {
X***************
X*** 166,172 ****
X (dest_ptr->p_getfrom == ANY || dest_ptr->p_getfrom == caller)){
X /* Destination is indeed waiting for this message. */
X cp_mess(caller, caller_ptr->p_map[D].mem_phys, m_ptr,
X! dest_ptr->p_map[D].mem_phys, dest_ptr->p_messbuf);
X dest_ptr->p_flags &= ~RECEIVING; /* deblock destination */
X if (dest_ptr->p_flags == 0) ready(dest_ptr);
X } else {
X--- 166,172 ----
X (dest_ptr->p_getfrom == ANY || dest_ptr->p_getfrom == caller)){
X /* Destination is indeed waiting for this message. */
X cp_mess(caller, caller_ptr->p_map[D].mem_phys, m_ptr,
X! dest_ptr->p_map[D].mem_phys, dest_ptr->p_messbuf);
X dest_ptr->p_flags &= ~RECEIVING; /* deblock destination */
X if (dest_ptr->p_flags == 0) ready(dest_ptr);
X } else {
X***************
X*** 205,214 ****
X * Calls from the tasks, MM, and FS are trusted.
X */
X
X! register struct proc *caller_ptr, *sender_ptr, *prev_ptr;
X int sender;
X
X! caller_ptr = proc_addr(caller); /* pointer to caller's proc structure */
X
X /* Check to see if a message from desired source is already available. */
X sender_ptr = caller_ptr->p_callerq;
X--- 205,214 ----
X * Calls from the tasks, MM, and FS are trusted.
X */
X
X! register struct proc *caller_ptr, *sender_ptr, *previous_ptr;
X int sender;
X
X! caller_ptr = proc_addr(caller); /* pointer to caller's proc struct */
X
X /* Check to see if a message from desired source is already available. */
X sender_ptr = caller_ptr->p_callerq;
X***************
X*** 217,233 ****
X sender = sender_ptr - proc - NR_TASKS;
X if (src == ANY || src == sender) {
X /* An acceptable message has been found. */
X! cp_mess(sender, sender_ptr->p_map[D].mem_phys, sender_ptr->p_messbuf,
X! caller_ptr->p_map[D].mem_phys, m_ptr);
X sender_ptr->p_flags &= ~SENDING; /* deblock sender */
X if (sender_ptr->p_flags == 0) ready(sender_ptr);
X if (sender_ptr == caller_ptr->p_callerq)
X caller_ptr->p_callerq = sender_ptr->p_sendlink;
X else
X! prev_ptr->p_sendlink = sender_ptr->p_sendlink;
X return(OK);
X }
X! prev_ptr = sender_ptr;
X sender_ptr = sender_ptr->p_sendlink;
X }
X }
X--- 217,233 ----
X sender = sender_ptr - proc - NR_TASKS;
X if (src == ANY || src == sender) {
X /* An acceptable message has been found. */
X! cp_mess(sender, sender_ptr->p_map[D].mem_phys,
X! sender_ptr->p_messbuf, caller_ptr->p_map[D].mem_phys, m_ptr);
X sender_ptr->p_flags &= ~SENDING; /* deblock sender */
X if (sender_ptr->p_flags == 0) ready(sender_ptr);
X if (sender_ptr == caller_ptr->p_callerq)
X caller_ptr->p_callerq = sender_ptr->p_sendlink;
X else
X! previous_ptr->p_sendlink = sender_ptr->p_sendlink;
X return(OK);
X }
X! previous_ptr = sender_ptr;
X sender_ptr = sender_ptr->p_sendlink;
X }
X }
X***************
X*** 264,271 ****
X * slot, namely, that of task -1 (HARDWARE), so save() will have somewhere to
X * deposit the registers when an interrupt occurs on an idle machine.
X * Record previous process so that when clock tick happens, the clock task
X! * can find out who was running just before it began to run. (While the
X! * clock task is running, 'cur_proc' = CLOCKTASK.) In addition, set 'bill_ptr'
X * to always point to the process to be billed for CPU time.
X */
X prev_proc = cur_proc;
X--- 264,271 ----
X * slot, namely, that of task -1 (HARDWARE), so save() will have somewhere to
X * deposit the registers when an interrupt occurs on an idle machine.
X * Record previous process so that when clock tick happens, the clock task
X! * can find out who was running just before it began to run. (While the clock
X! * task is running, 'cur_proc' = CLOCKTASK.) In addition, set 'bill_ptr'
X * to always point to the process to be billed for CPU time.
X */
X prev_proc = cur_proc;
X***************
X*** 296,304 ****
X */
X
X register int q; /* TASK_Q, SERVER_Q, or USER_Q */
X! int r;
X
X! lock(); /* disable interrupts */
X r = (rp - proc) - NR_TASKS; /* task or proc number */
X q = (r < 0 ? TASK_Q : r < LOW_USER ? SERVER_Q : USER_Q);
X
X--- 296,304 ----
X */
X
X register int q; /* TASK_Q, SERVER_Q, or USER_Q */
X! int r, old_state;
X
X! old_state = lock(); /* disable interrupts */
X r = (rp - proc) - NR_TASKS; /* task or proc number */
X q = (r < 0 ? TASK_Q : r < LOW_USER ? SERVER_Q : USER_Q);
X
X***************
X*** 309,315 ****
X rdy_tail[q]->p_nextready = rp; /* add to tail of nonempty queue */
X rdy_tail[q] = rp; /* new entry has no successor */
X rp->p_nextready = NIL_PROC;
X! restore(); /* restore interrupts to previous state */
X }
X
X
X--- 309,315 ----
X rdy_tail[q]->p_nextready = rp; /* add to tail of nonempty queue */
X rdy_tail[q] = rp; /* new entry has no successor */
X rp->p_nextready = NIL_PROC;
X! restore(old_state); /* restore interrupts to previous state */
X }
X
X
X***************
X*** 322,334 ****
X /* A process has blocked. */
X
X register struct proc *xp;
X! int r, q;
X
X! lock(); /* disable interrupts */
X r = rp - proc - NR_TASKS;
X q = (r < 0 ? TASK_Q : r < LOW_USER ? SERVER_Q : USER_Q);
X if ( (xp = rdy_head[q]) == NIL_PROC) {
X! restore();
X return;
X }
X if (xp == rp) {
X--- 322,334 ----
X /* A process has blocked. */
X
X register struct proc *xp;
X! int r, q, old_state;
X
X! old_state = lock(); /* disable interrupts */
X r = rp - proc - NR_TASKS;
X q = (r < 0 ? TASK_Q : r < LOW_USER ? SERVER_Q : USER_Q);
X if ( (xp = rdy_head[q]) == NIL_PROC) {
X! restore(old_state);
X return;
X }
X if (xp == rp) {
X***************
X*** 341,354 ****
X */
X while (xp->p_nextready != rp)
X if ( (xp = xp->p_nextready) == NIL_PROC) {
X! restore();
X return;
X }
X xp->p_nextready = xp->p_nextready->p_nextready;
X while (xp->p_nextready != NIL_PROC) xp = xp->p_nextready;
X rdy_tail[q] = xp;
X }
X! restore(); /* restore interrupts to previous state */
X }
X
X
X--- 341,354 ----
X */
X while (xp->p_nextready != rp)
X if ( (xp = xp->p_nextready) == NIL_PROC) {
X! restore(old_state);
X return;
X }
X xp->p_nextready = xp->p_nextready->p_nextready;
X while (xp->p_nextready != NIL_PROC) xp = xp->p_nextready;
X rdy_tail[q] = xp;
X }
X! restore(old_state); /* restore interrupts to prev state */
X }
X
X
X***************
X*** 362,370 ****
X * possibly promoting another user to head of the queue.
X */
X
X! lock(); /* disable interrupts */
X if (rdy_head[USER_Q] == NIL_PROC) {
X! restore(); /* restore interrupts to previous state */
X return;
X }
X
X--- 362,372 ----
X * possibly promoting another user to head of the queue.
X */
X
X! int old_state;
X!
X! old_state = lock(); /* disable interrupts */
X if (rdy_head[USER_Q] == NIL_PROC) {
X! restore(old_state); /* restore interrupts to prev state */
X return;
X }
X
X***************
X*** 374,378 ****
X rdy_head[USER_Q] = rdy_head[USER_Q]->p_nextready;
X rdy_tail[USER_Q]->p_nextready = NIL_PROC;
X pick_proc();
X! restore(); /* restore interrupts to previous state */
X }
X--- 376,380 ----
X rdy_head[USER_Q] = rdy_head[USER_Q]->p_nextready;
X rdy_tail[USER_Q]->p_nextready = NIL_PROC;
X pick_proc();
X! restore(old_state); /* restore interrupts to prev state */
X }
+ END-OF-FILE proc.c.cdif
chmod 'u=rw,g=r,o=r' 'proc.c.cdif'
set `wc -c 'proc.c.cdif'`
count=$1
case $count in
8615) :;;
*) echo 'Bad character count in ''proc.c.cdif' >&2
echo 'Count should be 8615' >&2
esac
echo Extracting 'table.c.cdif'
sed 's/^X//' > 'table.c.cdif' << '+ END-OF-FILE ''table.c.cdif'
X*** /local/ast/minix/tape3a/kernel/table.c Fri Jun 3 21:40:45 1988
X--- table.c Wed Jul 13 16:59:21 1988
X***************
X*** 93,99 ****
X mem_task, MEM_STACK, "RAMDSK",
X clock_task, CLOCK_STACK, "CLOCK ",
X sys_task, SYS_STACK, "SYS ",
X! 0, 0, "HARDWR",
X 0, 0, "MM ",
X 0, 0, "FS ",
X 0, 0, "INIT "
X--- 93,99 ----
X mem_task, MEM_STACK, "RAMDSK",
X clock_task, CLOCK_STACK, "CLOCK ",
X sys_task, SYS_STACK, "SYS ",
X! 0, 0, "IDLE ",
X 0, 0, "MM ",
X 0, 0, "FS ",
X 0, 0, "INIT "
+ END-OF-FILE table.c.cdif
chmod 'u=rw,g=r,o=r' 'table.c.cdif'
set `wc -c 'table.c.cdif'`
count=$1
case $count in
543) :;;
*) echo 'Bad character count in ''table.c.cdif' >&2
echo 'Count should be 543' >&2
esac
exit 0