From: Kees Cook <kees@kernel.org>
To: Andrea Pinski <andrew.pinski@oss.qualcomm.com>
Cc: Jeffrey Law <jefflaw@qti.qualcomm.com>,
Joseph Myers <josmyers@redhat.com>,
Richard Biener <rguenther@suse.de>,
Jeff Law <jeffreyalaw@gmail.com>,
Andrew Pinski <pinskia@gmail.com>,
Jakub Jelinek <jakub@redhat.com>,
Martin Uecker <uecker@tugraz.at>,
Peter Zijlstra <peterz@infradead.org>,
Ard Biesheuvel <ardb@kernel.org>, Jan Hubicka <hubicka@ucw.cz>,
Richard Earnshaw <richard.earnshaw@arm.com>,
Richard Sandiford <richard.sandiford@arm.com>,
Marcus Shawcroft <marcus.shawcroft@arm.com>,
Kyrylo Tkachov <kyrylo.tkachov@arm.com>,
Kito Cheng <kito.cheng@gmail.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Andrew Waterman <andrew@sifive.com>,
Jim Wilson <jim.wilson.gcc@gmail.com>,
Dan Li <ashimida.1990@gmail.com>,
Sami Tolvanen <samitolvanen@google.com>,
Ramon de C Valle <rcvalle@google.com>,
Joao Moreira <joao@overdrivepizza.com>,
Nathan Chancellor <nathan@kernel.org>,
Bill Wendling <morbo@google.com>,
"Osterlund, Sebastian" <sebastian.osterlund@intel.com>,
"Constable, Scott D" <scott.d.constable@intel.com>,
gcc-patches@gcc.gnu.org, linux-hardening@vger.kernel.org
Subject: Re: [PATCH v13 2/7] kcfi: Add core Kernel Control Flow Integrity infrastructure
Date: Wed, 15 Jul 2026 15:34:09 -0700 [thread overview]
Message-ID: <202607151337.31D0828D0@keescook> (raw)
In-Reply-To: <CALvbMcDwYgJNo=qeZY1m+zAutURc7rfRCaW960DDjbRAOKUZ+w@mail.gmail.com>
On Sat, Jun 27, 2026 at 03:57:36PM -0700, Andrea Pinski wrote:
> On Thu, Jun 18, 2026 at 1:45 PM Kees Cook <kees@kernel.org> wrote:
> > [...]
> > diff --git a/gcc/kcfi.h b/gcc/kcfi.h
> > new file mode 100644
> > index 000000000000..ea7e7881040f
> > --- /dev/null
> > +++ b/gcc/kcfi.h
> > [...]
> > +#include "config.h"
> > +#include "system.h"
> > +#include "coretypes.h"
> > +#include "rtl.h"
>
> This is wrong. Don't include config.h nor system.h in a header file.
Okay, removing.
>
> > +
> > +/* Common helper for RTL patterns to emit .kcfi_traps section entry.
> > + Call after emitting trap label and instruction with the trap symbol
> > + reference. */
> > +extern void kcfi_emit_traps_section (FILE *file, rtx trap_label_sym,
> > + int labelno);
> > +
> > +/* Extract KCFI type ID from current GIMPLE statement. */
> > +extern rtx internal_kcfi_get_type_id_for_expanding_gimple_call (void);
> > +
> > +/* Convenience wrapper to check for SANITIZE_KCFI. */
> > +static inline rtx
> Remove static.
Okay. This is a Linux-ism in my finger, I think. :)
> > [...]
> > --- /dev/null
> > +++ b/gcc/kcfi.cc
> > @@ -0,0 +1,696 @@
> > +/* Kernel Control Flow Integrity (KCFI) support for GCC.
> > + Copyright (C) 2025 Free Software Foundation, Inc.
>
> 2026.
Yup, I went and hunted down all of these.
> > [...]
> > +#include "config.h"
> `#define INCLUDE_STRING` is needed based on review of the previous patch.
Got it.
> > [...]
> > +/* KCFI label counter, incremented by KCFI insn emission. */
> > +static int kcfi_labelno = 0;
>
> I am not 100% sure if this needs a GTY marker or not. I suspect no
> because we should not have emitted assembly code yet.
If this moves with kcfi_next_labelno into final, I think it's okay
without GTY?
> > +
> > +/* Get next KCFI label number. Returns the current KCFI label number
> > + and increments the internal counter for the next call. The label is
> > + used to provide a unique number for each indirect callsite of the
> > + current module of the compilation. */
> > +
> > +int
> > +kcfi_next_labelno (void)
> > +{
> > + return kcfi_labelno++;
> > +}
>
> Seems like this should be instead in `final.{cc,h}` rather than `kfci.{cc,h}`.
I think you want this because it's exclusively used during output phase?
I'll get it moved.
> > +/* Function attribute to store KCFI type ID. */
> > +static tree kcfi_type_id_attr = NULL_TREE;
>
> This 100% needs a GTY marker. to make sure the identifier does not get freed.
Got it.
> > +
> > +/* Get KCFI type ID for a function type. Set it if missing. FN_TYPE
> > + is the function type tree node. Returns the cached or newly computed
> > + 32-bit KCFI type identifier, storing it as a type attribute. */
> > +
> > +static uint32_t
> > +kcfi_get_type_id (tree fn_type)
> > +{
> > + uint32_t type_id;
> > +
> > + /* Cache the attribute identifier for build_tree_list usage. */
> > + if (!kcfi_type_id_attr)
> > + kcfi_type_id_attr = get_identifier ("kcfi_type_id");
> > +
> > + tree attr = lookup_attribute ("kcfi_type_id", TYPE_ATTRIBUTES (fn_type));
> > + if (attr)
> > + {
> > + tree value = TREE_VALUE (attr);
> > + gcc_assert (value && TREE_CODE (value) == INTEGER_CST);
> gcc_assert (tree_fits_uhwi_p (value));
> type_id = tree_to_uhwi (value);
Updated.
> > + type_id = (uint32_t) TREE_INT_CST_LOW (value);
> > + }
> > + else
> > + {
> > + type_id = compute_kcfi_type_id (fn_type);
> > +
> > + tree type_id_tree = build_int_cst (unsigned_type_node, type_id);
> > + tree attr = build_tree_list (kcfi_type_id_attr, type_id_tree);
> > +
> > + TYPE_ATTRIBUTES (fn_type) = chainon (TYPE_ATTRIBUTES (fn_type), attr);
> > + }
>
> Instead of an attribute there must be a better way of doing this.
> Maybe a hashset instead.
Perhaps? I will go examine this vs LTO, etc.
> > [...]
> > +rtx
> > +internal_kcfi_get_type_id_for_expanding_gimple_call (void)
> > +{
> > + gcc_assert (currently_expanding_gimple_stmt);
>
> gcall *call_stmt = dyn_cast<gcall *> (currently_expanding_gimple_stmt);
> gcc_assert (call_stmt);
Updated.
> > [...]
> > + /* Emit .type directive. */
> > + ASM_OUTPUT_TYPE_DIRECTIVE (asm_file, cfi_symbol_name.c_str (), "function");
> > + ASM_OUTPUT_LABEL (asm_file, cfi_symbol_name.c_str ());
> > +
> > + /* Emit any needed alignment padding NOPs using target's NOP template. */
> > + for (int i = 0; i < kcfi_alignment_padding_nops; i++)
> > + output_asm_insn (kcfi_nop, NULL);
> I think you need to calculate kcfi_nop each time you call this
> function. Instead of caching it. For GC reasons.
Uh, do I have to? This seems wasteful: the nop is generated frequently.
Should kcfi_nop gain GTY instead? I will take a closer look at this.
> > [...]
> > +static unsigned int
> > +ipa_kcfi_execute (void)
> > +{
> > + struct cgraph_node *node;
> > +
> > + /* Prepare global KCFI alignment NOPs calculation once for all functions. */
> > + kcfi_prepare_alignment_nops ();
> > +
> > + /* Process all functions - both local and external. */
> > + FOR_EACH_FUNCTION (node)
> > + {
> > + tree fndecl = node->decl;
> > +
> > + /* Skip all non-NORMAL builtins (MD, FRONTEND) entirely.
> > + For NORMAL builtins, skip those that lack an implicit
> > + implementation (closest way to distinguishing DEF_LIB_BUILTIN
> > + from others). E.g. we need to have typeids for memset(). */
> > + if (fndecl_built_in_p (fndecl))
> > + {
> > + if (DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
> > + continue;
> > + if (!builtin_decl_implicit_p (DECL_FUNCTION_CODE (fndecl)))
> > + continue;
> > + }
> > +
> > + /* Cache the type_id in the function type. */
> > + kcfi_get_type_id (TREE_TYPE (fndecl));
>
> Why are you needing to cache here?
This was originally added for the __kcfi_typeid emission for functions
known to the TU since at the time I couldn't figure out how to deal with
lacking FN_TYPE (to see the function argument types), but that logic
changed in v3, and I never noticed I didn't have to cache it any more.
It looks like I can drop this.
So... we could just not cache this at all, I guess? It seems wrong to
keep resolving the same typeid over and over though. I will look at
hashset, though, as you suggested.
-Kees
--
Kees Cook
next prev parent reply other threads:[~2026-07-15 22:34 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-18 20:45 [PATCH v13 0/7] Introduce Kernel Control Flow Integrity ABI [PR107048] Kees Cook
2026-06-18 20:45 ` [PATCH v13 1/7] kcfi: Introduce KCFI typeinfo mangling API Kees Cook
2026-06-27 22:00 ` Andrea Pinski
2026-07-15 19:06 ` Kees Cook
2026-07-16 0:07 ` Kees Cook
2026-07-16 0:28 ` Andrea Pinski
2026-08-07 18:38 ` Kees Cook
2026-06-18 20:45 ` [PATCH v13 2/7] kcfi: Add core Kernel Control Flow Integrity infrastructure Kees Cook
2026-06-27 22:57 ` Andrea Pinski
2026-06-27 23:05 ` Andrea Pinski
2026-07-15 22:34 ` Kees Cook [this message]
2026-07-15 23:32 ` Kees Cook
2026-07-24 1:28 ` Andrea Pinski
2026-08-07 19:27 ` Kees Cook
2026-06-18 20:45 ` [PATCH v13 3/7] kcfi: Add regression test suite Kees Cook
2026-06-18 20:45 ` [PATCH v13 4/7] x86: Add x86_64 Kernel Control Flow Integrity implementation Kees Cook
2026-06-18 20:45 ` [PATCH v13 5/7] aarch64: Add AArch64 " Kees Cook
2026-06-27 23:00 ` Andrea Pinski
2026-07-15 19:56 ` Kees Cook
2026-06-18 20:45 ` [PATCH v13 6/7] arm: Add ARM 32-bit " Kees Cook
2026-06-18 20:45 ` [PATCH v13 7/7] riscv: Add RISC-V " Kees Cook
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202607151337.31D0828D0@keescook \
--to=kees@kernel.org \
--cc=andrew.pinski@oss.qualcomm.com \
--cc=andrew@sifive.com \
--cc=ardb@kernel.org \
--cc=ashimida.1990@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=hubicka@ucw.cz \
--cc=jakub@redhat.com \
--cc=jefflaw@qti.qualcomm.com \
--cc=jeffreyalaw@gmail.com \
--cc=jim.wilson.gcc@gmail.com \
--cc=joao@overdrivepizza.com \
--cc=josmyers@redhat.com \
--cc=kito.cheng@gmail.com \
--cc=kyrylo.tkachov@arm.com \
--cc=linux-hardening@vger.kernel.org \
--cc=marcus.shawcroft@arm.com \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=palmer@dabbelt.com \
--cc=peterz@infradead.org \
--cc=pinskia@gmail.com \
--cc=rcvalle@google.com \
--cc=rguenther@suse.de \
--cc=richard.earnshaw@arm.com \
--cc=richard.sandiford@arm.com \
--cc=samitolvanen@google.com \
--cc=scott.d.constable@intel.com \
--cc=sebastian.osterlund@intel.com \
--cc=uecker@tugraz.at \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox