/******************************************************************************/
/* TODO support feature_1. hi 64 bits */
int ld_add_probes_by_feature(uint64_t to_enable_features_0,
+ uint64_t to_enable_features_1,
uint64_t to_disable_features_0,
+ uint64_t to_disable_features_1,
struct user_space_inst_t *us_inst,
struct msg_t **msg_reply_add,
struct msg_t **msg_reply_remove)
for (i = 0; i != feature_to_data_count; i++) {
f = feature_to_data[i];
LOGI("check feature %016X\n", f.feature_value);
- if ((f.feature_value & to_enable_features_0) == f.feature_value) {
+ if ((f.feature_value & to_enable_features_0) |
+ (f.feature_value & to_enable_features_1) == f.feature_value) {
+
+ int preload_probe_type = 0;
+
+ if ((f.feature_value & FL_FILE_API_ALWAYS_PROBING) ||
+ (f.feature_value & FL_MEMORY_ALLOC_ALWAYS_PROBING) ||
+ (f.feature_value & FL_NETWORK_API_ALWAYS_PROBING) ||
+ (f.feature_value & FL_OPENGL_API_ALWAYS_PROBING) ||
+ (f.feature_value & FL_OSP_UI_API_ALWAYS_PROBING))
+ preload_probe_type = 1;
buf[0] = '\0';
sizeof(buf));
LOGI("Set LD probes for %016LX <%s>\n", f.feature_value, &buf[0]);
- feature_add_lib_inst_list(f.feature_ld, &us_inst->ld_lib_inst_list);
+ feature_add_lib_inst_list(f.feature_ld, &us_inst->ld_lib_inst_list,
+ preload_probe_type);
}
}
sizeof(uint32_t); /* pointer order */
break;
case SWAP_LD_PROBE:
- size += sizeof(uint64_t); /* ld preload handler addr */
+ size += sizeof(uint64_t) + /* ld preload handler addr */
+ sizeof(char); /* ld probe type */
break;
case SWAP_WEBPROBE:
break;
uint64_t orig_addr;
uint8_t probe_type;
uint64_t handler_addr;
+ uint8_t preload_type;
} __attribute__ ((packed));
static int feature_add_func_inst_list(struct ld_lib_list_el_t ld_lib,
- struct data_list_t *dest)
+ struct data_list_t *dest, int preload_probe_type)
{
uint32_t i = 0, num = 0;
struct probe_list_t *probe_el;
func->orig_addr = ld_lib.probes[i].orig_addr;
func->probe_type = SWAP_LD_PROBE;
func->handler_addr = ld_lib.probes[i].handler_addr;
+ func->preload_type = preload_probe_type;
probe_el->size = sizeof(struct ld_preload_probe_t);
probe_el->func = (struct us_func_inst_plane_t *)func;
}
static int feature_add_inst_lib(struct ld_lib_list_el_t ld_lib,
- struct lib_list_t **dest)
+ struct lib_list_t **dest, int preload_probe_type)
{
*dest = new_lib();
if (*dest == NULL) {
(*dest)->lib->bin_path = strdup(ld_lib.lib_name);
- if (!feature_add_func_inst_list(ld_lib, (struct data_list_t *)*dest)) {
+ if (!feature_add_func_inst_list(ld_lib, (struct data_list_t *)*dest,
+ preload_probe_type)) {
LOGE("funcs parsing error\n");
return 0;
}
}
int feature_add_lib_inst_list(struct ld_feature_list_el_t *ld_lib_list,
- struct lib_list_t **lib_list)
+ struct lib_list_t **lib_list, int preload_probe_type)
{
uint32_t i = 0, num;
for (i = 0; i < num; i++) {
LOGI(">add lib #%d <%s> probes_count=%lu\n", i, ld_lib_list->libs[i].lib_name, ld_lib_list->libs[i].probe_count);
- if (!feature_add_inst_lib(ld_lib_list->libs[i], &lib)) {
+ if (!feature_add_inst_lib(ld_lib_list->libs[i], &lib,
+ preload_probe_type)) {
// TODO maybe need free allocated memory up there
LOGE("add LD lib #%d failed\n", i + 1);
return 0;
struct app_list_t **app_list);
int feature_add_lib_inst_list(struct ld_feature_list_el_t *ld_lib_list,
- struct lib_list_t **lib_list);
+ struct lib_list_t **lib_list, int preload_probe_type);
#endif /* __DA_PROTOCOL_INST__ */
static void reconfigure_ld_probes(struct conf_t conf, struct msg_t **msg_reply, struct msg_t **msg_reply_additional)
{
- uint64_t old_features = prof_session.conf.use_features0;
- uint64_t new_features = conf.use_features0;
- uint64_t to_enable = (new_features ^ old_features) & new_features;
- uint64_t to_disable = (new_features ^ old_features) & old_features;
- ld_add_probes_by_feature(to_enable, to_disable, &prof_session.user_space_inst, msg_reply, msg_reply_additional);
+ uint64_t old_features0 = prof_session.conf.use_features0;
+ uint64_t old_features1 = prof_session.conf.use_features1;
+ uint64_t new_features0 = conf.use_features0;
+ uint64_t new_features1 = conf.use_features1;
+ uint64_t to_enable0 = (new_features0 ^ old_features0) & new_features0;
+ uint64_t to_enable1 = (new_features1 ^ old_features1) & new_features1;
+ uint64_t to_disable0 = (new_features0 ^ old_features0) & old_features0;
+ uint64_t to_disable1 = (new_features1 ^ old_features1) & old_features1;
+ ld_add_probes_by_feature(to_enable0, to_enable1, to_disable0, to_disable1,
+ &prof_session.user_space_inst, msg_reply,
+ msg_reply_additional);
}
int reconfigure(struct conf_t conf, struct msg_t **msg_reply, struct msg_t **msg_reply_additional)