diff options
author | Sam Hurst <shurst@google.com> | 2017-02-21 14:16:21 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-02-25 02:08:37 -0800 |
commit | fc75244eb90920d6c4954586d00f15fe511d0c11 (patch) | |
tree | 98b8c08ecdfa4396754cf21635ce3f9658769d93 /util/host_command_check.sh | |
parent | 26a2ff77d09d6c8846267d9f908a913aaf63f737 (diff) | |
download | chrome-ec-fc75244eb90920d6c4954586d00f15fe511d0c11.tar.gz |
ec:Add presubmit hook to enforce host command definitions
Make sure all public and private host commands starting with
EC_CMD_ and EC_PRV_CMD_ are properly formed
BUG=chromium:681240
TEST=manual.
Added following host commands and verified that they were flagged
#define EC_CMD_TESTA 1234
#define EC_CMD_TESTB 0xabcd
#define EC_CMD_TESTC 0x1ABCD
#define EC_CMD_TESTD 0xXEF01
#define EC_PRV_CMD_TESTA 1234
#define EC_PRV_CMD_TESTB 0xabcd
#define EC_PRV_CMD_TESTC 0x1ABCD
#define EC_PRV_CMD_TESTD 0XEF01
These were also flagged by the script
include/ec_commands.h:#define EC_CMD_ACPI_READ 0x80
include/ec_commands.h:#define EC_CMD_ACPI_WRITE 0x81
include/ec_commands.h:#define EC_CMD_ACPI_BURST_ENABLE 0x82
include/ec_commands.h:#define EC_CMD_ACPI_BURST_DISABLE 0x83
include/ec_commands.h:#define EC_CMD_ACPI_QUERY_EVENT 0x84
CQ-DEPEND=CL:445809
BRANCH=none
Change-Id: I4630d6a887ed289a68178e8f1a8f07f5141c80bc
Reviewed-on: https://chromium-review.googlesource.com/445811
Commit-Ready: Sam Hurst <shurst@google.com>
Tested-by: Sam Hurst <shurst@google.com>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'util/host_command_check.sh')
-rwxr-xr-x | util/host_command_check.sh | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/util/host_command_check.sh b/util/host_command_check.sh new file mode 100755 index 0000000000..57f0b8ffe3 --- /dev/null +++ b/util/host_command_check.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# +# Copyright 2017 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +####################################### +# Test if the following conditions hold for the ec host command +# The alpha numeric value of the define starts with 0x +# The alpha numeric value of the define is 4-hex digits +# The hex digits "A B C D E F" are capitalized +# Arguments: +# string - ec host command to check +# Returns: +# 0 if command is ok, else 1 +######################################## +check_cmd() { + IFS=" " + # Remove any tabs that may exist + tts=$(echo "$1" | sed 's/\t/ /g') + arr=( $tts ) + + # Check for 0x + if [[ "${arr[2]}" != 0x* ]]; then + return 1 + fi + + # Check that length is 6. 0x + 4 hex digits + if [[ ${#arr[2]} != 6 ]]; then + return 1 + fi + + # Check that hex digits are valid and uppercase + hd=${arr[2]:2} + if ! [[ $hd =~ ^[0-9A-F]{4}$ ]]; then + return 1 + fi + + # command is ok + return 0 +} + +####################################### +# Test if the string arg is in one of the following formats: +# file.X:#define EC_CMD_X XxXXXX +# file.X:#define EC_PRV_CMD_X XxXXXX +# Arguments: +# string - potential ec host command +# Returns: +# 0 if command is formated properly, else 1 +######################################## +should_check() { + IFS=" " + arr=( $1 ) + + # Check for file.X:#define + IFS=":" + temp=( ${arr[0]} ) + # Check for file.X + if [ ! -f "${temp[0]}" ]; then + return 1 + fi + + # Check for #define + if [[ "${temp[1]}" != "#define" ]]; then + return 1 + fi + + # Check for EC_CMD_XXX or EC_PRV_CMD_XXX + if [[ "${arr[1]}" != EC_CMD_* ]] && [[ "${arr[1]}" != EC_PRV_CMD_* ]]; then + return 1 + fi + + # Check for EC_XXX_XXX(n) + if [[ "${arr[1]}" =~ ')'$ ]]; then + return 1 + fi + + return 0 +} + +main() { + ec_errors=() + ei=0 + # Search all file occurrences of "EC_CMD" and store in array + IFS=$'\n' + ec_cmds=($(grep -r "EC_CMD")) + + # Loop through and find valid occurrences of "EC_CMD" to check + length=${#ec_cmds[@]} + for ((i = 0; i != length; i++)); do + if should_check "${ec_cmds[i]}"; then + if ! check_cmd "${ec_cmds[i]}"; then + ec_errors[$ei]="${ec_cmds[i]}" + ((ei++)) + fi + fi + done + + # Search all file occurrances of "EC_PRV_CMD" and store in array + IFS=$'\n' + ec_prv_cmds=($(grep -r "EC_PRV_CMD")) + + # Loop through and find valid occurrences of "EC_PRV_CMD" to check + length=${#ec_prv_cmds[@]} + for ((i = 0; i != length; i++)); do + if should_check "${ec_prv_cmds[i]}"; then + if ! check_cmd "${ec_prv_cmds[i]}"; then + ec_errors[$ei]="${ec_prv_cmds[i]}" + ((ei++)) + fi + fi + done + + # Check if any malformed ec host commands were found + if [ ! $ei -eq 0 ]; then + echo "The following host commands are malformed:" + # print all malformed host commands + for ((i = 0; i != ei; i++)); do + echo "FILE: ${ec_errors[i]}" + done + exit 1 + fi + + exit 0 +} + +main "$@" |