summaryrefslogtreecommitdiff
path: root/usr.sbin/btrace
diff options
context:
space:
mode:
authorJasper Lievisse Adriaanse <jasper@cvs.openbsd.org>2020-09-14 18:45:20 +0000
committerJasper Lievisse Adriaanse <jasper@cvs.openbsd.org>2020-09-14 18:45:20 +0000
commit71943a3335634db6ca980f9e0d0303452653999d (patch)
tree24255ea9e8b466aa8e90b2b6e63977cf99905b37 /usr.sbin/btrace
parent615c44e01091463bc4820459a47c2bf9a1d4f1ce (diff)
add support for '&' and '|' operators in btrace scripts
feedback from otto@ ok mpi@ kn@ semarie@
Diffstat (limited to 'usr.sbin/btrace')
-rw-r--r--usr.sbin/btrace/bt_parse.y12
-rw-r--r--usr.sbin/btrace/bt_parser.h4
-rw-r--r--usr.sbin/btrace/btrace.c16
3 files changed, 25 insertions, 7 deletions
diff --git a/usr.sbin/btrace/bt_parse.y b/usr.sbin/btrace/bt_parse.y
index 52962cd1ff0..6c73db4730d 100644
--- a/usr.sbin/btrace/bt_parse.y
+++ b/usr.sbin/btrace/bt_parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: bt_parse.y,v 1.16 2020/07/11 14:52:14 mpi Exp $ */
+/* $OpenBSD: bt_parse.y,v 1.17 2020/09/14 18:45:19 jasper Exp $ */
/*
* Copyright (c) 2019 - 2020 Martin Pieuchot <mpi@openbsd.org>
@@ -117,6 +117,8 @@ static int yylex(void);
%type <v.arg> expr vargs map mexpr term
%type <v.rtype> beginend
+%left '|'
+%left '&'
%left '+' '-'
%left '/' '*'
%%
@@ -172,6 +174,8 @@ term : '(' term ')' { $$ = $2; }
| term '-' term { $$ = ba_op('-', $1, $3); }
| term '/' term { $$ = ba_op('/', $1, $3); }
| term '*' term { $$ = ba_op('*', $1, $3); }
+ | term '&' term { $$ = ba_op('&', $1, $3); }
+ | term '|' term { $$ = ba_op('|', $1, $3); }
| NUMBER { $$ = ba_new($1, B_AT_LONG); }
| builtin { $$ = ba_new(NULL, $1); }
| gvar { $$ = bv_get($1); }
@@ -332,6 +336,12 @@ ba_op(const char op, struct bt_arg *da0, struct bt_arg *da1)
case '/':
type = B_AT_OP_DIVIDE;
break;
+ case '&':
+ type = B_AT_OP_AND;
+ break;
+ case '|':
+ type = B_AT_OP_OR;
+ break;
default:
assert(0);
}
diff --git a/usr.sbin/btrace/bt_parser.h b/usr.sbin/btrace/bt_parser.h
index f1c710a5071..cdde6eb6e4f 100644
--- a/usr.sbin/btrace/bt_parser.h
+++ b/usr.sbin/btrace/bt_parser.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: bt_parser.h,v 1.9 2020/08/13 11:29:39 mpi Exp $ */
+/* $OpenBSD: bt_parser.h,v 1.10 2020/09/14 18:45:19 jasper Exp $ */
/*
* Copyright (c) 2019-2020 Martin Pieuchot <mpi@openbsd.org>
@@ -143,6 +143,8 @@ struct bt_arg {
B_AT_OP_MINUS,
B_AT_OP_MULT,
B_AT_OP_DIVIDE,
+ B_AT_OP_AND,
+ B_AT_OP_OR,
} ba_type;
};
diff --git a/usr.sbin/btrace/btrace.c b/usr.sbin/btrace/btrace.c
index 3c7e44230cf..7b77ceb1366 100644
--- a/usr.sbin/btrace/btrace.c
+++ b/usr.sbin/btrace/btrace.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: btrace.c,v 1.24 2020/09/11 08:16:15 mpi Exp $ */
+/* $OpenBSD: btrace.c,v 1.25 2020/09/14 18:45:19 jasper Exp $ */
/*
* Copyright (c) 2019 - 2020 Martin Pieuchot <mpi@openbsd.org>
@@ -812,7 +812,7 @@ stmt_store(struct bt_stmt *bs, struct dt_evt *dtev)
case B_AT_BI_NSECS:
bv->bv_value = ba_new(builtin_nsecs(dtev), B_AT_LONG);
break;
- case B_AT_OP_ADD ... B_AT_OP_DIVIDE:
+ case B_AT_OP_ADD ... B_AT_OP_OR:
bv->bv_value = ba_new(ba2long(ba, dtev), B_AT_LONG);
break;
default:
@@ -992,6 +992,12 @@ baexpr2long(struct bt_arg *ba, struct dt_evt *dtev)
case B_AT_OP_DIVIDE:
result = first / second;
break;
+ case B_AT_OP_AND:
+ result = first & second;
+ break;
+ case B_AT_OP_OR:
+ result = first | second;
+ break;
default:
xabort("unsuported operation %d", ba->ba_type);
}
@@ -1025,7 +1031,7 @@ ba2long(struct bt_arg *ba, struct dt_evt *dtev)
case B_AT_BI_RETVAL:
val = dtev->dtev_sysretval[0];
break;
- case B_AT_OP_ADD ... B_AT_OP_DIVIDE:
+ case B_AT_OP_ADD ... B_AT_OP_OR:
val = baexpr2long(ba, dtev);
break;
default:
@@ -1093,7 +1099,7 @@ ba2str(struct bt_arg *ba, struct dt_evt *dtev)
case B_AT_VAR:
str = ba2str(ba_read(ba), dtev);
break;
- case B_AT_OP_ADD ... B_AT_OP_DIVIDE:
+ case B_AT_OP_ADD ... B_AT_OP_OR:
snprintf(buf, sizeof(buf) - 1, "%ld", ba2long(ba, dtev));
str = buf;
break;
@@ -1152,7 +1158,7 @@ ba2dtflags(struct bt_arg *ba)
case B_AT_MF_MAX:
case B_AT_MF_MIN:
case B_AT_MF_SUM:
- case B_AT_OP_ADD ... B_AT_OP_DIVIDE:
+ case B_AT_OP_ADD ... B_AT_OP_OR:
break;
default:
xabort("invalid argument type %d", ba->ba_type);