1 .. SPDX-License-Identifier: GPL-2.0 2 3 ============================================== 4 Concurrent Modification and Execution of Instr 5 ============================================== 6 7 CMODX is a programming technique where a progr 8 modified by the program itself. Instruction st 9 (icache) are not guaranteed to be synchronized 10 program must enforce its own synchronization w 11 instruction. 12 13 However, the default Linux ABI prohibits the u 14 applications. At any point the scheduler may m 15 migration occurs after the userspace synchroni 16 storage with fence.i, the icache on the new ha 17 is due to the behavior of fence.i only affecti 18 Thus, the hart that the task has been migrated 19 instruction storage and icache. 20 21 There are two ways to solve this problem: use 22 or use the ``PR_RISCV_SET_ICACHE_FLUSH_CTX`` p 23 userspace. The syscall performs a one-off icac 24 changes the Linux ABI to allow userspace to em 25 26 As an aside, "deferred" icache flushes can som 27 At the time of writing, this only occurs durin 28 and when the kernel uses copy_to_user_page(). 29 when the memory map being used by a hart chang 30 an icache flush, this deferred icache flush wi 31 Therefore, there will be no additional flush w 32 syscall inside of the prctl() context. 33 34 prctl() Interface 35 --------------------- 36 37 Call prctl() with ``PR_RISCV_SET_ICACHE_FLUSH_ 38 remaining arguments will be delegated to the r 39 function detailed below. 40 41 .. kernel-doc:: arch/riscv/mm/cacheflush.c 42 :identifiers: riscv_set_icache_flush_c 43 44 Example usage: 45 46 The following files are meant to be compiled a 47 modify_instruction() function replaces an add 48 causing the instruction sequence in get_value( 49 to returning a one. 50 51 cmodx.c:: 52 53 #include <stdio.h> 54 #include <sys/prctl.h> 55 56 extern int get_value(); 57 extern void modify_instruction(); 58 59 int main() 60 { 61 int value = get_value(); 62 printf("Value before cmodx: %d 63 64 // Call prctl before first fen 65 prctl(PR_RISCV_SET_ICACHE_FLUS 66 modify_instruction(); 67 // Call prctl after final fenc 68 prctl(PR_RISCV_SET_ICACHE_FLUS 69 70 value = get_value(); 71 printf("Value after cmodx: %d\ 72 return 0; 73 } 74 75 cmodx.S:: 76 77 .option norvc 78 79 .text 80 .global modify_instruction 81 modify_instruction: 82 lw a0, new_insn 83 lui a5,%hi(old_insn) 84 sw a0,%lo(old_insn)(a5) 85 fence.i 86 ret 87 88 .section modifiable, "awx" 89 .global get_value 90 get_value: 91 li a0, 0 92 old_insn: 93 addi a0, a0, 0 94 ret 95 96 .data 97 new_insn: 98 addi a0, a0, 1
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.