Skip to contentSkip to conversation

Patch "kexec: define functions to map and unmap segments" has been added to the 6.12-stable tree

DISCUSSION steven chen 2 participants 2 messages Mar 9 1 message not in the archive Stable branch

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw
Quoted 75 lines · Sasha Levin

This is a note to let you know that I've just added the patch titled

kexec: define functions to map and unmap segments

to the 6.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
kexec-define-functions-to-map-and-unmap-segments.patch
and it can be found in the queue-6.12 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

commit 51827bfcdc1c02aa4ea01b7aadcea8c2b8250666

Author: Steven Chen <[email protected]>
Date:   Mon Apr 21 15:25:09 2025 -0700

kexec: define functions to map and unmap segments

[ Upstream commit 0091d9241ea24c5275be4a3e5a032862fd9de9ec ]

Implement kimage_map_segment() to enable IMA to map the measurement log list to the kimage structure during the kexec 'load' stage. This function gathers the source pages within the specified address range, and maps them to a contiguous virtual address range.

This is a preparation for later usage.

Implement kimage_unmap_segment() for unmapping segments using vunmap().

Stable-dep-of: 10d1c75ed438 ("ima: verify the previous kernel's IMA buffer lies in addressable RAM")

include/linux/kexec.h +6 -0
index f0e9f8eda7a3c..7d6b12f8b8d05 100644
@@ -467,13 +467,19 @@ extern bool kexec_file_dbg_print;
  #define kexec_dprintk(fmt, arg...) \
          do { if (kexec_file_dbg_print) pr_info(fmt, ##arg); } while (0)
 
+extern void *kimage_map_segment(struct kimage *image, unsigned long addr, unsigned long size);
+extern void kimage_unmap_segment(void *buffer);
  #else /* !CONFIG_KEXEC_CORE */
  struct pt_regs;
  struct task_struct;
+struct kimage;
  static inline void __crash_kexec(struct pt_regs *regs) { }
  static inline void crash_kexec(struct pt_regs *regs) { }
  static inline int kexec_should_crash(struct task_struct *p) { return 0; }
  static inline int kexec_crash_loaded(void) { return 0; }
+static inline void *kimage_map_segment(struct kimage *image, unsigned long addr, unsigned long size)
+{ return NULL; }
+static inline void kimage_unmap_segment(void *buffer) { }
  #define kexec_in_progress false
  #endif /* CONFIG_KEXEC_CORE */
 
kernel/kexec_core.c +0 -0
index c0caa14880c3b..6c15cd5b9cae5 100644

kernel/kexec_core.c int kimage_load_segment(struct kimage *image, · line 872

Quoted 6 lines
kernel/kexec_core.c +3 -0
@@ -867,6 +867,60 @@ int kimage_load_segment(struct kimage *image,
  	return result;
  }
 
+void *kimage_map_segment(struct kimage *image,
+			 unsigned long addr, unsigned long size)
+{

please consider the following patch applicable or not:

[PATCH 1/2] kernel/kexec: Change the prototype of kimage_map_segment() - Pingfan Liu <https://lore.kernel.org/linux-integrity/[email protected]/>

Steven

Quoted 54 lines
kernel/kexec_core.c +51 -0
+	unsigned long src_page_addr, dest_page_addr = 0;
+	unsigned long eaddr = addr + size;
+	kimage_entry_t *ptr, entry;
+	struct page **src_pages;
+	unsigned int npages;
+	void *vaddr = NULL;
+	int i;
+
+	/*
+	 * Collect the source pages and map them in a contiguous VA range.
+	 */
+	npages = PFN_UP(eaddr) - PFN_DOWN(addr);
+	src_pages = kmalloc_array(npages, sizeof(*src_pages), GFP_KERNEL);
+	if (!src_pages) {
+		pr_err("Could not allocate ima pages array.\n");
+		return NULL;
+	}
+
+	i = 0;
+	for_each_kimage_entry(image, ptr, entry) {
+		if (entry & IND_DESTINATION) {
+			dest_page_addr = entry & PAGE_MASK;
+		} else if (entry & IND_SOURCE) {
+			if (dest_page_addr >= addr && dest_page_addr < eaddr) {
+				src_page_addr = entry & PAGE_MASK;
+				src_pages[i++] =
+					virt_to_page(__va(src_page_addr));
+				if (i == npages)
+					break;
+				dest_page_addr += PAGE_SIZE;
+			}
+		}
+	}
+
+	/* Sanity check. */
+	WARN_ON(i < npages);
+
+	vaddr = vmap(src_pages, npages, VM_MAP, PAGE_KERNEL);
+	kfree(src_pages);
+
+	if (!vaddr)
+		pr_err("Could not map ima buffer.\n");
+
+	return vaddr;
+}
+
+void kimage_unmap_segment(void *segment_buffer)
+{
+	vunmap(segment_buffer);
+}
+
  struct kexec_load_limit {
  	/* Mutex protects the limit count. */
  	struct mutex mutex;
#2 lore raw
Quoted 9 lines · On Mon, 9 Mar 2026 11:20:49 -0700 steven chen <[email protected]>…

Review

Quoted 3 lines
(quoted diff) +3 -0
+void *kimage_map_segment(struct kimage *image,
+			 unsigned long addr, unsigned long size)
+{

please consider the following patch applicable or not:

[PATCH 1/2] kernel/kexec: Change the prototype of kimage_map_segment() - Pingfan Liu
<https://lore.kernel.org/linux-integrity/[email protected]/>

That series was upstreamed in December.