2 * Copyright (c) 2011 Vojtech Horky
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include <str_error.h>
35 #include "../tester.h"
37 #define BUFFER1_PAGES 4
38 #define BUFFER2_PAGES 2
40 static void *create_as_area(size_t size
)
42 TPRINTF("Creating AS area...\n");
44 void *result
= as_area_create(AS_AREA_ANY
, size
,
45 AS_AREA_READ
| AS_AREA_WRITE
| AS_AREA_CACHEABLE
, AS_AREA_UNPAGED
);
46 if (result
== AS_MAP_FAILED
)
52 static void touch_area(void *area
, size_t size
)
54 TPRINTF("Touching (faulting-in) AS area...\n");
56 char *ptr
= (char *)area
;
65 #define VERIFY_MAPPING(area, page_count, expected_rc) \
66 verify_mapping((area), (page_count), (expected_rc), #expected_rc)
68 static bool verify_mapping(void *area
, int page_count
, errno_t expected_rc
,
69 const char *expected_rc_str
)
71 TPRINTF("Verifying mapping (expected: %s).\n", expected_rc_str
);
73 for (i
= 0; i
< page_count
; i
++) {
74 void *page_start
= ((char *) area
) + PAGE_SIZE
* i
;
75 errno_t rc
= as_get_physical_mapping(page_start
, NULL
);
76 if (rc
!= expected_rc
) {
77 TPRINTF("as_get_physical_mapping() = %s != %s\n",
78 str_error_name(rc
), str_error_name(expected_rc
));
85 const char *test_mapping1(void)
89 size_t buffer1_len
= BUFFER1_PAGES
* PAGE_SIZE
;
90 size_t buffer2_len
= BUFFER2_PAGES
* PAGE_SIZE
;
91 void *buffer1
= create_as_area(buffer1_len
);
92 void *buffer2
= create_as_area(buffer2_len
);
93 if (!buffer1
|| !buffer2
) {
94 return "Cannot allocate memory";
97 touch_area(buffer1
, buffer1_len
);
98 touch_area(buffer2
, buffer2_len
);
100 /* Now verify that mapping to physical frames exist. */
101 if (!VERIFY_MAPPING(buffer1
, BUFFER1_PAGES
, EOK
)) {
102 return "Failed to find mapping (buffer1)";
104 if (!VERIFY_MAPPING(buffer2
, BUFFER2_PAGES
, EOK
)) {
105 return "Failed to find mapping (buffer2)";
108 /* Let's destroy the buffer1 area and access it again. */
109 rc
= as_area_destroy(buffer1
);
111 return "Failed to destroy AS area";
113 if (!VERIFY_MAPPING(buffer1
, BUFFER1_PAGES
, ENOENT
)) {
114 return "Mapping of destroyed area still exists";
118 rc
= as_area_destroy(buffer2
);
120 return "Failed to destroy AS area";