[Pdbg] [PATCH 14/29] main: Use new command handling for scoms
Cyril Bur
cyrilbur at gmail.com
Fri Feb 9 15:38:42 AEDT 2018
Signed-off-by: Cyril Bur <cyrilbur at gmail.com>
---
src/main.c | 20 +++-----------------
src/scom.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++---
src/scom.h | 3 +--
3 files changed, 52 insertions(+), 22 deletions(-)
diff --git a/src/main.c b/src/main.c
index 708f314..2dd4f24 100644
--- a/src/main.c
+++ b/src/main.c
@@ -86,6 +86,8 @@ static struct {
} actions[] = {
{ "getcfam", "<address>", "Read system cfam", &handle_cfams },
{ "putcfam", "<address> <value> [<mask>]", "Write system cfam", &handle_cfams },
+ { "getscom", "<address>", "Read system scom", &handle_scoms },
+ { "putscom", "<address> <value> [<mask>]", "Write system scom", &handle_scoms }
};
static void print_usage(char *pname)
@@ -146,17 +148,7 @@ enum command parse_cmd(char *optarg)
{
cmd_max_arg_count = 0;
- if (strcmp(optarg, "getscom") == 0) {
- cmd = GETSCOM;
- cmd_min_arg_count = 1;
- } else if (strcmp(optarg, "putscom") == 0) {
- cmd = PUTSCOM;
- cmd_min_arg_count = 2;
- cmd_max_arg_count = 3;
-
- /* No mask by default */
- cmd_args[2] = -1ULL;
- } else if (strcmp(optarg, "getmem") == 0) {
+ if (strcmp(optarg, "getmem") == 0) {
cmd = GETMEM;
cmd_min_arg_count = 2;
} else if (strcmp(optarg, "putmem") == 0) {
@@ -615,12 +607,6 @@ int main(int argc, char *argv[])
return -1;
switch(cmd) {
- case GETSCOM:
- rc = for_each_target("pib", getscom, &cmd_args[0], NULL);
- break;
- case PUTSCOM:
- rc = for_each_target("pib", putscom, &cmd_args[0], &cmd_args[1]);
- break;
case GETMEM:
buf = malloc(cmd_args[1]);
assert(buf);
diff --git a/src/scom.c b/src/scom.c
index f9102cc..4073d88 100644
--- a/src/scom.c
+++ b/src/scom.c
@@ -13,12 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include <inttypes.h>
+#include <errno.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
#include <target.h>
-int getscom(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *unused)
+#include "main.h"
+
+static int getscom(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *unused)
{
uint64_t value;
@@ -30,7 +35,7 @@ int getscom(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t
return 1;
}
-int putscom(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *data)
+static int putscom(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *data)
{
if (pib_write(target, *addr, *data))
return 0;
@@ -39,3 +44,43 @@ int putscom(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t
}
+int handle_scoms(int optind, int argc, char *argv[])
+{
+ uint64_t addr;
+ char *endptr;
+
+ if (optind + 1 >= argc) {
+ printf("%s: command '%s' requires an address\n", argv[0], argv[optind]);
+ return -1;
+ }
+
+ errno = 0;
+ addr = strtoull(argv[optind + 1], &endptr, 0);
+ if (errno || *endptr != '\0') {
+ printf("%s: command '%s' couldn't parse address '%s'\n",
+ argv[0], argv[optind], argv[optind + 1]);
+ return -1;
+ }
+
+ if (strcmp(argv[optind], "putscom") == 0) {
+ uint64_t data;
+
+ if (optind + 2 >= argc) {
+ printf("%s: command '%s' requires data\n", argv[0], argv[optind]);
+ return -1;
+ }
+
+ errno = 0;
+ data = strtoull(argv[optind + 2], &endptr, 0);
+ if (errno || *endptr != '\0') {
+ printf("%s: command '%s' couldn't parse data '%s'\n",
+ argv[0], argv[optind], argv[optind + 1]);
+ return -1;
+ }
+
+ return for_each_target("pib", putscom, &addr, &data);
+ }
+
+ return for_each_target("pib", getscom, &addr, NULL);
+}
+
diff --git a/src/scom.h b/src/scom.h
index afda6af..890207f 100644
--- a/src/scom.h
+++ b/src/scom.h
@@ -17,5 +17,4 @@
#include <target.h>
-int getscom(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *unused);
-int putscom(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *data);
+int handle_scoms(int optind, int argc, char *argv[]);
--
2.16.1
More information about the Pdbg
mailing list