From: Andreas Reichel <[email protected]> For future implementation of a fail-safe mechanism an additional flag is needed. Since 'in_progress' only needs one bit, the meaning of the internal 'in_progress' variable is changed to a flags register and 'in_progress' is represented by the flag setting the LSB. This way 7 additional flags can be implemented without the need for additional variables.
Signed-off-by: Andreas Reichel <[email protected]> --- env/env_api.c | 8 ++++---- env/env_api_fat.c | 16 +++++++++++++--- env/fatvars.c | 2 +- include/envdata.h | 4 +++- tools/bg_setenv.c | 5 ++++- tools/tests/test_ebgenv_api.c | 6 ++++-- 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/env/env_api.c b/env/env_api.c index d6f1795..6cf6449 100644 --- a/env/env_api.c +++ b/env/env_api.c @@ -74,7 +74,7 @@ int ebg_env_create_new(ebgenv_t *e) BG_ENVDATA *latest_data = ((BGENV *)latest_env)->data; - if (latest_data->in_progress != 1) { + if (!(latest_data->status_flags & ENV_STATUS_IN_PROGRESS)) { e->bgenv = (void *)bgenv_create_new(); if (!e->bgenv) { bgenv_close(latest_env); @@ -82,10 +82,10 @@ int ebg_env_create_new(ebgenv_t *e) } BG_ENVDATA *new_data = ((BGENV *)e->bgenv)->data; uint32_t new_rev = new_data->revision; - uint8_t new_in_progress = new_data->in_progress; + uint8_t new_status_flags = new_data->status_flags; memcpy(new_data, latest_env->data, sizeof(BG_ENVDATA)); new_data->revision = new_rev; - new_data->in_progress = new_in_progress; + new_data->status_flags = new_status_flags; bgenv_close(latest_env); } else { e->bgenv = latest_env; @@ -289,7 +289,7 @@ int ebg_env_finalize_update(ebgenv_t *e) pgci = &tmp; } - ((BGENV *)e->bgenv)->data->in_progress = 0; + ((BGENV *)e->bgenv)->data->status_flags &= ~ENV_STATUS_IN_PROGRESS; ((BGENV *)e->bgenv)->data->ustate = USTATE_INSTALLED; return 0; } diff --git a/env/env_api_fat.c b/env/env_api_fat.c index 378b20e..c51eec5 100644 --- a/env/env_api_fat.c +++ b/env/env_api_fat.c @@ -319,7 +319,8 @@ int bgenv_get(BGENV *env, char *key, uint64_t *type, void *data, USERVAR_TYPE_UINT8); case EBGENV_IN_PROGRESS: return bgenv_get_uint(buffer, type, data, - env->data->in_progress, + env->data->status_flags & + ENV_STATUS_IN_PROGRESS, USERVAR_TYPE_UINT8); default: if (!data) { @@ -399,7 +400,16 @@ int bgenv_set(BGENV *env, char *key, uint64_t type, void *data, if (val < 0) { return val; } - env->data->in_progress = val; + switch(val) { + case 1: + env->data->status_flags |= ENV_STATUS_IN_PROGRESS; + break; + case 0: + env->data->status_flags &= ~ENV_STATUS_IN_PROGRESS; + break; + default: + return -EINVAL; + } break; default: return -EINVAL; @@ -432,7 +442,7 @@ BGENV *bgenv_create_new(void) memset(env_new->data, 0, sizeof(BG_ENVDATA)); /* update revision field and testing mode */ env_new->data->revision = new_rev; - env_new->data->in_progress = 1; + env_new->data->status_flags = ENV_STATUS_IN_PROGRESS; /* set default watchdog timeout */ env_new->data->watchdog_timeout_sec = 30; diff --git a/env/fatvars.c b/env/fatvars.c index 0645af8..4b87f55 100644 --- a/env/fatvars.c +++ b/env/fatvars.c @@ -195,7 +195,7 @@ BG_STATUS load_config(BG_LOADER_PARAMS *bglp) /* Test if this environment is currently 'in_progress'. If yes, * do not boot from it, instead ignore it */ - if (env[latest_idx].in_progress == 1) { + if (env[latest_idx].status_flags & ENV_STATUS_IN_PROGRESS) { current_partition = pre_latest_idx; } else if (env[latest_idx].ustate == USTATE_TESTING) { /* If it has already been booted, this indicates a failed diff --git a/include/envdata.h b/include/envdata.h index 25bd6c5..d1e5980 100644 --- a/include/envdata.h +++ b/include/envdata.h @@ -20,6 +20,8 @@ #define CONFIG_PARTITION_MAXCOUNT 64 +#define ENV_STATUS_IN_PROGRESS 1 + #define USTATE_OK 0 #define USTATE_INSTALLED 1 #define USTATE_TESTING 2 @@ -36,7 +38,7 @@ struct _BG_ENVDATA { uint16_t kernelfile[ENV_STRING_LENGTH]; uint16_t kernelparams[ENV_STRING_LENGTH]; - uint8_t in_progress; + uint8_t status_flags; uint8_t ustate; uint16_t watchdog_timeout_sec; uint32_t revision; diff --git a/tools/bg_setenv.c b/tools/bg_setenv.c index 5d8e9b8..cae268d 100644 --- a/tools/bg_setenv.c +++ b/tools/bg_setenv.c @@ -475,9 +475,12 @@ static void dump_uservars(uint8_t *udata) static void dump_env(BG_ENVDATA *env) { char buffer[ENV_STRING_LENGTH]; + bool in_progress; + + in_progress = env->status_flags & ENV_STATUS_IN_PROGRESS; fprintf(stdout, "Values:\n"); fprintf(stdout, - "in_progress: %s\n",env->in_progress ? "yes" : "no"); + "in_progress: %s\n", in_progress ? "yes" : "no"); fprintf(stdout, "revision: %u\n", env->revision); fprintf(stdout, "kernel: %s\n", str16to8(buffer, env->kernelfile)); diff --git a/tools/tests/test_ebgenv_api.c b/tools/tests/test_ebgenv_api.c index f7a3410..54d2441 100644 --- a/tools/tests/test_ebgenv_api.c +++ b/tools/tests/test_ebgenv_api.c @@ -130,7 +130,8 @@ START_TEST(ebgenv_api_ebg_env_create_new) ck_assert(((BGENV *)e.bgenv)->data == &envdata[0]); - ck_assert_int_eq(((BGENV *)e.bgenv)->data->in_progress, 1); + ck_assert((((BGENV *)e.bgenv)->data->status_flags & + ENV_STATUS_IN_PROGRESS) != 0); ck_assert_int_eq( ((BGENV *)e.bgenv)->data->revision, ENV_NUM_CONFIG_PARTS+1); @@ -157,7 +158,8 @@ START_TEST(ebgenv_api_ebg_env_create_new) ck_assert_int_eq(ret, 0); ck_assert_int_eq(((BGENV *)e.bgenv)->data->ustate, USTATE_INSTALLED); - ck_assert_int_eq(((BGENV *)e.bgenv)->data->in_progress, 0); + ck_assert((((BGENV *)e.bgenv)->data->status_flags & + ENV_STATUS_IN_PROGRESS) == 0); } END_TEST -- 2.17.0 -- You received this message because you are subscribed to the Google Groups "EFI Boot Guard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/efibootguard-dev/20180525120108.31055-6-andreas.reichel.ext%40siemens.com. For more options, visit https://groups.google.com/d/optout.
