8d37a1425b
In commitedac4d8a16
back in 2015 when we added support for the virtual timer offset CNTVOFF_EL2, we didn't correctly update the timer-recalculation code that figures out when the timer interrupt is next going to change state. We got it wrong in two ways: * for the 0->1 transition, we didn't notice that gt->cval + offset can overflow a uint64_t * for the 1->0 transition, we didn't notice that the transition might now happen before the count rolls over, if offset > count In the former case, we end up trying to set the next interrupt for a time in the past, which results in QEMU hanging as the timer fires continuously. In the latter case, we would fail to update the interrupt status when we are supposed to. Fix the calculations in both cases. The test case is Alex Bennée's from the bug report, and tests the 0->1 transition overflow case. Fixes:edac4d8a16
("target-arm: Add CNTVOFF_EL2") Cc: qemu-stable@nongnu.org Resolves: https://gitlab.com/qemu-project/qemu/-/issues/60 Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20231120173506.3729884-1-peter.maydell@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
91 lines
2.9 KiB
Makefile
91 lines
2.9 KiB
Makefile
#
|
|
# Aarch64 system tests
|
|
#
|
|
|
|
AARCH64_SYSTEM_SRC=$(SRC_PATH)/tests/tcg/aarch64/system
|
|
VPATH+=$(AARCH64_SYSTEM_SRC)
|
|
|
|
# These objects provide the basic boot code and helper functions for all tests
|
|
CRT_OBJS=boot.o
|
|
|
|
AARCH64_TEST_SRCS=$(wildcard $(AARCH64_SYSTEM_SRC)/*.c)
|
|
AARCH64_TESTS = $(patsubst $(AARCH64_SYSTEM_SRC)/%.c, %, $(AARCH64_TEST_SRCS))
|
|
|
|
CRT_PATH=$(AARCH64_SYSTEM_SRC)
|
|
LINK_SCRIPT=$(AARCH64_SYSTEM_SRC)/kernel.ld
|
|
LDFLAGS=-Wl,-T$(LINK_SCRIPT)
|
|
TESTS+=$(AARCH64_TESTS) $(MULTIARCH_TESTS)
|
|
EXTRA_RUNS+=$(MULTIARCH_RUNS)
|
|
CFLAGS+=-nostdlib -ggdb -O0 $(MINILIB_INC)
|
|
LDFLAGS+=-static -nostdlib $(CRT_OBJS) $(MINILIB_OBJS) -lgcc
|
|
|
|
config-cc.mak: Makefile
|
|
$(quiet-@)( \
|
|
$(call cc-option,-march=armv8.3-a, CROSS_CC_HAS_ARMV8_3)) 3> config-cc.mak
|
|
-include config-cc.mak
|
|
|
|
# building head blobs
|
|
.PRECIOUS: $(CRT_OBJS)
|
|
|
|
%.o: $(CRT_PATH)/%.S
|
|
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -x assembler-with-cpp -c $< -o $@
|
|
|
|
# Build and link the tests
|
|
%: %.c $(LINK_SCRIPT) $(CRT_OBJS) $(MINILIB_OBJS)
|
|
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(LDFLAGS)
|
|
|
|
memory: CFLAGS+=-DCHECK_UNALIGNED=1
|
|
|
|
memory-sve: memory.c $(LINK_SCRIPT) $(CRT_OBJS) $(MINILIB_OBJS)
|
|
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(LDFLAGS)
|
|
|
|
memory-sve: CFLAGS+=-DCHECK_UNALIGNED=1 -march=armv8.1-a+sve -O3 -fno-tree-loop-distribute-patterns
|
|
|
|
TESTS+=memory-sve
|
|
|
|
# Running
|
|
QEMU_BASE_MACHINE=-M virt -cpu max -display none
|
|
QEMU_BASE_ARGS=-semihosting-config enable=on,target=native,chardev=output
|
|
QEMU_OPTS+=$(QEMU_BASE_MACHINE) $(QEMU_BASE_ARGS) -kernel
|
|
|
|
# console test is manual only
|
|
QEMU_SEMIHOST=-serial none -chardev stdio,mux=on,id=stdio0 -semihosting-config enable=on,chardev=stdio0 -mon chardev=stdio0,mode=readline
|
|
run-semiconsole: QEMU_OPTS=$(QEMU_BASE_MACHINE) $(QEMU_SEMIHOST) -kernel
|
|
run-semiconsole: semiconsole
|
|
$(call skip-test, $<, "MANUAL ONLY")
|
|
$(if $(V),@printf " %-7s %s %s\n" "TO RUN" $(notdir $(QEMU)) "$(QEMU_OPTS) $<")
|
|
run-plugin-semiconsole-with-%: semiconsole
|
|
$(call skip-test, $<, "MANUAL ONLY")
|
|
|
|
# vtimer test needs EL2
|
|
QEMU_EL2_MACHINE=-machine virt,virtualization=on,gic-version=2 -cpu cortex-a57 -smp 4
|
|
run-vtimer: QEMU_OPTS=$(QEMU_EL2_MACHINE) $(QEMU_BASE_ARGS) -kernel
|
|
|
|
# Simple Record/Replay Test
|
|
.PHONY: memory-record
|
|
run-memory-record: memory-record memory
|
|
$(call run-test, $<, \
|
|
$(QEMU) -monitor none -display none \
|
|
-chardev file$(COMMA)path=$<.out$(COMMA)id=output \
|
|
-icount shift=5$(COMMA)rr=record$(COMMA)rrfile=record.bin \
|
|
$(QEMU_OPTS) memory)
|
|
|
|
.PHONY: memory-replay
|
|
run-memory-replay: memory-replay run-memory-record
|
|
$(call run-test, $<, \
|
|
$(QEMU) -monitor none -display none \
|
|
-chardev file$(COMMA)path=$<.out$(COMMA)id=output \
|
|
-icount shift=5$(COMMA)rr=replay$(COMMA)rrfile=record.bin \
|
|
$(QEMU_OPTS) memory)
|
|
|
|
EXTRA_RUNS+=run-memory-replay
|
|
|
|
ifneq ($(CROSS_CC_HAS_ARMV8_3),)
|
|
pauth-3: CFLAGS += -march=armv8.3-a
|
|
else
|
|
pauth-3:
|
|
$(call skip-test, "BUILD of $@", "missing compiler support")
|
|
run-pauth-3:
|
|
$(call skip-test, "RUN of pauth-3", "not built")
|
|
endif
|