@@ -46,8 +46,7 @@ gzFile gz_trace_file;
sigjmp_buf jmpbuf;
-/* Should we test for FP exception status bits? */
-int test_fp_exc;
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
/* Master functions */
@@ -283,6 +282,9 @@ void usage(void)
fprintf(stderr,
" -p, --port=PORT Specify the port to connect to/listen on "
"(default 9191)\n");
+ if (arch_extra_help) {
+ fprintf(stderr, "%s", arch_extra_help);
+ }
}
struct option * setup_options(char **short_opts)
@@ -293,12 +295,31 @@ struct option * setup_options(char **short_opts)
{"host", required_argument, 0, 'h'},
{"port", required_argument, 0, 'p'},
{"trace", required_argument, 0, 't'},
- {"test-fp-exc", no_argument, &test_fp_exc, 1},
{0, 0, 0, 0}
};
+ struct option *lopts = &default_longopts[0];
*short_opts = "h:p:t:";
- return default_longopts;
+
+ if (arch_long_opts) {
+ const size_t osize = sizeof(struct option);
+ const int default_count = ARRAY_SIZE(default_longopts);
+ struct option *dptr;
+ int extra_count = 0;
+
+ /* count additional opts */
+ dptr = arch_long_opts;
+ do {} while (dptr[extra_count++].name);
+
+ lopts = calloc(default_count + extra_count, osize);
+
+ /* Copy default opts + extra opts */
+ memcpy(lopts, default_longopts, default_count * osize);
+ dptr = &lopts[default_count - 1];
+ memcpy(dptr, arch_long_opts, extra_count * osize);
+ }
+
+ return lopts;
}
int main(int argc, char **argv)
@@ -17,6 +17,10 @@
#include <ucontext.h>
#include <stdio.h>
+/* Extra option processing for architectures */
+extern void *arch_long_opts;
+extern char *arch_extra_help;
+
/* GCC computed include to pull in the correct risu_reginfo_*.h for
* the architecture.
*/
@@ -36,8 +40,6 @@ void send_response_byte(int sock, int resp);
extern uintptr_t image_start_address;
extern void *memblock;
-extern int test_fp_exc;
-
/* Ops code under test can request from risu: */
#define OP_COMPARE 0
#define OP_TESTEND 1
@@ -18,6 +18,9 @@
#include "risu.h"
#include "risu_reginfo_aarch64.h"
+void *arch_long_opts;
+char *arch_extra_help;
+
/* reginfo_init: initialize with a ucontext */
void reginfo_init(struct reginfo *ri, ucontext_t *uc)
{
@@ -13,12 +13,23 @@
#include <stdio.h>
#include <ucontext.h>
#include <string.h>
+#include <getopt.h>
#include "risu.h"
#include "risu_reginfo_arm.h"
extern int insnsize(ucontext_t *uc);
+/* Should we test for FP exception status bits? */
+static int test_fp_exc;
+static struct option extra_opts[] = {
+ {"test-fp-exc", no_argument, &test_fp_exc, 1},
+ {0, 0, 0, 0}
+};
+
+void *arch_long_opts = &extra_opts[0];
+char *arch_extra_help = " --test-fp-exc Check FP exception bits when comparing\n";
+
static void reginfo_init_vfp(struct reginfo *ri, ucontext_t *uc)
{
/* Read VFP registers. These live in uc->uc_regspace, which is
@@ -14,6 +14,9 @@
#include "risu.h"
#include "risu_reginfo_m68k.h"
+void *arch_long_opts;
+char *arch_extra_help;
+
/* reginfo_init: initialize with a ucontext */
void reginfo_init(struct reginfo *ri, ucontext_t *uc)
{
@@ -22,6 +22,9 @@
#define XER 37
#define CCR 38
+void *arch_long_opts;
+char *arch_extra_help;
+
/* reginfo_init: initialize with a ucontext */
void reginfo_init(struct reginfo *ri, ucontext_t *uc)
{