Rev 1409 | Rev 1425 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1409 | Rev 1424 | ||
|---|---|---|---|
| Line 63... | Line 63... | ||
| 63 | { |
63 | { |
| 64 | ipl_t ipl; |
64 | ipl_t ipl; |
| 65 | cap_t caps; |
65 | cap_t caps; |
| 66 | task_t *t; |
66 | task_t *t; |
| 67 | int flags; |
67 | int flags; |
| 68 | count_t i; |
68 | mem_backend_data_t backend_data = { .d1 = (__native) pf, .d2 = (__native) pages }; |
| 69 | 69 | ||
| 70 | /* |
70 | /* |
| 71 | * Make sure the caller is authorised to make this syscall. |
71 | * Make sure the caller is authorised to make this syscall. |
| 72 | */ |
72 | */ |
| 73 | caps = cap_get(TASK); |
73 | caps = cap_get(TASK); |
| Line 96... | Line 96... | ||
| 96 | 96 | ||
| 97 | /* Lock the task and release the lock protecting tasks_btree. */ |
97 | /* Lock the task and release the lock protecting tasks_btree. */ |
| 98 | spinlock_lock(&t->lock); |
98 | spinlock_lock(&t->lock); |
| 99 | spinlock_unlock(&tasks_lock); |
99 | spinlock_unlock(&tasks_lock); |
| 100 | 100 | ||
| 101 | flags = AS_AREA_DEVICE | AS_AREA_READ; |
101 | flags = AS_AREA_READ; |
| 102 | if (writable) |
102 | if (writable) |
| 103 | flags |= AS_AREA_WRITE; |
103 | flags |= AS_AREA_WRITE; |
| 104 | if (!as_area_create(t->as, flags, pages * PAGE_SIZE, vp, AS_AREA_ATTR_NONE, NULL, NULL)) { |
104 | if (!as_area_create(t->as, flags, pages * PAGE_SIZE, vp, AS_AREA_ATTR_NONE, |
| - | 105 | &phys_backend, &backend_data)) { |
|
| 105 | /* |
106 | /* |
| 106 | * The address space area could not have been created. |
107 | * The address space area could not have been created. |
| 107 | * We report it using ENOMEM. |
108 | * We report it using ENOMEM. |
| 108 | */ |
109 | */ |
| 109 | spinlock_unlock(&t->lock); |
110 | spinlock_unlock(&t->lock); |
| 110 | interrupts_restore(ipl); |
111 | interrupts_restore(ipl); |
| 111 | return ENOMEM; |
112 | return ENOMEM; |
| 112 | } |
113 | } |
| 113 | 114 | ||
| 114 | /* Initialize page tables. */ |
115 | /* |
| 115 | for (i = 0; i < pages; i++) |
- | |
| 116 | as_set_mapping(t->as, vp + i * PAGE_SIZE, pf + i * FRAME_SIZE); |
116 | * Mapping is created on-demand during page fault. |
| - | 117 | */ |
|
| 117 | 118 | ||
| 118 | spinlock_unlock(&t->lock); |
119 | spinlock_unlock(&t->lock); |
| 119 | interrupts_restore(ipl); |
120 | interrupts_restore(ipl); |
| 120 | return 0; |
121 | return 0; |
| 121 | } |
122 | } |
| 122 | 123 | ||