diff --git a/VERSION b/VERSION index 26367418..30de5cf6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4-alpha9 +0.4-alpha10 diff --git a/files/board/arpl/overlayfs/opt/arpl/include/consts.sh b/files/board/arpl/overlayfs/opt/arpl/include/consts.sh index 61be54b1..ef6eb79e 100644 --- a/files/board/arpl/overlayfs/opt/arpl/include/consts.sh +++ b/files/board/arpl/overlayfs/opt/arpl/include/consts.sh @@ -1,5 +1,5 @@ -ARPL_VERSION="0.4-alpha9" +ARPL_VERSION="0.4-alpha10" # Define paths TMP_PATH="/tmp" diff --git a/files/board/arpl/overlayfs/opt/arpl/kpatch b/files/board/arpl/overlayfs/opt/arpl/kpatch index cf716ad7..006e08cb 100755 Binary files a/files/board/arpl/overlayfs/opt/arpl/kpatch and b/files/board/arpl/overlayfs/opt/arpl/kpatch differ diff --git a/files/board/arpl/overlayfs/opt/arpl/menu.sh b/files/board/arpl/overlayfs/opt/arpl/menu.sh index 4b9198aa..0aaac372 100755 --- a/files/board/arpl/overlayfs/opt/arpl/menu.sh +++ b/files/board/arpl/overlayfs/opt/arpl/menu.sh @@ -683,14 +683,14 @@ function make() { [ ! -f "${ORI_ZIMAGE_FILE}" -o ! -f "${ORI_RDGZ_FILE}" ] && extractDsmFiles - /opt/arpl/zimage-patch.sh | tee -a "${LOG_FILE}" + /opt/arpl/zimage-patch.sh if [ $? -ne 0 ]; then dialog --backtitle "`backtitle`" --title "Error" --aspect 18 \ --msgbox "zImage not patched:\n`<"${LOG_FILE}"`" 0 0 return 1 fi - /opt/arpl/ramdisk-patch.sh | tee -a "${LOG_FILE}" + /opt/arpl/ramdisk-patch.sh if [ $? -ne 0 ]; then dialog --backtitle "`backtitle`" --title "Error" --aspect 18 \ --msgbox "Ramdisk not patched:\n`<"${LOG_FILE}"`" 0 0 diff --git a/files/board/arpl/overlayfs/opt/arpl/ramdisk-patch.sh b/files/board/arpl/overlayfs/opt/arpl/ramdisk-patch.sh index 09f779c6..f8634195 100755 --- a/files/board/arpl/overlayfs/opt/arpl/ramdisk-patch.sh +++ b/files/board/arpl/overlayfs/opt/arpl/ramdisk-patch.sh @@ -3,8 +3,10 @@ . /opt/arpl/include/functions.sh . /opt/arpl/include/addons.sh +set -o pipefail # Get exit code from process piped + # Sanity check -[ -f "${ORI_RDGZ_FILE}" ] || die "${ORI_RDGZ_FILE} not found!" +[ -f "${ORI_RDGZ_FILE}" ] || (die "${ORI_RDGZ_FILE} not found!" | tee -a "${LOG_FILE}") echo -n "Patching Ramdisk" @@ -39,7 +41,7 @@ KVER="`readModelKey "${MODEL}" "builds.${BUILD}.kver"`" RD_COMPRESSED="`readModelKey "${MODEL}" "builds.${BUILD}.rd-compressed"`" # Sanity check -[ -z "${PLATFORM}" -o -z "${KVER}" ] && die "ERROR: Configuration for model ${MODEL} and buildnumber ${BUILD} not found." +[ -z "${PLATFORM}" -o -z "${KVER}" ] && (die "ERROR: Configuration for model ${MODEL} and buildnumber ${BUILD} not found." | tee -a "${LOG_FILE}") declare -A SYNOINFO declare -A ADDONS @@ -125,7 +127,7 @@ fi for ADDON in ${!ADDONS[@]}; do PARAMS=${ADDONS[${ADDON}]} if ! installAddon ${ADDON}; then - echo "ADDON ${ADDON} not found!" | tee "${LOG_FILE}" + echo "ADDON ${ADDON} not found!" | tee -a "${LOG_FILE}" exit 1 fi echo "/addons/${ADDON}.sh \${1} ${PARAMS}" >> "${RAMDISK_PATH}/addons/addons.sh" 2>"${LOG_FILE}" || dieLog diff --git a/files/board/arpl/overlayfs/opt/arpl/zimage-patch.sh b/files/board/arpl/overlayfs/opt/arpl/zimage-patch.sh index f3886277..d599e761 100755 --- a/files/board/arpl/overlayfs/opt/arpl/zimage-patch.sh +++ b/files/board/arpl/overlayfs/opt/arpl/zimage-patch.sh @@ -2,8 +2,10 @@ . /opt/arpl/include/functions.sh +set -o pipefail # Get exit code from process piped + # Sanity check -[ -f "${ORI_ZIMAGE_FILE}" ] || die "${ORI_ZIMAGE_FILE} not found!" +[ -f "${ORI_ZIMAGE_FILE}" ] || (die "${ORI_ZIMAGE_FILE} not found!" | tee -a "${LOG_FILE}") echo -n "Patching zImage" @@ -17,7 +19,6 @@ echo -n "." echo -n "." # rebuild zImage /opt/arpl/vmlinux-to-bzImage.sh "${TMP_PATH}/vmlinux-mod" "${MOD_ZIMAGE_FILE}" >"${LOG_FILE}" 2>&1 || dieLog - echo -n "." # Update HASH of new DSM zImage HASH="`sha256sum ${ORI_ZIMAGE_FILE} | awk '{print$1}'`" diff --git a/files/board/arpl/overlayfs/usr/lib/libdevmapper.so.1.02 b/files/board/arpl/overlayfs/usr/lib/libdevmapper.so.1.02 new file mode 100755 index 00000000..f22a03f3 Binary files /dev/null and b/files/board/arpl/overlayfs/usr/lib/libdevmapper.so.1.02 differ diff --git a/files/board/arpl/overlayfs/usr/sbin/grub-editenv b/files/board/arpl/overlayfs/usr/sbin/grub-editenv new file mode 100755 index 00000000..c492ead5 Binary files /dev/null and b/files/board/arpl/overlayfs/usr/sbin/grub-editenv differ diff --git a/files/board/arpl/p3/addons/9p/apollolake-4.4.180.tgz b/files/board/arpl/p3/addons/9p/apollolake-4.4.180.tgz index 3ea7fe6f..6426df30 100644 Binary files a/files/board/arpl/p3/addons/9p/apollolake-4.4.180.tgz and b/files/board/arpl/p3/addons/9p/apollolake-4.4.180.tgz differ diff --git a/files/board/arpl/p3/addons/9p/broadwell-4.4.180.tgz b/files/board/arpl/p3/addons/9p/broadwell-4.4.180.tgz index cd142192..456560ef 100644 Binary files a/files/board/arpl/p3/addons/9p/broadwell-4.4.180.tgz and b/files/board/arpl/p3/addons/9p/broadwell-4.4.180.tgz differ diff --git a/files/board/arpl/p3/addons/9p/broadwellnk-4.4.180.tgz b/files/board/arpl/p3/addons/9p/broadwellnk-4.4.180.tgz index 55e2a374..f85b400f 100644 Binary files a/files/board/arpl/p3/addons/9p/broadwellnk-4.4.180.tgz and b/files/board/arpl/p3/addons/9p/broadwellnk-4.4.180.tgz differ diff --git a/files/board/arpl/p3/addons/9p/bromolow-3.10.108.tgz b/files/board/arpl/p3/addons/9p/bromolow-3.10.108.tgz index b913dfac..d3d6e58f 100644 Binary files a/files/board/arpl/p3/addons/9p/bromolow-3.10.108.tgz and b/files/board/arpl/p3/addons/9p/bromolow-3.10.108.tgz differ diff --git a/files/board/arpl/p3/addons/9p/denverton-4.4.180.tgz b/files/board/arpl/p3/addons/9p/denverton-4.4.180.tgz index ae57e433..88543ebc 100644 Binary files a/files/board/arpl/p3/addons/9p/denverton-4.4.180.tgz and b/files/board/arpl/p3/addons/9p/denverton-4.4.180.tgz differ diff --git a/files/board/arpl/p3/addons/9p/geminilake-4.4.180.tgz b/files/board/arpl/p3/addons/9p/geminilake-4.4.180.tgz index 40e8411b..898efb79 100644 Binary files a/files/board/arpl/p3/addons/9p/geminilake-4.4.180.tgz and b/files/board/arpl/p3/addons/9p/geminilake-4.4.180.tgz differ diff --git a/files/board/arpl/p3/addons/9p/v1000-4.4.180.tgz b/files/board/arpl/p3/addons/9p/v1000-4.4.180.tgz index 34950ea1..c2a434ac 100644 Binary files a/files/board/arpl/p3/addons/9p/v1000-4.4.180.tgz and b/files/board/arpl/p3/addons/9p/v1000-4.4.180.tgz differ diff --git a/files/board/arpl/p3/addons/acpid/all.tgz b/files/board/arpl/p3/addons/acpid/all.tgz index b6851718..9ee0c0db 100644 Binary files a/files/board/arpl/p3/addons/acpid/all.tgz and b/files/board/arpl/p3/addons/acpid/all.tgz differ diff --git a/files/board/arpl/p3/addons/dbgutils/all.tgz b/files/board/arpl/p3/addons/dbgutils/all.tgz index 2692dc89..92eb0076 100644 Binary files a/files/board/arpl/p3/addons/dbgutils/all.tgz and b/files/board/arpl/p3/addons/dbgutils/all.tgz differ diff --git a/files/board/arpl/p3/addons/dtbpatch/all.tgz b/files/board/arpl/p3/addons/dtbpatch/all.tgz index 2ca5c607..2ccb346b 100644 Binary files a/files/board/arpl/p3/addons/dtbpatch/all.tgz and b/files/board/arpl/p3/addons/dtbpatch/all.tgz differ diff --git a/files/board/arpl/p3/addons/eudev/all.tgz b/files/board/arpl/p3/addons/eudev/all.tgz index 77cc5665..04684aa0 100644 Binary files a/files/board/arpl/p3/addons/eudev/all.tgz and b/files/board/arpl/p3/addons/eudev/all.tgz differ diff --git a/files/board/arpl/p3/addons/i915/apollolake-4.4.180.tgz b/files/board/arpl/p3/addons/i915/apollolake-4.4.180.tgz index c8ba431e..9f8e3674 100644 Binary files a/files/board/arpl/p3/addons/i915/apollolake-4.4.180.tgz and b/files/board/arpl/p3/addons/i915/apollolake-4.4.180.tgz differ diff --git a/files/board/arpl/p3/addons/i915/geminilake-4.4.180.tgz b/files/board/arpl/p3/addons/i915/geminilake-4.4.180.tgz index 0f3048e0..4e1dbd5d 100644 Binary files a/files/board/arpl/p3/addons/i915/geminilake-4.4.180.tgz and b/files/board/arpl/p3/addons/i915/geminilake-4.4.180.tgz differ diff --git a/files/board/arpl/p3/addons/lsiutil/all.tgz b/files/board/arpl/p3/addons/lsiutil/all.tgz index 41adf40a..5fe26d6b 100644 Binary files a/files/board/arpl/p3/addons/lsiutil/all.tgz and b/files/board/arpl/p3/addons/lsiutil/all.tgz differ diff --git a/files/board/arpl/p3/addons/maxdisks/all.tgz b/files/board/arpl/p3/addons/maxdisks/all.tgz index d8321e37..48fd80b5 100644 Binary files a/files/board/arpl/p3/addons/maxdisks/all.tgz and b/files/board/arpl/p3/addons/maxdisks/all.tgz differ diff --git a/files/board/arpl/p3/addons/misc/all.tgz b/files/board/arpl/p3/addons/misc/all.tgz index e7a59661..2bdcc393 100644 Binary files a/files/board/arpl/p3/addons/misc/all.tgz and b/files/board/arpl/p3/addons/misc/all.tgz differ diff --git a/files/board/arpl/p3/lkms/rp-apollolake-4.4.180-dev.ko.gz b/files/board/arpl/p3/lkms/rp-apollolake-4.4.180-dev.ko.gz index 5bcb0690..d968f87e 100644 Binary files a/files/board/arpl/p3/lkms/rp-apollolake-4.4.180-dev.ko.gz and b/files/board/arpl/p3/lkms/rp-apollolake-4.4.180-dev.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-apollolake-4.4.180-prod.ko.gz b/files/board/arpl/p3/lkms/rp-apollolake-4.4.180-prod.ko.gz index b697aae1..cf720189 100644 Binary files a/files/board/arpl/p3/lkms/rp-apollolake-4.4.180-prod.ko.gz and b/files/board/arpl/p3/lkms/rp-apollolake-4.4.180-prod.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-broadwell-4.4.180-dev.ko.gz b/files/board/arpl/p3/lkms/rp-broadwell-4.4.180-dev.ko.gz index 62479d2b..de1ed30a 100644 Binary files a/files/board/arpl/p3/lkms/rp-broadwell-4.4.180-dev.ko.gz and b/files/board/arpl/p3/lkms/rp-broadwell-4.4.180-dev.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-broadwell-4.4.180-prod.ko.gz b/files/board/arpl/p3/lkms/rp-broadwell-4.4.180-prod.ko.gz index 4ed090b3..a05f3a6d 100644 Binary files a/files/board/arpl/p3/lkms/rp-broadwell-4.4.180-prod.ko.gz and b/files/board/arpl/p3/lkms/rp-broadwell-4.4.180-prod.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-broadwellnk-4.4.180-dev.ko.gz b/files/board/arpl/p3/lkms/rp-broadwellnk-4.4.180-dev.ko.gz index 8e0544af..c90adbb1 100644 Binary files a/files/board/arpl/p3/lkms/rp-broadwellnk-4.4.180-dev.ko.gz and b/files/board/arpl/p3/lkms/rp-broadwellnk-4.4.180-dev.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-broadwellnk-4.4.180-prod.ko.gz b/files/board/arpl/p3/lkms/rp-broadwellnk-4.4.180-prod.ko.gz index 0ab262a4..fa82d33d 100644 Binary files a/files/board/arpl/p3/lkms/rp-broadwellnk-4.4.180-prod.ko.gz and b/files/board/arpl/p3/lkms/rp-broadwellnk-4.4.180-prod.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-bromolow-3.10.108-dev.ko.gz b/files/board/arpl/p3/lkms/rp-bromolow-3.10.108-dev.ko.gz index 08dffb8e..0c9192b7 100644 Binary files a/files/board/arpl/p3/lkms/rp-bromolow-3.10.108-dev.ko.gz and b/files/board/arpl/p3/lkms/rp-bromolow-3.10.108-dev.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-bromolow-3.10.108-prod.ko.gz b/files/board/arpl/p3/lkms/rp-bromolow-3.10.108-prod.ko.gz index 9b613c1a..9713fe83 100644 Binary files a/files/board/arpl/p3/lkms/rp-bromolow-3.10.108-prod.ko.gz and b/files/board/arpl/p3/lkms/rp-bromolow-3.10.108-prod.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-denverton-4.4.180-dev.ko.gz b/files/board/arpl/p3/lkms/rp-denverton-4.4.180-dev.ko.gz index 498b8f37..5d6076a2 100644 Binary files a/files/board/arpl/p3/lkms/rp-denverton-4.4.180-dev.ko.gz and b/files/board/arpl/p3/lkms/rp-denverton-4.4.180-dev.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-denverton-4.4.180-prod.ko.gz b/files/board/arpl/p3/lkms/rp-denverton-4.4.180-prod.ko.gz index 30f08e09..591e7f91 100644 Binary files a/files/board/arpl/p3/lkms/rp-denverton-4.4.180-prod.ko.gz and b/files/board/arpl/p3/lkms/rp-denverton-4.4.180-prod.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-geminilake-4.4.180-dev.ko.gz b/files/board/arpl/p3/lkms/rp-geminilake-4.4.180-dev.ko.gz index ea8f99b7..dd704752 100644 Binary files a/files/board/arpl/p3/lkms/rp-geminilake-4.4.180-dev.ko.gz and b/files/board/arpl/p3/lkms/rp-geminilake-4.4.180-dev.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-geminilake-4.4.180-prod.ko.gz b/files/board/arpl/p3/lkms/rp-geminilake-4.4.180-prod.ko.gz index 133b9329..68bff1b3 100644 Binary files a/files/board/arpl/p3/lkms/rp-geminilake-4.4.180-prod.ko.gz and b/files/board/arpl/p3/lkms/rp-geminilake-4.4.180-prod.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-v1000-4.4.180-dev.ko.gz b/files/board/arpl/p3/lkms/rp-v1000-4.4.180-dev.ko.gz index 1bad3412..82c1b068 100644 Binary files a/files/board/arpl/p3/lkms/rp-v1000-4.4.180-dev.ko.gz and b/files/board/arpl/p3/lkms/rp-v1000-4.4.180-dev.ko.gz differ diff --git a/files/board/arpl/p3/lkms/rp-v1000-4.4.180-prod.ko.gz b/files/board/arpl/p3/lkms/rp-v1000-4.4.180-prod.ko.gz index a2b81bae..28f9f0cb 100644 Binary files a/files/board/arpl/p3/lkms/rp-v1000-4.4.180-prod.ko.gz and b/files/board/arpl/p3/lkms/rp-v1000-4.4.180-prod.ko.gz differ diff --git a/files/board/arpl/p3/modules/apollolake-4.4.180.tgz b/files/board/arpl/p3/modules/apollolake-4.4.180.tgz index 3fbdf2e3..90d27af7 100644 Binary files a/files/board/arpl/p3/modules/apollolake-4.4.180.tgz and b/files/board/arpl/p3/modules/apollolake-4.4.180.tgz differ diff --git a/files/board/arpl/p3/modules/broadwell-4.4.180.tgz b/files/board/arpl/p3/modules/broadwell-4.4.180.tgz index 49112064..63467116 100644 Binary files a/files/board/arpl/p3/modules/broadwell-4.4.180.tgz and b/files/board/arpl/p3/modules/broadwell-4.4.180.tgz differ diff --git a/files/board/arpl/p3/modules/broadwellnk-4.4.180.tgz b/files/board/arpl/p3/modules/broadwellnk-4.4.180.tgz index 2aa0c239..d4f38de1 100644 Binary files a/files/board/arpl/p3/modules/broadwellnk-4.4.180.tgz and b/files/board/arpl/p3/modules/broadwellnk-4.4.180.tgz differ diff --git a/files/board/arpl/p3/modules/bromolow-3.10.108.tgz b/files/board/arpl/p3/modules/bromolow-3.10.108.tgz index 584be6ad..33f93ab3 100644 Binary files a/files/board/arpl/p3/modules/bromolow-3.10.108.tgz and b/files/board/arpl/p3/modules/bromolow-3.10.108.tgz differ diff --git a/files/board/arpl/p3/modules/denverton-4.4.180.tgz b/files/board/arpl/p3/modules/denverton-4.4.180.tgz index e855a15c..3d82ea2a 100644 Binary files a/files/board/arpl/p3/modules/denverton-4.4.180.tgz and b/files/board/arpl/p3/modules/denverton-4.4.180.tgz differ diff --git a/files/board/arpl/p3/modules/geminilake-4.4.180.tgz b/files/board/arpl/p3/modules/geminilake-4.4.180.tgz index a2a59f08..4879ac34 100644 Binary files a/files/board/arpl/p3/modules/geminilake-4.4.180.tgz and b/files/board/arpl/p3/modules/geminilake-4.4.180.tgz differ diff --git a/files/board/arpl/p3/modules/v1000-4.4.180.tgz b/files/board/arpl/p3/modules/v1000-4.4.180.tgz index 8bb5d4eb..96798486 100644 Binary files a/files/board/arpl/p3/modules/v1000-4.4.180.tgz and b/files/board/arpl/p3/modules/v1000-4.4.180.tgz differ diff --git a/kpatch/main.c b/kpatch/main.c index f601ad53..b25d33e5 100644 --- a/kpatch/main.c +++ b/kpatch/main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Fabio Belavenuto + * Copyright (c) 2022 Fabio Belavenuto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,11 +28,8 @@ * - values of ORs are 1/2/4/8 respectively * - [const-ptr] is always the same * - */ -/** - * A quick tool for patching the ramdisk check in the DSM kernel image - * This lets you tinker with the initial ramdisk contents without disabling mount() features and modules loading - * + * Added patch for CMOS_WRITE by Fabio Belavenuto + * */ #include @@ -44,22 +41,25 @@ #include #include #include +#include #include const int DIR_FWD = 1; const int DIR_RWD = -1; /* Variables */ -int fd; -int verbose = 1, read_only = 0; -Elf *elfHandle; -GElf_Ehdr elfExecHeader; -uint64_t orPos[4], fileSize, rodataAddr, rodataOffs, initTextOffs; +int fd, verbose = 1, read_only = 0; +Elf *elfHandle; +GElf_Ehdr elfExecHeader; +uint64_t orPos[4], fileSize, rodataAddr, rodataOffs, initTextOffs; unsigned char *fileData; /*****************************************************************************/ -void errorMsg(char *message) { - fprintf(stderr, "%s\n", message); +void errorMsg(char *fmt, ...) { + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); exit(1); } @@ -125,8 +125,8 @@ void patchBootParams() { uint64_t newPtrOffset, ptrOffset; int n; + printf("Patching boot params.\n"); //The function will reside in init code part. We don't care we may potentially search beyond as we expect it to be found - printf("Found .init.text at %lX\n", initTextOffs); while (initTextOffs < fileSize) { addr = findPUSH_R12_R15_SEQ(initTextOffs); if (addr == -1) @@ -160,8 +160,8 @@ void patchBootParams() { } else if (ptrOffset == newPtrOffset) { ++ec; } - printf("\t[+] Found LOCK-OR#$idx sequence @ %lX => %02X %02X %02X %02X %02X %02X %02X %02X [RIP+%lX]\n", - pos, fileData[pos], fileData[pos+1], fileData[pos+2], fileData[pos+3], fileData[pos+4], + printf("\t[+] Found LOCK-OR#%d sequence @ %lX => %02X %02X %02X %02X %02X %02X %02X %02X [RIP+%lX]\n", + n, pos, fileData[pos], fileData[pos+1], fileData[pos+2], fileData[pos+3], fileData[pos+4], fileData[pos+5], fileData[pos+6], fileData[pos+7], newPtrOffset); } if (ec != 4) { @@ -175,7 +175,7 @@ void patchBootParams() { break; } if (addr == -1) { - errorMsg("\nFailed to find matching sequences"); + errorMsg("\nFailed to find matching sequences\n"); } else { //Patch offsets for (n = 0; n < 4; n++) { @@ -197,11 +197,10 @@ uint32_t changeEndian(uint32_t num) { /*****************************************************************************/ uint64_t findSeq(const char* seq, int len, uint32_t pos, int dir, uint64_t max) { - uint64_t i; + uint64_t i = pos; - i = pos; do { - if (strncmp((const char*)fileData+i, seq, len) == 0) { + if (memcmp((const char*)fileData+i, seq, len) == 0) { return i; } i += dir; @@ -216,9 +215,9 @@ void patchRamdiskCheck() { uint64_t printkPos, testPos, jzPos; const char str[] = "3ramdisk corrupt"; - printf("Patching ramdisk check\n"); + printf("Patching ramdisk check.\n"); for (pos = rodataOffs; pos < fileSize; pos++) { - if (strncmp(str, (const char*)(fileData + pos), 16) == 0) { + if (memcmp(str, (const char*)(fileData + pos), 16) == 0) { pos -= rodataOffs; break; } @@ -227,17 +226,15 @@ void patchRamdiskCheck() { printf("LE arg addr: %08lX\n", errPrintAddr); printkPos = findSeq((const char*)&errPrintAddr, 4, 0, DIR_FWD, -1); if (printkPos == -1) { - errorMsg("printk pos not found!"); + errorMsg("printk pos not found!\n"); } //double check if it's a MOV reg,VAL (where reg is EAX/ECX/EDX/EBX/ESP/EBP/ESI/EDI) printkPos -= 3; - if (strncmp((const char*)fileData+printkPos, "\x48\xc7", 2) != 0) { - printf("Expected MOV=>reg before printk error, got %02X %02X\n", fileData[printkPos], fileData[printkPos+1]); - errorMsg(""); + if (memcmp((const char*)fileData+printkPos, "\x48\xc7", 2) != 0) { + errorMsg("Expected MOV=>reg before printk error, got %02X %02X\n", fileData[printkPos], fileData[printkPos+1]); } if (fileData[printkPos+2] < 0xC0 || fileData[printkPos+2] > 0xC7) { - printf("Expected MOV w/reg operand [C0-C7], got %02X\n", fileData[printkPos+2]); - errorMsg(""); + errorMsg("Expected MOV w/reg operand [C0-C7], got %02X\n", fileData[printkPos+2]); } printf("Found printk MOV @ %08lX\n", printkPos); @@ -256,6 +253,54 @@ void patchRamdiskCheck() { fileData[jzPos] = 0xEB; } +/*****************************************************************************/ +void patchCmosWrite() { + uint64_t pos, errPrintAddr; + uint64_t pr_errPos, testPos, callPos; + const char str[] = "3smpboot: %s: this boot have memory training"; + + printf("Patching call to rtc_cmos_write.\n"); + for (pos = rodataOffs; pos < fileSize; pos++) { + if (memcmp(str, (const char*)(fileData + pos), 16) == 0) { + pos -= rodataOffs; + break; + } + } + errPrintAddr = rodataAddr + pos - 1; + printf("LE arg addr: %08lX\n", errPrintAddr); + pr_errPos = findSeq((const char*)&errPrintAddr, 4, 0, DIR_FWD, -1); + if (pr_errPos == -1) { + printf("pr_err pos not found - ignoring.\n"); // Some kernels do not have the call, exit without error + return; + } + //double check if it's a MOV reg,VAL (where reg is EAX/ECX/EDX/EBX/ESP/EBP/ESI/EDI) + pr_errPos -= 3; + if (memcmp((const char*)fileData+pr_errPos, "\x48\xc7", 2) != 0) { + errorMsg("Expected MOV=>reg before pr_err error, got %02X %02X\n", fileData[pr_errPos], fileData[pr_errPos+1]); + } + if (fileData[pr_errPos+2] < 0xC0 || fileData[pr_errPos+2] > 0xC7) { + errorMsg("Expected MOV w/reg operand [C0-C7], got %02X\n", fileData[pr_errPos+2]); + } + printf("Found pr_err MOV @ %08lX\n", pr_errPos); + + // now we should seek a reasonable amount (say, up to 64 bytes) for a sequence of + // MOV ESI, 0x48 => MOV EDI, 0xFF => MOV EBX, EAX + testPos = findSeq("\xBE\x48\x00\x00\x00\xBF\xFF\x00\x00\x00\x89\xC3", 12, pr_errPos, DIR_RWD, 64); + if (testPos == -1) { + printf("Failed to find MOV ESI, 0x48 => MOV EDI, 0xFF => MOV EBX, EAX\n"); + return; + } + printf("Found MOV ESI, 0x48 => MOV EDI, 0xFF => MOV EBX, EAX @ %08lX\n", testPos); + callPos = testPos + 12; + if (fileData[callPos] != 0xE8) { + errorMsg("Failed to find CALL\n"); + } + printf("OK - patching %02X (CALL) to 0x90.. (NOPs) @ %08lX\n", + fileData[callPos], callPos); + for(uint64_t i = 0; i < 5; i++) + fileData[callPos+i] = 0x90; +} + /*****************************************************************************/ int main(int argc, char *argv[]) { struct stat fileInf; @@ -264,7 +309,7 @@ int main(int argc, char *argv[]) { char *sectionName; if (argc != 3) { - errorMsg("Use: kpatch "); + errorMsg("Use: kpatch \n"); } if (elf_version(EV_CURRENT) == EV_NONE) @@ -281,13 +326,13 @@ int main(int argc, char *argv[]) { switch(elf_kind(elfHandle)) { case ELF_K_NUM: case ELF_K_NONE: - errorMsg("file type unknown"); + errorMsg("file type unknown\n"); break; case ELF_K_COFF: - errorMsg("COFF binaries not supported"); + errorMsg("COFF binaries not supported\n"); break; case ELF_K_AR: - errorMsg("AR archives not supported"); + errorMsg("AR archives not supported\n"); break; case ELF_K_ELF: break; @@ -319,8 +364,12 @@ int main(int argc, char *argv[]) { } close(fd); + printf("Found .init.text offset @ %lX\n", initTextOffs); + printf("Found .rodata address @ %lX\n", rodataAddr); + printf("Found .rodata offset @ %lX\n", rodataOffs); patchBootParams(); patchRamdiskCheck(); + patchCmosWrite(); if ((fd = open(argv[2], O_WRONLY | O_CREAT, 0644)) == -1) { errorNum(); } @@ -328,6 +377,6 @@ int main(int argc, char *argv[]) { errorNum(); } close(fd); - printf("\n"); + printf("Finish!\n"); return 0; }