Subversion Repositories Kolibri OS

Rev

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
}
96