|
|
1.1 root 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)
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)
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)
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.