Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(413)

Side by Side Diff: mojo/monacl/mojo_syscall.cc

Issue 385983008: Mojo + NaCl prototype. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Better diff Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // WARNING this file was generated by generate_monacl_bindings.py
6 // Do not edit by hand.
7
8 #include "mojo/monacl/mojo_syscall.h"
9
10 #include <stdio.h>
11
12 #include "mojo/public/c/system/core.h"
13 #include "native_client/src/public/nacl_app.h"
14 #include "native_client/src/shared/platform/nacl_log.h"
15 #include "native_client/src/trusted/desc/nacl_desc_custom.h"
16 #include "native_client/src/trusted/service_runtime/nacl_copy.h"
17 #include "native_client/src/trusted/service_runtime/sel_ldr.h"
18
19 static INLINE uintptr_t NaClUserToSysAddrArray(
20 struct NaClApp *nap,
21 uintptr_t uaddr,
22 size_t count,
23 size_t size) {
24 // TODO overflow checking
25 size_t range = count * size;
26 return NaClUserToSysAddrRange(nap, uaddr, range);
27 }
28
29 void MojoDescDestroy(void *handle) {
30 UNREFERENCED_PARAMETER(handle);
31 NaClLog(LOG_ERROR, "Called destroy...\n");
32 }
33
34 ssize_t MojoDescSendMsg(void *handle,
35 const struct NaClImcTypedMsgHdr *msg,
36 int flags) {
37 UNREFERENCED_PARAMETER(flags);
38
39 struct NaClApp *nap = static_cast<struct NaClApp*>(handle);
40
41 if (msg->iov_length != 1 || msg->iov[0].length < 8 || msg->ndesc_length != 0) {
42 NaClLog(LOG_ERROR, "Malformed message.\n");
43 return -1;
44 }
45
46 uint32_t *params = static_cast<uint32_t*>(msg->iov[0].base);
47 uint32_t numParams = msg->iov[0].length / sizeof(*params);
48
49 uint32_t msgType = params[0];
50 //printf("Message: %d.\n", msgType);
51 switch (msgType) {
52 case 0:
53 {
54 if (numParams != 5) {
55 return -1;
56 }
57 NaClCopyTakeLock(nap);
58 const struct MojoCreateSharedBufferOptions* options;
59 if (params[1] == 0) {
60 options = NULL;
61 } else {
62 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(*options) );
Mark Seaborn 2014/07/21 16:31:39 You should use NaClCopyInFromUser() and NaClCopyOu
Nick Bray (chromium) 2014/07/21 22:38:36 Except that the logic is more complicated than NaC
Mark Seaborn 2014/07/21 23:25:44 You could make a wrapper around CopyIn/Out to hand
Mark Seaborn 2014/09/09 19:13:10 Can you add a TODO for passing the parameters in a
Nick Bray (chromium) 2014/09/09 23:12:32 This transcends the scope of a TODO. The issue tr
63 if (temp == kNaClBadAddress) {
64 return -1;
65 }
66 options = reinterpret_cast<const struct MojoCreateSharedBufferOptions*>( temp);
67 }
68 uint64_t num_bytes;
69 if (params[2] == 0) {
70 return -1;
71 } else {
72 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(num_bytes ));
73 if (temp == kNaClBadAddress) {
74 return -1;
75 }
76 num_bytes = *reinterpret_cast<uint64_t volatile*>(temp);
77 }
78 MojoHandle* shared_buffer_handle_ptr;
79 MojoHandle shared_buffer_handle;
80 if (params[3] == 0) {
81 return -1;
82 } else {
83 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(shared_bu ffer_handle));
84 if (temp == kNaClBadAddress) {
85 return -1;
86 }
87 shared_buffer_handle_ptr = reinterpret_cast<MojoHandle*>(temp);
88 }
89 MojoResult* result_ptr;
90 MojoResult result;
91 if (params[4] == 0) {
92 return -1;
93 } else {
94 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
95 if (temp == kNaClBadAddress) {
96 return -1;
97 }
98 result_ptr = reinterpret_cast<MojoResult*>(temp);
99 }
100 NaClCopyDropLock(nap);
101
102 result = MojoCreateSharedBuffer(options, num_bytes, &shared_buffer_handle) ;
103
104 NaClCopyTakeLock(nap);
105 *shared_buffer_handle_ptr = shared_buffer_handle;
106 *result_ptr = result;
107 NaClCopyDropLock(nap);
108
109 return 0;
110 }
111 case 1:
112 {
113 if (numParams != 5) {
114 return -1;
115 }
116 NaClCopyTakeLock(nap);
117 MojoHandle buffer_handle;
118 if (params[1] == 0) {
119 return -1;
120 } else {
121 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(buffer_ha ndle));
122 if (temp == kNaClBadAddress) {
123 return -1;
124 }
125 buffer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
126 }
127 const struct MojoDuplicateBufferHandleOptions* options;
128 if (params[2] == 0) {
129 options = NULL;
130 } else {
131 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(*options) );
132 if (temp == kNaClBadAddress) {
133 return -1;
134 }
135 options = reinterpret_cast<const struct MojoDuplicateBufferHandleOptions *>(temp);
136 }
137 MojoHandle* new_buffer_handle_ptr;
138 MojoHandle new_buffer_handle;
139 if (params[3] == 0) {
140 return -1;
141 } else {
142 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(new_buffe r_handle));
143 if (temp == kNaClBadAddress) {
144 return -1;
145 }
146 new_buffer_handle_ptr = reinterpret_cast<MojoHandle*>(temp);
147 }
148 MojoResult* result_ptr;
149 MojoResult result;
150 if (params[4] == 0) {
151 return -1;
152 } else {
153 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
154 if (temp == kNaClBadAddress) {
155 return -1;
156 }
157 result_ptr = reinterpret_cast<MojoResult*>(temp);
158 }
159 NaClCopyDropLock(nap);
160
161 result = MojoDuplicateBufferHandle(buffer_handle, options, &new_buffer_han dle);
162
163 NaClCopyTakeLock(nap);
164 *new_buffer_handle_ptr = new_buffer_handle;
165 *result_ptr = result;
166 NaClCopyDropLock(nap);
167
168 return 0;
169 }
170 case 2:
171 {
172 if (numParams != 7) {
173 return -1;
174 }
175 NaClCopyTakeLock(nap);
176 MojoHandle buffer_handle;
177 if (params[1] == 0) {
178 return -1;
179 } else {
180 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(buffer_ha ndle));
181 if (temp == kNaClBadAddress) {
182 return -1;
183 }
184 buffer_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
185 }
186 uint64_t offset;
187 if (params[2] == 0) {
188 return -1;
189 } else {
190 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(offset));
191 if (temp == kNaClBadAddress) {
192 return -1;
193 }
194 offset = *reinterpret_cast<uint64_t volatile*>(temp);
195 }
196 uint64_t num_bytes;
197 if (params[3] == 0) {
198 return -1;
199 } else {
200 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes ));
201 if (temp == kNaClBadAddress) {
202 return -1;
203 }
204 num_bytes = *reinterpret_cast<uint64_t volatile*>(temp);
205 }
206 void** buffer_ptr;
207 void* buffer;
208 if (params[4] == 0) {
209 return -1;
210 } else {
211 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(buffer));
212 if (temp == kNaClBadAddress) {
213 return -1;
214 }
215 buffer_ptr = reinterpret_cast<void**>(temp);
216 }
217 MojoMapBufferFlags flags;
218 if (params[5] == 0) {
219 return -1;
220 } else {
221 uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(flags));
222 if (temp == kNaClBadAddress) {
223 return -1;
224 }
225 flags = *reinterpret_cast<MojoMapBufferFlags volatile*>(temp);
226 }
227 MojoResult* result_ptr;
228 MojoResult result;
229 if (params[6] == 0) {
230 return -1;
231 } else {
232 uintptr_t temp = NaClUserToSysAddrRange(nap, params[6], sizeof(result));
233 if (temp == kNaClBadAddress) {
234 return -1;
235 }
236 result_ptr = reinterpret_cast<MojoResult*>(temp);
237 }
238 NaClCopyDropLock(nap);
239
240 result = MojoMapBuffer(buffer_handle, offset, num_bytes, &buffer, flags);
241
242 NaClCopyTakeLock(nap);
243 *buffer_ptr = buffer;
244 *result_ptr = result;
245 NaClCopyDropLock(nap);
246
247 return 0;
248 }
249 case 3:
250 {
251 if (numParams != 3) {
252 return -1;
253 }
254 NaClCopyTakeLock(nap);
255 void* buffer;
256 if (params[1] == 0) {
257 return -1;
258 } else {
259 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(buffer));
260 if (temp == kNaClBadAddress) {
261 return -1;
262 }
263 buffer = *reinterpret_cast<void* volatile*>(temp);
264 }
265 MojoResult* result_ptr;
266 MojoResult result;
267 if (params[2] == 0) {
268 return -1;
269 } else {
270 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(result));
271 if (temp == kNaClBadAddress) {
272 return -1;
273 }
274 result_ptr = reinterpret_cast<MojoResult*>(temp);
275 }
276 NaClCopyDropLock(nap);
277
278 result = MojoUnmapBuffer(buffer);
279
280 NaClCopyTakeLock(nap);
281 *result_ptr = result;
282 NaClCopyDropLock(nap);
283
284 return 0;
285 }
286 case 4:
287 {
288 if (numParams != 5) {
289 return -1;
290 }
291 NaClCopyTakeLock(nap);
292 const struct MojoCreateDataPipeOptions* options;
293 if (params[1] == 0) {
294 options = NULL;
295 } else {
296 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(*options) );
297 if (temp == kNaClBadAddress) {
298 return -1;
299 }
300 options = reinterpret_cast<const struct MojoCreateDataPipeOptions*>(temp );
301 }
302 MojoHandle* data_pipe_producer_handle_ptr;
303 MojoHandle data_pipe_producer_handle;
304 if (params[2] == 0) {
305 return -1;
306 } else {
307 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(data_pipe _producer_handle));
308 if (temp == kNaClBadAddress) {
309 return -1;
310 }
311 data_pipe_producer_handle_ptr = reinterpret_cast<MojoHandle*>(temp);
312 }
313 MojoHandle* data_pipe_consumer_handle_ptr;
314 MojoHandle data_pipe_consumer_handle;
315 if (params[3] == 0) {
316 return -1;
317 } else {
318 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(data_pipe _consumer_handle));
319 if (temp == kNaClBadAddress) {
320 return -1;
321 }
322 data_pipe_consumer_handle_ptr = reinterpret_cast<MojoHandle*>(temp);
323 }
324 MojoResult* result_ptr;
325 MojoResult result;
326 if (params[4] == 0) {
327 return -1;
328 } else {
329 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
330 if (temp == kNaClBadAddress) {
331 return -1;
332 }
333 result_ptr = reinterpret_cast<MojoResult*>(temp);
334 }
335 NaClCopyDropLock(nap);
336
337 result = MojoCreateDataPipe(options, &data_pipe_producer_handle, &data_pip e_consumer_handle);
338
339 NaClCopyTakeLock(nap);
340 *data_pipe_producer_handle_ptr = data_pipe_producer_handle;
341 *data_pipe_consumer_handle_ptr = data_pipe_consumer_handle;
342 *result_ptr = result;
343 NaClCopyDropLock(nap);
344
345 return 0;
346 }
347 case 5:
348 {
349 if (numParams != 6) {
350 return -1;
351 }
352 NaClCopyTakeLock(nap);
353 MojoHandle data_pipe_producer_handle;
354 if (params[1] == 0) {
355 return -1;
356 } else {
357 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe _producer_handle));
358 if (temp == kNaClBadAddress) {
359 return -1;
360 }
361 data_pipe_producer_handle = *reinterpret_cast<MojoHandle volatile*>(temp );
362 }
363 uint32_t* num_bytes_ptr;
364 uint32_t num_bytes;
365 if (params[3] == 0) {
366 return -1;
367 } else {
368 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes ));
369 if (temp == kNaClBadAddress) {
370 return -1;
371 }
372 num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
373 // In/Out
374 num_bytes = *num_bytes_ptr;
375 }
376 MojoWriteDataFlags flags;
377 if (params[4] == 0) {
378 return -1;
379 } else {
380 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(flags));
381 if (temp == kNaClBadAddress) {
382 return -1;
383 }
384 flags = *reinterpret_cast<MojoWriteDataFlags volatile*>(temp);
385 }
386 const void* elements;
387 if (params[2] == 0) {
388 return -1;
389 } else {
390 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], num_bytes);
391 if (temp == kNaClBadAddress) {
392 return -1;
393 }
394 elements = reinterpret_cast<const void*>(temp);
395 }
396 MojoResult* result_ptr;
397 MojoResult result;
398 if (params[5] == 0) {
399 return -1;
400 } else {
401 uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
402 if (temp == kNaClBadAddress) {
403 return -1;
404 }
405 result_ptr = reinterpret_cast<MojoResult*>(temp);
406 }
407 NaClCopyDropLock(nap);
408
409 result = MojoWriteData(data_pipe_producer_handle, elements, &num_bytes, fl ags);
410
411 NaClCopyTakeLock(nap);
412 *num_bytes_ptr = num_bytes;
413 *result_ptr = result;
414 NaClCopyDropLock(nap);
415
416 return 0;
417 }
418 case 6:
419 {
420 if (numParams != 6) {
421 return -1;
422 }
423 NaClCopyTakeLock(nap);
424 MojoHandle data_pipe_producer_handle;
425 if (params[1] == 0) {
426 return -1;
427 } else {
428 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe _producer_handle));
429 if (temp == kNaClBadAddress) {
430 return -1;
431 }
432 data_pipe_producer_handle = *reinterpret_cast<MojoHandle volatile*>(temp );
433 }
434 void** buffer_ptr;
435 void* buffer;
436 if (params[2] == 0) {
437 return -1;
438 } else {
439 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(buffer));
440 if (temp == kNaClBadAddress) {
441 return -1;
442 }
443 buffer_ptr = reinterpret_cast<void**>(temp);
444 }
445 uint32_t* buffer_num_bytes_ptr;
446 uint32_t buffer_num_bytes;
447 if (params[3] == 0) {
448 return -1;
449 } else {
450 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(buffer_nu m_bytes));
451 if (temp == kNaClBadAddress) {
452 return -1;
453 }
454 buffer_num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
455 // In/Out
456 buffer_num_bytes = *buffer_num_bytes_ptr;
457 }
458 MojoWriteDataFlags flags;
459 if (params[4] == 0) {
460 return -1;
461 } else {
462 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(flags));
463 if (temp == kNaClBadAddress) {
464 return -1;
465 }
466 flags = *reinterpret_cast<MojoWriteDataFlags volatile*>(temp);
467 }
468 MojoResult* result_ptr;
469 MojoResult result;
470 if (params[5] == 0) {
471 return -1;
472 } else {
473 uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
474 if (temp == kNaClBadAddress) {
475 return -1;
476 }
477 result_ptr = reinterpret_cast<MojoResult*>(temp);
478 }
479 NaClCopyDropLock(nap);
480
481 result = MojoBeginWriteData(data_pipe_producer_handle, &buffer, &buffer_nu m_bytes, flags);
482
483 NaClCopyTakeLock(nap);
484 *buffer_ptr = buffer;
485 *buffer_num_bytes_ptr = buffer_num_bytes;
486 *result_ptr = result;
487 NaClCopyDropLock(nap);
488
489 return 0;
490 }
491 case 7:
492 {
493 if (numParams != 4) {
494 return -1;
495 }
496 NaClCopyTakeLock(nap);
497 MojoHandle data_pipe_producer_handle;
498 if (params[1] == 0) {
499 return -1;
500 } else {
501 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe _producer_handle));
502 if (temp == kNaClBadAddress) {
503 return -1;
504 }
505 data_pipe_producer_handle = *reinterpret_cast<MojoHandle volatile*>(temp );
506 }
507 uint32_t num_bytes_written;
508 if (params[2] == 0) {
509 return -1;
510 } else {
511 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(num_bytes _written));
512 if (temp == kNaClBadAddress) {
513 return -1;
514 }
515 num_bytes_written = *reinterpret_cast<uint32_t volatile*>(temp);
516 }
517 MojoResult* result_ptr;
518 MojoResult result;
519 if (params[3] == 0) {
520 return -1;
521 } else {
522 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(result));
523 if (temp == kNaClBadAddress) {
524 return -1;
525 }
526 result_ptr = reinterpret_cast<MojoResult*>(temp);
527 }
528 NaClCopyDropLock(nap);
529
530 result = MojoEndWriteData(data_pipe_producer_handle, num_bytes_written);
531
532 NaClCopyTakeLock(nap);
533 *result_ptr = result;
534 NaClCopyDropLock(nap);
535
536 return 0;
537 }
538 case 8:
539 {
540 if (numParams != 6) {
541 return -1;
542 }
543 NaClCopyTakeLock(nap);
544 MojoHandle data_pipe_consumer_handle;
545 if (params[1] == 0) {
546 return -1;
547 } else {
548 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe _consumer_handle));
549 if (temp == kNaClBadAddress) {
550 return -1;
551 }
552 data_pipe_consumer_handle = *reinterpret_cast<MojoHandle volatile*>(temp );
553 }
554 uint32_t* num_bytes_ptr;
555 uint32_t num_bytes;
556 if (params[3] == 0) {
557 return -1;
558 } else {
559 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes ));
560 if (temp == kNaClBadAddress) {
561 return -1;
562 }
563 num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
564 // In/Out
565 num_bytes = *num_bytes_ptr;
566 }
567 MojoReadDataFlags flags;
568 if (params[4] == 0) {
569 return -1;
570 } else {
571 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(flags));
572 if (temp == kNaClBadAddress) {
573 return -1;
574 }
575 flags = *reinterpret_cast<MojoReadDataFlags volatile*>(temp);
576 }
577 void* elements;
578 if (params[2] == 0) {
579 return -1;
580 } else {
581 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], num_bytes);
582 if (temp == kNaClBadAddress) {
583 return -1;
584 }
585 elements = reinterpret_cast<void*>(temp);
586 }
587 MojoResult* result_ptr;
588 MojoResult result;
589 if (params[5] == 0) {
590 return -1;
591 } else {
592 uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
593 if (temp == kNaClBadAddress) {
594 return -1;
595 }
596 result_ptr = reinterpret_cast<MojoResult*>(temp);
597 }
598 NaClCopyDropLock(nap);
599
600 result = MojoReadData(data_pipe_consumer_handle, elements, &num_bytes, fla gs);
601
602 NaClCopyTakeLock(nap);
603 *num_bytes_ptr = num_bytes;
604 *result_ptr = result;
605 NaClCopyDropLock(nap);
606
607 return 0;
608 }
609 case 9:
610 {
611 if (numParams != 6) {
612 return -1;
613 }
614 NaClCopyTakeLock(nap);
615 MojoHandle data_pipe_consumer_handle;
616 if (params[1] == 0) {
617 return -1;
618 } else {
619 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe _consumer_handle));
620 if (temp == kNaClBadAddress) {
621 return -1;
622 }
623 data_pipe_consumer_handle = *reinterpret_cast<MojoHandle volatile*>(temp );
624 }
625 const void** buffer_ptr;
626 const void* buffer;
627 if (params[2] == 0) {
628 return -1;
629 } else {
630 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(buffer));
631 if (temp == kNaClBadAddress) {
632 return -1;
633 }
634 buffer_ptr = reinterpret_cast<const void**>(temp);
635 }
636 uint32_t* buffer_num_bytes_ptr;
637 uint32_t buffer_num_bytes;
638 if (params[3] == 0) {
639 return -1;
640 } else {
641 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(buffer_nu m_bytes));
642 if (temp == kNaClBadAddress) {
643 return -1;
644 }
645 buffer_num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
646 // In/Out
647 buffer_num_bytes = *buffer_num_bytes_ptr;
648 }
649 MojoReadDataFlags flags;
650 if (params[4] == 0) {
651 return -1;
652 } else {
653 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(flags));
654 if (temp == kNaClBadAddress) {
655 return -1;
656 }
657 flags = *reinterpret_cast<MojoReadDataFlags volatile*>(temp);
658 }
659 MojoResult* result_ptr;
660 MojoResult result;
661 if (params[5] == 0) {
662 return -1;
663 } else {
664 uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
665 if (temp == kNaClBadAddress) {
666 return -1;
667 }
668 result_ptr = reinterpret_cast<MojoResult*>(temp);
669 }
670 NaClCopyDropLock(nap);
671
672 result = MojoBeginReadData(data_pipe_consumer_handle, &buffer, &buffer_num _bytes, flags);
673
674 NaClCopyTakeLock(nap);
675 *buffer_ptr = buffer;
676 *buffer_num_bytes_ptr = buffer_num_bytes;
677 *result_ptr = result;
678 NaClCopyDropLock(nap);
679
680 return 0;
681 }
682 case 10:
683 {
684 if (numParams != 4) {
685 return -1;
686 }
687 NaClCopyTakeLock(nap);
688 MojoHandle data_pipe_consumer_handle;
689 if (params[1] == 0) {
690 return -1;
691 } else {
692 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(data_pipe _consumer_handle));
693 if (temp == kNaClBadAddress) {
694 return -1;
695 }
696 data_pipe_consumer_handle = *reinterpret_cast<MojoHandle volatile*>(temp );
697 }
698 uint32_t num_bytes_read;
699 if (params[2] == 0) {
700 return -1;
701 } else {
702 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(num_bytes _read));
703 if (temp == kNaClBadAddress) {
704 return -1;
705 }
706 num_bytes_read = *reinterpret_cast<uint32_t volatile*>(temp);
707 }
708 MojoResult* result_ptr;
709 MojoResult result;
710 if (params[3] == 0) {
711 return -1;
712 } else {
713 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(result));
714 if (temp == kNaClBadAddress) {
715 return -1;
716 }
717 result_ptr = reinterpret_cast<MojoResult*>(temp);
718 }
719 NaClCopyDropLock(nap);
720
721 result = MojoEndReadData(data_pipe_consumer_handle, num_bytes_read);
722
723 NaClCopyTakeLock(nap);
724 *result_ptr = result;
725 NaClCopyDropLock(nap);
726
727 return 0;
728 }
729 case 11:
730 {
731 if (numParams != 2) {
732 return -1;
733 }
734 NaClCopyTakeLock(nap);
735 MojoTimeTicks* result_ptr;
736 MojoTimeTicks result;
737 if (params[1] == 0) {
738 return -1;
739 } else {
740 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(result));
741 if (temp == kNaClBadAddress) {
742 return -1;
743 }
744 result_ptr = reinterpret_cast<MojoTimeTicks*>(temp);
745 }
746 NaClCopyDropLock(nap);
747
748 result = MojoGetTimeTicksNow();
749
750 NaClCopyTakeLock(nap);
751 *result_ptr = result;
752 NaClCopyDropLock(nap);
753
754 return 0;
755 }
756 case 12:
757 {
758 if (numParams != 3) {
759 return -1;
760 }
761 NaClCopyTakeLock(nap);
762 MojoHandle handle;
763 if (params[1] == 0) {
764 return -1;
765 } else {
766 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(handle));
767 if (temp == kNaClBadAddress) {
768 return -1;
769 }
770 handle = *reinterpret_cast<MojoHandle volatile*>(temp);
771 }
772 MojoResult* result_ptr;
773 MojoResult result;
774 if (params[2] == 0) {
775 return -1;
776 } else {
777 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(result));
778 if (temp == kNaClBadAddress) {
779 return -1;
780 }
781 result_ptr = reinterpret_cast<MojoResult*>(temp);
782 }
783 NaClCopyDropLock(nap);
784
785 result = MojoClose(handle);
786
787 NaClCopyTakeLock(nap);
788 *result_ptr = result;
789 NaClCopyDropLock(nap);
790
791 return 0;
792 }
793 case 13:
794 {
795 if (numParams != 5) {
796 return -1;
797 }
798 NaClCopyTakeLock(nap);
799 MojoHandle handle;
800 if (params[1] == 0) {
801 return -1;
802 } else {
803 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(handle));
804 if (temp == kNaClBadAddress) {
805 return -1;
806 }
807 handle = *reinterpret_cast<MojoHandle volatile*>(temp);
808 }
809 MojoHandleSignals signals;
810 if (params[2] == 0) {
811 return -1;
812 } else {
813 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(signals)) ;
814 if (temp == kNaClBadAddress) {
815 return -1;
816 }
817 signals = *reinterpret_cast<MojoHandleSignals volatile*>(temp);
818 }
819 MojoDeadline deadline;
820 if (params[3] == 0) {
821 return -1;
822 } else {
823 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(deadline) );
824 if (temp == kNaClBadAddress) {
825 return -1;
826 }
827 deadline = *reinterpret_cast<MojoDeadline volatile*>(temp);
828 }
829 MojoResult* result_ptr;
830 MojoResult result;
831 if (params[4] == 0) {
832 return -1;
833 } else {
834 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
835 if (temp == kNaClBadAddress) {
836 return -1;
837 }
838 result_ptr = reinterpret_cast<MojoResult*>(temp);
839 }
840 NaClCopyDropLock(nap);
841
842 result = MojoWait(handle, signals, deadline);
843
844 NaClCopyTakeLock(nap);
845 *result_ptr = result;
846 NaClCopyDropLock(nap);
847
848 return 0;
849 }
850 case 14:
851 {
852 if (numParams != 6) {
853 return -1;
854 }
855 NaClCopyTakeLock(nap);
856 uint32_t num_handles;
857 if (params[3] == 0) {
858 return -1;
859 } else {
860 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_handl es));
861 if (temp == kNaClBadAddress) {
862 return -1;
863 }
864 num_handles = *reinterpret_cast<uint32_t volatile*>(temp);
865 }
866 MojoDeadline deadline;
867 if (params[4] == 0) {
868 return -1;
869 } else {
870 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(deadline) );
871 if (temp == kNaClBadAddress) {
872 return -1;
873 }
874 deadline = *reinterpret_cast<MojoDeadline volatile*>(temp);
875 }
876 const MojoHandle* handles;
877 if (params[1] == 0) {
878 return -1;
879 } else {
880 uintptr_t temp = NaClUserToSysAddrArray(nap, params[1], num_handles, siz eof(*handles));
881 if (temp == kNaClBadAddress) {
882 return -1;
883 }
884 handles = reinterpret_cast<const MojoHandle*>(temp);
885 }
886 const MojoHandleSignals* signals;
887 if (params[2] == 0) {
888 return -1;
889 } else {
890 uintptr_t temp = NaClUserToSysAddrArray(nap, params[2], num_handles, siz eof(*signals));
891 if (temp == kNaClBadAddress) {
892 return -1;
893 }
894 signals = reinterpret_cast<const MojoHandleSignals*>(temp);
895 }
896 MojoResult* result_ptr;
897 MojoResult result;
898 if (params[5] == 0) {
899 return -1;
900 } else {
901 uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(result));
902 if (temp == kNaClBadAddress) {
903 return -1;
904 }
905 result_ptr = reinterpret_cast<MojoResult*>(temp);
906 }
907 NaClCopyDropLock(nap);
908
909 result = MojoWaitMany(handles, signals, num_handles, deadline);
910
911 NaClCopyTakeLock(nap);
912 *result_ptr = result;
913 NaClCopyDropLock(nap);
914
915 return 0;
916 }
917 case 15:
918 {
919 if (numParams != 5) {
920 return -1;
921 }
922 NaClCopyTakeLock(nap);
923 const struct MojoCreateMessagePipeOptions* options;
924 if (params[1] == 0) {
925 options = NULL;
926 } else {
927 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(*options) );
928 if (temp == kNaClBadAddress) {
929 return -1;
930 }
931 options = reinterpret_cast<const struct MojoCreateMessagePipeOptions*>(t emp);
932 }
933 MojoHandle* message_pipe_handle0_ptr;
934 MojoHandle message_pipe_handle0;
935 if (params[2] == 0) {
936 return -1;
937 } else {
938 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], sizeof(message_p ipe_handle0));
939 if (temp == kNaClBadAddress) {
940 return -1;
941 }
942 message_pipe_handle0_ptr = reinterpret_cast<MojoHandle*>(temp);
943 }
944 MojoHandle* message_pipe_handle1_ptr;
945 MojoHandle message_pipe_handle1;
946 if (params[3] == 0) {
947 return -1;
948 } else {
949 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(message_p ipe_handle1));
950 if (temp == kNaClBadAddress) {
951 return -1;
952 }
953 message_pipe_handle1_ptr = reinterpret_cast<MojoHandle*>(temp);
954 }
955 MojoResult* result_ptr;
956 MojoResult result;
957 if (params[4] == 0) {
958 return -1;
959 } else {
960 uintptr_t temp = NaClUserToSysAddrRange(nap, params[4], sizeof(result));
961 if (temp == kNaClBadAddress) {
962 return -1;
963 }
964 result_ptr = reinterpret_cast<MojoResult*>(temp);
965 }
966 NaClCopyDropLock(nap);
967
968 result = MojoCreateMessagePipe(options, &message_pipe_handle0, &message_pi pe_handle1);
969
970 NaClCopyTakeLock(nap);
971 *message_pipe_handle0_ptr = message_pipe_handle0;
972 *message_pipe_handle1_ptr = message_pipe_handle1;
973 *result_ptr = result;
974 NaClCopyDropLock(nap);
975
976 return 0;
977 }
978 case 16:
979 {
980 if (numParams != 8) {
981 return -1;
982 }
983 NaClCopyTakeLock(nap);
984 MojoHandle message_pipe_handle;
985 if (params[1] == 0) {
986 return -1;
987 } else {
988 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(message_p ipe_handle));
989 if (temp == kNaClBadAddress) {
990 return -1;
991 }
992 message_pipe_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
993 }
994 uint32_t num_bytes;
995 if (params[3] == 0) {
996 return -1;
997 } else {
998 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes ));
999 if (temp == kNaClBadAddress) {
1000 return -1;
1001 }
1002 num_bytes = *reinterpret_cast<uint32_t volatile*>(temp);
1003 }
1004 uint32_t num_handles;
1005 if (params[5] == 0) {
1006 return -1;
1007 } else {
1008 uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(num_handl es));
1009 if (temp == kNaClBadAddress) {
1010 return -1;
1011 }
1012 num_handles = *reinterpret_cast<uint32_t volatile*>(temp);
1013 }
1014 MojoWriteMessageFlags flags;
1015 if (params[6] == 0) {
1016 return -1;
1017 } else {
1018 uintptr_t temp = NaClUserToSysAddrRange(nap, params[6], sizeof(flags));
1019 if (temp == kNaClBadAddress) {
1020 return -1;
1021 }
1022 flags = *reinterpret_cast<MojoWriteMessageFlags volatile*>(temp);
1023 }
1024 const void* bytes;
1025 if (params[2] == 0) {
1026 bytes = NULL;
1027 } else {
1028 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], num_bytes);
1029 if (temp == kNaClBadAddress) {
1030 return -1;
1031 }
1032 bytes = reinterpret_cast<const void*>(temp);
1033 }
1034 const MojoHandle* handles;
1035 if (params[4] == 0) {
1036 handles = NULL;
1037 } else {
1038 uintptr_t temp = NaClUserToSysAddrArray(nap, params[4], num_handles, siz eof(*handles));
1039 if (temp == kNaClBadAddress) {
1040 return -1;
1041 }
1042 handles = reinterpret_cast<const MojoHandle*>(temp);
1043 }
1044 MojoResult* result_ptr;
1045 MojoResult result;
1046 if (params[7] == 0) {
1047 return -1;
1048 } else {
1049 uintptr_t temp = NaClUserToSysAddrRange(nap, params[7], sizeof(result));
1050 if (temp == kNaClBadAddress) {
1051 return -1;
1052 }
1053 result_ptr = reinterpret_cast<MojoResult*>(temp);
1054 }
1055 NaClCopyDropLock(nap);
1056
1057 result = MojoWriteMessage(message_pipe_handle, bytes, num_bytes, handles, num_handles, flags);
1058
1059 NaClCopyTakeLock(nap);
1060 *result_ptr = result;
1061 NaClCopyDropLock(nap);
1062
1063 return 0;
1064 }
1065 case 17:
1066 {
1067 if (numParams != 8) {
1068 return -1;
1069 }
1070 NaClCopyTakeLock(nap);
1071 MojoHandle message_pipe_handle;
1072 if (params[1] == 0) {
1073 return -1;
1074 } else {
1075 uintptr_t temp = NaClUserToSysAddrRange(nap, params[1], sizeof(message_p ipe_handle));
1076 if (temp == kNaClBadAddress) {
1077 return -1;
1078 }
1079 message_pipe_handle = *reinterpret_cast<MojoHandle volatile*>(temp);
1080 }
1081 uint32_t* num_bytes_ptr;
1082 uint32_t num_bytes;
1083 if (params[3] == 0) {
1084 num_bytes_ptr = NULL;
1085 num_bytes = 0;
1086 } else {
1087 uintptr_t temp = NaClUserToSysAddrRange(nap, params[3], sizeof(num_bytes ));
1088 if (temp == kNaClBadAddress) {
1089 return -1;
1090 }
1091 num_bytes_ptr = reinterpret_cast<uint32_t*>(temp);
1092 // In/Out
1093 num_bytes = *num_bytes_ptr;
1094 }
1095 uint32_t* num_handles_ptr;
1096 uint32_t num_handles;
1097 if (params[5] == 0) {
1098 num_handles_ptr = NULL;
1099 num_handles = 0;
1100 } else {
1101 uintptr_t temp = NaClUserToSysAddrRange(nap, params[5], sizeof(num_handl es));
1102 if (temp == kNaClBadAddress) {
1103 return -1;
1104 }
1105 num_handles_ptr = reinterpret_cast<uint32_t*>(temp);
1106 // In/Out
1107 num_handles = *num_handles_ptr;
1108 }
1109 MojoReadMessageFlags flags;
1110 if (params[6] == 0) {
1111 return -1;
1112 } else {
1113 uintptr_t temp = NaClUserToSysAddrRange(nap, params[6], sizeof(flags));
1114 if (temp == kNaClBadAddress) {
1115 return -1;
1116 }
1117 flags = *reinterpret_cast<MojoReadMessageFlags volatile*>(temp);
1118 }
1119 void* bytes;
1120 if (params[2] == 0) {
1121 bytes = NULL;
1122 } else {
1123 uintptr_t temp = NaClUserToSysAddrRange(nap, params[2], num_bytes);
1124 if (temp == kNaClBadAddress) {
1125 return -1;
1126 }
1127 bytes = reinterpret_cast<void*>(temp);
1128 }
1129 MojoHandle* handles;
1130 if (params[4] == 0) {
1131 handles = NULL;
1132 } else {
1133 uintptr_t temp = NaClUserToSysAddrArray(nap, params[4], num_handles, siz eof(*handles));
1134 if (temp == kNaClBadAddress) {
1135 return -1;
1136 }
1137 handles = reinterpret_cast<MojoHandle*>(temp);
1138 }
1139 MojoResult* result_ptr;
1140 MojoResult result;
1141 if (params[7] == 0) {
1142 return -1;
1143 } else {
1144 uintptr_t temp = NaClUserToSysAddrRange(nap, params[7], sizeof(result));
1145 if (temp == kNaClBadAddress) {
1146 return -1;
1147 }
1148 result_ptr = reinterpret_cast<MojoResult*>(temp);
1149 }
1150 NaClCopyDropLock(nap);
1151
1152 result = MojoReadMessage(message_pipe_handle, bytes, num_bytes_ptr ? &num_ bytes : NULL, handles, num_handles_ptr ? &num_handles : NULL, flags);
1153
1154 NaClCopyTakeLock(nap);
1155 if (num_bytes_ptr != NULL) {
1156 *num_bytes_ptr = num_bytes;
1157 }
1158 if (num_handles_ptr != NULL) {
1159 *num_handles_ptr = num_handles;
1160 }
1161 *result_ptr = result;
1162 NaClCopyDropLock(nap);
1163
1164 return 0;
1165 }
1166
1167 default:
1168 return -1;
1169 }
1170
1171 return -1;
1172 }
1173
1174 ssize_t MojoDescRecvMsg(void *handle,
1175 struct NaClImcTypedMsgHdr *msg,
1176 int flags) {
1177 UNREFERENCED_PARAMETER(handle);
1178 UNREFERENCED_PARAMETER(msg);
1179 UNREFERENCED_PARAMETER(flags);
1180
1181 NaClLog(LOG_FATAL, "MojoDescRecvMsg: Not implemented\n");
1182 return 0;
1183 }
1184
1185 struct NaClDesc *MakeMojoDesc(struct NaClApp *nap) {
1186 struct NaClDescCustomFuncs funcs = NACL_DESC_CUSTOM_FUNCS_INITIALIZER;
1187 funcs.Destroy = MojoDescDestroy;
1188 funcs.SendMsg = MojoDescSendMsg;
1189 funcs.RecvMsg = MojoDescRecvMsg;
1190 return NaClDescMakeCustomDesc(nap, &funcs);
1191 }
1192
1193 #define NACL_MOJO_DESC 5
1194
1195 void InjectMojo(struct NaClApp *nap) {
1196 NaClAppSetDesc(nap, NACL_MOJO_DESC, MakeMojoDesc(nap));
1197 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698