arm.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #ifndef LKMC_ARM_H
  2. #define LKMC_ARM_H
  3. #include <lkmc/arm_aarch64.h>
  4. #if defined(__ASSEMBLER__)
  5. .syntax unified
  6. #else
  7. void lkmc_arm_psci_cpu_on(
  8. uint32_t target_cpu,
  9. uint32_t entry_point_address,
  10. uint32_t context_id
  11. );
  12. #endif
  13. #define LKMC_ASSERT_EQ(reg, const) \
  14. mov r0, reg; \
  15. ldr r1, const; \
  16. ldr r2, =__LINE__; \
  17. bl lkmc_assert_eq_32; \
  18. ;
  19. #define LKMC_ASSERT_EQ_REG(reg1, reg2) \
  20. str reg2, [sp, -4]!; \
  21. mov r0, reg1; \
  22. ldr r1, [sp], 4; \
  23. ldr r2, =__LINE__; \
  24. bl lkmc_assert_eq_32; \
  25. ;
  26. #define LKMC_ASSERT_FAIL \
  27. ldr r0, =__LINE__; \
  28. bl lkmc_assert_fail; \
  29. ;
  30. #define LKMC_ASSERT_MEMCMP(label1, label2, size) \
  31. ldr r0, =label1; \
  32. ldr r1, =label2; \
  33. ldr r2, size; \
  34. ldr r3, =__LINE__; \
  35. bl lkmc_assert_memcmp; \
  36. ;
  37. /* https://cirosantilli.com/linux-kernel-module-cheat#arm-calling-convention */
  38. #define LKMC_EPILOGUE \
  39. add sp, 16; \
  40. ldmia sp!, {r4-r12, lr}; \
  41. mov r0, 0; \
  42. bx lr; \
  43. ;
  44. /* https://cirosantilli.com/linux-kernel-module-cheat#arm-calling-convention */
  45. #define LKMC_PROLOGUE \
  46. .text; \
  47. .global main; \
  48. main: \
  49. stmdb sp!, {r0-r12, lr}; \
  50. main_after_prologue: \
  51. ;
  52. #endif