[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),