Rev 3290 | Rev 4104 | 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 | }>> |