From: Ildar Muslukhov <ildarm@google.com>
To: trinity@vger.kernel.org, davej@redhat.com
Subject: [PATCH] add parameter to explicitly select 32 or 64 bit variant of syscalls
Date: Fri, 13 Sep 2013 15:30:58 -0700 [thread overview]
Message-ID: <52339222.2090403@google.com> (raw)
This patch enables explicit selection of 32 or 64 bit version of
syscall(s) via parameter.
Signed-off-by: Ildar Muslukhov <ildarm@google.com>
---
README | 4 +++-
include/params.h | 4 ++++
params.c | 22 ++++++++++++++++--
tables.c | 71
+++++++++++++++++++++++++++++++++++++++++++++++++++-----
4 files changed, 92 insertions(+), 9 deletions(-)
diff --git a/README b/README
index 3999c42..05a1ec3 100644
--- a/README
+++ b/README
@@ -100,7 +100,9 @@ tmp directory. (Handy for cleaning up any garbage
named files; just rm -rf tmp a
what maps got set up etc. Does make things go considerably
faster however,
as it no longer fsync()'s after every syscall
---ioctls/-I will dump all available ioctls.
+ --ioctls/-I will dump all available ioctls.
+
+ --arch/-a Explicit selection of 32 or 64 bit variant of system calls.
#######################################################################
diff --git a/include/params.h b/include/params.h
index 6fe7d29..53776bd 100644
--- a/include/params.h
+++ b/include/params.h
@@ -7,6 +7,10 @@
void parse_args(int argc, char *argv[]);
extern bool debug;
+
+extern bool do_32_arch;
+extern bool do_64_arch;
+
extern bool do_specific_syscall;
extern bool do_exclude_syscall;
extern unsigned int specific_proto;
diff --git a/params.c b/params.c
index e266c18..3c0ae0a 100644
--- a/params.c
+++ b/params.c
@@ -17,6 +17,9 @@ bool debug = FALSE;
bool do_specific_syscall = FALSE;
bool do_exclude_syscall = FALSE;
+bool do_32_arch = TRUE;
+bool do_64_arch = TRUE;
+
unsigned int specific_proto = 0;
unsigned int user_specified_children = 0;
@@ -60,8 +63,9 @@ static void usage(void)
fprintf(stderr, " --syslog,-S: log important info to syslog. (useful
if syslog is remote)\n");
fprintf(stderr, " --verbose,-v: increase output verbosity.\n");
fprintf(stderr, " --victims,-V: path to victim files.\n");
+ fprintf(stderr, " --arch, -a: selects syscalls for the specified
architecture (32 or 64). Both by default.");
fprintf(stderr, "\n");
- fprintf(stderr, " -c#: target specific syscall (takes syscall name as
parameter).\n");
+ fprintf(stderr, " -c#,@: target specific syscall (takes syscall name
as parameter and @ as architecture. No @ defaults to both archs.).\n");
fprintf(stderr, " -N#: do # syscalls then exit.\n");
fprintf(stderr, " -p: pause after syscall.\n");
fprintf(stderr, " -s#: use # as random seed.\n");
@@ -86,6 +90,7 @@ static const struct option longopts[] = {
{ "syslog", no_argument, NULL, 'S' },
{ "victims", required_argument, NULL, 'V' },
{ "verbose", no_argument, NULL, 'v' },
+ { "arch", required_argument, NULL, 'a' },
{ NULL, 0, NULL, 0 } };
@@ -93,7 +98,7 @@ void parse_args(int argc, char *argv[])
{
int opt;
- while ((opt = getopt_long(argc, argv,
"c:C:dDg:hIl:LN:mnP:pqr:s:SV:vx:", longopts, NULL)) != -1) {
+ while ((opt = getopt_long(argc, argv,
"a:c:C:dDg:hIl:LN:mnP:pqr:s:SV:vx:", longopts, NULL)) != -1) {
switch (opt) {
default:
if (opt == '?')
@@ -111,6 +116,19 @@ void parse_args(int argc, char *argv[])
toggle_syscall(optarg, TRUE);
break;
+ case 'a':
+ /* One of the architectures selected*/
+ do_32_arch = FALSE;
+ do_64_arch = FALSE;
+ if (strcmp(optarg, "64") == 0)
+ do_64_arch = TRUE;
+ else if (strcmp(optarg, "32") == 0)
+ do_32_arch = TRUE;
+ else
+ exit(EXIT_FAILURE);
+
+ break;
+
case 'C':
user_specified_children = strtoll(optarg, NULL, 10);
break;
diff --git a/tables.c b/tables.c
index 59969c3..2803ce8 100644
--- a/tables.c
+++ b/tables.c
@@ -281,34 +281,89 @@ void mark_all_syscalls_active(void)
}
}
+static void check_user_specified_arch(const char *arg, char **arg_name,
bool *only_64bit, bool *only_32bit)
+{
+ //Check if the arch is specified
+ char *arg_arch = strstr(arg,",");
+ unsigned long size = 0;
+
+ if (arg_arch != NULL) {
+ size = (unsigned long)arg_arch - (unsigned long)arg;
+ *arg_name = malloc(size + 1);
+ if (*arg_name == NULL)
+ exit(EXIT_FAILURE);
+ (*arg_name)[size] = 0;
+ memcpy(*arg_name, arg, size);
+
+ //identify architecture
+ if ((only_64bit != NULL) && (only_32bit != NULL)) {
+ if ((strcmp(arg_arch + 1, "64") == 0)) {
+ *only_64bit = TRUE;
+ *only_32bit = FALSE;
+ } else if ((strcmp(arg_arch + 1,"32") == 0)) {
+ *only_64bit = FALSE;
+ *only_32bit = TRUE;
+ } else {
+ printf("No idea what architecture for syscall (%s) is.\n", arg);
+ exit(EXIT_FAILURE);
+ }
+ }
+ } else {
+ *arg_name = (char*)arg;//castaway const.
+ }
+
+
+}
+
+static void clear_check_user_specified_arch(const char *arg, char
**arg_name)
+{
+ //Release memory only if we have allocated it
+ if (((char *)arg) != *arg_name) {
+ free(*arg_name);
+ *arg_name = NULL;
+ }
+}
+
static void toggle_syscall_biarch(const char *arg, unsigned char state)
{
int specific_syscall32 = 0;
int specific_syscall64 = 0;
+ char *arg_name = NULL;
+ bool only_32bit = TRUE;
+ bool only_64bit = TRUE;
- specific_syscall64 = search_syscall_table(syscalls_64bit,
max_nr_64bit_syscalls, arg);
+ check_user_specified_arch(arg, &arg_name, &only_64bit, &only_32bit);
+
+ specific_syscall64 = search_syscall_table(syscalls_64bit,
max_nr_64bit_syscalls, arg_name);
/* If we found a 64bit syscall, validate it. */
if (specific_syscall64 != -1) {
validate_specific_syscall(syscalls_64bit, specific_syscall64);
- if (state == TRUE)
+ if ((state == TRUE) && only_64bit && do_64_arch)
syscalls_64bit[specific_syscall64].entry->flags |= ACTIVE;
else
syscalls_64bit[specific_syscall64].entry->flags |= TO_BE_DEACTIVATED;
}
/* Search for and validate 32bit */
- specific_syscall32 = search_syscall_table(syscalls_32bit,
max_nr_32bit_syscalls, arg);
+ specific_syscall32 = search_syscall_table(syscalls_32bit,
max_nr_32bit_syscalls, arg_name);
if (specific_syscall32 != -1) {
validate_specific_syscall(syscalls_32bit, specific_syscall32);
- if (state == TRUE)
+ if ((state == TRUE) && only_32bit && do_32_arch)
syscalls_32bit[specific_syscall32].entry->flags |= ACTIVE;
else
syscalls_32bit[specific_syscall32].entry->flags |= TO_BE_DEACTIVATED;
}
+ clear_check_user_specified_arch(arg, &arg_name);
+
+ if ((!only_32bit) && (!only_64bit)) {
+ printf("No idea what architecture for syscall (%s) is.\n", arg);
+ exit(EXIT_FAILURE);
+ }
+
if ((specific_syscall64 == -1) && (specific_syscall32 == -1)) {
printf("No idea what syscall (%s) is.\n", arg);
exit(EXIT_FAILURE);
@@ -340,6 +395,7 @@ static void toggle_syscall_biarch(const char *arg,
unsigned char state)
void toggle_syscall(const char *arg, unsigned char state)
{
int specific_syscall = 0;
+ char * arg_name = NULL;
if (biarch == TRUE) {
toggle_syscall_biarch(arg, state);
@@ -347,9 +403,12 @@ void toggle_syscall(const char *arg, unsigned char
state)
}
/* non-biarch case. */
- specific_syscall = search_syscall_table(syscalls, max_nr_syscalls, arg);
+ check_user_specified_arch(arg, &arg_name, NULL, NULL); //We do not
care about arch here, just to get rid of arg flags.
+ specific_syscall = search_syscall_table(syscalls, max_nr_syscalls,
arg_name);
+ clear_check_user_specified_arch(arg, &arg_name);
+
if (specific_syscall == -1) {
- printf("No idea what syscall (%s) is.\n", arg);
+ printf("No idea what syscall (%s) is.\n", arg_name);
exit(EXIT_FAILURE);
}
--
1.8.4
next reply other threads:[~2013-09-13 22:30 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-13 22:30 Ildar Muslukhov [this message]
2013-09-16 18:14 ` [PATCH] add parameter to explicitly select 32 or 64 bit variant of syscalls Dave Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52339222.2090403@google.com \
--to=ildarm@google.com \
--cc=davej@redhat.com \
--cc=trinity@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.