From: Steven Chen <chenste@linux.microsoft.com>
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().
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Dave Young <dyoung@redhat.com>
Co-developed-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com>
Signed-off-by: steven chen <chenste@linux.microsoft.com>
Acked-by: Baoquan He <bhe@redhat.com>
---
include/linux/kexec.h | 6 +++++
kernel/kexec_core.c | 54 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+)
diff --git a/include/linux/kexec.h b/include/linux/kexec.h
index f0e9f8eda7a3..7d6b12f8b8d0 100644
--- a/include/linux/kexec.h
+++ b/include/linux/kexec.h
@@ -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 */
diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c
index c0bdc1686154..a5e378e1dc7f 100644
--- a/kernel/kexec_core.c
+++ b/kernel/kexec_core.c
@@ -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)
+{
+ 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.43.0
On Mon, 2025-04-21 at 15:25 -0700, steven chen wrote: > From: Steven Chen <chenste@linux.microsoft.com> > > 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(). > > Cc: Eric Biederman <ebiederm@xmission.com> > Cc: Baoquan He <bhe@redhat.com> > Cc: Vivek Goyal <vgoyal@redhat.com> > Cc: Dave Young <dyoung@redhat.com> > Co-developed-by: Tushar Sugandhi <tusharsu@linux.microsoft.com> > Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com> > Signed-off-by: steven chen <chenste@linux.microsoft.com> Checkpatch.pl is complaining that the Signed-off-by tag does not matches the "From:" line only on this patch. I've updated your Signed-off-by tag to match the "From:" line above. > Acked-by: Baoquan He <bhe@redhat.com> Missing from v13 is Stefan's Tested-by tag. As the code hasn't changed, I've added it. In the future, please don't forget to add the tags. Stefen Berger spent quite a bit of time reviewing this patch set, but with v13 most of his Reviewed-by tags are missing. Stefan? For now the patch set is staged in the next-integrity-testing branch. thanks, Mimi
On 4/22/2025 5:29 PM, Mimi Zohar wrote: > On Mon, 2025-04-21 at 15:25 -0700, steven chen wrote: >> From: Steven Chen <chenste@linux.microsoft.com> >> >> 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(). >> >> Cc: Eric Biederman <ebiederm@xmission.com> >> Cc: Baoquan He <bhe@redhat.com> >> Cc: Vivek Goyal <vgoyal@redhat.com> >> Cc: Dave Young <dyoung@redhat.com> >> Co-developed-by: Tushar Sugandhi <tusharsu@linux.microsoft.com> >> Signed-off-by: Tushar Sugandhi <tusharsu@linux.microsoft.com> >> Signed-off-by: steven chen <chenste@linux.microsoft.com> > Checkpatch.pl is complaining that the Signed-off-by tag does not matches the > "From:" line only on this patch. I've updated your Signed-off-by tag to match > the "From:" line above. > >> Acked-by: Baoquan He <bhe@redhat.com> > Missing from v13 is Stefan's Tested-by tag. As the code hasn't changed, I've > added it. In the future, please don't forget to add the tags. > > Stefen Berger spent quite a bit of time reviewing this patch set, but with v13 > most of his Reviewed-by tags are missing. Stefan? > > For now the patch set is staged in the next-integrity-testing branch. > > thanks, > > Mimi Hi Mimi, Could you help to add Tested-by tag for this patch set: "Tested-by: Stefan Berger <stefanb@linux.ibm.com> # ppc64/kvm" Reviewed-by tags "Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>" to patch 1, 5, 6, 9. Thanks a lot. Hi Stefen, Thanks for your help all the time and sorry missing tags to show your work. Sorry again, Steven
On Wed, 2025-04-23 at 08:29 -0700, steven chen wrote: [ ... ] > > Hi Mimi, > > Could you help to add > Tested-by tag for this patch set: "Tested-by: Stefan Berger > <stefanb@linux.ibm.com> # ppc64/kvm" Already done. > Reviewed-by tags "Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>" to > patch 1, 5, 6, 9. I'm pretty sure that Stefan added his Reviewed-by tags to the entire patch set. As soon as we hear back from him, I'll add his tags. Mimi > > Thanks a lot. > > Hi Stefen, > > Thanks for your help all the time and sorry missing tags to show your work. > > Sorry again, > > Steven > >
© 2016 - 2025 Red Hat, Inc.