| 
									
										
										
										
											2013-01-29 01:05:24 -08:00
										 |  |  | #ifndef _ASM_X86_BOOTPARAM_UTILS_H
 | 
					
						
							|  |  |  | #define _ASM_X86_BOOTPARAM_UTILS_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/bootparam.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * This file is included from multiple environments.  Do not | 
					
						
							|  |  |  |  * add completing #includes to make it standalone. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Deal with bootloaders which fail to initialize unknown fields in | 
					
						
							|  |  |  |  * boot_params to zero.  The list fields in this list are taken from | 
					
						
							|  |  |  |  * analysis of kexec-tools; if other broken bootloaders initialize a | 
					
						
							|  |  |  |  * different set of fields we will need to figure out how to disambiguate. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-03-06 20:23:30 -08:00
										 |  |  |  * Note: efi_info is commonly left uninitialized, but that field has a | 
					
						
							|  |  |  |  * private magic, so it is better to leave it unchanged. | 
					
						
							| 
									
										
										
										
											2013-01-29 01:05:24 -08:00
										 |  |  |  */ | 
					
						
							|  |  |  | static void sanitize_boot_params(struct boot_params *boot_params) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-03-06 13:00:23 -05:00
										 |  |  | 	/* 
 | 
					
						
							|  |  |  | 	 * IMPORTANT NOTE TO BOOTLOADER AUTHORS: do not simply clear | 
					
						
							|  |  |  | 	 * this field.  The purpose of this field is to guarantee | 
					
						
							|  |  |  | 	 * compliance with the x86 boot spec located in | 
					
						
							|  |  |  | 	 * Documentation/x86/boot.txt .  That spec says that the | 
					
						
							|  |  |  | 	 * *whole* structure should be cleared, after which only the | 
					
						
							|  |  |  | 	 * portion defined by struct setup_header (boot_params->hdr) | 
					
						
							|  |  |  | 	 * should be copied in. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * If you're having an issue because the sentinel is set, you | 
					
						
							|  |  |  | 	 * need to change the whole structure to be cleared, not this | 
					
						
							|  |  |  | 	 * (or any other) individual field, or you will soon have | 
					
						
							|  |  |  | 	 * problems again. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2013-01-29 01:05:24 -08:00
										 |  |  | 	if (boot_params->sentinel) { | 
					
						
							| 
									
										
										
										
											2013-03-06 13:00:23 -05:00
										 |  |  | 		/* fields in boot_params are left uninitialized, clear them */ | 
					
						
							| 
									
										
										
										
											2013-08-09 18:14:20 -04:00
										 |  |  | 		memset(&boot_params->ext_ramdisk_image, 0, | 
					
						
							| 
									
										
										
										
											2013-03-06 20:23:30 -08:00
										 |  |  | 		       (char *)&boot_params->efi_info - | 
					
						
							| 
									
										
										
										
											2013-08-09 18:14:20 -04:00
										 |  |  | 			(char *)&boot_params->ext_ramdisk_image); | 
					
						
							| 
									
										
										
										
											2013-01-29 01:05:24 -08:00
										 |  |  | 		memset(&boot_params->kbd_status, 0, | 
					
						
							|  |  |  | 		       (char *)&boot_params->hdr - | 
					
						
							|  |  |  | 		       (char *)&boot_params->kbd_status); | 
					
						
							|  |  |  | 		memset(&boot_params->_pad7[0], 0, | 
					
						
							|  |  |  | 		       (char *)&boot_params->edd_mbr_sig_buffer[0] - | 
					
						
							|  |  |  | 			(char *)&boot_params->_pad7[0]); | 
					
						
							|  |  |  | 		memset(&boot_params->_pad8[0], 0, | 
					
						
							|  |  |  | 		       (char *)&boot_params->eddbuf[0] - | 
					
						
							|  |  |  | 			(char *)&boot_params->_pad8[0]); | 
					
						
							|  |  |  | 		memset(&boot_params->_pad9[0], 0, sizeof(boot_params->_pad9)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* _ASM_X86_BOOTPARAM_UTILS_H */
 |