diff options
| author | Cyril Bur <cyrilbur@gmail.com> | 2018-02-09 15:38:41 +1100 |
|---|---|---|
| committer | Alistair Popple <alistair@popple.id.au> | 2018-02-16 16:22:22 +1100 |
| commit | 34a70c8810e3b643748aca3061cf09961de9eb18 (patch) | |
| tree | ef000710aeb38993ea1d406057ca528a0ca901d0 /src | |
| parent | c5067f140bc26727c8a1355119d9b829d9d4ff78 (diff) | |
| download | pdbg-34a70c8810e3b643748aca3061cf09961de9eb18.tar.gz pdbg-34a70c8810e3b643748aca3061cf09961de9eb18.zip | |
main: Use new command handling for cfams
Signed-off-by: Cyril Bur <cyrilbur@gmail.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cfam.c | 47 | ||||
| -rw-r--r-- | src/cfam.h | 3 | ||||
| -rw-r--r-- | src/main.c | 24 | ||||
| -rw-r--r-- | src/main.h | 2 |
4 files changed, 52 insertions, 24 deletions
@@ -13,12 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include <errno.h> #include <stdio.h> +#include <stdlib.h> +#include <string.h> #include <inttypes.h> #include <target.h> -int getcfam(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *unused) +#include "main.h" + +static int getcfam(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *unused) { uint32_t value; @@ -30,7 +35,7 @@ int getcfam(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t return 1; } -int putcfam(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *data) +static int putcfam(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *data) { if (fsi_write(target, *addr, *data)) return 0; @@ -38,6 +43,44 @@ int putcfam(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t return 1; } +int handle_cfams(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], "putcfam") == 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("fsi", putcfam, &addr, &data); + } + + return for_each_target("fsi", getcfam, &addr, NULL); +} @@ -15,5 +15,4 @@ */ #include <inttypes.h> -int getcfam(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *unused); -int putcfam(struct pdbg_target *target, uint32_t index, uint64_t *addr, uint64_t *data); +int handle_cfams(int optind, int argc, char *argv[]); @@ -84,7 +84,8 @@ static struct { const char *desc; int (*fn)(int, int, char **); } actions[] = { - { "none yet", "nothing", "placeholder", NULL }, + { "getcfam", "<address>", "Read system cfam", &handle_cfams }, + { "putcfam", "<address> <value> [<mask>]", "Write system cfam", &handle_cfams }, }; static void print_usage(char *pname) @@ -145,19 +146,9 @@ enum command parse_cmd(char *optarg) { cmd_max_arg_count = 0; - if (strcmp(optarg, "getcfam") == 0) { - cmd = GETCFAM; - cmd_min_arg_count = 1; - } else if (strcmp(optarg, "getscom") == 0) { + if (strcmp(optarg, "getscom") == 0) { cmd = GETSCOM; cmd_min_arg_count = 1; - } else if (strcmp(optarg, "putcfam") == 0) { - cmd = PUTCFAM; - cmd_min_arg_count = 2; - cmd_max_arg_count = 3; - - /* No mask by default */ - cmd_args[2] = -1ULL; } else if (strcmp(optarg, "putscom") == 0) { cmd = PUTSCOM; cmd_min_arg_count = 2; @@ -430,8 +421,7 @@ int for_each_child_target(char *class, struct pdbg_target *parent, return rc; } -/* Call the given call back on each enabled target in the given class */ -static int for_each_target(char *class, int (*cb)(struct pdbg_target *, uint32_t, uint64_t *, uint64_t *), uint64_t *arg1, uint64_t *arg2) +int for_each_target(char *class, int (*cb)(struct pdbg_target *, uint32_t, uint64_t *, uint64_t *), uint64_t *arg1, uint64_t *arg2) { struct pdbg_target *target; uint32_t index; @@ -625,12 +615,6 @@ int main(int argc, char *argv[]) return -1; switch(cmd) { - case GETCFAM: - rc = for_each_target("fsi", getcfam, &cmd_args[0], NULL); - break; - case PUTCFAM: - rc = for_each_target("fsi", putcfam, &cmd_args[0], &cmd_args[1]); - break; case GETSCOM: rc = for_each_target("pib", getscom, &cmd_args[0], NULL); break; @@ -21,3 +21,5 @@ int for_each_child_target(char *class, struct pdbg_target *parent, int (*cb)(struct pdbg_target *, uint32_t, uint64_t *, uint64_t *), uint64_t *arg1, uint64_t *arg2); + +int for_each_target(char *class, int (*cb)(struct pdbg_target *, uint32_t, uint64_t *, uint64_t *), uint64_t *arg1, uint64_t *arg2); |

