https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95732

            Bug ID: 95732
           Summary: Use CPU dispatching to support mixing -fcf-protection
                    with -mindirect-branch and -mfunction-return
           Product: gcc
           Version: 10.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: josephcsible at gmail dot com
  Target Milestone: ---
            Target: x86_64

The thunks generated by -mindirect-branch and -mfunction-return should do CPU
dispatching à la "ifunc". We should generate one path for CPUs with CET and one
without. The path without CET should stay like it is today. Intel claims that
their CPUs that support CET no longer need Spectre mitigations. For as long as
this remains true, the path with CET should just be "jmp *%rax" and "ret". If
this ends up turning out to be false, then we should instead use the "incsspq",
"rdsspq", and "wrssq" instructions to make the shadow stack match what we do in
the real stack. (We can't just do this unconditionally, since unlike "endbr64",
those instructions aren't all NOPs on older CPUs.) This change will allow the
same binary to run safely on Spectre-vulnerable CPUs and still get the benefits
of CET on new CPUs, without needing programs to all supply their own external
thunks.

Reply via email to