mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +00:00
Use watchdog-aware functions when calculating hashes of images - take two
Some files didn't get updated properly with the "Use watchdog-aware functions when calculating hashes of images" commit, this commit fixes this. Signed-off-by: Bartlomiej Sieka <tur@semihalf.com> Signed-off-by: Wolfgang Denk <wd@denx.de>
This commit is contained in:
parent
1de6b28be5
commit
7590378fb9
4 changed files with 31 additions and 36 deletions
|
@ -156,6 +156,7 @@ static table_entry_t uimage_comp[] = {
|
|||
};
|
||||
|
||||
uint32_t crc32 (uint32_t, const unsigned char *, uint);
|
||||
uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint);
|
||||
static void genimg_print_size (uint32_t size);
|
||||
#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC)
|
||||
static void genimg_print_time (time_t timestamp);
|
||||
|
@ -183,39 +184,11 @@ int image_check_dcrc (image_header_t *hdr)
|
|||
{
|
||||
ulong data = image_get_data (hdr);
|
||||
ulong len = image_get_data_size (hdr);
|
||||
ulong dcrc = crc32 (0, (unsigned char *)data, len);
|
||||
ulong dcrc = crc32_wd (0, (unsigned char *)data, len, CHUNKSZ_CRC32);
|
||||
|
||||
return (dcrc == image_get_dcrc (hdr));
|
||||
}
|
||||
|
||||
#ifndef USE_HOSTCC
|
||||
int image_check_dcrc_wd (image_header_t *hdr, ulong chunksz)
|
||||
{
|
||||
ulong dcrc = 0;
|
||||
ulong len = image_get_data_size (hdr);
|
||||
ulong data = image_get_data (hdr);
|
||||
|
||||
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
|
||||
ulong cdata = data;
|
||||
ulong edata = cdata + len;
|
||||
|
||||
while (cdata < edata) {
|
||||
ulong chunk = edata - cdata;
|
||||
|
||||
if (chunk > chunksz)
|
||||
chunk = chunksz;
|
||||
dcrc = crc32 (dcrc, (unsigned char *)cdata, chunk);
|
||||
cdata += chunk;
|
||||
|
||||
WATCHDOG_RESET ();
|
||||
}
|
||||
#else
|
||||
dcrc = crc32 (0, (unsigned char *)data, len);
|
||||
#endif
|
||||
|
||||
return (dcrc == image_get_dcrc (hdr));
|
||||
}
|
||||
#endif /* !USE_HOSTCC */
|
||||
|
||||
/**
|
||||
* image_multi_count - get component (sub-image) count
|
||||
|
@ -416,7 +389,7 @@ static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch,
|
|||
|
||||
if (verify) {
|
||||
puts(" Verifying Checksum ... ");
|
||||
if (!image_check_dcrc_wd (rd_hdr, CHUNKSZ)) {
|
||||
if (!image_check_dcrc (rd_hdr)) {
|
||||
puts ("Bad Data CRC\n");
|
||||
show_boot_progress (-12);
|
||||
return NULL;
|
||||
|
@ -1923,15 +1896,16 @@ static int calculate_hash (const void *data, int data_len, const char *algo,
|
|||
uint8_t *value, int *value_len)
|
||||
{
|
||||
if (strcmp (algo, "crc32") == 0 ) {
|
||||
*((uint32_t *)value) = crc32 (0, data, data_len);
|
||||
*((uint32_t *)value) = crc32_wd (0, data, data_len,
|
||||
CHUNKSZ_CRC32);
|
||||
*((uint32_t *)value) = cpu_to_uimage (*((uint32_t *)value));
|
||||
*value_len = 4;
|
||||
} else if (strcmp (algo, "sha1") == 0 ) {
|
||||
sha1_csum ((unsigned char *) data, data_len,
|
||||
(unsigned char *) value);
|
||||
sha1_csum_wd ((unsigned char *) data, data_len,
|
||||
(unsigned char *) value, CHUNKSZ_SHA1);
|
||||
*value_len = 20;
|
||||
} else if (strcmp (algo, "md5") == 0 ) {
|
||||
md5 ((unsigned char *)data, data_len, value);
|
||||
md5_wd ((unsigned char *)data, data_len, value, CHUNKSZ_MD5);
|
||||
*value_len = 16;
|
||||
} else {
|
||||
debug ("Unsupported hash alogrithm\n");
|
||||
|
|
|
@ -227,9 +227,23 @@ typedef struct bootm_headers {
|
|||
/*
|
||||
* Some systems (for example LWMON) have very short watchdog periods;
|
||||
* we must make sure to split long operations like memmove() or
|
||||
* crc32() into reasonable chunks.
|
||||
* checksum calculations into reasonable chunks.
|
||||
*/
|
||||
#ifndef CHUNKSZ
|
||||
#define CHUNKSZ (64 * 1024)
|
||||
#endif
|
||||
|
||||
#ifndef CHUNKSZ_CRC32
|
||||
#define CHUNKSZ_CRC32 (64 * 1024)
|
||||
#endif
|
||||
|
||||
#ifndef CHUNKSZ_MD5
|
||||
#define CHUNKSZ_MD5 (64 * 1024)
|
||||
#endif
|
||||
|
||||
#ifndef CHUNKSZ_SHA1
|
||||
#define CHUNKSZ_SHA1 (64 * 1024)
|
||||
#endif
|
||||
|
||||
#define uimage_to_cpu(x) ntohl(x)
|
||||
#define cpu_to_uimage(x) htonl(x)
|
||||
|
@ -363,7 +377,6 @@ static inline void image_set_name (image_header_t *hdr, const char *name)
|
|||
int image_check_hcrc (image_header_t *hdr);
|
||||
int image_check_dcrc (image_header_t *hdr);
|
||||
#ifndef USE_HOSTCC
|
||||
int image_check_dcrc_wd (image_header_t *hdr, ulong chunksize);
|
||||
int getenv_yesno (char *var);
|
||||
ulong getenv_bootm_low(void);
|
||||
ulong getenv_bootm_size(void);
|
||||
|
|
|
@ -25,6 +25,10 @@
|
|||
and to fit the cifs vfs by
|
||||
Steve French sfrench@us.ibm.com */
|
||||
|
||||
#ifndef USE_HOSTCC
|
||||
#include <common.h>
|
||||
#endif /* USE_HOSTCC */
|
||||
#include <watchdog.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <u-boot/md5.h>
|
||||
|
|
|
@ -29,6 +29,10 @@
|
|||
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||
#endif
|
||||
|
||||
#ifndef USE_HOSTCC
|
||||
#include <common.h>
|
||||
#endif /* USE_HOSTCC */
|
||||
#include <watchdog.h>
|
||||
#include <linux/string.h>
|
||||
#include "sha1.h"
|
||||
|
||||
|
|
Loading…
Reference in a new issue