efx/zircon-efi/platform/reloc_x86_64.c
// note: this is called from crt0 using the sys V abi (ie. args in %rdi, %rsi, etc.), so we do not use EFIAPI!
this is called from crt0 using the sys V abi , so we do not use EFIAPI!
this is called from crt0 using the sys V abi so we do not use EFIAPI!
efi_status _relocate(long ldbase, Elf64_Dyn* dyn, efi_handle image, efi_system_table* systab)
{
	long relsz = 0, relent = 0;
	Elf64_Rel *rel = 0;
	unsigned long *addr;
	int i;
	for(i = 0; dyn[i].d_tag != DT_NULL; ++i)
	{
		switch (dyn[i].d_tag)
		{
			case DT_RELA:
				rel = (Elf64_Rel*) ((unsigned long) dyn[i].d_un.d_ptr + ldbase);
				break;
			case DT_RELASZ:
				relsz = dyn[i].d_un.d_val;
				break;
			case DT_RELAENT:
				relent = dyn[i].d_un.d_val;
				break;
			default:
				break;
		}
	}
	if(!rel && relent == 0)
		return EFI_SUCCESS;
	if(!rel || relent == 0)
		return EFI_LOAD_ERROR;
	while(relsz > 0)
	{
		switch (ELF64_R_TYPE (rel->r_info))
		{
			case R_X86_64_NONE:
				break;
			case R_X86_64_RELATIVE:
				addr = (unsigned long*) (ldbase + rel->r_offset);
				*addr += ldbase;
				break;
			default:
				break;
		}
		rel = (Elf64_Rel*) ((char*) rel + relent);
		relsz -= relent;
	}
	return EFI_SUCCESS;
}
efi_status _relocate ( long ldbase , Elf64_Dyn * dyn , efi_handle image , efi_system_table * systab ) { long relsz = 0 , relent = 0 ; Elf64_Rel * rel = 0 ; unsigned long * addr ; int i ; for ( i = 0 ; dyn [ i ] . d_tag != DT_NULL ; ++ i ) { switch ( dyn [ i ] . d_tag ) { case DT_RELA : rel = ( Elf64_Rel * ) ( ( unsigned long ) dyn [ i ] . d_un . d_ptr + ldbase ) ; break ; case DT_RELASZ : relsz = dyn [ i ] . d_un . d_val ; break ; case DT_RELAENT : relent = dyn [ i ] . d_un . d_val ; break ; default : break ; } } if ( ! rel && relent == 0 ) return EFI_SUCCESS ; if ( ! rel || relent == 0 ) return EFI_LOAD_ERROR ; while ( relsz > 0 ) { switch ( ELF64_R_TYPE ( rel -> r_info ) ) { case R_X86_64_NONE : break ; case R_X86_64_RELATIVE : addr = ( unsigned long * ) ( ldbase + rel -> r_offset ) ; * addr += ldbase ; break ; default : break ; } rel = ( Elf64_Rel * ) ( ( char * ) rel + relent ) ; relsz -= relent ; } return EFI_SUCCESS ; }
note: this is called from crt0 using the sys V abi (ie.
note : this is called from crt0 using the sys V abi ( ie .
/* apply the relocs */