376 alignedLength = round_page(numBytes);
377 pageCount = alignedLength/vm_page_size;
378
379 // Allocate storage for pages and flags.
380 pages = malloc(pageCount * sizeof(vm_offset_t));
381 if (pages == NULL) {
382 (*env)->DeleteLocalRef(env, array);
383 return NULL;
384 }
385 mapped = calloc(pageCount, sizeof(int));
386 if (mapped == NULL) {
387 (*env)->DeleteLocalRef(env, array);
388 free(pages);
389 return NULL;
390 }
391
392 task_t gTask = getTask(env, this_obj);
393 // Try to read each of the pages.
394 for (i = 0; i < pageCount; i++) {
395 result = vm_read(gTask, alignedAddress + i*vm_page_size, vm_page_size,
396 &pages[i], &byteCount);
397 mapped[i] = (result == KERN_SUCCESS);
398 // assume all failures are unmapped pages
399 }
400
401 print_debug("%ld pages\n", pageCount);
402
403 remaining = numBytes;
404
405 for (i = 0; i < pageCount; i++) {
406 unsigned long len = vm_page_size;
407 unsigned long start = 0;
408
409 if (i == 0) {
410 start = addr - alignedAddress;
411 len = vm_page_size - start;
412 }
413
414 if (i == (pageCount - 1)) {
415 len = remaining;
416 }
|
376 alignedLength = round_page(numBytes);
377 pageCount = alignedLength/vm_page_size;
378
379 // Allocate storage for pages and flags.
380 pages = malloc(pageCount * sizeof(vm_offset_t));
381 if (pages == NULL) {
382 (*env)->DeleteLocalRef(env, array);
383 return NULL;
384 }
385 mapped = calloc(pageCount, sizeof(int));
386 if (mapped == NULL) {
387 (*env)->DeleteLocalRef(env, array);
388 free(pages);
389 return NULL;
390 }
391
392 task_t gTask = getTask(env, this_obj);
393 // Try to read each of the pages.
394 for (i = 0; i < pageCount; i++) {
395 result = vm_read(gTask, alignedAddress + i*vm_page_size, vm_page_size,
396 &pages[i], &byteCount);
397 mapped[i] = (result == KERN_SUCCESS);
398 // assume all failures are unmapped pages
399 }
400
401 print_debug("%ld pages\n", pageCount);
402
403 remaining = numBytes;
404
405 for (i = 0; i < pageCount; i++) {
406 unsigned long len = vm_page_size;
407 unsigned long start = 0;
408
409 if (i == 0) {
410 start = addr - alignedAddress;
411 len = vm_page_size - start;
412 }
413
414 if (i == (pageCount - 1)) {
415 len = remaining;
416 }
|