/* this function may be time consuming, move out from table set/get? */ ktap_str_t *kp_obj_kstack2str(ktap_state_t *ks, uint16_t depth, uint16_t skip) { struct stack_trace trace; unsigned long *bt; char *btstr, *p; int i; bt = kp_this_cpu_print_buffer(ks); /* use print percpu buffer */ trace.nr_entries = 0; trace.skip = skip; trace.max_entries = depth; trace.entries = (unsigned long *)(bt + 1); save_stack_trace(&trace); /* convert backtrace to string */ p = btstr = kp_this_cpu_temp_buffer(ks); for (i = 0; i < trace.nr_entries; i++) { unsigned long addr = trace.entries[i]; if (addr == ULONG_MAX) break; p += sprint_symbol(p, addr); *p++ = '\n'; } return kp_str_new(ks, btstr, p - btstr); }
static int kplib_execname(ktap_state *ks) { ktap_string *ts = kp_str_new(ks, current->comm); set_string(ks->top, ts); incr_top(ks); return 1; }
/** * Returns a string representation for an IP address */ static int kplib_format_ip_addr(ktap_state *ks) { char ipstr[32]; __be32 ip; kp_arg_check(ks, 1, KTAP_TYPE_NUMBER); ip = (__be32)nvalue(kp_arg(ks, 1)); snprintf(ipstr, 32, "%pI4", &ip); set_string(ks->top, kp_str_new(ks, ipstr)); incr_top(ks); return 1; }
static int kplib_user_string(ktap_state *ks) { unsigned long addr; char str[256] = {0}; int ret; kp_arg_check(ks, 1, KTAP_TYPE_NUMBER); addr = nvalue(kp_arg(ks, 1)); pagefault_disable(); ret = __copy_from_user_inatomic((void *)str, (const void *)addr, 256); (void) &ret; /* Silence compiler warning. */ pagefault_enable(); str[255] = '\0'; set_string(ks->top, kp_str_new(ks, str)); incr_top(ks); return 1; }
ktap_str_t *kp_str_newz(const char *str) { return kp_str_new(str, strlen(str)); }
ktap_str_t *kp_buf_str(SBuf *sb) { return kp_str_new(sbufB(sb), sbuflen(sb)); }
static int kplib_kernel_v(ktap_state *ks) { set_string(ks->top, kp_str_new(ks, utsname()->release)); incr_top(ks); return 1; }
static int kplib_arch(ktap_state *ks) { set_string(ks->top, kp_str_new(ks, utsname()->machine)); incr_top(ks); return 1; }