* @ret rc Return status code
*/
static int multiboot_exec ( struct image *image ) {
+ physaddr_t entry = image->priv.phys;
/* Populate multiboot information structure */
memset ( &mbinfo, 0, sizeof ( mbinfo ) );
__asm__ __volatile__ ( PHYS_CODE ( "call *%%edi\n\t" )
: : "a" ( MULTIBOOT_BOOTLOADER_MAGIC ),
"b" ( virt_to_phys ( &mbinfo ) ),
- "D" ( image->entry )
+ "D" ( entry )
: "ecx", "edx", "esi", "ebp", "memory" );
DBGC ( image, "MULTIBOOT %p returned\n", image );
/* Copy image to segment */
memcpy_user ( buffer, 0, image->data, offset, filesz );
- /* Record execution entry point */
- image->entry = hdr->mb.entry_addr;
+ /* Record execution entry point in image private data field */
+ image->priv.phys = hdr->mb.entry_addr;
return 0;
}
nbi_load_segment ) ) != 0 )
return rc;
+ /* Record header address in image private data field */
+ image->priv.user = real_to_user ( imgheader.location.segment,
+ imgheader.location.offset );
+
return 0;
}
static int nbi_exec ( struct image *image ) {
struct imgheader imgheader;
- copy_from_user ( &imgheader, phys_to_user ( image->entry ), 0,
+ copy_from_user ( &imgheader, image->priv.user, 0,
sizeof ( imgheader ) );
if ( NBI_LINEAR_EXEC_ADDR ( imgheader.flags ) ) {
return rc;
}
- /* Fill in entry point address */
- image->entry = ehdr.e_entry;
+ /* Record execution entry point in image private data field */
+ image->priv.phys = ehdr.e_entry;
return 0;
}