test-livepatch.sh 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. # Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>
  4. . $(dirname $0)/functions.sh
  5. MOD_LIVEPATCH1=test_klp_livepatch
  6. MOD_LIVEPATCH2=test_klp_syscall
  7. MOD_LIVEPATCH3=test_klp_callbacks_demo
  8. MOD_REPLACE=test_klp_atomic_replace
  9. setup_config
  10. # - load a livepatch that modifies the output from /proc/cmdline and
  11. # verify correct behavior
  12. # - unload the livepatch and make sure the patch was removed
  13. start_test "basic function patching"
  14. load_lp $MOD_LIVEPATCH1
  15. if [[ "$(cat /proc/cmdline)" != "$MOD_LIVEPATCH1: this has been live patched" ]] ; then
  16. echo -e "FAIL\n\n"
  17. die "livepatch kselftest(s) failed"
  18. fi
  19. disable_lp $MOD_LIVEPATCH1
  20. unload_lp $MOD_LIVEPATCH1
  21. if [[ "$(cat /proc/cmdline)" == "$MOD_LIVEPATCH1: this has been live patched" ]] ; then
  22. echo -e "FAIL\n\n"
  23. die "livepatch kselftest(s) failed"
  24. fi
  25. check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
  26. livepatch: enabling patch '$MOD_LIVEPATCH1'
  27. livepatch: '$MOD_LIVEPATCH1': initializing patching transition
  28. livepatch: '$MOD_LIVEPATCH1': starting patching transition
  29. livepatch: '$MOD_LIVEPATCH1': completing patching transition
  30. livepatch: '$MOD_LIVEPATCH1': patching complete
  31. % echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH1/enabled
  32. livepatch: '$MOD_LIVEPATCH1': initializing unpatching transition
  33. livepatch: '$MOD_LIVEPATCH1': starting unpatching transition
  34. livepatch: '$MOD_LIVEPATCH1': completing unpatching transition
  35. livepatch: '$MOD_LIVEPATCH1': unpatching complete
  36. % rmmod $MOD_LIVEPATCH1"
  37. # - load a livepatch that modifies the output from /proc/cmdline and
  38. # verify correct behavior
  39. # - load another livepatch and verify that both livepatches are active
  40. # - unload the second livepatch and verify that the first is still active
  41. # - unload the first livepatch and verify none are active
  42. start_test "multiple livepatches"
  43. load_lp $MOD_LIVEPATCH1
  44. grep 'live patched' /proc/cmdline > /dev/kmsg
  45. grep 'live patched' /proc/meminfo > /dev/kmsg
  46. load_lp $MOD_REPLACE replace=0
  47. grep 'live patched' /proc/cmdline > /dev/kmsg
  48. grep 'live patched' /proc/meminfo > /dev/kmsg
  49. disable_lp $MOD_REPLACE
  50. unload_lp $MOD_REPLACE
  51. grep 'live patched' /proc/cmdline > /dev/kmsg
  52. grep 'live patched' /proc/meminfo > /dev/kmsg
  53. disable_lp $MOD_LIVEPATCH1
  54. unload_lp $MOD_LIVEPATCH1
  55. grep 'live patched' /proc/cmdline > /dev/kmsg
  56. grep 'live patched' /proc/meminfo > /dev/kmsg
  57. check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
  58. livepatch: enabling patch '$MOD_LIVEPATCH1'
  59. livepatch: '$MOD_LIVEPATCH1': initializing patching transition
  60. livepatch: '$MOD_LIVEPATCH1': starting patching transition
  61. livepatch: '$MOD_LIVEPATCH1': completing patching transition
  62. livepatch: '$MOD_LIVEPATCH1': patching complete
  63. $MOD_LIVEPATCH1: this has been live patched
  64. % insmod test_modules/$MOD_REPLACE.ko replace=0
  65. livepatch: enabling patch '$MOD_REPLACE'
  66. livepatch: '$MOD_REPLACE': initializing patching transition
  67. livepatch: '$MOD_REPLACE': starting patching transition
  68. livepatch: '$MOD_REPLACE': completing patching transition
  69. livepatch: '$MOD_REPLACE': patching complete
  70. $MOD_LIVEPATCH1: this has been live patched
  71. $MOD_REPLACE: this has been live patched
  72. % echo 0 > $SYSFS_KLP_DIR/$MOD_REPLACE/enabled
  73. livepatch: '$MOD_REPLACE': initializing unpatching transition
  74. livepatch: '$MOD_REPLACE': starting unpatching transition
  75. livepatch: '$MOD_REPLACE': completing unpatching transition
  76. livepatch: '$MOD_REPLACE': unpatching complete
  77. % rmmod $MOD_REPLACE
  78. $MOD_LIVEPATCH1: this has been live patched
  79. % echo 0 > $SYSFS_KLP_DIR/$MOD_LIVEPATCH1/enabled
  80. livepatch: '$MOD_LIVEPATCH1': initializing unpatching transition
  81. livepatch: '$MOD_LIVEPATCH1': starting unpatching transition
  82. livepatch: '$MOD_LIVEPATCH1': completing unpatching transition
  83. livepatch: '$MOD_LIVEPATCH1': unpatching complete
  84. % rmmod $MOD_LIVEPATCH1"
  85. # - load a livepatch that modifies the output from /proc/cmdline and
  86. # verify correct behavior
  87. # - load two additional livepatches and check the number of livepatch modules
  88. # applied
  89. # - load an atomic replace livepatch and check that the other three modules were
  90. # disabled
  91. # - remove all livepatches besides the atomic replace one and verify that the
  92. # atomic replace livepatch is still active
  93. # - remove the atomic replace livepatch and verify that none are active
  94. start_test "atomic replace livepatch"
  95. load_lp $MOD_LIVEPATCH1
  96. grep 'live patched' /proc/cmdline > /dev/kmsg
  97. grep 'live patched' /proc/meminfo > /dev/kmsg
  98. for mod in $MOD_LIVEPATCH2 $MOD_LIVEPATCH3; do
  99. load_lp "$mod"
  100. done
  101. mods=($SYSFS_KLP_DIR/*)
  102. nmods=${#mods[@]}
  103. if [ "$nmods" -ne 3 ]; then
  104. die "Expecting three modules listed, found $nmods"
  105. fi
  106. load_lp $MOD_REPLACE replace=1
  107. grep 'live patched' /proc/cmdline > /dev/kmsg
  108. grep 'live patched' /proc/meminfo > /dev/kmsg
  109. loop_until 'mods=($SYSFS_KLP_DIR/*); nmods=${#mods[@]}; [[ "$nmods" -eq 1 ]]' ||
  110. die "Expecting only one moduled listed, found $nmods"
  111. # These modules were disabled by the atomic replace
  112. for mod in $MOD_LIVEPATCH3 $MOD_LIVEPATCH2 $MOD_LIVEPATCH1; do
  113. unload_lp "$mod"
  114. done
  115. grep 'live patched' /proc/cmdline > /dev/kmsg
  116. grep 'live patched' /proc/meminfo > /dev/kmsg
  117. disable_lp $MOD_REPLACE
  118. unload_lp $MOD_REPLACE
  119. grep 'live patched' /proc/cmdline > /dev/kmsg
  120. grep 'live patched' /proc/meminfo > /dev/kmsg
  121. check_result "% insmod test_modules/$MOD_LIVEPATCH1.ko
  122. livepatch: enabling patch '$MOD_LIVEPATCH1'
  123. livepatch: '$MOD_LIVEPATCH1': initializing patching transition
  124. livepatch: '$MOD_LIVEPATCH1': starting patching transition
  125. livepatch: '$MOD_LIVEPATCH1': completing patching transition
  126. livepatch: '$MOD_LIVEPATCH1': patching complete
  127. $MOD_LIVEPATCH1: this has been live patched
  128. % insmod test_modules/$MOD_LIVEPATCH2.ko
  129. livepatch: enabling patch '$MOD_LIVEPATCH2'
  130. livepatch: '$MOD_LIVEPATCH2': initializing patching transition
  131. livepatch: '$MOD_LIVEPATCH2': starting patching transition
  132. livepatch: '$MOD_LIVEPATCH2': completing patching transition
  133. livepatch: '$MOD_LIVEPATCH2': patching complete
  134. % insmod test_modules/$MOD_LIVEPATCH3.ko
  135. livepatch: enabling patch '$MOD_LIVEPATCH3'
  136. livepatch: '$MOD_LIVEPATCH3': initializing patching transition
  137. $MOD_LIVEPATCH3: pre_patch_callback: vmlinux
  138. livepatch: '$MOD_LIVEPATCH3': starting patching transition
  139. livepatch: '$MOD_LIVEPATCH3': completing patching transition
  140. $MOD_LIVEPATCH3: post_patch_callback: vmlinux
  141. livepatch: '$MOD_LIVEPATCH3': patching complete
  142. % insmod test_modules/$MOD_REPLACE.ko replace=1
  143. livepatch: enabling patch '$MOD_REPLACE'
  144. livepatch: '$MOD_REPLACE': initializing patching transition
  145. livepatch: '$MOD_REPLACE': starting patching transition
  146. livepatch: '$MOD_REPLACE': completing patching transition
  147. livepatch: '$MOD_REPLACE': patching complete
  148. $MOD_REPLACE: this has been live patched
  149. % rmmod $MOD_LIVEPATCH3
  150. % rmmod $MOD_LIVEPATCH2
  151. % rmmod $MOD_LIVEPATCH1
  152. $MOD_REPLACE: this has been live patched
  153. % echo 0 > $SYSFS_KLP_DIR/$MOD_REPLACE/enabled
  154. livepatch: '$MOD_REPLACE': initializing unpatching transition
  155. livepatch: '$MOD_REPLACE': starting unpatching transition
  156. livepatch: '$MOD_REPLACE': completing unpatching transition
  157. livepatch: '$MOD_REPLACE': unpatching complete
  158. % rmmod $MOD_REPLACE"
  159. exit 0