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)
 | 
					ASFLAGS		+= $(EXTRA_ASFLAGS)
 | 
				
			||||||
LDFLAGS		+= $(EXTRA_LDFLAGS)
 | 
					LDFLAGS		+= $(EXTRA_LDFLAGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Embedded image, if present
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					EMBEDDED_IMAGE	?= /dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ifneq ($(NO_WERROR),1)
 | 
					ifneq ($(NO_WERROR),1)
 | 
				
			||||||
CFLAGS		+= -Werror
 | 
					CFLAGS		+= -Werror
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -214,6 +214,14 @@ drivers :
 | 
				
			||||||
roms :
 | 
					roms :
 | 
				
			||||||
	@$(ECHO) $(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
 | 
					# Generate the NIC file from the parsed source files.  The NIC file is
 | 
				
			||||||
# only for rom-o-matic.
 | 
					# 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/netdevice.h>
 | 
				
			||||||
#include <gpxe/dhcp.h>
 | 
					#include <gpxe/dhcp.h>
 | 
				
			||||||
#include <gpxe/image.h>
 | 
					#include <gpxe/image.h>
 | 
				
			||||||
 | 
					#include <gpxe/embedded.h>
 | 
				
			||||||
#include <usr/ifmgmt.h>
 | 
					#include <usr/ifmgmt.h>
 | 
				
			||||||
#include <usr/route.h>
 | 
					#include <usr/route.h>
 | 
				
			||||||
#include <usr/dhcpmgmt.h>
 | 
					#include <usr/dhcpmgmt.h>
 | 
				
			||||||
| 
						 | 
					@ -45,6 +46,30 @@ static struct net_device * find_boot_netdev ( void ) {
 | 
				
			||||||
	return NULL;
 | 
						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
 | 
					 * Boot using filename
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -115,6 +140,11 @@ static int netboot ( struct net_device *netdev ) {
 | 
				
			||||||
		return rc;
 | 
							return rc;
 | 
				
			||||||
	route();
 | 
						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 */
 | 
						/* Try to download and boot whatever we are given as a filename */
 | 
				
			||||||
	dhcp_snprintf ( buf, sizeof ( buf ),
 | 
						dhcp_snprintf ( buf, sizeof ( buf ),
 | 
				
			||||||
			find_global_dhcp_option ( DHCP_BOOTFILE_NAME ) );
 | 
								find_global_dhcp_option ( DHCP_BOOTFILE_NAME ) );
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue