Re: [PATCH v1 5/5] x86: Hyper-V SynIC timers test
On 27/11/2015 12:30, Andrey Smetanin wrote: >>> >>> + >>> +static void stimer_test_cleanup(void *ctx) >>> +{ >>> +irq_enable(); >> >> Why enable again? > I'll remove it. I guess you can remove the one in stimer_test_prepare too. If the interrupts are disabled you don't get the IPI either, do you? Paolo -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v1 5/5] x86: Hyper-V SynIC timers test
On 11/27/2015 02:17 PM, Paolo Bonzini wrote: The test logic is good, but the glue can be improved a bit so that the output is more useful if it breaks. Thanks for comments below. I'll redo this patch. On 26/11/2015 17:29, Andrey Smetanin wrote: The test checks Hyper-V SynIC timers functionality. The test runs on every vCPU and performs start/stop of periodic/one-shot timers (with period=1ms) and checks validity of received expiration messages in appropriate ISR's. Signed-off-by: Andrey Smetanin Reviewed-by: Roman Kagan CC: Paolo Bonzini CC: Marcelo Tosatti CC: Roman Kagan CC: Denis V. Lunev CC: qemu-de...@nongnu.org --- config/config-x86-common.mak | 4 +- x86/hyperv_stimer.c | 500 +++ x86/unittests.cfg| 5 + 3 files changed, 508 insertions(+), 1 deletion(-) create mode 100644 x86/hyperv_stimer.c diff --git a/config/config-x86-common.mak b/config/config-x86-common.mak index f64874d..a75be87 100644 --- a/config/config-x86-common.mak +++ b/config/config-x86-common.mak @@ -37,7 +37,7 @@ tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.flat \ $(TEST_DIR)/s3.flat $(TEST_DIR)/pmu.flat \ $(TEST_DIR)/tsc_adjust.flat $(TEST_DIR)/asyncpf.flat \ $(TEST_DIR)/init.flat $(TEST_DIR)/smap.flat \ - $(TEST_DIR)/hyperv_synic.flat + $(TEST_DIR)/hyperv_synic.flat $(TEST_DIR)/hyperv_stimer.flat \ ifdef API tests-common += api/api-sample @@ -115,6 +115,8 @@ $(TEST_DIR)/memory.elf: $(cstart.o) $(TEST_DIR)/memory.o $(TEST_DIR)/hyperv_synic.elf: $(cstart.o) $(TEST_DIR)/hyperv_synic.o +$(TEST_DIR)/hyperv_stimer.elf: $(cstart.o) $(TEST_DIR)/hyperv_stimer.o + arch_clean: $(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat $(TEST_DIR)/*.elf \ $(TEST_DIR)/.*.d lib/x86/.*.d diff --git a/x86/hyperv_stimer.c b/x86/hyperv_stimer.c new file mode 100644 index 000..e9186ca --- /dev/null +++ b/x86/hyperv_stimer.c @@ -0,0 +1,500 @@ +#include "libcflat.h" +#include "processor.h" +#include "msr.h" +#include "isr.h" +#include "vm.h" +#include "apic.h" +#include "desc.h" +#include "io.h" +#include "smp.h" +#include "atomic.h" + +#define MAX_CPUS 4 +#define HYPERV_CPUID_FEATURES 0x4003 + +#define HV_SYNIC_CONTROL_ENABLE (1ULL << 0) +#define HV_SYNIC_SIMP_ENABLE(1ULL << 0) +#define HV_SYNIC_SIEFP_ENABLE (1ULL << 0) +#define HV_SYNIC_SINT_MASKED(1ULL << 16) +#define HV_SYNIC_SINT_AUTO_EOI (1ULL << 17) +#define HV_SYNIC_SINT_VECTOR_MASK (0xFF) +#define HV_SYNIC_SINT_COUNT 16 + +#define HV_STIMER_ENABLE(1ULL << 0) +#define HV_STIMER_PERIODIC (1ULL << 1) +#define HV_STIMER_LAZY (1ULL << 2) +#define HV_STIMER_AUTOENABLE(1ULL << 3) +#define HV_STIMER_SINT(config) (__u8)(((config) >> 16) & 0x0F) + +#define HV_SYNIC_STIMER_COUNT (4) + +/* Define synthetic interrupt controller message constants. */ +#define HV_MESSAGE_SIZE (256) +#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240) +#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30) + +/* Define hypervisor message types. */ +enum hv_message_type { +HVMSG_NONE = 0x, + +/* Memory access messages. */ +HVMSG_UNMAPPED_GPA = 0x8000, +HVMSG_GPA_INTERCEPT = 0x8001, + +/* Timer notification messages. */ +HVMSG_TIMER_EXPIRED = 0x8010, + +/* Error messages. */ +HVMSG_INVALID_VP_REGISTER_VALUE = 0x8020, +HVMSG_UNRECOVERABLE_EXCEPTION = 0x8021, +HVMSG_UNSUPPORTED_FEATURE = 0x8022, + +/* Trace buffer complete messages. */ +HVMSG_EVENTLOG_BUFFERCOMPLETE = 0x8040, + +/* Platform-specific processor intercept messages. */ +HVMSG_X64_IOPORT_INTERCEPT = 0x8001, +HVMSG_X64_MSR_INTERCEPT = 0x80010001, +HVMSG_X64_CPUID_INTERCEPT = 0x80010002, +HVMSG_X64_EXCEPTION_INTERCEPT = 0x80010003, +HVMSG_X64_APIC_EOI = 0x80010004, +HVMSG_X64_LEGACY_FP_ERROR = 0x80010005 +}; + +/* Define synthetic interrupt controller message flags. */ +union hv_message_flags { +uint8_t asu8; +struct { +uint8_t msg_pending:1; +uint8_t reserved:7; +}; +}; + +union hv_port_id { +uint32_t asu32; +struct { +uint32_t id:24; +uint32_t reserved:8; +} u; +}; + +/* Define port type. */ +enum hv_port_type { +HVPORT_MSG = 1, +HVPORT_EVENT= 2, +HVPORT_MONITOR = 3 +}; + +/* Define synthetic interrupt controller message header. */ +struct hv_message_header { +e
Re: [PATCH v1 5/5] x86: Hyper-V SynIC timers test
The test logic is good, but the glue can be improved a bit so that the output is more useful if it breaks. On 26/11/2015 17:29, Andrey Smetanin wrote: > The test checks Hyper-V SynIC timers functionality. > The test runs on every vCPU and performs start/stop > of periodic/one-shot timers (with period=1ms) and checks > validity of received expiration messages in appropriate > ISR's. > > Signed-off-by: Andrey Smetanin > Reviewed-by: Roman Kagan > CC: Paolo Bonzini > CC: Marcelo Tosatti > CC: Roman Kagan > CC: Denis V. Lunev > CC: qemu-de...@nongnu.org > > --- > config/config-x86-common.mak | 4 +- > x86/hyperv_stimer.c | 500 > +++ > x86/unittests.cfg| 5 + > 3 files changed, 508 insertions(+), 1 deletion(-) > create mode 100644 x86/hyperv_stimer.c > > diff --git a/config/config-x86-common.mak b/config/config-x86-common.mak > index f64874d..a75be87 100644 > --- a/config/config-x86-common.mak > +++ b/config/config-x86-common.mak > @@ -37,7 +37,7 @@ tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.flat > \ > $(TEST_DIR)/s3.flat $(TEST_DIR)/pmu.flat \ > $(TEST_DIR)/tsc_adjust.flat $(TEST_DIR)/asyncpf.flat \ > $(TEST_DIR)/init.flat $(TEST_DIR)/smap.flat \ > - $(TEST_DIR)/hyperv_synic.flat > + $(TEST_DIR)/hyperv_synic.flat $(TEST_DIR)/hyperv_stimer.flat \ > > ifdef API > tests-common += api/api-sample > @@ -115,6 +115,8 @@ $(TEST_DIR)/memory.elf: $(cstart.o) $(TEST_DIR)/memory.o > > $(TEST_DIR)/hyperv_synic.elf: $(cstart.o) $(TEST_DIR)/hyperv_synic.o > > +$(TEST_DIR)/hyperv_stimer.elf: $(cstart.o) $(TEST_DIR)/hyperv_stimer.o > + > arch_clean: > $(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat $(TEST_DIR)/*.elf \ > $(TEST_DIR)/.*.d lib/x86/.*.d > diff --git a/x86/hyperv_stimer.c b/x86/hyperv_stimer.c > new file mode 100644 > index 000..e9186ca > --- /dev/null > +++ b/x86/hyperv_stimer.c > @@ -0,0 +1,500 @@ > +#include "libcflat.h" > +#include "processor.h" > +#include "msr.h" > +#include "isr.h" > +#include "vm.h" > +#include "apic.h" > +#include "desc.h" > +#include "io.h" > +#include "smp.h" > +#include "atomic.h" > + > +#define MAX_CPUS 4 > +#define HYPERV_CPUID_FEATURES 0x4003 > + > +#define HV_SYNIC_CONTROL_ENABLE (1ULL << 0) > +#define HV_SYNIC_SIMP_ENABLE(1ULL << 0) > +#define HV_SYNIC_SIEFP_ENABLE (1ULL << 0) > +#define HV_SYNIC_SINT_MASKED(1ULL << 16) > +#define HV_SYNIC_SINT_AUTO_EOI (1ULL << 17) > +#define HV_SYNIC_SINT_VECTOR_MASK (0xFF) > +#define HV_SYNIC_SINT_COUNT 16 > + > +#define HV_STIMER_ENABLE(1ULL << 0) > +#define HV_STIMER_PERIODIC (1ULL << 1) > +#define HV_STIMER_LAZY (1ULL << 2) > +#define HV_STIMER_AUTOENABLE(1ULL << 3) > +#define HV_STIMER_SINT(config) (__u8)(((config) >> 16) & 0x0F) > + > +#define HV_SYNIC_STIMER_COUNT (4) > + > +/* Define synthetic interrupt controller message constants. */ > +#define HV_MESSAGE_SIZE (256) > +#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240) > +#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30) > + > +/* Define hypervisor message types. */ > +enum hv_message_type { > +HVMSG_NONE = 0x, > + > +/* Memory access messages. */ > +HVMSG_UNMAPPED_GPA = 0x8000, > +HVMSG_GPA_INTERCEPT = 0x8001, > + > +/* Timer notification messages. */ > +HVMSG_TIMER_EXPIRED = 0x8010, > + > +/* Error messages. */ > +HVMSG_INVALID_VP_REGISTER_VALUE = 0x8020, > +HVMSG_UNRECOVERABLE_EXCEPTION = 0x8021, > +HVMSG_UNSUPPORTED_FEATURE = 0x8022, > + > +/* Trace buffer complete messages. */ > +HVMSG_EVENTLOG_BUFFERCOMPLETE = 0x8040, > + > +/* Platform-specific processor intercept messages. */ > +HVMSG_X64_IOPORT_INTERCEPT = 0x8001, > +HVMSG_X64_MSR_INTERCEPT = 0x80010001, > +HVMSG_X64_CPUID_INTERCEPT = 0x80010002, > +HVMSG_X64_EXCEPTION_INTERCEPT = 0x80010003, > +HVMSG_X64_APIC_EOI = 0x80010004, > +HVMSG_X64_LEGACY_FP_ERROR = 0x80010005 > +}; > + > +/* Define synthetic interrupt controller message flags. */ > +union hv_message_flags { > +uint8_t asu8; > +struct { > +uint8_t msg_pending:1; > +uint8_t reserved:7; > +}; > +}; > + > +union hv_port_id { > +uint32_t asu32; > +struct { > +uint32_t id:24; > +uint32_t reserved:8; > +} u; > +}; > + > +/* Define port type. */ > +enum hv_port_type { > +HVPORT_MSG = 1, > +HVPOR