Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 36 additions & 11 deletions Runner/suites/Kernel/Baseport/Interrupts/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ log_info "=== Test Initialization ==="

# Function to get the timer count
get_timer_count() {
grep arch_timer /proc/interrupts
get_interrupt_line_by_name "arch_timer"
}

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

cpu=$(printf '%s\n' "$line" | awk '{print $1}')
initial_values=$(printf '%s\n' "$line" | awk '{for(i=2;i<=9;i++) print $i}')
final_values=$(printf '%s\n' "$final_count" | awk -v cpu="$cpu" '$1 == cpu {for(i=2;i<=9;i++) print $i}')
irq_id=$(printf '%s\n' "$line" | awk '{print $1}')
final_line=$(printf '%s\n' "$final_count" | awk -v irq="$irq_id" '$1 == irq { print; exit }')

if [ -z "$final_line" ]; then
log_fail "Could not find matching final timer line for IRQ $irq_id"
log_fail "$TESTNAME : Test Failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi

initial_values=$(extract_interrupt_cpu_counts "$line")
final_values=$(extract_interrupt_cpu_counts "$final_line")

initial_cpu_count=$(count_interrupt_cpu_counts "$initial_values")
final_cpu_count=$(count_interrupt_cpu_counts "$final_values")

log_info "Detected timer counters: initial=${initial_cpu_count} final=${final_cpu_count}"

if [ "$initial_cpu_count" -eq 0 ] || [ "$final_cpu_count" -eq 0 ]; then
log_fail "No per-CPU timer counters could be parsed from /proc/interrupts"
log_fail "$TESTNAME : Test Failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi

if [ "$initial_cpu_count" -ne "$final_cpu_count" ]; then
log_fail "Mismatch in parsed CPU timer counters: initial=${initial_cpu_count} final=${final_cpu_count}"
log_fail "$TESTNAME : Test Failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi

fail_test=false
i=0

while IFS= read -r initial_value; do
[ -n "$initial_value" ] || continue

while [ "$i" -lt "$initial_cpu_count" ]; do
initial_value=$(printf '%s\n' "$initial_values" | sed -n "$((i + 1))p")
final_value=$(printf '%s\n' "$final_values" | sed -n "$((i + 1))p")

if [ "$initial_value" -lt "$final_value" ]; then
echo "CPU $i: Timer count has incremented. Test PASSED"
log_pass "CPU $i: Timer count has incremented. Test PASSED"
Expand All @@ -81,11 +109,8 @@ while IFS= read -r line; do
fail_test=true
fi
i=$((i + 1))
done <<EOF
$initial_values
EOF
done

echo "$fail_test"
if [ "$fail_test" = false ]; then
log_pass "$TESTNAME : Test Passed"
echo "$TESTNAME PASS" > "$res_file"
Expand Down
46 changes: 36 additions & 10 deletions Runner/suites/Kernel/Baseport/irq/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ log_info "=== Test Initialization ==="

# Function to get the timer count
get_timer_count() {
grep arch_timer /proc/interrupts
get_interrupt_line_by_name "arch_timer"
}

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

cpu=$(printf '%s\n' "$line" | awk '{print $1}')
initial_values=$(printf '%s\n' "$line" | awk '{for(i=2;i<=9;i++) print $i}')
final_values=$(printf '%s\n' "$final_count" | awk -v cpu="$cpu" '$1 == cpu {for(i=2;i<=9;i++) print $i}')
irq_id=$(printf '%s\n' "$line" | awk '{print $1}')
final_line=$(printf '%s\n' "$final_count" | awk -v irq="$irq_id" '$1 == irq { print; exit }')

if [ -z "$final_line" ]; then
log_fail "Could not find matching final timer line for IRQ $irq_id"
log_fail "$TESTNAME : Test Failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi

initial_values=$(extract_interrupt_cpu_counts "$line")
final_values=$(extract_interrupt_cpu_counts "$final_line")

initial_cpu_count=$(count_interrupt_cpu_counts "$initial_values")
final_cpu_count=$(count_interrupt_cpu_counts "$final_values")

log_info "Detected timer counters: initial=${initial_cpu_count} final=${final_cpu_count}"

if [ "$initial_cpu_count" -eq 0 ] || [ "$final_cpu_count" -eq 0 ]; then
log_fail "No per-CPU timer counters could be parsed from /proc/interrupts"
log_fail "$TESTNAME : Test Failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi

if [ "$initial_cpu_count" -ne "$final_cpu_count" ]; then
log_fail "Mismatch in parsed CPU timer counters: initial=${initial_cpu_count} final=${final_cpu_count}"
log_fail "$TESTNAME : Test Failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi

fail_test=false
i=0

while IFS= read -r initial_value; do
[ -n "$initial_value" ] || continue

while [ "$i" -lt "$initial_cpu_count" ]; do
initial_value=$(printf '%s\n' "$initial_values" | sed -n "$((i + 1))p")
final_value=$(printf '%s\n' "$final_values" | sed -n "$((i + 1))p")

if [ "$initial_value" -lt "$final_value" ]; then
log_pass "CPU $i: Timer count has incremented. Test PASSED"
else
log_fail "CPU $i: Timer count has not incremented. Test FAILED"
fail_test=true
fi
i=$((i + 1))
done <<EOF
$initial_values
EOF
done

if [ "$fail_test" = false ]; then
log_pass "$TESTNAME : Test Passed"
Expand Down
37 changes: 37 additions & 0 deletions Runner/utils/functestlib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4687,3 +4687,40 @@ file_size_bytes() {
printf '%s\n' "$size"
return 0
}

# Return the first /proc/interrupts line matching the given pattern.
# Prints the full line and returns 0 on success, 1 if no match is found.
get_interrupt_line_by_name() {
pattern="$1"
[ -n "$pattern" ] || return 1
grep "$pattern" /proc/interrupts 2>/dev/null | head -n 1
}

# Extract only numeric per-CPU interrupt counters from a /proc/interrupts line.
# Prints one counter per line, stopping at the first non-numeric token after the IRQ field.
extract_interrupt_cpu_counts() {
printf '%s\n' "$1" | awk '
{
seen_irq = 0
for (i = 1; i <= NF; i++) {
if (seen_irq == 0) {
if ($i ~ /:$/) {
seen_irq = 1
}
continue
}
if ($i ~ /^[0-9]+$/) {
print $i
} else {
break
}
}
}
'
}

# Count extracted per-CPU interrupt counters.
# Prints the count as a decimal integer.
count_interrupt_cpu_counts() {
printf '%s\n' "$1" | awk 'NF { c++ } END { print c + 0 }'
}
Loading