[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/7] x86/kexec: add new struct kimage_segment


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Kevin Lampis <kevin.lampis@xxxxxxxxxx>
  • Date: Tue, 9 Jun 2026 16:45:14 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4oRcVjU3CohvWdlNeXdCS9k2NhJswH1Ylop2GchbfSo=; b=N9C9ZucCGP6DgHMp/LkHC1JGhxB4nQH2edApf9zkugGovvt45AsLSlxbOwRPhWPxnkfl+1KHRqaY/wQkdT6egtJ+Mjm1/Q1AegVTulEHRK62ejE2cApf54NZLrn4AyOnY/d6NqwhafivinyXKDFyp84cLnL+wyi+4WpUsSaAuPmt0ExpK8P+M390ipVZWgnNhV0+BrNXX8ib9Z9JlcOvEz6+ymZ93URYWCIuAyyFbxpgI7P7oC/QqzdfuzhwNIdEefg0K7gfrpdK5SruDn0k6pOifGst8FA+MwmI56a6vZn992at6RjfKa1NW78jYl4bLKq/cH7einnX2cAGEjJtlg==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=T5PN7uAN13m4ejfpeyRYNUUUar+8YCf7cIRLk2vQiZQJsSZn8NPjlnK30l8hXxVJcRyucQzwjwN6sy3voe+zz+YXWCKtSv/y/nfVAkPx6arCYKDaoMNPhwzqlRF10MXnH9lEjr9wanO8XPR2mYGBzJiUOtCIMb4bG0xcmDeSK82Dh7GpLwN8BSYJEInz5sAAWPux7BKl1v3ZEkODnWPK3V1lekQYTCNwAM5QYQqFFgpk0zx4UnxdqW747xrp6VauaJpfBCj739+LgOwqKr54ZxwD4TYDwAD2Bi3TGMunvg/PN7BCsoSRWBRFzAqShw/lpHrCR1aiDEJMtvQVw8HSLQ==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: jbeulich@xxxxxxxx, andrew.cooper3@xxxxxxxxxx, roger.pau@xxxxxxxxxx, Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>, Kevin Lampis <klampis@xxxxxxxxxx>
  • Delivery-date: Tue, 09 Jun 2026 15:44:56 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

From: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>

New struct for interal use because Secure Boot code needs to add an
extra field in a future patch.

Signed-off-by: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
Signed-off-by: Kevin Lampis <klampis@xxxxxxxxxx>

---
 xen/common/kexec.c       | 23 ++++++++++++++---------
 xen/common/kimage.c      | 17 +++++++++--------
 xen/include/xen/kimage.h | 14 ++++++++++++--
 3 files changed, 35 insertions(+), 19 deletions(-)

