static void create_ppc_elf_stack_frame(device *me, unsigned_word bottom_of_stack, char **argv, char **envp) { /* fixme - this is over aligned */ /* information block */ const unsigned sizeof_envp_block = sizeof_argument_strings(envp); const unsigned_word start_envp_block = bottom_of_stack - sizeof_envp_block; const unsigned sizeof_argv_block = sizeof_argument_strings(argv); const unsigned_word start_argv_block = start_envp_block - sizeof_argv_block; /* auxiliary vector - contains only one entry */ const unsigned sizeof_aux_entry = 2*sizeof(unsigned_word); /* magic */ const unsigned_word start_aux = start_argv_block - ALIGN_8(sizeof_aux_entry); /* environment points (including null sentinal) */ const unsigned sizeof_envp = sizeof_arguments(envp); const unsigned_word start_envp = start_aux - sizeof_envp; /* argument pointers (including null sentinal) */ const int argc = number_of_arguments(argv); const unsigned sizeof_argv = sizeof_arguments(argv); const unsigned_word start_argv = start_envp - sizeof_argv; /* link register save address - alligned to a 16byte boundary */ const unsigned_word top_of_stack = ((start_argv - 2 * sizeof(unsigned_word)) & ~0xf); /* install arguments on stack */ write_stack_arguments(me, envp, start_envp_block, bottom_of_stack, start_envp, start_aux); write_stack_arguments(me, argv, start_argv_block, start_envp_block, start_argv, start_envp); /* set up the registers */ psim_write_register(device_system(me), -1, &top_of_stack, "sp", cooked_transfer); psim_write_register(device_system(me), -1, &argc, "r3", cooked_transfer); psim_write_register(device_system(me), -1, &start_argv, "r4", cooked_transfer); psim_write_register(device_system(me), -1, &start_envp, "r5", cooked_transfer); psim_write_register(device_system(me), -1, &start_aux, "r6", cooked_transfer); }
SIM_RC sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **envp) { unsigned_word entry_point; TRACE(trace_gdb, ("sim_create_inferior(start_address=0x%x, ...)\n", entry_point)); if (simulator == NULL) error ("No program loaded"); if (abfd != NULL) entry_point = bfd_get_start_address (abfd); else entry_point = 0xfff00000; /* ??? */ psim_init(simulator); psim_stack(simulator, argv, envp); ASSERT (psim_write_register(simulator, -1 /* all start at same PC */, &entry_point, "pc", cooked_transfer) > 0); return SIM_RC_OK; }