* csky ICe (was: Re: [PATCH v4 2/3] slab: improve KMALLOC_PARTITION_RANDOM randomness) [not found] ` <20260511200136.3201646-2-elver@google.com> @ 2026-09-22 14:58 ` Guenter Roeck 2026-09-23 9:19 ` Mike Rapoport 2026-09-24 12:36 ` Marco Elver 0 siblings, 2 replies; 4+ messages in thread From: Guenter Roeck @ 2026-09-22 14:58 UTC (permalink / raw) To: Marco Elver Cc: Vlastimil Babka, Andrew Morton, Gustavo A. R. Silva, Liam R. Howlett, Andrey Konovalov, Bill Wendling, David Hildenbrand, David Rientjes, Dmitry Vyukov, Jann Horn, Justin Stitt, KP Singh, Kees Cook, Lorenzo Stoakes, Matteo Rizzo, Michal Hocko, Mike Rapoport, Nathan Chancellor, Nick Desaulniers, Roman Gushchin, Suren Baghdasaryan, linux-hardening, Nicolas Schier, Dennis Zhou, Tejun Heo, Christoph Lameter, Harry Yoo, Hao Li, Liam R. Howlett, Alexander Potapenko, Miguel Ojeda, linux-kbuild, linux-kernel, linux-mm, kasan-dev, llvm, Guo Ren, linux-csky Hi, On Mon, May 11, 2026 at 10:00:49PM +0200, Marco Elver wrote: > When using CONFIG_KMALLOC_PARTITION_RANDOM, _RET_IP_ was previously used > to identify the allocation site. _RET_IP_, however, evaluates to the > caller's parent's instruction pointer rather than the actual allocation > site; this would lead to collisions where a function performs multiple > allocations. > > With the generalization to kmalloc_token_t, we now generate the token at > the outermost macro, and using _THIS_IP_ would fix this for all cases. > > Unfortunately, the generic implementation of _THIS_IP_ relies on taking > the address of a local label, which is considered broken by both GCC [1] > and Clang [2] because label addresses are only expected to be used with > computed gotos. While the generic version more or less works today, it > is known to be brittle. For example, Clang -O2 always returns 1 when > this function is inlined: > > static inline unsigned long get_ip(void) > { return ({ __label__ __here; __here: (unsigned long)&&__here; }); } > > To provide a reliable unique identifier without breaking architectures > relying on the generic _THIS_IP_, introduce _CODE_LOCATION_: it resolves > to _THIS_IP_ where architectures provide a safe implementation, and > falls back to a zero-cost static marker where _THIS_IP_ is broken. > > Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071 [1] > Link: https://github.com/llvm/llvm-project/issues/138272 [2] > Signed-off-by: Marco Elver <elver@google.com> With this patch in the tree, I get ICE erors when trying to build csky:allmodconfig. Example: Error log: sound/core/oss/mixer_oss.c: In function 'snd_mixer_oss_proc_write': sound/core/oss/mixer_oss.c:1202:1: error: could not split insn 1202 | } | ^ (insn 183 400 184 (set (reg:SI 0 a0 [orig:307 _55 ] [307]) (xor:SI (reg:SI 3 a3 [orig:308 random_kmalloc_seed ] [308]) (const:SI (plus:SI (symbol_ref:SI ("*.LANCHOR0") [flags 0x182]) (const_int 132 [0x84]))))) "include/linux/slab.h":759:52 288 {cskyv2_xorsi3} (expr_list:REG_DEAD (reg:SI 3 a3 [orig:308 random_kmalloc_seed ] [308]) (nil))) during RTL pass: final sound/core/oss/mixer_oss.c:1202:1: internal compiler error: in final_scan_insn_1, at final.cc:2813 0x779b51e2a1c9 __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58 0x779b51e2a28a __libc_start_main_impl ../csu/libc-start.c:360 This happens with lots of files, not just this one. It is seen with all versions of gcc starting with at least v13.x. Reverting this patch fixes the problem. Bisect log is attached for reference. Any idea what I could do to avoid the problem other than stopping to build csky:allmodconfig ? Thanks, Guenter --- # bad: [93f51579e7df248780214094418f205253383cc5] Linux 7.3-rc4 # good: [7d0a66e4bb9081d75c82ec4957c50034cb0ea449] Linux 6.18 git bisect start 'HEAD' 'v6.18' # good: [df8f6181ab57d65a99e61fcfc5be22a42df58642] Merge tag 'perf-tools-for-v7.1-2026-04-17' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools git bisect good df8f6181ab57d65a99e61fcfc5be22a42df58642 # bad: [093239070573637ad2b4cb56abc9c4c7ee109294] Merge tag 'v7.2-rc2' into togreg git bisect bad 093239070573637ad2b4cb56abc9c4c7ee109294 # bad: [b85966adbf5de0668a815c6e3527f87e0c387fb4] Merge tag 'net-next-7.2' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next git bisect bad b85966adbf5de0668a815c6e3527f87e0c387fb4 # good: [25447851777a53bd4b501e7f2cb418332ad584cc] Merge tag 'char-misc-7.1-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc git bisect good 25447851777a53bd4b501e7f2cb418332ad584cc # good: [bd77e50c9a70f844d6073499f3d1a6fd193eae73] Merge tag 'fbdev-for-7.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/linux-fbdev git bisect good bd77e50c9a70f844d6073499f3d1a6fd193eae73 # good: [972c4dd19cb92e03d75b66c426cfade07582a1ba] Merge tag 'wireless-next-2026-06-10' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next git bisect good 972c4dd19cb92e03d75b66c426cfade07582a1ba # bad: [9b40ba14edcdf70240af8114092a76f75f070774] Merge tag 'for-7.2/io_uring-20260615' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux git bisect bad 9b40ba14edcdf70240af8114092a76f75f070774 # bad: [0d8c1134936f1fb6678156ab4248ac740d274525] Merge tag 'v7.2-p1' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 git bisect bad 0d8c1134936f1fb6678156ab4248ac740d274525 # good: [42a58f08b70a7a320c168a1ce15e3fcfc8568708] crypto: atmel-sha204a - Use named initializers for struct i2c_device_id git bisect good 42a58f08b70a7a320c168a1ce15e3fcfc8568708 # good: [2c1ccd9a1d786503086e83fe83e5c3b3c953b70e] docs: changes.rst: restore pahole 1.26 minimum (regressed by sort) git bisect good 2c1ccd9a1d786503086e83fe83e5c3b3c953b70e # bad: [f8115f0e8a0585ef1c03d07a68b989023097d16c] Merge tag 'slab-for-7.2' of git://git.kernel.org/pub/scm/linux/kernel/git/vbabka/slab git bisect bad f8115f0e8a0585ef1c03d07a68b989023097d16c # bad: [dfdfd58cce1c3f5df8733b64595448996c08e424] Merge branch 'slab/for-7.2/alloc_token' into slab/for-next git bisect bad dfdfd58cce1c3f5df8733b64595448996c08e424 # good: [648927ceb84021a25a0fbd5673740956f318d534] mm/slab: do not limit zeroing to orig_size when only red zoning is enabled git bisect good 648927ceb84021a25a0fbd5673740956f318d534 # good: [d196ea36a2f2118833ca648af53654553a4a1e7b] Merge branch 'slab/for-7.2/tools' into slab/for-next git bisect good d196ea36a2f2118833ca648af53654553a4a1e7b # bad: [e0f54249a491c62ef8196b9f13bd7d95dba47c6f] slab: fix kernel-docs for mm-api git bisect bad e0f54249a491c62ef8196b9f13bd7d95dba47c6f # bad: [0fc1bd38a19c108395d8338fb034f90c2d3fbe55] slab: improve KMALLOC_PARTITION_RANDOM randomness git bisect bad 0fc1bd38a19c108395d8338fb034f90c2d3fbe55 # good: [feb662d9168b63e1d4c02671ec96005410c6f3ce] slab: support for compiler-assisted type-based slab cache partitioning git bisect good feb662d9168b63e1d4c02671ec96005410c6f3ce # first bad commit: [0fc1bd38a19c108395d8338fb034f90c2d3fbe55] slab: improve KMALLOC_PARTITION_RANDOM randomness ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: csky ICe (was: Re: [PATCH v4 2/3] slab: improve KMALLOC_PARTITION_RANDOM randomness) 2026-09-22 14:58 ` csky ICe (was: Re: [PATCH v4 2/3] slab: improve KMALLOC_PARTITION_RANDOM randomness) Guenter Roeck @ 2026-09-23 9:19 ` Mike Rapoport 2026-09-24 12:36 ` Marco Elver 1 sibling, 0 replies; 4+ messages in thread From: Mike Rapoport @ 2026-09-23 9:19 UTC (permalink / raw) To: Guenter Roeck Cc: Marco Elver, Vlastimil Babka, Andrew Morton, Gustavo A. R. Silva, Liam R. Howlett, Andrey Konovalov, Bill Wendling, David Hildenbrand, David Rientjes, Dmitry Vyukov, Jann Horn, Justin Stitt, KP Singh, Kees Cook, Lorenzo Stoakes, Matteo Rizzo, Michal Hocko, Nathan Chancellor, Nick Desaulniers, Roman Gushchin, Suren Baghdasaryan, linux-hardening, Nicolas Schier, Dennis Zhou, Tejun Heo, Christoph Lameter, Harry Yoo, Hao Li, Liam R. Howlett, Alexander Potapenko, Miguel Ojeda, linux-kbuild, linux-kernel, linux-mm, kasan-dev, llvm, Guo Ren, linux-csky, Arnd Bergmann On Tue, Sep 22, 2026 at 07:58:56AM -0700, Guenter Roeck wrote: > Hi, > > On Mon, May 11, 2026 at 10:00:49PM +0200, Marco Elver wrote: > > When using CONFIG_KMALLOC_PARTITION_RANDOM, _RET_IP_ was previously used > > to identify the allocation site. _RET_IP_, however, evaluates to the > > caller's parent's instruction pointer rather than the actual allocation > > site; this would lead to collisions where a function performs multiple > > allocations. > > > > With the generalization to kmalloc_token_t, we now generate the token at > > the outermost macro, and using _THIS_IP_ would fix this for all cases. > > > > Unfortunately, the generic implementation of _THIS_IP_ relies on taking > > the address of a local label, which is considered broken by both GCC [1] > > and Clang [2] because label addresses are only expected to be used with > > computed gotos. While the generic version more or less works today, it > > is known to be brittle. For example, Clang -O2 always returns 1 when > > this function is inlined: > > > > static inline unsigned long get_ip(void) > > { return ({ __label__ __here; __here: (unsigned long)&&__here; }); } > > > > To provide a reliable unique identifier without breaking architectures > > relying on the generic _THIS_IP_, introduce _CODE_LOCATION_: it resolves > > to _THIS_IP_ where architectures provide a safe implementation, and > > falls back to a zero-cost static marker where _THIS_IP_ is broken. > > > > Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071 [1] > > Link: https://github.com/llvm/llvm-project/issues/138272 [2] > > Signed-off-by: Marco Elver <elver@google.com> > > With this patch in the tree, I get ICE erors when trying to build > csky:allmodconfig. > > Example: > > Error log: > sound/core/oss/mixer_oss.c: In function 'snd_mixer_oss_proc_write': > sound/core/oss/mixer_oss.c:1202:1: error: could not split insn > 1202 | } > | ^ > (insn 183 400 184 (set (reg:SI 0 a0 [orig:307 _55 ] [307]) > (xor:SI (reg:SI 3 a3 [orig:308 random_kmalloc_seed ] [308]) > (const:SI (plus:SI (symbol_ref:SI ("*.LANCHOR0") [flags 0x182]) > (const_int 132 [0x84]))))) "include/linux/slab.h":759:52 288 {cskyv2_xorsi3} > (expr_list:REG_DEAD (reg:SI 3 a3 [orig:308 random_kmalloc_seed ] [308]) > (nil))) > during RTL pass: final > sound/core/oss/mixer_oss.c:1202:1: internal compiler error: in final_scan_insn_1, at final.cc:2813 > 0x779b51e2a1c9 __libc_start_call_main > ../sysdeps/nptl/libc_start_call_main.h:58 > 0x779b51e2a28a __libc_start_main_impl > ../csu/libc-start.c:360 > > This happens with lots of files, not just this one. It is seen with all > versions of gcc starting with at least v13.x. Reverting this patch fixes > the problem. Bisect log is attached for reference. > > Any idea what I could do to avoid the problem other than stopping to build > csky:allmodconfig ? Maybe it's time to say goodbye to csky? ;-) > Thanks, > Guenter -- Sincerely yours, Mike. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: csky ICe (was: Re: [PATCH v4 2/3] slab: improve KMALLOC_PARTITION_RANDOM randomness) 2026-09-22 14:58 ` csky ICe (was: Re: [PATCH v4 2/3] slab: improve KMALLOC_PARTITION_RANDOM randomness) Guenter Roeck 2026-09-23 9:19 ` Mike Rapoport @ 2026-09-24 12:36 ` Marco Elver 2026-09-25 4:40 ` Guenter Roeck 1 sibling, 1 reply; 4+ messages in thread From: Marco Elver @ 2026-09-24 12:36 UTC (permalink / raw) To: Guenter Roeck Cc: Vlastimil Babka, Andrew Morton, Gustavo A. R. Silva, Liam R. Howlett, Andrey Konovalov, Bill Wendling, David Hildenbrand, David Rientjes, Dmitry Vyukov, Jann Horn, Justin Stitt, KP Singh, Kees Cook, Lorenzo Stoakes, Matteo Rizzo, Michal Hocko, Mike Rapoport, Nathan Chancellor, Nick Desaulniers, Roman Gushchin, Suren Baghdasaryan, linux-hardening, Nicolas Schier, Dennis Zhou, Tejun Heo, Christoph Lameter, Harry Yoo, Hao Li, Liam R. Howlett, Alexander Potapenko, Miguel Ojeda, linux-kbuild, linux-kernel, linux-mm, kasan-dev, llvm, Guo Ren, linux-csky On Tue, Sep 22, 2026 at 07:58AM -0700, Guenter Roeck wrote: > Hi, > > On Mon, May 11, 2026 at 10:00:49PM +0200, Marco Elver wrote: > > When using CONFIG_KMALLOC_PARTITION_RANDOM, _RET_IP_ was previously used > > to identify the allocation site. _RET_IP_, however, evaluates to the > > caller's parent's instruction pointer rather than the actual allocation > > site; this would lead to collisions where a function performs multiple > > allocations. > > > > With the generalization to kmalloc_token_t, we now generate the token at > > the outermost macro, and using _THIS_IP_ would fix this for all cases. > > > > Unfortunately, the generic implementation of _THIS_IP_ relies on taking > > the address of a local label, which is considered broken by both GCC [1] > > and Clang [2] because label addresses are only expected to be used with > > computed gotos. While the generic version more or less works today, it > > is known to be brittle. For example, Clang -O2 always returns 1 when > > this function is inlined: > > > > static inline unsigned long get_ip(void) > > { return ({ __label__ __here; __here: (unsigned long)&&__here; }); } > > > > To provide a reliable unique identifier without breaking architectures > > relying on the generic _THIS_IP_, introduce _CODE_LOCATION_: it resolves > > to _THIS_IP_ where architectures provide a safe implementation, and > > falls back to a zero-cost static marker where _THIS_IP_ is broken. > > > > Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071 [1] > > Link: https://github.com/llvm/llvm-project/issues/138272 [2] > > Signed-off-by: Marco Elver <elver@google.com> > > With this patch in the tree, I get ICE erors when trying to build > csky:allmodconfig. > > Example: > > Error log: > sound/core/oss/mixer_oss.c: In function 'snd_mixer_oss_proc_write': > sound/core/oss/mixer_oss.c:1202:1: error: could not split insn > 1202 | } > | ^ > (insn 183 400 184 (set (reg:SI 0 a0 [orig:307 _55 ] [307]) > (xor:SI (reg:SI 3 a3 [orig:308 random_kmalloc_seed ] [308]) > (const:SI (plus:SI (symbol_ref:SI ("*.LANCHOR0") [flags 0x182]) > (const_int 132 [0x84]))))) "include/linux/slab.h":759:52 288 {cskyv2_xorsi3} > (expr_list:REG_DEAD (reg:SI 3 a3 [orig:308 random_kmalloc_seed ] [308]) > (nil))) > during RTL pass: final > sound/core/oss/mixer_oss.c:1202:1: internal compiler error: in final_scan_insn_1, at final.cc:2813 > 0x779b51e2a1c9 __libc_start_call_main > ../sysdeps/nptl/libc_start_call_main.h:58 > 0x779b51e2a28a __libc_start_main_impl > ../csu/libc-start.c:360 > > This happens with lots of files, not just this one. It is seen with all > versions of gcc starting with at least v13.x. Reverting this patch fixes > the problem. Bisect log is attached for reference. > > Any idea what I could do to avoid the problem other than stopping to build > csky:allmodconfig ? No idea what gcc is falling over here, but the below patch could be a workaround/fix. Does that work better? ------ >8 ------ From: Marco Elver <elver@google.com> Date: Fri, 8 May 2026 14:51:45 +0200 Subject: [PATCH] csky: Implement _THIS_IP_ using inline asm Both GCC [1] and Clang [2] consider the generic version of _THIS_IP_ to be broken: #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) In particular, the address of a label is only expected to be used with a computed goto. While the generic version more or less works today, it is known to be brittle and may break with current and future optimizations. For example, Clang -O2 always returns 1 when this function is inlined: static inline unsigned long get_ip(void) { return ({ __label__ __here; __here: (unsigned long)&&__here; }); } Fix it by overriding _THIS_IP_ in <asm/linkage.h> (which is included by <linux/instruction_pointer.h>) using an architecture-specific inline asm version. Additionally, avoiding taking the address of a label prevents compilers from emitting spurious indirect branch targets (e.g. ENDBR or BTI) under control-flow integrity schemes. Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071 [1] Link: https://github.com/llvm/llvm-project/issues/138272 [2] Signed-off-by: Marco Elver <elver@google.com> --- arch/csky/include/asm/linkage.h | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 arch/csky/include/asm/linkage.h diff --git a/arch/csky/include/asm/linkage.h b/arch/csky/include/asm/linkage.h new file mode 100644 index 000000000000..04afd3583e25 --- /dev/null +++ b/arch/csky/include/asm/linkage.h @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __ASM_CSKY_LINKAGE_H +#define __ASM_CSKY_LINKAGE_H + +#define _THIS_IP_ ({ unsigned long __ip; asm volatile("grs %0, ." : "=r" (__ip)); __ip; }) + +#endif /* __ASM_CSKY_LINKAGE_H */ -- 2.56.0.rc1.315.gc6ed9934b7-goog ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: csky ICe (was: Re: [PATCH v4 2/3] slab: improve KMALLOC_PARTITION_RANDOM randomness) 2026-09-24 12:36 ` Marco Elver @ 2026-09-25 4:40 ` Guenter Roeck 0 siblings, 0 replies; 4+ messages in thread From: Guenter Roeck @ 2026-09-25 4:40 UTC (permalink / raw) To: Marco Elver Cc: Vlastimil Babka, Andrew Morton, Gustavo A. R. Silva, Liam R. Howlett, Andrey Konovalov, Bill Wendling, David Hildenbrand, David Rientjes, Dmitry Vyukov, Jann Horn, Justin Stitt, KP Singh, Kees Cook, Lorenzo Stoakes, Matteo Rizzo, Michal Hocko, Mike Rapoport, Nathan Chancellor, Nick Desaulniers, Roman Gushchin, Suren Baghdasaryan, linux-hardening, Nicolas Schier, Dennis Zhou, Tejun Heo, Christoph Lameter, Harry Yoo, Hao Li, Liam R. Howlett, Alexander Potapenko, Miguel Ojeda, linux-kbuild, linux-kernel, linux-mm, kasan-dev, llvm, Guo Ren, linux-csky On Thu, Sep 24, 2026 at 12:36:40PM +0000, Marco Elver wrote: > On Tue, Sep 22, 2026 at 07:58AM -0700, Guenter Roeck wrote: > > Hi, > > > > On Mon, May 11, 2026 at 10:00:49PM +0200, Marco Elver wrote: > > > When using CONFIG_KMALLOC_PARTITION_RANDOM, _RET_IP_ was previously used > > > to identify the allocation site. _RET_IP_, however, evaluates to the > > > caller's parent's instruction pointer rather than the actual allocation > > > site; this would lead to collisions where a function performs multiple > > > allocations. > > > > > > With the generalization to kmalloc_token_t, we now generate the token at > > > the outermost macro, and using _THIS_IP_ would fix this for all cases. > > > > > > Unfortunately, the generic implementation of _THIS_IP_ relies on taking > > > the address of a local label, which is considered broken by both GCC [1] > > > and Clang [2] because label addresses are only expected to be used with > > > computed gotos. While the generic version more or less works today, it > > > is known to be brittle. For example, Clang -O2 always returns 1 when > > > this function is inlined: > > > > > > static inline unsigned long get_ip(void) > > > { return ({ __label__ __here; __here: (unsigned long)&&__here; }); } > > > > > > To provide a reliable unique identifier without breaking architectures > > > relying on the generic _THIS_IP_, introduce _CODE_LOCATION_: it resolves > > > to _THIS_IP_ where architectures provide a safe implementation, and > > > falls back to a zero-cost static marker where _THIS_IP_ is broken. > > > > > > Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071 [1] > > > Link: https://github.com/llvm/llvm-project/issues/138272 [2] > > > Signed-off-by: Marco Elver <elver@google.com> > > > > With this patch in the tree, I get ICE erors when trying to build > > csky:allmodconfig. > > > > Example: > > > > Error log: > > sound/core/oss/mixer_oss.c: In function 'snd_mixer_oss_proc_write': > > sound/core/oss/mixer_oss.c:1202:1: error: could not split insn > > 1202 | } > > | ^ > > (insn 183 400 184 (set (reg:SI 0 a0 [orig:307 _55 ] [307]) > > (xor:SI (reg:SI 3 a3 [orig:308 random_kmalloc_seed ] [308]) > > (const:SI (plus:SI (symbol_ref:SI ("*.LANCHOR0") [flags 0x182]) > > (const_int 132 [0x84]))))) "include/linux/slab.h":759:52 288 {cskyv2_xorsi3} > > (expr_list:REG_DEAD (reg:SI 3 a3 [orig:308 random_kmalloc_seed ] [308]) > > (nil))) > > during RTL pass: final > > sound/core/oss/mixer_oss.c:1202:1: internal compiler error: in final_scan_insn_1, at final.cc:2813 > > 0x779b51e2a1c9 __libc_start_call_main > > ../sysdeps/nptl/libc_start_call_main.h:58 > > 0x779b51e2a28a __libc_start_main_impl > > ../csu/libc-start.c:360 > > > > This happens with lots of files, not just this one. It is seen with all > > versions of gcc starting with at least v13.x. Reverting this patch fixes > > the problem. Bisect log is attached for reference. > > > > Any idea what I could do to avoid the problem other than stopping to build > > csky:allmodconfig ? > > No idea what gcc is falling over here, but the below patch could be a > workaround/fix. Does that work better? > Yes, it does. Tested-by: Guenter Roeck <linux@roeck-us.net> Thanks, Guenter > ------ >8 ------ > > From: Marco Elver <elver@google.com> > Date: Fri, 8 May 2026 14:51:45 +0200 > Subject: [PATCH] csky: Implement _THIS_IP_ using inline asm > > Both GCC [1] and Clang [2] consider the generic version of _THIS_IP_ to > be broken: > > #define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; }) > > In particular, the address of a label is only expected to be used with a > computed goto. > > While the generic version more or less works today, it is known to be > brittle and may break with current and future optimizations. For > example, Clang -O2 always returns 1 when this function is inlined: > > static inline unsigned long get_ip(void) > { return ({ __label__ __here; __here: (unsigned long)&&__here; }); } > > Fix it by overriding _THIS_IP_ in <asm/linkage.h> (which is included by > <linux/instruction_pointer.h>) using an architecture-specific inline asm > version. Additionally, avoiding taking the address of a label prevents > compilers from emitting spurious indirect branch targets (e.g. ENDBR or > BTI) under control-flow integrity schemes. > > Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071 [1] > Link: https://github.com/llvm/llvm-project/issues/138272 [2] > Signed-off-by: Marco Elver <elver@google.com> > --- > arch/csky/include/asm/linkage.h | 7 +++++++ > 1 file changed, 7 insertions(+) > create mode 100644 arch/csky/include/asm/linkage.h > > diff --git a/arch/csky/include/asm/linkage.h b/arch/csky/include/asm/linkage.h > new file mode 100644 > index 000000000000..04afd3583e25 > --- /dev/null > +++ b/arch/csky/include/asm/linkage.h > @@ -0,0 +1,7 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +#ifndef __ASM_CSKY_LINKAGE_H > +#define __ASM_CSKY_LINKAGE_H > + > +#define _THIS_IP_ ({ unsigned long __ip; asm volatile("grs %0, ." : "=r" (__ip)); __ip; }) > + > +#endif /* __ASM_CSKY_LINKAGE_H */ > -- > 2.56.0.rc1.315.gc6ed9934b7-goog > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-09-25 4:40 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20260511200136.3201646-1-elver@google.com>
[not found] ` <20260511200136.3201646-2-elver@google.com>
2026-09-22 14:58 ` csky ICe (was: Re: [PATCH v4 2/3] slab: improve KMALLOC_PARTITION_RANDOM randomness) Guenter Roeck
2026-09-23 9:19 ` Mike Rapoport
2026-09-24 12:36 ` Marco Elver
2026-09-25 4:40 ` Guenter Roeck
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox