multicore.c 703 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. /* https://cirosantilli.com/linux-kernel-module-cheat#arm-baremetal-multicore */
  2. #include <lkmc.h>
  3. uint64_t spinlock = 0;
  4. __asm__(
  5. ".syntax unified\n"
  6. ".text\n"
  7. ".global lkmc_cpu_not_0\n"
  8. "lkmc_cpu_not_0:\n"
  9. " cmp r0, 1\n"
  10. " bne .Lsleep_forever\n"
  11. " ldr sp, =(lkmc_stack_top - 0x1000)\n"
  12. " bl main_cpu1\n"
  13. ".Lsleep_forever:\n"
  14. " wfe\n"
  15. " b .Lsleep_forever\n"
  16. );
  17. static void main_cpu1(void) {
  18. spinlock = 1;
  19. lkmc_arm_aarch64_dmb(sy);
  20. lkmc_arm_aarch64_sev();
  21. while (1) {
  22. lkmc_arm_aarch64_wfe();
  23. }
  24. }
  25. int main(void) {
  26. #if !LKMC_GEM5
  27. lkmc_arm_psci_cpu_on(1, (uint32_t)main_cpu1, 0);
  28. #endif
  29. while (!spinlock) {
  30. lkmc_arm_aarch64_wfe();
  31. }
  32. }