sim: keep track of program environment strings

We've been passing the environment strings to sim_create_inferior,
but most ports don't do anything with them.  A few will use ad-hoc
logic to stuff the stack for user-mode programs, but that's it.

Let's formalize this across the board by storing the strings in the
normal sim state.  This will allow (in future commits) supporting
more functionality in the run interface, and to unify some of the
libgloss syscalls.
This commit is contained in:
Mike Frysinger
2021-11-15 23:00:04 -05:00
parent 38f9e52086
commit 54f7a83a62
14 changed files with 85 additions and 7 deletions

View File

@ -144,6 +144,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
if (trace_load_symbols (sd))
{
STATE_PROG_SYMS_COUNT (sd) =

View File

@ -1170,6 +1170,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
switch (STATE_ENVIRONMENT (sd))
{
case USER_ENVIRONMENT:

View File

@ -190,7 +190,7 @@ sim_open (SIM_OPEN_KIND kind,
SIM_RC
sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
char *const *argv, char *const *envp)
char *const *argv, char *const *env)
{
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
SIM_ADDR addr;
@ -213,5 +213,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
return SIM_RC_OK;
}

View File

@ -165,6 +165,10 @@ struct sim_state {
char *prog_argv0;
#define STATE_PROG_ARGV0(sd) ((sd)->prog_argv0)
/* The program's environment. */
char **prog_envp;
#define STATE_PROG_ENVP(sd) ((sd)->prog_envp)
/* The program's bfd. */
struct bfd *prog_bfd;
#define STATE_PROG_BFD(sd) ((sd)->prog_bfd)

View File

@ -99,6 +99,7 @@ sim_state_free (SIM_DESC sd)
free (STATE_PROG_FILE (sd));
free (STATE_PROG_ARGV0 (sd));
freeargv (STATE_PROG_ENVP (sd));
free (sd);
}

View File

@ -951,8 +951,8 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
SIM_RC
sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
char * const *argv ATTRIBUTE_UNUSED,
char * const *envp ATTRIBUTE_UNUSED)
char * const *argv,
char * const *env)
{
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
SIM_ADDR addr;
@ -977,6 +977,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
return SIM_RC_OK;
}

View File

@ -174,5 +174,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
return SIM_RC_OK;
}

View File

@ -175,7 +175,7 @@ frv_sim_close (SIM_DESC sd, int quitting)
SIM_RC
sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv,
char * const *envp)
char * const *env)
{
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
SIM_ADDR addr;
@ -196,5 +196,11 @@ sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
return SIM_RC_OK;
}

View File

@ -900,6 +900,13 @@ sim_create_inferior (SIM_DESC sd,
freeargv (STATE_PROG_ARGV (sd));
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
cpu->state.regs[FT32_HARD_SP] = addr;
cpu->state.num_i = 0;
cpu->state.cycles = 0;

View File

@ -131,7 +131,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
SIM_RC
sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
char * const *envp)
char * const *env)
{
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
SIM_ADDR addr;
@ -152,5 +152,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
return SIM_RC_OK;
}

View File

@ -192,7 +192,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
SIM_RC
sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
char * const *envp)
char * const *env)
{
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
SIM_ADDR addr;
@ -213,5 +213,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
return SIM_RC_OK;
}

View File

@ -145,7 +145,7 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd,
SIM_RC
sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
char * const *envp)
char * const *env)
{
SIM_CPU *current_cpu = STATE_CPU (sd, 0);
SIM_ADDR addr;
@ -174,6 +174,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
return SIM_RC_OK;
}

View File

@ -848,5 +848,11 @@ sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
return SIM_RC_OK;
}

View File

@ -153,6 +153,12 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd,
STATE_PROG_ARGV (sd) = dupargv (argv);
}
if (STATE_PROG_ENVP (sd) != env)
{
freeargv (STATE_PROG_ENVP (sd));
STATE_PROG_ENVP (sd) = dupargv (env);
}
initialize_env (sd, (void *)argv, (void *)env);
return SIM_RC_OK;