summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Hurst <shurst@google.com>2017-02-21 14:16:21 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-02-25 02:08:37 -0800
commitfc75244eb90920d6c4954586d00f15fe511d0c11 (patch)
tree98b8c08ecdfa4396754cf21635ce3f9658769d93
parent26a2ff77d09d6c8846267d9f908a913aaf63f737 (diff)
downloadchrome-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>
-rw-r--r--PRESUBMIT.cfg1
-rwxr-xr-xutil/host_command_check.sh128
2 files changed, 129 insertions, 0 deletions
diff --git a/PRESUBMIT.cfg b/PRESUBMIT.cfg
index 57b98a6b1a..9473bdbc41 100644
--- a/PRESUBMIT.cfg
+++ b/PRESUBMIT.cfg
@@ -12,3 +12,4 @@ checkpatch_check: --no-tree --ignore=MSLEEP,VOLATILE
[Hook Scripts]
hook0 = util/presubmit_check.sh 2>&1
hook1 = util/config_option_check.py 2>&1
+hook2 = util/host_command_check.sh 2>&1
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 "$@"