util: Allow overriding the magic address in the m5 utility.
This is useful in situations where the address is hard to know ahead of time, for instance on ARM systems where the address map is hard to predict. The default address is now M5OP_ADDR, or 0 if that's not defined. Change-Id: I3140e05b04365c1a76e52f8c3dc85f472c230ae4 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27244 Maintainer: Gabe Black <gabeblack@google.com> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
This commit is contained in:
@@ -28,6 +28,8 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "addr_call_type.h"
|
||||
#include "args.h"
|
||||
#include "m5_mmap.h"
|
||||
|
||||
#define M5OP(name, func) __typeof__(name) M5OP_MERGE_TOKENS(name, _addr);
|
||||
M5OP_FOREACH
|
||||
@@ -42,9 +44,40 @@ M5OP_FOREACH
|
||||
int
|
||||
addr_call_type_detect(int *argc, char **argv[])
|
||||
{
|
||||
if (*argc > 0 && strcmp((*argv)[0], "--addr") == 0) {
|
||||
static const char *prefix = "--addr";
|
||||
const size_t prefix_len = strlen(prefix);
|
||||
uint64_t addr_override;
|
||||
|
||||
// If the first argument starts with --addr...
|
||||
if (*argc > 0 && memcmp((*argv)[0], prefix, prefix_len) == 0) {
|
||||
char *argv0 = (*argv)[0];
|
||||
(*argc)--;
|
||||
(*argv)++;
|
||||
|
||||
// If there's more text in this argument...
|
||||
if (strlen(argv0) != prefix_len) {
|
||||
// If it doesn't start with '=', it's malformed.
|
||||
if (argv0[prefix_len] != '=')
|
||||
return -1;
|
||||
// Attempt to extract an address after the '='.
|
||||
char *temp_argv[] = { &argv0[prefix_len + 1] };
|
||||
if (!parse_int_args(1, temp_argv, &addr_override, 1))
|
||||
return -1;
|
||||
// If we found an address, use it to override m5op_addr.
|
||||
m5op_addr = addr_override;
|
||||
return 1;
|
||||
}
|
||||
// If an address override wasn't part of the first argument, check if
|
||||
// it's the second argument. If not, then there's no override.
|
||||
if (*argc > 0 && parse_int_args(1, *argv, &addr_override, 1)) {
|
||||
m5op_addr = addr_override;
|
||||
(*argc)--;
|
||||
(*argv)++;
|
||||
return 1;
|
||||
}
|
||||
// If the default address was zero, an override is required.
|
||||
if (!m5op_addr)
|
||||
return -1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
#include "dispatch_table.h"
|
||||
|
||||
// Returns 0 if not detected, 1 if detected successfully, and -1 on error.
|
||||
int addr_call_type_detect(int *argc, char **argv[]);
|
||||
DispatchTable *addr_call_type_init();
|
||||
|
||||
|
||||
@@ -290,10 +290,16 @@ usage()
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "Call types:\n");
|
||||
# if ENABLE_CT_addr
|
||||
fprintf(stderr, " --addr%s\n", DEFAULT_CT_addr ? " (default)" : "");
|
||||
fprintf(stderr, " --addr %s%s\n",
|
||||
# if defined(M5OP_ADDR)
|
||||
"[address override]",
|
||||
# else
|
||||
"<address override>",
|
||||
# endif
|
||||
DEFAULT_CT_addr ? " (default)" : "");
|
||||
fprintf(stderr, " Use the address based invocation method.\n");
|
||||
# if defined(M5OP_ADDR)
|
||||
fprintf(stderr, " The address is %#"PRIx64".\n",
|
||||
fprintf(stderr, " The default address is %#"PRIx64".\n",
|
||||
(uint64_t)M5OP_ADDR);
|
||||
# endif
|
||||
# endif
|
||||
@@ -331,8 +337,12 @@ main(int argc, char *argv[])
|
||||
}
|
||||
# endif
|
||||
# if ENABLE_CT_addr
|
||||
if (!dt && addr_call_type_detect(&argc, &argv)) {
|
||||
dt = addr_call_type_init();
|
||||
if (!dt) {
|
||||
int detect = addr_call_type_detect(&argc, &argv);
|
||||
if (detect < 0)
|
||||
usage();
|
||||
if (detect > 0)
|
||||
dt = addr_call_type_init();
|
||||
}
|
||||
# endif
|
||||
# if ENABLE_CT_semi
|
||||
|
||||
@@ -49,10 +49,14 @@
|
||||
|
||||
void *m5_mem = NULL;
|
||||
|
||||
#ifndef M5OP_ADDR
|
||||
#define M5OP_ADDR 0
|
||||
#endif
|
||||
uint64_t m5op_addr = M5OP_ADDR;
|
||||
|
||||
void
|
||||
map_m5_mem()
|
||||
{
|
||||
#ifdef M5OP_ADDR
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/mem", O_RDWR | O_SYNC);
|
||||
@@ -62,10 +66,9 @@ map_m5_mem()
|
||||
}
|
||||
|
||||
m5_mem = mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
|
||||
M5OP_ADDR);
|
||||
m5op_addr);
|
||||
if (!m5_mem) {
|
||||
perror("Can't mmap /dev/mem");
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -42,9 +42,11 @@
|
||||
#define __UTIL_M5_MMAP_H__
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
extern void *m5_mem;
|
||||
extern uint64_t m5op_addr;
|
||||
|
||||
void map_m5_mem();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user