From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1Q2feK-00028e-4i for mharc-grub-devel@gnu.org; Thu, 24 Mar 2011 04:12:08 -0400 Received: from [140.186.70.92] (port=50119 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q2feH-00027V-3b for grub-devel@gnu.org; Thu, 24 Mar 2011 04:12:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q2feG-0001vi-2H for grub-devel@gnu.org; Thu, 24 Mar 2011 04:12:05 -0400 Received: from bay0-omc3-s5.bay0.hotmail.com ([65.54.190.143]:17132) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q2feF-0001vW-Ov for grub-devel@gnu.org; Thu, 24 Mar 2011 04:12:04 -0400 Received: from BAY135-W15 ([65.54.190.189]) by bay0-omc3-s5.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 24 Mar 2011 01:12:02 -0700 Message-ID: Content-Type: multipart/alternative; boundary="_49666899-979f-4b6f-b52f-2b94b48b1410_" X-Originating-IP: [134.134.139.70] From: GuoMinskey To: Date: Thu, 24 Mar 2011 08:12:02 +0000 Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 24 Mar 2011 08:12:02.0079 (UTC) FILETIME=[279C02F0:01CBE9FB] X-detected-operating-system: by eggs.gnu.org: Windows 2000 SP4, XP SP1+ X-Received-From: 65.54.190.143 Subject: question about adding a field into linux boot header X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Mar 2011 08:12:06 -0000 --_49666899-979f-4b6f-b52f-2b94b48b1410_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit I want to use setup_data fields of linux boot header, but grub doesn'tsupport it. So, I cone latest grub repo (1.99) and modify grub code asfollows: 1. in include/grub/i386/linux.h, struct linux_kernel_header {@@ -130,6 +144,8 @@ grub_uint16_t pad1; /* Unused */ grub_uint32_t cmd_line_ptr; /* Points to the kernel command line */ grub_uint32_t initrd_addr_max; /* Highest address for initrd */+ grub_uint32_t pad2[8];+ grub_uint64_t new_field; <-------------- aligned to the offset : 0x250 as linux } __attribute__ ((packed)); 2. grub-core/loader/i386/linux.c I add a command by following "initrd", but simply as follows: static grub_err_t grub_cmd_test(cmd, argc, argv[]) { grub_printf("entering my test command\n"); ... //ensure kernel is loaded struct linux_kernel_header *lh = (struct linux_kernel_header *) real_mode_mem; lh->new_field = 0x34FFFFFF; } when I boot GRUB with my command, GRUB panic in relocator. I print the kernelheader, seems the header is there ( I mean real_mode_mem). If I removed the line"lh->new_field = 0x34FFFFFF", GRUB can work. Did I miss something if I want pass this field into linux kernel ? thanks,-minskey --_49666899-979f-4b6f-b52f-2b94b48b1410_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: 8bit


I want to use setup_data fields of linux boot header,  but grub doesn't
support it. So,  I cone latest grub repo (1.99) and modify grub code as
follows:


1.  in include/grub/i386/linux.h,  

 struct linux_kernel_header
 {
@@ -130,6 +144,8 @@
   grub_uint16_t pad1;         /* Unused */
   grub_uint32_t cmd_line_ptr; /* Points to the kernel command line */
   grub_uint32_t initrd_addr_max;        /* Highest address for initrd */
+  grub_uint32_t pad2[8];
+  grub_uint64_t new_field;    <--------------  aligned to the offset : 0x250 as linux
 } __attribute__ ((packed));


2.  grub-core/loader/i386/linux.c

     I add a command by following "initrd", but simply as follows:

       static grub_err_t
           grub_cmd_test(cmd, argc, argv[])
      {
                 grub_printf("entering my test command\n");

                 ...   //ensure kernel is loaded
 
                 struct linux_kernel_header *lh = (struct linux_kernel_header *) real_mode_mem;  
                 lh->new_field  = 0x34FFFFFF;
      }
 
    
 when I boot GRUB with my command,  GRUB panic in relocator. I print the kernel
header, seems the header is there ( I mean real_mode_mem).   If I removed the line
"lh->new_field = 0x34FFFFFF",  GRUB can work.  

Did I miss something if I want pass this field into linux kernel ?


thanks,
-minskey 

    
--_49666899-979f-4b6f-b52f-2b94b48b1410_-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1Q2g1d-0004sx-BR for mharc-grub-devel@gnu.org; Thu, 24 Mar 2011 04:36:13 -0400 Received: from [140.186.70.92] (port=44579 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q2g1X-0004qA-G8 for grub-devel@gnu.org; Thu, 24 Mar 2011 04:36:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q2g1W-0006G4-A2 for grub-devel@gnu.org; Thu, 24 Mar 2011 04:36:07 -0400 Received: from mail-ww0-f49.google.com ([74.125.82.49]:54658) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q2g1W-0006Ei-1L for grub-devel@gnu.org; Thu, 24 Mar 2011 04:36:06 -0400 Received: by wwc33 with SMTP id 33so9832620wwc.30 for ; Thu, 24 Mar 2011 01:36:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:message-id:date:from:user-agent:mime-version:to :subject:references:in-reply-to:x-enigmail-version:content-type; bh=r8S9tQawhHqUigdkDGbG9JoT0GObRjjZv3ORcezKQcA=; b=R0DTi8x2WEAKdrmrtZl7NBSqTL5t+bvm5gA0neOqzyK7quxDg/i9PmNR0EJgjS1ulp ugBDPHq9G9zU/pXp6NaqH9Z9v1DqV74CjwneAhgd9P3PdWvYXbjHn7VQK+ewT4P1g9yD lKML3F+c2MaMoWN8WyDNo3bpRiu0XnnUmoyrA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:x-enigmail-version:content-type; b=tzO04kst70x3S92dmQIxR3FS0Hx/QE7A+QFeCxhssxAM5Dd0biJ46EzcszsLLbc0Yu xiEzHZWPIdpMGgGLkW22fCEgVhaZ3bfbkJT0wEYn0m/bMKnH39WH5NKExInVhHAaf7sr jd2JXgwSHt/VlAvZ84pa1F2ir39+J6wTwkFpg= Received: by 10.216.239.65 with SMTP id b43mr7212777wer.29.1300955764954; Thu, 24 Mar 2011 01:36:04 -0700 (PDT) Received: from debian.x201.phnet (gprs31.swisscom-mobile.ch [193.247.250.31]) by mx.google.com with ESMTPS id t5sm3641093wes.33.2011.03.24.01.36.02 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 24 Mar 2011 01:36:03 -0700 (PDT) Message-ID: <4D8B0268.3040102@gmail.com> Date: Thu, 24 Mar 2011 09:35:52 +0100 From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?= User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20110303 Iceowl/1.0b1 Icedove/3.0.11 MIME-Version: 1.0 To: grub-devel@gnu.org References: In-Reply-To: X-Enigmail-Version: 1.0.1 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="------------enig37864F9ABB55CA0D1B0C87BF" X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 74.125.82.49 Subject: Re: question about adding a field into linux boot header X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 24 Mar 2011 08:36:12 -0000 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig37864F9ABB55CA0D1B0C87BF Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 24.03.2011 09:12, GuoMinskey wrote: > > > I want to use setup_data fields of linux boot header, but grub doesn't= > support it. So, I cone latest grub repo (1.99) and modify grub code as= > follows: > > > 1. in include/grub/i386/linux.h, =20 > > struct linux_kernel_header > { > @@ -130,6 +144,8 @@ > grub_uint16_t pad1; /* Unused */ > grub_uint32_t cmd_line_ptr; /* Points to the kernel command line */ > grub_uint32_t initrd_addr_max; /* Highest address for initrd = */ > + grub_uint32_t pad2[8]; > + grub_uint64_t new_field; <-------------- aligned to the offset > : 0x250 as linux > } __attribute__ ((packed)); > > > 2. grub-core/loader/i386/linux.c > > I add a command by following "initrd", but simply as follows: > > static grub_err_t > grub_cmd_test(cmd, argc, argv[]) > { > grub_printf("entering my test command\n"); > > ... //ensure kernel is loaded > =20 > struct linux_kernel_header *lh =3D (struct > linux_kernel_header *) real_mode_mem; =20 > lh->new_field =3D 0x34FFFFFF; > } > =20 Could you paste the whole code in question rather than let us gues what happens in "..." or how you set your lh variable > =20 > when I boot GRUB with my command, GRUB panic in relocator. Could you please avoid paraphrasing and give exact error? Also please try with debug=3Drelocator and supply the output > I print the kernel > header, seems the header is there ( I mean real_mode_mem). If I > removed the line > "lh->new_field =3D 0x34FFFFFF", GRUB can work. =20 > > Did I miss something if I want pass this field into linux kernel ? > > > thanks, > -minskey=20 > > =20 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel > =20 --=20 Regards Vladimir '=CF=86-coder/phcoder' Serbinenko --------------enig37864F9ABB55CA0D1B0C87BF Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iF4EAREKAAYFAk2LAmgACgkQNak7dOguQgmhlgD/VibKcL8hTfJ83IrPV0yRatfe YmtUcZMYmkDEVAj5dDUBALD+LR19hLxmF3y87GqscBmk98nVtvWMgIY76VjS6PAe =oXSx -----END PGP SIGNATURE----- --------------enig37864F9ABB55CA0D1B0C87BF-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1Q4Pcz-00075g-Qk for mharc-grub-devel@gnu.org; Mon, 28 Mar 2011 23:29:57 -0400 Received: from [140.186.70.92] (port=48460 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q4Pcx-00073Q-DX for grub-devel@gnu.org; Mon, 28 Mar 2011 23:29:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q4Pcr-00058c-Mv for grub-devel@gnu.org; Mon, 28 Mar 2011 23:29:55 -0400 Received: from bay0-omc4-s20.bay0.hotmail.com ([65.54.190.222]:61758) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q4Pcr-00058V-Be for grub-devel@gnu.org; Mon, 28 Mar 2011 23:29:49 -0400 Received: from BAY135-W28 ([65.54.190.199]) by bay0-omc4-s20.bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Mon, 28 Mar 2011 20:29:48 -0700 Message-ID: Content-Type: multipart/mixed; boundary="_d9de4288-1508-45c0-a10b-b8add58560dd_" X-Originating-IP: [192.55.54.36] From: GuoMinskey To: , Date: Tue, 29 Mar 2011 03:29:47 +0000 Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 29 Mar 2011 03:29:48.0266 (UTC) FILETIME=[8E55F4A0:01CBEDC1] X-detected-operating-system: by eggs.gnu.org: Windows 2000 SP4, XP SP1+ X-Received-From: 65.54.190.222 Cc: Subject: Re: question about adding a field into linux boot header X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Mar 2011 03:29:57 -0000 --_d9de4288-1508-45c0-a10b-b8add58560dd_ Content-Type: multipart/alternative; boundary="_b26521ab-6786-4095-b4ec-80957f3c912e_" --_b26521ab-6786-4095-b4ec-80957f3c912e_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit thank you for response. Sorry for the confusion. It was my fault. I just use qemu to debug my change.It is a kernel panic. It panic so early, so that I made a mistake and consideredit as a panic in grub. I am using grub repo (revno: 3116). Now, I can see the kernel panic message: "PANIC: early exception 08 rip 246:10 error ffffff8102b785 cr2 ffffffffff47900b"The panic message comes from linux kernel: early_idt_handlers in the filearch/x86/kernel/head_64.S. So, it doesn't matter with grub. /* For the Linux/i386 boot protocol version 2.03. */ struct linux_kernel_header {@@ -130,6 +146,8 @@ grub_uint16_t pad1; /* Unused */ grub_uint32_t cmd_line_ptr; /* Points to the kernel command line */ grub_uint32_t initrd_addr_max; /* Highest address for initrd */+ grub_uint32_t pad2[8];+ grub_uint64_t setup_data; } __attribute__ ((packed));And then, I tried to use setup_data field to pass an pointer (which points to a binaryblob) to Linux kernel, === modified file 'grub-core/loader/i386/linux.c'--- grub-core/loader/i386/linux.c 2011-03-09 17:38:31 +0000+++ grub-core/loader/i386/linux.c 2011-03-28 15:44:34 +0000@@ -994,7 +994,89 @@ return grub_errno; } -static grub_command_t cmd_linux, cmd_initrd;+static grub_err_t+grub_cmd_ucode (grub_command_t cmd __attribute__ ((unused)),+ int argc, char *argv[])+{+ grub_file_t file = 0;+ grub_ssize_t size;+ grub_addr_t addr_min, addr_max;+ grub_err_t err;+ struct linux_kernel_header *lh;+ grub_relocator_chunk_t ch;+ void *ucode_mem;+ grub_addr_t ucode_mem_target;+ struct setup_data *hdr;++ if (argc == 0)+ {+ grub_error (GRUB_ERR_BAD_ARGUMENT, "no module specified");+ goto fail;+ }++ if (! loaded)+ {+ grub_error (GRUB_ERR_BAD_ARGUMENT, "you need to load the kernel first");+ goto fail;+ }++ grub_file_filter_disable_compression ();+ file = grub_file_open (argv[0]);+ size = grub_file_size(file);++ lh = (struct linux_kernel_header *) real_mode_mem;+ if (grub_le_to_cpu16(lh->version) < 0x0209)+ {+ grub_printf("%s:%d: header version=0x%x(<0x0209)\n",+ __FUNCTION__, __LINE__, lh->version);+ goto fail;+ }++ addr_max = grub_cpu_to_le32(lh->initrd_addr_max);+ if (addr_max > GRUB_LINUX_INITRD_MAX_ADDRESS)+ addr_max = GRUB_LINUX_INITRD_MAX_ADDRESS;+ addr_max -= 0x10000;++ if ((linux_mem_size != 0) && (linux_mem_size < addr_max))+ addr_max = linux_mem_size;+ addr_max = (addr_max - size - sizeof(*hdr)) & ~0xFFF;+ addr_min = prot_mode_target;++ grub_printf("microcode addr_min=%p, add_max=%p\n", + (void*)addr_min, (void *)addr_max);++ err = grub_relocator_alloc_chunk_align(relocator, &ch, addr_min,+ addr_max, size + sizeof(*hdr),+ 0x1000, GRUB_RELOCATOR_PREFERENCE_HIGH);+ if (err) return err;+ ucode_mem = get_virtual_current_address(ch);+ ucode_mem_target = get_physical_target_address(ch);++ if (grub_file_read(file, (unsigned char*)ucode_mem + sizeof(*hdr), size) != size)+ {+ grub_error (GRUB_ERR_FILE_READ_ERROR, "couldn't read file");+ goto fail;+ }++ hdr = (struct setup_data *)ucode_mem;+ hdr->type = SETUP_MICROCODE;+ hdr->len = size;+ hdr->next = 0;++ lh->setup_data = ucode_mem_target;++ grub_printf("%s: header_version=0x%x, ucode_size=%d\n", __FUNCTION__,+ grub_le_to_cpu16 (lh->version), size);+ ++ fail:+ if (file)+ grub_file_close (file);++ return grub_errno;+}++static grub_command_t cmd_linux, cmd_initrd, cmd_ucode; thanks,-minskey --_b26521ab-6786-4095-b4ec-80957f3c912e_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: 8bit

thank you for response.

Sorry for the confusion.  It was my fault. I just use qemu to debug my change.
It is a kernel panic.  It panic so early, so that I made a mistake and considered
it as a panic in grub. 


I am using grub repo (revno: 3116). Now, I can see the kernel panic message:
 "PANIC: early exception 08 rip 246:10 error ffffff8102b785 cr2 ffffffffff47900b"
The panic message comes from linux kernel: early_idt_handlers in the file
arch/x86/kernel/head_64.S.

So, it doesn't matter with grub.


 /* For the Linux/i386 boot protocol version 2.03.  */
 struct linux_kernel_header
 {
@@ -130,6 +146,8 @@
   grub_uint16_t pad1;                  /* Unused */
   grub_uint32_t cmd_line_ptr;          /* Points to the kernel command line */
   grub_uint32_t initrd_addr_max;        /* Highest address for initrd */
+  grub_uint32_t pad2[8];
+  grub_uint64_t setup_data;
 } __attribute__ ((packed));


And then,  I tried to use setup_data field to pass an pointer (which points to a binary
blob) to Linux kernel, 
=== modified file 'grub-core/loader/i386/linux.c'
--- grub-core/loader/i386/linux.c       2011-03-09 17:38:31 +0000
+++ grub-core/loader/i386/linux.c       2011-03-28 15:44:34 +0000
@@ -994,7 +994,89 @@
   return grub_errno;
 }

