asm-uaccess.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __ASM_ASM_UACCESS_H
  3. #define __ASM_ASM_UACCESS_H
  4. #include <asm/alternative.h>
  5. #include <asm/kernel-pgtable.h>
  6. #include <asm/mmu.h>
  7. #include <asm/sysreg.h>
  8. #include <asm/assembler.h>
  9. /*
  10. * User access enabling/disabling macros.
  11. */
  12. #ifdef CONFIG_ARM64_SW_TTBR0_PAN
  13. .macro __uaccess_ttbr0_disable, tmp1
  14. mrs \tmp1, ttbr1_el1 // swapper_pg_dir
  15. bic \tmp1, \tmp1, #TTBR_ASID_MASK
  16. sub \tmp1, \tmp1, #RESERVED_TTBR0_SIZE // reserved_ttbr0 just before swapper_pg_dir
  17. msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
  18. isb
  19. add \tmp1, \tmp1, #RESERVED_TTBR0_SIZE
  20. msr ttbr1_el1, \tmp1 // set reserved ASID
  21. isb
  22. .endm
  23. .macro __uaccess_ttbr0_enable, tmp1, tmp2
  24. get_thread_info \tmp1
  25. ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1
  26. mrs \tmp2, ttbr1_el1
  27. extr \tmp2, \tmp2, \tmp1, #48
  28. ror \tmp2, \tmp2, #16
  29. msr ttbr1_el1, \tmp2 // set the active ASID
  30. isb
  31. msr ttbr0_el1, \tmp1 // set the non-PAN TTBR0_EL1
  32. isb
  33. .endm
  34. .macro uaccess_ttbr0_disable, tmp1, tmp2
  35. alternative_if_not ARM64_HAS_PAN
  36. save_and_disable_irq \tmp2 // avoid preemption
  37. __uaccess_ttbr0_disable \tmp1
  38. restore_irq \tmp2
  39. alternative_else_nop_endif
  40. .endm
  41. .macro uaccess_ttbr0_enable, tmp1, tmp2, tmp3
  42. alternative_if_not ARM64_HAS_PAN
  43. save_and_disable_irq \tmp3 // avoid preemption
  44. __uaccess_ttbr0_enable \tmp1, \tmp2
  45. restore_irq \tmp3
  46. alternative_else_nop_endif
  47. .endm
  48. #else
  49. .macro uaccess_ttbr0_disable, tmp1, tmp2
  50. .endm
  51. .macro uaccess_ttbr0_enable, tmp1, tmp2, tmp3
  52. .endm
  53. #endif
  54. /*
  55. * These macros are no-ops when UAO is present.
  56. */
  57. .macro uaccess_disable_not_uao, tmp1, tmp2
  58. uaccess_ttbr0_disable \tmp1, \tmp2
  59. alternative_if ARM64_ALT_PAN_NOT_UAO
  60. SET_PSTATE_PAN(1)
  61. alternative_else_nop_endif
  62. .endm
  63. .macro uaccess_enable_not_uao, tmp1, tmp2, tmp3
  64. uaccess_ttbr0_enable \tmp1, \tmp2, \tmp3
  65. alternative_if ARM64_ALT_PAN_NOT_UAO
  66. SET_PSTATE_PAN(0)
  67. alternative_else_nop_endif
  68. .endm
  69. /*
  70. * Remove the address tag from a virtual address, if present.
  71. */
  72. .macro clear_address_tag, dst, addr
  73. tst \addr, #(1 << 55)
  74. bic \dst, \addr, #(0xff << 56)
  75. csel \dst, \dst, \addr, eq
  76. .endm
  77. #endif