Changeset 4f205248 in mainline for uspace/lib/c/generic/rtld/rtld.c


Ignore:
Timestamp:
2018-04-23T18:50:40Z (7 years ago)
Author:
Jiří Zárevúcky <jiri.zarevucky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a2eb85d
Parents:
8d58fca
git-author:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-04-23 17:47:09)
git-committer:
Jiří Zárevúcky <jiri.zarevucky@…> (2018-04-23 18:50:40)
Message:

Honor TLS alignment.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/rtld/rtld.c

    r8d58fca r4f205248  
    152152tcb_t *rtld_tls_make(rtld_t *rtld)
    153153{
    154         void *data;
    155154        tcb_t *tcb;
    156         size_t offset;
    157155        void **dtv;
    158156        size_t nmods;
    159157        size_t i;
    160158
    161         tcb = tls_alloc_arch(&data, rtld->tls_size);
     159        tcb = tls_alloc_arch(rtld->tls_size, rtld->tls_align);
    162160        if (tcb == NULL)
    163161                return NULL;
     
    182180         */
    183181
    184 #ifdef CONFIG_TLS_VARIANT_1
    185         /*
    186          * Ascending addresses
    187          */
    188         offset = 0;
    189182        i = 1;
    190183        list_foreach(rtld->imodules, imodules_link, module_t, m) {
    191                 assert(i == m->id);
    192                 assert(offset + m->tdata_size + m->tbss_size <= rtld->tls_size);
    193                 dtv[i++] = data + offset;
    194                 memcpy(data + offset, m->tdata, m->tdata_size);
    195                 offset += m->tdata_size;
    196                 memset(data + offset, 0, m->tbss_size);
    197                 offset += m->tbss_size;
    198         }
    199 #else /* CONFIG_TLS_VARIANT_2 */
    200         /*
    201          * Descending addresses
    202          */
    203         offset = 0;
    204         i = 1;
    205         list_foreach(rtld->imodules, imodules_link, module_t, m) {
    206                 assert(i == m->id);
    207                 assert(offset + m->tdata_size + m->tbss_size <= rtld->tls_size);
    208                 offset += m->tbss_size;
    209                 memset(data + rtld->tls_size - offset, 0, m->tbss_size);
    210                 offset += m->tdata_size;
    211                 memcpy(data + rtld->tls_size - offset, m->tdata, m->tdata_size);
    212                 dtv[i++] = data + rtld->tls_size - offset;
    213         }
    214 #endif
     184                assert(i++ == m->id);
     185
     186                dtv[m->id] = (void *) tcb + m->tpoff;
     187
     188                assert(((uintptr_t) dtv[m->id]) % m->tls_align == 0);
     189
     190                memcpy(dtv[m->id], m->tdata, m->tdata_size);
     191                memset(dtv[m->id] + m->tdata_size, 0, m->tbss_size);
     192        }
    215193
    216194        tcb->dtv = dtv;
     
    259237                assert(!link_used(&m->imodules_link));
    260238
    261                 tls_block = malloc(m->tdata_size + m->tbss_size);
     239                tls_block = memalign(m->tls_align, m->tdata_size + m->tbss_size);
    262240                /* XXX This can fail if OOM */
    263241                assert(tls_block != NULL);
Note: See TracChangeset for help on using the changeset viewer.