1*4882a593SmuzhiyunFrom ff406eff25465932b97a2857ee5a75fd0957e9b9 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Peter Jones <pjones@redhat.com>
3*4882a593SmuzhiyunDate: Thu, 11 Feb 2021 17:07:33 +0100
4*4882a593SmuzhiyunSubject: [PATCH] util/mkimage: Improve data_size value calculation
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunAccording to "Microsoft Portable Executable and Common Object File Format
7*4882a593SmuzhiyunSpecification", the Optional Header SizeOfInitializedData field contains:
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun  Size of the initialized data section, or the sum of all such sections if
10*4882a593Smuzhiyun  there are multiple data sections.
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunMake this explicit by adding the GRUB kernel data size to the sum of all
13*4882a593Smuzhiyunthe modules sizes. The ALIGN_UP() is not required by the PE spec but do
14*4882a593Smuzhiyunit to avoid alignment issues.
15*4882a593Smuzhiyun
16*4882a593SmuzhiyunSigned-off-by: Peter Jones <pjones@redhat.com>
17*4882a593SmuzhiyunSigned-off-by: Javier Martinez Canillas <javierm@redhat.com>
18*4882a593SmuzhiyunReviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
19*4882a593SmuzhiyunSigned-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com>
20*4882a593Smuzhiyun---
21*4882a593Smuzhiyun util/mkimage.c | 6 +++++-
22*4882a593Smuzhiyun 1 file changed, 5 insertions(+), 1 deletion(-)
23*4882a593Smuzhiyun
24*4882a593Smuzhiyundiff --git a/util/mkimage.c b/util/mkimage.c
25*4882a593Smuzhiyunindex deaef56..853a521 100644
26*4882a593Smuzhiyun--- a/util/mkimage.c
27*4882a593Smuzhiyun+++ b/util/mkimage.c
28*4882a593Smuzhiyun@@ -1260,6 +1260,7 @@ grub_install_generate_image (const char *dir, const char *prefix,
29*4882a593Smuzhiyun 	void *pe_img;
30*4882a593Smuzhiyun 	grub_uint8_t *header;
31*4882a593Smuzhiyun 	void *sections;
32*4882a593Smuzhiyun+	size_t scn_size;
33*4882a593Smuzhiyun 	size_t pe_size;
34*4882a593Smuzhiyun 	struct grub_pe32_coff_header *c;
35*4882a593Smuzhiyun 	struct grub_pe32_section_table *text_section, *data_section;
36*4882a593Smuzhiyun@@ -1362,7 +1363,10 @@ grub_install_generate_image (const char *dir, const char *prefix,
37*4882a593Smuzhiyun 						| GRUB_PE32_SCN_MEM_EXECUTE
38*4882a593Smuzhiyun 						| GRUB_PE32_SCN_MEM_READ);
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun-	PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (reloc_addr - layout.exec_size - header_size);
41*4882a593Smuzhiyun+	scn_size = ALIGN_UP (layout.kernel_size - layout.exec_size, GRUB_PE32_FILE_ALIGNMENT);
42*4882a593Smuzhiyun+	PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (scn_size +
43*4882a593Smuzhiyun+							       ALIGN_UP (total_module_size,
44*4882a593Smuzhiyun+									 GRUB_PE32_FILE_ALIGNMENT));
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun 	data_section = text_section + 1;
47*4882a593Smuzhiyun 	strcpy (data_section->name, ".data");
48*4882a593Smuzhiyun--
49*4882a593Smuzhiyun2.14.2
50*4882a593Smuzhiyun
51