Skip to content

Commit 77b06ae

Browse files
authored
Merge pull request #375 from smuppand/kernel
kernel: make irq and Interrupts timer parsing CPU-count agnostic
2 parents 5036042 + ace040e commit 77b06ae

3 files changed

Lines changed: 109 additions & 21 deletions

File tree

Runner/suites/Kernel/Baseport/Interrupts/run.sh

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ log_info "=== Test Initialization ==="
4040

4141
# Function to get the timer count
4242
get_timer_count() {
43-
grep arch_timer /proc/interrupts
43+
get_interrupt_line_by_name "arch_timer"
4444
}
4545

4646
# Get the initial timer count
@@ -61,17 +61,45 @@ echo "Comparing timer counts:"
6161
while IFS= read -r line; do
6262
[ -n "$line" ] || continue
6363

64-
cpu=$(printf '%s\n' "$line" | awk '{print $1}')
65-
initial_values=$(printf '%s\n' "$line" | awk '{for(i=2;i<=9;i++) print $i}')
66-
final_values=$(printf '%s\n' "$final_count" | awk -v cpu="$cpu" '$1 == cpu {for(i=2;i<=9;i++) print $i}')
64+
irq_id=$(printf '%s\n' "$line" | awk '{print $1}')
65+
final_line=$(printf '%s\n' "$final_count" | awk -v irq="$irq_id" '$1 == irq { print; exit }')
66+
67+
if [ -z "$final_line" ]; then
68+
log_fail "Could not find matching final timer line for IRQ $irq_id"
69+
log_fail "$TESTNAME : Test Failed"
70+
echo "$TESTNAME FAIL" > "$res_file"
71+
exit 1
72+
fi
73+
74+
initial_values=$(extract_interrupt_cpu_counts "$line")
75+
final_values=$(extract_interrupt_cpu_counts "$final_line")
76+
77+
initial_cpu_count=$(count_interrupt_cpu_counts "$initial_values")
78+
final_cpu_count=$(count_interrupt_cpu_counts "$final_values")
79+
80+
log_info "Detected timer counters: initial=${initial_cpu_count} final=${final_cpu_count}"
81+
82+
if [ "$initial_cpu_count" -eq 0 ] || [ "$final_cpu_count" -eq 0 ]; then
83+
log_fail "No per-CPU timer counters could be parsed from /proc/interrupts"
84+
log_fail "$TESTNAME : Test Failed"
85+
echo "$TESTNAME FAIL" > "$res_file"
86+
exit 1
87+
fi
88+
89+
if [ "$initial_cpu_count" -ne "$final_cpu_count" ]; then
90+
log_fail "Mismatch in parsed CPU timer counters: initial=${initial_cpu_count} final=${final_cpu_count}"
91+
log_fail "$TESTNAME : Test Failed"
92+
echo "$TESTNAME FAIL" > "$res_file"
93+
exit 1
94+
fi
6795

6896
fail_test=false
6997
i=0
7098

71-
while IFS= read -r initial_value; do
72-
[ -n "$initial_value" ] || continue
73-
99+
while [ "$i" -lt "$initial_cpu_count" ]; do
100+
initial_value=$(printf '%s\n' "$initial_values" | sed -n "$((i + 1))p")
74101
final_value=$(printf '%s\n' "$final_values" | sed -n "$((i + 1))p")
102+
75103
if [ "$initial_value" -lt "$final_value" ]; then
76104
echo "CPU $i: Timer count has incremented. Test PASSED"
77105
log_pass "CPU $i: Timer count has incremented. Test PASSED"
@@ -81,11 +109,8 @@ while IFS= read -r line; do
81109
fail_test=true
82110
fi
83111
i=$((i + 1))
84-
done <<EOF
85-
$initial_values
86-
EOF
112+
done
87113

88-
echo "$fail_test"
89114
if [ "$fail_test" = false ]; then
90115
log_pass "$TESTNAME : Test Passed"
91116
echo "$TESTNAME PASS" > "$res_file"

Runner/suites/Kernel/Baseport/irq/run.sh

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ log_info "=== Test Initialization ==="
4040

4141
# Function to get the timer count
4242
get_timer_count() {
43-
grep arch_timer /proc/interrupts
43+
get_interrupt_line_by_name "arch_timer"
4444
}
4545

4646
# Get the initial timer count
@@ -61,27 +61,53 @@ log_info "Comparing timer counts:"
6161
while IFS= read -r line; do
6262
[ -n "$line" ] || continue
6363

