multiboot2: Add tags used to pass ImageHandle to loaded image
Add tags used to pass ImageHandle to loaded image if requested. It is used by at least ExitBootServices() function. Signed-off-by: Daniel Kiper <daniel.kiper@oracle.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Reviewed-by: Vladimir Serbinenko <phcoder@gmail.com>
This commit is contained in:
		
							parent
							
								
									9862b24121
								
							
						
					
					
						commit
						ba89c19f49
					
				
					 2 changed files with 51 additions and 7 deletions
				
			
		|  | @ -172,6 +172,8 @@ grub_multiboot_load (grub_file_t file, const char *filename) | ||||||
| 	      case MULTIBOOT_TAG_TYPE_NETWORK: | 	      case MULTIBOOT_TAG_TYPE_NETWORK: | ||||||
| 	      case MULTIBOOT_TAG_TYPE_EFI_MMAP: | 	      case MULTIBOOT_TAG_TYPE_EFI_MMAP: | ||||||
| 	      case MULTIBOOT_TAG_TYPE_EFI_BS: | 	      case MULTIBOOT_TAG_TYPE_EFI_BS: | ||||||
|  | 	      case MULTIBOOT_TAG_TYPE_EFI32_IH: | ||||||
|  | 	      case MULTIBOOT_TAG_TYPE_EFI64_IH: | ||||||
| 		break; | 		break; | ||||||
| 
 | 
 | ||||||
| 	      default: | 	      default: | ||||||
|  | @ -407,13 +409,15 @@ grub_multiboot_get_mbi_size (void) | ||||||
| 		 + grub_get_multiboot_mmap_count () | 		 + grub_get_multiboot_mmap_count () | ||||||
| 		 * sizeof (struct multiboot_mmap_entry)), MULTIBOOT_TAG_ALIGN) | 		 * sizeof (struct multiboot_mmap_entry)), MULTIBOOT_TAG_ALIGN) | ||||||
|     + ALIGN_UP (sizeof (struct multiboot_tag_framebuffer), MULTIBOOT_TAG_ALIGN) |     + ALIGN_UP (sizeof (struct multiboot_tag_framebuffer), MULTIBOOT_TAG_ALIGN) | ||||||
|     + ALIGN_UP (sizeof (struct multiboot_tag_efi32), MULTIBOOT_TAG_ALIGN) |  | ||||||
|     + ALIGN_UP (sizeof (struct multiboot_tag_efi64), MULTIBOOT_TAG_ALIGN) |  | ||||||
|     + ALIGN_UP (sizeof (struct multiboot_tag_old_acpi) |     + ALIGN_UP (sizeof (struct multiboot_tag_old_acpi) | ||||||
| 		+ sizeof (struct grub_acpi_rsdp_v10), MULTIBOOT_TAG_ALIGN) | 		+ sizeof (struct grub_acpi_rsdp_v10), MULTIBOOT_TAG_ALIGN) | ||||||
|     + acpiv2_size () |     + acpiv2_size () | ||||||
|     + net_size () |     + net_size () | ||||||
| #ifdef GRUB_MACHINE_EFI | #ifdef GRUB_MACHINE_EFI | ||||||
|  |     + ALIGN_UP (sizeof (struct multiboot_tag_efi32), MULTIBOOT_TAG_ALIGN) | ||||||
|  |     + ALIGN_UP (sizeof (struct multiboot_tag_efi32_ih), MULTIBOOT_TAG_ALIGN) | ||||||
|  |     + ALIGN_UP (sizeof (struct multiboot_tag_efi64), MULTIBOOT_TAG_ALIGN) | ||||||
|  |     + ALIGN_UP (sizeof (struct multiboot_tag_efi64_ih), MULTIBOOT_TAG_ALIGN) | ||||||
|     + ALIGN_UP (sizeof (struct multiboot_tag_efi_mmap) |     + ALIGN_UP (sizeof (struct multiboot_tag_efi_mmap) | ||||||
| 		+ efi_mmap_size, MULTIBOOT_TAG_ALIGN) | 		+ efi_mmap_size, MULTIBOOT_TAG_ALIGN) | ||||||
| #endif | #endif | ||||||
|  | @ -907,11 +911,35 @@ grub_multiboot_make_mbi (grub_uint32_t *target) | ||||||
| 
 | 
 | ||||||
