[avb][pvmfw] Implement get_preloaded_partition to load partition

This cl loads the partitions with get_preloaded_partition
to avoid copying the images being verified.

Bug: 256148034
Test: atest libpvmfw_avb.test
Change-Id: I62b38d5dbcf93ceb4c9f67792800c112dd9bd399
diff --git a/pvmfw/avb/src/verify.rs b/pvmfw/avb/src/verify.rs
index b6db601..f01c6b8 100644
--- a/pvmfw/avb/src/verify.rs
+++ b/pvmfw/avb/src/verify.rs
@@ -144,6 +144,45 @@
     AvbIOResult::AVB_IO_RESULT_OK
 }
 
+unsafe extern "C" fn get_preloaded_partition(
+    ops: *mut AvbOps,
+    partition: *const c_char,
+    num_bytes: usize,
+    out_pointer: *mut *mut u8,
+    out_num_bytes_preloaded: *mut usize,
+) -> AvbIOResult {
+    to_avb_io_result(try_get_preloaded_partition(
+        ops,
+        partition,
+        num_bytes,
+        out_pointer,
+        out_num_bytes_preloaded,
+    ))
+}
+
+fn try_get_preloaded_partition(
+    ops: *mut AvbOps,
+    partition: *const c_char,
+    num_bytes: usize,
+    out_pointer: *mut *mut u8,
+    out_num_bytes_preloaded: *mut usize,
+) -> Result<(), AvbIOError> {
+    let ops = as_avbops_ref(ops)?;
+    let partition = ops.as_ref().get_partition(partition)?;
+    let out_pointer = to_nonnull(out_pointer)?;
+    // SAFETY: It is safe as the raw pointer `out_pointer` is a nonnull pointer.
+    unsafe {
+        *out_pointer.as_ptr() = partition.as_ptr() as _;
+    }
+    let out_num_bytes_preloaded = to_nonnull(out_num_bytes_preloaded)?;
+    // SAFETY: The raw pointer `out_num_bytes_preloaded` was created to point to a valid a `usize`
+    // and we checked it is nonnull.
+    unsafe {
+        *out_num_bytes_preloaded.as_ptr() = partition.len().min(num_bytes);
+    }
+    Ok(())
+}
+
 extern "C" fn read_from_partition(
     ops: *mut AvbOps,
     partition: *const c_char,
@@ -355,7 +394,7 @@
         ab_ops: ptr::null_mut(),
         atx_ops: ptr::null_mut(),
         read_from_partition: Some(read_from_partition),
-        get_preloaded_partition: None,
+        get_preloaded_partition: Some(get_preloaded_partition),
         write_to_partition: None,
         validate_vbmeta_public_key: None,
         read_rollback_index: Some(read_rollback_index),