static void create_ppc_aix_stack_frame(device *me, unsigned_word bottom_of_stack, char **argv, char **envp) { unsigned_word core_envp; unsigned_word core_argv; unsigned_word core_argc; unsigned_word core_aux; unsigned_word top_of_stack; /* cheat - create an elf stack frame */ create_ppc_elf_stack_frame(me, bottom_of_stack, argv, envp); /* extract argument addresses from registers */ psim_read_register(device_system(me), 0, &top_of_stack, "r1", cooked_transfer); psim_read_register(device_system(me), 0, &core_argc, "r3", cooked_transfer); psim_read_register(device_system(me), 0, &core_argv, "r4", cooked_transfer); psim_read_register(device_system(me), 0, &core_envp, "r5", cooked_transfer); psim_read_register(device_system(me), 0, &core_aux, "r6", cooked_transfer); /* extract arguments from registers */ device_error(me, "Unfinished procedure create_ppc_aix_stack_frame\n"); }
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); }
static void write_stack_arguments(device *me, char **arg, unsigned_word start_block, unsigned_word end_block, unsigned_word start_arg, unsigned_word end_arg) { DTRACE(stack, ("write_stack_arguments(device=%s, arg=0x%lx, start_block=0x%lx, end_block=0x%lx, start_arg=0x%lx, end_arg=0x%lx)\n", device_name(me), (long)arg, (long)start_block, (long)end_block, (long)start_arg, (long)end_arg)); if (arg == NULL) device_error(me, "Attempt to write a null array onto the stack\n"); /* only copy in arguments, memory is already zero */ for (; *arg != NULL; arg++) { int len = strlen(*arg)+1; unsigned_word target_start_block; DTRACE(stack, ("write_stack_arguments() write %s=%s at %s=0x%lx %s=0x%lx %s=0x%lx\n", "**arg", *arg, "start_block", (long)start_block, "len", (long)len, "start_arg", (long)start_arg)); if (psim_write_memory(device_system(me), 0, *arg, start_block, len, 0/*violate_readonly*/) != len) device_error(me, "Write of **arg (%s) at 0x%lx of stack failed\n", *arg, (unsigned long)start_block); target_start_block = H2T_word(start_block); if (psim_write_memory(device_system(me), 0, &target_start_block, start_arg, sizeof(target_start_block), 0) != sizeof(target_start_block)) device_error(me, "Write of *arg onto stack failed\n"); start_block += ALIGN_8(len); start_arg += sizeof(start_block); } start_arg += sizeof(start_block); /*the null at the end*/ if (start_block != end_block || ALIGN_8(start_arg) != end_arg) device_error(me, "Probable corrpution of stack arguments\n"); DTRACE(stack, ("write_stack_arguments() = void\n")); }
static void do_register_init(device *me, const device_property *prop) { psim *system = device_system(me); if (prop != NULL) { const char *name = prop->name; unsigned32 value = device_find_integer_property(me, name); int processor; do_register_init(me, device_next_property(prop)); if (strchr(name, '.') == NULL) { processor = -1; DTRACE(register, ("%s=0x%lx\n", name, (unsigned long)value)); } else {