Subversion Repositories Kolibri OS

Rev

Rev 3263 | Rev 3298 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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