| # |
| # Feature name: membarrier-sync-core |
| # Kconfig: ARCH_HAS_MEMBARRIER_SYNC_CORE |
| # description: arch supports core serializing membarrier |
| # |
| # Architecture requirements |
| # |
| # * arm/arm64/powerpc/s390 |
| # |
| # Rely on implicit context synchronization as a result of exception return |
| # when returning from IPI handler, and when returning to user-space. |
| # |
| # * riscv |
| # |
| # riscv uses xRET as return from interrupt and to return to user-space. |
| # |
| # Given that xRET is not core serializing, we rely on FENCE.I for providing |
| # core serialization: |
| # |
| # - by calling sync_core_before_usermode() on return from interrupt (cf. |
| # ipi_sync_core()), |
| # |
| # - via switch_mm() and sync_core_before_usermode() (respectively, for |
| # uthread->uthread and kthread->uthread transitions) before returning |
| # to user-space. |
| # |
| # The serialization in switch_mm() is activated by prepare_sync_core_cmd(). |
| # |
| # * x86 |
| # |
| # x86-32 uses IRET as return from interrupt, which takes care of the IPI. |
| # However, it uses both IRET and SYSEXIT to go back to user-space. The IRET |
| # instruction is core serializing, but not SYSEXIT. |
| # |
| # x86-64 uses IRET as return from interrupt, which takes care of the IPI. |
| # However, it can return to user-space through either SYSRETL (compat code), |
| # SYSRETQ, or IRET. |
| # |
| # Given that neither SYSRET{L,Q}, nor SYSEXIT, are core serializing, we rely |
| # instead on write_cr3() performed by switch_mm() to provide core serialization |
| # after changing the current mm, and deal with the special case of kthread -> |
| # uthread (temporarily keeping current mm into active_mm) by issuing a |
| # sync_core_before_usermode() in that specific case. |
| # |
| ----------------------- |
| | arch |status| |
| ----------------------- |
| | alpha: | TODO | |
| | arc: | TODO | |
| | arm: | ok | |
| | arm64: | ok | |
| | csky: | TODO | |
| | hexagon: | TODO | |
| | loongarch: | TODO | |
| | m68k: | TODO | |
| | microblaze: | TODO | |
| | mips: | TODO | |
| | nios2: | TODO | |
| | openrisc: | TODO | |
| | parisc: | TODO | |
| | powerpc: | ok | |
| | riscv: | ok | |
| | s390: | ok | |
| | sh: | TODO | |
| | sparc: | TODO | |
| | um: | TODO | |
| | x86: | ok | |
| | xtensa: | TODO | |
| ----------------------- |