diff --git a/xen/common/kexec.c b/xen/common/kexec.c
index c920bc6d8a..00346fe616 100644
--- a/xen/common/kexec.c
+++ b/xen/common/kexec.c
@@ -916,7 +916,7 @@ static uint16_t kexec_load_v1_arch(void)
 }
 
 static int kexec_segments_add_segment(unsigned int *nr_segments,
-                                      xen_kexec_segment_t *segments,
+                                      struct kimage_segment *segments,
                                       mfn_t mfn)
 {
     paddr_t maddr = mfn_to_maddr(mfn);
@@ -942,7 +942,7 @@ static int kexec_segments_add_segment(unsigned int 
*nr_segments,
 
 static int kexec_segments_from_ind_page(mfn_t mfn,
                                         unsigned int *nr_segments,
-                                        xen_kexec_segment_t *segments,
+                                        struct kimage_segment *segments,
                                         bool compat)
 {
     void *page;
@@ -997,7 +997,7 @@ done:
 static int kexec_do_load_v1(xen_kexec_load_v1_t *load, int compat)
 {
     struct kexec_image *kimage = NULL;
-    xen_kexec_segment_t *segments;
+    struct kimage_segment *segments;
     uint16_t arch;
     unsigned int nr_segments = 0;
     mfn_t ind_mfn = maddr_to_mfn(load->image.indirection_page);
@@ -1007,7 +1007,7 @@ static int kexec_do_load_v1(xen_kexec_load_v1_t *load, 
int compat)
     if ( arch == EM_NONE )
         return -ENOSYS;
 
-    segments = xmalloc_array(xen_kexec_segment_t, KEXEC_SEGMENT_MAX);
+    segments = xmalloc_array(struct kimage_segment, KEXEC_SEGMENT_MAX);
     if ( segments == NULL )
         return -ENOMEM;
 
@@ -1109,9 +1109,10 @@ static int 
kexec_load_v1_compat(XEN_GUEST_HANDLE_PARAM(void) uarg)
 static int kexec_load(XEN_GUEST_HANDLE_PARAM(void) uarg)
 {
     xen_kexec_load_t load;
-    xen_kexec_segment_t *segments;
+    struct kimage_segment *segments;
     struct kexec_image *kimage = NULL;
     int ret;
+    unsigned int i;
 
     if ( copy_from_guest(&load, uarg, 1) )
         return -EFAULT;
@@ -1119,14 +1120,18 @@ static int kexec_load(XEN_GUEST_HANDLE_PARAM(void) uarg)
     if ( load.nr_segments >= KEXEC_SEGMENT_MAX )
         return -EINVAL;
 
-    segments = xmalloc_array(xen_kexec_segment_t, load.nr_segments);
+    segments = xmalloc_array(struct kimage_segment, load.nr_segments);
     if ( segments == NULL )
         return -ENOMEM;
 
-    if ( copy_from_guest(segments, load.segments.h, load.nr_segments) )
+    for ( i = 0; i < load.nr_segments; i++ )
     {
-        ret = -EFAULT;
-        goto error;
+        if ( copy_from_guest_offset((xen_kexec_segment_t *)&segments[i],
+                                    load.segments.h, i, 1) )
+        {
+            ret = -EFAULT;
+            goto error;
+        }
     }
 
     ret = kimage_alloc(&kimage, load.type, load.arch, load.entry_maddr,
diff --git a/xen/common/kimage.c b/xen/common/kimage.c
index 018ef66451..2c3fd3c3b0 100644
--- a/xen/common/kimage.c
+++ b/xen/common/kimage.c
@@ -86,7 +86,7 @@ static struct page_info *kimage_alloc_zeroed_page(unsigned 
memflags)
 
 static int do_kimage_alloc(struct kexec_image **rimage, paddr_t entry,
                            unsigned long nr_segments,
-                           xen_kexec_segment_t *segments, uint8_t type)
+                           struct kimage_segment *segments, uint8_t type)
 {
     struct kexec_image *image;
     unsigned long i;
@@ -211,7 +211,7 @@ out:
 
 static int kimage_normal_alloc(struct kexec_image **rimage, paddr_t entry,
                                unsigned long nr_segments,
-                               xen_kexec_segment_t *segments)
+                               struct kimage_segment *segments)
 {
     return do_kimage_alloc(rimage, entry, nr_segments, segments,
                            KEXEC_TYPE_DEFAULT);
@@ -219,7 +219,7 @@ static int kimage_normal_alloc(struct kexec_image **rimage, 
paddr_t entry,
 
 static int kimage_crash_alloc(struct kexec_image **rimage, paddr_t entry,
                               unsigned long nr_segments,
-                              xen_kexec_segment_t *segments)
+                              struct kimage_segment *segments)
 {
     unsigned long i;
 
@@ -669,7 +669,7 @@ found:
 }
 
 static int kimage_load_normal_segment(struct kexec_image *image,
-                                      xen_kexec_segment_t *segment)
+                                      struct kimage_segment *segment)
 {
     unsigned long to_copy;
     unsigned long src_offset;
@@ -722,7 +722,7 @@ static int kimage_load_normal_segment(struct kexec_image 
*image,
 }
 
 static int kimage_load_crash_segment(struct kexec_image *image,
-                                     xen_kexec_segment_t *segment)
+                                     struct kimage_segment *segment)
 {
     /*
      * For crash dumps kernels we simply copy the data from user space
@@ -768,7 +768,8 @@ static int kimage_load_crash_segment(struct kexec_image 
*image,
     return 0;
 }
 
-static int kimage_load_segment(struct kexec_image *image, xen_kexec_segment_t 
*segment)
+static int kimage_load_segment(struct kexec_image *image,
+                               struct kimage_segment *segment)
 {
     int result = -ENOMEM;
     paddr_t addr;
@@ -799,7 +800,7 @@ static int kimage_load_segment(struct kexec_image *image, 
xen_kexec_segment_t *s
 
 int kimage_alloc(struct kexec_image **rimage, uint8_t type, uint16_t arch,
                  uint64_t entry_maddr,
-                 uint32_t nr_segments, xen_kexec_segment_t *segment)
+                 uint32_t nr_segments, struct kimage_segment *segment)
 {
     int result;
 
@@ -824,7 +825,7 @@ int kimage_alloc(struct kexec_image **rimage, uint8_t type, 
uint16_t arch,
 }
 
 static int kimage_calc_one_digest(struct sha2_256_state *ctx,
-                                  xen_kexec_segment_t *segment)
+                                  struct kimage_segment *segment)
 {
     paddr_t dest;
     unsigned long sbytes;
diff --git a/xen/include/xen/kimage.h b/xen/include/xen/kimage.h
index ad52551ba2..258349d774 100644
--- a/xen/include/xen/kimage.h
+++ b/xen/include/xen/kimage.h
@@ -18,12 +18,22 @@
 
 typedef paddr_t kimage_entry_t;
 
+struct kimage_segment {
+    union {
+        XEN_GUEST_HANDLE(const_void) h;
+        uint64_t _pad;
+    } buf;
+    uint64_t buf_size;
+    uint64_t dest_maddr;
+    uint64_t dest_size;
+};
+
 struct kexec_image {
     uint8_t type;
     uint16_t arch;
     uint64_t entry_maddr;
     uint32_t nr_segments;
-    xen_kexec_segment_t *segments;
+    struct kimage_segment *segments;
 
     kimage_entry_t head;
     struct page_info *entry_page;
@@ -44,7 +54,7 @@ struct kexec_image {
 
 int kimage_alloc(struct kexec_image **rimage, uint8_t type, uint16_t arch,
                  uint64_t entry_maddr,
-                 uint32_t nr_segments, xen_kexec_segment_t *segment);
+                 uint32_t nr_segments, struct kimage_segment *segment);
 void kimage_free(struct kexec_image *image);
 int kimage_load_segments(struct kexec_image *image);
 struct page_info *kimage_alloc_control_page(struct kexec_image *image,
-- 
2.52.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.