mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-31 11:31:32 +00:00
Revert "env: fix potential stack overflow in environment functions"
Wolfgang requested this be reverted and Rob agreed after further
discussion. This was a symptom of a larger problem we need to deal
with.
This reverts commit 60d7d5a631
.
Signed-off-by: Tom Rini <trini@ti.com>
This commit is contained in:
parent
bc5fd908d9
commit
cd0f4fa1ca
8 changed files with 63 additions and 74 deletions
|
@ -30,7 +30,6 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
env_t *env_ptr;
|
env_t *env_ptr;
|
||||||
|
|
||||||
char *env_name_spec = "dataflash";
|
char *env_name_spec = "dataflash";
|
||||||
static char env_buf[CONFIG_ENV_SIZE];
|
|
||||||
|
|
||||||
uchar env_get_char_spec(int index)
|
uchar env_get_char_spec(int index)
|
||||||
{
|
{
|
||||||
|
@ -43,9 +42,11 @@ uchar env_get_char_spec(int index)
|
||||||
|
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
read_dataflash(CONFIG_ENV_ADDR, CONFIG_ENV_SIZE, env_buf);
|
char buf[CONFIG_ENV_SIZE];
|
||||||
|
|
||||||
env_import(env_buf, 1);
|
read_dataflash(CONFIG_ENV_ADDR, CONFIG_ENV_SIZE, buf);
|
||||||
|
|
||||||
|
env_import(buf, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
|
@ -54,20 +55,20 @@ void env_relocate_spec(void)
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
env_t *env_new = (env_t *)env_buf;
|
env_t env_new;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res;
|
char *res;
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new.data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new.crc = crc32(0, env_new.data, ENV_SIZE);
|
||||||
|
|
||||||
return write_dataflash(CONFIG_ENV_ADDR,
|
return write_dataflash(CONFIG_ENV_ADDR,
|
||||||
(unsigned long)env_new,
|
(unsigned long)&env_new,
|
||||||
CONFIG_ENV_SIZE);
|
CONFIG_ENV_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
env_t *env_ptr;
|
env_t *env_ptr;
|
||||||
static char env_buf[CONFIG_ENV_SIZE];
|
|
||||||
|
|
||||||
char *env_name_spec = "EEPROM";
|
char *env_name_spec = "EEPROM";
|
||||||
int env_eeprom_bus = -1;
|
int env_eeprom_bus = -1;
|
||||||
|
@ -112,7 +111,7 @@ uchar env_get_char_spec(int index)
|
||||||
|
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
char *buf = env_buf;
|
char buf[CONFIG_ENV_SIZE];
|
||||||
unsigned int off = CONFIG_ENV_OFFSET;
|
unsigned int off = CONFIG_ENV_OFFSET;
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
|
@ -127,7 +126,7 @@ void env_relocate_spec(void)
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
env_t *env_new = (env_t *)env_buf;
|
env_t env_new;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res;
|
char *res;
|
||||||
int rc;
|
int rc;
|
||||||
|
@ -139,13 +138,13 @@ int saveenv(void)
|
||||||
|
|
||||||
BUG_ON(env_ptr != NULL);
|
BUG_ON(env_ptr != NULL);
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new.data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new.crc = crc32(0, env_new.data, ENV_SIZE);
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
if (gd->env_valid == 1) {
|
if (gd->env_valid == 1) {
|
||||||
|
@ -153,11 +152,11 @@ int saveenv(void)
|
||||||
off_red = CONFIG_ENV_OFFSET;
|
off_red = CONFIG_ENV_OFFSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
env_new->flags = ACTIVE_FLAG;
|
env_new.flags = ACTIVE_FLAG;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rc = eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
|
rc = eeprom_bus_write(CONFIG_SYS_DEF_EEPROM_ADDR,
|
||||||
off, (uchar *)env_new, CONFIG_ENV_SIZE);
|
off, (uchar *)&env_new, CONFIG_ENV_SIZE);
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
char *env_name_spec = "FAT";
|
char *env_name_spec = "FAT";
|
||||||
|
|
||||||
env_t *env_ptr;
|
env_t *env_ptr;
|
||||||
static char env_buf[CONFIG_ENV_SIZE];
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
@ -53,7 +52,7 @@ int env_init(void)
|
||||||
#ifdef CONFIG_CMD_SAVEENV
|
#ifdef CONFIG_CMD_SAVEENV
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
env_t *env_new = env_buf;
|
env_t env_new;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res;
|
char *res;
|
||||||
block_dev_desc_t *dev_desc = NULL;
|
block_dev_desc_t *dev_desc = NULL;
|
||||||
|
@ -61,7 +60,7 @@ int saveenv(void)
|
||||||
int part = FAT_ENV_PART;
|
int part = FAT_ENV_PART;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new.data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
|
@ -96,8 +95,8 @@ int saveenv(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new.crc = crc32(0, env_new.data, ENV_SIZE);
|
||||||
err = file_fat_write(FAT_ENV_FILE, (void *)env_new, sizeof(env_t));
|
err = file_fat_write(FAT_ENV_FILE, (void *)&env_new, sizeof(env_t));
|
||||||
if (err == -1) {
|
if (err == -1) {
|
||||||
printf("\n** Unable to write \"%s\" from %s%d:%d **\n",
|
printf("\n** Unable to write \"%s\" from %s%d:%d **\n",
|
||||||
FAT_ENV_FILE, FAT_ENV_INTERFACE, dev, part);
|
FAT_ENV_FILE, FAT_ENV_INTERFACE, dev, part);
|
||||||
|
@ -111,7 +110,7 @@ int saveenv(void)
|
||||||
|
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
char *buf = env_buf;
|
char buf[CONFIG_ENV_SIZE];
|
||||||
block_dev_desc_t *dev_desc = NULL;
|
block_dev_desc_t *dev_desc = NULL;
|
||||||
int dev = FAT_ENV_DEVICE;
|
int dev = FAT_ENV_DEVICE;
|
||||||
int part = FAT_ENV_PART;
|
int part = FAT_ENV_PART;
|
||||||
|
|
|
@ -40,8 +40,6 @@ env_t *env_ptr = &environment;
|
||||||
env_t *env_ptr;
|
env_t *env_ptr;
|
||||||
#endif /* ENV_IS_EMBEDDED */
|
#endif /* ENV_IS_EMBEDDED */
|
||||||
|
|
||||||
DEFINE_CACHE_ALIGN_BUFFER(char, env_buf, CONFIG_ENV_SIZE);
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
#if !defined(CONFIG_ENV_OFFSET)
|
#if !defined(CONFIG_ENV_OFFSET)
|
||||||
|
@ -114,7 +112,7 @@ static inline int write_env(struct mmc *mmc, unsigned long size,
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
env_t *env_new = (env_t *)env_buf;
|
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res;
|
char *res;
|
||||||
struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
|
struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
|
||||||
|
@ -129,7 +127,7 @@ int saveenv(void)
|
||||||
goto fini;
|
goto fini;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new->data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
|
@ -137,7 +135,7 @@ int saveenv(void)
|
||||||
goto fini;
|
goto fini;
|
||||||
}
|
}
|
||||||
|
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new->crc = crc32(0, &env_new->data[0], ENV_SIZE);
|
||||||
printf("Writing to MMC(%d)... ", CONFIG_SYS_MMC_ENV_DEV);
|
printf("Writing to MMC(%d)... ", CONFIG_SYS_MMC_ENV_DEV);
|
||||||
if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) {
|
if (write_env(mmc, CONFIG_ENV_SIZE, offset, (u_char *)env_new)) {
|
||||||
puts("failed\n");
|
puts("failed\n");
|
||||||
|
@ -171,6 +169,7 @@ static inline int read_env(struct mmc *mmc, unsigned long size,
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
#if !defined(ENV_IS_EMBEDDED)
|
#if !defined(ENV_IS_EMBEDDED)
|
||||||
|
ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
|
||||||
struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
|
struct mmc *mmc = find_mmc_device(CONFIG_SYS_MMC_ENV_DEV);
|
||||||
u32 offset;
|
u32 offset;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -185,12 +184,12 @@ void env_relocate_spec(void)
|
||||||
goto fini;
|
goto fini;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (read_env(mmc, CONFIG_ENV_SIZE, offset, env_buf)) {
|
if (read_env(mmc, CONFIG_ENV_SIZE, offset, buf)) {
|
||||||
ret = 1;
|
ret = 1;
|
||||||
goto fini;
|
goto fini;
|
||||||
}
|
}
|
||||||
|
|
||||||
env_import(env_buf, 1);
|
env_import(buf, 1);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
fini:
|
fini:
|
||||||
|
|
|
@ -64,8 +64,6 @@ env_t *env_ptr = (env_t *)CONFIG_NAND_ENV_DST;
|
||||||
env_t *env_ptr;
|
env_t *env_ptr;
|
||||||
#endif /* ENV_IS_EMBEDDED */
|
#endif /* ENV_IS_EMBEDDED */
|
||||||
|
|
||||||
DEFINE_CACHE_ALIGN_BUFFER(char, env_buf, CONFIG_ENV_SIZE);
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -175,7 +173,7 @@ static unsigned char env_flags;
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
env_t *env_new = (env_t *)env_buf;
|
env_t env_new;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res;
|
char *res;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -187,14 +185,14 @@ int saveenv(void)
|
||||||
if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
|
if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new.data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new.crc = crc32(0, env_new.data, ENV_SIZE);
|
||||||
env_new->flags = ++env_flags; /* increase the serial */
|
env_new.flags = ++env_flags; /* increase the serial */
|
||||||
|
|
||||||
if (gd->env_valid == 1) {
|
if (gd->env_valid == 1) {
|
||||||
puts("Erasing redundant NAND...\n");
|
puts("Erasing redundant NAND...\n");
|
||||||
|
@ -203,7 +201,7 @@ int saveenv(void)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
puts("Writing to redundant NAND... ");
|
puts("Writing to redundant NAND... ");
|
||||||
ret = writeenv(CONFIG_ENV_OFFSET_REDUND, (u_char *)env_new);
|
ret = writeenv(CONFIG_ENV_OFFSET_REDUND, (u_char *)&env_new);
|
||||||
} else {
|
} else {
|
||||||
puts("Erasing NAND...\n");
|
puts("Erasing NAND...\n");
|
||||||
nand_erase_options.offset = CONFIG_ENV_OFFSET;
|
nand_erase_options.offset = CONFIG_ENV_OFFSET;
|
||||||
|
@ -211,7 +209,7 @@ int saveenv(void)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
puts("Writing to NAND... ");
|
puts("Writing to NAND... ");
|
||||||
ret = writeenv(CONFIG_ENV_OFFSET, (u_char *)env_new);
|
ret = writeenv(CONFIG_ENV_OFFSET, (u_char *)&env_new);
|
||||||
}
|
}
|
||||||
if (ret) {
|
if (ret) {
|
||||||
puts("FAILED!\n");
|
puts("FAILED!\n");
|
||||||
|
@ -228,7 +226,7 @@ int saveenv(void)
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
env_t *env_new = (env_t *)env_buf;
|
ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res;
|
char *res;
|
||||||
nand_erase_options_t nand_erase_options;
|
nand_erase_options_t nand_erase_options;
|
||||||
|
@ -240,7 +238,7 @@ int saveenv(void)
|
||||||
if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
|
if (CONFIG_ENV_RANGE < CONFIG_ENV_SIZE)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new->data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
|
@ -406,6 +404,7 @@ void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
#if !defined(ENV_IS_EMBEDDED)
|
#if !defined(ENV_IS_EMBEDDED)
|
||||||
int ret;
|
int ret;
|
||||||
|
ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
|
||||||
|
|
||||||
#if defined(CONFIG_ENV_OFFSET_OOB)
|
#if defined(CONFIG_ENV_OFFSET_OOB)
|
||||||
ret = get_nand_env_oob(&nand_info[0], &nand_env_oob_offset);
|
ret = get_nand_env_oob(&nand_info[0], &nand_env_oob_offset);
|
||||||
|
@ -421,13 +420,13 @@ void env_relocate_spec(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ret = readenv(CONFIG_ENV_OFFSET, (u_char *)env_buf);
|
ret = readenv(CONFIG_ENV_OFFSET, (u_char *)buf);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
set_default_env("!readenv() failed");
|
set_default_env("!readenv() failed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
env_import(env_buf, 1);
|
env_import(buf, 1);
|
||||||
#endif /* ! ENV_IS_EMBEDDED */
|
#endif /* ! ENV_IS_EMBEDDED */
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_ENV_OFFSET_REDUND */
|
#endif /* CONFIG_ENV_OFFSET_REDUND */
|
||||||
|
|
|
@ -59,10 +59,6 @@ env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR;
|
||||||
|
|
||||||
char *env_name_spec = "NVRAM";
|
char *env_name_spec = "NVRAM";
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
|
|
||||||
static char env_buf[CONFIG_ENV_SIZE];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
|
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
|
||||||
uchar env_get_char_spec(int index)
|
uchar env_get_char_spec(int index)
|
||||||
{
|
{
|
||||||
|
@ -76,38 +72,36 @@ uchar env_get_char_spec(int index)
|
||||||
|
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
char *buf;
|
char buf[CONFIG_ENV_SIZE];
|
||||||
|
|
||||||
#if defined(CONFIG_SYS_NVRAM_ACCESS_ROUTINE)
|
#if defined(CONFIG_SYS_NVRAM_ACCESS_ROUTINE)
|
||||||
buf = env_buf;
|
|
||||||
nvram_read(buf, CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);
|
nvram_read(buf, CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);
|
||||||
#else
|
#else
|
||||||
buf = (void *)CONFIG_ENV_ADDR;
|
memcpy(buf, (void *)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);
|
||||||
#endif
|
#endif
|
||||||
env_import(buf, 1);
|
env_import(buf, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
|
env_t env_new;
|
||||||
env_t *env_new = (env_t *)env_buf;
|
|
||||||
#else
|
|
||||||
env_t *env_new = (env_t *)CONFIG_ENV_ADDR;
|
|
||||||
#endif
|
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res;
|
char *res;
|
||||||
int rcode = 0;
|
int rcode = 0;
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new.data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new.crc = crc32(0, env_new.data, ENV_SIZE);
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
|
#ifdef CONFIG_SYS_NVRAM_ACCESS_ROUTINE
|
||||||
nvram_write(CONFIG_ENV_ADDR, env_new, CONFIG_ENV_SIZE);
|
nvram_write(CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE);
|
||||||
|
#else
|
||||||
|
if (memcpy((char *)CONFIG_ENV_ADDR, &env_new, CONFIG_ENV_SIZE) == NULL)
|
||||||
|
rcode = 1;
|
||||||
#endif
|
#endif
|
||||||
return rcode;
|
return rcode;
|
||||||
}
|
}
|
||||||
|
@ -121,7 +115,7 @@ int env_init(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_SYS_NVRAM_ACCESS_ROUTINE)
|
#if defined(CONFIG_SYS_NVRAM_ACCESS_ROUTINE)
|
||||||
ulong crc;
|
ulong crc;
|
||||||
uchar *data = env_buf;
|
uchar data[ENV_SIZE];
|
||||||
|
|
||||||
nvram_read(&crc, CONFIG_ENV_ADDR, sizeof(ulong));
|
nvram_read(&crc, CONFIG_ENV_ADDR, sizeof(ulong));
|
||||||
nvram_read(data, CONFIG_ENV_ADDR + sizeof(ulong), ENV_SIZE);
|
nvram_read(data, CONFIG_ENV_ADDR + sizeof(ulong), ENV_SIZE);
|
||||||
|
|
|
@ -42,8 +42,6 @@ char *env_name_spec = "OneNAND";
|
||||||
#define ONENAND_MAX_ENV_SIZE CONFIG_ENV_SIZE
|
#define ONENAND_MAX_ENV_SIZE CONFIG_ENV_SIZE
|
||||||
#define ONENAND_ENV_SIZE(mtd) (ONENAND_MAX_ENV_SIZE - ENV_HEADER_SIZE)
|
#define ONENAND_ENV_SIZE(mtd) (ONENAND_MAX_ENV_SIZE - ENV_HEADER_SIZE)
|
||||||
|
|
||||||
static char env_buf[CONFIG_ENV_SIZE];
|
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
|
@ -58,7 +56,8 @@ void env_relocate_spec(void)
|
||||||
char *buf = (char *)&environment;
|
char *buf = (char *)&environment;
|
||||||
#else
|
#else
|
||||||
loff_t env_addr = CONFIG_ENV_ADDR;
|
loff_t env_addr = CONFIG_ENV_ADDR;
|
||||||
char *buf = env_buf;
|
char onenand_env[ONENAND_MAX_ENV_SIZE];
|
||||||
|
char *buf = (char *)&onenand_env[0];
|
||||||
#endif /* ENV_IS_EMBEDDED */
|
#endif /* ENV_IS_EMBEDDED */
|
||||||
|
|
||||||
#ifndef ENV_IS_EMBEDDED
|
#ifndef ENV_IS_EMBEDDED
|
||||||
|
@ -82,7 +81,7 @@ void env_relocate_spec(void)
|
||||||
|
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
env_t *env_new = env_buf;
|
env_t env_new;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res;
|
char *res;
|
||||||
struct mtd_info *mtd = &onenand_mtd;
|
struct mtd_info *mtd = &onenand_mtd;
|
||||||
|
@ -95,13 +94,13 @@ int saveenv(void)
|
||||||
.callback = NULL,
|
.callback = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new.data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new.crc = crc32(0, env_new.data, ENV_SIZE);
|
||||||
|
|
||||||
instr.len = CONFIG_ENV_SIZE;
|
instr.len = CONFIG_ENV_SIZE;
|
||||||
#ifdef CONFIG_ENV_ADDR_FLEX
|
#ifdef CONFIG_ENV_ADDR_FLEX
|
||||||
|
@ -120,7 +119,7 @@ int saveenv(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mtd->write(mtd, env_addr, ONENAND_MAX_ENV_SIZE, &retlen,
|
if (mtd->write(mtd, env_addr, ONENAND_MAX_ENV_SIZE, &retlen,
|
||||||
(u_char *)env_new)) {
|
(u_char *)&env_new)) {
|
||||||
printf("OneNAND: write failed at 0x%llx\n", instr.addr);
|
printf("OneNAND: write failed at 0x%llx\n", instr.addr);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,12 +58,11 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
char *env_name_spec = "SPI Flash";
|
char *env_name_spec = "SPI Flash";
|
||||||
|
|
||||||
static struct spi_flash *env_flash;
|
static struct spi_flash *env_flash;
|
||||||
static char env_buf[CONFIG_ENV_SIZE];
|
|
||||||
|
|
||||||
#if defined(CONFIG_ENV_OFFSET_REDUND)
|
#if defined(CONFIG_ENV_OFFSET_REDUND)
|
||||||
int saveenv(void)
|
int saveenv(void)
|
||||||
{
|
{
|
||||||
env_t *env_new = (env_t *)env_buf;
|
env_t env_new;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
char *res, *saved_buffer = NULL, flag = OBSOLETE_FLAG;
|
char *res, *saved_buffer = NULL, flag = OBSOLETE_FLAG;
|
||||||
u32 saved_size, saved_offset, sector = 1;
|
u32 saved_size, saved_offset, sector = 1;
|
||||||
|
@ -79,14 +78,14 @@ int saveenv(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new.data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new.crc = crc32(0, env_new.data, ENV_SIZE);
|
||||||
env_new->flags = ACTIVE_FLAG;
|
env_new.flags = ACTIVE_FLAG;
|
||||||
|
|
||||||
if (gd->env_valid == 1) {
|
if (gd->env_valid == 1) {
|
||||||
env_new_offset = CONFIG_ENV_OFFSET_REDUND;
|
env_new_offset = CONFIG_ENV_OFFSET_REDUND;
|
||||||
|
@ -126,7 +125,7 @@ int saveenv(void)
|
||||||
puts("Writing to SPI flash...");
|
puts("Writing to SPI flash...");
|
||||||
|
|
||||||
ret = spi_flash_write(env_flash, env_new_offset,
|
ret = spi_flash_write(env_flash, env_new_offset,
|
||||||
CONFIG_ENV_SIZE, env_new);
|
CONFIG_ENV_SIZE, &env_new);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
@ -138,7 +137,7 @@ int saveenv(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = spi_flash_write(env_flash, env_offset + offsetof(env_t, flags),
|
ret = spi_flash_write(env_flash, env_offset + offsetof(env_t, flags),
|
||||||
sizeof(env_new->flags), &flag);
|
sizeof(env_new.flags), &flag);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
@ -244,7 +243,7 @@ int saveenv(void)
|
||||||
u32 saved_size, saved_offset, sector = 1;
|
u32 saved_size, saved_offset, sector = 1;
|
||||||
char *res, *saved_buffer = NULL;
|
char *res, *saved_buffer = NULL;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
env_t *env_new = (env_t *)env_buf;
|
env_t env_new;
|
||||||
ssize_t len;
|
ssize_t len;
|
||||||
|
|
||||||
if (!env_flash) {
|
if (!env_flash) {
|
||||||
|
@ -277,13 +276,13 @@ int saveenv(void)
|
||||||
sector++;
|
sector++;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = (char *)env_new->data;
|
res = (char *)&env_new.data;
|
||||||
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
error("Cannot export environment: errno = %d\n", errno);
|
error("Cannot export environment: errno = %d\n", errno);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
env_new->crc = crc32(0, env_new->data, ENV_SIZE);
|
env_new.crc = crc32(0, env_new.data, ENV_SIZE);
|
||||||
|
|
||||||
puts("Erasing SPI flash...");
|
puts("Erasing SPI flash...");
|
||||||
ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET,
|
ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET,
|
||||||
|
@ -293,7 +292,7 @@ int saveenv(void)
|
||||||
|
|
||||||
puts("Writing to SPI flash...");
|
puts("Writing to SPI flash...");
|
||||||
ret = spi_flash_write(env_flash, CONFIG_ENV_OFFSET,
|
ret = spi_flash_write(env_flash, CONFIG_ENV_OFFSET,
|
||||||
CONFIG_ENV_SIZE, env_new);
|
CONFIG_ENV_SIZE, &env_new);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
@ -316,7 +315,7 @@ int saveenv(void)
|
||||||
|
|
||||||
void env_relocate_spec(void)
|
void env_relocate_spec(void)
|
||||||
{
|
{
|
||||||
char *buf = env_buf;
|
char buf[CONFIG_ENV_SIZE];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
|
env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
|
||||||
|
|
Loading…
Add table
Reference in a new issue