예제 #1
0
파일: cdata.c 프로젝트: ktap/ktap
void kp_cdata_ptr_get(ktap_state_t *ks, ktap_cdata_t *cd,
		      ktap_val_t *key, ktap_val_t *val)
{
	ktap_number idx;
	csymbol *cs;
	size_t size;
	char *addr;
	csymbol_id cs_id;

	if (!is_number(key)) {
		kp_error(ks, "array index should be number\n");
		return;
	}
	idx = nvalue(key);
	if (unlikely(idx < 0 || (cd_ptr_nmemb(cd) >= 0
					&& idx >= cd_ptr_nmemb(cd)))) {
		kp_error(ks, "array index out of bound\n");
		return;
	}

	cs_id = csym_ptr_deref_id(cd_csym(ks, cd));
	cs = id_to_csym(ks, cs_id);
	size = csym_size(ks, cs);
	addr = cd_ptr(cd);
	addr += size * idx;

	kp_cdata_init(ks, val, addr, -1, cs_id);
	kp_cdata_pack(ks, val, addr, cs);
}
예제 #2
0
파일: dump.c 프로젝트: WinLinKer/ktap
/* this is a debug function used for check csymbol array */
void ktapc_dump_csymbols()
{
	int i, j, cs_nr;
	cp_csymbol_state *cs_state;
	csymbol *cs, *cs_arr;
	csymbol_func *csf;
	csymbol_struct *csst;

	cs_state = ctype_get_csym_state();
	cs_arr = cs_state->cs_arr;
	cs_nr = cs_state->cs_nr;

	printf("\n----------------------------------------------------\n");
	printf("Number of csymbols: %d\n", cs_nr);

	for (i = 0; i < cs_nr; i++) {
		cs = &cs_arr[i];
		printf("%dth symbol", i);
		ktapc_dump_csymbol_id("", i);
		switch (cs->type) {
		case FFI_PTR:
			ktapc_dump_csymbol_id("\tDeref", csym_ptr_deref_id(cs));
			break;
		case FFI_FUNC:
			csf = csym_func(cs);
			printf("\tAddress: 0x%p\n", csf->addr);
			ktapc_dump_csymbol_id("\tReturn", csf->ret_id);
			printf("\tArg number: %d\n", csf->arg_nr);
			for (j = 0; j < csf->arg_nr; j++)
				ktapc_dump_csymbol_id("\t\tArg", csf->arg_ids[j]);
			printf("\tHas variable arg: %d\n", csf->has_var_arg);
			break;
		case FFI_STRUCT:
		case FFI_UNION:
			csst = csym_struct(cs);
			printf("\tMember number: %d\n", csst->memb_nr);
			for (j = 0; j < csst->memb_nr; j++) {
				printf("\t\tMember %s", csst->members[j].name);
				if (csst->members[j].len >= 0)
					printf("(len %d)", csst->members[j].len);
				ktapc_dump_csymbol_id("", csst->members[j].id);
			}
			break;
		default:
			break;
		}
	}
}
예제 #3
0
파일: cdata.c 프로젝트: ktap/ktap
/* argument nmemb here indicates the length of array that is pointed to,
 * -1 for unknown */
ktap_cdata_t *kp_cdata_new_ptr(ktap_state_t *ks, void *addr,
			     int nmemb, csymbol_id id, int to_allocate)
{
	ktap_cdata_t *cd;
	size_t memb_size;
	csymbol_id deref_id;

	cd = kp_cdata_new(ks, id);

	if (to_allocate) {
		/* allocate new empty space */
		deref_id = csym_ptr_deref_id(id_to_csym(ks, id));
		memb_size = csym_size(ks, id_to_csym(ks, deref_id));
		cd_ptr(cd) = kp_rawobj_alloc(ks, memb_size * nmemb);
	} else {
		cd_ptr(cd) = addr;
	}

	cd_ptr_nmemb(cd) = nmemb;

	return cd;
}