On Wed, Jul 22, 2015 at 02:38:11PM +0200, Andrew Jones wrote: > 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.
Just thought of another issue with the unit test. There's no isb() following the code modification. > > 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. > >