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.
This commit is contained in:
Mike Frysinger
2021-11-16 01:26:47 -05:00
parent fab6939b01
commit 85588c9ab9
2 changed files with 40 additions and 33 deletions

View File

@ -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;

View File

@ -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