xref: /openbmc/linux/tools/testing/selftests/kvm/lib/io.c (revision 6089ae0bd5e15fc150adce5bc694e87e00513825)
1*6089ae0bSPaolo Bonzini /*
2*6089ae0bSPaolo Bonzini  * tools/testing/selftests/kvm/lib/io.c
3*6089ae0bSPaolo Bonzini  *
4*6089ae0bSPaolo Bonzini  * Copyright (C) 2018, Google LLC.
5*6089ae0bSPaolo Bonzini  *
6*6089ae0bSPaolo Bonzini  * This work is licensed under the terms of the GNU GPL, version 2.
7*6089ae0bSPaolo Bonzini  */
8*6089ae0bSPaolo Bonzini 
9*6089ae0bSPaolo Bonzini #include "test_util.h"
10*6089ae0bSPaolo Bonzini 
11*6089ae0bSPaolo Bonzini /* Test Write
12*6089ae0bSPaolo Bonzini  *
13*6089ae0bSPaolo Bonzini  * A wrapper for write(2), that automatically handles the following
14*6089ae0bSPaolo Bonzini  * special conditions:
15*6089ae0bSPaolo Bonzini  *
16*6089ae0bSPaolo Bonzini  *   + Interrupted system call (EINTR)
17*6089ae0bSPaolo Bonzini  *   + Write of less than requested amount
18*6089ae0bSPaolo Bonzini  *   + Non-block return (EAGAIN)
19*6089ae0bSPaolo Bonzini  *
20*6089ae0bSPaolo Bonzini  * For each of the above, an additional write is performed to automatically
21*6089ae0bSPaolo Bonzini  * continue writing the requested data.
22*6089ae0bSPaolo Bonzini  * There are also many cases where write(2) can return an unexpected
23*6089ae0bSPaolo Bonzini  * error (e.g. EIO).  Such errors cause a TEST_ASSERT failure.
24*6089ae0bSPaolo Bonzini  *
25*6089ae0bSPaolo Bonzini  * Note, for function signature compatibility with write(2), this function
26*6089ae0bSPaolo Bonzini  * returns the number of bytes written, but that value will always be equal
27*6089ae0bSPaolo Bonzini  * to the number of requested bytes.  All other conditions in this and
28*6089ae0bSPaolo Bonzini  * future enhancements to this function either automatically issue another
29*6089ae0bSPaolo Bonzini  * write(2) or cause a TEST_ASSERT failure.
30*6089ae0bSPaolo Bonzini  *
31*6089ae0bSPaolo Bonzini  * Args:
32*6089ae0bSPaolo Bonzini  *  fd    - Opened file descriptor to file to be written.
33*6089ae0bSPaolo Bonzini  *  count - Number of bytes to write.
34*6089ae0bSPaolo Bonzini  *
35*6089ae0bSPaolo Bonzini  * Output:
36*6089ae0bSPaolo Bonzini  *  buf   - Starting address of data to be written.
37*6089ae0bSPaolo Bonzini  *
38*6089ae0bSPaolo Bonzini  * Return:
39*6089ae0bSPaolo Bonzini  *  On success, number of bytes written.
40*6089ae0bSPaolo Bonzini  *  On failure, a TEST_ASSERT failure is caused.
41*6089ae0bSPaolo Bonzini  */
42*6089ae0bSPaolo Bonzini ssize_t test_write(int fd, const void *buf, size_t count)
43*6089ae0bSPaolo Bonzini {
44*6089ae0bSPaolo Bonzini 	ssize_t rc;
45*6089ae0bSPaolo Bonzini 	ssize_t num_written = 0;
46*6089ae0bSPaolo Bonzini 	size_t num_left = count;
47*6089ae0bSPaolo Bonzini 	const char *ptr = buf;
48*6089ae0bSPaolo Bonzini 
49*6089ae0bSPaolo Bonzini 	/* Note: Count of zero is allowed (see "RETURN VALUE" portion of
50*6089ae0bSPaolo Bonzini 	 * write(2) manpage for details.
51*6089ae0bSPaolo Bonzini 	 */
52*6089ae0bSPaolo Bonzini 	TEST_ASSERT(count >= 0, "Unexpected count, count: %li", count);
53*6089ae0bSPaolo Bonzini 
54*6089ae0bSPaolo Bonzini 	do {
55*6089ae0bSPaolo Bonzini 		rc = write(fd, ptr, num_left);
56*6089ae0bSPaolo Bonzini 
57*6089ae0bSPaolo Bonzini 		switch (rc) {
58*6089ae0bSPaolo Bonzini 		case -1:
59*6089ae0bSPaolo Bonzini 			TEST_ASSERT(errno == EAGAIN || errno == EINTR,
60*6089ae0bSPaolo Bonzini 				    "Unexpected write failure,\n"
61*6089ae0bSPaolo Bonzini 				    "  rc: %zi errno: %i", rc, errno);
62*6089ae0bSPaolo Bonzini 			continue;
63*6089ae0bSPaolo Bonzini 
64*6089ae0bSPaolo Bonzini 		case 0:
65*6089ae0bSPaolo Bonzini 			TEST_ASSERT(false, "Unexpected EOF,\n"
66*6089ae0bSPaolo Bonzini 				    "  rc: %zi num_written: %zi num_left: %zu",
67*6089ae0bSPaolo Bonzini 				    rc, num_written, num_left);
68*6089ae0bSPaolo Bonzini 			break;
69*6089ae0bSPaolo Bonzini 
70*6089ae0bSPaolo Bonzini 		default:
71*6089ae0bSPaolo Bonzini 			TEST_ASSERT(rc >= 0, "Unexpected ret from write,\n"
72*6089ae0bSPaolo Bonzini 				"  rc: %zi errno: %i", rc, errno);
73*6089ae0bSPaolo Bonzini 			num_written += rc;
74*6089ae0bSPaolo Bonzini 			num_left -= rc;
75*6089ae0bSPaolo Bonzini 			ptr += rc;
76*6089ae0bSPaolo Bonzini 			break;
77*6089ae0bSPaolo Bonzini 		}
78*6089ae0bSPaolo Bonzini 	} while (num_written < count);
79*6089ae0bSPaolo Bonzini 
80*6089ae0bSPaolo Bonzini 	return num_written;
81*6089ae0bSPaolo Bonzini }
82*6089ae0bSPaolo Bonzini 
83*6089ae0bSPaolo Bonzini /* Test Read
84*6089ae0bSPaolo Bonzini  *
85*6089ae0bSPaolo Bonzini  * A wrapper for read(2), that automatically handles the following
86*6089ae0bSPaolo Bonzini  * special conditions:
87*6089ae0bSPaolo Bonzini  *
88*6089ae0bSPaolo Bonzini  *   + Interrupted system call (EINTR)
89*6089ae0bSPaolo Bonzini  *   + Read of less than requested amount
90*6089ae0bSPaolo Bonzini  *   + Non-block return (EAGAIN)
91*6089ae0bSPaolo Bonzini  *
92*6089ae0bSPaolo Bonzini  * For each of the above, an additional read is performed to automatically
93*6089ae0bSPaolo Bonzini  * continue reading the requested data.
94*6089ae0bSPaolo Bonzini  * There are also many cases where read(2) can return an unexpected
95*6089ae0bSPaolo Bonzini  * error (e.g. EIO).  Such errors cause a TEST_ASSERT failure.  Note,
96*6089ae0bSPaolo Bonzini  * it is expected that the file opened by fd at the current file position
97*6089ae0bSPaolo Bonzini  * contains at least the number of requested bytes to be read.  A TEST_ASSERT
98*6089ae0bSPaolo Bonzini  * failure is produced if an End-Of-File condition occurs, before all the
99*6089ae0bSPaolo Bonzini  * data is read.  It is the callers responsibility to assure that sufficient
100*6089ae0bSPaolo Bonzini  * data exists.
101*6089ae0bSPaolo Bonzini  *
102*6089ae0bSPaolo Bonzini  * Note, for function signature compatibility with read(2), this function
103*6089ae0bSPaolo Bonzini  * returns the number of bytes read, but that value will always be equal
104*6089ae0bSPaolo Bonzini  * to the number of requested bytes.  All other conditions in this and
105*6089ae0bSPaolo Bonzini  * future enhancements to this function either automatically issue another
106*6089ae0bSPaolo Bonzini  * read(2) or cause a TEST_ASSERT failure.
107*6089ae0bSPaolo Bonzini  *
108*6089ae0bSPaolo Bonzini  * Args:
109*6089ae0bSPaolo Bonzini  *  fd    - Opened file descriptor to file to be read.
110*6089ae0bSPaolo Bonzini  *  count - Number of bytes to read.
111*6089ae0bSPaolo Bonzini  *
112*6089ae0bSPaolo Bonzini  * Output:
113*6089ae0bSPaolo Bonzini  *  buf   - Starting address of where to write the bytes read.
114*6089ae0bSPaolo Bonzini  *
115*6089ae0bSPaolo Bonzini  * Return:
116*6089ae0bSPaolo Bonzini  *  On success, number of bytes read.
117*6089ae0bSPaolo Bonzini  *  On failure, a TEST_ASSERT failure is caused.
118*6089ae0bSPaolo Bonzini  */
119*6089ae0bSPaolo Bonzini ssize_t test_read(int fd, void *buf, size_t count)
120*6089ae0bSPaolo Bonzini {
121*6089ae0bSPaolo Bonzini 	ssize_t rc;
122*6089ae0bSPaolo Bonzini 	ssize_t num_read = 0;
123*6089ae0bSPaolo Bonzini 	size_t num_left = count;
124*6089ae0bSPaolo Bonzini 	char *ptr = buf;
125*6089ae0bSPaolo Bonzini 
126*6089ae0bSPaolo Bonzini 	/* Note: Count of zero is allowed (see "If count is zero" portion of
127*6089ae0bSPaolo Bonzini 	 * read(2) manpage for details.
128*6089ae0bSPaolo Bonzini 	 */
129*6089ae0bSPaolo Bonzini 	TEST_ASSERT(count >= 0, "Unexpected count, count: %li", count);
130*6089ae0bSPaolo Bonzini 
131*6089ae0bSPaolo Bonzini 	do {
132*6089ae0bSPaolo Bonzini 		rc = read(fd, ptr, num_left);
133*6089ae0bSPaolo Bonzini 
134*6089ae0bSPaolo Bonzini 		switch (rc) {
135*6089ae0bSPaolo Bonzini 		case -1:
136*6089ae0bSPaolo Bonzini 			TEST_ASSERT(errno == EAGAIN || errno == EINTR,
137*6089ae0bSPaolo Bonzini 				    "Unexpected read failure,\n"
138*6089ae0bSPaolo Bonzini 				    "  rc: %zi errno: %i", rc, errno);
139*6089ae0bSPaolo Bonzini 			break;
140*6089ae0bSPaolo Bonzini 
141*6089ae0bSPaolo Bonzini 		case 0:
142*6089ae0bSPaolo Bonzini 			TEST_ASSERT(false, "Unexpected EOF,\n"
143*6089ae0bSPaolo Bonzini 				    "  rc: %zi num_read: %zi num_left: %zu",
144*6089ae0bSPaolo Bonzini 				    rc, num_read, num_left);
145*6089ae0bSPaolo Bonzini 			break;
146*6089ae0bSPaolo Bonzini 
147*6089ae0bSPaolo Bonzini 		default:
148*6089ae0bSPaolo Bonzini 			TEST_ASSERT(rc > 0, "Unexpected ret from read,\n"
149*6089ae0bSPaolo Bonzini 				    "  rc: %zi errno: %i", rc, errno);
150*6089ae0bSPaolo Bonzini 			num_read += rc;
151*6089ae0bSPaolo Bonzini 			num_left -= rc;
152*6089ae0bSPaolo Bonzini 			ptr += rc;
153*6089ae0bSPaolo Bonzini 			break;
154*6089ae0bSPaolo Bonzini 		}
155*6089ae0bSPaolo Bonzini 	} while (num_read < count);
156*6089ae0bSPaolo Bonzini 
157*6089ae0bSPaolo Bonzini 	return num_read;
158*6089ae0bSPaolo Bonzini }
159