lib: avb: add bootloader-min-versions

The bootloader include uboot and trust. The uboot slot index
number is 0. The trust slot number index is 1.

Change-Id: Ia62edbf60486fa4128756458c6312f682a83d0f7
Signed-off-by: Jason Zhu <jason.zhu@rock-chips.com>
This commit is contained in:
Jason Zhu 2018-03-15 22:12:54 +08:00 committed by Kever Yang
parent df50318e9d
commit c3230cf0df
2 changed files with 94 additions and 2 deletions

View File

@ -27,6 +27,9 @@ extern "C" {
#define PERM_ATTR_SUCCESS_FLAG 1
/* soc-v use the rsa2048 */
#define VBOOT_KEY_SIZE 256
#define RPMB_BASE_ADDR (64*1024/256)
#define UBOOT_RB_INDEX_OFFSET 24
#define TRUST_RB_INDEX_OFFSET 28
/**
* Provided to fastboot to read how many slot in this system.

View File

@ -428,6 +428,88 @@ int rk_avb_read_bootloader_locked_flag(uint8_t *flag)
#endif
}
#ifdef CONFIG_SUPPORT_EMMC_RPMB
static int curr_device = -1;
int rk_bootloader_rollback_index_read(uint32_t offset, uint32_t bytes,
void *rb_index)
{
struct mmc *mmc;
uint8_t rpmb_buf[256] = {0};
uint32_t n;
char original_part;
if ((offset + bytes) > 256)
return -1;
if (curr_device < 0) {
if (get_mmc_num() > 0)
curr_device = 0;
else {
avb_error("No MMC device available");
return -1;
}
}
mmc = find_mmc_device(curr_device);
/* Switch to the RPMB partition */
#ifndef CONFIG_BLK
original_part = mmc->block_dev.hwpart;
#else
original_part = mmc_get_blk_desc(mmc)->hwpart;
#endif
if (blk_select_hwpart_devnum(IF_TYPE_MMC, curr_device, MMC_PART_RPMB) !=
0)
return -1;
n = mmc_rpmb_read(mmc, rpmb_buf, RPMB_BASE_ADDR, 1, NULL);
if (n != 1)
return -1;
/* Return to original partition */
if (blk_select_hwpart_devnum(IF_TYPE_MMC, curr_device, original_part) !=
0)
return -1;
memcpy(rb_index, (void*)&rpmb_buf[offset], bytes);
return 0;
}
int rk_avb_get_bootloader_min_version(char *buffer)
{
uint32_t rb_index;
char temp[ROLLBACK_MAX_SIZE] = {0};
if (rk_bootloader_rollback_index_read(UBOOT_RB_INDEX_OFFSET,
sizeof(uint32_t), &rb_index)) {
avb_error("Can not read uboot rollback index");
return -1;
}
snprintf(temp, sizeof(int) + 1, "%d", 0);
strncat(buffer, temp, ROLLBACK_MAX_SIZE);
strncat(buffer, ":", 1);
snprintf(temp, sizeof(uint32_t) + 1, "%d", rb_index);
strncat(buffer, temp, ROLLBACK_MAX_SIZE);
strncat(buffer, ",", 1);
if (rk_bootloader_rollback_index_read(TRUST_RB_INDEX_OFFSET,
sizeof(uint32_t), &rb_index)) {
avb_error("Can not read trust rollback index");
return -1;
}
snprintf(temp, sizeof(int) + 1, "%d", 1);
strncat(buffer, temp, ROLLBACK_MAX_SIZE);
strncat(buffer, ":", 1);
snprintf(temp, sizeof(uint32_t) + 1, "%d", rb_index);
strncat(buffer, temp, ROLLBACK_MAX_SIZE);
return 0;
}
#endif
void rk_avb_get_at_vboot_state(char *buf)
{
char temp_buffer[200] = {0};
@ -477,8 +559,15 @@ void rk_avb_get_at_vboot_state(char *buf)
printf("Can not avb_min_ver!\n");
sprintf(buf, "%s%s%s%s", buf, avb_min_ver, temp_buffer, crlf);
/* miniloader is not ready, bootloader-min-versions=-1 */
sprintf(buf, "%s%s%d%s", buf, btld_min_ver, -1, crlf);
/* bootloader-min-versions */
memset(temp_buffer, 0, 200);
#ifdef CONFIG_SUPPORT_EMMC_RPMB
if (rk_avb_get_bootloader_min_version(temp_buffer))
avb_error("Call rk_avb_get_bootloader_min_version error!");
#else
memcpy(temp_buffer, "-1", strlen("-1"));
#endif
sprintf(buf, "%s%s%s%s", buf, btld_min_ver, temp_buffer, crlf);
}
int rk_avb_get_ab_info(AvbABData* ab_data)