microblaze-new-gcc.patch 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. diff -Nur linux-6.18.18.orig/arch/microblaze/kernel/entry.S linux-6.18.18/arch/microblaze/kernel/entry.S
  2. --- linux-6.18.18.orig/arch/microblaze/kernel/entry.S 2026-03-13 17:23:30.000000000 +0100
  3. +++ linux-6.18.18/arch/microblaze/kernel/entry.S 2026-03-27 08:00:11.173928808 +0100
  4. @@ -339,6 +339,9 @@
  5. * Trap entered via brki instruction, so BIP bit is set, and interrupts
  6. * are masked. This is nice, means we don't have to CLI before state save
  7. */
  8. +
  9. +#define SYSCALL_ARGS_SIZE 36
  10. +
  11. C_ENTRY(_user_exception):
  12. swi r1, r0, TOPHYS(PER_CPU(ENTRY_SP)) /* save stack */
  13. addi r14, r14, 4 /* return address is 4 byte after call */
  14. @@ -422,16 +425,19 @@
  15. lwi r12, r12, sys_call_table
  16. /* where the trap should return need -8 to adjust for rtsd r15, 8 */
  17. addi r15, r0, ret_from_trap-8
  18. + addik r1, r1, -SYSCALL_ARGS_SIZE
  19. bra r12
  20. /* The syscall number is invalid, return an error. */
  21. 5:
  22. - braid ret_from_trap
  23. + braid ret_from_trap2
  24. addi r3, r0, -ENOSYS;
  25. /* Entry point used to return from a syscall/trap */
  26. /* We re-enable BIP bit before state restore */
  27. C_ENTRY(ret_from_trap):
  28. + addik r1, r1, SYSCALL_ARGS_SIZE
  29. +C_ENTRY(ret_from_trap2):
  30. swi r3, r1, PT_R3
  31. swi r4, r1, PT_R4
  32. @@ -504,7 +510,7 @@
  33. bralid r15, schedule_tail; /* ...which is schedule_tail's arg */
  34. add r5, r3, r0; /* switch_thread returns the prev task */
  35. /* ( in the delay slot ) */
  36. - brid ret_from_trap; /* Do normal trap return */
  37. + brid ret_from_trap2; /* Do normal trap return */
  38. add r3, r0, r0; /* Child's fork call should return 0. */
  39. C_ENTRY(ret_from_kernel_thread):
  40. @@ -513,13 +519,13 @@
  41. /* ( in the delay slot ) */
  42. brald r15, r20 /* fn was left in r20 */
  43. addk r5, r0, r19 /* ... and argument - in r19 */
  44. - brid ret_from_trap
  45. + brid ret_from_trap2
  46. add r3, r0, r0
  47. C_ENTRY(sys_rt_sigreturn_wrapper):
  48. addik r30, r0, 0 /* no restarts */
  49. brid sys_rt_sigreturn /* Do real work */
  50. - addik r5, r1, 0; /* add user context as 1st arg */
  51. + addik r5, r1, SYSCALL_ARGS_SIZE; /* add user context as 1st arg */
  52. /*
  53. * HW EXCEPTION rutine start
  54. @@ -729,11 +735,13 @@
  55. lwi CURRENT_TASK, r0, TOPHYS(PER_CPU(CURRENT_SAVE));
  56. tovirt(r1,r1)
  57. addik r15, r0, irq_call;
  58. + addik r1, r1, -8
  59. irq_call:rtbd r0, do_IRQ;
  60. - addik r5, r1, 0;
  61. + addik r5, r1, 8;
  62. /* MS: we are in virtual mode */
  63. ret_from_irq:
  64. + addik r1, r1, 8
  65. lwi r11, r1, PT_MODE;
  66. bnei r11, 2f;
  67. @@ -1302,7 +1310,7 @@
  68. .global microblaze_trap_handlers
  69. microblaze_trap_handlers:
  70. /* Exact matches come first */
  71. - .word ret_from_trap; .word ret_from_trap ; .word type_SYSCALL
  72. + .word ret_from_trap; .word ret_from_trap2 ; .word type_SYSCALL
  73. .word ret_from_irq ; .word ret_from_irq ; .word type_IRQ
  74. /* Fuzzy matches go here */
  75. .word ret_from_irq ; .word no_intr_resched ; .word type_IRQ_PREEMPT