vm: region: add nr_bytes_moved output param to memmove_v

This commit is contained in:
2026-02-23 21:50:21 +00:00
parent 5f0654430d
commit 34bd6e479c
2 changed files with 13 additions and 5 deletions

View File

@@ -168,13 +168,14 @@ extern kern_status_t vm_region_memmove(
extern kern_status_t vm_region_memmove_v( extern kern_status_t vm_region_memmove_v(
struct vm_region *dest_region, struct vm_region *dest_region,
size_t dest_offset, size_t dest_offset,
struct iovec *dest, const struct iovec *dest,
size_t nr_dest, size_t nr_dest,
struct vm_region *src_region, struct vm_region *src_region,
size_t src_offset, size_t src_offset,
const struct iovec *src, const struct iovec *src,
size_t nr_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) DEFINE_OBJECT_LOCK_FUNCTION(vm_region, vr_base)

View File

@@ -1737,13 +1737,14 @@ kern_status_t vm_region_memmove(
extern kern_status_t vm_region_memmove_v( extern kern_status_t vm_region_memmove_v(
struct vm_region *dest_region, struct vm_region *dest_region,
size_t dest_offset, size_t dest_offset,
struct iovec *dest_vecs, const struct iovec *dest_vecs,
size_t nr_dest_vecs, size_t nr_dest_vecs,
struct vm_region *src_region, struct vm_region *src_region,
size_t src_offset, size_t src_offset,
const struct iovec *src_vecs, const struct iovec *src_vecs,
size_t nr_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) { if (src_region->vr_status != VM_REGION_ONLINE) {
return KERN_BAD_STATE; 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(&src, src_offset);
iovec_iterator_seek(&dest, dest_offset); iovec_iterator_seek(&dest, dest_offset);
size_t moved = 0;
while (bytes_to_move && src.it_len && dest.it_len) { while (bytes_to_move && src.it_len && dest.it_len) {
size_t to_move size_t to_move
= MIN(MIN(src.it_len, dest.it_len), bytes_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(&src, to_move);
iovec_iterator_seek(&dest, to_move); iovec_iterator_seek(&dest, to_move);
bytes_to_move -= to_move; bytes_to_move -= to_move;
moved += to_move;
}
if (nr_bytes_moved) {
*nr_bytes_moved = moved;
} }
return KERN_OK; return KERN_OK;