From ac0995259d0a04a6b4d056d039c580195740630e Mon Sep 17 00:00:00 2001 From: Jorrit Herder Date: Mon, 2 May 2005 14:30:04 +0000 Subject: [PATCH] *** empty log message *** --- Makefile | 7 +- commands/scripts/MAKEDEV.sh | 7 +- commands/scripts/checkhier.sh | 2 - drivers/at_wini/at_wini.c | 21 ++---- drivers/floppy/floppy.c | 42 +++--------- drivers/libdriver/driver.c | 31 --------- drivers/printer/printer.c | 21 +++--- drivers/tty/Makefile | 8 +-- drivers/tty/keyboard.c | 5 +- drivers/tty/tty.c | 27 +++----- drivers/tty/tty.h | 2 - include/minix/com.h | 17 ++--- include/minix/syslib.h | 16 ++--- kernel/Makefile | 4 +- kernel/build | Bin 62852 -> 0 bytes kernel/const.h | 3 + kernel/glo.h | 4 +- kernel/i8259.c | 2 +- kernel/main.c | 10 +-- kernel/misc.c | 4 -- kernel/mpx386.s | 8 +-- kernel/pci.c | 3 + kernel/proc.c | 31 --------- kernel/proc.h | 3 - kernel/proto.h | 10 --- kernel/rtl8139.c | 2 + kernel/sendmask.h | 3 +- kernel/system.c | 124 ++-------------------------------- kernel/system/Makefile | 4 +- kernel/system/copying.c | 30 ++++++-- kernel/system/irqctl.c | 100 ++++++++++----------------- kernel/system/misc.c | 53 +++------------ kernel/system/sysctl.c | 2 +- kernel/type.h | 34 +++------- lib/syslib/sys_irqctl.c | 16 ++--- servers/is/dmp.c | 16 ++--- tools/Makefile | 4 +- 37 files changed, 187 insertions(+), 489 deletions(-) delete mode 100755 kernel/build diff --git a/Makefile b/Makefile index 650714608..0efd85852 100755 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ usage: @echo "Master Makefile for MINIX commands and utilities." >&2 @echo "Usage:" >&2 @echo " make world # Compile everything (libraries & commands)" >&2 + @echo " make includes # Install include files from src/" >&2 @echo " make libraries # Compile and install libraries" >&2 @echo " make commands # Compile commands, but don't install" >&2 @echo " make install # Compile and install commands" >&2 @@ -23,6 +24,9 @@ usage: # 'make install' target. world: etcfiles includes libraries commands install +includes: + cd include && $(MAKE) install + libraries: cd lib && $(MAKE) install @@ -40,9 +44,6 @@ clean:: etcfiles:: cd etc && $(MAKE) install -includes:: - cd include && $(MAKE) install - all install clean:: cd boot && $(MAKE) $@ test ! -f commands/Makefile || { cd commands && $(MAKE) $@; } diff --git a/commands/scripts/MAKEDEV.sh b/commands/scripts/MAKEDEV.sh index 213c1b7d3..18f8693f8 100755 --- a/commands/scripts/MAKEDEV.sh +++ b/commands/scripts/MAKEDEV.sh @@ -18,7 +18,7 @@ case $#:$1 in cat >&2 <irq = w_drive < 2 ? AT_WINI_0_IRQ : AT_WINI_1_IRQ; -#if DEAD_CODE - sys_irqsetpolicy(w_wn->irq, (IRQ_READ_PORT | IRQ_BYTE | IRQ_REENABLE), SELF, - (w_wn->base + REG_STATUS), &w_byteval, 0); -#else - sys_irqsetpolicy(w_wn->irq, IRQ_REENABLE, SELF, 0, 0, 0); -#endif - sys_irqenable(wn->irq); + if ((s=sys_irqsetpolicy(wn->irq, IRQ_REENABLE, &wn->irq_hook_id)) != OK) + server_panic("AT", "coudn't set IRQ policy", s); + if ((s=sys_irqenable(&wn->irq_hook_id)) != OK) + server_panic("AT", "coudn't enable IRQ line", s); return(OK); } @@ -841,11 +834,7 @@ PRIVATE void w_intr_wait() if (m.m_type == SYN_ALARM) { /* but check for timeout */ w_timeout(); /* a.o. set w_status */ } else if (m.m_type == HARD_INT) { -#if DEAD_CODE - w_status = w_byteval; /* read by generic handler */ -#else sys_inb((w_wn->base + REG_STATUS), &w_status); -#endif } } } else { diff --git a/drivers/floppy/floppy.c b/drivers/floppy/floppy.c index 53430714e..d9b1cfb6e 100644 --- a/drivers/floppy/floppy.c +++ b/drivers/floppy/floppy.c @@ -213,6 +213,7 @@ PRIVATE struct floppy { /* main drive struct, one entry per drive */ struct device fl_part[NR_PARTITIONS]; /* partition's base & size */ } floppy[NR_DRIVES]; +PRIVATE int irq_hook_id; /* id of irq hook at the kernel */ PRIVATE int motor_status; /* bitmap of current motor status */ PRIVATE int need_reset; /* set to 1 when controller must be reset */ PRIVATE unsigned f_drive; /* selected drive */ @@ -222,9 +223,6 @@ PRIVATE struct density *f_dp; /* current density parameters */ PRIVATE struct density *prev_dp;/* previous density parameters */ PRIVATE unsigned f_sectors; /* equal to f_dp->secpt (needed a lot) */ PRIVATE u16_t f_busy; /* BSY_IDLE, BSY_IO, BSY_WAKEN */ -#if DEAD_CODE -PRIVATE irq_hook_t f_hook; /* interrupt hook */ -#endif PRIVATE struct device *f_dv; /* device's base and size */ PRIVATE struct disk_parameter_s fmt_param; /* parameters for format */ PRIVATE u8_t f_results[MAX_RESULTS];/* the controller can give lots of output */ @@ -253,9 +251,6 @@ FORWARD _PROTOTYPE( void start_motor, (void) ); FORWARD _PROTOTYPE( int seek, (void) ); FORWARD _PROTOTYPE( int fdc_transfer, (int opcode) ); FORWARD _PROTOTYPE( int fdc_results, (void) ); -#if DEAD_CODE -FORWARD _PROTOTYPE( int f_handler, (irq_hook_t *hook) ); -#endif FORWARD _PROTOTYPE( int fdc_command, (u8_t *cmd, int len) ); FORWARD _PROTOTYPE( void fdc_out, (int val) ); FORWARD _PROTOTYPE( int recalibrate, (void) ); @@ -291,7 +286,7 @@ PUBLIC void main() /* Initialize the floppy structure and the timers. */ struct floppy *fp; - int irqs; + int s; f_next_timeout = TMR_NEVER; tmr_inittimer(&f_tmr_timeout); @@ -304,10 +299,10 @@ PUBLIC void main() } /* Set IRQ policy, only request notifications. */ - if ((irqs=sys_irqsetpolicy(FLOPPY_IRQ, 0, SELF, 0, 0, 0 )) != OK) - server_panic("FLOPPY", "Couldn't set IRQ policy", irqs); - if ((irqs=sys_irqenable(FLOPPY_IRQ)) != OK) - server_panic("FLOPPY", "Couldn't enable IRQs", irqs); + if ((s=sys_irqsetpolicy(FLOPPY_IRQ, 0, &irq_hook_id )) != OK) + server_panic("FLOPPY", "Couldn't set IRQ policy", s); + if ((s=sys_irqenable(&irq_hook_id)) != OK) + server_panic("FLOPPY", "Couldn't enable IRQs", s); printf("FLOPPY: user-level floppy disk driver initialized\n"); driver_task(&f_dtab); @@ -878,7 +873,6 @@ PRIVATE int fdc_results() int s, result_nr, status; static int timeout; /* must be static if not cancelled */ - int irqs; /* Extract bytes from FDC until it says it has no more. The loop is * really an outer loop on result_nr and an inner loop on status. @@ -903,8 +897,8 @@ PRIVATE int fdc_results() continue; } if (status == MASTER) { /* all read */ - if ((irqs=sys_irqenable(FLOPPY_IRQ)) != OK) - server_panic("FLOPPY", "Couldn't enable IRQs", irqs); + if ((s=sys_irqenable(&irq_hook_id)) != OK) + server_panic("FLOPPY", "Couldn't enable IRQs", s); /* Disabling the alarm is not needed, because a static flag * is used and a leftover timeout cannot do any harm. It is @@ -916,28 +910,12 @@ PRIVATE int fdc_results() } while (! timeout); need_reset = TRUE; /* controller chip must be reset */ - if ((irqs=sys_irqenable(FLOPPY_IRQ)) != OK) - server_panic("FLOPPY", "Couldn't enable IRQs", irqs); + if ((s=sys_irqenable(&irq_hook_id)) != OK) + server_panic("FLOPPY", "Couldn't enable IRQs", s); return(ERR_STATUS); } -#if DEAD_CODE -/*==========================================================================* - * f_handler * - *==========================================================================*/ -PRIVATE int f_handler(hook) -irq_hook_t *hook; -{ -/* FDC interrupt, send message to floppy task. */ -#if DEAD_CODE - f_busy = BSY_IDLE; -#endif - notify(FLOPPY, HARD_INT); - return 0; -} -#endif - /*===========================================================================* * fdc_command * diff --git a/drivers/libdriver/driver.c b/drivers/libdriver/driver.c index 84007fd6e..22e4251f0 100644 --- a/drivers/libdriver/driver.c +++ b/drivers/libdriver/driver.c @@ -96,14 +96,6 @@ struct driver *dp; /* Device dependent entry points. */ caller = mess.m_source; proc_nr = mess.PROC_NR; -#if DEAD_CODE /* drivers, like TTY can have any number */ - /* Check if legitimate caller: FS or a task. */ - if (caller != FS_PROC_NR && caller >= 0) { - printf("%s: got message from %d\n", (*dp->dr_name)(), caller); - continue; - } -#endif - /* Now carry out the work. */ switch(mess.m_type) { case DEV_OPEN: r = (*dp->dr_open)(dp, &mess); break; @@ -234,14 +226,6 @@ message *mp; /* pointer to read or write message */ if (OK != sys_datacopy(mp->m_source, (vir_bytes) mp->ADDRESS, SELF, (vir_bytes) iovec, iovec_size)) server_panic((*dp->dr_name)(),"bad I/O vector by", mp->m_source); -#if DEAD_CODE - sys_umap(mp->m_source, (vir_bytes) mp->ADDRESS, - iovec_size, &user_iovec_phys); - if (user_iovec_phys == 0) - server_panic((*dp->dr_name)(),"bad I/O vector by", mp->m_source); - iovec_phys = vir2phys(iovec); - phys_copy(user_iovec_phys, iovec_phys, (phys_bytes) iovec_size); -#endif iov = iovec; } @@ -255,9 +239,6 @@ message *mp; /* pointer to read or write message */ if (mp->m_source >= 0) { sys_datacopy(SELF, (vir_bytes) iovec, mp->m_source, (vir_bytes) mp->ADDRESS, iovec_size); -#if DEAD_CODE - phys_copy(iovec_phys, user_iovec_phys, (phys_bytes) iovec_size); -#endif } return(r); } @@ -387,17 +368,8 @@ message *mp; /* pointer to ioctl request */ /* Decode the message parameters. */ if ((dv = (*dp->dr_prepare)(mp->DEVICE)) == NIL_DEV) return(ENXIO); -#if DEAD_CODE - sys_umap(mp->PROC_NR, D, (vir_bytes) mp->ADDRESS, sizeof(entry), &user_phys); - if (user_phys == 0) return(EFAULT); - entry_phys = vir2phys(&entry); -#endif - if (mp->REQUEST == DIOCSETP) { /* Copy just this one partition table entry. */ -#if DEAD_CODE - phys_copy(user_phys, entry_phys, (phys_bytes) sizeof(entry)); -#endif if (OK != (s=sys_datacopy(mp->PROC_NR, (vir_bytes) mp->ADDRESS, SELF, (vir_bytes) &entry, sizeof(entry)))) return s; @@ -408,9 +380,6 @@ message *mp; /* pointer to ioctl request */ entry.base = dv->dv_base; entry.size = dv->dv_size; (*dp->dr_geometry)(&entry); -#if DEAD_CODE - phys_copy(entry_phys, user_phys, (phys_bytes) sizeof(entry)); -#endif if (OK != (s=sys_datacopy(SELF, (vir_bytes) &entry, mp->PROC_NR, (vir_bytes) mp->ADDRESS, sizeof(entry)))) return s; diff --git a/drivers/printer/printer.c b/drivers/printer/printer.c index 367f8aa2d..4d47f6697 100644 --- a/drivers/printer/printer.c +++ b/drivers/printer/printer.c @@ -97,6 +97,7 @@ PRIVATE int proc_nr; /* user requesting the printing */ PRIVATE int user_left; /* bytes of output left in user buf */ PRIVATE vir_bytes user_vir; /* address of remainder of user buf */ PRIVATE int writing; /* nonzero while write is in progress */ +PRIVATE int irq_hook_id; /* id of irq hook at kernel */ FORWARD _PROTOTYPE( void do_cancel, (message *m_ptr) ); FORWARD _PROTOTYPE( void output_done, (void) ); @@ -278,21 +279,15 @@ PRIVATE void do_initialize() if (initialized) return; initialized = TRUE; -#if DEAD_CODE - /* Get the base port for first printer. This used to be done from the - * BIOS with phys_copy(0x408L, vir2phys(&port_base), 2L); but currently - * a magic number is put in place. - */ - port_base = 0x378; -#endif + /* Get the base port for first printer. */ sys_vircopy(SELF, BIOS_SEG, LPT1_IO_PORT_ADDR, SELF, D, (vir_bytes) &port_base, LPT1_IO_PORT_SIZE); sys_outb(port_base + 2, INIT_PRINTER); tick_delay(1); /* easily satisfies Centronics minimum */ /* was 2 millisecs; now is ~17 millisecs */ sys_outb(port_base + 2, SELECT); - sys_irqsetpolicy(PRINTER_IRQ, SELF, 0, 0, 0, 0); - sys_irqenable(PRINTER_IRQ); + sys_irqsetpolicy(PRINTER_IRQ, 0, &irq_hook_id); + sys_irqenable(&irq_hook_id); } @@ -338,7 +333,7 @@ PRIVATE void do_printer_output() * interrupt status does not affect the printer. */ sys_outb(port_base + 2, SELECT); - sys_irqenable(PRINTER_IRQ); + sys_irqenable(&irq_hook_id); return; } @@ -354,7 +349,7 @@ PRIVATE void do_printer_output() * pr_restart, since they are not synchronized with printer * interrupts. It may happen after a spurious interrupt. */ - sys_irqenable(PRINTER_IRQ); + sys_irqenable(&irq_hook_id); return; } if ((status & STATUS_MASK) == NORMAL_STATUS) { @@ -370,7 +365,7 @@ PRIVATE void do_printer_output() /* Error. This would be better ignored (treat as busy). */ done_status = status; output_done(); - sys_irqenable(PRINTER_IRQ); + sys_irqenable(&irq_hook_id); return; } } @@ -379,7 +374,7 @@ PRIVATE void do_printer_output() /* Finished printing chunk OK. */ done_status = OK; output_done(); - sys_irqenable(PRINTER_IRQ); + sys_irqenable(&irq_hook_id); } diff --git a/drivers/tty/Makefile b/drivers/tty/Makefile index 8e72718fd..cd48fc9b5 100644 --- a/drivers/tty/Makefile +++ b/drivers/tty/Makefile @@ -46,11 +46,11 @@ a = $d/drivers.h $b/interrupt.h $b/bios.h \ $m/syslib.h $s/types.h \ $m/utils.h $m/serverassert.h $m/devio.h -tty.o: $a -console.o: $a +tty.o: tty.h $a +console.o: tty.h $a vidcopy.o: # nothing -keyboard.o: $a -rs232.o: $a $i/termios.h $i/signal.h +keyboard.o: tty.h $a +rs232.o: tty.h $a $i/termios.h $i/signal.h diff --git a/drivers/tty/keyboard.c b/drivers/tty/keyboard.c index ff6d3b30f..a8bf03aa1 100644 --- a/drivers/tty/keyboard.c +++ b/drivers/tty/keyboard.c @@ -363,6 +363,7 @@ tty_t *tp; { /* Initialize the keyboard driver. */ static int count = 0; + int irq_hook_id; int i; tp->tty_devread = kb_read; /* input function */ @@ -379,9 +380,9 @@ tty_t *tp; } /* Set interrupt handler and enable keyboard IRQ. */ - if ((i=sys_irqsetpolicy(KEYBOARD_IRQ, IRQ_REENABLE, SELF, 0, 0, 0)) != OK) + if ((i=sys_irqsetpolicy(KEYBOARD_IRQ, IRQ_REENABLE, &irq_hook_id)) != OK) server_panic("TTY", "Couldn't set keyboard IRQ policy", i); - if ((i=sys_irqenable(KEYBOARD_IRQ)) != OK) + if ((i=sys_irqenable(&irq_hook_id)) != OK) server_panic("TTY", "Couldn't enable keyboard IRQs", i); } } diff --git a/drivers/tty/tty.c b/drivers/tty/tty.c index 4dfac5334..77ab6ad4e 100644 --- a/drivers/tty/tty.c +++ b/drivers/tty/tty.c @@ -277,6 +277,7 @@ register message *m_ptr; /* pointer to message sent to the task */ { /* A process wants to read from a terminal. */ int r, status; + phys_bytes phys_addr; /* Check if there is already a process hanging in a read, check if the * parameters are correct, do I/O. @@ -286,11 +287,10 @@ register message *m_ptr; /* pointer to message sent to the task */ } else if (m_ptr->COUNT <= 0) { r = EINVAL; -#if DEAD_CODE /* to be replaced by check on tp->tty_instatus !!! */ } else - if (numap_local(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT) == 0) { + if (sys_umap(m_ptr->PROC_NR, D, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT, + &phys_addr) != OK) { r = EFAULT; -#endif } else { /* Copy information from the message to the tty struct. */ tp->tty_inrepcode = TASK_REPLY; @@ -319,21 +319,15 @@ register message *m_ptr; /* pointer to message sent to the task */ } /* Anything waiting in the input buffer? Clear it out... */ - tp->tty_instatus = OK; /* start with OK, check later */ in_transfer(tp); /* ...then go back for more. */ - if (tp->tty_instatus == OK) - handle_events(tp); + handle_events(tp); if (tp->tty_inleft == 0) return; /* already done */ /* There were no bytes in the input queue available, so either suspend * the caller or break off the read if nonblocking. */ - if (tp->tty_instatus != OK) { /* error occurred */ - r = tp->tty_instatus; - tp->tty_inleft = tp->tty_incum = 0; /* cancel the read */ - } if (m_ptr->TTY_FLAGS & O_NONBLOCK) { r = EAGAIN; /* cancel the read */ tp->tty_inleft = tp->tty_incum = 0; @@ -355,6 +349,7 @@ register message *m_ptr; /* pointer to message sent to the task */ { /* A process wants to write on a terminal. */ int r; + phys_bytes phys_addr; /* Check if there is already a process hanging in a write, check if the * parameters are correct, do I/O. @@ -364,11 +359,10 @@ register message *m_ptr; /* pointer to message sent to the task */ } else if (m_ptr->COUNT <= 0) { r = EINVAL; -#if DEAD_CODE /* to be replaced by check on tp->tty_outstatus (!!!) */ } else - if (numap_local(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT) == 0) { + if (sys_umap(m_ptr->PROC_NR, D, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT, + &phys_addr) != OK) { r = EFAULT; -#endif } else { /* Copy message parameters to the tty structure. */ tp->tty_outrepcode = TASK_REPLY; @@ -378,18 +372,13 @@ register message *m_ptr; /* pointer to message sent to the task */ tp->tty_outleft = m_ptr->COUNT; /* Try to write. */ - tp->tty_outstatus = OK; /* start with OK, check later */ handle_events(tp); if (tp->tty_outleft == 0) return; /* already done */ /* None or not all the bytes could be written, so either suspend the * caller or break off the write if nonblocking. */ - if (tp->tty_outstatus != OK) { /* error occurred */ - r = tp->tty_outstatus; - tp->tty_outleft = tp->tty_outcum = 0; /* cancel the write */ - } - else if (m_ptr->TTY_FLAGS & O_NONBLOCK) { /* cancel the write */ + if (m_ptr->TTY_FLAGS & O_NONBLOCK) { /* cancel the write */ r = tp->tty_outcum > 0 ? tp->tty_outcum : EAGAIN; tp->tty_outleft = tp->tty_outcum = 0; } else { diff --git a/drivers/tty/tty.h b/drivers/tty/tty.h index 5f4223ee5..f28b4930e 100644 --- a/drivers/tty/tty.h +++ b/drivers/tty/tty.h @@ -51,14 +51,12 @@ typedef struct tty { vir_bytes tty_in_vir; /* virtual address where data is to go */ int tty_inleft; /* how many chars are still needed */ int tty_incum; /* # chars input so far */ - int tty_instatus; /* status of last sys_vircopy() action */ char tty_outrepcode; /* reply code, TASK_REPLY or REVIVE */ char tty_outcaller; /* process that made the call (usually FS) */ char tty_outproc; /* process that wants to write to tty */ vir_bytes tty_out_vir; /* virtual address where data comes from */ int tty_outleft; /* # chars yet to be output */ int tty_outcum; /* # chars output so far */ - int tty_outstatus; /* status of last sys_vircopy() action */ char tty_iocaller; /* process that made the call (usually FS) */ char tty_ioproc; /* process that wants to do an ioctl */ int tty_ioreq; /* ioctl request code */ diff --git a/include/minix/com.h b/include/minix/com.h index ea3095252..11424ef48 100755 --- a/include/minix/com.h +++ b/include/minix/com.h @@ -74,7 +74,7 @@ * blocking notifications are delivered. The lowest numbers go first. The * offset are used for the per-process notification bit maps. */ -#define NR_NOTIFICATIONS 5 /* max. is # bits in notify_mask_t */ +#define NR_NOTIFICATIONS 5 /* number of bits in notify_mask_t */ # define NOTIFICATION 333 /* offset for notification types */ # define HARD_INT NOTIFICATION + 0 /* hardware interrupt */ # define SYN_ALARM NOTIFICATION + 1 /* synchronous alarm */ @@ -129,7 +129,8 @@ # define KMEM_DEV 2 /* minor device for /dev/kmem */ # define NULL_DEV 3 /* minor device for /dev/null */ # define BOOT_DEV 4 /* minor device for /dev/boot */ -# define RANDOM_DEV 5 /* minor device for /dev/random */ +# define RANDOM_DEV 5 /* minor device for /dev/(u)random */ +# define URANDOM_DEV RANDOM_DEV # define ZERO_DEV 6 /* minor device for /dev/zero */ /* Full device numbers that are special to the boot monitor and FS. */ @@ -272,18 +273,12 @@ # define IRQ_DISABLE 3 /* disable interrupts */ #define IRQ_VECTOR m5_c2 /* irq vector */ #define IRQ_POLICY m5_i1 /* options for IRQCTL request */ -# define IRQ_READ_PORT 0x001 /* read port and return value */ -# define IRQ_WRITE_PORT 0x002 /* write given value to port */ -# define IRQ_STROBE 0x010 /* write masked value back to port */ -# define IRQ_ECHO_VAL 0x020 /* write value read back to port */ -# define IRQ_REENABLE 0x040 /* reenable IRQ line after interrupt */ +# define IRQ_REENABLE 0x001 /* reenable IRQ line after interrupt */ # define IRQ_BYTE 0x100 /* byte values */ # define IRQ_WORD 0x200 /* word values */ # define IRQ_LONG 0x400 /* long values */ #define IRQ_PROC_NR m5_i2 /* process number, SELF, NONE */ -#define IRQ_PORT m5_l1 /* port to read or write */ -#define IRQ_VIR_ADDR m5_l2 /* address to store value read */ -#define IRQ_MASK_VAL m5_l3 /* value or strobe mask */ +#define IRQ_HOOK_ID m5_l3 /* id of irq hook at kernel */ /* Names of message field and paramaters for SYS_EXIT request. */ #define EXIT_STATUS m2_i1 /* zero for normal exit, non-zero else */ @@ -333,7 +328,7 @@ # define GET_PROCNR 3 /* find nr of process with name */ # define GET_MONPARAMS 4 /* get monitor parameters */ # define GET_KENV 5 /* get kernel environment string */ -# define GET_IRQTAB 6 /* get the IRQ table */ +# define GET_IRQHOOKS 6 /* get the IRQ table */ # define GET_KMESSAGES 7 /* get kernel messages */ # define GET_MEMCHUNKS 8 /* get base+size of mem chunks */ # define GET_KADDRESSES 9 /* get various kernel addresses */ diff --git a/include/minix/syslib.h b/include/minix/syslib.h index 9697dd9f6..f59d5861f 100755 --- a/include/minix/syslib.h +++ b/include/minix/syslib.h @@ -73,14 +73,14 @@ _PROTOTYPE(int sys_signalrm, (int proc_nr, clock_t *ticks) ); _PROTOTYPE(int sys_syncalrm, (int proc_nr, clock_t exp_time, int abs_time) ); /* Shorthands for sys_irqctl() system call. */ -#define sys_irqdisable(irq_vec) \ - sys_irqctl(IRQ_DISABLE, irq_vec, 0, 0, 0, 0, 0) -#define sys_irqenable(irq_vec) \ - sys_irqctl(IRQ_ENABLE, irq_vec, 0, 0, 0, 0, 0) -#define sys_irqsetpolicy(irq_vec, policy, proc_nr, port, val_ptr, mask_val) \ - sys_irqctl(IRQ_SETPOLICY, irq_vec, policy, proc_nr, port, val_ptr, mask_val) +#define sys_irqdisable(hook_id) \ + sys_irqctl(IRQ_DISABLE, 0, 0, hook_id) +#define sys_irqenable(hook_id) \ + sys_irqctl(IRQ_ENABLE, 0, 0, hook_id) +#define sys_irqsetpolicy(irq_vec, policy, hook_id) \ + sys_irqctl(IRQ_SETPOLICY, irq_vec, policy, hook_id) _PROTOTYPE ( int sys_irqctl, (int request, int irq_vec, int policy, - int proc_nr, long port, void *val_ptr, long mask_val) ); + int *irq_hook_id) ); /* Shorthands for sys_vircopy() and sys_physcopy() system calls. */ #define sys_biosin(bios_vir, dst_vir, bytes) \ @@ -116,7 +116,7 @@ _PROTOTYPE(int sys_kmalloc, (size_t size, phys_bytes *phys_base) ); #define sys_getproc(dst,nr) sys_getinfo(GET_PROC, dst, 0,0, nr) #define sys_getprocnr(dst,k,kl) sys_getinfo(GET_PROCNR, dst, 0,k,kl) #define sys_getimage(dst) sys_getinfo(GET_IMAGE, dst, 0,0,0) -#define sys_getirqtab(dst) sys_getinfo(GET_IRQTAB, dst, 0,0,0) +#define sys_getirqhooks(dst) sys_getinfo(GET_IRQHOOKS, dst, 0,0,0) #define sys_getmemchunks(dst) sys_getinfo(GET_MEMCHUNKS, dst, 0,0,0) #define sys_getmonparams(v,vl) sys_getinfo(GET_MONPARAMS, v,vl, 0,0) #define sys_getkenv(k,kl,v,vl) sys_getinfo(GET_KENV, v,vl, k,kl) diff --git a/kernel/Makefile b/kernel/Makefile index 10f9f1d45..1fe974f36 100755 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -30,7 +30,7 @@ SYS = system/system.a # What to make. kernel build: $(HEAD) $(OBJS) $(SYS) - $(LD) $(LDFLAGS) -o $@ $(HEAD) $(OBJS) $(SYS) $(CLOCK) $(LIBS) + $(LD) $(LDFLAGS) -o kernel $(HEAD) $(OBJS) $(SYS) $(CLOCK) $(LIBS) install -S 0 $@ $(SYS): @@ -164,7 +164,7 @@ system/system.a: $a $h/devio.h $h/com.h system/system.a: proc.h protect.h system.h sendmask.h system/system.a: $s/ptrace.h $s/sigcontext.h system/system.a: $i/signal.h $i/unistd.h -system/system.a: system/alarms.c +system/system.a: system/clock.c system/system.a: system/copying.c system/system.a: system/devio.c system/system.a: system/irqctl.c diff --git a/kernel/build b/kernel/build deleted file mode 100755 index 8573f6fba6a90421e85c19bd43313c8f63070cf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62852 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 diff --git a/kernel/const.h b/kernel/const.h index a8f78a836..f10755338 100755 --- a/kernel/const.h +++ b/kernel/const.h @@ -30,6 +30,9 @@ /* How many elements in vector of virtual copy requests. */ #define VCOPY_VEC_SIZE 16 +/* How many IRQ hooks are there in total. */ +#define NR_IRQ_HOOKS 16 + /* Program stack words and masks. */ #define INIT_PSW 0x0200 /* initial psw */ #define INIT_TASK_PSW 0x1200 /* initial psw for tasks (with IOPL 1) */ diff --git a/kernel/glo.h b/kernel/glo.h index ebb844ba2..4e793d6da 100755 --- a/kernel/glo.h +++ b/kernel/glo.h @@ -37,8 +37,8 @@ EXTERN unsigned lost_ticks; /* clock ticks counted outside the clock task */ #if (CHIP == INTEL) /* Interrupt related variables. */ -EXTERN struct irqtab irqtab[NR_IRQ_VECTORS]; /* table with IRQ policies */ -EXTERN irq_hook_t *irq_hooks[NR_IRQ_VECTORS]; /* list of IRQ handlers */ +EXTERN irq_hook_t irq_hooks[NR_IRQ_HOOKS]; /* hooks for general use */ +EXTERN irq_hook_t *irq_handlers[NR_IRQ_VECTORS];/* list of IRQ handlers */ EXTERN int irq_actids[NR_IRQ_VECTORS]; /* IRQ ID bits active */ EXTERN int irq_use; /* bit map of all in-use irq's */ diff --git a/kernel/i8259.c b/kernel/i8259.c index b46ee57fc..51bada0ae 100755 --- a/kernel/i8259.c +++ b/kernel/i8259.c @@ -97,7 +97,7 @@ irq_handler_t handler; if ((unsigned) irq >= NR_IRQ_VECTORS) panic("invalid call to put_irq_handler", irq); - line = &irq_hooks[irq]; + line = &irq_handlers[irq]; id = 1; while (*line != NULL) { if (hook == *line) return; /* extra initialization */ diff --git a/kernel/main.c b/kernel/main.c index ed8de0e2a..08ea09a35 100755 --- a/kernel/main.c +++ b/kernel/main.c @@ -27,8 +27,10 @@ #include "proc.h" #include "sendmask.h" -/* Prototype declarations for PRIVATE function. */ -FORWARD _PROTOTYPE( void announce, (void)); /* display user message */ +/* Prototype declarations for PRIVATE functions. */ +FORWARD _PROTOTYPE( void announce, (void)); +FORWARD _PROTOTYPE( void shutdown, (struct timer *tp)); + #define STOP_TICKS (5*HZ) /* time allowed to stop */ /*===========================================================================* @@ -244,6 +246,7 @@ int how; /* 0 = halt, 1 = reboot, 2 = panic!, ... */ shutdown(&shutdown_timer); /* TTY isn't scheduled */ } else { kprintf("\nNotifying system services about MINIX shutdown.\n", NO_ARG); + kprintf("Known bug: hitting a key before done will hang the monitor.\n", NO_ARG); stop_sequence(&shutdown_timer); } } @@ -304,14 +307,13 @@ timer_t *tp; /*==========================================================================* * shutdown * *==========================================================================*/ -PUBLIC void shutdown(tp) +PRIVATE void shutdown(tp) timer_t *tp; { /* This function is called from prepare_shutdown or stop_sequence to bring * down MINIX. How to shutdown is in the argument: RBT_REBOOT, RBT_HALT, * RBT_RESET. */ - int quiet, code; static u16_t magic = STOP_MEM_CHECK; int how = tmr_arg(tp)->ta_int; diff --git a/kernel/misc.c b/kernel/misc.c index 10a9746e2..a7b48bf82 100755 --- a/kernel/misc.c +++ b/kernel/misc.c @@ -2,10 +2,6 @@ * panic abort MINIX due to a fatal error * bad_assertion for debugging * bad_compare for debugging - * - * Changes: - * Oct 04, 2004 moved panic() to this file (Jorrit N. Herder) - * Sep 30, 2004 removed mem_init(), env_parse to lib (Jorrit N. Herder) */ #include "kernel.h" diff --git a/kernel/mpx386.s b/kernel/mpx386.s index 0cec0784c..ef5d5caad 100755 --- a/kernel/mpx386.s +++ b/kernel/mpx386.s @@ -224,9 +224,9 @@ csinit: outb INT_CTLMASK /* disable the irq */;\ movb al, ENABLE ;\ outb INT_CTL /* reenable master 8259 */;\ - push (_irq_hooks+4*irq) /* irq_hooks[irq] */;\ + push (_irq_handlers+4*irq) /* irq_handlers[irq] */;\ sti /* enable interrupts */;\ - call _intr_handle /* intr_handle(irq_hooks[irq]) */;\ + call _intr_handle /* intr_handle(irq_handlers[irq]) */;\ cli /* disable interrupts */;\ pop ecx ;\ cmp (_irq_actids+4*irq), 0 /* interrupt still active? */;\ @@ -280,10 +280,10 @@ _hwint07: ! Interrupt routine for irq 7 (printer) outb INT2_CTLMASK /* disable the irq */;\ movb al, ENABLE ;\ outb INT_CTL /* reenable master 8259 */;\ - push (_irq_hooks+4*irq) /* irq_hooks[irq] */;\ + push (_irq_handlers+4*irq) /* irq_handlers[irq] */;\ outb INT2_CTL /* reenable slave 8259 */;\ sti /* enable interrupts */;\ - call _intr_handle /* intr_handle(irq_hooks[irq]) */;\ + call _intr_handle /* intr_handle(irq_handlers[irq]) */;\ cli /* disable interrupts */;\ pop ecx ;\ cmp (_irq_actids+4*irq), 0 /* interrupt still active? */;\ diff --git a/kernel/pci.c b/kernel/pci.c index a71183019..3ddd1b0b6 100755 --- a/kernel/pci.c +++ b/kernel/pci.c @@ -25,6 +25,9 @@ Created: Jan 2000 by Philip Homburg #define irq_mode_pci(irq) ((void)0) #endif +#include +#include +#include #include INIT_SERVER_ASSERT diff --git a/kernel/proc.c b/kernel/proc.c index 184a21423..00da3cc48 100755 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -491,7 +491,6 @@ PRIVATE void sched() PUBLIC void lock_pick_proc() { /* Safe gateway to pick_proc() for tasks. */ - switching = TRUE; pick_proc(); switching = FALSE; @@ -504,7 +503,6 @@ PUBLIC void lock_ready(rp) struct proc *rp; /* this process is now runnable */ { /* Safe gateway to ready() for tasks. */ - switching = TRUE; ready(rp); switching = FALSE; @@ -517,7 +515,6 @@ PUBLIC void lock_unready(rp) struct proc *rp; /* this process is no longer runnable */ { /* Safe gateway to unready() for tasks. */ - switching = TRUE; unready(rp); switching = FALSE; @@ -529,7 +526,6 @@ struct proc *rp; /* this process is no longer runnable */ PUBLIC void lock_sched() { /* Safe gateway to sched() for tasks. */ - switching = TRUE; sched(); switching = FALSE; @@ -565,31 +561,4 @@ PUBLIC void unhold() while ( (rp = held_head) != NIL_PROC); } -#if (CHIP == M68000) -/*==========================================================================* - * cp_mess * - *==========================================================================*/ -PRIVATE void cp_mess(src, src_p, src_m, dst_p, dst_m) -int src; /* sender process */ -register struct proc *src_p; /* source proc entry */ -message *src_m; /* source message */ -register struct proc *dst_p; /* destination proc entry */ -message *dst_m; /* destination buffer */ -{ - /* convert virtual address to physical address */ - /* The caller has already checked if all addresses are within bounds */ - - src_m = (message *)((char *)src_m + (((phys_bytes)src_p->p_map[D].mem_phys - - src_p->p_map[D].mem_vir) << CLICK_SHIFT)); - dst_m = (message *)((char *)dst_m + (((phys_bytes)dst_p->p_map[D].mem_phys - - dst_p->p_map[D].mem_vir) << CLICK_SHIFT)); - -#ifdef NEEDFSTRUCOPY - phys_copy(src_m,dst_m,(phys_bytes) sizeof(message)); -#else - *dst_m = *src_m; -#endif - dst_m->m_source = src; -} -#endif diff --git a/kernel/proc.h b/kernel/proc.h index 937555aa9..a3a5b64a4 100755 --- a/kernel/proc.h +++ b/kernel/proc.h @@ -64,9 +64,6 @@ struct proc { unsigned p_pendcount; /* count of pending and unfinished signals */ char p_name[PROC_NAME_LEN]; /* name of the process, including \0 */ -#if ENABLE_MESSAGE_STATS - int msg_unreplied[NR_TASKS+NR_PROCS]; -#endif }; /* Guard word for task stacks. */ diff --git a/kernel/proto.h b/kernel/proto.h index 99bab5465..626370912 100755 --- a/kernel/proto.h +++ b/kernel/proto.h @@ -34,8 +34,6 @@ _PROTOTYPE( char *kstrncpy, (char *s1, register const char *s2, register const size_t n)); _PROTOTYPE( unsigned long kstrtoul, (const char *string, char ** const end, int base) ); - -/* kprintf.c */ #define NO_ARG 0 #define karg(arg) (karg_t) (arg) _PROTOTYPE( void kprintf, (const char *fmt, karg_t arg) ); @@ -44,7 +42,6 @@ _PROTOTYPE( void kprintf, (const char *fmt, karg_t arg) ); _PROTOTYPE( void main, (void) ); _PROTOTYPE( void prepare_shutdown, (int how) ); _PROTOTYPE( void stop_sequence, (struct timer *tp) ); -_PROTOTYPE( void shutdown, (struct timer *tp) ); /* misc.c */ _PROTOTYPE( void panic, (_CONST char *s, int n) ); @@ -84,10 +81,6 @@ _PROTOTYPE( void lock_ready, (struct proc *rp) ); _PROTOTYPE( void lock_sched, (void) ); _PROTOTYPE( void lock_unready, (struct proc *rp) ); -/* sb16_dsp.c, sb16_mixer.c */ -_PROTOTYPE( void sb16dsp_task, (void) ); -_PROTOTYPE( void sb16mix_task, (void) ); - /* start.c */ _PROTOTYPE( void cstart, (U16_t cs, U16_t ds, U16_t mds, U16_t parmoff, U16_t parmsize) ); @@ -107,10 +100,7 @@ _PROTOTYPE( phys_bytes umap_remote, (struct proc *rp, int seg, vir_bytes vir_addr, vir_bytes bytes) ); _PROTOTYPE( phys_bytes umap_bios, (struct proc *rp, vir_bytes vir_addr, vir_bytes bytes) ); -_PROTOTYPE( int vir_copy, (int src_proc, vir_bytes src_vir, - int dst_proc, vir_bytes dst_vir, vir_bytes bytes) ); _PROTOTYPE( int generic_handler, (irq_hook_t *hook) ); -_PROTOTYPE( void timed_interrupt, (struct timer *tp) ); /* table.c */ _PROTOTYPE( void mapdrivers, (void) ); diff --git a/kernel/rtl8139.c b/kernel/rtl8139.c index ddea69845..da5b91ed8 100755 --- a/kernel/rtl8139.c +++ b/kernel/rtl8139.c @@ -49,6 +49,8 @@ #include "kernel.h" #include +#include +#include #include #include #include diff --git a/kernel/sendmask.h b/kernel/sendmask.h index 252ec73de..2730a6a27 100644 --- a/kernel/sendmask.h +++ b/kernel/sendmask.h @@ -4,7 +4,8 @@ * (LOW_USER+1) + 1. This means that there are bits for each task, driver, and * server process, INIT, and one bit to represent all ordinary user processes. * - * NOTE: the send masks definitions must be updated!!! + * PLEASE NOTE: the send masks definitions are a mess and must be updated!!! + * this will be done when dynamic driver loading is implemented * * Changes: * May 01, 2004 created and sendmask definitions (Jorrit N. Herder) diff --git a/kernel/system.c b/kernel/system.c index 30757d5f2..de30867e0 100755 --- a/kernel/system.c +++ b/kernel/system.c @@ -100,9 +100,10 @@ PRIVATE void initialize(void) register struct proc *rp; int i; - /* Initialize IRQ table. */ - for (i=0; iirq].policy; - int proc_nr = irqtab[hook->irq].proc_nr; - -#if DEAD_CODE -/* This function handles hardware interrupt in a generic way, according to - * the policy set with SYS_IRQCTL. This is rather complicated since different - * devices require different actions. Options are (1) do nothing, (2a) read a - * port and optionally (2b) strobe the port high or (2c) low with the value - * read, or (3) write a value to a port. Finally, the policy may or may not - * reenable IRQs. A notification is sent in all cases. - */ - long port = irqtab[hook->irq].port; - phys_bytes addr = irqtab[hook->irq].addr; - long mask_val = irqtab[hook->irq].mask_val; - - /* Read a value from the given port. Possibly also strobe the port with the - * read value. Strobe it high by using the mask provided by the caller; - * strobe it low by writing back the value we read. - */ - if (policy & (IRQ_READ_PORT|IRQ_STROBE|IRQ_ECHO_VAL)) { - switch(policy & (IRQ_BYTE|IRQ_WORD|IRQ_LONG)) { - case IRQ_BYTE: { /* byte values */ - u8_t byteval = inb(port); - if (policy & IRQ_STROBE) outb(port, byteval | mask_val); - if (policy & IRQ_ECHO_VAL) outb(port, byteval); - if (policy & IRQ_READ_PORT) - phys_copy(vir2phys(&byteval), addr, sizeof(u8_t)); - break; - } case IRQ_WORD: { /* word values */ - u16_t wordval = inw(port); - if (policy & IRQ_STROBE) outw(port, wordval | mask_val); - if (policy & IRQ_ECHO_VAL) outw(port, wordval); - if (policy & IRQ_READ_PORT) - phys_copy(vir2phys(&wordval), addr, sizeof(u16_t)); - break; - } case IRQ_LONG: { /* long values */ - u32_t longval = inl(port); - if (policy & IRQ_STROBE) outl(port, longval | mask_val); - if (policy & IRQ_ECHO_VAL) outl(port, longval); - if (policy & IRQ_READ_PORT) - phys_copy(vir2phys(&longval), addr, sizeof(u32_t)); - break; - } default: /* do nothing */ ; /* wrong type flags */ - } - } - /* Write a value to some port. This is straightforward. Note that both - * reading and writing is not possible, hence 'else if' instead of 'if'. - */ - else if (policy & (IRQ_WRITE_PORT)) { - switch(policy & (IRQ_BYTE|IRQ_WORD|IRQ_LONG)) { - case IRQ_BYTE: outb(port, (u8_t) mask_val); break; - case IRQ_WORD: outw(port, (u16_t) mask_val); break; - case IRQ_LONG: outl(port, (u32_t) mask_val); break; - default: /* do nothing */ ; /* wrong type flags */ - } - } -#endif /* DEAD_CODE */ - - /* Almost done, send a HARD_INT notification to allow further processing - * and possibly reenable interrupts - this depends on the policy given. - */ - notify(proc_nr, HARD_INT); - return(policy & IRQ_REENABLE); + notify(hook->proc_nr, HARD_INT); + return(hook->policy & IRQ_REENABLE); } @@ -436,33 +376,6 @@ vir_bytes bytes; /* # of bytes required in segment */ } -#if ENABLE_MESSAGE_STATS - -/*===========================================================================* - * do_mstats * - *===========================================================================*/ -PRIVATE int do_mstats(m_ptr) -message *m_ptr; /* pointer to request message */ -{ - int r = 0; - - if(m_ptr->m1_i1 > 0) { - struct message_statentry *dest; - struct proc *p; - p = proc_addr(m_ptr->m1_i3); - dest = proc_vir2phys(p, m_ptr->m1_p1); - r = mstat_copy(dest, m_ptr->m1_i1); - } - - if(m_ptr->m1_i2) { - mstat_reset(); - } - - return r; -} - -#endif /* ENABLE_MESSAGE_STATS */ - /*===========================================================================* * umap_remote * *===========================================================================*/ @@ -549,27 +462,4 @@ vir_bytes bytes; /* # of bytes to copy */ return(OK); } -/*==========================================================================* - * vir_copy * - *==========================================================================*/ -PUBLIC int vir_copy(src_proc, src_vir, dst_proc, dst_vir, bytes) -int src_proc; /* source process */ -vir_bytes src_vir; /* source virtual address within D seg */ -int dst_proc; /* destination process */ -vir_bytes dst_vir; /* destination virtual address within D seg */ -vir_bytes bytes; /* # of bytes to copy */ -{ -/* Copy bytes from one process to another. Meant for the easy cases, where - * speed isn't required. (One can normally do without one of the umaps.) - */ - phys_bytes src_phys, dst_phys; - - src_phys = umap_local(proc_addr(src_proc), D, src_vir, bytes); - dst_phys = umap_local(proc_addr(dst_proc), D, dst_vir, bytes); - if (src_phys == 0 || dst_phys == 0) return(EFAULT); - phys_copy(src_phys, dst_phys, (phys_bytes) bytes); - return(OK); -} - - diff --git a/kernel/system/Makefile b/kernel/system/Makefile index fe1072e3a..6ff615131 100644 --- a/kernel/system/Makefile +++ b/kernel/system/Makefile @@ -19,7 +19,7 @@ LD = $(CC) -.o CFLAGS = -I$i LDFLAGS = -i -SYS = alarms.o copying.o debugging.o devio.o irqctl.o proctl.o \ +SYS = clock.o copying.o debugging.o devio.o irqctl.o proctl.o \ sysctl.o misc.o sigctl.o tracing.o \ # What to make. @@ -39,7 +39,7 @@ a = $h/config.h $h/const.h $h/type.h $h/ipc.h \ # Dependencies from src/kernel/system.h b = $k/system.h $h/com.h $k/proc.h $k/assert.h -alarms.o: $a $b +clock.o: $a $b copying.o: $a $b debugging.o: $a $b devio.o: $a $b $h/devio.h diff --git a/kernel/system/copying.c b/kernel/system/copying.c index a221c8a0c..031c4949e 100644 --- a/kernel/system/copying.c +++ b/kernel/system/copying.c @@ -125,16 +125,34 @@ register message *m_ptr; /* pointer to request message */ PUBLIC int do_umap(m_ptr) register message *m_ptr; /* pointer to request message */ { -/* Same as umap_local(), for non-kernel processes. */ +/* Map virtual address to physical, for non-kernel processes. */ + int seg_type = m_ptr->CP_SRC_SPACE & SEGMENT_TYPE; + int seg_index = m_ptr->CP_SRC_SPACE & SEGMENT_INDEX; + vir_bytes offset = m_ptr->CP_SRC_ADDR; + int count = m_ptr->CP_NR_BYTES; int proc_nr = (int) m_ptr->CP_SRC_PROC_NR; + phys_bytes phys_addr; + + /* Verify process number. */ if (proc_nr == SELF) proc_nr = m_ptr->m_source; if (! isokprocn(proc_nr)) return(EINVAL); - m_ptr->CP_DST_ADDR = umap_local(proc_addr(proc_nr), - (int) m_ptr->CP_SRC_SPACE, - (vir_bytes) m_ptr->CP_SRC_ADDR, - (vir_bytes) m_ptr->CP_NR_BYTES); - return(OK); + /* See which mapping should be made. */ + switch(seg_type) { + case LOCAL_SEG: + phys_addr = umap_local(proc_addr(proc_nr), seg_index, offset, count); + break; + case REMOTE_SEG: + phys_addr = umap_remote(proc_addr(proc_nr), seg_index, offset, count); + break; + case BIOS_SEG: + phys_addr = umap_bios(proc_addr(proc_nr), offset, count); + break; + default: + return(EINVAL); + } + m_ptr->CP_DST_ADDR = phys_addr; + return (phys_addr == 0) ? EFAULT: OK; } diff --git a/kernel/system/irqctl.c b/kernel/system/irqctl.c index c69e5417e..b8e2b65fc 100644 --- a/kernel/system/irqctl.c +++ b/kernel/system/irqctl.c @@ -4,11 +4,8 @@ * The parameters for this system call are: * m5_c1: IRQ_REQUEST (control operation to perform) * m5_c2: IRQ_VECTOR (irq line that must be controlled) - * m5_i1: IRQ_POLICY (flags to control the IRQCTL request) - * m5_i2: IRQ_PROC_NR (process number to notify) - * m5_l1: IRQ_PORT (port to write to / read from) - * m5_l2: IRQ_VIR_ADDR (virtual address at caller) - * m5_l3: IRQ_MASK_VAL (value to be written or strobe mask) + * m5_i1: IRQ_POLICY (irq policy allows reenabling interrupts) + * m5_l3: IRQ_HOOK_ID (index of irq hook assigned at kernel) * * Author: * Jorrit N. Herder @@ -17,91 +14,64 @@ #include "../kernel.h" #include "../system.h" - /*===========================================================================* - * do_irqctl * + * do_irqctl * *===========================================================================*/ PUBLIC int do_irqctl(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Dismember the request message. */ - int irq = m_ptr->IRQ_VECTOR; /* which IRQ vector */ - int policy = m_ptr->IRQ_POLICY; /* policy field with flags */ - int proc_nr = m_ptr->IRQ_PROC_NR; /* process number to forward to */ -#if DEAD_CODE - long port = m_ptr->IRQ_PORT; /* port to read or write */ - vir_bytes vir_addr = m_ptr->IRQ_VIR_ADDR; /* address at caller */ - phys_bytes phys_addr = 0; /* calculate physical address */ - long mask_val = m_ptr->IRQ_MASK_VAL; /* mask or value to be written */ -#endif - - /* Check if IRQ line is acceptable. */ - if ((unsigned) irq >= NR_IRQ_VECTORS) { - kprintf("ST: irq line %d is not acceptable!\n", irq); - return(EINVAL); - } + int irq_vec; + int irq_hook_id; + int proc_nr; + irq_hook_t *hook_ptr; /* See what is requested and take needed actions. */ switch(m_ptr->IRQ_REQUEST) { /* Enable or disable IRQs. This is straightforward. */ case IRQ_ENABLE: { - enable_irq(&irqtab[irq].hook); + irq_hook_id = (unsigned) m_ptr->IRQ_HOOK_ID; + if (irq_hook_id >= NR_IRQ_HOOKS) return(EINVAL); + enable_irq(&irq_hooks[irq_hook_id]); break; } case IRQ_DISABLE: { - disable_irq(&irqtab[irq].hook); + irq_hook_id = (unsigned) m_ptr->IRQ_HOOK_ID; + if (irq_hook_id >= NR_IRQ_HOOKS) return(EINVAL); + disable_irq(&irq_hooks[irq_hook_id]); break; } /* Control IRQ policies. Set a policy and needed details in the IRQ table. * This policy is used by a generic function to handle hardware interrupts. - * The generic_handler() is contained in system.c. */ case IRQ_SETPOLICY: { - if (proc_nr == NONE) { /* remove irqtab entry */ - if (irqtab[irq].proc_nr != m_ptr->m_source) { - return(EPERM); /* only owner may do so */ + /* Check if IRQ line is acceptable. */ + irq_vec = (unsigned) m_ptr->IRQ_VECTOR; + if ((unsigned) irq_vec >= NR_IRQ_VECTORS) { + kprintf("ST: irq line %d is not acceptable!\n", irq_vec); + return(EINVAL); + } + + /* Find a free IRQ hook for this mapping. */ + hook_ptr = NULL; + for (irq_hook_id=0; irq_hook_idm_source; /* set caller's proc nr */ - if (! isokprocn(proc_nr)) { /* check if proc nr is ok */ - kprintf("ST: notify: invalid proc_nr: %d\n", proc_nr); - return(EINVAL); - } -#if DEAD_CODE - if (policy & IRQ_READ_PORT) { /* get phys_addr at caller */ - switch(policy & (IRQ_BYTE|IRQ_WORD|IRQ_LONG)) { - case IRQ_BYTE: phys_addr=numap_local(proc_nr,vir_addr,sizeof( u8_t)); - break; - case IRQ_WORD: phys_addr=numap_local(proc_nr,vir_addr,sizeof(u16_t)); - break; - case IRQ_LONG: phys_addr=numap_local(proc_nr,vir_addr,sizeof(u32_t)); - break; - default: return(EINVAL); /* wrong type flags */ - } - if (phys_addr==0) return(EFAULT); /* invalid address */ - } -#endif - /* Arguments seem to be OK, register them in the IRQ table. */ - irqtab[irq].policy = policy; /* policy for interrupts */ - irqtab[irq].proc_nr = proc_nr; /* process number to notify */ -#if DEAD_CODE - irqtab[irq].port = port; /* port to read or write */ - irqtab[irq].addr = phys_addr; /* address to store status */ - irqtab[irq].mask_val = mask_val; /* strobe mask or value */ -#endif - put_irq_handler(&irqtab[irq].hook, irq, generic_handler); } + if (hook_ptr == NULL) return(ENOSPC); + + /* Only caller can request IRQ mappings. Install handler. */ + hook_ptr->proc_nr = m_ptr->m_source; /* process to notify */ + hook_ptr->policy = m_ptr->IRQ_POLICY; /* policy for interrupts */ + put_irq_handler(hook_ptr, irq_vec, generic_handler); + + /* Return index of the IRQ hook in use. */ + m_ptr->IRQ_HOOK_ID = irq_hook_id; break; } default: diff --git a/kernel/system/misc.c b/kernel/system/misc.c index 2c1c204f0..aa2dc1b83 100644 --- a/kernel/system/misc.c +++ b/kernel/system/misc.c @@ -1,47 +1,8 @@ -/* The system call implemented in this file: - * m_type: SYS_TIMES - * - * The parameters for this system call are: - * m4_l1: T_PROC_NR (get info for this process) - * m4_l1: T_USER_TIME (return values ...) - * m4_l2: T_SYSTEM_TIME - * m4_l3: T_CHILD_UTIME - * m4_l4: T_CHILD_STIME - * m4_l5: T_BOOT_TICKS - */ - #include "../kernel.h" #include "../system.h" #include INIT_ASSERT -/*===========================================================================* - * do_times * - *===========================================================================*/ -PUBLIC int do_times(m_ptr) -register message *m_ptr; /* pointer to request message */ -{ -/* Handle sys_times(). Retrieve the accounting information. */ - - register struct proc *rp; - int proc_nr; - - /* Insert the times needed by the SYS_TIMES system call in the message. */ - proc_nr = (m_ptr->T_PROC_NR == SELF) ? m_ptr->m_source : m_ptr->T_PROC_NR; - if (isokprocn(proc_nr)) { - rp = proc_addr(m_ptr->T_PROC_NR); - - lock(); /* halt the volatile time counters in rp */ - m_ptr->T_USER_TIME = rp->user_time; - m_ptr->T_SYSTEM_TIME = rp->sys_time; - unlock(); - m_ptr->T_CHILD_UTIME = rp->child_utime; - m_ptr->T_CHILD_STIME = rp->child_stime; - } - m_ptr->T_BOOT_TICKS = get_uptime(); - return(OK); -} - /*===========================================================================* * do_unused * @@ -119,8 +80,6 @@ message *m_ptr; /* pointer to request message */ * Jorrit N. Herder */ - - /*===========================================================================* * do_getinfo * *===========================================================================*/ @@ -150,9 +109,9 @@ register message *m_ptr; /* pointer to request message */ src_phys = vir2phys(image); break; } - case GET_IRQTAB: { - length = sizeof(struct irqtab) * NR_IRQ_VECTORS; - src_phys = vir2phys(irqtab); + case GET_IRQHOOKS: { + length = sizeof(struct irq_hook) * NR_IRQ_HOOKS; + src_phys = vir2phys(irq_hooks); break; } case GET_MEMCHUNKS: { @@ -200,6 +159,7 @@ register message *m_ptr; /* pointer to request message */ } else { /* lookup nr by name */ int proc_found = FALSE; struct proc *pp; + struct vir_addr vsrc, vdst; char key[8]; /* storage for process name to lookup */ #if DEAD_CODE /* GET_PROCNR functionality will be moved to the Process Manager! */ @@ -207,8 +167,13 @@ register message *m_ptr; /* pointer to request message */ #endif proc_nr = m_ptr->m_source; /* only caller can request copy */ if (m_ptr->I_KEY_LEN > sizeof(key)) return(EINVAL); + vsrc.proc_nr = proc_nr; vsrc.segment = D; vsrc.offset = (vir_bytes) m_ptr->I_KEY_PTR; + vdst.proc_nr = SYSTASK, vdst.segment = D; vdst.offset = (vir_bytes) key; + if (virtual_copy(&vsrc, &vdst, m_ptr->I_KEY_LEN) != OK) return(EFAULT); +#if DEAD_CODE if (vir_copy(proc_nr, (vir_bytes) m_ptr->I_KEY_PTR, SYSTASK, (vir_bytes) key, m_ptr->I_KEY_LEN) != OK) return(EFAULT); +#endif for (pp=BEG_PROC_ADDR; ppp_name, key, m_ptr->I_KEY_LEN) == 0) { src_phys = vir2phys(&(pp->p_nr)); diff --git a/kernel/system/sysctl.c b/kernel/system/sysctl.c index a67c4f71b..b633e858f 100644 --- a/kernel/system/sysctl.c +++ b/kernel/system/sysctl.c @@ -60,6 +60,7 @@ message *m_ptr; /* pointer to request message */ * m2_p1: CTL_ARG_PTR (argument pointer) */ +/* NOTE: this call will radically change! */ /*===========================================================================* * do_svrctl * @@ -125,7 +126,6 @@ message *m_ptr; /* pointer to request message */ * Jorrit N. Herder */ - /*===========================================================================* * do_segctl * *===========================================================================*/ diff --git a/kernel/type.h b/kernel/type.h index e3ac0e291..6e3045080 100755 --- a/kernel/type.h +++ b/kernel/type.h @@ -2,8 +2,6 @@ #define TYPE_H typedef _PROTOTYPE( void task_t, (void) ); -typedef _PROTOTYPE( int (*rdwt_t), (message *m_ptr) ); -typedef _PROTOTYPE( void (*watchdog_t), (void) ); /* Type accepted by kprintf(). This is a hack to accept both integers and * char pointers in the same argument. @@ -28,11 +26,6 @@ struct memory { phys_clicks size; /* size of memory chunk */ }; -struct bios { - phys_bytes bios_addr; /* physical address at BIOS */ - size_t bios_length; /* size of value */ -}; - #if (CHIP == INTEL) typedef u16_t port_t; @@ -79,30 +72,19 @@ struct segdesc_s { /* segment descriptor for protected mode */ u8_t base_high; }; +typedef unsigned long irq_policy_t; + typedef struct irq_hook { - struct irq_hook *next; - int (*handler)(struct irq_hook *); - int irq; - int id; + struct irq_hook *next; /* next hook in chain */ + int (*handler)(struct irq_hook *); /* interrupt handler */ + int irq; /* IRQ vector number */ + int id; /* id of this hook */ + int proc_nr; /* NONE if not in use */ + irq_policy_t policy; /* bit mask for policy */ } irq_hook_t; typedef int (*irq_handler_t)(struct irq_hook *); -/* The IRQ table is used to handle harware interrupts based on a policy set - * by a device driver. The policy is stored with a SYS_IRQCTL system call and - * used by a generic function to handle hardware interrupts in an appropriate - * way for the device. - */ -typedef unsigned long irq_policy_t; -struct irqtab { - irq_hook_t hook; /* its irq hook */ - irq_policy_t policy; /* bit mask for the policy */ - int proc_nr; /* process number to be notified */ - long port; /* port to be read or written */ - phys_bytes addr; /* absolute address to store or get value */ - long mask_val; /* mask for strobing or value to be written */ -}; - #endif /* (CHIP == INTEL) */ #if (CHIP == M68000) diff --git a/lib/syslib/sys_irqctl.c b/lib/syslib/sys_irqctl.c index 961ab6564..d1bc051ef 100644 --- a/lib/syslib/sys_irqctl.c +++ b/lib/syslib/sys_irqctl.c @@ -3,14 +3,11 @@ /*===========================================================================* * sys_irqctl * *===========================================================================*/ -PUBLIC int sys_irqctl(req, irq_vec, policy, proc_nr, port, val_ptr, mask_val) +PUBLIC int sys_irqctl(req, irq_vec, policy, hook_id) int req; /* IRQ control request */ int irq_vec; /* IRQ vector to control */ int policy; /* bit mask for policy flags */ -int proc_nr; /* process number to notify */ -long port; /* port to read or write */ -void *val_ptr; /* address store value read */ -long mask_val; /* strobe mask or value to write */ +int *hook_id; /* ID of IRQ hook at kernel */ { message m_irq; int s; @@ -19,12 +16,11 @@ long mask_val; /* strobe mask or value to write */ m_irq.IRQ_REQUEST = req; m_irq.IRQ_VECTOR = irq_vec; m_irq.IRQ_POLICY = policy; - m_irq.IRQ_PROC_NR = proc_nr; - m_irq.IRQ_PORT = port; - m_irq.IRQ_VIR_ADDR = (vir_bytes) val_ptr; - m_irq.IRQ_MASK_VAL = mask_val; + m_irq.IRQ_HOOK_ID = *hook_id; - return _taskcall(SYSTASK, SYS_IRQCTL, &m_irq); + s = _taskcall(SYSTASK, SYS_IRQCTL, &m_irq); + if (req == IRQ_SETPOLICY) *hook_id = m_irq.IRQ_HOOK_ID; + return(s); } diff --git a/servers/is/dmp.c b/servers/is/dmp.c index 113f72481..c3bec8af3 100644 --- a/servers/is/dmp.c +++ b/servers/is/dmp.c @@ -168,8 +168,8 @@ PRIVATE void monparams_dmp() PRIVATE void irqtab_dmp() { int i,j,r; - struct irqtab irqtab[NR_IRQ_VECTORS]; - struct irqtab *e; /* irq tab entry */ + struct irq_hook irqhooks[NR_IRQ_HOOKS]; + struct irq_hook *e; /* irq tab entry */ int p; /* policy */ char *irq[] = { "clock", /* 00 */ @@ -190,12 +190,13 @@ PRIVATE void irqtab_dmp() "at_wini_1", /* 15 */ }; - if ((r = sys_getirqtab(irqtab)) != OK) { - report("warning: couldn't get copy of irqtab", r); + if ((r = sys_getirqhooks(irqhooks)) != OK) { + report("warning: couldn't get copy of irq hooks", r); return; } printf("IRQ table dump showing hardware interrupt policies for each IRQ vector.\n"); +#if 0 printf("-irq name/nr- -pnr- --port-- msk_val --addr-- -type-rdp-str-ech-wrp-ena- \n"); for (i=0; iproc_nr!=NONE) printf("%4d ", e->proc_nr); else printf(" "); - printf(" 0x%06x 0x%05x 0x%06x %c%c%c %d %d %d %d %d\n", + printf(" 0x%06x 0x%05x 0x%06x %c%c%c %d\n", e->port, e->mask_val, e->addr, (p&IRQ_BYTE)?'B':'-', (p&IRQ_WORD)?'W':'-', (p&IRQ_LONG)?'L':'-', - ((p&IRQ_READ_PORT) != 0), - ((p&IRQ_STROBE) != 0), - ((p&IRQ_ECHO_VAL) != 0), - ((p&IRQ_WRITE_PORT) != 0), ((p&IRQ_REENABLE) != 0) ); } +#endif printf("\n"); } diff --git a/tools/Makefile b/tools/Makefile index bc911594a..871b702cd 100755 --- a/tools/Makefile +++ b/tools/Makefile @@ -21,7 +21,9 @@ PROGRAMS= ../kernel/kernel \ usage: @echo " " >&2 - @echo "Master Makefile to create new MINIX configuration. Root privileges required." >&2 + @echo "Master Makefile to create new MINIX configuration." >& 2 + @echo "Root privileges are required." >&2 + @echo " " >&2 @echo "Usage:" >&2 @echo " make libraries # Make system libraries" >&2 @echo " make programs # Compile and install all programs" >&2