Skip to content

Instantly share code, notes, and snippets.

@puppykitten
Created November 16, 2017 14:31
Show Gist options
  • Save puppykitten/c711644decc3315eaa71e18fcbe424e0 to your computer and use it in GitHub Desktop.
Save puppykitten/c711644decc3315eaa71e18fcbe424e0 to your computer and use it in GitHub Desktop.
void __fastcall __noreturn config_tbase_start_s0cb()
{
process_struct_1 *new_proc;
unsigned int max_processes;
unsigned int v2;
int v3;
void *process_structs_area_addr;
int process_structs_area_length;
memset_to_0_0(&tbase_conf_t, 60);
tbase_conf_t.tbase_state = tbase_conf_t.tbase_state & 0xFFFFF8FF | 0x100;
config_tbase_tell_atf_vbar_map_s0cb_and_tllib_set_ssiq(&process_structs_area_addr, &process_structs_area_length);
sanity_check_S0CB_header();
prepare_per_process_descriptors(
process_structs_area_addr,
process_structs_area_length,
mapped_s0cb.max_processes,
mapped_s0cb.max_sgs_allowed);
dword_7F117B0 = -1;
write_EL1_thread_id();
reset_counter_something();
tbase_conf_t.tbase_state = tbase_conf_t.tbase_state & 0xFFFFF8FF | 0x200;
new_proc = init_new_process(1, 0, 0xFFFFF0F, (LOBYTE(mapped_s0cb.max_sgs_allowed) << 24) | 0xFFFFFF);
max_processes = mapped_s0cb.max_processes;
while ( max_processes > 1 )
{
v2 = max_processes--;
new_proc->perm_flags[v2 >> 5] |= 1 << (v2 & 0x1F);
}
v3 = mmap_s0cb_for_itself(new_proc); // uses the execute_mmap() that is used when
//processes ask to mmap
// sg into their address spaces.
if ( create_new_process(new_proc, mapped_s0cb.entry, v3) )
j_exit_to_ATF(15, &loc_7F00976);
while ( 1 ) // actually ERET into S0CB
{
jump_to_R0(go_to_ATF_or_sW_EL0, 1, 0, 0);
__mcr(15, 0, EL1_thread_struct, 13, 0, 4);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment