@@ -37,6 +37,8 @@ with_clang() {
37
37
38
38
set_trace_on
39
39
40
+ DEFAULT_VSOCK_CID=" 3"
41
+
40
42
# The behaviour can be changed with 'input' env var
41
43
: " ${INPUT_CCACHE_MAXSIZE:= 5G} "
42
44
: " ${INPUT_CCACHE_DIR:= " " } "
@@ -57,12 +59,13 @@ set_trace_on
57
59
: " ${INPUT_GCOV:= " " } "
58
60
: " ${INPUT_NET_BRIDGES:= " " } "
59
61
: " ${INPUT_MAC_ADDRESS_PREFIX:= " " } "
60
- : " ${INPUT_VSOCK_CID:= " 3 " } "
62
+ : " ${INPUT_VSOCK_CID:= " ${DEFAULT_VSOCK_CID} " } "
61
63
: " ${INPUT_CI_RESULTS_DIR:= " " } "
62
64
: " ${INPUT_CI_PRINT_EXIT_CODE:= 1} "
63
65
: " ${INPUT_CI_TIMEOUT_SEC:= 5400} "
64
66
: " ${INPUT_EXPECT_TIMEOUT:= " -1" } "
65
67
: " ${INPUT_BUILD_SKIP_PERF:= 1} "
68
+ : " ${INPUT_FULL_DUMP:= 0} "
66
69
67
70
if [ -z " ${INPUT_MODE} " ]; then
68
71
INPUT_MODE=" ${1} "
@@ -95,12 +98,14 @@ BASH_PROFILE="/root/.bash_profile"
95
98
VIRTME_WORKDIR=" ${KERNEL_SRC} /.virtme"
96
99
VIRTME_SCRIPTS_DIR=" ${VIRTME_WORKDIR} /scripts"
97
100
VIRTME_HEADERS_DIR=" ${VIRTME_WORKDIR} /headers"
101
+ VIRTME_CURRENT_BUILD_DIR=" ${INPUT_CURRENT_BUILD:- " ${VIRTME_WORKDIR} /current_build" } "
98
102
99
103
VIRTME_SCRIPT=" ${VIRTME_SCRIPTS_DIR} /tests.sh"
100
104
VIRTME_SCRIPT_END=" __VIRTME_END__"
101
105
VIRTME_SCRIPT_UNEXPECTED_STOP=" Unexpected stop of the VM"
102
106
VIRTME_SCRIPT_TIMEOUT=" ${VIRTME_SCRIPTS_DIR} /tests.timeout"
103
107
VIRTME_SCRIPT_TIMEOUT_END=" __VIRTME_TIMEOUT_END__"
108
+ VIRTME_SCRIPT_TIMEOUT_GDB=" ${VIRTME_SCRIPTS_DIR} /gdb.timeout"
104
109
VIRTME_RUN_SCRIPT=" ${VIRTME_SCRIPTS_DIR} /virtme.sh"
105
110
VIRTME_RUN_EXPECT=" ${VIRTME_SCRIPTS_DIR} /virtme.expect"
106
111
@@ -122,9 +127,13 @@ VIRTME_RUN_OPTS=(
122
127
--server --port " ${INPUT_VSOCK_CID} " # To connect to the VM using VSock
123
128
--show-command
124
129
--verbose --show-boot-console
130
+ --kopt nokaslr # needed for gdb
125
131
--kopt mitigations=off
126
132
)
127
- VIRTME_RUN_QEMU_OPTS=()
133
+ VIRTME_RUN_QEMU_OPTS=(
134
+ -gdb tcp::$(( 1234 + INPUT_VSOCK_CID - DEFAULT_VSOCK_CID))
135
+ -qmp " tcp::$(( 3636 + INPUT_VSOCK_CID - DEFAULT_VSOCK_CID)) ,server,nowait"
136
+ )
128
137
129
138
# results dir
130
139
RESULTS_DIR_BASE=" ${VIRTME_WORKDIR} /results"
@@ -325,11 +334,18 @@ setup_env() { local mode
325
334
# Avoid a long advice
326
335
git config --global advice.detachedHead false
327
336
337
+ mkdir -p " /root/.config/gdb"
338
+ echo " add-auto-load-safe-path ${KERNEL_SRC} /scripts/gdb/vmlinux-gdb.py" \
339
+ > " /root/.config/gdb/gdbinit"
340
+
328
341
VIRTME_BUILD_DIR=" ${VIRTME_WORKDIR} /build"
329
342
with_clang && VIRTME_BUILD_DIR+=" -clang"
330
343
is_mode_debug " ${mode} " && VIRTME_BUILD_DIR+=" -debug"
331
344
is_mode_btf " ${mode} " && VIRTME_BUILD_DIR+=" -btf"
332
345
[ -n " ${INPUT_BUILD_SUFFIX} " ] && VIRTME_BUILD_DIR+=" -${INPUT_BUILD_SUFFIX} "
346
+ rm -rf " ${VIRTME_CURRENT_BUILD_DIR} "
347
+ ln -s " ${VIRTME_BUILD_DIR} " " ${VIRTME_CURRENT_BUILD_DIR} "
348
+
333
349
VIRTME_PERF_DIR=" ${VIRTME_BUILD_DIR} /tools/perf"
334
350
VIRTME_TOOLS_SBIN_DIR=" ${VIRTME_BUILD_DIR} /tools/sbin"
335
351
VIRTME_CACHE_DIR=" ${VIRTME_BUILD_DIR} /.cache"
@@ -402,6 +418,10 @@ setup_env() { local mode
402
418
--memory " ${INPUT_RAM} "
403
419
)
404
420
421
+ if [ " ${INPUT_FULL_DUMP} " = 1 ]; then
422
+ VIRTME_RUN_OPTS+=(--disable-microvm)
423
+ VIRTME_RUN_QEMU_OPTS+=(-device vmcoreinfo)
424
+ fi
405
425
406
426
OUTPUT_VIRTME=" ${RESULTS_DIR} /output.log"
407
427
TESTS_SUMMARY=" ${RESULTS_DIR} /summary.txt"
@@ -724,6 +744,24 @@ build_perf() { local rc=0
724
744
return ${rc}
725
745
}
726
746
747
+ build_gdb_index () { local rc=0
748
+ if readelf -S vmlinux 2> /dev/null | grep -q " .gdb_index" ; then
749
+ printinfo " Skip GDB Index build: already there"
750
+ return 0
751
+ fi
752
+
753
+ log_section_start " Build GDB Index"
754
+
755
+ ln -sf " ${VIRTME_CURRENT_BUILD_DIR} /vmlinux" .
756
+ ln -sf " ${VIRTME_CURRENT_BUILD_DIR} /scripts/gdb/linux/constants.py" scripts/gdb/linux/
757
+
758
+ GDB=gdb-multiarch gdb-add-index vmlinux || rc=${?}
759
+
760
+ log_section_end
761
+
762
+ return ${rc}
763
+ }
764
+
727
765
build () {
728
766
if [ " ${INPUT_BUILD_SKIP} " = 1 ]; then
729
767
printinfo " Skip kernel build"
@@ -735,6 +773,7 @@ build() {
735
773
if with_clang; then
736
774
build_compile_commands || true # nice to have
737
775
fi
776
+ build_gdb_index
738
777
install_kernel_headers
739
778
build_perf
740
779
ccache_stat
@@ -1372,6 +1411,18 @@ echo "${VIRTME_SCRIPT_TIMEOUT_END}"
1372
1411
EOF
1373
1412
chmod +x " ${VIRTME_SCRIPT_TIMEOUT} "
1374
1413
1414
+ cat << EOF > "${VIRTME_SCRIPT_TIMEOUT_GDB} "
1415
+ set output-radix 16
1416
+ target remote localhost:1234
1417
+ l
1418
+ bt full
1419
+ info frame
1420
+ info registers
1421
+ thread apply all bt full
1422
+ detach
1423
+ exit
1424
+ EOF
1425
+
1375
1426
cat << EOF > "${VIRTME_RUN_SCRIPT} "
1376
1427
#! /bin/bash
1377
1428
echo -e "$( log_section_start " Boot VM" ) "
@@ -1465,8 +1516,27 @@ expect {
1465
1516
} timeout {
1466
1517
send_user "Timeout: Getting more info: timeout\n"
1467
1518
send -i \$ serialID "\x03\r"
1519
+ } eof {
1520
+ send_user "Timeout: Getting more info: unexpected end\n"
1468
1521
}
1469
1522
}
1523
+
1524
+ send_user "Timeout: Getting more info via GDB\n"
1525
+ spawn gdb-multiarch --batch -x "${VIRTME_SCRIPT_TIMEOUT_GDB} " vmlinux
1526
+ set gdbID \$ spawn_id
1527
+ expect {
1528
+ "detached" {
1529
+ send_user "Timeout: Getting more info via GDB: end\n"
1530
+ } timeout {
1531
+ send_user "Timeout: Getting more info via GDB: timeout\n"
1532
+ send "\x03\r"
1533
+ } eof {
1534
+ send_user "Timeout: Getting more info via GDB: unexpected end\n"
1535
+ }
1536
+ }
1537
+ close
1538
+
1539
+ set spawn_id \$ consoleID
1470
1540
send_user "Timeout: sending Ctrl+C\n"
1471
1541
send "\x03\r"
1472
1542
sleep 2
@@ -2069,6 +2139,12 @@ case "${INPUT_MODE}" in
2069
2139
" connect" )
2070
2140
exec " ${VIRTME_RUN} " --mods none --client --port " ${INPUT_VSOCK_CID} " ${1: +--remote-cmd " ${* } " }
2071
2141
;;
2142
+ " gdb" )
2143
+ exec " ${VIRTME_RUN} " --mods none --gdb --kdir " ${VIRTME_CURRENT_BUILD_DIR} "
2144
+ ;;
2145
+ " dump" )
2146
+ exec vng --dump " ${1?} "
2147
+ ;;
2072
2148
" lcov2html" )
2073
2149
setup_env " ${@:- normal} "
2074
2150
while [ -n " ${1} " ] && [ ! -s " ${1} " ]; do
0 commit comments