diff --git a/include/kernel/vm-region.h b/include/kernel/vm-region.h index c4585b7..3c08fef 100644 --- a/include/kernel/vm-region.h +++ b/include/kernel/vm-region.h @@ -6,7 +6,7 @@ #include #define VM_REGION_NAME_MAX 64 -#define VM_REGION_COPY_ALL ((size_t)-1) +#define VM_REGION_COPY_ALL ((size_t) - 1) struct vm_region; struct vm_object; @@ -168,13 +168,14 @@ extern kern_status_t vm_region_memmove( extern kern_status_t vm_region_memmove_v( struct vm_region *dest_region, size_t dest_offset, - struct iovec *dest, + const struct iovec *dest, size_t nr_dest, struct vm_region *src_region, size_t src_offset, const struct iovec *src, size_t nr_src, - size_t bytes_to_move); + size_t bytes_to_move, + size_t *nr_bytes_moved); DEFINE_OBJECT_LOCK_FUNCTION(vm_region, vr_base) diff --git a/vm/vm-region.c b/vm/vm-region.c index 98b3b0a..47ed246 100644 --- a/vm/vm-region.c +++ b/vm/vm-region.c @@ -1737,13 +1737,14 @@ kern_status_t vm_region_memmove( extern kern_status_t vm_region_memmove_v( struct vm_region *dest_region, size_t dest_offset, - struct iovec *dest_vecs, + const struct iovec *dest_vecs, size_t nr_dest_vecs, struct vm_region *src_region, size_t src_offset, const struct iovec *src_vecs, size_t nr_src_vecs, - size_t bytes_to_move) + size_t bytes_to_move, + size_t *nr_bytes_moved) { if (src_region->vr_status != VM_REGION_ONLINE) { return KERN_BAD_STATE; @@ -1760,6 +1761,7 @@ extern kern_status_t vm_region_memmove_v( iovec_iterator_seek(&src, src_offset); iovec_iterator_seek(&dest, dest_offset); + size_t moved = 0; while (bytes_to_move && src.it_len && dest.it_len) { size_t to_move = MIN(MIN(src.it_len, dest.it_len), bytes_to_move); @@ -1778,6 +1780,11 @@ extern kern_status_t vm_region_memmove_v( iovec_iterator_seek(&src, to_move); iovec_iterator_seek(&dest, to_move); bytes_to_move -= to_move; + moved += to_move; + } + + if (nr_bytes_moved) { + *nr_bytes_moved = moved; } return KERN_OK;