Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6336 | serge | 1 | #include |
2 | #include |
||
3 | #include |
||
4 | |||
5 | #define KMAP_MAX 256 |
||
6 | |||
7 | static struct mutex kmap_mutex; |
||
8 | static struct page* kmap_table[KMAP_MAX]; |
||
9 | static int kmap_av; |
||
10 | static int kmap_first; |
||
11 | static void* kmap_base; |
||
12 | |||
13 | int kmap_init() |
||
14 | { |
||
15 | kmap_base = AllocKernelSpace(KMAP_MAX*4096); |
||
16 | if(kmap_base == NULL) |
||
17 | return -1; |
||
18 | |||
19 | kmap_av = KMAP_MAX; |
||
20 | MutexInit(&kmap_mutex); |
||
21 | return 0; |
||
22 | }; |
||
23 | |||
24 | void *kmap(struct page *page) |
||
25 | { |
||
26 | void *vaddr = NULL; |
||
27 | int i; |
||
28 | |||
29 | do |
||
30 | { |
||
31 | MutexLock(&kmap_mutex); |
||
32 | if(kmap_av != 0) |
||
33 | { |
||
34 | for(i = kmap_first; i < KMAP_MAX; i++) |
||
35 | { |
||
36 | if(kmap_table[i] == NULL) |
||
37 | { |
||
38 | kmap_av--; |
||
39 | kmap_first = i; |
||
40 | kmap_table[i] = page; |
||
41 | vaddr = kmap_base + (i<<12); |
||
42 | MapPage(vaddr,(addr_t)page,3); |
||
43 | break; |
||
44 | }; |
||
45 | }; |
||
46 | }; |
||
47 | MutexUnlock(&kmap_mutex); |
||
48 | }while(vaddr == NULL); |
||
49 | |||
50 | return vaddr; |
||
51 | }; |
||
52 | |||
53 | void *kmap_atomic(struct page *page) __attribute__ ((alias ("kmap"))); |
||
54 | |||
55 | void kunmap(struct page *page) |
||
56 | { |
||
57 | void *vaddr; |
||
58 | int i; |
||
59 | |||
60 | MutexLock(&kmap_mutex); |
||
61 | |||
62 | for(i = 0; i < KMAP_MAX; i++) |
||
63 | { |
||
64 | if(kmap_table[i] == page) |
||
65 | { |
||
66 | kmap_av++; |
||
67 | if(i < kmap_first) |
||
68 | kmap_first = i; |
||
69 | kmap_table[i] = NULL; |
||
70 | vaddr = kmap_base + (i<<12); |
||
71 | MapPage(vaddr,0,0); |
||
72 | break; |
||
73 | }; |
||
74 | }; |
||
75 | |||
76 | MutexUnlock(&kmap_mutex); |
||
77 | }; |
||
78 | |||
79 | void kunmap_atomic(void *vaddr) |
||
80 | { |
||
81 | int i; |
||
82 | |||
83 | MapPage(vaddr,0,0); |
||
84 | |||
85 | i = (vaddr - kmap_base) >> 12; |
||
86 | |||
87 | MutexLock(&kmap_mutex); |
||
88 | |||
89 | kmap_av++; |
||
90 | if(i < kmap_first) |
||
91 | kmap_first = i; |
||
92 | kmap_table[i] = NULL; |
||
93 | |||
94 | MutexUnlock(&kmap_mutex); |
||
95 | }>12); |
||
96 |