From 8cfc9a1895d9f720e2cc38fd57b94ca5efba07b1 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 15 Nov 2021 23:04:10 -0500 Subject: sim: callback: expose argv & environ Pass the existing strings data to the callbacks so that common libgloss syscalls can be implemented (which we'll do shortly). --- include/sim/callback.h | 6 ++++++ sim/aarch64/interp.c | 4 ++++ sim/bfin/interp.c | 4 ++++ sim/bpf/sim-if.c | 5 +++++ sim/common/callback.c | 2 ++ sim/cris/sim-if.c | 16 ++++++++++++---- sim/example-synacor/interp.c | 5 +++++ sim/frv/sim-if.c | 9 ++++++++- sim/ft32/interp.c | 4 ++++ sim/iq2000/sim-if.c | 5 +++++ sim/lm32/sim-if.c | 9 +++++++-- sim/m32r/sim-if.c | 11 ++++++++--- sim/pru/interp.c | 4 ++++ sim/riscv/interp.c | 5 +++++ 14 files changed, 79 insertions(+), 10 deletions(-) diff --git a/include/sim/callback.h b/include/sim/callback.h index 06aa2d4..a51c4de 100644 --- a/include/sim/callback.h +++ b/include/sim/callback.h @@ -178,6 +178,12 @@ struct host_callback_struct enum bfd_endian target_endian; + /* Program command line options. */ + char **argv; + + /* Program environment. */ + char **envp; + /* Size of an "int" on the target (for syscalls whose ABI uses "int"). This must include padding, and only padding-at-higher-address is supported. For example, a 64-bit target with 32-bit int:s which diff --git a/sim/aarch64/interp.c b/sim/aarch64/interp.c index 4d7f421..3289953 100644 --- a/sim/aarch64/interp.c +++ b/sim/aarch64/interp.c @@ -126,6 +126,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, char * const *env) { sim_cpu *cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); bfd_vma addr = 0; if (abfd != NULL) @@ -150,6 +151,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + if (trace_load_symbols (sd)) { STATE_PROG_SYMS_COUNT (sd) = diff --git a/sim/bfin/interp.c b/sim/bfin/interp.c index 9d0e737..88ddbd0 100644 --- a/sim/bfin/interp.c +++ b/sim/bfin/interp.c @@ -1151,6 +1151,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, char * const *env) { SIM_CPU *cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; /* Set the PC. */ @@ -1176,6 +1177,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + switch (STATE_ENVIRONMENT (sd)) { case USER_ENVIRONMENT: diff --git a/sim/bpf/sim-if.c b/sim/bpf/sim-if.c index 7503a30..6d2f672 100644 --- a/sim/bpf/sim-if.c +++ b/sim/bpf/sim-if.c @@ -21,6 +21,7 @@ #include +#include "sim/callback.h" #include "sim-main.h" #include "sim-options.h" #include "libiberty.h" @@ -193,6 +194,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char *const *argv, char *const *env) { SIM_CPU *current_cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; /* Determine the start address. @@ -219,5 +221,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + return SIM_RC_OK; } diff --git a/sim/common/callback.c b/sim/common/callback.c index 941f430..a5f0fbe 100644 --- a/sim/common/callback.c +++ b/sim/common/callback.c @@ -770,6 +770,8 @@ host_callback default_callback = /* Defaults expected to be overridden at initialization, where needed. */ BFD_ENDIAN_UNKNOWN, /* target_endian */ + NULL, /* argv */ + NULL, /* envp */ 4, /* target_sizeof_int */ HOST_CALLBACK_MAGIC, diff --git a/sim/cris/sim-if.c b/sim/cris/sim-if.c index d29ccc5..8bfb624 100644 --- a/sim/cris/sim-if.c +++ b/sim/cris/sim-if.c @@ -23,14 +23,16 @@ along with this program. If not, see . */ /* This must come before any other includes. */ #include "defs.h" +#include +#include +#include + #include "libiberty.h" #include "bfd.h" #include "elf-bfd.h" +#include "sim/callback.h" #include "sim-main.h" -#include -#include -#include #include "sim-options.h" #include "sim-hw.h" #include "dis-asm.h" @@ -741,7 +743,9 @@ sim_open (SIM_OPEN_KIND kind, host_callback *callback, struct bfd *abfd, /* Find out how much room is needed for the environment and argv, create that memory and fill it. Only do this when there's a program - specified. */ + specified. + + TODO: Move this to sim_create_inferior and use STATE_PROG_ENVP. */ if (abfd != NULL && !cris_bare_iron) { const char *name = bfd_get_filename (abfd); @@ -955,6 +959,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *env) { SIM_CPU *current_cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; if (sd != NULL) @@ -983,6 +988,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + return SIM_RC_OK; } diff --git a/sim/example-synacor/interp.c b/sim/example-synacor/interp.c index 93aea7b..6b69994 100644 --- a/sim/example-synacor/interp.c +++ b/sim/example-synacor/interp.c @@ -28,6 +28,7 @@ /* This must come before any other includes. */ #include "defs.h" +#include "sim/callback.h" #include "sim-main.h" #include "sim-options.h" @@ -155,6 +156,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, char * const *env) { SIM_CPU *cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); sim_cia addr; /* Set the PC. */ @@ -180,5 +182,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + return SIM_RC_OK; } diff --git a/sim/frv/sim-if.c b/sim/frv/sim-if.c index 7b0913d..c634077 100644 --- a/sim/frv/sim-if.c +++ b/sim/frv/sim-if.c @@ -20,10 +20,13 @@ along with this program. If not, see . */ /* This must come before any other includes. */ #include "defs.h" +#include + +#include "sim/callback.h" + #define WANT_CPU #define WANT_CPU_FRVBF #include "sim-main.h" -#include #include "sim-options.h" #include "libiberty.h" #include "bfd.h" @@ -178,6 +181,7 @@ sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv, char * const *env) { SIM_CPU *current_cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; if (abfd != NULL) @@ -202,5 +206,8 @@ sim_create_inferior (SIM_DESC sd, bfd *abfd, char * const *argv, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + return SIM_RC_OK; } diff --git a/sim/ft32/interp.c b/sim/ft32/interp.c index 2838395..3514f75 100644 --- a/sim/ft32/interp.c +++ b/sim/ft32/interp.c @@ -884,6 +884,7 @@ sim_create_inferior (SIM_DESC sd, { uint32_t addr; sim_cpu *cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); /* Set the PC. */ if (abfd != NULL) @@ -907,6 +908,9 @@ sim_create_inferior (SIM_DESC sd, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + cpu->state.regs[FT32_HARD_SP] = addr; cpu->state.num_i = 0; cpu->state.cycles = 0; diff --git a/sim/iq2000/sim-if.c b/sim/iq2000/sim-if.c index 05b348e..6c75b0e 100644 --- a/sim/iq2000/sim-if.c +++ b/sim/iq2000/sim-if.c @@ -24,6 +24,7 @@ along with this program. If not, see . */ #include +#include "sim/callback.h" #include "sim-options.h" #include "libiberty.h" #include "bfd.h" @@ -134,6 +135,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, char * const *env) { SIM_CPU *current_cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; if (abfd != NULL) @@ -158,5 +160,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + return SIM_RC_OK; } diff --git a/sim/lm32/sim-if.c b/sim/lm32/sim-if.c index e7bffbd..8bbd83d 100644 --- a/sim/lm32/sim-if.c +++ b/sim/lm32/sim-if.c @@ -21,12 +21,13 @@ /* This must come before any other includes. */ #include "defs.h" +#include + +#include "sim/callback.h" #include "sim-main.h" #include "sim-options.h" #include "libiberty.h" #include "bfd.h" - -#include /* Cover function of sim_state_free to free the cpu buffers as well. */ @@ -195,6 +196,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, char * const *env) { SIM_CPU *current_cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; if (abfd != NULL) @@ -219,5 +221,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + return SIM_RC_OK; } diff --git a/sim/m32r/sim-if.c b/sim/m32r/sim-if.c index 0cb49a1..084ed5a 100644 --- a/sim/m32r/sim-if.c +++ b/sim/m32r/sim-if.c @@ -20,14 +20,15 @@ /* This must come before any other includes. */ #include "defs.h" +#include +#include + +#include "sim/callback.h" #include "sim-main.h" #include "sim-options.h" #include "libiberty.h" #include "bfd.h" -#include -#include - #include "dv-m32r_uart.h" #define M32R_DEFAULT_MEM_SIZE 0x2000000 /* 32M */ @@ -148,6 +149,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, char * const *env) { SIM_CPU *current_cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; if (abfd != NULL) @@ -180,6 +182,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + return SIM_RC_OK; } diff --git a/sim/pru/interp.c b/sim/pru/interp.c index f243df9..af72a21 100644 --- a/sim/pru/interp.c +++ b/sim/pru/interp.c @@ -831,6 +831,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd, char * const *argv, char * const *env) { SIM_CPU *cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; addr = bfd_get_start_address (prog_bfd); @@ -854,5 +855,8 @@ sim_create_inferior (SIM_DESC sd, struct bfd *prog_bfd, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + return SIM_RC_OK; } diff --git a/sim/riscv/interp.c b/sim/riscv/interp.c index 7ecdd55..efa4b56 100644 --- a/sim/riscv/interp.c +++ b/sim/riscv/interp.c @@ -21,6 +21,7 @@ /* This must come before any other includes. */ #include "defs.h" +#include "sim/callback.h" #include "sim-main.h" #include "sim-options.h" @@ -134,6 +135,7 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char * const *argv, char * const *env) { SIM_CPU *cpu = STATE_CPU (sd, 0); + host_callback *cb = STATE_CALLBACK (sd); SIM_ADDR addr; /* Set the PC. */ @@ -159,6 +161,9 @@ sim_create_inferior (SIM_DESC sd, struct bfd *abfd, STATE_PROG_ENVP (sd) = dupargv (env); } + cb->argv = STATE_PROG_ARGV (sd); + cb->envp = STATE_PROG_ENVP (sd); + initialize_env (sd, (void *)argv, (void *)env); return SIM_RC_OK; -- cgit v1.1