From fc75244eb90920d6c4954586d00f15fe511d0c11 Mon Sep 17 00:00:00 2001 From: Sam Hurst Date: Tue, 21 Feb 2017 14:16:21 -0800 Subject: 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 Tested-by: Sam Hurst Reviewed-by: Randall Spangler Reviewed-by: Shawn N --- PRESUBMIT.cfg | 1 + util/host_command_check.sh | 128 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100755 util/host_command_check.sh 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 "$@" -- cgit v1.2.1