From 2e7bd41e4e8ab3d1efdabd9e263a2f7fe79bff8c Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 20 Nov 2023 10:14:59 +0000
Subject: [PATCH] otg change to host
---
u-boot/lib/avb/libavb_user/avb_ops_user.c | 147 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 126 insertions(+), 21 deletions(-)
diff --git a/u-boot/lib/avb/libavb_user/avb_ops_user.c b/u-boot/lib/avb/libavb_user/avb_ops_user.c
index f7b2ac7..18c0c1f 100644
--- a/u-boot/lib/avb/libavb_user/avb_ops_user.c
+++ b/u-boot/lib/avb/libavb_user/avb_ops_user.c
@@ -81,10 +81,9 @@
return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
}
- if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) {
- printf("Could not find \"%s\" partition\n", partition);
+ if (part_get_info_by_name(dev_desc, partition, &part_info) < 0)
return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
- }
+
*out_size_in_bytes = (part_info.size) * 512;
return AVB_IO_RESULT_OK;
}
@@ -281,6 +280,7 @@
{
if (out_is_unlocked) {
#ifdef CONFIG_OPTEE_CLIENT
+ uint8_t vboot_flag = 0;
int ret;
ret = trusty_read_lock_state((uint8_t *)out_is_unlocked);
@@ -291,7 +291,16 @@
case TEE_ERROR_GENERIC:
case TEE_ERROR_NO_DATA:
case TEE_ERROR_ITEM_NOT_FOUND:
- *out_is_unlocked = 1;
+ if (trusty_read_vbootkey_enable_flag(&vboot_flag)) {
+ printf("Can't read vboot flag\n");
+ return AVB_IO_RESULT_ERROR_IO;
+ }
+
+ if (vboot_flag)
+ *out_is_unlocked = 0;
+ else
+ *out_is_unlocked = 1;
+
if (trusty_write_lock_state(*out_is_unlocked)) {
printf("%s: init lock state error\n", __FILE__);
ret = AVB_IO_RESULT_ERROR_IO;
@@ -429,30 +438,111 @@
size_t* out_num_bytes_preloaded,
int allow_verification_error)
{
+ struct preloaded_partition *preload_info = NULL;
+ struct AvbOpsData *data = ops->user_data;
struct blk_desc *dev_desc;
+ disk_partition_t part_info;
ulong load_addr;
- int ret;
+ AvbIOResult ret;
+ int full_preload = 0;
- /* no need go further */
- if (!allow_verification_error)
- return AVB_IO_RESULT_OK;
-
- printf("get image from preloaded partition...\n");
dev_desc = rockchip_get_bootdev();
if (!dev_desc)
- return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
+ return AVB_IO_RESULT_ERROR_IO;
- load_addr = env_get_ulong("kernel_addr_r", 16, 0);
- if (!load_addr)
- return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE;
+ if (part_get_info_by_name(dev_desc, partition, &part_info) < 0) {
+ printf("Could not find \"%s\" partition\n", partition);
+ return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
+ }
- ret = android_image_load_by_partname(dev_desc, partition, &load_addr);
- if (!ret) {
- *out_pointer = (u8 *)load_addr;
- *out_num_bytes_preloaded = num_bytes; /* return what it expects */
+ if (!allow_verification_error) {
+ if (!strncmp(partition, ANDROID_PARTITION_BOOT, 4) ||
+ !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8))
+ preload_info = &data->boot;
+ else if (!strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11))
+ preload_info = &data->vendor_boot;
+ else if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9))
+ preload_info = &data->init_boot;
+ else if (!strncmp(partition, ANDROID_PARTITION_RESOURCE, 8))
+ preload_info = &data->resource;
+
+ if (!preload_info) {
+ printf("Error: unknown full load partition '%s'\n", partition);
+ return AVB_IO_RESULT_ERROR_NO_SUCH_PARTITION;
+ }
+
+ printf("preloaded(s): %sfull image from '%s' at 0x%08lx - 0x%08lx\n",
+ preload_info->size ? "pre-" : "", partition,
+ (ulong)preload_info->addr,
+ (ulong)preload_info->addr + num_bytes);
+
+ /* If the partition hasn't yet been preloaded, do it now.*/
+ if (preload_info->size == 0) {
+ ret = ops->read_from_partition(ops, partition,
+ 0, num_bytes,
+ preload_info->addr,
+ &preload_info->size);
+ if (ret != AVB_IO_RESULT_OK)
+ return ret;
+ }
+ *out_pointer = preload_info->addr;
+ *out_num_bytes_preloaded = preload_info->size;
ret = AVB_IO_RESULT_OK;
} else {
- ret = AVB_IO_RESULT_ERROR_IO;
+ if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9) ||
+ !strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11) ||
+ !strncmp(partition, ANDROID_PARTITION_BOOT, 4) ||
+ !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8) ||
+ !strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) {
+ /* If already full preloaded, just use it */
+ if (!strncmp(partition, ANDROID_PARTITION_BOOT, 4) ||
+ !strncmp(partition, ANDROID_PARTITION_RECOVERY, 8)) {
+ preload_info = &data->boot;
+ if (preload_info->size) {
+ *out_pointer = preload_info->addr;
+ *out_num_bytes_preloaded = num_bytes;
+ full_preload = 1;
+ }
+ }
+ printf("preloaded: %s image from '%s\n",
+ full_preload ? "pre-full" : "distribute", partition);
+ } else {
+ printf("Error: unknown preloaded partition '%s'\n", partition);
+ return AVB_IO_RESULT_ERROR_OOM;
+ }
+
+ /*
+ * Already preloaded during boot/recovery loading,
+ * here we just return a dummy buffer.
+ */
+ if (!strncmp(partition, ANDROID_PARTITION_INIT_BOOT, 9) ||
+ !strncmp(partition, ANDROID_PARTITION_VENDOR_BOOT, 11) ||
+ !strncmp(partition, ANDROID_PARTITION_RESOURCE, 8)) {
+ *out_pointer = (u8 *)avb_malloc(ARCH_DMA_MINALIGN);
+ *out_num_bytes_preloaded = num_bytes; /* return what it expects */
+ return AVB_IO_RESULT_OK;
+ }
+
+ /* If already full preloaded, there is nothing to do and just return */
+ if (full_preload)
+ return AVB_IO_RESULT_OK;
+
+ /*
+ * only boot/recovery partition can reach here
+ * and init/vendor_boot are loaded at this round.
+ */
+ load_addr = env_get_ulong("kernel_addr_r", 16, 0);
+ if (!load_addr)
+ return AVB_IO_RESULT_ERROR_NO_SUCH_VALUE;
+
+ ret = android_image_load_by_partname(dev_desc, partition, &load_addr);
+ if (!ret) {
+ *out_pointer = (u8 *)load_addr;
+ *out_num_bytes_preloaded = num_bytes; /* return what it expects */
+ ret = AVB_IO_RESULT_OK;
+ } else {
+ ret = AVB_IO_RESULT_ERROR_IO;
+ }
}
return ret;
@@ -489,7 +579,8 @@
AvbOps *avb_ops_user_new(void)
{
- AvbOps *ops;
+ AvbOps *ops = NULL;
+ struct AvbOpsData *ops_data = NULL;
ops = calloc(1, sizeof(AvbOps));
if (!ops) {
@@ -510,8 +601,20 @@
free(ops);
goto out;
}
+
+ ops_data = calloc(1, sizeof(struct AvbOpsData));
+ if (!ops_data) {
+ printf("Error allocating memory for AvbOpsData.\n");
+ free(ops->atx_ops);
+ free(ops->ab_ops);
+ free(ops);
+ goto out;
+ }
+
ops->ab_ops->ops = ops;
ops->atx_ops->ops = ops;
+ ops_data->ops = ops;
+ ops->user_data = ops_data;
ops->read_from_partition = read_from_partition;
ops->write_to_partition = write_to_partition;
@@ -533,12 +636,14 @@
ops->atx_ops->set_key_version = avb_set_key_version;
ops->atx_ops->get_random = rk_get_random;
-out:
return ops;
+out:
+ return NULL;
}
void avb_ops_user_free(AvbOps *ops)
{
+ free(ops->user_data);
free(ops->ab_ops);
free(ops->atx_ops);
free(ops);
--
Gitblit v1.6.2