blob: 55c2c310cf7d67637a095530e2b03e8516875d9a [file] [log] [blame]
Ryan Prichard45d13492019-01-03 02:51:30 -08001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in
12 * the documentation and/or other materials provided with the
13 * distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#include "private/bionic_elf_tls.h"
30
31#include <sys/param.h>
32
33#include "private/bionic_macros.h"
34#include "private/bionic_tls.h"
35
36void StaticTlsLayout::reserve_tcb() {
37 offset_bionic_tcb_ = reserve_type<bionic_tcb>();
38}
39
40void StaticTlsLayout::reserve_bionic_tls() {
41 offset_bionic_tls_ = reserve_type<bionic_tls>();
42}
43
44void StaticTlsLayout::finish_layout() {
45 // Round the offset up to the alignment.
46 offset_ = round_up_with_overflow_check(offset_, alignment_);
47}
48
49// The size is not required to be a multiple of the alignment. The alignment
50// must be a positive power-of-two.
51size_t StaticTlsLayout::reserve(size_t size, size_t alignment) {
52 offset_ = round_up_with_overflow_check(offset_, alignment);
53 const size_t result = offset_;
54 if (__builtin_add_overflow(offset_, size, &offset_)) overflowed_ = true;
55 alignment_ = MAX(alignment_, alignment);
56 return result;
57}
58
59size_t StaticTlsLayout::round_up_with_overflow_check(size_t value, size_t alignment) {
60 const size_t old_value = value;
61 value = __BIONIC_ALIGN(value, alignment);
62 if (value < old_value) overflowed_ = true;
63 return value;
64}