util: Pull argument parsing functions out of m5.c.
Make them available in other files as well. Change-Id: I3ddaed1a06023f929acc95c90f8f9adda7ff429c Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27243 Maintainer: Gabe Black <gabeblack@google.com> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Pouya Fotouhi <pfotouhi@ucdavis.edu>
This commit is contained in:
@@ -29,6 +29,7 @@ Import('*')
|
||||
|
||||
# Raw source files.
|
||||
m5_mmap = 'm5_mmap.c'
|
||||
args = 'args.c'
|
||||
m5 = 'm5.c'
|
||||
jni = 'jni_gem5Op.c'
|
||||
lua = 'lua_gem5Op.c'
|
||||
@@ -63,7 +64,8 @@ libm5 = static_env.StaticLibrary('out/m5', [ m5_mmap ] + m5ops)
|
||||
# The m5 stand alone command line utility.
|
||||
#
|
||||
ct_support = list([ File('%s_call_type.c' % ct.name) for ct in call_types ])
|
||||
m5_bin = static_env.Program('out/m5', ct_support + [ m5, m5_mmap, libm5 ])
|
||||
m5_bin = static_env.Program('out/m5',
|
||||
ct_support + [ args, m5, m5_mmap, libm5 ])
|
||||
|
||||
|
||||
# The shared version of the m5 op call sights, used by mutliple targets below.
|
||||
|
||||
86
util/m5/src/args.c
Normal file
86
util/m5/src/args.c
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2017 ARM Limited
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
* not be construed as granting a license to any other intellectual
|
||||
* property including but not limited to intellectual property relating
|
||||
* to a hardware implementation of the functionality of the software
|
||||
* licensed hereunder. You may use the software subject to the license
|
||||
* terms below provided that you ensure that this notice is replicated
|
||||
* unmodified and in its entirety in all distributions of the software,
|
||||
* modified or unmodified, in source code or in binary form.
|
||||
*
|
||||
* Copyright (c) 2003-2005 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int
|
||||
parse_int_args(int argc, char *argv[], uint64_t ints[], int len)
|
||||
{
|
||||
if (argc > len)
|
||||
return 0;
|
||||
|
||||
// On 32 bit platforms we need to use strtoull to do the conversion
|
||||
#ifdef __LP64__
|
||||
#define strto64 strtoul
|
||||
#else
|
||||
#define strto64 strtoull
|
||||
#endif
|
||||
int i;
|
||||
for (i = 0; i < len; ++i)
|
||||
ints[i] = (i < argc) ? strto64(argv[i], NULL, 0) : 0;
|
||||
|
||||
#undef strto64
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
pack_str_into_regs(const char *str, uint64_t regs[], int num_regs)
|
||||
{
|
||||
const size_t RegSize = sizeof(regs[0]);
|
||||
const size_t MaxLen = num_regs * RegSize;
|
||||
|
||||
size_t len = strlen(str);
|
||||
|
||||
if (len > MaxLen)
|
||||
return 0;
|
||||
|
||||
memset(regs, 0, MaxLen);
|
||||
|
||||
while (len) {
|
||||
for (int offset = 0; offset < RegSize && len; offset++, len--) {
|
||||
int shift = offset * 8;
|
||||
*regs |= (uint64_t)(uint8_t)*str++ << shift;
|
||||
}
|
||||
regs++;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
49
util/m5/src/args.h
Normal file
49
util/m5/src/args.h
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2017 ARM Limited
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
* not be construed as granting a license to any other intellectual
|
||||
* property including but not limited to intellectual property relating
|
||||
* to a hardware implementation of the functionality of the software
|
||||
* licensed hereunder. You may use the software subject to the license
|
||||
* terms below provided that you ensure that this notice is replicated
|
||||
* unmodified and in its entirety in all distributions of the software,
|
||||
* modified or unmodified, in source code or in binary form.
|
||||
*
|
||||
* Copyright (c) 2003-2005 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __ARGS_H__
|
||||
#define __ARGS_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
int parse_int_args(int argc, char *argv[], uint64_t ints[], int len);
|
||||
int pack_str_into_regs(const char *str, uint64_t regs[], int num_regs);
|
||||
|
||||
#endif // __ARGS_H__
|
||||
@@ -51,6 +51,8 @@
|
||||
|
||||
#include <gem5/asm/generic/m5ops.h>
|
||||
#include <gem5/m5ops.h>
|
||||
|
||||
#include "args.h"
|
||||
#include "call_type.h"
|
||||
#include "dispatch_table.h"
|
||||
#include "m5_mmap.h"
|
||||
@@ -59,47 +61,6 @@ char *progname;
|
||||
char *command = "unspecified";
|
||||
void usage();
|
||||
|
||||
void
|
||||
parse_int_args(int argc, char *argv[], uint64_t ints[], int len)
|
||||
{
|
||||
if (argc > len)
|
||||
usage();
|
||||
|
||||
// On 32 bit platforms we need to use strtoull to do the conversion
|
||||
#ifdef __LP64__
|
||||
#define strto64 strtoul
|
||||
#else
|
||||
#define strto64 strtoull
|
||||
#endif
|
||||
int i;
|
||||
for (i = 0; i < len; ++i)
|
||||
ints[i] = (i < argc) ? strto64(argv[i], NULL, 0) : 0;
|
||||
|
||||
#undef strto64
|
||||
}
|
||||
|
||||
void
|
||||
pack_str_into_regs(const char *str, uint64_t regs[], int num_regs)
|
||||
{
|
||||
const size_t RegSize = sizeof(regs[0]);
|
||||
const size_t MaxLen = num_regs * RegSize;
|
||||
|
||||
size_t len = strlen(str);
|
||||
|
||||
if (len > MaxLen)
|
||||
usage();
|
||||
|
||||
memset(regs, 0, MaxLen);
|
||||
|
||||
while (len) {
|
||||
for (int offset = 0; offset < RegSize && len; offset++, len--) {
|
||||
int shift = offset * 8;
|
||||
*regs |= (uint64_t)(uint8_t)*str++ << shift;
|
||||
}
|
||||
regs++;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
read_file(DispatchTable *dt, int dest_fid)
|
||||
{
|
||||
@@ -168,7 +129,8 @@ do_exit(DispatchTable *dt, int argc, char *argv[])
|
||||
usage();
|
||||
|
||||
uint64_t ints[1];
|
||||
parse_int_args(argc, argv, ints, 1);
|
||||
if (!parse_int_args(argc, argv, ints, 1))
|
||||
usage();
|
||||
(*dt->m5_exit)(ints[0]);
|
||||
}
|
||||
|
||||
@@ -179,7 +141,8 @@ do_fail(DispatchTable *dt, int argc, char *argv[])
|
||||
usage();
|
||||
|
||||
uint64_t ints[2] = {0,0};
|
||||
parse_int_args(argc, argv, ints, argc);
|
||||
if (!parse_int_args(argc, argv, ints, argc))
|
||||
usage();
|
||||
(*dt->m5_fail)(ints[1], ints[0]);
|
||||
}
|
||||
|
||||
@@ -187,7 +150,8 @@ void
|
||||
do_reset_stats(DispatchTable *dt, int argc, char *argv[])
|
||||
{
|
||||
uint64_t ints[2];
|
||||
parse_int_args(argc, argv, ints, 2);
|
||||
if (!parse_int_args(argc, argv, ints, 2))
|
||||
usage();
|
||||
(*dt->m5_reset_stats)(ints[0], ints[1]);
|
||||
}
|
||||
|
||||
@@ -195,7 +159,8 @@ void
|
||||
do_dump_stats(DispatchTable *dt, int argc, char *argv[])
|
||||
{
|
||||
uint64_t ints[2];
|
||||
parse_int_args(argc, argv, ints, 2);
|
||||
if (!parse_int_args(argc, argv, ints, 2))
|
||||
usage();
|
||||
(*dt->m5_dump_stats)(ints[0], ints[1]);
|
||||
}
|
||||
|
||||
@@ -203,7 +168,8 @@ void
|
||||
do_dump_reset_stats(DispatchTable *dt, int argc, char *argv[])
|
||||
{
|
||||
uint64_t ints[2];
|
||||
parse_int_args(argc, argv, ints, 2);
|
||||
if (!parse_int_args(argc, argv, ints, 2))
|
||||
usage();
|
||||
(*dt->m5_dump_reset_stats)(ints[0], ints[1]);
|
||||
}
|
||||
|
||||
@@ -232,7 +198,8 @@ void
|
||||
do_checkpoint(DispatchTable *dt, int argc, char *argv[])
|
||||
{
|
||||
uint64_t ints[2];
|
||||
parse_int_args(argc, argv, ints, 2);
|
||||
if (!parse_int_args(argc, argv, ints, 2))
|
||||
usage();
|
||||
(*dt->m5_checkpoint)(ints[0], ints[1]);
|
||||
}
|
||||
|
||||
@@ -264,7 +231,8 @@ do_initparam(DispatchTable *dt, int argc, char *argv[])
|
||||
usage();
|
||||
|
||||
uint64_t key_str[2];
|
||||
pack_str_into_regs(argc == 0 ? "" : argv[0], key_str, 2);
|
||||
if (!pack_str_into_regs(argc == 0 ? "" : argv[0], key_str, 2))
|
||||
usage();
|
||||
uint64_t val = (*dt->m5_init_param)(key_str[0], key_str[1]);
|
||||
printf("%"PRIu64, val);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user