Subversion Repositories Kolibri OS

Rev

Rev 6321 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6321 Rev 6661
Line 158... Line 158...
158
    return c | 0x20;
158
    return c | 0x20;
159
}
159
}
Line 160... Line -...
160
 
-
 
161
 
-
 
162
 
-
 
163
#define KMAP_MAX    256
-
 
164
 
-
 
165
static struct mutex kmap_mutex;
-
 
166
static struct page* kmap_table[KMAP_MAX];
-
 
167
static int kmap_av;
-
 
168
static int kmap_first;
-
 
169
static void* kmap_base;
-
 
170
 
-
 
171
 
-
 
172
int kmap_init()
-
 
173
{
-
 
174
    kmap_base = AllocKernelSpace(KMAP_MAX*4096);
-
 
175
    if(kmap_base == NULL)
-
 
176
        return -1;
-
 
177
 
-
 
178
    kmap_av = KMAP_MAX;
-
 
179
    MutexInit(&kmap_mutex);
-
 
180
    return 0;
-
 
181
};
-
 
182
 
-
 
183
void *kmap(struct page *page)
-
 
184
{
-
 
185
    void *vaddr = NULL;
-
 
186
    int i;
-
 
187
 
-
 
188
    do
-
 
189
    {
-
 
190
        MutexLock(&kmap_mutex);
-
 
191
        if(kmap_av != 0)
-
 
192
        {
-
 
193
            for(i = kmap_first; i < KMAP_MAX; i++)
-
 
194
            {
-
 
195
                if(kmap_table[i] == NULL)
-
 
196
                {
-
 
197
                    kmap_av--;
-
 
198
                    kmap_first = i;
-
 
199
                    kmap_table[i] = page;
-
 
200
                    vaddr = kmap_base + (i<<12);
-
 
201
                    MapPage(vaddr,(addr_t)page,3);
-
 
202
                    break;
-
 
203
                };
-
 
204
            };
-
 
205
        };
-
 
206
        MutexUnlock(&kmap_mutex);
-
 
207
    }while(vaddr == NULL);
-
 
208
 
-
 
209
    return vaddr;
-
 
210
};
-
 
211
 
-
 
212
void *kmap_atomic(struct page *page) __attribute__ ((alias ("kmap")));
-
 
213
 
-
 
214
void kunmap(struct page *page)
-
 
215
{
-
 
216
    void *vaddr;
-
 
217
    int   i;
-
 
218
 
-
 
219
    MutexLock(&kmap_mutex);
-
 
220
 
-
 
221
    for(i = 0; i < KMAP_MAX; i++)
-
 
222
    {
-
 
223
        if(kmap_table[i] == page)
-
 
224
        {
-
 
225
            kmap_av++;
-
 
226
            if(i < kmap_first)
-
 
227
                kmap_first = i;
-
 
228
            kmap_table[i] = NULL;
-
 
229
            vaddr = kmap_base + (i<<12);
-
 
230
            MapPage(vaddr,0,0);
-
 
231
            break;
-
 
232
        };
-
 
233
    };
-
 
234
 
-
 
235
    MutexUnlock(&kmap_mutex);
-
 
236
};
-
 
237
 
-
 
238
void kunmap_atomic(void *vaddr)
-
 
239
{
-
 
240
    int i;
-
 
241
 
-
 
242
    MapPage(vaddr,0,0);
-
 
243
 
-
 
244
    i = (vaddr - kmap_base) >> 12;
-
 
245
 
-
 
246
    MutexLock(&kmap_mutex);
-
 
247
 
-
 
248
    kmap_av++;
-
 
249
    if(i < kmap_first)
-
 
250
        kmap_first = i;
-
 
251
    kmap_table[i] = NULL;
-
 
252
 
160
 
253
    MutexUnlock(&kmap_mutex);
161
 
254
}
162
 
255
void msleep(unsigned int msecs)
163
void msleep(unsigned int msecs)
Line 889... Line 797...
889
void vfree(const void *addr)
797
void vfree(const void *addr)
890
{
798
{
891
    KernelFree(addr);
799
    KernelFree(addr);
892
}
800
}
Line -... Line 801...
-
 
801
 
-
 
802
 
-
 
803
int set_memory_uc(unsigned long addr, int numpages)
-
 
804
{
-
 
805
    return 0;
-
 
806
};
-
 
807
 
-
 
808
int set_memory_wb(unsigned long addr, int numpages)
-
 
809
{
-
 
810
    return 0;