~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/tools/envcrc.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * (C) Copyright 2001
 
3
 * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
 
4
 *
 
5
 * SPDX-License-Identifier:     GPL-2.0+
 
6
 */
 
7
 
 
8
#include <errno.h>
 
9
#include <stdio.h>
 
10
#include <stdint.h>
 
11
#include <stdlib.h>
 
12
#include <string.h>
 
13
#include <unistd.h>
 
14
 
 
15
#ifndef __ASSEMBLY__
 
16
#define __ASSEMBLY__                    /* Dirty trick to get only #defines     */
 
17
#endif
 
18
#define __ASM_STUB_PROCESSOR_H__        /* don't include asm/processor.         */
 
19
#include <config.h>
 
20
#undef  __ASSEMBLY__
 
21
 
 
22
#if defined(CONFIG_ENV_IS_IN_FLASH)
 
23
# ifndef  CONFIG_ENV_ADDR
 
24
#  define CONFIG_ENV_ADDR       (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET)
 
25
# endif
 
26
# ifndef  CONFIG_ENV_OFFSET
 
27
#  define CONFIG_ENV_OFFSET (CONFIG_ENV_ADDR - CONFIG_SYS_FLASH_BASE)
 
28
# endif
 
29
# if !defined(CONFIG_ENV_ADDR_REDUND) && defined(CONFIG_ENV_OFFSET_REDUND)
 
30
#  define CONFIG_ENV_ADDR_REDUND        (CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET_REDUND)
 
31
# endif
 
32
# ifndef  CONFIG_ENV_SIZE
 
33
#  define CONFIG_ENV_SIZE       CONFIG_ENV_SECT_SIZE
 
34
# endif
 
35
# if defined(CONFIG_ENV_ADDR_REDUND) && !defined(CONFIG_ENV_SIZE_REDUND)
 
36
#  define CONFIG_ENV_SIZE_REDUND        CONFIG_ENV_SIZE
 
37
# endif
 
38
# if (CONFIG_ENV_ADDR >= CONFIG_SYS_MONITOR_BASE) && \
 
39
     ((CONFIG_ENV_ADDR + CONFIG_ENV_SIZE) <= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN))
 
40
#  define ENV_IS_EMBEDDED
 
41
# endif
 
42
# if defined(CONFIG_ENV_ADDR_REDUND) || defined(CONFIG_ENV_OFFSET_REDUND)
 
43
#  define CONFIG_SYS_REDUNDAND_ENVIRONMENT
 
44
# endif
 
45
#endif  /* CONFIG_ENV_IS_IN_FLASH */
 
46
 
 
47
#if defined(ENV_IS_EMBEDDED) && !defined(CONFIG_BUILD_ENVCRC)
 
48
# define CONFIG_BUILD_ENVCRC
 
49
#endif
 
50
 
 
51
#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
 
52
# define ENV_HEADER_SIZE        (sizeof(uint32_t) + 1)
 
53
#else
 
54
# define ENV_HEADER_SIZE        (sizeof(uint32_t))
 
55
#endif
 
56
 
 
57
#define ENV_SIZE (CONFIG_ENV_SIZE - ENV_HEADER_SIZE)
 
58
 
 
59
 
 
60
#ifdef CONFIG_BUILD_ENVCRC
 
61
# include <environment.h>
 
62
extern unsigned int env_size;
 
63
extern env_t environment;
 
64
#endif  /* CONFIG_BUILD_ENVCRC */
 
65
 
 
66
extern uint32_t crc32 (uint32_t, const unsigned char *, unsigned int);
 
67
 
 
68
int main (int argc, char **argv)
 
69
{
 
70
#ifdef CONFIG_BUILD_ENVCRC
 
71
        unsigned char pad = 0x00;
 
72
        uint32_t crc;
 
73
        unsigned char *envptr = (unsigned char *)&environment,
 
74
                *dataptr = envptr + ENV_HEADER_SIZE;
 
75
        unsigned int datasize = ENV_SIZE;
 
76
        unsigned int eoe;
 
77
 
 
78
        if (argv[1] && !strncmp(argv[1], "--binary", 8)) {
 
79
                int ipad = 0xff;
 
80
                if (argv[1][8] == '=')
 
81
                        sscanf(argv[1] + 9, "%i", &ipad);
 
82
                pad = ipad;
 
83
        }
 
84
 
 
85
        if (pad) {
 
86
                /* find the end of env */
 
87
                for (eoe = 0; eoe < datasize - 1; ++eoe)
 
88
                        if (!dataptr[eoe] && !dataptr[eoe+1]) {
 
89
                                eoe += 2;
 
90
                                break;
 
91
                        }
 
92
                if (eoe < datasize - 1)
 
93
                        memset(dataptr + eoe, pad, datasize - eoe);
 
94
        }
 
95
 
 
96
        crc = crc32 (0, dataptr, datasize);
 
97
 
 
98
        /* Check if verbose mode is activated passing a parameter to the program */
 
99
        if (argc > 1) {
 
100
                if (!strncmp(argv[1], "--binary", 8)) {
 
101
                        int le = (argc > 2 ? !strcmp(argv[2], "le") : 1);
 
102
                        size_t i, start, end, step;
 
103
                        if (le) {
 
104
                                start = 0;
 
105
                                end = ENV_HEADER_SIZE;
 
106
                                step = 1;
 
107
                        } else {
 
108
                                start = ENV_HEADER_SIZE - 1;
 
109
                                end = -1;
 
110
                                step = -1;
 
111
                        }
 
112
                        for (i = start; i != end; i += step)
 
113
                                printf("%c", (crc & (0xFF << (i * 8))) >> (i * 8));
 
114
                        if (fwrite(dataptr, 1, datasize, stdout) != datasize)
 
115
                                fprintf(stderr, "fwrite() failed: %s\n", strerror(errno));
 
116
                } else {
 
117
                        printf("CRC32 from offset %08X to %08X of environment = %08X\n",
 
118
                                (unsigned int) (dataptr - envptr),
 
119
                                (unsigned int) (dataptr - envptr) + datasize,
 
120
                                crc);
 
121
                }
 
122
        } else {
 
123
                printf ("0x%08X\n", crc);
 
124
        }
 
125
#else
 
126
        printf ("0\n");
 
127
#endif
 
128
        return EXIT_SUCCESS;
 
129
}