mirror of https://github.com/ipxe/ipxe.git
				
				
				
			Added the embedded pxelinux payload patch from hpa.
							parent
							
								
									3311169707
								
							
						
					
					
						commit
						74fd544101
					
				| 
						 | 
				
			
			@ -101,6 +101,10 @@ CFLAGS		+= $(EXTRA_CFLAGS)
 | 
			
		|||
ASFLAGS		+= $(EXTRA_ASFLAGS)
 | 
			
		||||
LDFLAGS		+= $(EXTRA_LDFLAGS)
 | 
			
		||||
 | 
			
		||||
# Embedded image, if present
 | 
			
		||||
#
 | 
			
		||||
EMBEDDED_IMAGE	?= /dev/null
 | 
			
		||||
 | 
			
		||||
ifneq ($(NO_WERROR),1)
 | 
			
		||||
CFLAGS		+= -Werror
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -214,6 +214,14 @@ drivers :
 | 
			
		|||
roms :
 | 
			
		||||
	@$(ECHO) $(ROMS)
 | 
			
		||||
 | 
			
		||||
# Embedded binary
 | 
			
		||||
$(BIN)/embedimg.bin: $(EMBEDDED_IMAGE)
 | 
			
		||||
	$(QM)$(ECHO) "  [COPY] $@"
 | 
			
		||||
	$(Q)$(CP) -f $(EMBEDDED_IMAGE) $@
 | 
			
		||||
 | 
			
		||||
$(BIN)/embed.o: $(BIN)/embedimg.bin
 | 
			
		||||
CFLAGS_embed = -DEMBEDIMG=\"$(BIN)/embedimg.bin\"
 | 
			
		||||
 | 
			
		||||
# Generate the NIC file from the parsed source files.  The NIC file is
 | 
			
		||||
# only for rom-o-matic.
 | 
			
		||||
#
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
	.section ".data", "aw"
 | 
			
		||||
	.balign 4
 | 
			
		||||
	.globl _embedded_image_start
 | 
			
		||||
_embedded_image_start:
 | 
			
		||||
	.incbin EMBEDIMG
 | 
			
		||||
	.globl _embedded_image_end
 | 
			
		||||
_embedded_image_end:
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * Take a possible embedded image and put it in a struct image
 | 
			
		||||
 * data structure.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <gpxe/image.h>
 | 
			
		||||
#include <gpxe/malloc.h>
 | 
			
		||||
#include <gpxe/uaccess.h>
 | 
			
		||||
#include <gpxe/umalloc.h>
 | 
			
		||||
#include <gpxe/embedded.h>
 | 
			
		||||
 | 
			
		||||
extern char _embedded_image_start[], _embedded_image_end[];
 | 
			
		||||
 | 
			
		||||
struct image *embedded_image(void)
 | 
			
		||||
{
 | 
			
		||||
	static int reclaimed = 0;
 | 
			
		||||
	struct image *image;
 | 
			
		||||
	size_t eisize = _embedded_image_end - _embedded_image_start;
 | 
			
		||||
 | 
			
		||||
	if ( !eisize )
 | 
			
		||||
		return NULL;	/* No embedded image */
 | 
			
		||||
 | 
			
		||||
	if ( reclaimed )
 | 
			
		||||
		return NULL;	/* Already reclaimed */
 | 
			
		||||
 | 
			
		||||
	printf("Embedded image: %d bytes at %p\n",
 | 
			
		||||
	       eisize, _embedded_image_start);
 | 
			
		||||
 | 
			
		||||
	image = alloc_image();
 | 
			
		||||
	if (!image)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	image->len     = eisize;
 | 
			
		||||
	image->data    = umalloc(eisize);
 | 
			
		||||
	if (image->data == UNULL) {
 | 
			
		||||
		image_put(image);
 | 
			
		||||
		return image = NULL;
 | 
			
		||||
	}
 | 
			
		||||
	copy_to_user(image->data, 0, _embedded_image_start, eisize);
 | 
			
		||||
 | 
			
		||||
	/* Reclaim embedded image memory */
 | 
			
		||||
	reclaimed = 1;
 | 
			
		||||
	mpopulate(_embedded_image_start, eisize);
 | 
			
		||||
 | 
			
		||||
	return image;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
#ifndef _GPXE_EMBEDDED_H
 | 
			
		||||
#define _GPXE_EMBEDDED_H
 | 
			
		||||
 | 
			
		||||
#include <gpxe/image.h>
 | 
			
		||||
 | 
			
		||||
struct image *embedded_image(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,7 @@
 | 
			
		|||
#include <gpxe/netdevice.h>
 | 
			
		||||
#include <gpxe/dhcp.h>
 | 
			
		||||
#include <gpxe/image.h>
 | 
			
		||||
#include <gpxe/embedded.h>
 | 
			
		||||
#include <usr/ifmgmt.h>
 | 
			
		||||
#include <usr/route.h>
 | 
			
		||||
#include <usr/dhcpmgmt.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +46,30 @@ static struct net_device * find_boot_netdev ( void ) {
 | 
			
		|||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Boot embedded image
 | 
			
		||||
 *
 | 
			
		||||
 * @ret rc		Return status code
 | 
			
		||||
 */
 | 
			
		||||
static int boot_embedded_image ( void ) {
 | 
			
		||||
	struct image *image;
 | 
			
		||||
	int rc;
 | 
			
		||||
 | 
			
		||||
	image = embedded_image();
 | 
			
		||||
	if ( !image )
 | 
			
		||||
		return ENOENT;
 | 
			
		||||
 | 
			
		||||
	if ( ( rc = imgload ( image ) ) != 0 ) {
 | 
			
		||||
		printf ( "Could not load embedded image: %s\n",
 | 
			
		||||
			 strerror ( rc ) );
 | 
			
		||||
	} else if ( ( rc = imgexec ( image ) ) != 0 ) {
 | 
			
		||||
		printf ( "Could not boot embedded image: %s\n",
 | 
			
		||||
			 strerror ( rc ) );
 | 
			
		||||
	}
 | 
			
		||||
	image_put ( image );
 | 
			
		||||
	return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Boot using filename
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -115,6 +140,11 @@ static int netboot ( struct net_device *netdev ) {
 | 
			
		|||
		return rc;
 | 
			
		||||
	route();
 | 
			
		||||
 | 
			
		||||
	/* Try to boot an embedded image if we have one */
 | 
			
		||||
	rc = boot_embedded_image ();
 | 
			
		||||
	if ( rc != ENOENT )
 | 
			
		||||
		return rc;
 | 
			
		||||
 | 
			
		||||
	/* Try to download and boot whatever we are given as a filename */
 | 
			
		||||
	dhcp_snprintf ( buf, sizeof ( buf ),
 | 
			
		||||
			find_global_dhcp_option ( DHCP_BOOTFILE_NAME ) );
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue