diff options
author | Mike Frysinger <vapier@gentoo.org> | 2021-11-16 01:26:47 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2021-11-16 02:13:42 -0500 |
commit | 85588c9ab947a4edfeedc7c14bd202d15ccfbbff (patch) | |
tree | 87aaa3c6e70ba77ea654eacc5dc85e924060749f /sim | |
parent | fab6939b01da06e1b5f423a8c7f72160b0a1e35d (diff) | |
download | gdb-85588c9ab947a4edfeedc7c14bd202d15ccfbbff.zip gdb-85588c9ab947a4edfeedc7c14bd202d15ccfbbff.tar.gz gdb-85588c9ab947a4edfeedc7c14bd202d15ccfbbff.tar.bz2 |
sim: syscall: hoist argc/argn/argnlen to common code
Now that the callback framework supports argv & envp, we can move
the Blackfin implementation of these syscalls to the common code.
Diffstat (limited to 'sim')
-rw-r--r-- | sim/bfin/interp.c | 33 | ||||
-rw-r--r-- | sim/common/syscall.c | 40 |
2 files changed, 40 insertions, 33 deletions
diff --git a/sim/bfin/interp.c b/sim/bfin/interp.c index 88ddbd0..f41e9b1 100644 --- a/sim/bfin/interp.c +++ b/sim/bfin/interp.c @@ -144,39 +144,6 @@ bfin_syscall (SIM_CPU *cpu) tbuf += sprintf (tbuf, "exit(%i)", args[0]); sim_engine_halt (sd, cpu, NULL, PCREG, sim_exited, sc.arg1); -#ifdef CB_SYS_argc - case CB_SYS_argc: - tbuf += sprintf (tbuf, "argc()"); - sc.result = countargv ((char **)argv); - break; - case CB_SYS_argnlen: - { - tbuf += sprintf (tbuf, "argnlen(%u)", args[0]); - if (sc.arg1 < countargv ((char **)argv)) - sc.result = strlen (argv[sc.arg1]); - else - sc.result = -1; - } - break; - case CB_SYS_argn: - { - tbuf += sprintf (tbuf, "argn(%u)", args[0]); - if (sc.arg1 < countargv ((char **)argv)) - { - const char *argn = argv[sc.arg1]; - int len = strlen (argn); - int written = sc.write_mem (cb, &sc, sc.arg2, argn, len + 1); - if (written == len + 1) - sc.result = sc.arg2; - else - sc.result = -1; - } - else - sc.result = -1; - } - break; -#endif - case CB_SYS_gettimeofday: { struct timeval _tv, *tv = &_tv; diff --git a/sim/common/syscall.c b/sim/common/syscall.c index bad3b3b..df9dd92 100644 --- a/sim/common/syscall.c +++ b/sim/common/syscall.c @@ -141,6 +141,46 @@ cb_syscall (host_callback *cb, CB_SYSCALL *sc) switch (cb_target_to_host_syscall (cb, sc->func)) { + case CB_SYS_argc: + result = countargv (cb->argv); + break; + + case CB_SYS_argnlen: + { + if (sc->arg1 >= 0 && sc->arg1 < countargv (cb->argv)) + result = strlen (cb->argv[sc->arg1]); + else + { + result = -1; + errcode = EINVAL; + } + } + break; + + case CB_SYS_argn: + { + if (sc->arg1 >= 0 && sc->arg1 < countargv (cb->argv)) + { + const char *argn = cb->argv[sc->arg1]; + int len = strlen (argn); + int written = sc->write_mem (cb, sc, sc->arg2, argn, len + 1); + + if (written == len + 1) + result = sc->arg2; + else + { + result = -1; + errcode = EINVAL; + } + } + else + { + result = -1; + errcode = EINVAL; + } + } + break; + case CB_SYS_argvlen : { /* Compute how much space is required to store the argv,envp |