]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[sdi] Remove userptr_t from SDI image parsing
authorMichael Brown <mcb30@ipxe.org>
Thu, 24 Apr 2025 22:01:25 +0000 (23:01 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 24 Apr 2025 22:01:25 +0000 (23:01 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/image/sdi.c

index 40fab2a10b98ff9b1d292458087f0b8b84dbc1f7..cdfdeb3695def767cb0ffc61cacee008814c94fc 100644 (file)
@@ -44,33 +44,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 FEATURE ( FEATURE_IMAGE, "SDI", DHCP_EB_FEATURE_SDI, 1 );
 
-/**
- * Parse SDI image header
- *
- * @v image            SDI file
- * @v sdi              SDI header to fill in
- * @ret rc             Return status code
- */
-static int sdi_parse_header ( struct image *image, struct sdi_header *sdi ) {
-
-       /* Sanity check */
-       if ( image->len < sizeof ( *sdi ) ) {
-               DBGC ( image, "SDI %p too short for SDI header\n", image );
-               return -ENOEXEC;
-       }
-
-       /* Read in header */
-       copy_from_user ( sdi, image->data, 0, sizeof ( *sdi ) );
-
-       /* Check signature */
-       if ( sdi->magic != SDI_MAGIC ) {
-               DBGC ( image, "SDI %p is not an SDI image\n", image );
-               return -ENOEXEC;
-       }
-
-       return 0;
-}
-
 /**
  * Execute SDI image
  *
@@ -78,28 +51,27 @@ static int sdi_parse_header ( struct image *image, struct sdi_header *sdi ) {
  * @ret rc             Return status code
  */
 static int sdi_exec ( struct image *image ) {
-       struct sdi_header sdi;
+       struct sdi_header *sdi;
        uint32_t sdiptr;
-       int rc;
 
-       /* Parse image header */
-       if ( ( rc = sdi_parse_header ( image, &sdi ) ) != 0 )
-               return rc;
+       /* Sanity check */
+       assert ( image->len >= sizeof ( *sdi ) );
+       sdi = image->data;
 
        /* Check that image is bootable */
-       if ( sdi.boot_size == 0 ) {
-               DBGC ( image, "SDI %p is not bootable\n", image );
+       if ( sdi->boot_size == 0 ) {
+               DBGC ( image, "SDI %s is not bootable\n", image->name );
                return -ENOTTY;
        }
-       DBGC ( image, "SDI %p image at %08lx+%08zx\n",
-              image, virt_to_phys ( image->data ), image->len );
-       DBGC ( image, "SDI %p boot code at %08llx+%llx\n", image,
-              ( virt_to_phys ( image->data ) + sdi.boot_offset ),
-              sdi.boot_size );
+       DBGC ( image, "SDI %s image at %08lx+%08zx\n",
+              image->name, virt_to_phys ( image->data ), image->len );
+       DBGC ( image, "SDI %s boot code at %08llx+%llx\n", image->name,
+              ( virt_to_phys ( image->data ) + sdi->boot_offset ),
+              sdi->boot_size );
 
        /* Copy boot code */
        memcpy ( real_to_virt ( SDI_BOOT_SEG, SDI_BOOT_OFF ),
-                ( image->data + sdi.boot_offset ), sdi.boot_size );
+                ( image->data + sdi->boot_offset ), sdi->boot_size );
 
        /* Jump to boot code */
        sdiptr = ( virt_to_phys ( image->data ) | SDI_WTF );
@@ -123,12 +95,22 @@ static int sdi_exec ( struct image *image ) {
  * @ret rc             Return status code
  */
 static int sdi_probe ( struct image *image ) {
-       struct sdi_header sdi;
-       int rc;
+       const struct sdi_header *sdi;
 
-       /* Parse image */
-       if ( ( rc = sdi_parse_header ( image, &sdi ) ) != 0 )
-               return rc;
+       /* Sanity check */
+       if ( image->len < sizeof ( *sdi ) ) {
+               DBGC ( image, "SDI %s too short for SDI header\n",
+                      image->name );
+               return -ENOEXEC;
+       }
+       sdi = image->data;
+
+       /* Check signature */
+       if ( sdi->magic != SDI_MAGIC ) {
+               DBGC ( image, "SDI %s is not an SDI image\n",
+                      image->name );
+               return -ENOEXEC;
+       }
 
        return 0;
 }