19#define TEST_RING_NPAGES (sizeof(ring_buffer) / PAGE_SIZE)
26 .partner_id = own_domid,
38 xtf_skip(
"Skip: Argo support has not been enabled in this hypervisor\n");
41 xtf_skip(
"Skip: Argo is not enabled at runtime for this hypervisor\n");
44 xtf_skip(
"Skip: Argo is not enabled for this domain\n");
48 xtf_failure(
"Fail: Ring registration by this domain is not permitted\n");
51 xtf_failure(
"Fail: An invalid ring register op was not rejected\n");
54 xtf_failure(
"Fail: Unknown error %d for invalid ring registration\n", rc);
76 .domain_id = query_domid,
86 xtf_failure(
"Fail: Unexpected error code %d in notify test\n", rc);
93 if ( notify.ents[0].flags )
95 xtf_failure(
"Fail: Non-existent ring reported as existing\n");
103 xtf_failure(
"Fail: Ring not reported as existing\n");
112#define XEN_ARGO_ROUNDUP(x) ROUNDUP(x, XEN_ARGO_MSG_SLOT_SIZE)
113#define ARGO_RING_OVERHEAD 80
114#define TEST_RING_SIZE(npages) \
115 (XEN_ARGO_ROUNDUP((((PAGE_SIZE)*npages) - ARGO_RING_OVERHEAD)))
123 .partner_id = own_domid,
139 xtf_failure(
"Fail: Argo is not enabled for this domain\n");
142 xtf_failure(
"Fail: Memory fault performing register ring test\n");
145 xtf_failure(
"Fail: Unexpected error code %d in register ring test\n", rc);
157 .partner_id = partner_domid,
166 xtf_failure(
"Fail: Unexpected success unregistering non-existent ring\n");
172 xtf_failure(
"Fail: Unexpected ring not found when unregistering \n");
176 xtf_failure(
"Fail: Unexpected error code %d in unregister ring test\n", rc);
185 const char *msg_text,
size_t msg_len,
unsigned int msg_type)
193 .domain_id = dst_domid,
208 xtf_failure(
"Fail: Unexpected error code %d in sendv test\n", rc);
212 if ( (
size_t)rc != msg_len )
214 xtf_failure(
"Fail: Unexpected message size %d written in sendv test\n", rc);
224 const char *sent_msg,
225 unsigned int sent_msg_len,
226 unsigned int sent_msg_type)
231 unsigned int sent_length;
235 xtf_failure(
"Fail: Receive pointer non-zero after sendv: %u\n",
243 xtf_failure(
"Fail: Transmit pointer incorrect after sendv: %u\n",
252 xtf_failure(
"Fail: Source domain id incorrect: %u, expected %u\n",
259 xtf_failure(
"Fail: Source domain port incorrect: %u, expected %u\n",
266 xtf_failure(
"Fail: Source padding incorrect: %u, expected zero\n",
273 xtf_failure(
"Fail: Message type incorrect: %u sent, %u received\n",
279 if ( sent_length != msg_hdr->
len )
281 xtf_failure(
"Fail: Received message length incorrect: "
282 "%u sent is %u with header added, %u received\n",
283 sent_msg_len, sent_length, msg_hdr->
len);
287 if (
memcmp(msg_hdr->
data, sent_msg, sent_msg_len) )
305 const char simple_text[] =
"A simple thing to send\n";
306 const unsigned int msg_type = 0x12345678;
310 return xtf_error(
"Error: could not determine domid of the test domain\n");
332 test_sendv(own_domid, test_aport, own_domid, test_aport,
333 simple_text,
strlen(simple_text), msg_type) ||
335 own_domid, test_aport, simple_text,
strlen(simple_text), msg_type) ||
#define TEST_RING_SIZE(npages)
static int test_register_ring(domid_t own_domid, xen_argo_port_t aport)
static int test_unregister_ring(domid_t partner_domid, xen_argo_port_t aport, bool exists)
static int inspect_ring_after_first_single_sendv(domid_t src_domid, xen_argo_port_t src_aport, const char *sent_msg, unsigned int sent_msg_len, unsigned int sent_msg_type)
void test_main(void)
To be implemented by each test, as its entry point.
static int test_sendv(domid_t src_domid, xen_argo_port_t src_aport, domid_t dst_domid, xen_argo_port_t dst_aport, const char *msg_text, size_t msg_len, unsigned int msg_type)
const char test_title[]
The title of the test.
static int test_notify_for_one_ring(domid_t query_domid, xen_argo_port_t query_port, bool exists)
#define XEN_ARGO_ROUNDUP(x)
static uint8_t ring_buffer[32 *PAGE_SIZE]
static int probe_for_argo(domid_t own_domid)
static void clear_test_ring(void)
#define XEN_ARGO_RING_EXISTS
#define XEN_ARGO_OP_notify
#define XEN_ARGO_OP_unregister_ring
#define XEN_ARGO_OP_register_ring
#define XEN_ARGO_OP_sendv
#define XEN_ARGO_REGISTER_FLAG_FAIL_EXIST
#define __page_aligned_bss
static long hypercall_argo_op(unsigned int cmd, void *arg1, void *arg2, unsigned long arg3, unsigned long arg4)
int xtf_get_domid(void)
Obtain the current domid.
#define memcmp(s1, s2, n)
static unsigned long virt_to_gfn(const void *va)
#define _u(v)
Express an arbitrary value v as unsigned long.
void xtf_failure(const char *fmt,...)
Report a test failure.
void xtf_error(const char *fmt,...)
Report a test error.
void xtf_skip(const char *fmt,...)
Report a test skip.
void xtf_success(const char *fmt,...)
Report test success.