4 * Integers read/write functions.
6 * Copyright 2010-2011 EfficiOS Inc. and Linux Foundation
8 * Author: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 #include <babeltrace/ctf/types.h>
30 #include <babeltrace/bitfield.h>
33 #include <babeltrace/endian.h>
36 * The aligned read/write functions are expected to be faster than the
37 * bitfield variants. They will be enabled eventually as an
42 int _aligned_integer_read(struct bt_stream_pos
*ppos
,
43 struct bt_definition
*definition
)
45 struct definition_integer
*integer_definition
=
46 container_of(definition
, struct definition_integer
, p
);
47 const struct declaration_integer
*integer_declaration
=
48 integer_definition
->declaration
;
49 struct ctf_stream_pos
*pos
= ctf_pos(ppos
);
50 int rbo
= (integer_declaration
->byte_order
!= BYTE_ORDER
); /* reverse byte order */
52 if (!ctf_align_pos(pos
, integer_declaration
->p
.alignment
))
55 if (!ctf_pos_access_ok(pos
, integer_declaration
->len
))
58 assert(!(pos
->offset
% CHAR_BIT
));
59 if (!integer_declaration
->signedness
) {
60 switch (integer_declaration
->len
) {
65 memcpy(&v
, ctf_get_pos_addr(pos
), sizeof(v
));
66 integer_definition
->value
._unsigned
= v
;
73 memcpy(&v
, ctf_get_pos_addr(pos
), sizeof(v
));
74 integer_definition
->value
._unsigned
=
75 rbo
? GUINT16_SWAP_LE_BE(v
) : v
;
82 memcpy(&v
, ctf_get_pos_addr(pos
), sizeof(v
));
83 integer_definition
->value
._unsigned
=
84 rbo
? GUINT32_SWAP_LE_BE(v
) : v
;
91 memcpy(&v
, ctf_get_pos_addr(pos
), sizeof(v
));
92 integer_definition
->value
._unsigned
=
93 rbo
? GUINT64_SWAP_LE_BE(v
) : v
;
100 switch (integer_declaration
->len
) {
105 memcpy(&v
, ctf_get_pos_addr(pos
), sizeof(v
));
106 integer_definition
->value
._signed
= v
;
113 memcpy(&v
, ctf_get_pos_addr(pos
), sizeof(v
));
114 integer_definition
->value
._signed
=
115 rbo
? (int16_t) GUINT16_SWAP_LE_BE(v
) : v
;
122 memcpy(&v
, ctf_get_pos_addr(pos
), sizeof(v
));
123 integer_definition
->value
._signed
=
124 rbo
? (int32_t) GUINT32_SWAP_LE_BE(v
) : v
;
131 memcpy(&v
, ctf_get_pos_addr(pos
), sizeof(v
));
132 integer_definition
->value
._signed
=
133 rbo
? (int64_t) GUINT64_SWAP_LE_BE(v
) : v
;
140 if (!ctf_move_pos(pos
, integer_declaration
->len
))
146 int _aligned_integer_write(struct bt_stream_pos
*ppos
,
147 struct bt_definition
*definition
)
149 struct definition_integer
*integer_definition
=
150 container_of(definition
, struct definition_integer
, p
);
151 const struct declaration_integer
*integer_declaration
=
152 integer_definition
->declaration
;
153 struct ctf_stream_pos
*pos
= ctf_pos(ppos
);
154 int rbo
= (integer_declaration
->byte_order
!= BYTE_ORDER
); /* reverse byte order */
156 if (!ctf_align_pos(pos
, integer_declaration
->p
.alignment
))
159 if (!ctf_pos_access_ok(pos
, integer_declaration
->len
))
162 assert(!(pos
->offset
% CHAR_BIT
));
165 if (!integer_declaration
->signedness
) {
166 switch (integer_declaration
->len
) {
169 uint8_t v
= integer_definition
->value
._unsigned
;
171 memcpy(ctf_get_pos_addr(pos
), &v
, sizeof(v
));
176 uint16_t v
= integer_definition
->value
._unsigned
;
179 v
= GUINT16_SWAP_LE_BE(v
);
180 memcpy(ctf_get_pos_addr(pos
), &v
, sizeof(v
));
185 uint32_t v
= integer_definition
->value
._unsigned
;
188 v
= GUINT32_SWAP_LE_BE(v
);
189 memcpy(ctf_get_pos_addr(pos
), &v
, sizeof(v
));
194 uint64_t v
= integer_definition
->value
._unsigned
;
197 v
= GUINT64_SWAP_LE_BE(v
);
198 memcpy(ctf_get_pos_addr(pos
), &v
, sizeof(v
));
205 switch (integer_declaration
->len
) {
208 uint8_t v
= integer_definition
->value
._signed
;
210 memcpy(ctf_get_pos_addr(pos
), &v
, sizeof(v
));
215 int16_t v
= integer_definition
->value
._signed
;
218 v
= GUINT16_SWAP_LE_BE(v
);
219 memcpy(ctf_get_pos_addr(pos
), &v
, sizeof(v
));
224 int32_t v
= integer_definition
->value
._signed
;
227 v
= GUINT32_SWAP_LE_BE(v
);
228 memcpy(ctf_get_pos_addr(pos
), &v
, sizeof(v
));
233 int64_t v
= integer_definition
->value
._signed
;
236 v
= GUINT64_SWAP_LE_BE(v
);
237 memcpy(ctf_get_pos_addr(pos
), &v
, sizeof(v
));
245 if (!ctf_move_pos(pos
, integer_declaration
->len
))
250 int ctf_integer_read(struct bt_stream_pos
*ppos
, struct bt_definition
*definition
)
252 struct definition_integer
*integer_definition
=
253 container_of(definition
, struct definition_integer
, p
);
254 const struct declaration_integer
*integer_declaration
=
255 integer_definition
->declaration
;
256 struct ctf_stream_pos
*pos
= ctf_pos(ppos
);
258 if (!(integer_declaration
->p
.alignment
% CHAR_BIT
)
259 && !(integer_declaration
->len
% CHAR_BIT
)) {
260 return _aligned_integer_read(ppos
, definition
);
263 if (!ctf_align_pos(pos
, integer_declaration
->p
.alignment
))
266 if (!ctf_pos_access_ok(pos
, integer_declaration
->len
))
269 if (!integer_declaration
->signedness
) {
270 if (integer_declaration
->byte_order
== LITTLE_ENDIAN
)
271 bt_bitfield_read_le(mmap_align_addr(pos
->base_mma
) +
272 pos
->mmap_base_offset
, unsigned char,
273 pos
->offset
, integer_declaration
->len
,
274 &integer_definition
->value
._unsigned
);
276 bt_bitfield_read_be(mmap_align_addr(pos
->base_mma
) +
277 pos
->mmap_base_offset
, unsigned char,
278 pos
->offset
, integer_declaration
->len
,
279 &integer_definition
->value
._unsigned
);
281 if (integer_declaration
->byte_order
== LITTLE_ENDIAN
)
282 bt_bitfield_read_le(mmap_align_addr(pos
->base_mma
) +
283 pos
->mmap_base_offset
, unsigned char,
284 pos
->offset
, integer_declaration
->len
,
285 &integer_definition
->value
._signed
);
287 bt_bitfield_read_be(mmap_align_addr(pos
->base_mma
) +
288 pos
->mmap_base_offset
, unsigned char,
289 pos
->offset
, integer_declaration
->len
,
290 &integer_definition
->value
._signed
);
292 if (!ctf_move_pos(pos
, integer_declaration
->len
))
297 int ctf_integer_write(struct bt_stream_pos
*ppos
, struct bt_definition
*definition
)
299 struct definition_integer
*integer_definition
=
300 container_of(definition
, struct definition_integer
, p
);
301 const struct declaration_integer
*integer_declaration
=
302 integer_definition
->declaration
;
303 struct ctf_stream_pos
*pos
= ctf_pos(ppos
);
305 if (!(integer_declaration
->p
.alignment
% CHAR_BIT
)
306 && !(integer_declaration
->len
% CHAR_BIT
)) {
307 return _aligned_integer_write(ppos
, definition
);
310 if (!ctf_align_pos(pos
, integer_declaration
->p
.alignment
))
313 if (!ctf_pos_access_ok(pos
, integer_declaration
->len
))
318 if (!integer_declaration
->signedness
) {
319 if (integer_declaration
->byte_order
== LITTLE_ENDIAN
)
320 bt_bitfield_write_le(mmap_align_addr(pos
->base_mma
) +
321 pos
->mmap_base_offset
, unsigned char,
322 pos
->offset
, integer_declaration
->len
,
323 integer_definition
->value
._unsigned
);
325 bt_bitfield_write_be(mmap_align_addr(pos
->base_mma
) +
326 pos
->mmap_base_offset
, unsigned char,
327 pos
->offset
, integer_declaration
->len
,
328 integer_definition
->value
._unsigned
);
330 if (integer_declaration
->byte_order
== LITTLE_ENDIAN
)
331 bt_bitfield_write_le(mmap_align_addr(pos
->base_mma
) +
332 pos
->mmap_base_offset
, unsigned char,
333 pos
->offset
, integer_declaration
->len
,
334 integer_definition
->value
._signed
);
336 bt_bitfield_write_be(mmap_align_addr(pos
->base_mma
) +
337 pos
->mmap_base_offset
, unsigned char,
338 pos
->offset
, integer_declaration
->len
,
339 integer_definition
->value
._signed
);
342 if (!ctf_move_pos(pos
, integer_declaration
->len
))
This page took 0.035741 seconds and 4 git commands to generate.