79 |
allocate (server, container, offset, size, 0, &amount); |
allocate (server, container, offset, size, 0, &amount); |
80 |
} |
} |
81 |
|
|
82 |
l4_msg_clear (msg); |
/* SIZE better is a multiple of the page size! */ |
83 |
l4_set_msg_label (msg, 134 /* XXX: Magic number for container_map_id. */); |
while (size > 0) |
84 |
l4_msg_append_word (msg, container); |
{ |
85 |
l4_msg_append_word (msg, offset | rights); |
int i; |
|
l4_msg_append_word (msg, size); |
|
|
l4_msg_append_word (msg, (l4_word_t) vaddr); |
|
|
l4_msg_load (msg); |
|
86 |
|
|
87 |
tag = l4_call (server); |
l4_msg_clear (msg); |
88 |
l4_msg_store (tag, msg); |
l4_set_msg_label (msg, 134 /* XXX: Magic for container_map_id. */); |
89 |
|
l4_msg_append_word (msg, container); |
90 |
|
l4_msg_append_word (msg, offset | rights); |
91 |
|
l4_msg_append_word (msg, size); |
92 |
|
l4_msg_append_word (msg, (l4_word_t) vaddr); |
93 |
|
l4_msg_load (msg); |
94 |
|
|
95 |
return l4_msg_label (msg); |
tag = l4_call (server); |
96 |
|
l4_msg_store (tag, msg); |
97 |
|
|
98 |
|
/* Now check how much we actually got. */ |
99 |
|
i = 0; |
100 |
|
while (i < l4_typed_words (tag)) |
101 |
|
{ |
102 |
|
l4_map_item_t map_item; |
103 |
|
|
104 |
|
i += l4_msg_get_map_item (msg, i, &map_item); |
105 |
|
|
106 |
|
/* This better doesn't underflow! */ |
107 |
|
size -= l4_size (l4_map_item_snd_fpage (map_item)); |
108 |
|
offset += l4_size (l4_map_item_snd_fpage (map_item)); |
109 |
|
vaddr = (void *) |
110 |
|
(((l4_word_t) vaddr) + l4_size (l4_map_item_snd_fpage (map_item))); |
111 |
|
} |
112 |
|
} |
113 |
|
return 0; |
114 |
} |
} |
115 |
|
|
116 |
/* Initialize libl4, setup the task, and pass control over to the main |
/* Initialize libl4, setup the task, and pass control over to the main |