-static grub_command_t cmd_linux, cmd_initrd;
+static grub_err_t
+grub_cmd_ucode (grub_command_t cmd __attribute__ ((unused)),
+                int argc, char *argv[])
+{
+  grub_file_t file = 0;
+  grub_ssize_t size;
+  grub_addr_t addr_min, addr_max;
+  grub_err_t err;
+  struct linux_kernel_header *lh;
+  grub_relocator_chunk_t ch;
+  void *ucode_mem;
+  grub_addr_t ucode_mem_target;
+  struct setup_data *hdr;
+
+  if (argc == 0)
+    {
+      grub_error (GRUB_ERR_BAD_ARGUMENT, "no module specified");
+      goto fail;
+    }
+
+  if (! loaded)
+    {
+      grub_error (GRUB_ERR_BAD_ARGUMENT, "you need to load the kernel first");
+      goto fail;
+    }
+
+  grub_file_filter_disable_compression ();
+  file = grub_file_open (argv[0]);
+  size = grub_file_size(file);
+
+  lh = (struct linux_kernel_header *) real_mode_mem;
+  if (grub_le_to_cpu16(lh->version) < 0x0209)
+    {
+      grub_printf("%s:%d: header version=0x%x(<0x0209)\n",
+           __FUNCTION__, __LINE__, lh->version);
+      goto fail;
+    }
+
+  addr_max = grub_cpu_to_le32(lh->initrd_addr_max);
+  if (addr_max > GRUB_LINUX_INITRD_MAX_ADDRESS)
+      addr_max = GRUB_LINUX_INITRD_MAX_ADDRESS;
+  addr_max -= 0x10000;
+
+  if ((linux_mem_size != 0) && (linux_mem_size < addr_max))
+       addr_max = linux_mem_size;
+  addr_max = (addr_max - size - sizeof(*hdr)) & ~0xFFF;
+  addr_min = prot_mode_target;
+
+  grub_printf("microcode addr_min=%p, add_max=%p\n", 
+       (void*)addr_min, (void *)addr_max);
+
+  err = grub_relocator_alloc_chunk_align(relocator, &ch, addr_min,
+                                       addr_max, size + sizeof(*hdr),
+                                       0x1000, GRUB_RELOCATOR_PREFERENCE_HIGH);
+  if (err) return err;
+  ucode_mem = get_virtual_current_address(ch);
+  ucode_mem_target = get_physical_target_address(ch);
+
+  if (grub_file_read(file, (unsigned char*)ucode_mem + sizeof(*hdr), size) != size)
+     {
+       grub_error (GRUB_ERR_FILE_READ_ERROR, "couldn't read file");
+       goto fail;
+     }
+
+  hdr = (struct setup_data *)ucode_mem;
+  hdr->type = SETUP_MICROCODE;
+  hdr->len = size;
+  hdr->next = 0;
+
+  lh->setup_data = ucode_mem_target;
+
+  grub_printf("%s: header_version=0x%x, ucode_size=%d\n", __FUNCTION__,
+      grub_le_to_cpu16 (lh->version), size);
+      
+
+ fail:
+  if (file)
+    grub_file_close (file);
+
+  return grub_errno;
+}
+
+static grub_command_t cmd_linux, cmd_initrd, cmd_ucode;



