ivshmem-test: Improve test case /ivshmem/single
Test state of registers after reset. Test reading Interrupt Status clears it. Test (invalid) read of Doorbell. Add more comments. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <1458066895-20632-8-git-send-email-armbru@redhat.com>
This commit is contained in:
parent
998261726a
commit
4958fe5d3c
@ -143,32 +143,41 @@ static void test_ivshmem_single(void)
|
|||||||
setup_vm(&state);
|
setup_vm(&state);
|
||||||
s = &state;
|
s = &state;
|
||||||
|
|
||||||
/* valid io */
|
/* initial state of readable registers */
|
||||||
out_reg(s, INTRMASK, 0);
|
g_assert_cmpuint(in_reg(s, INTRMASK), ==, 0);
|
||||||
in_reg(s, INTRSTATUS);
|
g_assert_cmpuint(in_reg(s, INTRSTATUS), ==, 0);
|
||||||
in_reg(s, IVPOSITION);
|
g_assert_cmpuint(in_reg(s, IVPOSITION), ==, 0);
|
||||||
|
|
||||||
|
/* trigger interrupt via registers */
|
||||||
out_reg(s, INTRMASK, 0xffffffff);
|
out_reg(s, INTRMASK, 0xffffffff);
|
||||||
g_assert_cmpuint(in_reg(s, INTRMASK), ==, 0xffffffff);
|
g_assert_cmpuint(in_reg(s, INTRMASK), ==, 0xffffffff);
|
||||||
out_reg(s, INTRSTATUS, 1);
|
out_reg(s, INTRSTATUS, 1);
|
||||||
/* XXX: intercept IRQ, not seen in resp */
|
/* check interrupt status */
|
||||||
g_assert_cmpuint(in_reg(s, INTRSTATUS), ==, 1);
|
g_assert_cmpuint(in_reg(s, INTRSTATUS), ==, 1);
|
||||||
|
/* reading clears */
|
||||||
|
g_assert_cmpuint(in_reg(s, INTRSTATUS), ==, 0);
|
||||||
|
/* TODO intercept actual interrupt (needs qtest work) */
|
||||||
|
|
||||||
/* invalid io */
|
/* invalid register access */
|
||||||
out_reg(s, IVPOSITION, 1);
|
out_reg(s, IVPOSITION, 1);
|
||||||
|
in_reg(s, DOORBELL);
|
||||||
|
|
||||||
|
/* ring the (non-functional) doorbell */
|
||||||
out_reg(s, DOORBELL, 8 << 16);
|
out_reg(s, DOORBELL, 8 << 16);
|
||||||
|
|
||||||
|
/* write shared memory */
|
||||||
for (i = 0; i < G_N_ELEMENTS(data); i++) {
|
for (i = 0; i < G_N_ELEMENTS(data); i++) {
|
||||||
data[i] = i;
|
data[i] = i;
|
||||||
}
|
}
|
||||||
qtest_memwrite(s->qtest, (uintptr_t)s->mem_base, data, sizeof(data));
|
qtest_memwrite(s->qtest, (uintptr_t)s->mem_base, data, sizeof(data));
|
||||||
|
|
||||||
|
/* verify write */
|
||||||
for (i = 0; i < G_N_ELEMENTS(data); i++) {
|
for (i = 0; i < G_N_ELEMENTS(data); i++) {
|
||||||
g_assert_cmpuint(((uint32_t *)tmpshmem)[i], ==, i);
|
g_assert_cmpuint(((uint32_t *)tmpshmem)[i], ==, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* read it back and verify read */
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
|
||||||
qtest_memread(s->qtest, (uintptr_t)s->mem_base, data, sizeof(data));
|
qtest_memread(s->qtest, (uintptr_t)s->mem_base, data, sizeof(data));
|
||||||
for (i = 0; i < G_N_ELEMENTS(data); i++) {
|
for (i = 0; i < G_N_ELEMENTS(data); i++) {
|
||||||
g_assert_cmpuint(data[i], ==, i);
|
g_assert_cmpuint(data[i], ==, i);
|
||||||
|
Loading…
Reference in New Issue
Block a user