2006-01-07 Samuel Thibault * i386/i386/iopb.c: Include for io_req_t. New "io" device. (ioopen): New function. (ioclose): Likewise. (io_bitmap_set): Treat special (-1) bit list as "all ports". (io_bitmap_clear): Likewise. diff -urp gnumach-mine-5-io_per_task/i386/i386/iopb.c gnumach-mine-6-io_device/i386/i386/iopb.c --- gnumach-mine-5-io_per_task/i386/i386/iopb.c 2005-12-29 23:42:34.000000000 +0100 +++ gnumach-mine-6-io_device/i386/i386/iopb.c 2006-01-07 00:19:24.000000000 +0100 @@ -38,6 +38,7 @@ #include #include +#include #include "io_port.h" #include "iopb.h" @@ -82,6 +83,32 @@ decl_simple_lock_data(, iopb_lock) /* + * Special "all I/O ports" device. + */ +mach_device_t io_device = 0; + +int ioopen(dev, flag, ior) + int dev; + int flag; + io_req_t ior; +{ + io_device = ior->io_device; + + io_port_create(io_device, (io_reg_t *)(-1)); + return (0); +} + +int +ioclose(dev, flags) + int dev; + int flags; +{ + io_port_destroy(io_device); + io_device = 0; + return 0; +} + +/* * Initialize the package. */ void @@ -130,9 +157,12 @@ io_bitmap_set( { io_reg_t io_bit; - while ((io_bit = *bit_list++) != IO_REG_NULL) { - bp[io_bit>>3] &= ~(1 << (io_bit & 0x7)); - } + if (bit_list == (io_reg_t *)(-1)) + memset(bp, 0, IOPB_BYTES); + else + while ((io_bit = *bit_list++) != IO_REG_NULL) { + bp[io_bit>>3] &= ~(1 << (io_bit & 0x7)); + } } /* @@ -145,9 +175,12 @@ io_bitmap_clear( { io_reg_t io_bit; - while ((io_bit = *bit_list++) != IO_REG_NULL) { - bp[io_bit>>3] |= (1 << (io_bit & 0x7)); - } + if (bit_list == (io_reg_t *)(-1)) + memset(bp, ~0, IOPB_BYTES); + else + while ((io_bit = *bit_list++) != IO_REG_NULL) { + bp[io_bit>>3] |= (1 << (io_bit & 0x7)); + } } /* 2006-01-07 Samuel Thibault * conf.c: New "io" device. (dev_name_list): Added "io" device. diff -urp gnumach-mine-5-io_per_task/i386/i386at/conf.c gnumach-mine-6-io_device/i386/i386at/conf.c --- gnumach-mine-5-io_per_task/i386/i386at/conf.c 2006-01-06 23:43:24.000000000 +0100 +++ gnumach-mine-6-io_device/i386/i386at/conf.c 2006-01-06 23:43:44.000000000 +0100 @@ -182,6 +182,9 @@ extern vm_offset_t ioplmmap(); #define ioplname "iopl" +extern int ioopen(), ioclose(); +#define ioname "io" + extern int kmsgopen(), kmsgclose(), kmsgread(), kmsggetstat(); #define kmsgname "kmsg" @@ -367,6 +370,11 @@ struct dev_ops dev_name_list[] = nodev, nulldev, nulldev, 0, nodev }, + { ioname, ioopen, ioclose, nodev, + nodev, nodev, nodev, nodev, + nodev, nulldev, nulldev, 0, + nodev }, + #if 0 #if NHD > 0 { pchdname, pchdopen, hdclose, pchdread,