summaryrefslogtreecommitdiffstats
path: root/userspace
diff options
context:
space:
mode:
Diffstat (limited to 'userspace')
-rw-r--r--userspace/Makefile.sources3
-rw-r--r--userspace/units/posix-env/Makefile26
-rw-r--r--userspace/units/posix-env/posix-env.c198
3 files changed, 226 insertions, 1 deletions
diff --git a/userspace/Makefile.sources b/userspace/Makefile.sources
index cbb88319..c0f9124f 100644
--- a/userspace/Makefile.sources
+++ b/userspace/Makefile.sources
@@ -46,7 +46,8 @@ CORE_HEADERS := \
46 $(CORE_SRC)/../include/unit/*.h 46 $(CORE_SRC)/../include/unit/*.h
47 47
48# Each directory under the UNIT_SRC directory should correspond to one module. 48# Each directory under the UNIT_SRC directory should correspond to one module.
49UNITS := \ 49UNITS := \
50 $(UNIT_SRC)/posix-env \
50 $(UNIT_SRC)/posix-bitops 51 $(UNIT_SRC)/posix-bitops
51 52
52# A test unit. Not really needed any more... 53# A test unit. Not really needed any more...
diff --git a/userspace/units/posix-env/Makefile b/userspace/units/posix-env/Makefile
new file mode 100644
index 00000000..c693813e
--- /dev/null
+++ b/userspace/units/posix-env/Makefile
@@ -0,0 +1,26 @@
1# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
2#
3# Permission is hereby granted, free of charge, to any person obtaining a
4# copy of this software and associated documentation files (the "Software"),
5# to deal in the Software without restriction, including without limitation
6# the rights to use, copy, modify, merge, publish, distribute, sublicense,
7# and/or sell copies of the Software, and to permit persons to whom the
8# Software is furnished to do so, subject to the following conditions:
9#
10# The above copyright notice and this permission notice shall be included in
11# all copies or substantial portions of the Software.
12#
13# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19# DEALINGS IN THE SOFTWARE.
20
21.SUFFIXES:
22
23OBJS = posix-env.o
24MODULE = posix-env
25
26include ../Makefile.units
diff --git a/userspace/units/posix-env/posix-env.c b/userspace/units/posix-env/posix-env.c
new file mode 100644
index 00000000..fc090352
--- /dev/null
+++ b/userspace/units/posix-env/posix-env.c
@@ -0,0 +1,198 @@
1/*
2 * Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 * DEALINGS IN THE SOFTWARE.
21 */
22
23#include <stdlib.h>
24#include <stdint.h>
25
26#include <unit/io.h>
27#include <unit/unit.h>
28
29#include <nvgpu/types.h>
30
31/*
32 * Test if the passed type is signed. In the signed case this expression becomes
33 *
34 * x = 0;
35 * y = x - 1 = -1
36 *
37 * And -1 < 0 will be true. In the unsigned case, we rely on wrap around. We
38 * have the following
39 *
40 * x = 0U
41 * y = x - 1 = ~0 (i.e <TYPE>_MAX)
42 *
43 * Thus the expression y < x is false.
44 */
45#define IS_SIGNED_TYPE(__type__) \
46 ({ \
47 __type__ x = (__type__)0; \
48 __type__ y = x - (__type__)1; \
49 y < x; \
50 })
51
52/*
53 * Ensure that our sized types are of the correct size. Assumes an 8bit byte of
54 * course.
55 */
56static int sanity_test_sizes(struct unit_module *m,
57 struct gk20a *g, void *args)
58{
59 size_t size_u8 = sizeof(u8);
60 size_t size_u16 = sizeof(u16);
61 size_t size_u32 = sizeof(u32);
62 size_t size_u64 = sizeof(u64);
63 size_t size_s8 = sizeof(s8);
64 size_t size_s16 = sizeof(s16);
65 size_t size_s32 = sizeof(s32);
66 size_t size_s64 = sizeof(s64);
67
68 /* Unsigned. */
69 if (size_u8 != 1U)
70 unit_return_fail(m,
71 "sizeof(u8) != 1 byte! (Actual size: %zu)\n",
72 size_u8);
73 if (size_u16 != 2U)
74 unit_return_fail(m,
75 "sizeof(u16) != 2 bytes! (Actual size: %zu)\n",
76 size_u16);
77 if (size_u32 != 4U)
78 unit_return_fail(m,
79 "sizeof(u32) != 4 bytes! (Actual size: %zu)\n",
80 size_u32);
81 if (size_u64 != 8U)
82 unit_return_fail(m,
83 "sizeof(u64) != 8 bytes! (Actual size: %zu)\n",
84 size_u64);
85
86 /* Signed. */
87 if (size_s8 != 1U)
88 unit_return_fail(m,
89 "sizeof(s8) != 1 byte! (Actual size: %zu)\n",
90 size_s8);
91 if (size_s16 != 2U)
92 unit_return_fail(m,
93 "sizeof(s16) != 2 bytes! (Actual size: %zu)\n",
94 size_s16);
95 if (size_s32 != 4U)
96 unit_return_fail(m,
97 "sizeof(s32) != 4 bytes! (Actual size: %zu)\n",
98 size_s32);
99 if (size_s64 != 8U)
100 unit_return_fail(m,
101 "sizeof(s64) != 8 bytes! (Actual size: %zu)\n",
102 size_s64);
103
104 return UNIT_SUCCESS;
105}
106
107/*
108 * Make sure that the signed types really are signed and that the unsigned types
109 * really are not.
110 */
111static int sanity_test_signage(struct unit_module *m,
112 struct gk20a *g, void *args)
113{
114
115 if (!IS_SIGNED_TYPE(s8))
116 unit_return_fail(m, "s8 is not signed!\n");
117 if (!IS_SIGNED_TYPE(s16))
118 unit_return_fail(m, "s16 is not signed!\n");
119 if (!IS_SIGNED_TYPE(s32))
120 unit_return_fail(m, "s32 is not signed!\n");
121 if (!IS_SIGNED_TYPE(s64))
122 unit_return_fail(m, "s64 is not signed!\n");
123
124 if (IS_SIGNED_TYPE(u8))
125 unit_return_fail(m, "u8 is signed!\n");
126 if (IS_SIGNED_TYPE(u16))
127 unit_return_fail(m, "u16 is signed!\n");
128 if (IS_SIGNED_TYPE(u32))
129 unit_return_fail(m, "u32 is signed!\n");
130 if (IS_SIGNED_TYPE(u64))
131 unit_return_fail(m, "u64 is signed!\n");
132
133 return UNIT_SUCCESS;
134}
135
136/*
137 * Ensure that a u64 can hold a pointer since in some places we use a u64 to
138 * pass back a pointer value.
139 */
140static int sanity_test_ptr_in_u64(struct unit_module *m,
141 struct gk20a *g, void *args)
142{
143 if (sizeof(u64) < sizeof(uintptr_t))
144 unit_return_fail(m,
145 "u64 size (%zu b) less than pointer size (%zu b)",
146 sizeof(u64), sizeof(uintptr_t));
147
148 return UNIT_SUCCESS;
149}
150
151static int sanity_test_endianness(struct unit_module *m,
152 struct gk20a *g, void *args)
153{
154 u32 i;
155 u32 x = 0x12345678;
156 u8 *ptr_x_u8 = (u8 *)&x;
157 u16 *ptr_x_u16 = (u16 *)&x;
158
159 /*
160 * Print what endianness we have. For now we have not explicitly decided
161 * to support one or the other, but this will have to be determined
162 * eventually.
163 *
164 * We have just been lucky so far.
165 */
166 unit_info(m, "u32 x = 0x%x\n", x);
167 for (i = 0; i < sizeof(u32) / sizeof(u16); i++) {
168 unit_info(m, " &x + %zu: 0x%04hx\n",
169 i * sizeof(u16), ptr_x_u16[i]);
170 }
171
172 unit_info(m, "u32 x = 0x%x\n", x);
173 for (i = 0; i < sizeof(u32); i++) {
174 unit_info(m, " &x + %u: 0x%02hhx\n", i, ptr_x_u8[i]);
175 }
176
177 switch (ptr_x_u8[0]) {
178 case 0x12:
179 unit_info(m, "Machine endianness: big\n");
180 break;
181 case 0x78:
182 unit_info(m, "Machine endianness: little\n");
183 break;
184 default:
185 unit_return_fail(m, "Machine endianness: middle/unknown ??\n");
186 }
187
188 return UNIT_SUCCESS;
189}
190
191struct unit_module_test posix_env_tests[] = {
192 UNIT_TEST(sizes, sanity_test_sizes, NULL),
193 UNIT_TEST(signage, sanity_test_signage, NULL),
194 UNIT_TEST(endianness, sanity_test_endianness, NULL),
195 UNIT_TEST(ptr_in_u64, sanity_test_ptr_in_u64, NULL),
196};
197
198UNIT_MODULE(posix_env, posix_env_tests, UNIT_PRIO_POSIX_TEST);