<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://cve.radiocsirt.org</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Mon, 12 Oct 2026 07:04:18 +0000</lastBuildDate>
    <item>
      <title>CVE-2025-37964 — x86/mm: Eliminate window where TLB flushes may be inadvertently skipped</title>
      <link>https://cve.radiocsirt.org/vuln/cve-2025-37964</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux, Siemens SIMATIC S7-1500 CPU 1518-4 PN/DP MFP, Siemens SIMATIC S7-1500 CPU 1518F-4 PN/DP MFP, Siemens SIPLUS S7-1500 CPU 1518-4 PN/DP MFP&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;x86/mm: Eliminate window where TLB flushes may be inadvertently skipped&lt;/p&gt;
&lt;p&gt;tl;dr: There is a window in the mm switching code where the new CR3 is
set and the CPU should be getting TLB flushes for the new mm.  But
should_flush_tlb() has a bug and suppresses the flush.  Fix it by
widening the window where should_flush_tlb() sends an IPI.&lt;/p&gt;
&lt;p&gt;Long Version:&lt;/p&gt;
&lt;p&gt;=== History ===&lt;/p&gt;
&lt;p&gt;There were a few things leading up to this.&lt;/p&gt;
&lt;p&gt;First, updating mm_cpumask() was observed to be too expensive, so it was
made lazier.  But being lazy caused too many unnecessary IPIs to CPUs
due to the now-lazy mm_cpumask().  So code was added to cull
mm_cpumask() periodically[2].  But that culling was a bit too aggressive
and skipped sending TLB flushes to CPUs that need them.  So here we are
again.&lt;/p&gt;
&lt;p&gt;=== Problem ===&lt;/p&gt;
&lt;p&gt;The too-aggressive code in should_flush_tlb() strikes in this window:&lt;/p&gt;
&lt;p&gt;// Turn on IPIs for this CPU/mm combination, but only
	// if should_flush_tlb() agrees:
	cpumask_set_cpu(cpu, mm_cpumask(next));&lt;/p&gt;
&lt;p&gt;next_tlb_gen = atomic64_read(&amp;amp;next-&amp;gt;context.tlb_gen);
	choose_new_asid(next, next_tlb_gen, &amp;amp;new_asid, &amp;amp;need_flush);
	load_new_mm_cr3(need_flush);
	// ^ After &amp;#39;need_flush&amp;#39; is set to false, IPIs *MUST*
	// be sent to this CPU and not be ignored.&lt;/p&gt;
&lt;p&gt;this_cpu_write(cpu_tlbstate.loaded_mm, next);
	// ^ Not until this point does should_flush_tlb()
	// become true!&lt;/p&gt;
&lt;p&gt;should_flush_tlb() will suppress TLB flushes between load_new_mm_cr3()…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux, Siemens SIMATIC S7-1500 CPU 1518-4 PN/DP MFP, Siemens SIMATIC S7-1500 CPU 1518F-4 PN/DP MFP, Siemens SIPLUS S7-1500 CPU 1518-4 PN/DP MFP&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;x86/mm: Eliminate window where TLB flushes may be inadvertently skipped&lt;/p&gt;
&lt;p&gt;tl;dr: There is a window in the mm switching code where the new CR3 is
set and the CPU should be getting TLB flushes for the new mm.  But
should_flush_tlb() has a bug and suppresses the flush.  Fix it by
widening the window where should_flush_tlb() sends an IPI.&lt;/p&gt;
&lt;p&gt;Long Version:&lt;/p&gt;
&lt;p&gt;=== History ===&lt;/p&gt;
&lt;p&gt;There were a few things leading up to this.&lt;/p&gt;
&lt;p&gt;First, updating mm_cpumask() was observed to be too expensive, so it was
made lazier.  But being lazy caused too many unnecessary IPIs to CPUs
due to the now-lazy mm_cpumask().  So code was added to cull
mm_cpumask() periodically[2].  But that culling was a bit too aggressive
and skipped sending TLB flushes to CPUs that need them.  So here we are
again.&lt;/p&gt;
&lt;p&gt;=== Problem ===&lt;/p&gt;
&lt;p&gt;The too-aggressive code in should_flush_tlb() strikes in this window:&lt;/p&gt;
&lt;p&gt;// Turn on IPIs for this CPU/mm combination, but only
	// if should_flush_tlb() agrees:
	cpumask_set_cpu(cpu, mm_cpumask(next));&lt;/p&gt;
&lt;p&gt;next_tlb_gen = atomic64_read(&amp;amp;next-&amp;gt;context.tlb_gen);
	choose_new_asid(next, next_tlb_gen, &amp;amp;new_asid, &amp;amp;need_flush);
	load_new_mm_cr3(need_flush);
	// ^ After &amp;#39;need_flush&amp;#39; is set to false, IPIs *MUST*
	// be sent to this CPU and not be ignored.&lt;/p&gt;
&lt;p&gt;this_cpu_write(cpu_tlbstate.loaded_mm, next);
	// ^ Not until this point does should_flush_tlb()
	// become true!&lt;/p&gt;
&lt;p&gt;should_flush_tlb() will suppress TLB flushes between load_new_mm_cr3()…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/cve-2025-37964</guid>
    </item>
  </channel>
</rss>
