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:
Markus Armbruster 2016-03-15 19:34:22 +01:00
parent 998261726a
commit 4958fe5d3c

View File

@ -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);