]> Zhao Yanbai Git Server - minix.git/commitdiff
KERNEL - do_privctl() fix
authorTomas Hruby <thruby@few.vu.nl>
Tue, 18 Oct 2011 18:19:24 +0000 (18:19 +0000)
committerTomas Hruby <tom@minix3.org>
Fri, 13 Jan 2012 11:29:59 +0000 (11:29 +0000)
- after a driver is restarted, do not register permissions
  which are already set again.

kernel/system/do_privctl.c

index 9bdfe84259e361d300ddb497c31e9713d29498de..c67d704cb6f15853ec2ba400057da2a5fa0e6ebc 100644 (file)
@@ -187,6 +187,13 @@ PUBLIC int do_privctl(struct proc * caller, message * m_ptr)
        data_copy(caller->p_endpoint, (vir_bytes) m_ptr->CTL_ARG_PTR,
                KERNEL, (vir_bytes) &io_range, sizeof(io_range));
        priv(rp)->s_flags |= CHECK_IO_PORT;     /* Check I/O accesses */
+
+       for (i = 0; i < priv(rp)->s_nr_io_range; i++) {
+               if (priv(rp)->s_io_tab[i].ior_base == io_range.ior_base &&
+                       priv(rp)->s_io_tab[i].ior_limit == io_range.ior_limit)
+                       return OK;
+       }
+
        i= priv(rp)->s_nr_io_range;
        if (i >= NR_IO_RANGE) {
                printf("do_privctl: %d already has %d i/o ranges.\n",
@@ -213,6 +220,14 @@ PUBLIC int do_privctl(struct proc * caller, message * m_ptr)
                KERNEL, (vir_bytes) &mem_range, sizeof(mem_range))) != OK)
                return r;
        priv(rp)->s_flags |= CHECK_MEM; /* Check memory mappings */
+
+       /* When restarting a driver, check if it already has the premission */
+       for (i = 0; i < priv(rp)->s_nr_mem_range; i++) {
+               if (priv(rp)->s_mem_tab[i].mr_base == mem_range.mr_base &&
+                       priv(rp)->s_mem_tab[i].mr_limit == mem_range.mr_limit)
+                       return OK;
+       }
+
        i= priv(rp)->s_nr_mem_range;
        if (i >= NR_MEM_RANGE) {
                printf("do_privctl: %d already has %d mem ranges.\n",
@@ -238,6 +253,12 @@ PUBLIC int do_privctl(struct proc * caller, message * m_ptr)
                KERNEL, (vir_bytes) &irq, sizeof(irq));
        priv(rp)->s_flags |= CHECK_IRQ; /* Check IRQs */
 
+       /* When restarting a driver, check if it already has the premission */
+       for (i = 0; i < priv(rp)->s_nr_irq; i++) {
+               if (priv(rp)->s_irq_tab[i] == irq)
+                       return OK;
+       }
+
        i= priv(rp)->s_nr_irq;
        if (i >= NR_IRQ) {
                printf("do_privctl: %d already has %d irq's.\n",