[sdi] Remove userptr_t from SDI image parsing

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2025-04-24 23:01:25 +01:00
parent d7c94c4aa5
commit 3cb33435f5

View File

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