elf_aux.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * arch/um/kernel/elf_aux.c
  4. *
  5. * Scan the ELF auxiliary vector provided by the host to extract
  6. * information about vsyscall-page, etc.
  7. *
  8. * Copyright (C) 2004 Fujitsu Siemens Computers GmbH
  9. * Author: Bodo Stroesser (bodo.stroesser@fujitsu-siemens.com)
  10. */
  11. #include <elf.h>
  12. #include <stddef.h>
  13. #include <init.h>
  14. #include <elf_user.h>
  15. #include <mem_user.h>
  16. #include "internal.h"
  17. #include <linux/swab.h>
  18. #if __BITS_PER_LONG == 64
  19. typedef Elf64_auxv_t elf_auxv_t;
  20. #else
  21. typedef Elf32_auxv_t elf_auxv_t;
  22. #endif
  23. /* These are initialized very early in boot and never changed */
  24. char * elf_aux_platform;
  25. long elf_aux_hwcap;
  26. __init void scan_elf_aux( char **envp)
  27. {
  28. elf_auxv_t * auxv;
  29. while ( *envp++ != NULL) ;
  30. for ( auxv = (elf_auxv_t *)envp; auxv->a_type != AT_NULL; auxv++) {
  31. switch ( auxv->a_type ) {
  32. case AT_HWCAP:
  33. elf_aux_hwcap = auxv->a_un.a_val;
  34. break;
  35. case AT_PLATFORM:
  36. /* elf.h removed the pointer elements from
  37. * a_un, so we have to use a_val, which is
  38. * all that's left.
  39. */
  40. elf_aux_platform =
  41. (char *) (long) auxv->a_un.a_val;
  42. break;
  43. }
  44. }
  45. }