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(
|
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)
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user