On Tue, Jul 21, 2015 at 12:58:56PM +0200, Alexander Spyridakis wrote: > Hello all, > > You can find a new self-modifying test case in the following branch: > > git clone https://git.virtualopensystems.com/dev/tcg_baremetal_tests.git -b > > smc_test > > For each core, the test will run a small assembly snippet which > increments a variable. Immediately after, the snippet is modified in > memory to increment by 1 or 2 every other loop cycle, then passes > execution to the next core. At the end of the test we calculate the > expected result and compare it to the actual incremented variable. If > all code modifications happened correctly we pass the test. > > The test case has been tested with upstream QEMU, MTTCG and KVM with > success. Next version of the test will include more corner cases, such > as changing TBs immediately after code modification, to make sure that > we cover every scenario. > > To run it: > > make virt (or virt64/vexpress for other targets) > > ~/mttcg/arm-softmmu/qemu-system-arm -nographic -M virt -cpu cortex-a15 > > -kernel build-virt/image-virt.axf -smp 8 > > Also, by popular demand I started a port of the test for kvm-unit-tests: > > git clone https://git.virtualopensystems.com/dev/kvm-unit-tests.git
I took a quick look at this and see issues with the test code. First, you're spinning on a stack variable with this, /* Wait for our turn */ while(next_cpu != cpu); next_cpu needs to be global, and incremented atomically. I haven't gotten around to adding atomic_add/inc yet, but it would easy, and I'm happy to do it, even yet this week. And, as for the MMU, I see from the comment in your test code that you're hitting an exception when trying to modify code. This is because the code is mapped readonly in order to use it from usermode. I suggest you modify the page tables (see below for how) to map the code writeable. Do this before kicking your secondary cpus, so they'll come up ready. There are other issues you'll need to fix as well though in the test code; count should be initialized, result should be volatile, others? I suggest you make sure it works for one vcpu first. For modifying page tables, I think something like this should work for you (untested) #include <asm/setup.h> int main(void) { mmu_set_range_ptes(mmu_idmap, PHYS_OFFSET, PHYS_OFFSET, PHYS_END, __pgprot(PTE_WBWA)); flush_tlb_all(); ... I look forward to seeing your fixed up kvm-unit-test test posted. Please CC me on it. drew > > For the kvm-unit-tests version, I have some troubles with caches and > the MMU (which is disabled for this test). While TCG and MTTCG work, > KVM fails the test with strange results. I will keep looking to find > the exact problem. > > Best regards. >