diff options
author | Ting Shen <phoenixshen@google.com> | 2019-12-18 17:37:37 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-12-23 06:54:05 +0000 |
commit | 29ef57b1bc1b5dd7713f6ab42edb4646f2be756d (patch) | |
tree | e2330b7efe421ba5099779af5edea73c63334ae7 /common/virtual_battery.c | |
parent | 50f667f8531bd1b9c9b8408b7f96d294196e9b6e (diff) | |
download | chrome-ec-29ef57b1bc1b5dd7713f6ab42edb4646f2be756d.tar.gz |
virtual_battery: return errors on bad battery flags
Stop virtual_battery_handler from sending random values to host and
make userland programs panic.
BUG=b:144195782
TEST=UI never shows incorrect battery level.
BRANCH=kukui
Change-Id: Ia1ce4d6806db70cd3b189acdf1df4f865e5f8076
Signed-off-by: Ting Shen <phoenixshen@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1972161
Reviewed-by: Eric Yilun Lin <yllin@chromium.org>
Commit-Queue: Ting Shen <phoenixshen@chromium.org>
Tested-by: Ting Shen <phoenixshen@chromium.org>
Diffstat (limited to 'common/virtual_battery.c')
-rw-r--r-- | common/virtual_battery.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/common/virtual_battery.c b/common/virtual_battery.c index 7fdd92de1a..e9d1c2811d 100644 --- a/common/virtual_battery.c +++ b/common/virtual_battery.c @@ -224,24 +224,37 @@ int virtual_battery_operation(const uint8_t *batt_cmd_head, memcpy(dest, &val, bounded_read_len); break; case SB_VOLTAGE: + if (curr_batt->flags & BATT_FLAG_BAD_VOLTAGE) + return EC_ERROR_BUSY; memcpy(dest, &(curr_batt->voltage), bounded_read_len); break; case SB_RELATIVE_STATE_OF_CHARGE: + if (curr_batt->flags & BATT_FLAG_BAD_STATE_OF_CHARGE) + return EC_ERROR_BUSY; memcpy(dest, &(curr_batt->state_of_charge), bounded_read_len); break; case SB_TEMPERATURE: + if (curr_batt->flags & BATT_FLAG_BAD_TEMPERATURE) + return EC_ERROR_BUSY; memcpy(dest, &(curr_batt->temperature), bounded_read_len); break; case SB_CURRENT: + if (curr_batt->flags & BATT_FLAG_BAD_CURRENT) + return EC_ERROR_BUSY; memcpy(dest, &(curr_batt->current), bounded_read_len); break; case SB_FULL_CHARGE_CAPACITY: + if (curr_batt->flags & BATT_FLAG_BAD_FULL_CAPACITY || + curr_batt->flags & BATT_FLAG_BAD_VOLTAGE) + return EC_ERROR_BUSY; val = curr_batt->full_capacity; if (batt_mode_cache & MODE_CAPACITY) val = val * curr_batt->voltage / 10000; memcpy(dest, &val, bounded_read_len); break; case SB_BATTERY_STATUS: + if (curr_batt->flags & BATT_FLAG_BAD_STATUS) + return EC_ERROR_BUSY; memcpy(dest, &(curr_batt->status), bounded_read_len); break; case SB_CYCLE_COUNT: @@ -249,6 +262,8 @@ int virtual_battery_operation(const uint8_t *batt_cmd_head, bounded_read_len); break; case SB_DESIGN_CAPACITY: + if (curr_batt->flags & BATT_FLAG_BAD_VOLTAGE) + return EC_ERROR_BUSY; val = *(int *)host_get_memmap(EC_MEMMAP_BATT_DCAP); if (batt_mode_cache & MODE_CAPACITY) val = val * curr_batt->voltage / 10000; @@ -259,6 +274,9 @@ int virtual_battery_operation(const uint8_t *batt_cmd_head, bounded_read_len); break; case SB_REMAINING_CAPACITY: + if (curr_batt->flags & BATT_FLAG_BAD_REMAINING_CAPACITY || + curr_batt->flags & BATT_FLAG_BAD_VOLTAGE) + return EC_ERROR_BUSY; val = curr_batt->remaining_capacity; if (batt_mode_cache & MODE_CAPACITY) val = val * curr_batt->voltage / 10000; |