vm: region: add nr_bytes_moved output param to memmove_v
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user