Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include <ddk.h>
  2. #include <linux/mm.h>
  3. #include <syscall.h>
  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.  
  97.