thanks,
-minskey


--_b26521ab-6786-4095-b4ec-80957f3c912e_-- --_d9de4288-1508-45c0-a10b-b8add58560dd_ Content-Type: text/x-patch Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="grub.diff" PT09IG1vZGlmaWVkIGZpbGUgJ2dydWItY29yZS9sb2FkZXIvaTM4Ni9saW51eC5jJwotLS0gZ3J1 Yi1jb3JlL2xvYWRlci9pMzg2L2xpbnV4LmMJMjAxMS0wMy0wOSAxNzozODozMSArMDAwMAorKysg Z3J1Yi1jb3JlL2xvYWRlci9pMzg2L2xpbnV4LmMJMjAxMS0wMy0yOCAxNTo0NDozNCArMDAwMApA QCAtOTk0LDcgKzk5NCw4OSBAQAogICByZXR1cm4gZ3J1Yl9lcnJubzsKIH0KIAotc3RhdGljIGdy dWJfY29tbWFuZF90IGNtZF9saW51eCwgY21kX2luaXRyZDsKK3N0YXRpYyBncnViX2Vycl90Citn cnViX2NtZF91Y29kZSAoZ3J1Yl9jb21tYW5kX3QgY21kIF9fYXR0cmlidXRlX18gKCh1bnVzZWQp KSwKKwkJIGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGdydWJfZmlsZV90IGZpbGUgPSAw OworICBncnViX3NzaXplX3Qgc2l6ZTsKKyAgZ3J1Yl9hZGRyX3QgYWRkcl9taW4sIGFkZHJfbWF4 OworICBncnViX2Vycl90IGVycjsKKyAgc3RydWN0IGxpbnV4X2tlcm5lbF9oZWFkZXIgKmxoOwor ICBncnViX3JlbG9jYXRvcl9jaHVua190IGNoOworICB2b2lkICp1Y29kZV9tZW07CisgIGdydWJf YWRkcl90IHVjb2RlX21lbV90YXJnZXQ7CisgIHN0cnVjdCBzZXR1cF9kYXRhICpoZHI7CisKKyAg aWYgKGFyZ2MgPT0gMCkKKyAgICB7CisgICAgICBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfQVJH VU1FTlQsICJubyBtb2R1bGUgc3BlY2lmaWVkIik7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQor CisgIGlmICghIGxvYWRlZCkKKyAgICB7CisgICAgICBncnViX2Vycm9yIChHUlVCX0VSUl9CQURf QVJHVU1FTlQsICJ5b3UgbmVlZCB0byBsb2FkIHRoZSBrZXJuZWwgZmlyc3QiKTsKKyAgICAgIGdv dG8gZmFpbDsKKyAgICB9CisKKyAgZ3J1Yl9maWxlX2ZpbHRlcl9kaXNhYmxlX2NvbXByZXNzaW9u ICgpOworICBmaWxlID0gZ3J1Yl9maWxlX29wZW4gKGFyZ3ZbMF0pOworICBzaXplID0gZ3J1Yl9m aWxlX3NpemUoZmlsZSk7CisKKyAgbGggPSAoc3RydWN0IGxpbnV4X2tlcm5lbF9oZWFkZXIgKikg cmVhbF9tb2RlX21lbTsKKyAgaWYgKGdydWJfbGVfdG9fY3B1MTYobGgtPnZlcnNpb24pIDwgMHgw MjA5KQorICAgIHsKKyAgICAgIGdydWJfcHJpbnRmKCIlczolZDogaGVhZGVyIHZlcnNpb249MHgl eCg8MHgwMjA5KVxuIiwKKyAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgbGgtPnZl cnNpb24pOworICAgICAgZ290byBmYWlsOworICAgIH0KKworICBhZGRyX21heCA9IGdydWJfY3B1 X3RvX2xlMzIobGgtPmluaXRyZF9hZGRyX21heCk7CisgIGlmIChhZGRyX21heCA+IEdSVUJfTElO VVhfSU5JVFJEX01BWF9BRERSRVNTKQorICAgICAgYWRkcl9tYXggPSBHUlVCX0xJTlVYX0lOSVRS RF9NQVhfQUREUkVTUzsKKyAgYWRkcl9tYXggLT0gMHgxMDAwMDsKKworICBpZiAoKGxpbnV4X21l bV9zaXplICE9IDApICYmIChsaW51eF9tZW1fc2l6ZSA8IGFkZHJfbWF4KSkKKyAgICAgICBhZGRy X21heCA9IGxpbnV4X21lbV9zaXplOworICBhZGRyX21heCA9IChhZGRyX21heCAtIHNpemUgLSBz aXplb2YoKmhkcikpICYgfjB4RkZGOworICBhZGRyX21pbiA9IHByb3RfbW9kZV90YXJnZXQ7CisK KyAgZ3J1Yl9wcmludGYoIm1pY3JvY29kZSBhZGRyX21pbj0lcCwgYWRkX21heD0lcFxuIiwgCisJ KHZvaWQqKWFkZHJfbWluLCAodm9pZCAqKWFkZHJfbWF4KTsKKworICBlcnIgPSBncnViX3JlbG9j YXRvcl9hbGxvY19jaHVua19hbGlnbihyZWxvY2F0b3IsICZjaCwgYWRkcl9taW4sCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyX21heCwgc2l6ZSArIHNpemVvZigq aGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCwgR1JV Ql9SRUxPQ0FUT1JfUFJFRkVSRU5DRV9ISUdIKTsKKyAgaWYgKGVycikgcmV0dXJuIGVycjsKKyAg dWNvZGVfbWVtID0gZ2V0X3ZpcnR1YWxfY3VycmVudF9hZGRyZXNzKGNoKTsKKyAgdWNvZGVfbWVt X3RhcmdldCA9IGdldF9waHlzaWNhbF90YXJnZXRfYWRkcmVzcyhjaCk7CisKKyAgaWYgKGdydWJf ZmlsZV9yZWFkKGZpbGUsICh1bnNpZ25lZCBjaGFyKil1Y29kZV9tZW0gKyBzaXplb2YoKmhkciks IHNpemUpICE9IHNpemUpCisgICAgIHsKKyAgICAgICBncnViX2Vycm9yIChHUlVCX0VSUl9GSUxF X1JFQURfRVJST1IsICJjb3VsZG4ndCByZWFkIGZpbGUiKTsKKyAgICAgICBnb3RvIGZhaWw7Cisg ICAgIH0KKworICBoZHIgPSAoc3RydWN0IHNldHVwX2RhdGEgKil1Y29kZV9tZW07CisgIGhkci0+ dHlwZSA9IFNFVFVQX01JQ1JPQ09ERTsKKyAgaGRyLT5sZW4gPSBzaXplOworICBoZHItPm5leHQg PSAwOworCisgIGxoLT5zZXR1cF9kYXRhID0gdWNvZGVfbWVtX3RhcmdldDsKKworICBncnViX3By aW50ZigiJXM6IGhlYWRlcl92ZXJzaW9uPTB4JXgsIHVjb2RlX3NpemU9JWRcbiIsIF9fRlVOQ1RJ T05fXywKKyAgICAgIGdydWJfbGVfdG9fY3B1MTYgKGxoLT52ZXJzaW9uKSwgc2l6ZSk7CisgICAg ICAKKworIGZhaWw6CisgIGlmIChmaWxlKQorICAgIGdydWJfZmlsZV9jbG9zZSAoZmlsZSk7CisK KyAgcmV0dXJuIGdydWJfZXJybm87Cit9CisKK3N0YXRpYyBncnViX2NvbW1hbmRfdCBjbWRfbGlu dXgsIGNtZF9pbml0cmQsIGNtZF91Y29kZTsKIAogR1JVQl9NT0RfSU5JVChsaW51eCkKIHsKQEAg LTEwMDIsNiArMTA4NCw4IEBACiAJCQkJICAgICAwLCBOXygiTG9hZCBMaW51eC4iKSk7CiAgIGNt ZF9pbml0cmQgPSBncnViX3JlZ2lzdGVyX2NvbW1hbmQgKCJpbml0cmQiLCBncnViX2NtZF9pbml0 cmQsCiAJCQkJICAgICAgMCwgTl8oIkxvYWQgaW5pdHJkLiIpKTsKKyAgY21kX3Vjb2RlID0gZ3J1 Yl9yZWdpc3Rlcl9jb21tYW5kICgibWljcm9jb2RlIiwgZ3J1Yl9jbWRfdWNvZGUsCisJCQkJICAg ICAgMCwgTl8oIkxvYWQgbWljcm9jb2RlLiIpKTsKICAgbXlfbW9kID0gbW9kOwogfQogCkBAIC0x MDA5LDQgKzEwOTMsNSBAQAogewogICBncnViX3VucmVnaXN0ZXJfY29tbWFuZCAoY21kX2xpbnV4 KTsKICAgZ3J1Yl91bnJlZ2lzdGVyX2NvbW1hbmQgKGNtZF9pbml0cmQpOworICBncnViX3VucmVn aXN0ZXJfY29tbWFuZCAoY21kX3Vjb2RlKTsKIH0KCj09PSBtb2RpZmllZCBmaWxlICdpbmNsdWRl L2dydWIvaTM4Ni9saW51eC5oJwotLS0gaW5jbHVkZS9ncnViL2kzODYvbGludXguaAkyMDExLTAx LTEwIDIzOjAyOjAxICswMDAwCisrKyBpbmNsdWRlL2dydWIvaTM4Ni9saW51eC5oCTIwMTEtMDMt MjggMDk6NDE6MTIgKzAwMDAKQEAgLTg3LDYgKzg3LDIyIEBACiAgICAgR1JVQl9WSURFT19MSU5V WF9UWVBFX1NJTVBMRSA9IDB4NzAgICAgLyogTGluZWFyIGZyYW1lYnVmZmVyIHdpdGhvdXQgYW55 IGFkZGl0aW9uYWwgZnVuY3Rpb25zLiAgKi8KICAgfTsKIAorLyogc2V0dXAgZGF0YSB0eXBlcyAq LworI2RlZmluZSBTRVRVUF9OT05FICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU0VU VVBfRTgyMF9FWFQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNFVFVQX0RUQiAgICAgICAg ICAgICAgICAgICAgICAgMgorI2RlZmluZSBTRVRVUF9NSUNST0NPREUgICAgICAgICAgICAgICAg IDMKKworLyogZXh0ZW5zaWJsZSBzZXR1cCBkYXRhIGxpc3Qgbm9kZSAqLworc3RydWN0IHNldHVw X2RhdGEgeworICBncnViX3VpbnQ2NF90IG5leHQ7CisgIGdydWJfdWludDMyX3QgdHlwZTsKKyAg Z3J1Yl91aW50MzJfdCBsZW47CisgIGdydWJfdWludDhfdCAgZGF0YVswXTsKK30gX19hdHRyaWJ1 dGVfXyAoKHBhY2tlZCkpOworCisKKwogLyogRm9yIHRoZSBMaW51eC9pMzg2IGJvb3QgcHJvdG9j b2wgdmVyc2lvbiAyLjAzLiAgKi8KIHN0cnVjdCBsaW51eF9rZXJuZWxfaGVhZGVyCiB7CkBAIC0x MzAsNiArMTQ2LDggQEAKICAgZ3J1Yl91aW50MTZfdCBwYWQxOwkJCS8qIFVudXNlZCAqLwogICBn cnViX3VpbnQzMl90IGNtZF9saW5lX3B0cjsJCS8qIFBvaW50cyB0byB0aGUga2VybmVsIGNvbW1h bmQgbGluZSAqLwogICBncnViX3VpbnQzMl90IGluaXRyZF9hZGRyX21heDsgICAgICAgIC8qIEhp Z2hlc3QgYWRkcmVzcyBmb3IgaW5pdHJkICovCisgIGdydWJfdWludDMyX3QgcGFkMls4XTsKKyAg Z3J1Yl91aW50NjRfdCBzZXR1cF9kYXRhOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAK IC8qIEJvb3QgcGFyYW1ldGVycyBmb3IgTGludXggYmFzZWQgb24gMi42LjEyLiBUaGlzIGlzIHVz ZWQgYnkgdGhlIHNldHVwCgo= --_d9de4288-1508-45c0-a10b-b8add58560dd_--