root/kernel/ioport.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ios
  2. dump_io_bitmap
  3. sys_ioperm

   1 /*
   2  *      linux/kernel/ioport.c
   3  *
   4  * This contains the io-permission bitmap code - written by obz, with changes
   5  * by Linus.
   6  */
   7 
   8 #include <linux/sched.h>
   9 #include <linux/kernel.h>
  10 
  11 #include <sys/types.h>
  12 #include <errno.h>
  13 
  14 #define _IODEBUG
  15 
  16 #ifdef IODEBUG
  17 static char * ios(unsigned long l)
     /* [previous][next][first][last][top][bottom][index][help] */
  18 {
  19         static char str[33] = { '\0' };
  20         int i;
  21         unsigned long mask;
  22 
  23         for (i = 0, mask = 0x80000000; i < 32; ++i, mask >>= 1)
  24                 str[i] = (l & mask) ? '1' : '0';
  25         return str;
  26 }
  27 
  28 static void dump_io_bitmap(void)
     /* [previous][next][first][last][top][bottom][index][help] */
  29 {
  30         int i, j;
  31         int numl = sizeof(current->tss.io_bitmap) >> 2;
  32 
  33         for (i = j = 0; j < numl; ++i)
  34         {
  35                 printk("%4d [%3x]: ", 64*i, 64*i);
  36                 printk("%s ", ios(current->tss.io_bitmap[j++]));
  37                 if (j < numl)
  38                         printk("%s", ios(current->tss.io_bitmap[j++]));
  39                 printk("\n");
  40         }
  41 }
  42 #endif
  43 
  44 /*
  45  * this changes the io permissions bitmap in the current task.
  46  */
  47 int sys_ioperm(unsigned long from, unsigned long num, int turn_on)
     /* [previous][next][first][last][top][bottom][index][help] */
  48 {
  49         unsigned long froml, lindex, tnum, numl, rindex, mask;
  50         unsigned long *iop;
  51 
  52         froml = from >> 5;
  53         lindex = from & 0x1f;
  54         tnum = lindex + num;
  55         numl = (tnum + 0x1f) >> 5;
  56         rindex = tnum & 0x1f;
  57 
  58         if (!suser())
  59                 return -EPERM;
  60         if (froml * 32 + tnum > sizeof(current->tss.io_bitmap) * 8 - 8)
  61                 return -EINVAL;
  62 
  63 #ifdef IODEBUG
  64         printk("io: from=%d num=%d %s\n", from, num, (turn_on ? "on" : "off"));
  65 #endif
  66 
  67         if (numl) {
  68                 iop = (unsigned long *)current->tss.io_bitmap + froml;
  69                 if (lindex != 0) {
  70                         mask = (~0 << lindex);
  71                         if (--numl == 0 && rindex)
  72                                 mask &= ~(~0 << rindex);
  73                         if (turn_on)
  74                                 *iop++ &= ~mask;
  75                         else
  76                                 *iop++ |= mask;
  77                 }
  78                 if (numl) {
  79                         if (rindex)
  80                                 --numl;
  81                         mask = (turn_on ? 0 : ~0);
  82                         while (numl--)
  83                                 *iop++ = mask;
  84                         if (numl && rindex) {
  85                                 mask = ~(~0 << rindex);
  86                                 if (turn_on)
  87                                         *iop++ &= ~mask;
  88                                 else
  89                                         *iop++ |= mask;
  90                         }
  91                 }
  92         }
  93         return 0;
  94 }

/* [previous][next][first][last][top][bottom][index][help] */