action.yml 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. name: 'Apply Device-Specific Patches'
  2. description: 'Apply WiFi/Bluetooth fixes for Samsung and Xiaomi 6.6 GKI devices'
  3. inputs:
  4. version:
  5. description: 'Kernel config version (e.g., android15-6.6)'
  6. required: true
  7. kernel_version:
  8. description: 'Kernel version (e.g., 6.6)'
  9. required: true
  10. runs:
  11. using: "composite"
  12. steps:
  13. - name: Fix WiFi and Bluetooth on Samsung 6.6 GKI Devices
  14. if: inputs.version == 'android15-6.6'
  15. shell: bash
  16. working-directory: ${{ github.workspace }}/kernel/common
  17. run: |
  18. set -euo pipefail
  19. PATCH="${{ github.workspace }}/kernel_patches/samsung/min_kdp/add-min_kdp-symbols.patch"
  20. MIN_KDP="${{ github.workspace }}/kernel_patches/samsung/min_kdp/min_kdp.c"
  21. test -f "$PATCH" || { echo "Missing Samsung min_kdp patch: $PATCH" >&2; exit 1; }
  22. test -f "$MIN_KDP" || { echo "Missing Samsung min_kdp source: $MIN_KDP" >&2; exit 1; }
  23. SYMBOL_LIST=android/abi_gki_aarch64_galaxy
  24. TRANSACTION_DIR="$(mktemp -d)"
  25. BACKUP_DIR="$TRANSACTION_DIR/original"
  26. STAGE_DIR="$TRANSACTION_DIR/stage"
  27. TRANSACTION_COMMITTED=false
  28. declare -a TRANSACTION_PATHS
  29. TRANSACTION_PATH_COUNT=0
  30. add_transaction_path() {
  31. local path="$1"
  32. case "$path" in
  33. /dev/null|..|../*|*/../*|/*)
  34. echo "Unsafe Samsung patch path: $path" >&2
  35. exit 1
  36. ;;
  37. esac
  38. local index existing
  39. for ((index = 0; index < TRANSACTION_PATH_COUNT; index++)); do
  40. existing="${TRANSACTION_PATHS[index]}"
  41. [ "$existing" = "$path" ] && return
  42. done
  43. TRANSACTION_PATHS[TRANSACTION_PATH_COUNT]="$path"
  44. TRANSACTION_PATH_COUNT=$((TRANSACTION_PATH_COUNT + 1))
  45. }
  46. restore_transaction() {
  47. set +e
  48. set +u
  49. if [ "$TRANSACTION_COMMITTED" = true ]; then
  50. rm -rf "$TRANSACTION_DIR"
  51. return
  52. fi
  53. local index path
  54. for ((index = 0; index < TRANSACTION_PATH_COUNT; index++)); do
  55. path="${TRANSACTION_PATHS[index]}"
  56. if [[ -e "$BACKUP_DIR/$path" || -L "$BACKUP_DIR/$path" ]]; then
  57. rm -rf "$path"
  58. mkdir -p "$(dirname "$path")"
  59. cp -a "$BACKUP_DIR/$path" "$path"
  60. else
  61. rm -rf "$path"
  62. fi
  63. done
  64. rm -rf "$TRANSACTION_DIR"
  65. }
  66. trap restore_transaction EXIT
  67. PATCH_PATHS=()
  68. while IFS= read -r path; do
  69. [ -n "$path" ] && PATCH_PATHS+=("$path")
  70. done < <(awk '/^(---|\+\+\+) / { path=$2; sub(/^[ab]\//, "", path); print path }' "$PATCH" | sort -u)
  71. for path in "${PATCH_PATHS[@]}"; do
  72. add_transaction_path "$path"
  73. done
  74. add_transaction_path "$SYMBOL_LIST"
  75. add_transaction_path drivers/min_kdp.c
  76. add_transaction_path drivers/Makefile
  77. for path in "${TRANSACTION_PATHS[@]}"; do
  78. if [[ -e "$path" || -L "$path" ]]; then
  79. mkdir -p "$BACKUP_DIR/$(dirname "$path")" "$STAGE_DIR/$(dirname "$path")"
  80. cp -a "$path" "$BACKUP_DIR/$path"
  81. cp -a "$path" "$STAGE_DIR/$path"
  82. else
  83. mkdir -p "$STAGE_DIR/$(dirname "$path")"
  84. fi
  85. done
  86. (
  87. cd "$STAGE_DIR"
  88. patch -p1 --dry-run < "$PATCH"
  89. patch -p1 --no-backup-if-mismatch < "$PATCH"
  90. printf '%s\n' \
  91. 'kdp_set_cred_non_rcu' \
  92. 'kdp_usecount_dec_and_test' \
  93. 'kdp_usecount_inc' >> "$SYMBOL_LIST"
  94. cp "$MIN_KDP" drivers/min_kdp.c
  95. if ! grep -Fqx 'obj-y += min_kdp.o' drivers/Makefile; then
  96. printf '%s\n' 'obj-y += min_kdp.o' >> drivers/Makefile
  97. fi
  98. )
  99. for path in "${TRANSACTION_PATHS[@]}"; do
  100. if [[ -e "$STAGE_DIR/$path" || -L "$STAGE_DIR/$path" ]]; then
  101. mkdir -p "$(dirname "$path")"
  102. rm -rf "$path"
  103. cp -a "$STAGE_DIR/$path" "$path"
  104. else
  105. rm -rf "$path"
  106. fi
  107. done
  108. TRANSACTION_COMMITTED=true
  109. - name: Fix WiFi and Bluetooth on Xiaomi 6.6 GKI Devices
  110. if: inputs.version == 'android15-6.6'
  111. shell: bash
  112. working-directory: ${{ github.workspace }}/kernel/common
  113. run: |
  114. SYMBOL_LIST=android/abi_gki_aarch64_xiaomi
  115. echo "device_find_any_child" >> $SYMBOL_LIST