Changeset 4f205248 in mainline for uspace/lib/c/generic/rtld/rtld.c
- Timestamp:
- 2018-04-23T18:50:40Z (7 years ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/rtld/rtld.c
r8d58fca r4f205248 152 152 tcb_t *rtld_tls_make(rtld_t *rtld) 153 153 { 154 void *data;155 154 tcb_t *tcb; 156 size_t offset;157 155 void **dtv; 158 156 size_t nmods; 159 157 size_t i; 160 158 161 tcb = tls_alloc_arch( &data, rtld->tls_size);159 tcb = tls_alloc_arch(rtld->tls_size, rtld->tls_align); 162 160 if (tcb == NULL) 163 161 return NULL; … … 182 180 */ 183 181 184 #ifdef CONFIG_TLS_VARIANT_1185 /*186 * Ascending addresses187 */188 offset = 0;189 182 i = 1; 190 183 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 } 215 193 216 194 tcb->dtv = dtv; … … 259 237 assert(!link_used(&m->imodules_link)); 260 238 261 tls_block = m alloc(m->tdata_size + m->tbss_size);239 tls_block = memalign(m->tls_align, m->tdata_size + m->tbss_size); 262 240 /* XXX This can fail if OOM */ 263 241 assert(tls_block != NULL);
Note:
See TracChangeset
for help on using the changeset viewer.