| #include <common.h> | |
| #include <amlogic/storage_if.h> | |
| #include <amlogic/instaboot.h> | |
| #include <partition_table.h> | |
| #ifndef PAGE_SIZE | |
| #define PAGE_SIZE 4096 | |
| #endif | |
| struct instaboot_header { | |
| char reserved[PAGE_SIZE - 10 - | |
| sizeof(struct new_utsname) - sizeof(u32)]; | |
| struct new_utsname uts; | |
| u32 version_code; | |
| char sig[10]; | |
| } __attribute__((packed)); | |
| static struct instaboot_header ib_header; | |
| int has_instaboot_part(void) | |
| { | |
| struct partitions *part_table = NULL; | |
| int i, name_len, ret = 0; | |
| int part_num = get_partitions_table(&part_table); | |
| name_len = strlen("instaboot"); | |
| for (i = 0; i < part_num; i++) { | |
| if (!strncmp(part_table[i].name, "instaboot", name_len)) { | |
| ret = 1; | |
| break; | |
| } | |
| } | |
| return ret; | |
| } | |
| int get_instaboot_header(struct instaboot_info* ib_info) | |
| { | |
| int rc = 0; | |
| u64 partSz = 0; | |
| if (!has_instaboot_part()) | |
| return -1; | |
| rc = store_get_partititon_size((unsigned char*)"instaboot", &partSz); | |
| if (rc || !partSz) { | |
| //printf("can not get instaboot part size\n"); | |
| return -1; | |
| } | |
| rc = store_read_ops((unsigned char*)"instaboot", | |
| (unsigned char*)&ib_header, 0, PAGE_SIZE); | |
| if (rc) { | |
| printf("read instaboo header error\n"); | |
| return -1; | |
| } | |
| if (!strncmp(ib_header.sig, INSTABOOT_SIG, strlen(INSTABOOT_SIG))) { | |
| memcpy(&ib_info->uts, &ib_header.uts, sizeof(struct new_utsname)); | |
| ib_info->version_code = ib_header.version_code; | |
| } else { | |
| printf("signature: %s\n", ib_header.sig); | |
| return -1; | |
| } | |
| return 0; | |
| } |