64-
cpu=$(printf '%s\n' "$line" | awk '{print $1}')
65-
initial_values=$(printf '%s\n' "$line" | awk '{for(i=2;i<=9;i++) print $i}')
66-
final_values=$(printf '%s\n' "$final_count" | awk -v cpu="$cpu" '$1 == cpu {for(i=2;i<=9;i++) print $i}')
64+
irq_id=$(printf '%s\n' "$line" | awk '{print $1}')
65+
final_line=$(printf '%s\n' "$final_count" | awk -v irq="$irq_id" '$1 == irq { print; exit }')
66+
67+
if [ -z "$final_line" ]; then
68+
log_fail "Could not find matching final timer line for IRQ $irq_id"
69+
log_fail "$TESTNAME : Test Failed"
70+
echo "$TESTNAME FAIL" > "$res_file"
71+
exit 1
72+
fi
73+
74+
initial_values=$(extract_interrupt_cpu_counts "$line")
75+
final_values=$(extract_interrupt_cpu_counts "$final_line")
76+
77+
initial_cpu_count=$(count_interrupt_cpu_counts "$initial_values")
78+
final_cpu_count=$(count_interrupt_cpu_counts "$final_values")
79+
80+
log_info "Detected timer counters: initial=${initial_cpu_count} final=${final_cpu_count}"
81+
82+
if [ "$initial_cpu_count" -eq 0 ] || [ "$final_cpu_count" -eq 0 ]; then
83+
log_fail "No per-CPU timer counters could be parsed from /proc/interrupts"
84+
log_fail "$TESTNAME : Test Failed"
85+
echo "$TESTNAME FAIL" > "$res_file"
86+
exit 1
87+
fi
88+
89+
if [ "$initial_cpu_count" -ne "$final_cpu_count" ]; then
90+
log_fail "Mismatch in parsed CPU timer counters: initial=${initial_cpu_count} final=${final_cpu_count}"
91+
log_fail "$TESTNAME : Test Failed"
92+
echo "$TESTNAME FAIL" > "$res_file"
93+
exit 1
94+
fi
6795

6896
fail_test=false
6997
i=0
7098

71-
while IFS= read -r initial_value; do
72-
[ -n "$initial_value" ] || continue
73-
99+
while [ "$i" -lt "$initial_cpu_count" ]; do
100+
initial_value=$(printf '%s\n' "$initial_values" | sed -n "$((i + 1))p")
74101
final_value=$(printf '%s\n' "$final_values" | sed -n "$((i + 1))p")
102+
75103
if [ "$initial_value" -lt "$final_value" ]; then
76104
log_pass "CPU $i: Timer count has incremented. Test PASSED"
77105
else
78106
log_fail "CPU $i: Timer count has not incremented. Test FAILED"
79107
fail_test=true
80108
fi
81109
i=$((i + 1))
82-
done <<EOF
83-
$initial_values
84-
EOF
110+
done
85111

86112
if [ "$fail_test" = false ]; then
87113
log_pass "$TESTNAME : Test Passed"

Runner/utils/functestlib.sh

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4687,3 +4687,40 @@ file_size_bytes() {
46874687
printf '%s\n' "$size"
46884688
return 0
46894689
}
4690+
4691+
# Return the first /proc/interrupts line matching the given pattern.
4692+
# Prints the full line and returns 0 on success, 1 if no match is found.
4693+
get_interrupt_line_by_name() {
4694+
pattern="$1"
4695+
[ -n "$pattern" ] || return 1
4696+
grep "$pattern" /proc/interrupts 2>/dev/null | head -n 1
4697+
}
4698+
4699+
# Extract only numeric per-CPU interrupt counters from a /proc/interrupts line.
4700+
# Prints one counter per line, stopping at the first non-numeric token after the IRQ field.
4701+
extract_interrupt_cpu_counts() {
4702+
printf '%s\n' "$1" | awk '
4703+
{
4704+
seen_irq = 0
4705+
for (i = 1; i <= NF; i++) {
4706+
if (seen_irq == 0) {
4707+
if ($i ~ /:$/) {
4708+
seen_irq = 1
4709+
}
4710+
continue
4711+
}
4712+
if ($i ~ /^[0-9]+$/) {
4713+
print $i
4714+
} else {
4715+
break
4716+
}
4717+
}
4718+
}
4719+
'
4720+
}
4721+
4722+
# Count extracted per-CPU interrupt counters.
4723+
# Prints the count as a decimal integer.
4724+
count_interrupt_cpu_counts() {
4725+
printf '%s\n' "$1" | awk 'NF { c++ } END { print c + 0 }'
4726+
}

0 commit comments

Comments
 (0)