diff options
-rw-r--r-- | common/rwsig.c | 15 | ||||
-rw-r--r-- | include/ec_commands.h | 7 | ||||
-rw-r--r-- | util/ectool.c | 18 |
3 files changed, 40 insertions, 0 deletions
diff --git a/common/rwsig.c b/common/rwsig.c index 600c3eeaad..efc8c03ee1 100644 --- a/common/rwsig.c +++ b/common/rwsig.c @@ -10,6 +10,7 @@ #include "console.h" #include "ec_commands.h" #include "flash.h" +#include "host_command.h" #include "rollback.h" #include "rsa.h" #include "rwsig.h" @@ -271,4 +272,18 @@ exit: while (1) task_wait_event(-1); } +#else /* !HAS_TASK_RWSIG */ +int rwsig_cmd_check_status(struct host_cmd_handler_args *args) +{ + struct ec_response_rwsig_check_status *r = args->response; + + memset(r, 0, sizeof(*r)); + r->status = rwsig_check_signature(); + args->response_size = sizeof(*r); + + return EC_RES_SUCCESS; +} +DECLARE_HOST_COMMAND(EC_CMD_RWSIG_CHECK_STATUS, + rwsig_cmd_check_status, + EC_VER_MASK(0)); #endif diff --git a/include/ec_commands.h b/include/ec_commands.h index 4db42609c3..2295e26320 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -4042,6 +4042,13 @@ struct __ec_align2 ec_response_pd_chip_info { }; }; +/* Run RW signature verification and get status */ +#define EC_CMD_RWSIG_CHECK_STATUS 0x011C + +struct __ec_align4 ec_response_rwsig_check_status { + uint32_t status; +}; + #endif /* !__ACPI__ */ /*****************************************************************************/ diff --git a/util/ectool.c b/util/ectool.c index 00a2395bfc..8e3f21b8cc 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -208,6 +208,8 @@ const char help_str[] = " Set real-time clock alarm to go off in <sec> seconds\n" " rwhashpd <dev_id> <HASH[0] ... <HASH[4]>\n" " Set entry in PD MCU's device rw_hash table.\n" + " rwsigstatus\n" + " Run RW signature verification and get status.\n" " sertest\n" " Serial output test for COM2\n" " switches\n" @@ -1019,6 +1021,21 @@ int cmd_rw_hash_pd(int argc, char *argv[]) return rv; } +int cmd_rwsig_status(int argc, char *argv[]) +{ + int rv; + struct ec_response_rwsig_check_status resp; + + rv = ec_command(EC_CMD_RWSIG_CHECK_STATUS, 0, NULL, 0, + &resp, sizeof(resp)); + if (rv < 0) + return rv; + + printf("RW signature check: %s\n", resp.status ? "OK" : "FAILED"); + + return 0; +} + /** * determine if in GFU mode or not. * @@ -7048,6 +7065,7 @@ const struct command commands[] = { {"rtcset", cmd_rtc_set}, {"rtcsetalarm", cmd_rtc_set_alarm}, {"rwhashpd", cmd_rw_hash_pd}, + {"rwsigstatus", cmd_rwsig_status}, {"sertest", cmd_serial_test}, {"port80flood", cmd_port_80_flood}, {"switches", cmd_switches}, |