Subversion Repositories Kolibri OS

Rev

Rev 3290 | Rev 3480 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3263 Serge 1
#include 
2
#include 
3260 Serge 3
#include 
4
#include 
5
#include "i915_drv.h"
6
#include "intel_drv.h"
7
 
8
 
9
struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags)
10
{
11
    struct file *filep;
12
    int count;
13
 
14
    filep = malloc(sizeof(*filep));
15
 
16
    if(unlikely(filep == NULL))
17
        return ERR_PTR(-ENOMEM);
18
 
19
    count = size / PAGE_SIZE;
20
 
21
    filep->pages = kzalloc(sizeof(struct page *) * count, 0);
22
    if(unlikely(filep->pages == NULL))
23
    {
24
        kfree(filep);
25
        return ERR_PTR(-ENOMEM);
26
    };
27
 
28
    filep->count     = count;
29
    filep->allocated = 0;
30
    filep->vma       = NULL;
31
 
3298 Serge 32
//    printf("%s file %p pages %p count %d\n",
33
//              __FUNCTION__,filep, filep->pages, count);
3260 Serge 34
 
35
    return filep;
36
}
37
 
38
struct page *shmem_read_mapping_page_gfp(struct file *filep,
39
                                         pgoff_t index, gfp_t gfp)
40
{
41
    struct page *page;
42
 
43
//    dbgprintf("%s, file %p index %d\n", __FUNCTION__, filep, index);
44
 
45
    if(unlikely(index >= filep->count))
46
        return ERR_PTR(-EINVAL);
47
 
48
    page = filep->pages[index];
49
 
50
    if(unlikely(page == NULL))
51
    {
52
        page = (struct page *)AllocPage();
53
 
54
        if(unlikely(page == NULL))
55
            return ERR_PTR(-ENOMEM);
56
 
57
        filep->pages[index] = page;
58
    };
59
 
60
    return page;
61
};
3263 Serge 62
 
63
unsigned long vm_mmap(struct file *file, unsigned long addr,
64
         unsigned long len, unsigned long prot,
65
         unsigned long flag, unsigned long offset)
66
{
67
    char *mem, *ptr;
68
    int i;
69
 
70
    if (unlikely(offset + PAGE_ALIGN(len) < offset))
71
        return -EINVAL;
72
    if (unlikely(offset & ~PAGE_MASK))
73
        return -EINVAL;
74
 
75
    mem = UserAlloc(len);
76
    if(unlikely(mem == NULL))
77
        return -ENOMEM;
78
 
79
    for(i = offset, ptr = mem; i < offset+len; i+= 4096, ptr+= 4096)
80
    {
81
        struct page *page;
82
 
83
        page = shmem_read_mapping_page_gfp(file, i/PAGE_SIZE,0);
84
 
85
        if (unlikely(IS_ERR(page)))
86
            goto err;
87
 
88
        MapPage(ptr, (addr_t)page, PG_SHARED|PG_UW);
89
    }
90
 
91
    return (unsigned long)mem;
92
err:
93
    UserFree(mem);
94
    return -ENOMEM;
95
};
96
 
3290 Serge 97
void shmem_file_delete(struct file *filep)
98
{
3298 Serge 99
//    printf("%s file %p pages %p count %d\n",
100
//            __FUNCTION__, filep, filep->pages, filep->count);
3263 Serge 101
 
3290 Serge 102
    if(filep->pages)
103
        kfree(filep->pages);
104
}