|
@@ -356,17 +356,14 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t,
|
|
|
|
|
|
/* Recursive argument parser */
|
|
/* Recursive argument parser */
|
|
static int parse_probe_arg(char *arg, const struct fetch_type *t,
|
|
static int parse_probe_arg(char *arg, const struct fetch_type *t,
|
|
- struct fetch_param *f, bool is_return, bool is_kprobe)
|
|
|
|
|
|
+ struct fetch_param *f, bool is_return, bool is_kprobe,
|
|
|
|
+ const struct fetch_type *ftbl)
|
|
{
|
|
{
|
|
- const struct fetch_type *ftbl;
|
|
|
|
unsigned long param;
|
|
unsigned long param;
|
|
long offset;
|
|
long offset;
|
|
char *tmp;
|
|
char *tmp;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
|
|
|
|
- ftbl = is_kprobe ? kprobes_fetch_type_table : uprobes_fetch_type_table;
|
|
|
|
- BUG_ON(ftbl == NULL);
|
|
|
|
-
|
|
|
|
switch (arg[0]) {
|
|
switch (arg[0]) {
|
|
case '$':
|
|
case '$':
|
|
ret = parse_probe_vars(arg + 1, t, f, is_return, is_kprobe);
|
|
ret = parse_probe_vars(arg + 1, t, f, is_return, is_kprobe);
|
|
@@ -447,7 +444,7 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t,
|
|
dprm->fetch_size = get_fetch_size_function(t,
|
|
dprm->fetch_size = get_fetch_size_function(t,
|
|
dprm->fetch, ftbl);
|
|
dprm->fetch, ftbl);
|
|
ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
|
|
ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
|
|
- is_kprobe);
|
|
|
|
|
|
+ is_kprobe, ftbl);
|
|
if (ret)
|
|
if (ret)
|
|
kfree(dprm);
|
|
kfree(dprm);
|
|
else {
|
|
else {
|
|
@@ -505,15 +502,12 @@ static int __parse_bitfield_probe_arg(const char *bf,
|
|
|
|
|
|
/* String length checking wrapper */
|
|
/* String length checking wrapper */
|
|
int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
|
|
int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
|
|
- struct probe_arg *parg, bool is_return, bool is_kprobe)
|
|
|
|
|
|
+ struct probe_arg *parg, bool is_return, bool is_kprobe,
|
|
|
|
+ const struct fetch_type *ftbl)
|
|
{
|
|
{
|
|
- const struct fetch_type *ftbl;
|
|
|
|
const char *t;
|
|
const char *t;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- ftbl = is_kprobe ? kprobes_fetch_type_table : uprobes_fetch_type_table;
|
|
|
|
- BUG_ON(ftbl == NULL);
|
|
|
|
-
|
|
|
|
if (strlen(arg) > MAX_ARGSTR_LEN) {
|
|
if (strlen(arg) > MAX_ARGSTR_LEN) {
|
|
pr_info("Argument is too long.: %s\n", arg);
|
|
pr_info("Argument is too long.: %s\n", arg);
|
|
return -ENOSPC;
|
|
return -ENOSPC;
|
|
@@ -535,7 +529,8 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
|
|
}
|
|
}
|
|
parg->offset = *size;
|
|
parg->offset = *size;
|
|
*size += parg->type->size;
|
|
*size += parg->type->size;
|
|
- ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return, is_kprobe);
|
|
|
|
|
|
+ ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return,
|
|
|
|
+ is_kprobe, ftbl);
|
|
|
|
|
|
if (ret >= 0 && t != NULL)
|
|
if (ret >= 0 && t != NULL)
|
|
ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch);
|
|
ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch);
|