|   if (keep_bs) |   if (keep_bs) | ||||||
|     { |     { | ||||||
|       struct multiboot_tag *tag = (struct multiboot_tag *) ptrorig; |       { | ||||||
|       tag->type = MULTIBOOT_TAG_TYPE_EFI_BS; | 	struct multiboot_tag *tag = (struct multiboot_tag *) ptrorig; | ||||||
|       tag->size = sizeof (struct multiboot_tag); | 	tag->type = MULTIBOOT_TAG_TYPE_EFI_BS; | ||||||
|       ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN) | 	tag->size = sizeof (struct multiboot_tag); | ||||||
| 	/ sizeof (grub_properly_aligned_t); | 	ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN) | ||||||
|  | 	  / sizeof (grub_properly_aligned_t); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  | #ifdef __i386__ | ||||||
|  |       { | ||||||
|  | 	struct multiboot_tag_efi32_ih *tag = (struct multiboot_tag_efi32_ih *) ptrorig; | ||||||
|  | 	tag->type = MULTIBOOT_TAG_TYPE_EFI32_IH; | ||||||
|  | 	tag->size = sizeof (struct multiboot_tag_efi32_ih); | ||||||
|  | 	tag->pointer = (grub_addr_t) grub_efi_image_handle; | ||||||
|  | 	ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN) | ||||||
|  | 	  / sizeof (grub_properly_aligned_t); | ||||||
|  |       } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #ifdef __x86_64__ | ||||||
|  |       { | ||||||
|  | 	struct multiboot_tag_efi64_ih *tag = (struct multiboot_tag_efi64_ih *) ptrorig; | ||||||
|  | 	tag->type = MULTIBOOT_TAG_TYPE_EFI64_IH; | ||||||
|  | 	tag->size = sizeof (struct multiboot_tag_efi64_ih); | ||||||
|  | 	tag->pointer = (grub_addr_t) grub_efi_image_handle; | ||||||
|  | 	ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN) | ||||||
|  | 	  / sizeof (grub_properly_aligned_t); | ||||||
|  |       } | ||||||
|  | #endif | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -60,6 +60,8 @@ | ||||||
| #define MULTIBOOT_TAG_TYPE_NETWORK           16 | #define MULTIBOOT_TAG_TYPE_NETWORK           16 | ||||||
| #define MULTIBOOT_TAG_TYPE_EFI_MMAP          17 | #define MULTIBOOT_TAG_TYPE_EFI_MMAP          17 | ||||||
| #define MULTIBOOT_TAG_TYPE_EFI_BS            18 | #define MULTIBOOT_TAG_TYPE_EFI_BS            18 | ||||||
|  | #define MULTIBOOT_TAG_TYPE_EFI32_IH          19 | ||||||
|  | #define MULTIBOOT_TAG_TYPE_EFI64_IH          20 | ||||||
| 
 | 
 | ||||||
| #define MULTIBOOT_HEADER_TAG_END  0 | #define MULTIBOOT_HEADER_TAG_END  0 | ||||||
| #define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST  1 | #define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST  1 | ||||||
|  | @ -371,6 +373,20 @@ struct multiboot_tag_efi_mmap | ||||||
|   multiboot_uint8_t efi_mmap[0]; |   multiboot_uint8_t efi_mmap[0]; | ||||||
| };  | };  | ||||||
| 
 | 
 | ||||||
|  | struct multiboot_tag_efi32_ih | ||||||
|  | { | ||||||
|  |   multiboot_uint32_t type; | ||||||
|  |   multiboot_uint32_t size; | ||||||
|  |   multiboot_uint32_t pointer; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct multiboot_tag_efi64_ih | ||||||
|  | { | ||||||
|  |   multiboot_uint32_t type; | ||||||
|  |   multiboot_uint32_t size; | ||||||
|  |   multiboot_uint64_t pointer; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| #endif /* ! ASM_FILE */ | #endif /* ! ASM_FILE */ | ||||||
| 
 | 
 | ||||||
| #endif /* ! MULTIBOOT_HEADER */ | #endif /* ! MULTIBOOT_HEADER */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue