td_err_e td_ta_tsd_iter (const td_thragent_t *ta_arg, td_key_iter_f *callback, void *cbdata_p) { td_thragent_t *const ta = (td_thragent_t *) ta_arg; td_err_e err; void *keys; size_t keys_nb, keys_elemsize; psaddr_t addr; uint32_t idx; LOG ("td_ta_tsd_iter"); /* Test whether the TA parameter is ok. */ if (! ta_ok (ta)) return TD_BADTA; /* This makes sure we have the size information on hand. */ addr = 0; err = _td_locate_field (ta, ta->ta_var___pthread_keys, SYM_DESC___pthread_keys, (psaddr_t) 0 + 1, &addr); if (err != TD_OK) return err; /* Now copy in the entire array of key descriptors. */ keys_elemsize = (addr - (psaddr_t) 0) / 8; keys_nb = keys_elemsize * DB_DESC_NELEM (ta->ta_var___pthread_keys); keys = __alloca (keys_nb); err = DB_GET_SYMBOL (addr, ta, __pthread_keys); if (err != TD_OK) return err; if (ps_pdread (ta->ph, addr, keys, keys_nb) != PS_OK) return TD_ERR; /* Now get all descriptors, one after the other. */ for (idx = 0; idx < DB_DESC_NELEM (ta->ta_var___pthread_keys); ++idx) { psaddr_t seq, destr; err = DB_GET_FIELD_LOCAL (seq, ta, keys, pthread_key_struct, seq, 0); if (err != TD_OK) return err; if (((uintptr_t) seq) & 1) { err = DB_GET_FIELD_LOCAL (destr, ta, keys, pthread_key_struct, destr, 0); if (err != TD_OK) return err; /* Return with an error if the callback returns a nonzero value. */ if (callback ((thread_key_t) idx, destr, cbdata_p) != 0) return TD_DBERR; } /* Advance to the next element in the copied array. */ keys += keys_elemsize; } return TD_OK; }
td_err_e _td_fetch_value (td_thragent_t *ta, db_desc_t desc, int descriptor_name, psaddr_t idx, psaddr_t address, psaddr_t *result) { ps_err_e err; td_err_e terr = _td_locate_field (ta, desc, descriptor_name, idx, &address); if (terr != TD_OK) return terr; if (DB_DESC_SIZE (desc) == 8 || DB_DESC_SIZE (desc) == bswap_32 (8)) { uint8_t value; err = ps_pdread (ta->ph, address, &value, sizeof value); *result = (psaddr_t) 0 + value; } else if (DB_DESC_SIZE (desc) == 32) { uint32_t value; err = ps_pdread (ta->ph, address, &value, sizeof value); *result = (psaddr_t) 0 + value; } else if (DB_DESC_SIZE (desc) == 64) { uint64_t value; if (sizeof (psaddr_t) < 8) return TD_NOCAPAB; err = ps_pdread (ta->ph, address, &value, sizeof value); *result = (psaddr_t) 0 + value; } else if (DB_DESC_SIZE (desc) == bswap_32 (32)) { uint32_t value; err = ps_pdread (ta->ph, address, &value, sizeof value); value = bswap_32 (value); *result = (psaddr_t) 0 + value; } else if (DB_DESC_SIZE (desc) == bswap_32 (64)) { uint64_t value; if (sizeof (psaddr_t) < 8) return TD_NOCAPAB; err = ps_pdread (ta->ph, address, &value, sizeof value); value = bswap_64 (value); *result = (psaddr_t) 0 + value; } else return TD_DBERR; return err == PS_OK ? TD_OK : TD_ERR; }
td_err_e _td_fetch_value_local (td_thragent_t *ta, db_desc_t desc, int descriptor_name, psaddr_t idx, void *address, psaddr_t *result) { td_err_e terr = _td_locate_field (ta, desc, descriptor_name, idx, &address); if (terr != TD_OK) return terr; if (DB_DESC_SIZE (desc) == 8 || DB_DESC_SIZE (desc) == bswap_32 (8)) { uint8_t value; memcpy (&value, address, sizeof value); *result = (psaddr_t) 0 + value; } else if (DB_DESC_SIZE (desc) == 32) { uint32_t value; memcpy (&value, address, sizeof value); *result = (psaddr_t) 0 + value; } else if (DB_DESC_SIZE (desc) == 64) { uint64_t value; if (sizeof (psaddr_t) < 8) return TD_NOCAPAB; memcpy (&value, address, sizeof value); *result = (psaddr_t) 0 + value; } else if (DB_DESC_SIZE (desc) == bswap_32 (32)) { uint32_t value; memcpy (&value, address, sizeof value); value = bswap_32 (value); *result = (psaddr_t) 0 + value; } else if (DB_DESC_SIZE (desc) == bswap_32 (64)) { uint64_t value; if (sizeof (psaddr_t) < 8) return TD_NOCAPAB; memcpy (&value, address, sizeof value); value = bswap_64 (value); *result = (psaddr_t) 0 + value; } else return TD_DBERR; return TD_OK; }
td_err_e _td_store_value (td_thragent_t *ta, uint32_t desc[2], int descriptor_name, psaddr_t idx, psaddr_t address, psaddr_t widened_value) { ps_err_e err; td_err_e terr = _td_locate_field (ta, desc, descriptor_name, idx, &address); if (terr != TD_OK) return terr; if (DB_DESC_SIZE (desc) == 8 || DB_DESC_SIZE (desc) == bswap_32 (8)) { uint8_t value = widened_value - (psaddr_t) 0; err = ps_pdwrite (ta->ph, address, &value, sizeof value); } else if (DB_DESC_SIZE (desc) == 32) { uint32_t value = widened_value - (psaddr_t) 0; err = ps_pdwrite (ta->ph, address, &value, sizeof value); } else if (DB_DESC_SIZE (desc) == 64) { uint64_t value = widened_value - (psaddr_t) 0; if (sizeof (psaddr_t) < 8) return TD_NOCAPAB; err = ps_pdwrite (ta->ph, address, &value, sizeof value); } else if (DB_DESC_SIZE (desc) == bswap_32 (32)) { uint32_t value = widened_value - (psaddr_t) 0; value = bswap_32 (value); err = ps_pdwrite (ta->ph, address, &value, sizeof value); } else if (DB_DESC_SIZE (desc) == bswap_32 (64)) { uint64_t value = widened_value - (psaddr_t) 0; if (sizeof (psaddr_t) < 8) return TD_NOCAPAB; value = bswap_64 (value); err = ps_pdwrite (ta->ph, address, &value, sizeof value); } else return TD_DBERR; return err == PS_OK ? TD_OK : TD_ERR; }
td_err_e _td_store_value_local (td_thragent_t *ta, uint32_t desc[2], int descriptor_name, psaddr_t idx, void *address, psaddr_t widened_value) { td_err_e terr = _td_locate_field (ta, desc, descriptor_name, idx, &address); if (terr != TD_OK) return terr; if (DB_DESC_SIZE (desc) == 8 || DB_DESC_SIZE (desc) == bswap_32 (8)) { uint8_t value = widened_value - (psaddr_t) 0; memcpy (address, &value, sizeof value); } else if (DB_DESC_SIZE (desc) == 32) { uint32_t value = widened_value - (psaddr_t) 0; memcpy (address, &value, sizeof value); } else if (DB_DESC_SIZE (desc) == 64) { uint64_t value = widened_value - (psaddr_t) 0; if (sizeof (psaddr_t) < 8) return TD_NOCAPAB; memcpy (address, &value, sizeof value); } else if (DB_DESC_SIZE (desc) == bswap_32 (32)) { uint32_t value = widened_value - (psaddr_t) 0; value = bswap_32 (value); memcpy (address, &value, sizeof value); } else if (DB_DESC_SIZE (desc) == bswap_32 (64)) { uint64_t value = widened_value - (psaddr_t) 0; if (sizeof (psaddr_t) < 8) return TD_NOCAPAB; value = bswap_64 (value); memcpy (address, &value, sizeof value); } else return TD_DBERR; return TD_OK; }