From owner-freebsd-amd64@freebsd.org Sun Nov 27 14:26:51 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7DEE4C566C2 for ; Sun, 27 Nov 2016 14:26:51 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 62D1D169B for ; Sun, 27 Nov 2016 14:26:51 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uAREQp20044790 for ; Sun, 27 Nov 2016 14:26:51 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214880] Unable to edit or add recipes. Date: Sun, 27 Nov 2016 14:26:51 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: misc X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: easy X-Bugzilla-Severity: Affects Some People X-Bugzilla-Who: rhs.message@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform bug_file_loc op_sys bug_status keywords bug_severity priority component assigned_to reporter cc attachments.created Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 Nov 2016 14:26:51 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214880 Bug ID: 214880 Summary: Unable to edit or add recipes. Product: Base System Version: 11.0-RELEASE Hardware: amd64 URL: https://github.com/thinkle/gourmet/issues/821 OS: Any Status: New Keywords: easy Severity: Affects Some People Priority: --- Component: misc Assignee: freebsd-bugs@FreeBSD.org Reporter: rhs.message@gmail.com CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org Created attachment 177449 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=3D177449&action= =3Dedit Python back-trace after invocation as unprivileged user. Seems as if this has occurred previously on other distros. Seems as if those have been fixed without to much to-do. Program seems to open normally from desktop shortcut (KDE) or as unprivileg= ed user. Opening recipes seems okay as well, they display all fields. Editing = any field brings up blank editor. Attached is full back trace with my edits at lines 887, 1352, 1399. I know = less than nothing about python. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Sun Nov 27 14:29:16 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 36513C5689C for ; Sun, 27 Nov 2016 14:29:16 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 262761A5A for ; Sun, 27 Nov 2016 14:29:16 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uARETGZY047652 for ; Sun, 27 Nov 2016 14:29:16 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214880] Unable to edit or add recipes. Date: Sun, 27 Nov 2016 14:29:16 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Ports & Packages X-Bugzilla-Component: Individual Port(s) X-Bugzilla-Version: Latest X-Bugzilla-Keywords: easy X-Bugzilla-Severity: Affects Some People X-Bugzilla-Who: rhs.message@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: product version component Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 Nov 2016 14:29:16 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214880 rhs changed: What |Removed |Added ---------------------------------------------------------------------------- Product|Base System |Ports & Packages Version|11.0-RELEASE |Latest Component|misc |Individual Port(s) --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Sun Nov 27 21:13:43 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3AE4BC58CCD for ; Sun, 27 Nov 2016 21:13:43 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2A7311AAF for ; Sun, 27 Nov 2016 21:13:43 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uARLDgp0087373 for ; Sun, 27 Nov 2016 21:13:43 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214880] deskutils/gourmet: Unable to edit or add recipes. Date: Sun, 27 Nov 2016 21:13:43 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Ports & Packages X-Bugzilla-Component: Individual Port(s) X-Bugzilla-Version: Latest X-Bugzilla-Keywords: easy X-Bugzilla-Severity: Affects Some People X-Bugzilla-Who: linimon@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: rm@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: alias assigned_to short_desc cc Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 Nov 2016 21:13:43 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214880 Mark Linimon changed: What |Removed |Added ---------------------------------------------------------------------------- Alias|deskutils/gourmet | Assignee|freebsd-bugs@FreeBSD.org |rm@FreeBSD.org Summary|Unable to edit or add |deskutils/gourmet: Unable |recipes. |to edit or add recipes. CC|freebsd-amd64@FreeBSD.org | --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Mon Nov 28 09:12:55 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id D25C8C58A36 for ; Mon, 28 Nov 2016 09:12:55 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B8D041A87 for ; Mon, 28 Nov 2016 09:12:55 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uAS9CtD0036866 for ; Mon, 28 Nov 2016 09:12:55 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214898] mount -a will remount a partition if it's a ramdisk by incrementing mdX Date: Mon, 28 Nov 2016 09:12:55 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: bin X-Bugzilla-Version: 10.3-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: bjornr@iceland2000.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Nov 2016 09:12:55 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214898 Bug ID: 214898 Summary: mount -a will remount a partition if it's a ramdisk by incrementing mdX Product: Base System Version: 10.3-RELEASE Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: bin Assignee: freebsd-bugs@FreeBSD.org Reporter: bjornr@iceland2000.com CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org Before mount -a: /var/run and /tmp are mounted as ramdisk: md /tmp mfs rw,-s512M,noatime 0= =20=20=20=20=20 0 md /var/run mfs rw,-s32M,noatime 0= =20=20=20=20=20=20 0 df -h |grep md /dev/md0 on /tmp (ufs, local, noatime, soft-updates) /dev/md1 on /var/run (ufs, local, noatime, soft-updates) After mount -a: df -h |grep md /dev/md0 496M 52K 456M 0% /tmp /dev/md1 31M 128K 28M 0% /var/run /dev/md2 496M 8,0K 456M 0% /tmp /dev/md3 31M 8,0K 28M 0% /var/run Executing commands in /usr/local/bin will now fail: # bash Shared object "libintl.so.8" not found, required by "bash" Does not happen on FreeBSD 10.2, will also happen on FreeBSD 11.0-RELEASE Affects: 11.0-RELEASE-p3 10.3-RELEASE-p12 Temporary resolution: umount the filesystems and for /var/run, execute: ldconfig /usr/local/lib This does not happen when the md devices are explicitly named in fstab: md0 /tmp mfs rw,-s512M,noatime 0= =20=20=20=20 0 md1 /var/run mfs rw,-s32M,noatime 0= =20=20=20=20=20 0 But mount -a returns: mount -a mount_mfs: mdconfig (attach) exited with error code 1 mount_mfs: mdconfig (attach) exited with error code 1 According to the man page: # UFS file system on a swap-backed md(4). /dev/md10 is # automatically created. If it is "md", a unit number # will be automatically selected. md10 /scratch mfs rw,-s1g 0 0 But at some time, after 10.3-RELEASE it will not re-use, but create new md devices? --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Mon Nov 28 17:39:10 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 0993BC5A50E for ; Mon, 28 Nov 2016 17:39:10 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id D38E21CBD for ; Mon, 28 Nov 2016 17:39:09 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uASHd90q030601 for ; Mon, 28 Nov 2016 17:39:09 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214911] bsdinstall/scripts/zfsboot detaches *all* GELI devices Date: Mon, 28 Nov 2016 17:39:09 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: bin X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Some People X-Bugzilla-Who: freebsd@tim.thechases.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Nov 2016 17:39:10 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214911 Bug ID: 214911 Summary: bsdinstall/scripts/zfsboot detaches *all* GELI devices Product: Base System Version: 11.0-RELEASE Hardware: amd64 OS: Any Status: New Severity: Affects Some People Priority: --- Component: bin Assignee: freebsd-bugs@FreeBSD.org Reporter: freebsd@tim.thechases.com CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org Attempting to create a `md0` drive image to upload to my hosting service, I= 'm using `bsdinstall` to try and do the install. This worked in 10.3, but chan= ges in 11 trigger issues. To repeat, issue the following on an existing 11.0 system installed on a ZFS-on-GELI configuration: ## show the current system is on GELI # geli list | grep Name Name: ada0p4.eli Name: ada0p4 Name: ada0p3.eli Name: ada0p3 ## show that ada0p4.eli is the only backing member of zroot # zpool status zroot ... NAME STATE READ WRITE CKSUM zroot ONLINE 0 0 0 ada0p4.eli ONLINE 0 0 0 ## create a 10GB disk image file dd if=3D/dev/zero of=3Dfreebsd.img bs=3D10m count=3D1k ##turn it into a disk # mdconfig -f freebsd.img -u 0 ## run bsdinstall # bsdinstall Specify guided ZFS-on-root, a single stripe backed by `md0` and encrypt both the pool and the swap. Proceeding with install the will show messages on t= he console that *ada0p4.eli* has been detached and the host machine will hang = for the obvious reason that its underlying GEOM_ELI has been forcibly detached = and there's no longer any root file-system. Digging further shows that /usr/src/usr.sbin/bsdinstall/scripts/zfsboot is forcibly detaching *all* GELI providers (around line 793, using GELI_DETACH= _F), not just those that it created during the install process. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Mon Nov 28 19:15:11 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id BEC88C5A37B for ; Mon, 28 Nov 2016 19:15:11 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id AE5671F4F for ; Mon, 28 Nov 2016 19:15:11 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uASJFAYu050918 for ; Mon, 28 Nov 2016 19:15:11 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214911] bsdinstall/scripts/zfsboot detaches *all* GELI devices Date: Mon, 28 Nov 2016 19:15:10 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: bin X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Some People X-Bugzilla-Who: linimon@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-sysinstall@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: assigned_to cc Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Nov 2016 19:15:11 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214911 Mark Linimon changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|freebsd-bugs@FreeBSD.org |freebsd-sysinstall@FreeBSD. | |org CC|freebsd-amd64@FreeBSD.org | --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Mon Nov 28 19:16:52 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7963DC5A565 for ; Mon, 28 Nov 2016 19:16:52 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 68DF01227 for ; Mon, 28 Nov 2016 19:16:52 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uASJGqgo053290 for ; Mon, 28 Nov 2016 19:16:52 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214898] mount -a will remount a partition if it's a ramdisk by incrementing mdX Date: Mon, 28 Nov 2016 19:16:52 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: bin X-Bugzilla-Version: 10.3-RELEASE X-Bugzilla-Keywords: regression X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: linimon@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: cc keywords Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Nov 2016 19:16:52 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214898 Mark Linimon changed: What |Removed |Added ---------------------------------------------------------------------------- CC|freebsd-amd64@FreeBSD.org | Keywords| |regression --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Mon Nov 28 20:24:35 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1BBDFC58B74 for ; Mon, 28 Nov 2016 20:24:35 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0C1531F73 for ; Mon, 28 Nov 2016 20:24:35 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uASKOYa5043093 for ; Mon, 28 Nov 2016 20:24:34 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214913] SO_KEEPALIVE does not work? Date: Mon, 28 Nov 2016 20:24:35 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 9.2-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Many People X-Bugzilla-Who: porton@narod.ru X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Nov 2016 20:24:35 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214913 Bug ID: 214913 Summary: SO_KEEPALIVE does not work? Product: Base System Version: 9.2-RELEASE Hardware: amd64 OS: Any Status: New Severity: Affects Many People Priority: --- Component: kern Assignee: freebsd-bugs@FreeBSD.org Reporter: porton@narod.ru CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org See http://bugs.python.org/issue28825 --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Mon Nov 28 22:20:49 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 74E60C5A161 for ; Mon, 28 Nov 2016 22:20:49 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 5E2F216FD for ; Mon, 28 Nov 2016 22:20:49 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uASMKmNu002587 for ; Mon, 28 Nov 2016 22:20:49 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214913] SO_KEEPALIVE does not work? Date: Mon, 28 Nov 2016 22:20:48 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 9.2-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Many People X-Bugzilla-Who: linimon@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-net@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: cc assigned_to Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Nov 2016 22:20:49 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214913 Mark Linimon changed: What |Removed |Added ---------------------------------------------------------------------------- CC|freebsd-amd64@FreeBSD.org | Assignee|freebsd-bugs@FreeBSD.org |freebsd-net@FreeBSD.org --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Tue Nov 29 00:02:40 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 17104C59F1E for ; Tue, 29 Nov 2016 00:02:40 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0669B1591 for ; Tue, 29 Nov 2016 00:02:40 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uAT02dY7013804 for ; Tue, 29 Nov 2016 00:02:39 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214920] [sound] No sound with headphones attached, using ALC271X Date: Tue, 29 Nov 2016 00:02:39 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: reezer@reezer.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc attachments.created Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Nov 2016 00:02:40 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214920 Bug ID: 214920 Summary: [sound] No sound with headphones attached, using ALC271X Product: Base System Version: 11.0-RELEASE Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: freebsd-bugs@FreeBSD.org Reporter: reezer@reezer.org CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org Created attachment 177501 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=3D177501&action= =3Dedit ouput of cat /proc/asound/card0/codec I've been trying to get audio to work when using headphones. Trying to use /boot/device.hints also remained unsuccessful[1]. Headphone and microphone sensing work correctly, just like speakers work out of the box. The very same system works under Linux. I attached information from this sy= stem in a working state there. The values are taken with headphones and microphone connected. uname -a FreeBSD cabal 11.0-RELEASE-p2 FreeBSD 11.0-RELEASE-p2 #0: Mon Oct 24 06:55:= 27 UTC 2016 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERI= C=20 amd64 cat /dev/sndstat Installed devices: pcm0: (play/rec) default pcm1: (rec) pcm2: (play) No devices installed from userspace. mixer Mixer vol is currently set to 24:24 Mixer pcm is currently set to 100:100 Mixer speaker is currently set to 74:74 Mixer mix is currently set to 74:74 Mixer rec is currently set to 35:35 Mixer igain is currently set to 0:0 Mixer ogain is currently set to 100:100 Mixer monitor is currently set to 56:56 Recording source: monitor sysctl hw.snd hw.snd.maxautovchans: 16 hw.snd.default_unit: 0 hw.snd.version: 2009061500/amd64 hw.snd.default_auto: 1 hw.snd.verbose: 0 hw.snd.vpc_mixer_bypass: 1 hw.snd.feeder_rate_quality: 1 hw.snd.feeder_rate_round: 25 hw.snd.feeder_rate_max: 2016000 hw.snd.feeder_rate_min: 1 hw.snd.feeder_rate_polyphase_max: 183040 hw.snd.feeder_rate_presets: 100:8:0.85 100:36:0.92 100:164:0.97 hw.snd.feeder_eq_exact_rate: 0 hw.snd.feeder_eq_presets: PEQ:16000,0.2500,62,0.2500:-9,9,1.0:44100,48000,88200,96000,176400,192000 hw.snd.basename_clone: 1 hw.snd.compat_linux_mmap: 0 hw.snd.syncdelay: -1 hw.snd.usefrags: 0 hw.snd.vpc_reset: 0 hw.snd.vpc_0db: 45 hw.snd.vpc_autoreset: 1 hw.snd.timeout: 5 hw.snd.latency_profile: 1 hw.snd.latency: 5 hw.snd.report_soft_matrix: 1 hw.snd.report_soft_formats: 1 sysctl dev.pcm dev.pcm.2.bitperfect: 0 dev.pcm.2.buffersize: 65536 dev.pcm.2.play.vchanformat: s16le:2.0 dev.pcm.2.play.vchanrate: 48000 dev.pcm.2.play.vchanmode: passthrough dev.pcm.2.play.vchans: 1 dev.pcm.2.play.32bit: 24 dev.pcm.2.%parent: hdaa1 dev.pcm.2.%pnpinfo:=20 dev.pcm.2.%location: nid=3D7 dev.pcm.2.%driver: pcm dev.pcm.2.%desc: Intel Panther Point (HDMI/DP 8ch) dev.pcm.1.bitperfect: 0 dev.pcm.1.buffersize: 65536 dev.pcm.1.rec.vchanformat: s16le:2.0 dev.pcm.1.rec.vchanrate: 48000 dev.pcm.1.rec.vchanmode: fixed dev.pcm.1.rec.vchans: 1 dev.pcm.1.rec.autosrc: 2 dev.pcm.1.rec.32bit: 24 dev.pcm.1.%parent: hdaa0 dev.pcm.1.%pnpinfo:=20 dev.pcm.1.%location: nid=3D24 dev.pcm.1.%driver: pcm dev.pcm.1.%desc: Realtek ALC269 (Left Analog Mic) dev.pcm.0.bitperfect: 0 dev.pcm.0.buffersize: 65536 dev.pcm.0.rec.vchanformat: s16le:2.0 dev.pcm.0.rec.vchanrate: 48000 dev.pcm.0.rec.vchanmode: fixed dev.pcm.0.rec.vchans: 1 dev.pcm.0.rec.autosrc: 2 dev.pcm.0.rec.32bit: 24 dev.pcm.0.play.vchanformat: s16le:2.0 dev.pcm.0.play.vchanrate: 48000 dev.pcm.0.play.vchanmode: fixed dev.pcm.0.play.vchans: 1 dev.pcm.0.play.32bit: 24 dev.pcm.0.%parent: hdaa0 dev.pcm.0.%pnpinfo:=20 dev.pcm.0.%location: nid=3D20,33,27 dev.pcm.0.%driver: pcm dev.pcm.0.%desc: Realtek ALC269 (Analog 2.0+HP/2.0) dev.pcm.%parent: dmesg | grep 'pcm[0-9]' pcm0: at nid 20,27 and 24 on hdaa0 pcm1: at nid 7 on hdaa1 pcm0: at nid 20,33 and 27 on hdaa0 pcm0: Playback: pcm0: Stream cap: 0x00000001 PCM pcm0: PCM cap: 0x000e0560 16 20 24 bits, 44 48 96 192 KHz pcm0: DAC: 2 pcm0:=20 pcm0: nid=3D20 [pin: Speaker (Fixed)] pcm0: + <- nid=3D12 [audio mixer] [src: pcm, mix] pcm0: + <- nid=3D2 [audio output] [src: pcm] pcm0: + <- nid=3D11 [audio mixer] [src: mix] pcm0:=20 pcm0: nid=3D33 [pin: Headphones (Black Jack)] pcm0: + <- nid=3D12 [audio mixer] [src: pcm, mix] pcm0: + <- nid=3D2 [audio output] [src: pcm] pcm0: + <- nid=3D11 [audio mixer] [src: mix] pcm0:=20 pcm0: Record: pcm0: Stream cap: 0x00000001 PCM pcm0: PCM cap: 0x000e0560 16 20 24 bits, 44 48 96 192 KHz pcm0: ADC: 8 pcm0:=20 pcm0: nid=3D8 [audio input] pcm0: + <- nid=3D35 [audio mixer] [src: speaker, mix, monitor] pcm0: + <- nid=3D27 [pin: Mic (Fixed)] [src: monitor] pcm0: + <- nid=3D29 [beep widget] [src: speaker] pcm0: + <- nid=3D11 [audio mixer] [src: mix] pcm0:=20 pcm0: Input Mix: pcm0:=20 pcm0: nid=3D11 [audio mixer] pcm0: + <- nid=3D27 [pin: Mic (Fixed)] [src: monitor] pcm0: + <- nid=3D29 [beep widget] [src: speaker] pcm0:=20 pcm0: Master Volume (OSS: vol): -65/0dB pcm0: +- ctl 1 (nid 2 out): -65/0dB (88 steps) pcm0: +- ctl 10 (nid 12 in 0): mute pcm0: +- ctl 11 (nid 12 in 1): mute pcm0: +- ctl 17 (nid 20 in ): mute pcm0: +- ctl 26 (nid 33 in ): mute pcm0:=20 pcm0: PCM Volume (OSS: pcm): -65/0dB pcm0: +- ctl 1 (nid 2 out): -65/0dB (88 steps) pcm0: +- ctl 10 (nid 12 in 0): mute pcm0:=20 pcm0: Microphone2 Volume (OSS: monitor): 0/36dB pcm0: +- ctl 8 (nid 11 in 3): -34/12dB (32 steps) + mute pcm0: +- ctl 25 (nid 27 out): 0/36dB (4 steps) pcm0: +- ctl 30 (nid 35 in 3): mute pcm0:=20 pcm0: Speaker/Beep Volume (OSS: speaker): -16/12dB pcm0: +- ctl 9 (nid 11 in 4): -34/12dB (32 steps) + mute pcm0: +- ctl 31 (nid 35 in 4): mute pcm0:=20 pcm0: Recording Level (OSS: rec): -16/30dB pcm0: +- ctl 3 (nid 8 in 0): -16/30dB (32 steps) + mute pcm0: +- ctl 30 (nid 35 in 3): mute pcm0: +- ctl 31 (nid 35 in 4): mute pcm0: +- ctl 32 (nid 35 in 5): mute pcm0:=20 pcm0: Input Mix Level (OSS: mix): -34/12dB pcm0: +- ctl 8 (nid 11 in 3): -34/12dB (32 steps) + mute pcm0: +- ctl 9 (nid 11 in 4): -34/12dB (32 steps) + mute pcm0: +- ctl 11 (nid 12 in 1): mute pcm0: +- ctl 32 (nid 35 in 5): mute pcm0:=20 pcm0: Input Monitoring Level (OSS: igain): 0/0dB pcm0: +- ctl 11 (nid 12 in 1): mute pcm0:=20 pcm0: Mixer "vol": pcm0: Mixer "pcm": pcm0: Mixer "speaker": pcm0: Mixer "mix": pcm0: Mixer "rec": pcm0: Mixer "igain": pcm0: Mixer "ogain": pcm0: Mixer "monitor": pcm0: Playback channel set is: Front Left, Front Right,=20 pcm0: Playback channel matrix is: 2.0 (connected) pcm0: Automatically set rec source to: monitor pcm0: Recording channel set is: Front Left, Front Right,=20 pcm0: Recording channel matrix is: 2.0 (unknown) random: harvesting attach, 8 bytes (4 bits) from pcm0 pcm1: at nid 24 on hdaa0 pcm1: Record: pcm1: Stream cap: 0x00000001 PCM pcm1: PCM cap: 0x000e0560 16 20 24 bits, 44 48 96 192 KHz pcm1: ADC: 9 pcm1:=20 pcm1: nid=3D9 [audio input] pcm1: + <- nid=3D34 [audio selector] [src: speaker, mic] pcm1: + <- nid=3D24 [pin: Mic (Pink Jack)] [src: mic] pcm1: + <- nid=3D29 [beep widget] [src: speaker] pcm1:=20 pcm1: Microphone Volume (OSS: mic): 0/36dB pcm1: +- ctl 4 (nid 9 in 0): -16/30dB (32 steps) + mute pcm1: +- ctl 20 (nid 24 out): 0/36dB (4 steps) pcm1:=20 pcm1: Speaker/Beep Volume (OSS: speaker) pcm1: +- ctl 4 (nid 9 in 0): -16/30dB (32 steps) + mute pcm1:=20 pcm1: Recording Level (OSS: rec): -16/30dB pcm1: +- ctl 4 (nid 9 in 0): -16/30dB (32 steps) + mute pcm1: +- ctl 20 (nid 24 out): 0/36dB (4 steps) pcm1:=20 pcm1: Mixer "mic": pcm1: Mixer "rec": pcm1: Automatically set rec source to: mic pcm1: Recording channel set is: Front Left, Front Right,=20 pcm1: Recording channel matrix is: 2.0 (connected) random: harvesting attach, 8 bytes (4 bits) from pcm1 pcm2: at nid 7 on hdaa1 pcm2: Playback: pcm2: Stream cap: 0x00000005 AC3 PCM pcm2: PCM cap: 0x001e07f0 16 20 24 32 bits, 32 44 48 88 96 176 192 = KHz pcm2: DAC: 4 pcm2:=20 pcm2: nid=3D7 [pin: Digital-out (Jack)] pcm2: + <- nid=3D4 [audio output] [src: pcm] pcm2:=20 pcm2: Master Volume (OSS: vol): 0/0dB pcm2: +- ctl 3 (nid 7 in ): mute pcm2:=20 pcm2: PCM Volume (OSS: pcm): 0/0dB pcm2: +- ctl 3 (nid 7 in ): mute pcm2:=20 pcm2: Mixer "vol": pcm2: Mixer "pcm": pcm2: Soft PCM mixer ENABLED pcm2: Playback channel matrix is: unknown, assuming 7.1 (disconnected) random: harvesting attach, 8 bytes (4 bits) from pcm2 [1] See (also contains some other behavior): https://forums.freebsd.org/threads/58623/#post-335870 --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Tue Nov 29 00:06:50 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 154FEC58124 for ; Tue, 29 Nov 2016 00:06:50 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0506316ED for ; Tue, 29 Nov 2016 00:06:50 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uAT06nSI002538 for ; Tue, 29 Nov 2016 00:06:49 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214920] [sound] No sound with headphones attached, using ALC271X on Acer Aspire V3-771 Date: Tue, 29 Nov 2016 00:06:50 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: reezer@reezer.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: short_desc Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Nov 2016 00:06:50 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214920 Christian Sturm changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|[sound] No sound with |[sound] No sound with |headphones attached, using |headphones attached, using |ALC271X |ALC271X on Acer Aspire | |V3-771 --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Tue Nov 29 08:17:19 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id AE272C5BDD3 for ; Tue, 29 Nov 2016 08:17:19 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 9E5041D32 for ; Tue, 29 Nov 2016 08:17:19 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uAT8HJBP038265 for ; Tue, 29 Nov 2016 08:17:19 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214923] kqueue hangs with busy loop Date: Tue, 29 Nov 2016 08:17:19 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: yjh0502@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Nov 2016 08:17:19 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214923 Bug ID: 214923 Summary: kqueue hangs with busy loop Product: Base System Version: 11.0-RELEASE Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: freebsd-bugs@FreeBSD.org Reporter: yjh0502@gmail.com CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org I used watchman[1] for monitoring file changes, and watchman process hangs = on infinite loop occasionally. Here's dtrace trace for hanging process. --- root@hostname:~ # dtrace -n 'profile-997 /pid =3D=3D 85473/ { @[stack()] = =3D count() }' dtrace: description 'profile-997 ' matched 1 probe ^C kernel`kqueue_kevent+0x369 kernel`0xffffffff80f8442b 4 kernel`kqueue_kevent+0x37b kernel`0xffffffff80f8442b 8 kernel`kqueue_kevent+0x3b5 kernel`0xffffffff80f8442b 14 kernel`kqueue_kevent+0xda1 kernel`0xffffffff80f8442b 25 kernel`kqueue_kevent+0xdc9 kernel`0xffffffff80f8442b 29 kernel`kqueue_kevent+0x44b kernel`0xffffffff80f8442b 31 kernel`kqueue_kevent+0x3c7 kernel`0xffffffff80f8442b 45 kernel`kqueue_kevent+0x43c kernel`0xffffffff80f8442b 49 kernel`kqueue_kevent+0x38c kernel`0xffffffff80f8442b 52 kernel`kqueue_kevent+0x453 kernel`0xffffffff80f8442b 54 kernel`kqueue_kevent+0x2f0 kernel`0xffffffff80f8442b 57 kernel`kqueue_kevent+0xda3 kernel`0xffffffff80f8442b 58 kernel`kqueue_kevent+0xdaa kernel`0xffffffff80f8442b 58 kernel`kqueue_kevent+0x3b8 kernel`0xffffffff80f8442b 58 kernel`kqueue_kevent+0x3bd kernel`0xffffffff80f8442b 59 kernel`kqueue_kevent+0x444 kernel`0xffffffff80f8442b 65 kernel`kqueue_kevent+0xdd7 kernel`0xffffffff80f8442b 67 kernel`kqueue_kevent+0x3cb kernel`0xffffffff80f8442b 83 kernel`kqueue_kevent+0x34f kernel`0xffffffff80f8442b 91 kernel`kqueue_kevent+0x440 kernel`0xffffffff80f8442b 94 kernel`kqueue_kevent+0x348 kernel`0xffffffff80f8442b 97 kernel`kqueue_kevent+0xd93 kernel`0xffffffff80f8442b 109 kernel`kqueue_kevent+0x2f5 kernel`0xffffffff80f8442b 113 kernel`kqueue_kevent+0x393 kernel`0xffffffff80f8442b 122 kernel`kqueue_kevent+0x37f kernel`0xffffffff80f8442b 126 kernel`kqueue_kevent+0x3cf kernel`0xffffffff80f8442b 126 kernel`kqueue_kevent+0x356 kernel`0xffffffff80f8442b 168 kernel`kqueue_kevent+0xdd0 kernel`0xffffffff80f8442b 266 kernel`kqueue_kevent+0x382 kernel`0xffffffff80f8442b 399 kernel`kqueue_kevent+0x36d kernel`0xffffffff80f8442b 437 kernel`kqueue_kevent+0x39a kernel`0xffffffff80f8442b 465 kernel`kqueue_kevent+0x365 kernel`0xffffffff80f8442b 969 kernel`kqueue_kevent+0x3a4 kernel`0xffffffff80f8442b 1243 kernel`kqueue_kevent+0x3a0 kernel`0xffffffff80f8442b 3513 kernel`kqueue_kevent+0x385 kernel`0xffffffff80f8442b 3713 kernel`kqueue_kevent+0xdde kernel`0xffffffff80f8442b 3751 kernel`kqueue_kevent+0x371 kernel`0xffffffff80f8442b 3752 kernel`kqueue_kevent+0x3c2 kernel`0xffffffff80f8442b 3866 kernel`kqueue_kevent+0x438 kernel`0xffffffff80f8442b 3890 kernel`kqueue_kevent+0x35d kernel`0xffffffff80f8442b 3891 kernel`kqueue_kevent+0x3ab kernel`0xffffffff80f8442b 3934 kernel`kqueue_kevent+0xd9a kernel`0xffffffff80f8442b 4046 kernel`kqueue_kevent+0x3ba kernel`0xffffffff80f8442b 4067 kernel`kqueue_kevent+0x3ae kernel`0xffffffff80f8442b 4109 kernel`kqueue_kevent+0xdc2 kernel`0xffffffff80f8442b 4115 kernel`kqueue_kevent+0x341 kernel`0xffffffff80f8442b 4125 kernel`kqueue_kevent+0x447 kernel`0xffffffff80f8442b 9275 kernel`kqueue_kevent+0x374 kernel`0xffffffff80f8442b 11043 kernel`kqueue_kevent+0x3a8 kernel`0xffffffff80f8442b 17816 --- Here's ps output --- root 85473 100.0 0.2 47424 3760 - L 19Oct16 13:10.30 /usr/local/bin/watchman -p -j --server-encoding=3Djson --output-encoding=3D= bser --- `top` shows that watchman process spins on kqueue call --- PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMM= AND 85473 root 4 20 0 47424K 3760K *kqueu 2 13:32 97.82% watc= hman --- The host uses zfs filesystem on root. In this case problem arises on 11.0-RELEASE-p3, but I faced the problem from 10.3 releases. The host runs = on top of KVM hypervisor. `dmesg` does not show any logs from kernel. Please l= et me know if I'm missing some information. [1] https://facebook.github.io/watchman/ --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Tue Nov 29 09:28:19 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4FA90C5981E for ; Tue, 29 Nov 2016 09:28:19 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 3FBE6158C for ; Tue, 29 Nov 2016 09:28:19 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uAT9SI5P028829 for ; Tue, 29 Nov 2016 09:28:19 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214923] kqueue hangs with busy loop Date: Tue, 29 Nov 2016 09:28:18 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: kib@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: cc Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Nov 2016 09:28:19 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214923 Konstantin Belousov changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |kib@FreeBSD.org --- Comment #1 from Konstantin Belousov --- (In reply to yjh0502 from comment #0) I do not see a clean indicator that the process 'spins on the kqueue syscal= l'.=20 The wait channel demonstrates that the process waits for some event subsyst= em mutex (the star before the name), but due to the truncated output, I am not sure which mutex is it. It could kqueue lock, or kqueue global lock, for instance. That said, WCPU 100% indicates that there is some other thread in the proce= ss which consumes cycles, which is consistent with the report of four threads = in the process. >From that data, I am not even convinced that this is a kernel bug and not s= ome application issue. For very beginning, look at the kernel backtraces of all threads in your process with procstat -kk. Find and backtrace the lock own= er of a kqueue lock. All that assuming that you believe that the issue is a kernel problem. Otherwise, and I would start with that route, would I debu= g it myself, is to look at the app and see what it is doing (wrong). --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Tue Nov 29 12:02:14 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6961CC589AA for ; Tue, 29 Nov 2016 12:02:14 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 598C71B07 for ; Tue, 29 Nov 2016 12:02:14 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uATC2Ets026367 for ; Tue, 29 Nov 2016 12:02:14 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214923] kqueue hangs with busy loop Date: Tue, 29 Nov 2016 12:02:14 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: yjh0502@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Nov 2016 12:02:14 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214923 --- Comment #2 from yjh0502@gmail.com --- I thought something goes wrong in kernel because the process is not respond= ing on the signal because the process is in uninterruptible state, so pkill -9 watchman cannot kill the process. I coundn't even attach gdb to the process. There were some other symptoms like accessing file system hangs on uninterruptible state, for example editing file with vi on same filesystem hangs when I try to save changes. I should reboot the system to recover the failure. In Linux if there's any problem on block device, then there are some logs a= nd traces on dmesg. I couldn't find any logs on dmesg, do I thought that it's = not block devices' fault. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Tue Nov 29 12:20:04 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 59950C5937E for ; Tue, 29 Nov 2016 12:20:04 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 48AE51595 for ; Tue, 29 Nov 2016 12:20:04 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uATCK3te058221 for ; Tue, 29 Nov 2016 12:20:04 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214923] kqueue hangs with busy loop Date: Tue, 29 Nov 2016 12:20:04 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: kib@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Nov 2016 12:20:04 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214923 --- Comment #3 from Konstantin Belousov --- Start with backtracing all threads in your process, as I noted in previous reply. Even better, backtrace all threads in the deadlocked system. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Tue Nov 29 12:30:55 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 0B1A3C59883 for ; Tue, 29 Nov 2016 12:30:55 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id EF7E91C49 for ; Tue, 29 Nov 2016 12:30:54 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uATCUsOG000795 for ; Tue, 29 Nov 2016 12:30:54 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214923] kqueue hangs with busy loop Date: Tue, 29 Nov 2016 12:30:55 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: yjh0502@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Nov 2016 12:30:55 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214923 --- Comment #4 from yjh0502@gmail.com --- Sorry for additional information. The problem happened on production server, which runs web servers like haproxy. The problem seems to block some listen= ing threads so some of clients cannot communicate with the web server. I reboot= ed the machine to recover the failure. I'll post procstat -kk output when the problem happens again. Please let me know is there's any other output to identify the problem. Thanks for your help. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Wed Nov 30 03:03:22 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3C3D2C59125 for ; Wed, 30 Nov 2016 03:03:22 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2BD261156 for ; Wed, 30 Nov 2016 03:03:22 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uAU33LLE005841 for ; Wed, 30 Nov 2016 03:03:22 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214920] [sound] No sound with headphones attached, using ALC271X on Acer Aspire V3-771 Date: Wed, 30 Nov 2016 03:03:21 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: linimon@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-multimedia@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: assigned_to cc Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Nov 2016 03:03:22 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214920 Mark Linimon changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|freebsd-bugs@FreeBSD.org |freebsd-multimedia@FreeBSD. | |org CC|freebsd-amd64@FreeBSD.org | --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Wed Nov 30 16:44:03 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7AB85C5D287 for ; Wed, 30 Nov 2016 16:44:03 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 6A85D1AD4 for ; Wed, 30 Nov 2016 16:44:03 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uAUGi3Lc029817 for ; Wed, 30 Nov 2016 16:44:03 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214554] Panic when Nginx reload Date: Wed, 30 Nov 2016 16:44:03 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 10.3-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: admin@mydevil.net X-Bugzilla-Status: Closed X-Bugzilla-Resolution: FIXED X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_status resolution Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Nov 2016 16:44:03 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214554 MyDevil.net Hosting changed: What |Removed |Added ---------------------------------------------------------------------------- Status|New |Closed Resolution|--- |FIXED --- Comment #4 from MyDevil.net Hosting --- After 2 weeks I can confirm - no more panics. Thank you. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Thu Dec 1 14:10:01 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 42459C6082A for ; Thu, 1 Dec 2016 14:10:01 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 1525D1D25 for ; Thu, 1 Dec 2016 14:10:01 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB1EA06g065493 for ; Thu, 1 Dec 2016 14:10:00 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214980] blacklistd and sshd incorrect counting of failed login attempts Date: Thu, 01 Dec 2016 14:10:00 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: bin X-Bugzilla-Version: 11.0-STABLE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: azhegalov@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc attachments.created Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Dec 2016 14:10:01 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214980 Bug ID: 214980 Summary: blacklistd and sshd incorrect counting of failed login attempts Product: Base System Version: 11.0-STABLE Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: bin Assignee: freebsd-bugs@FreeBSD.org Reporter: azhegalov@gmail.com CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org Created attachment 177576 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=3D177576&action= =3Dedit some output from ssh, blacklistd and blacklistctl Every one failed ssh login attempt generates several counts in blacklistd.d= b. After two attempts ssh -b 10.10.0.1 test@192.168.4.75 Password for test@192.168.4.75: Password for test@192.168.4.75: i got: blacklistctl dump -a address/ma:port id nfail last access 10.10.0.1/32:22 OK 6/5 2016/12/01 16:55:48 And /usr/libexec/blacklistd-helper script does not check ipfw rule existence before adding it. It generates excess rules like: ipfw show 02022 27 2244 deny tcp from table(port22) to any dst-port 22 02022 0 0 deny tcp from table(port22) to any dst-port 22 <----- 02022 0 0 deny tcp from table(port22) to any dst-port 22 <----- 02022 0 0 deny tcp from table(port22) to any dst-port 22 <----- 65535 799979 77763414 allow ip from any to any --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Thu Dec 1 15:43:04 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6F278C61C19 for ; Thu, 1 Dec 2016 15:43:04 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 5EF49135C for ; Thu, 1 Dec 2016 15:43:04 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB1Fh325013781 for ; Thu, 1 Dec 2016 15:43:04 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214980] blacklistd and sshd incorrect counting of failed login attempts Date: Thu, 01 Dec 2016 15:43:02 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: bin X-Bugzilla-Version: 11.0-STABLE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: lidl@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: lidl@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: assigned_to cc Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Dec 2016 15:43:04 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214980 Kurt Lidl changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|freebsd-bugs@FreeBSD.org |lidl@FreeBSD.org CC| |lidl@FreeBSD.org --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Thu Dec 1 15:58:35 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 13E5CC601E5 for ; Thu, 1 Dec 2016 15:58:35 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 03BC61A87 for ; Thu, 1 Dec 2016 15:58:35 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB1FwYdv044583 for ; Thu, 1 Dec 2016 15:58:34 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214980] blacklistd and sshd incorrect counting of failed login attempts Date: Thu, 01 Dec 2016 15:58:35 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: bin X-Bugzilla-Version: 11.0-STABLE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: lidl@FreeBSD.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: lidl@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Dec 2016 15:58:35 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214980 --- Comment #1 from Kurt Lidl --- The relevant bit of the current blacklist-helper script: ipfw) # use $ipfw_offset+$port for rule number rule=3D$(($ipfw_offset + $6)) tname=3D"port$6" /sbin/ipfw table $tname create type addr 2>/dev/null /sbin/ipfw -q table $tname add "$addr/$mask" /sbin/ipfw -q add $rule drop $3 from "table("$tname")" to \ any dst-port $6 && echo OK ;; I think that the problem is the '-q' on the last line is forcing "quiet" behaviour, and (I missed this when adapting the code from 'pf'), it no longer errors out on duplicate rules with the same number. There's two different ways to address this that come to mind immediately: 1) Check to see if the rule exists before attempting to add it, and if it already exists, don't add it a second time. 2) Attempt to add the rule without -q, but with stderr redirected to /dev/n= ull. I don't particularly like this, as it means that otherwise legitimate errors cannot be handled. I'll take a stab at implementing #1 in the next few days. (My dev machines run 'pf'.) --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Fri Dec 2 06:50:38 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 665CFC62796 for ; Fri, 2 Dec 2016 06:50:38 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 565791712 for ; Fri, 2 Dec 2016 06:50:38 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB26ocs2070589 for ; Fri, 2 Dec 2016 06:50:38 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 214980] blacklistd and sshd incorrect counting of failed login attempts Date: Fri, 02 Dec 2016 06:50:38 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: bin X-Bugzilla-Version: 11.0-STABLE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: azhegalov@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: lidl@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2016 06:50:38 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214980 --- Comment #2 from azhegalov@gmail.com --- Kurt, can you try to reproduce my problem with incorrect counting of failed logi= n? I checked ftpd and result is ok. So I have problem only with sshd. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Fri Dec 2 12:19:55 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id AF38DC6285D for ; Fri, 2 Dec 2016 12:19:55 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 95B4019BB for ; Fri, 2 Dec 2016 12:19:55 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB2CJtMr036252 for ; Fri, 2 Dec 2016 12:19:55 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 215000] webcamd panic Date: Fri, 02 Dec 2016 12:19:54 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-STABLE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: mexas@bris.ac.uk X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc attachments.created Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2016 12:19:55 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D215000 Bug ID: 215000 Summary: webcamd panic Product: Base System Version: 11.0-STABLE Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: freebsd-bugs@FreeBSD.org Reporter: mexas@bris.ac.uk CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org Created attachment 177600 --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=3D177600&action= =3Dedit core.txt FreeBSD 11.0-RELEASE-p2 #0: Mon Oct 24 06:55:27 UTC 2016 root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64 # cat /boot/loader.conf=20 if_iwm_load=3D"YES" iwm3160fw_load=3D"YES" iwm7260fw_load=3D"YES" iwm7265fw_load=3D"YES" linux_load=3D"YES" cuse4bsd_load=3D"YES" Panics every time when webcamd_enable=3D"YES" is added to rc.conf. If webcamd is started manually, panic does not happen immediately, and for a while the camera works, checked with pvcview. See core.txt.7 attached. Briefly: Fatal trap 12: page fault while in kernel mode cpuid =3D 2; apic id =3D 02 fault virtual address =3D 0x100000019 fault code =3D supervisor read data, page not present instruction pointer =3D 0x20:0xffffffff80b4392e stack pointer =3D 0x28:0xfffffe0234b714f0 frame pointer =3D 0x28:0xfffffe0234b71540 code segment =3D base 0x0, limit 0xfffff, type 0x1b =3D DPL 0, pres 1, long 1, def32 0, gran 1 processor eflags =3D interrupt enabled, resume, IOPL =3D 0 current process =3D 378 (webcamd) trap number =3D 12 panic: page fault cpuid =3D 2 KDB: stack backtrace: #0 0xffffffff80b24077 at kdb_backtrace+0x67 #1 0xffffffff80ad93e2 at vpanic+0x182 #2 0xffffffff80ad9253 at panic+0x43 #3 0xffffffff80fa0d51 at trap_fatal+0x351 #4 0xffffffff80fa0f43 at trap_pfault+0x1e3 #5 0xffffffff80fa04ec at trap+0x26c #6 0xffffffff80f84141 at calltrap+0x8 #7 0xffffffff82581318 at cuse_server_close+0x178 #8 0xffffffff80985a35 at devfs_close+0x5e5 #9 0xffffffff8110ade9 at VOP_CLOSE_APV+0x89 #10 0xffffffff80bbdcce at vn_close+0x13e #11 0xffffffff80bbc77a at vn_closefile+0x4a #12 0xffffffff8098665c at devfs_close_f+0x2c #13 0xffffffff80a735ca at _fdrop+0x1a #14 0xffffffff80a770a4 at closef+0x2d4 #15 0xffffffff80a76b3d at fdescfree_fds+0x7d #16 0xffffffff80a766f2 at fdescfree+0x6a2 #17 0xffffffff80a8855a at exit1+0x73a --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Fri Dec 2 15:04:59 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A8181C63019 for ; Fri, 2 Dec 2016 15:04:59 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7E2371DD1 for ; Fri, 2 Dec 2016 15:04:59 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB2F4x1W091205 for ; Fri, 2 Dec 2016 15:04:59 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 215007] aacraid hotswapping not working with ASR-81605Z v2 RAID Controller Date: Fri, 02 Dec 2016 15:04:59 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-RELEASE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: projet.info@schroeder.lu X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2016 15:04:59 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D215007 Bug ID: 215007 Summary: aacraid hotswapping not working with ASR-81605Z v2 RAID Controller Product: Base System Version: 11.0-RELEASE Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: freebsd-bugs@FreeBSD.org Reporter: projet.info@schroeder.lu CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org I have an ASR-81605Z v2 RAID Controller that I am using in HBA mode. The controller is detected as: aacraid0: port 0xe000-0xe0ff mem 0xdc100000-0xdc1fffff,0xdc280000-0xdc2803ff irq 16 at device 0.0 on pci1 aacraid0: Enable Raw I/O aacraid0: Enable 64-bit array aacraid0: using MSI-X interrupts (32 vectors) aacraid0: New comm. interface type2 enabled aacraid0: ASR81605Z, aacraid driver 3.2.5-1 aacraidp0 on aacraid0 aacraidp1 on aacraid0 aacraidp2 on aacraid0 aacraidp3 on aacraid0 If I insert one disk: da0 at aacraidp1 bus 0 scbus1 target 0 lun 0 da0: Fixed Direct Access SPC-4 SCSI device da0: Serial Number Z1W49QF1 da0: 300.000MB/s transfers da0: Command Queueing enabled da0: 953869MB (1953525168 512 byte sectors) If I insert a second disk: da0 at aacraidp1 bus 0 scbus1 target 0 lun 0 da0: s/n Z1W49QF1 detached (da0:aacraidp1:0:0:0): Periph destroyed da0 at aacraidp1 bus 0 scbus1 target 0 lun 0 da0: Fixed Direct Access SPC-4 SCSI device da0: Serial Number Z1W49QF1 da0: 300.000MB/s transfers da0: Command Queueing enabled da0: 953869MB (1953525168 512 byte sectors) da1 at aacraidp1 bus 0 scbus1 target 1 lun 0 da1: Fixed Direct Access SPC-4 SCSI device da1: Serial Number Z1Z9P2E2 da1: 300.000MB/s transfers da1: Command Queueing enabled da1: 3815447MB (7814037168 512 byte sectors) The disk da0 is destroyed an recreated which makes hotswapping impossible. Under FreeBSD 10.3 hotswapping is working as I should. Thanks in advance for looking into this. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Fri Dec 2 17:03:09 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 7B01DC6382D; Fri, 2 Dec 2016 17:03:09 +0000 (UTC) (envelope-from eric@metricspace.net) Received: from mail.metricspace.net (mail.metricspace.net [IPv6:2001:470:1f11:617::107]) by mx1.freebsd.org (Postfix) with ESMTP id 0D6EB156A; Fri, 2 Dec 2016 17:03:09 +0000 (UTC) (envelope-from eric@metricspace.net) Received: from [IPv6:2001:470:1f11:617:3210:b3ff:fe77:ca3f] (unknown [IPv6:2001:470:1f11:617:3210:b3ff:fe77:ca3f]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: eric) by mail.metricspace.net (Postfix) with ESMTPSA id A37AA1D83; Fri, 2 Dec 2016 17:03:01 +0000 (UTC) To: freebsd-hackers@FreeBSD.org, freebsd-amd64@freebsd.org, "current@freebsd.org" From: Eric McCorkle Subject: CFT EFI Boot Refactoring Message-ID: Date: Fri, 2 Dec 2016 12:02:57 -0500 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="2nIKx7PRAmhO47MXFmT0MDKUV6UMsh1v9" X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2016 17:03:09 -0000 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --2nIKx7PRAmhO47MXFmT0MDKUV6UMsh1v9 Content-Type: multipart/mixed; boundary="7wWD2JXas7wNKFk1Kr7Jd8JHbiuG3wULI"; protected-headers="v1" From: Eric McCorkle To: freebsd-hackers@FreeBSD.org, freebsd-amd64@freebsd.org, "current@freebsd.org" Message-ID: Subject: CFT EFI Boot Refactoring --7wWD2JXas7wNKFk1Kr7Jd8JHbiuG3wULI Content-Type: multipart/mixed; boundary="------------689B5840033FA59B553C984F" This is a multi-part message in MIME format. --------------689B5840033FA59B553C984F Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello everyone, My work to refactor the EFI boot loader has been in review for some time now. This work is a behavior-neutral refactoring which eliminates duplicated code in boot1, provides better integration of boot1 and loader with the EFI API, and moves towards better compliance with the recommendations of the UEFI driver writer's guide. This work also serves as a precursor to more work, such as GELI, hot-plugging, and other things. One of the reviewers was able to trigger a hang on his setup; however, it's not clear whether this is a problem in the refactoring, or whether it's due to a related bug: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214423 Therefore, I would like to issue a CFT for this changeset. We need people using the boot1/loader EFI boot setup to test their setup using boot1 and loader as built with this patch applied. You can also get the source tree directly from my github (https://github.com/emc2/freebsd.git). Use the efize_new branch to get this changeset. Note that I am maintaining the state of this branch in a single change at this point using rebase -i, so there *will* be forced pushes to this branch. Here are some notes on testing the changeset: * To test it, just do a buildworld, then copy loader.efi in place and copy boot1.efi to /efi/BOOT/BOOTX64.EFI on your ESP. If your system boots, then the test was successful (there are no new features in this changeset). * The output of boot1 is slightly different, so you'll be able to tell if you installed it correctly. * I recommend keeping a copy of the basic boot1 around on your ESP, just in case something goes wrong. On my setup, I have a backup at /efi/BOOT/BOOTX64.BAK (with the main program at /efi/BOOT/BOOTX64.EFI, of course) * I have been using this on a machine with two disks, a ZFS pool spanning both disks, and a dummy UFS filesystem for months now, so it can be considered relatively safe. * This has also been tested on basic setups without incident, so priority is on complex or odd setups. * If something goes wrong, you will most likely get a boot-hang. If this happens, please contact me directly with the details, and I'll coordinate on diagnosis. --------------689B5840033FA59B553C984F Content-Type: text/x-patch; name="efize.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="efize.diff" diff --git a/lib/libstand/Makefile b/lib/libstand/Makefile index 0ebcaf1..3b608c5 100644 --- a/lib/libstand/Makefile +++ b/lib/libstand/Makefile @@ -41,7 +41,7 @@ SRCS+=3D ntoh.c .PATH: ${LIBC_SRC}/string SRCS+=3D bcmp.c bcopy.c bzero.c ffs.c fls.c \ memccpy.c memchr.c memcmp.c memcpy.c memmove.c memset.c \ - qdivrem.c strcat.c strchr.c strcmp.c strcpy.c \ + qdivrem.c strcat.c strchr.c strcmp.c strcpy.c stpcpy.c stpncpy.c \ strcspn.c strlcat.c strlcpy.c strlen.c strncat.c strncmp.c strncpy.c \ strpbrk.c strrchr.c strsep.c strspn.c strstr.c strtok.c swab.c .if ${MACHINE_CPUARCH} =3D=3D "arm" diff --git a/lib/libstand/stand.h b/lib/libstand/stand.h index f77a586..066aff0 100644 --- a/lib/libstand/stand.h +++ b/lib/libstand/stand.h @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD$ - * From $NetBSD: stand.h,v 1.22 1997/06/26 19:17:40 drochner Exp $=09 + * From $NetBSD: stand.h,v 1.22 1997/06/26 19:17:40 drochner Exp $ */ =20 /*- @@ -131,7 +131,7 @@ extern struct fs_ops pkgfs_fsops; #define SEEK_CUR 1 /* set file offset to current plus offset */ #define SEEK_END 2 /* set file offset to EOF plus offset */ =20 -/*=20 +/* * Device switch */ struct devsw { @@ -166,8 +166,9 @@ struct devdesc #define DEVT_NONE 0 #define DEVT_DISK 1 #define DEVT_NET 2 -#define DEVT_CD 3 +#define DEVT_CD 3 #define DEVT_ZFS 4 +#define DEVT_EFI 5 int d_unit; void *d_opendata; }; @@ -279,7 +280,7 @@ extern struct dirent *readdirfd(int); =20 extern void srandom(u_long seed); extern u_long random(void); - =20 + /* imports from stdlib, locally modified */ extern long strtol(const char *, char **, int); extern unsigned long strtoul(const char *, char **, int); @@ -368,9 +369,9 @@ extern int null_stat(struct open_file *f, struct stat= *sb); extern int null_readdir(struct open_file *f, struct dirent *d); =20 =20 -/*=20 - * Machine dependent functions and data, must be provided or stubbed by = - * the consumer=20 +/* + * Machine dependent functions and data, must be provided or stubbed by + * the consumer */ extern int getchar(void); extern int ischar(void); diff --git a/sys/boot/efi/Makefile b/sys/boot/efi/Makefile index 66481f8..00490d0 100644 --- a/sys/boot/efi/Makefile +++ b/sys/boot/efi/Makefile @@ -15,7 +15,7 @@ SUBDIR+=3D fdt .if ${MACHINE_CPUARCH} =3D=3D "aarch64" || \ ${MACHINE_CPUARCH} =3D=3D "amd64" || \ ${MACHINE_CPUARCH} =3D=3D "arm" -SUBDIR+=3D libefi loader boot1 +SUBDIR+=3D libefi drivers loader boot1 .endif =20 .endif # ${COMPILER_TYPE} !=3D "gcc" || ${COMPILER_VERSION} >=3D 40500 diff --git a/sys/boot/efi/boot1/Makefile b/sys/boot/efi/boot1/Makefile index 110a857..7480c9c 100644 --- a/sys/boot/efi/boot1/Makefile +++ b/sys/boot/efi/boot1/Makefile @@ -8,34 +8,50 @@ MK_SSP=3D no =20 PROG=3D boot1.sym INTERNALPROG=3D -WARNS?=3D 6 +WARNS?=3D 3 + +# Include bcache code. +HAVE_BCACHE=3D yes =20 .if ${MK_ZFS} !=3D "no" # Disable warnings that are currently incompatible with the zfs boot cod= e -CWARNFLAGS.zfs_module.c +=3D -Wno-array-bounds -CWARNFLAGS.zfs_module.c +=3D -Wno-cast-align -CWARNFLAGS.zfs_module.c +=3D -Wno-cast-qual -CWARNFLAGS.zfs_module.c +=3D -Wno-missing-prototypes -CWARNFLAGS.zfs_module.c +=3D -Wno-sign-compare -CWARNFLAGS.zfs_module.c +=3D -Wno-unused-parameter -CWARNFLAGS.zfs_module.c +=3D -Wno-unused-function +CWARNFLAGS.boot1.c +=3D -Wno-missing-variable-declarations +CWARNFLAGS.zfs.c +=3D -Wno-incompatible-pointer-types-discards-qualifier= s +CWARNFLAGS.zfs.c +=3D -Wno-missing-variable-declarations +CWARNFLAGS.zfs.c +=3D -Wno-array-bounds +CWARNFLAGS.zfs.c +=3D -Wno-cast-align +CWARNFLAGS.zfs.c +=3D -Wno-cast-qual +CWARNFLAGS.zfs.c +=3D -Wno-missing-prototypes +CWARNFLAGS.zfs.c +=3D -Wno-sign-compare +CWARNFLAGS.zfs.c +=3D -Wno-unused-parameter +CWARNFLAGS.zfs.c +=3D -Wno-unused-function CWARNFLAGS.skein.c +=3D -Wno-cast-align CWARNFLAGS.skein.c +=3D -Wno-missing-variable-declarations .endif =20 + # architecture-specific loader code -SRCS=3D boot1.c self_reloc.c start.S ufs_module.c +SRCS=3D boot1.c self_reloc.c start.S .if ${MK_ZFS} !=3D "no" -SRCS+=3D zfs_module.c +.PATH: ${.CURDIR}/../../../crypto/skein SRCS+=3D skein.c skein_block.c # Do not unroll skein loops, reduce code size CFLAGS+=3D -DSKEIN_LOOP=3D111 -.PATH: ${.CURDIR}/../../../crypto/skein +.PATH: ${.CURDIR}/../../zfs +SRCS+=3D zfs.c .endif =20 +# Always add MI sources +.PATH: ${.CURDIR}/../../common +.include "${.CURDIR}/../../common/Makefile.inc" +CFLAGS+=3D -I${.CURDIR}/../../common + +.PATH: ${.CURDIR}/arch/${MACHINE} + CFLAGS+=3D -I. CFLAGS+=3D -I${.CURDIR}/../include CFLAGS+=3D -I${.CURDIR}/../include/${MACHINE} +CFLAGS+=3D -I${.CURDIR}/../drivers/ CFLAGS+=3D -I${.CURDIR}/../../../contrib/dev/acpica/include CFLAGS+=3D -I${.CURDIR}/../../.. CFLAGS+=3D -DEFI_UFS_BOOT @@ -56,6 +72,20 @@ CFLAGS+=3D -DEFI_ZFS_BOOT .PATH: ${.CURDIR}/../../common CFLAGS+=3D -I${.CURDIR}/../../common =20 +# make buildenv doesn't set DESTDIR, this means LIBSTAND +# will be wrong when crossbuilding. +.if exists(${.OBJDIR}/../../../../lib/libstand/libstand.a) +LIBSTAND=3D ${.OBJDIR}/../../../../lib/libstand/libstand.a +.endif + +# Add libefi +.PATH: ${.CURDIR}/../libefi +LIBEFI=3D ${.OBJDIR}/../libefi/libefi.a + +.PATH: ${.CURDIR}/../drivers +LIBEFI_DRIVERS=3D ${.OBJDIR}/../drivers/libefi_drivers.a + + FILES=3D boot1.efi boot1.efifat FILESMODE_boot1.efi=3D ${BINMODE} =20 @@ -75,8 +105,8 @@ LDFLAGS+=3D -Wl,-znocombreloc # __aeabi_* (arm) or __divdi3 (i386). # as well as required string and memory functions for all platforms. # -DPADD+=3D ${LIBSTAND} -LDADD+=3D -lstand +DPADD+=3D ${LIBEFI_DRIVERS} ${LIBEFI} ${LIBSTAND} +LDADD+=3D ${LIBEFI_DRIVERS} ${LIBEFI} ${LIBSTAND} =20 DPADD+=3D ${LDSCRIPT} =20 @@ -102,7 +132,7 @@ boot1.efi: ${PROG} SOURCE_DATE_EPOCH=3D${SOURCE_DATE_EPOCH} \ ${OBJCOPY} -j .peheader -j .text -j .sdata -j .data \ -j .dynamic -j .dynsym -j .rel.dyn \ - -j .rela.dyn -j .reloc -j .eh_frame \ + -j .rela.dyn -j .reloc -j .eh_frame -j set_Xcommand_set \ --output-target=3D${EFI_TARGET} ${.ALLSRC} ${.TARGET} =20 boot1.o: ${.CURDIR}/../../common/ufsread.c @@ -111,7 +141,7 @@ boot1.o: ${.CURDIR}/../../common/ufsread.c # created by generate-fat.sh =20 .include "${.CURDIR}/Makefile.fat" -BOOT1_MAXSIZE?=3D 131072 +BOOT1_MAXSIZE?=3D 524288 =20 boot1.efifat: boot1.efi @set -- `ls -l boot1.efi`; \ diff --git a/sys/boot/efi/boot1/Makefile.fat b/sys/boot/efi/boot1/Makefil= e.fat index c86a7c3..e2cda1c 100644 --- a/sys/boot/efi/boot1/Makefile.fat +++ b/sys/boot/efi/boot1/Makefile.fat @@ -1,4 +1,4 @@ # This file autogenerated by generate-fat.sh - DO NOT EDIT # $FreeBSD$ BOOT1_OFFSET=3D0x2d -BOOT1_MAXSIZE=3D131072 +BOOT1_MAXSIZE=3D524288 diff --git a/sys/boot/efi/boot1/boot1.c b/sys/boot/efi/boot1/boot1.c index 80b1895..9e02bfa 100644 --- a/sys/boot/efi/boot1/boot1.c +++ b/sys/boot/efi/boot1/boot1.c @@ -26,62 +26,118 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include =20 #include +#include +#include #include +#ifdef EFI_ZFS_BOOT +#include +#endif + +#include =20 -#include "boot_module.h" +#include "efi_drivers.h" #include "paths.h" =20 -static const boot_module_t *boot_modules[] =3D -{ -#ifdef EFI_ZFS_BOOT - &zfs_module, -#endif -#ifdef EFI_UFS_BOOT - &ufs_module +#ifdef EFI_DEBUG +#define DPRINTF(fmt, args...) printf(fmt, ##args) +#define DSTALL(d) bs->Stall(d) +#else +#define DPRINTF(fmt, ...) {} +#define DSTALL(d) {} #endif + +struct arch_switch archsw; /* MI/MD interface boundary */ + +static const efi_driver_t *efi_drivers[] =3D { + &fs_driver, + NULL }; =20 -#define NUM_BOOT_MODULES nitems(boot_modules) -/* The initial number of handles used to query EFI for partitions. */ -#define NUM_HANDLES_INIT 24 +extern struct console efi_console; +#if defined(__amd64__) || defined(__i386__) +extern struct console comconsole; +extern struct console nullconsole; +#endif =20 -void putchar(int c); -EFI_STATUS efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE* Xsystab); +struct fs_ops *file_system[] =3D { + &dosfs_fsops, + &ufs_fsops, + &cd9660_fsops, + &nfs_fsops, + &gzipfs_fsops, + &bzipfs_fsops, + NULL +}; =20 -EFI_SYSTEM_TABLE *systab; -EFI_BOOT_SERVICES *bs; -static EFI_HANDLE *image; +struct devsw *devsw[] =3D { + &efipart_dev, +#ifdef EFI_ZFS_BOOT + &zfs_dev, +#endif + NULL +}; =20 -static EFI_GUID BlockIoProtocolGUID =3D BLOCK_IO_PROTOCOL; -static EFI_GUID DevicePathGUID =3D DEVICE_PATH_PROTOCOL; -static EFI_GUID LoadedImageGUID =3D LOADED_IMAGE_PROTOCOL; -static EFI_GUID ConsoleControlGUID =3D EFI_CONSOLE_CONTROL_PROTOCOL_GUID= ; +struct console *consoles[] =3D { + &efi_console, + NULL +}; =20 -/* - * Provide Malloc / Free backed by EFIs AllocatePool / FreePool which en= sures - * memory is correctly aligned avoiding EFI_INVALID_PARAMETER returns fr= om - * EFI methods. +/* Definitions we don't actually need for boot, but we need to define + * to make the linker happy. */ -void * -Malloc(size_t len, const char *file __unused, int line __unused) +struct file_format *file_formats[] =3D { NULL }; + +struct netif_driver *netif_drivers[] =3D { NULL }; + +static int +efi_autoload(void) { - void *out; + printf("******** Boot block should not call autoload\n"); + return (-1); +} =20 - if (bs->AllocatePool(EfiLoaderData, len, &out) =3D=3D EFI_SUCCESS) - return (out); +static int efi_getdev(void **vdev __unused, const char *devspec __unused= , + const char **path __unused) +{ + printf("******** Boot block should not call getdev\n"); + return (-1); +} =20 - return (NULL); +static ssize_t +efi_copyin(const void *src __unused, vm_offset_t dest __unused, + const size_t len __unused) +{ + printf("******** Boot block should not call copyin\n"); + return (-1); } =20 -void -Free(void *buf, const char *file __unused, int line __unused) +static ssize_t +efi_copyout(vm_offset_t src __unused, void *dest __unused, + const size_t len __unused) { - if (buf !=3D NULL) - (void)bs->FreePool(buf); + printf("******** Boot block should not call copyout\n"); + return (-1); +} + +static ssize_t +efi_readin(int fd __unused, vm_offset_t dest __unused, + const size_t len __unused) +{ + printf("******** Boot block should not call readin\n"); + return (-1); } =20 +/* The initial number of handles used to query EFI for partitions. */ +#define NUM_HANDLES_INIT 24 + +static EFI_GUID DevicePathGUID =3D DEVICE_PATH_PROTOCOL; +static EFI_GUID LoadedImageGUID =3D LOADED_IMAGE_PROTOCOL; +static EFI_GUID SimpleFileSystemProtocolGUID =3D SIMPLE_FILE_SYSTEM_PROT= OCOL; +static EFI_GUID FileInfoGUID =3D EFI_FILE_INFO_ID;; + /* * nodes_match returns TRUE if the imgpath isn't NULL and the nodes matc= h, * FALSE otherwise. @@ -142,6 +198,7 @@ devpath_last(EFI_DEVICE_PATH *devpath) return (devpath); } =20 +#ifdef EFI_DEBUG /* * devpath_node_str is a basic output method for a devpath node which * only understands a subset of the available sub types. @@ -273,7 +330,7 @@ devpath_node_str(char *buf, size_t size, EFI_DEVICE_P= ATH *devpath) * devpath_strlcat appends a text description of devpath to buf but not = more * than size - 1 characters followed by NUL-terminator. */ -int +static int devpath_strlcat(char *buf, size_t size, EFI_DEVICE_PATH *devpath) { size_t len, used; @@ -304,48 +361,207 @@ devpath_strlcat(char *buf, size_t size, EFI_DEVICE= _PATH *devpath) * devpath_str is convenience method which returns the text description = of * devpath using a static buffer, so it isn't thread safe! */ -char * +static char * devpath_str(EFI_DEVICE_PATH *devpath) { static char buf[256]; =20 devpath_strlcat(buf, sizeof(buf), devpath); =20 - return buf; + return (buf); +} +#endif + +static EFI_STATUS +efi_load(EFI_HANDLE dev, const char *filepath, void **bufp, size_t *bufs= ize) +{ + UINTN infosize =3D sizeof(EFI_FILE_INFO) + + ((strlen(filepath) + 1) * sizeof(CHAR16)); + EFI_FILE_INFO *finfo; + EFI_STATUS status; + EFI_FILE_IO_INTERFACE *iface; + EFI_FILE_HANDLE root; + EFI_FILE_HANDLE target; + CHAR16 path16[strlen(filepath) + 1]; + void *buf; + + finfo =3D malloc(infosize); + + if (finfo =3D=3D NULL) { + return (EFI_OUT_OF_RESOURCES); + } + + status =3D BS->OpenProtocol(dev, &SimpleFileSystemProtocolGUID, + (void **)&iface, IH, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); + + if (status !=3D EFI_SUCCESS) { + free(finfo); + printf("Open protocol failed! %ld\n", EFI_ERROR_CODE(sta= tus)); + return (status); + } + + status =3D iface->OpenVolume(iface, &root); + + if (status !=3D EFI_SUCCESS) { + BS->CloseProtocol(dev, &SimpleFileSystemProtocolGUID, IH= , NULL); + free(finfo); + printf("Open volume failed! %ld\n", EFI_ERROR_CODE(statu= s)); + return (status); + } + + strcpy_to_16(path16, filepath); + status =3D root->Open(root, &target, path16, EFI_FILE_MODE_READ,= 0); + + if (status !=3D EFI_SUCCESS) { + BS->CloseProtocol(dev, &SimpleFileSystemProtocolGUID, IH= , NULL); + free(finfo); + + return (status); + } + + *bufsize =3D infosize; + status =3D target->GetInfo(target, &FileInfoGUID, bufsize, finfo= ); + + if (status !=3D EFI_SUCCESS) { + BS->CloseProtocol(dev, &SimpleFileSystemProtocolGUID, IH= , NULL); + free(finfo); + printf("Get info failed! %ld\n", EFI_ERROR_CODE(status))= ; + return (status); + } + + *bufsize =3D finfo->FileSize; + + if ((buf =3D malloc(finfo->FileSize)) =3D=3D NULL) { + BS->CloseProtocol(dev, &SimpleFileSystemProtocolGUID, IH= , NULL); + free(finfo); + printf("Failed to allocate load buffer %zd for '%s' " + "(%lu)\n", finfo->FileSize, filepath, EFI_ERROR_C= ODE(status)); + return (EFI_OUT_OF_RESOURCES); + } + + *bufp =3D buf; + status =3D target->Read(target, bufsize, buf); + BS->CloseProtocol(dev, &SimpleFileSystemProtocolGUID, IH, NULL);= + free(finfo); + + if (status !=3D EFI_SUCCESS) { + printf("Read failed! %ld\n", EFI_ERROR_CODE(status)); + return (status); + } + + return (EFI_SUCCESS); } =20 /* * load_loader attempts to load the loader image data. * - * It tries each module and its respective devices, identified by mod->p= robe, - * in order until a successful load occurs at which point it returns EFI= _SUCCESS - * and EFI_NOT_FOUND otherwise. + * This tries all handles which support the EFI_SIMPLE_FILE_SYSTEM inter= face. + * It is expected that the drivers will have installed this interface on= every + * handle representing a device containing a supported file system. + * + * Note: In the future, this may be altered to use the EFI_LOAD_FILE int= erface, + * which should work transparently with network booting. * * Only devices which have preferred matching the preferred parameter ar= e tried. */ static EFI_STATUS -load_loader(const boot_module_t **modp, dev_info_t **devinfop, void **bu= fp, - size_t *bufsize, BOOLEAN preferred) +load_loader(EFI_HANDLE *handlep, void **bufp, size_t *bufsize) { - UINTN i; - dev_info_t *dev; - const boot_module_t *mod; - - for (i =3D 0; i < NUM_BOOT_MODULES; i++) { - mod =3D boot_modules[i]; - for (dev =3D mod->devices(); dev !=3D NULL; dev =3D dev->next) { - if (dev->preferred !=3D preferred) - continue; - - if (mod->load(PATH_LOADER_EFI, dev, bufp, bufsize) =3D=3D - EFI_SUCCESS) { - *devinfop =3D dev; - *modp =3D mod; - return (EFI_SUCCESS); - } + EFI_DEVICE_PATH *imgpath; + EFI_DEVICE_PATH *devpath; + EFI_LOADED_IMAGE *boot_image; + EFI_HANDLE *boot_handle; + EFI_HANDLE *preferred; + EFI_HANDLE *handles; + EFI_STATUS status; + UINTN i, hsize, nhandles, npreferred; + + if ((status =3D BS->OpenProtocol(IH, &LoadedImageGUID, + (VOID**)&boot_image, IH, NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL)) !=3D EFI_SUCCESS) { + panic("Failed to query LoadedImage (%lu)\n", + EFI_ERROR_CODE(status)); + } + + boot_handle =3D boot_image->DeviceHandle; + + if ((status =3D BS->OpenProtocol(boot_handle, &DevicePathGUID, + (void **)&imgpath, IH, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL)= )) { + panic("Failed to get image DevicePath (%lu)\n", + EFI_ERROR_CODE(status)); + } + DPRINTF("boot1 imagepath: %s\n", devpath_str(imgpath)); + + /* Allocate space for the handles */ + hsize =3D (UINTN)NUM_HANDLES_INIT * sizeof(EFI_HANDLE); + if ((handles =3D malloc(hsize)) =3D=3D NULL) + panic("Failed to allocate %d handles (%lu)", NUM_HANDLES_INIT, + EFI_ERROR_CODE(status)); + + status =3D BS->LocateHandle(ByProtocol, &SimpleFileSystemProtocolGUID, = NULL, + &hsize, handles); + + switch (status) { + case EFI_SUCCESS: + break; + case EFI_BUFFER_TOO_SMALL: + (void)BS->FreePool(handles); + if ((handles =3D malloc(hsize)) =3D=3D NULL) { + panic("Failed to allocate %zu handles (%lu)", hsize / + sizeof(*handles), EFI_ERROR_CODE(status)); } + status =3D BS->LocateHandle(ByProtocol, + &SimpleFileSystemProtocolGUID, NULL, &hsize, handles= ); + if (status !=3D EFI_SUCCESS) + panic("Failed to get device handles (%lu)\n", + EFI_ERROR_CODE(status)); + break; + default: + panic("Failed to get device handles (%lu)", + EFI_ERROR_CODE(status)); } =20 + if ((preferred =3D malloc(hsize)) =3D=3D NULL) + panic("Failed to allocate %d handles (%lu)", NUM_HANDLES_INIT, + EFI_ERROR_CODE(status)); + + npreferred =3D 0; + nhandles =3D hsize / sizeof(*handles); + + /* Figure out which handles are preferred */ + for (i =3D 0; i < nhandles; i++) { + if (BS->OpenProtocol(handles[i], &DevicePathGUID, + (void **)&devpath, IH, NULL, EFI_OPEN_PROTOCOL_GET_P= ROTOCOL) =3D=3D + EFI_SUCCESS) { + if (device_paths_match(imgpath, devpath)) { + preferred[npreferred] =3D handles[i]; + npreferred++; + } + BS->CloseProtocol(handles[i], &DevicePathGUID, I= H, NULL); + } + } + + BS->CloseProtocol(boot_handle, &DevicePathGUID, IH, NULL); + + /* Try the preferred handles first, then all the handles */ + for (i =3D 0; i < npreferred; i++) { + if (efi_load(preferred[i], PATH_LOADER_EFI, bufp, bufsiz= e) =3D=3D + EFI_SUCCESS) { + *handlep =3D preferred[i]; + return (EFI_SUCCESS); + } + } + + for (i =3D 0; i < nhandles; i++) { + if (efi_load(handles[i], PATH_LOADER_EFI, bufp, bufsize)= =3D=3D + EFI_SUCCESS) { + *handlep =3D handles[i]; + return (EFI_SUCCESS); + } + } + + printf("Failed to load %s from any device!\n", PATH_LOADER_EFI);= + return (EFI_NOT_FOUND); } =20 @@ -359,20 +575,27 @@ try_boot(void) size_t bufsize, loadersize, cmdsize; void *buf, *loaderbuf; char *cmd; - dev_info_t *dev; - const boot_module_t *mod; + EFI_HANDLE fshandle; EFI_HANDLE loaderhandle; EFI_LOADED_IMAGE *loaded_image; EFI_STATUS status; + EFI_DEVICE_PATH *fspath; + + status =3D load_loader(&fshandle, &loaderbuf, &loadersize); =20 - status =3D load_loader(&mod, &dev, &loaderbuf, &loadersize, TRUE); - if (status !=3D EFI_SUCCESS) { - status =3D load_loader(&mod, &dev, &loaderbuf, &loadersize, - FALSE); + if (status !=3D EFI_SUCCESS) { + return (status); + } + + fspath =3D NULL; + if (status =3D=3D EFI_SUCCESS) { + status =3D BS->OpenProtocol(fshandle, &DevicePathGUID, + (void **)&fspath, IH, NULL, EFI_OPEN_PROTOCOL_GET_PR= OTOCOL); if (status !=3D EFI_SUCCESS) { - printf("Failed to load '%s'\n", PATH_LOADER_EFI); - return (status); - } + DPRINTF("Failed to get image DevicePath (%lu)\n", + EFI_ERROR_CODE(status)); + } + DPRINTF("filesystem device path: %s\n", devpath_str(fspath)); } =20 /* @@ -387,9 +610,9 @@ try_boot(void) */ cmd =3D NULL; cmdsize =3D 0; - status =3D mod->load(PATH_DOTCONFIG, dev, &buf, &bufsize); + status =3D efi_load(fshandle, PATH_DOTCONFIG, &buf, &bufsize); if (status =3D=3D EFI_NOT_FOUND) - status =3D mod->load(PATH_CONFIG, dev, &buf, &bufsize); + status =3D efi_load(fshandle, PATH_CONFIG, &buf, &bufsize); if (status =3D=3D EFI_SUCCESS) { cmdsize =3D bufsize + 1; cmd =3D malloc(cmdsize); @@ -401,24 +624,25 @@ try_boot(void) buf =3D NULL; } =20 - if ((status =3D bs->LoadImage(TRUE, image, devpath_last(dev->devpath), + if ((status =3D BS->LoadImage(TRUE, IH, devpath_last(fspath), loaderbuf, loadersize, &loaderhandle)) !=3D EFI_SUCCESS) { - printf("Failed to load image provided by %s, size: %zu, (%lu)\n", - mod->name, loadersize, EFI_ERROR_CODE(status)); + printf("Failed to load image, size: %zu, (%lu)\n", + loadersize, EFI_ERROR_CODE(status)); goto errout; } =20 - if ((status =3D bs->HandleProtocol(loaderhandle, &LoadedImageGUID, - (VOID**)&loaded_image)) !=3D EFI_SUCCESS) { - printf("Failed to query LoadedImage provided by %s (%lu)\n", - mod->name, EFI_ERROR_CODE(status)); + if ((status =3D BS->OpenProtocol(loaderhandle, &LoadedImageGUID, + (VOID**)&loaded_image, IH, NULL, + EFI_OPEN_PROTOCOL_GET_PROTOCOL)) !=3D EFI_SUCCESS) { + printf("Failed to query LoadedImage (%lu)\n", + EFI_ERROR_CODE(status)); goto errout; } =20 if (cmd !=3D NULL) printf(" command args: %s\n", cmd); =20 - loaded_image->DeviceHandle =3D dev->devhandle; + loaded_image->DeviceHandle =3D fshandle; loaded_image->LoadOptionsSize =3D cmdsize; loaded_image->LoadOptions =3D cmd; =20 @@ -434,10 +658,10 @@ try_boot(void) DSTALL(1000000); DPRINTF(".\n"); =20 - if ((status =3D bs->StartImage(loaderhandle, NULL, NULL)) !=3D + if ((status =3D BS->StartImage(loaderhandle, NULL, NULL)) !=3D EFI_SUCCESS) { - printf("Failed to start image provided by %s (%lu)\n", - mod->name, EFI_ERROR_CODE(status)); + printf("Failed to start image (%lu)\n", + EFI_ERROR_CODE(status)); loaded_image->LoadOptionsSize =3D 0; loaded_image->LoadOptions =3D NULL; } @@ -453,134 +677,19 @@ errout: return (status); } =20 -/* - * probe_handle determines if the passed handle represents a logical par= tition - * if it does it uses each module in order to probe it and if successful= it - * returns EFI_SUCCESS. - */ -static EFI_STATUS -probe_handle(EFI_HANDLE h, EFI_DEVICE_PATH *imgpath, BOOLEAN *preferred)= -{ - dev_info_t *devinfo; - EFI_BLOCK_IO *blkio; - EFI_DEVICE_PATH *devpath; - EFI_STATUS status; - UINTN i; - - /* Figure out if we're dealing with an actual partition. */ - status =3D bs->HandleProtocol(h, &DevicePathGUID, (void **)&devpath); - if (status =3D=3D EFI_UNSUPPORTED) - return (status); - - if (status !=3D EFI_SUCCESS) { - DPRINTF("\nFailed to query DevicePath (%lu)\n", - EFI_ERROR_CODE(status)); - return (status); - } - - DPRINTF("probing: %s\n", devpath_str(devpath)); - - status =3D bs->HandleProtocol(h, &BlockIoProtocolGUID, (void **)&blkio)= ; - if (status =3D=3D EFI_UNSUPPORTED) - return (status); - - if (status !=3D EFI_SUCCESS) { - DPRINTF("\nFailed to query BlockIoProtocol (%lu)\n", - EFI_ERROR_CODE(status)); - return (status); - } - - if (!blkio->Media->LogicalPartition) - return (EFI_UNSUPPORTED); - - *preferred =3D device_paths_match(imgpath, devpath); - - /* Run through each module, see if it can load this partition */ - for (i =3D 0; i < NUM_BOOT_MODULES; i++) { - if ((status =3D bs->AllocatePool(EfiLoaderData, - sizeof(*devinfo), (void **)&devinfo)) !=3D - EFI_SUCCESS) { - DPRINTF("\nFailed to allocate devinfo (%lu)\n", - EFI_ERROR_CODE(status)); - continue; - } - devinfo->dev =3D blkio; - devinfo->devpath =3D devpath; - devinfo->devhandle =3D h; - devinfo->devdata =3D NULL; - devinfo->preferred =3D *preferred; - devinfo->next =3D NULL; - - status =3D boot_modules[i]->probe(devinfo); - if (status =3D=3D EFI_SUCCESS) - return (EFI_SUCCESS); - (void)bs->FreePool(devinfo); - } - - return (EFI_UNSUPPORTED); -} - -/* - * probe_handle_status calls probe_handle and outputs the returned statu= s - * of the call. - */ -static void -probe_handle_status(EFI_HANDLE h, EFI_DEVICE_PATH *imgpath) -{ - EFI_STATUS status; - BOOLEAN preferred; - - status =3D probe_handle(h, imgpath, &preferred); -=09 - DPRINTF("probe: "); - switch (status) { - case EFI_UNSUPPORTED: - printf("."); - DPRINTF(" not supported\n"); - break; - case EFI_SUCCESS: - if (preferred) { - printf("%c", '*'); - DPRINTF(" supported (preferred)\n"); - } else { - printf("%c", '+'); - DPRINTF(" supported\n"); - } - break; - default: - printf("x"); - DPRINTF(" error (%lu)\n", EFI_ERROR_CODE(status)); - break; - } - DSTALL(500000); -} - EFI_STATUS -efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE *Xsystab) +main(int argc __unused, CHAR16 *argv[] __unused) { - EFI_HANDLE *handles; - EFI_LOADED_IMAGE *img; - EFI_DEVICE_PATH *imgpath; EFI_STATUS status; - EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl =3D NULL; SIMPLE_TEXT_OUTPUT_INTERFACE *conout =3D NULL; - UINTN i, max_dim, best_mode, cols, rows, hsize, nhandles; - - /* Basic initialization*/ - systab =3D Xsystab; - image =3D Ximage; - bs =3D Xsystab->BootServices; - - /* Set up the console, so printf works. */ - status =3D bs->LocateProtocol(&ConsoleControlGUID, NULL, - (VOID **)&ConsoleControl); - if (status =3D=3D EFI_SUCCESS) - (void)ConsoleControl->SetMode(ConsoleControl, - EfiConsoleControlScreenText); + UINTN i, max_dim, best_mode, cols, rows; + + cons_probe(); + /* * Reset the console and find the best text mode. */ - conout =3D systab->ConOut; + conout =3D ST->ConOut; conout->Reset(conout, TRUE); max_dim =3D best_mode =3D 0; for (i =3D 0; ; i++) { @@ -597,123 +706,31 @@ efi_main(EFI_HANDLE Ximage, EFI_SYSTEM_TABLE *Xsys= tab) conout->EnableCursor(conout, TRUE); conout->ClearScreen(conout); =20 - printf("\n>> FreeBSD EFI boot block\n"); - printf(" Loader path: %s\n\n", PATH_LOADER_EFI); - printf(" Initializing modules:"); - for (i =3D 0; i < NUM_BOOT_MODULES; i++) { - printf(" %s", boot_modules[i]->name); - if (boot_modules[i]->init !=3D NULL) - boot_modules[i]->init(); - } - putchar('\n'); - - /* Get all the device handles */ - hsize =3D (UINTN)NUM_HANDLES_INIT * sizeof(EFI_HANDLE); - if ((status =3D bs->AllocatePool(EfiLoaderData, hsize, (void **)&handle= s)) - !=3D EFI_SUCCESS) - panic("Failed to allocate %d handles (%lu)", NUM_HANDLES_INIT, - EFI_ERROR_CODE(status)); - - status =3D bs->LocateHandle(ByProtocol, &BlockIoProtocolGUID, NULL, - &hsize, handles); - switch (status) { - case EFI_SUCCESS: - break; - case EFI_BUFFER_TOO_SMALL: - (void)bs->FreePool(handles); - if ((status =3D bs->AllocatePool(EfiLoaderData, hsize, - (void **)&handles)) !=3D EFI_SUCCESS) { - panic("Failed to allocate %zu handles (%lu)", hsize / - sizeof(*handles), EFI_ERROR_CODE(status)); - } - status =3D bs->LocateHandle(ByProtocol, &BlockIoProtocolGUID, - NULL, &hsize, handles); - if (status !=3D EFI_SUCCESS) - panic("Failed to get device handles (%lu)\n", - EFI_ERROR_CODE(status)); - break; - default: - panic("Failed to get device handles (%lu)", - EFI_ERROR_CODE(status)); - } + /* + * Initialise the block cache. Set the upper limit. + */ + bcache_init(32768, 512); =20 - /* Scan all partitions, probing with all modules. */ - nhandles =3D hsize / sizeof(*handles); - printf(" Probing %zu block devices...", nhandles); - DPRINTF("\n"); + printf("\n>> FreeBSD EFI boot block\n"); =20 - /* Determine the devpath of our image so we can prefer it. */ - status =3D bs->HandleProtocol(image, &LoadedImageGUID, (VOID**)&img); - imgpath =3D NULL; - if (status =3D=3D EFI_SUCCESS) { - status =3D bs->HandleProtocol(img->DeviceHandle, &DevicePathGUID, - (void **)&imgpath); - if (status !=3D EFI_SUCCESS) - DPRINTF("Failed to get image DevicePath (%lu)\n", - EFI_ERROR_CODE(status)); - DPRINTF("boot1 imagepath: %s\n", devpath_str(imgpath)); - } + archsw.arch_autoload =3D efi_autoload; + archsw.arch_getdev =3D efi_getdev; + archsw.arch_copyin =3D efi_copyin; + archsw.arch_copyout =3D efi_copyout; + archsw.arch_readin =3D efi_readin; =20 - for (i =3D 0; i < nhandles; i++) - probe_handle_status(handles[i], imgpath); - printf(" done\n"); + printf(" Loader path: %s\n\n", PATH_LOADER_EFI); + printf(" Initializing modules:"); =20 - /* Status summary. */ - for (i =3D 0; i < NUM_BOOT_MODULES; i++) { - printf(" "); - boot_modules[i]->status(); + for (i =3D 0; efi_drivers[i] !=3D NULL; i++) { + printf(" %s", efi_drivers[i]->name); + if (efi_drivers[i]->init !=3D NULL) + efi_drivers[i]->init(); } + putchar('\n'); =20 try_boot(); =20 /* If we get here, we're out of luck... */ panic("No bootable partitions found!"); } - -/* - * add_device adds a device to the passed devinfo list. - */ -void -add_device(dev_info_t **devinfop, dev_info_t *devinfo) -{ - dev_info_t *dev; - - if (*devinfop =3D=3D NULL) { - *devinfop =3D devinfo; - return; - } - - for (dev =3D *devinfop; dev->next !=3D NULL; dev =3D dev->next) - ; - - dev->next =3D devinfo; -} - -void -panic(const char *fmt, ...) -{ - va_list ap; - - printf("panic: "); - va_start(ap, fmt); - vprintf(fmt, ap); - va_end(ap); - printf("\n"); - - while (1) {} -} - -void -putchar(int c) -{ - CHAR16 buf[2]; - - if (c =3D=3D '\n') { - buf[0] =3D '\r'; - buf[1] =3D 0; - systab->ConOut->OutputString(systab->ConOut, buf); - } - buf[0] =3D c; - buf[1] =3D 0; - systab->ConOut->OutputString(systab->ConOut, buf); -} diff --git a/sys/boot/efi/boot1/boot_module.h b/sys/boot/efi/boot1/boot_m= odule.h deleted file mode 100644 index 296d5a6..0000000 --- a/sys/boot/efi/boot1/boot_module.h +++ /dev/null @@ -1,117 +0,0 @@ -/*- - * Copyright (c) 2015 Eric McCorkle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in th= e - * documentation and/or other materials provided with the distributio= n. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN= D - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE= - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB= LE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE= NTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO= DS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)= - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S= TRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY= WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O= F - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#ifndef _BOOT_MODULE_H_ -#define _BOOT_MODULE_H_ - -#include - -#include -#include -#include - -#ifdef EFI_DEBUG -#define DPRINTF(fmt, args...) printf(fmt, ##args) -#define DSTALL(d) bs->Stall(d) -#else -#define DPRINTF(fmt, ...) {} -#define DSTALL(d) {} -#endif - -/* EFI device info */ -typedef struct dev_info -{ - EFI_BLOCK_IO *dev; - EFI_DEVICE_PATH *devpath; - EFI_HANDLE *devhandle; - void *devdata; - BOOLEAN preferred; - struct dev_info *next; -} dev_info_t; - -/* - * A boot loader module. - * - * This is a standard interface for filesystem modules in the EFI system= =2E - */ -typedef struct boot_module_t -{ - const char *name; - - /* init is the optional initialiser for the module. */ - void (*init)(); - - /* - * probe checks to see if the module can handle dev. - * - * Return codes: - * EFI_SUCCESS =3D The module can handle the device. - * EFI_NOT_FOUND =3D The module can not handle the device. - * Other =3D The module encountered an error. - */ - EFI_STATUS (*probe)(dev_info_t* dev); - - /* - * load should select the best out of a set of devices that probe - * indicated were loadable and load the specified file. - * - * Return codes: - * EFI_SUCCESS =3D The module can handle the device. - * EFI_NOT_FOUND =3D The module can not handle the device. - * Other =3D The module encountered an error. - */ - EFI_STATUS (*load)(const char *filepath, dev_info_t *devinfo, - void **buf, size_t *bufsize); - - /* status outputs information about the probed devices. */ - void (*status)(); - - /* valid devices as found by probe. */ - dev_info_t *(*devices)(); -} boot_module_t; - -/* Standard boot modules. */ -#ifdef EFI_UFS_BOOT -extern const boot_module_t ufs_module; -#endif -#ifdef EFI_ZFS_BOOT -extern const boot_module_t zfs_module; -#endif - -/* Functions available to modules. */ -extern void add_device(dev_info_t **devinfop, dev_info_t *devinfo); -extern void panic(const char *fmt, ...) __dead2; -extern int printf(const char *fmt, ...); -extern int vsnprintf(char *str, size_t sz, const char *fmt, va_list ap);= - -extern EFI_SYSTEM_TABLE *systab; -extern EFI_BOOT_SERVICES *bs; - -extern int devpath_strlcat(char *buf, size_t size, EFI_DEVICE_PATH *devp= ath); -extern char *devpath_str(EFI_DEVICE_PATH *devpath); -#endif diff --git a/sys/boot/efi/boot1/fat-amd64.tmpl.bz2.uu b/sys/boot/efi/boot= 1/fat-amd64.tmpl.bz2.uu index a3ec32d..c7308a4 100644 --- a/sys/boot/efi/boot1/fat-amd64.tmpl.bz2.uu +++ b/sys/boot/efi/boot1/fat-amd64.tmpl.bz2.uu @@ -2,25 +2,50 @@ FAT template boot filesystem created by generate-fat.sh= DO NOT EDIT $FreeBSD$ begin 644 fat-amd64.tmpl.bz2 -M0EIH.3%!62936?$)3$,`&U9_____Z^KJZ_^N_^O^Z_^[ON_NK^JJ^KZNKNNJ -MZNKNZOJ^P`+\#$!0$#1D-,@#)DT#1B&AIDQ,AD:#1HTR`-#)D80Q!D:,)D`` -M#1@F30```&@`$JJ9!_HU4:",3!,F0&C(83`F30T`T!B&!,F`(P3`"#0,@`/2 -M::`#0!D`,C1`T9#3(`R9-`T8AH:9,3(9&@T:-,@#0R9&$,09&C"9```T8)DT -M```!H``JBD@_2B:FF9)IHQ/1#:@-`:`R#(T`&@:-`!H8FAH:::'J::-`9&1Z -MFF!'HAB8U/1/*8---3EV+*PZ5:L^\19>>T2K3OA>TUS8M>VJ_;9P7"8;&7&8R51N>F -M1E%A#6+F9*H@$(9J%%%%%%%$>!!!!!!!!! -M!!!!!!!#76C@OM;-N%^W[!<=3DH[<-1 -MRR"SVLL>LG*Z1G+K%N;);>IIYL-7L*D[Q-SH;5D;RU_+ZK.+TEMX%K(QQ813V:GS1ZT;"R\!H$K/Z:=3D%386M -MPJL..`X;BN0SS2,I;U*I;;.]O5ZMI9CMV -MY(;8*\CXX-SPW(^Z5WIWPW0V@?7DLGZ@QJQHC6!J-\U[>@T$2F)3"7UM2V+: -M+YMFW;MO6^<-@L)R7+XU0JB(L,KI:F[OD%ZUC=3D-0WB\7C? -M."P'%83CL1BM$RLHD):&7,DOSLY1=3D2Y,H_EOG`<%YS0,!Q&$XS]')8CXEXP_ -MFX2-7*,#%P;!Q]V)E#BO"83#?\V3C..Y#E,1?L5S&,NC%DQI>;+`DS>NQL5? -?+6IF915V$0"$)@`M+"Q)@(_9+!?^+N2*<*$AXA*8A@`` +M0EIH.3%!629363$"%&\`'YA______________^O^Z_^[_N[^J^NK^KZOKONJ +MZNK^ZN[^X`C_%-``HH`%41"1(*)`BJ!H:```?M5```#0````````-`:-#0`` +M`````````````555$_2@!O_U2J/_TJA_JJ>4!H````T``````&@`````:``` +M!H``>H`&@!HR`0,F3(!DR``TP0T`:``#0Q#30#(``-`-`R&@&@!D!H&FC$&C +M0``&@`#0@9,F0#)D`!I@AH`T``&AB&F@&0``:`:!D-`-`#(#0--&(-&@``-` +M`&A`R9,@&3(`#3!#0!H``-#$--`,@``T`T#(:`:`&0&@::,0:-```:``-`55 +M(_23]"13-3TIZJ?[*D:$_]5-3TVBFU-J;1&3)A'H0\F2/4Q&GJ!ZF`3U#U'E +M/031B8U#$9'J!ZAM(\*#R#0,4S4_5,U/0VJ>$\B*9O7.9HQ&K@F!RV88885S +M,&#####&POFPP!@?ILGJGM'9/CNX=3D\= \1]7S2JJJJJJJ7IE7 +M7(9UEEEEEDI2E*4I2LJLAG6666662E*4I2E*RJR&=3D999999?K++++++++)9* +MLD,ZRRRRRS*JJJJJJJJ5U5W@=3D3BHR9,F3)DY555555554M*K2AG6666662E* +M4I2E*RJR&=3D999999*RJR&=3D999999M]ST6EDR8Z75L[4S8=3DBSC1D=3DPZ]J#RWA +M*>XSS+OI9+,OP:!G,`[#(RG-'!93*8`$4]KF#`!H][S_R?Y_E]3FG`P`>;;6UBVMK0VMK:VMK:VMK:VMK +M:VMK:VMK:Z^ZZZZZZZZZZZZZZZZZZZZZZZ[+MSB;FU1#B/J/_7C^C55555552ZG]E9V3I_)YDL6IJ:FIJ:DI2E*4I2TJM+G^S^# +MFT,6EI:6EI:4I2E*4I2TJM+^;^[%1DR9,F3)*4I2E*4LE62&=3D999999*4I2E +M*4K*K(9UEEEEEDI2E*4I2LJL^[1"ZZZZZZ4I2E*4I7570SK+++++/R*KK+H9 +MUUUUUUUE55G3M,9UIK<&G/7:>^5EGWHT*,&#!$1$1$<#@<#@=3D(_=3D',TM+2TO\J***,:***(0A"$(0O1C,9C,3$Q,3,,'G/3> +MP]YDOJ9]^;^6Z(B(B(B(B(B(Y=3DWCP6;9%EEEEEEEEEEEEEEEFEQ$1$:0B(B( +MB(LLLXG%111WF+U'JX['EU555=3DUW6+%BQ<_U&K0T-#0M1111^K^EBQ8L7*Z' +MJNBLU,.M?M.S=3DNIP]AGYSL.W_;U+ZLF3)DA"$.D]GIK*4I0A"'*HHH +MHA"$(0A#_-W+NW>N^>`^L^RYKQ7CORG#PN%PN%PL&#!@P8,&#!@P>,\UY3/* +M4I2E*4I2E*4I2(B(B(B(B(B*4IL=3D_XF+%BQ0A"$(0A"$(0A"'F>UQ8L6+O>X +M=3DL_D=3DVA"$(0A#]BBBBB$(0A"$(0A#F^%\(9\,,-#0T-"$(0^$^>Z5TKZSPV? +M?D_1H&B?XB(B(B(B(B(CC6=3D?"R5*4I2E*4I2E*;/99@P8,&#!@X7"X7"X7"X +M7`X'$XG$XD(0A"$(0A"'6T444>51111"$(?]._?2?30A"'K****/-!1111"$ +M(;J***/O44440A"$(0A]=3DX3JWV'-?;>,[I]YSGQ'H'B]MK:VMK:VMK:VMK:V +MMK:VMK>"\-]ET[8V-C8V-C8V-C8V-C8V*4B(B(B(B(B(BE*4Q,3$A\&BBBB$ +M(0A"$/^_(_3T-#0T(0A#[G?O$>Q0\EY;@<#@1$1$1$1$1F6A=3D*T2E*4I2E*4I2E*4B(B(B(B +M(B(BFQL;'@T4440A"'E4444>BHHHH\.BBBB$(0ZCKO*YSG.+%B +MQ=3D;11113L;YQY+#P?@66666KA@888#-AA@`>5H:&AH:****(?:4440>6S/_G ++WQ=3DR13A0D#$"%&\` ` end diff --git a/sys/boot/efi/boot1/fat-arm.tmpl.bz2.uu b/sys/boot/efi/boot1/= fat-arm.tmpl.bz2.uu index 23e063e..ee2ee99 100644 --- a/sys/boot/efi/boot1/fat-arm.tmpl.bz2.uu +++ b/sys/boot/efi/boot1/fat-arm.tmpl.bz2.uu @@ -2,25 +2,50 @@ FAT template boot filesystem created by generate-fat.sh= DO NOT EDIT $FreeBSD$ begin 644 fat-arm.tmpl.bz2 -M0EIH.3%!62936>#67)H`&U9_____Z^KJZ_ZN_^O^J_^[OJ[NK^JJ^KZNKNNJ -MZNKNZOJ^P`+\```"``:`T::-`:8@P@&1D-!H:808)B:#0`T``,$T#!,@PC09 -M#33"9,0`T(`!H#1IHT!IB#"`9&0T&AIA!@F)H-`#0``P30,$R#"-!D--,)DQ -M`#0@`&@-&FC0&F(,(!D9#0:&F$&"8F@T`-``#!-`P3(,(T&0TTPF3$`-`522 -M$_(H2-DT0T:8C(T!H!ZC30R-&@-`,@&C1H:`:#1M3(T,@:::/1#331FII@)@ -M)Z:)RK5N6<7,O<%[)S4ZD(ODD1"*2"(B(+E99)"P2A$"$.#(((0Z^BHO)97* -MKNTS2;//!6_,:)5IVI>LPGUM8_)MV&_QO'$Y;`J/TETR.=3D50:\2B`0AF9 -M<_.ME;:;0N<9%D%\Q['*&6B4*U:JM6K5JUQ12I)1111116K45I*TJU:M6K<: -MZ424444448Y-1)111111[F<_6R+%BQ8L6+$X3333333333333333=3D7Z\E2M6 -MK5JU:M--------->R44444447N#[%BQ8L6+%BQ-M)*******,!0HHHHHHHY[ -M-RR5757;.MS?HE)GL[:M-Q)&/TG09Q6MZ%)XJ4>^]M6W8C@..T=3D -MV&HOX\@T$`%JWHY$`-/ZV!A?)K>YEEZ1`#*,&#,]G484F/7/RDR%Y4Q?U[J:^S$]EPK -MD81)^D"%H^>2OU:FLC31KK??,_$ES74S%+)U7JU5D:VQD)R-2U3"7[FWW -M-DPVV;ANV^9-R&"T;G,A>6EJ3:=3DEVE6ENKC#PZG.]=3D9:75*G=3D>-4N\OA]'=3D- -M`L[RN\MM/>Z'8:6Q.RAWU+=3DHOHDCZ6H?8_!^+:-JVS^6Z;UP'#>T*HB+3GM+4VVS(NQ)&K?`_9IW\,PS#$;QOG"<-QV*QFB8^2)!)H). -M7(_@P9(R$G)DCMYF,_-.ITH]0;4 +M`#0-&@VIZFFF:FC0:>IHVH>H!IHWHIH>2::#U/4]3#4]&3:FD[$4T=3DT[;+$: +MN:8'3:!AAA70P8,,,,,;"^A@#`N-'Q-`PPPP'K:M)GVO:LZ/HDN[1WS1^6_` +M:?U'@N_>Z>(\)[YX[_!_T\EYCYC5@>EXZ7BZ.V8;VEA@PPP'IM'5[.SK*.LZ +MRKK.L[UP<'!P<'!P<'!P<'!P<'!U'9MCN7.VGI<-#>T-[>EO;U6].]O;V]O; +MV]O;V]O;V]O;W,VNC:AM;5&UM;6UM;6UM;6UM;6UM;6UM;6UO;&]SM[M*-[0 +MHT;'3:W*U/-R5:%555557!J5:FA?#0NNNNNN]K]=3DXU\+KKKKKKIXS>M??OTGN7]#X#RWP_2*J +MJJJJJI>L5=3DZAI6666662E*4I2E*RJS5R#PV';_R52Y7*Y7*Y7*E*4I2E*7*J +MY4-*RRRRRSFJJJJJJJJE=3D5=3DWE$+KKKKKLZJJJJJJJI9JLWP:(777777=3DUTK+ +M++++++)X]59]#/KOP:)G,`]MV>'L#N\,,`"*?E:`P +M`>T]KU?=3D^%[SNM$X&`#M'S;[=3DQ6<7%Q<7%Q<7%Q<7%Q<7%Q<7%Q<70[YL?-- +MS5555 +M55552S59H:5EEEEEDI2E*4I2LJLAI666666>[JJJJJJJJE=3D5=3DZ9RUT/G>TJE +MJ:FI5J:DM2K4AI6666662]@]H_??S/?OA/BO/^H55555552[K\A9W[U/R^WE +MBU-34U-34E*4I2E*7(JY'5]QBHS9LV;-FE*4I2E*6:K-#2LLLLLLE*4I2E*5 +ME5D-*RRRRRR4I2E*4I6560TK+++++)2E*4I2E959\FB%UUUUUTI2E*4I2NJN +MAI666666?3U7670TKKKKKKK,LRS+NK:QL;&QL;&QL;&QL;&QL;& +MQO;V]OWY'(Y'(_LHHHHA"$(0A"$(0O1111"$ +M(=3DDUOZGO77?Y/@O^7E/C/.?4N9S.9$1$1$1$1'-N^>(\EJM[++++++++++++ +M+++,O$1$1IB(B(B(CH=3D#H=3D#HHHH\7%]5];'LNG5555U^OBQ8L75]5JR9,F2V +M>+%BQ?@^OQ8L6+E[7[/YRS[AX3]5XC7^+S=3D.4I2\#G_&\3V6I?5FS9LT(0A] +M]G.3)DR0A"&VBBBB$(0A"$/>O?/%>,_T?ZO]WE/_7F//>N:];6UM;!@P8,&# +M!@P8,&#RG7/-9Y2E*4I2E*4I2E*1$1$1$1$1$12G.YWD>7BQ8L4(0A"$(0A" +M$(0AV3#J^!DR9,F3X'];W3P7C(0A"$(0A"$/PJ***(0A"$(0Y^CVXTX889,F +M3)"$(>W>.S;-OG?4^UH7Y-$T;_$1$1$1$1$1$<>]YGV@4I2E*4I2E*4IDS3- +M,&#!@UM;6UM;6UM;6UN9S-C8V-B$(0A"$(0A#[:BBBCT:***(0A#_-X[X3X: +M$(0]=3D1111"$(>D"BBBC?\C%BQ8O.HHHHA"$(0A#R7_;[5_X^*^.\U[%YSY3W +M#U+_[W/2=3D)TG2=3D)BQ8L6+%BQ8L6+['W-"VQ2E*4I2E*4I2E*1$1$1$1$1$12 +ME.=3D"$(>VHHHHA"$.%%%%'E]CU^3)DR0A"'7\A\1WKXR$(0A"$(0A"E%%%$(0 +MA"$(0A"$(0AUWF/Z7FOD/DO/?*>.[#Y;_D1$1$1$1$1$7:-T[^E*4I2E*4I2 +ME*4I$1$1$1$1',YG,YW.YW.\FBBBB$(0]&BBBCK4444>51111"$(>J^[]'T' +MH/0>@A"$/[GI\6+%B[RBBBBGL<6+%BICA@888#1AA@`>CDR9,F5%%%$/CJ** +1(/F-#S7_XNY(IPH2!C]4XX`` ` end diff --git a/sys/boot/efi/boot1/fat-arm64.tmpl.bz2.uu b/sys/boot/efi/boot= 1/fat-arm64.tmpl.bz2.uu index 1101deb..1fa4138 100644 --- a/sys/boot/efi/boot1/fat-arm64.tmpl.bz2.uu +++ b/sys/boot/efi/boot1/fat-arm64.tmpl.bz2.uu @@ -2,25 +2,49 @@ FAT template boot filesystem created by generate-fat.sh= DO NOT EDIT $FreeBSD$ begin 644 fat-arm64.tmpl.bz2 -M0EIH.3%!629364C65#T`&U;_____Z^KJZ_^N_^O^J_^[OJ[NK^JJ^KZNKNNJ -MZNKNZOJ^P`+\#0``0`#0#)D&@TR8AD`,0!D--&`@:!H&@`!B#)IHR:--#(9, -MAA`8F@Q,0,#52`_U4?J@`&AH```:`:``````T-`T&@R&@T``````````$``T -M`R9!H-,F(9`#$`9#31@(&@:!H``8@R::,FC30R&3(80&)H,3$#`521(]I1I) -MF*:8C1Z`F0:`TR,@:&C30:`R!HTT,$!DTT-J:&@R&C)IA,:F33(S4]-3`--$ -MZ--B6=3D6F1M!<28FJA"+E)$0B<@B(B"TK+:2%L)0B!"'(D$$(9F:@LRO+Q;TL -MNJ9YY2QZK1*-0US5+UM6R;E?-T_QQG*=3D-<9#J:#>R[!&-40;(2B`0AE9=3D956 -MO+"IH&,8M=3DKEBF(3,A$H5JU%:M6K5K1-.A)------6K35I*TJU:M6K[LK*RLK*RLK*INY)IIIIIIL6F3333 -M333=3D7VLL91VEN[UP[M$I,5X--+@R1:XKTL?G%LL>,D\Y*-*DU+6MB^YMF\7S -MB,!S6CMPUEU'H'B0`4V-'(@!JKN]^?Z<]*UB`&/9J#*9N@O9.H6FYDN5AT,L -MS-UAW-A;:O3J61R=3D".=3D)EY-(TK3M8US8NM;1N&\<%Q%^Y3"9%=3D8Z-AUMYA;W -MPYKK)5;?@6D;$DWL"J0LE*.Q]RA>Q[,;.QH%VDM/KGE)[.JBX4T=3D56_.0JD: -MUL&Q73$OR;=3DNF^?PXKCL%SF=3D:1FKO&W%A1)O,YWU&FM;1N]W0QW=3D6U*UDS]Q -M0M\CN\G:L^KT%O2U%G0;335JJYFAG8I,5$D?:UC\'Z/U;QO7`<)_3CL!R7/=3D -M%B=3DL<+`H+J1;6??%$1%*H8[34M_N$+V0O6O;YJ7!95E7%<9?L%R7-83#:)BY -M(D$F?DZ4B^,W)%W)SY(X;B/[<9?L\P'_-*YCPGRLLY=3D[?HU\D?[A\BDOL -MP)20P6A]5```````````````````` +M``````````*JJDT`&G_^J2I_^I4_RJGJ``!H``-````````&@-`````````& +M@#0`&AH!`:!H!H`:#30R`&FA@F@T-!IB!H#(#3$``9```:`#",`@`,@:```` +M0&@:`:`&@TT,@!IH8)H-#0:8@:`R`TQ``&0``&@`PC`(`#(&@```$!H&@&@! +MH--#(`::&":#0T&F(&@,@-,0`!D``!H`,(P"``R!H````*JD?I'H1*;293/% +M*FVJ;?JJ?JFGM2&F0VB`/4'J`>2&@R:#0#1H-'H3)IY0'J'I`T:&@TTT_1(T +MVIFH'I-I/334]&3)E/-BFK[5U\L1LVS`Z+4,,,*ZF#!AAAAC87U88`P+CQM8 +MPPPP';U:S/K=3D9G1]*EW*/6M7YKUS7^J[U[-W[^I_$]^\)V'B/BO(>>V8':L. +MF[3K4>#JPPP888`5#1,2SH&`V!@,!X#`8(,$"!`@0($"!`@0($"=3DFZ;LW.[A +MS-QZ'#4X-3@X)<'!5P3P<'!P<'!P<'!P<'!P<'!R-SLMR&YN4;FYN;FYN;FY +MN;FYN;FYN;FYN;G!SN#F<':4<&I1JYW1;70;'DY*M2JJJJJKLVQ5L:E\-2ZZ +MZZZ[]?[#X%\+KKKKKKI:*M$8:UEEEEEDI2E*4I2LJLZ_L]3%1FS9LV;-*4I2 +ME*4LU6:&M999999R\GU'MLPP];FS9LV;-FS2V*MB&M99 +M9999*RJR&M999999U/8=3DKHS9L=3D'=3D,NS#1,MG'.,NCMG7,CR7@*>V]-F7T,\N +M^]H'/8!V'4P_+.YPPP`(I^9J#`![;J>Y_A_D^TU98&`#T+M'WM[>WM[>WM[>WM[>WM[*93*7777 +M777777777777777777=3D-TW9-[G;V]1#G=3D%M=3D!HS2E*4I2E*ZJZ&M999999.$ +MI2E*4I656>DHA=3D=3D=3D=3D=3D=3DZJJJJJJJJJ6:K-#6LLLLLLE*4I2E*5E5D-:RRRRR= S +MW-55555554KJKNLZ%=3D3T2631HT2T:):*M$-:RRRRRR7Y3VCOG\[L/]WR'E^I +M55555552[C\A9W;TOS>O+%L;&QL;&Q*4I2E*4M%6CJ=3DYVV3%KT:-&C1H]3AA +M99555555+8JV+^C^BR8M&C1HT:)2E*4I2EHJT0UK+++++)2E*4I2E959#6LL +MLLLLE*4I2E*5E5GRZ(7777772E*4I2E*ZJZ&M999999LJNLNAK7777776556 +M>R7?OLW;-'OVQX;H/CN1Y;D;6UM4^LNZN+%BQ=3D#K?;^BL[IW[NWN +MW)Z_ER9,F3N^CZ_W?L=3D%],V;-FA"$/P,YR9,F2$(0Z=3D%%%$(0A"$(?WO?/`> +M"_U>&_Z>*\9Y#RWV3;M;6#!@P8,&#!@P8,&#!XSJGD/54I2E*4I2E*4I2D1$ +M1$1$1$1$%_[BQ8L4(0A"$(0A"$(0A\Y[3%BQ8O@>\=3D\[QX"$(0A"$ +M/>T444?XT4440A"$(0AS=3DEWHUX889,F3)"$(=3DZ^$Z[8GS,^^U^+\V@:%_B(B +M(B(B(B(B.-9E\#/*4I2E*4I2E*4V;%BP8,&#:VMK:VMK:VMK:Y'(YW.YW.A" +M$(0A"$(0^ZHHHH\ZBBBB$(0_T?"?#>&A"$/L:***(0A#JA1111PHHHH\JBBB +MCQZ***(0A#_M\5]P^,\9\EY+L/*?,?N/3/([[E+YOX.3)DR0 +MA"'RO"=3D5]Z^0A"$(0A"$(0I1111"$(0A"$(0A"$(?)>0\%Y+Y3Y;RWS'A/-? +M->>B(B(B(B(B(B[0ND?TI2E*4I2E*4I2E(B(B(B(B(CD(;UG$,HJ0@""#-QRL -MK%;U%@U#)LDM5=3D:+-(N(1@I4IJ5*E2I54DID4DDDDDE*E)2BI1I4J5*EU;!) -M%))))))CE"2*222222VAMLQPP,#`P,#`P(X"!`@0($"!`@0($"!"A0[?7Q3* -M5*E2I4J5"A0H4*%"A04*%"A0H4+.ST&QK*RLK*RLK*RA>Q22222226J1)))) -M)))E.[CDIL[6:1_=3D=3D<1)HM-I)YW&BA1::S+:)65-0B]%&'M(M0NH;>IIW;(JNVEFI;>C')YXV5+]XBB)\ -M[ZEVKL@W3>-^_IQW*(%VV;@O/<5F69*8X9GXH9&+#BAR'^.4Y;FM,Y[HL!@OY8;$?8S;J7G.0^F*'/Q;^A`$$ -7$8`%A.GB7Z'$1=3D)_XNY(IPH2`GA(C"`` +M0EIH.3%!62936=3DSO#C@`'YC______________^O^J_^[OJ[^J^NK^KZOKONJ +MZNK^ZN[^X`C_*``&B@`4"0D2(B0&I*````````#0```````#(-``R``````` +M```````"JJE'ZH`:?_ZDJG_ZJ>JG_JJ````````````````#0``T```````# +M0:&AZ@$!H&@&@!H--#(`::&":#0T&F(&@,@-,0`!D``!H`,(P"``R!H```!` +M:!H!H`:#30R`&FA@F@T-!IB!H#(#3$``9```:`#",`@`,@:````0&@:`:`&@ +MTT,@!IH8)H-#0:8@:`R`TQ``&0``&@`PC`(`#(&@````JJ1^E'Z:22>E-/U3 +MU*?_I2GM2)_ZJF3TVJ>H>IH:,C0,T@:;4'J&@:#U--`:`9`>H!ZC30:`>H`> +MU3U&3TCU--&AZ3T33#4]J:3M1;5],[S;L'-SS`ZK4,LLKZF3)EEEELH8U99` +MR/+U#+++(9CZ.Z#/T/H6=3DGI$O6OLUGWK[5KIA8"H%V,<7HTANC4'..@>0_@A +MKX(FK!2V=3D#7*(0A"$(`%PKSW6IUUG7=3D=3DAUW7>"Z72Z72Z72Z72Z72Z72Z72Z +M7K=3DN^0//Y:G%J<7%+BXKN*>+BXN+BXN+BXN+BXN+BXM[O]'1HLT:+-& +MC1HT:-&C1HT:-&C1HT:-'6<'6=3DNXN5G%J6:N#JN=3DU',^%M7:EUUUUUW=3D.9=3DS +M-3#4PPPPPP_-]37^&K+######"6Y=3DN1EK4I2E*2E*4I2E*EU.Q^3J;%F;-FS +M9LTI2E*4I2S79H:U*4I2G;;_3^TS9LV;-FS9IY>^?Z]TNNNNNNNEZA=3DX*&M2E*4I*4I2E*4 +MJ74AK4I2E*2E*4I2E*EU(:U*4I2F/JZ4I2E*4EFNS0UJ4I2E,[KKKKKKKI87 +M8>3S>KVMCM:W,U9>R>P:"CMW8,'DLXI[;TV+Z7QKOP9]SE@S>HY7-G +M"965E`$6]AJ#(!^7UO;>U_<[_5MR,@'H'R+ZIR4Y.3DY.3DY.3DY.3DY.3DY +M.3DY.X>N<'=3D-&C8T:-K1HT:-&C1HT:-&C1HT:-&CN7O]M2E*4I2DLUV;T3??4[ +MNTMK[>_>9Z5=3D=3D=3D=3D=3D=3D=3D+O_"4_&?,= ?&[ +M$MCFF960PPPPPPNNPIA#6PPPG###"E-(=3D.TEWK2FVLT]9FGRM+9U'\HLLL +MB(B(C>WM[>WNP]DZKNWT'7>)T.AT.AT.AT.AT.AT.AT.AT.AZ#L=3DKQ_6<'!P +M<'!P<'!P<'!P<'!P<'6=3D9UG6=3D3O=3D.UJE*4H]J:EEEG^60K4.N=3D,I2E"$(0A" +M'T7X>QL;&QWV7L*_H>,]P_S?[O*?`?%>H;V]O;V]$1$1$1$\ +M>4\M\%YCU3GYW.YW.YW.LLLLLLLLLL\5YCR'J*4I2E*4I2E*4I2(B(B(B(B( +MB*4I3R/?;&QL;$(0A"$(0A"$(0AY[VFQL;&QX_BO$>&[*$(0A"$*LLLLA"$( +M0A"$(0\OWOZ`UY99;6UM;4(0A[%[IWCO'O'_#RGY,\S[,?XB(B(B(B(B(CC6 +M;?"^12E*4I2E*4I2FS9;+66666666<[G<[G<[G;V]P<'!P0A"$(0A"$(>!99 +M99YUEEED(0A[AY#R7NT(0AZJRRRSN@LLLLA"$.-EEEGQ;+++(0A"$,C(^I]C +M@WW/Q9Y^SUW\,QW+!^G>8,&#!@P8,&#!@P8,&#!];[6=3D;.I2E*4I2E*4I2E( +MB(B(B(B(B(I2E,C(R,CP[+++(0A"$(0_Z[7KMK:VMJ$(0^'Y#_MX+WZ$(0A" +M$(0A"UEEED(0A"$(0A"$(0A_X^"\=3D\)\-\1YC_Y[IVGQGQV]O;V]$1$1$1$1 +M=3DF.F?TI2E*4I2E*4I2E(B(B(B(B(B(I3MW;O>V6660A"'G6666=3D]9999_S99 +M99"$(>D^N\[S7FO->:A"$/['H]C8V-CP+++++?@[&QL;%MF61EED-6660!YV +A<#S[+FVTI2&VRRRR'P%EED'QVI_Z__%W)%.%"0W.\..` ` end diff --git a/sys/boot/efi/boot1/generate-fat.sh b/sys/boot/efi/boot1/gene= rate-fat.sh index d9dfb27..7c46e92 100755 --- a/sys/boot/efi/boot1/generate-fat.sh +++ b/sys/boot/efi/boot1/generate-fat.sh @@ -13,7 +13,7 @@ =20 FAT_SIZE=3D1600 #Size in 512-byte blocks of the produced image =20 -BOOT1_SIZE=3D128k +BOOT1_SIZE=3D512k =20 # # Known filenames diff --git a/sys/boot/efi/boot1/ufs_module.c b/sys/boot/efi/boot1/ufs_mod= ule.c deleted file mode 100644 index 0860a86..0000000 --- a/sys/boot/efi/boot1/ufs_module.c +++ /dev/null @@ -1,180 +0,0 @@ -/*- - * Copyright (c) 1998 Robert Nordier - * All rights reserved. - * Copyright (c) 2001 Robert Drehmel - * All rights reserved. - * Copyright (c) 2014 Nathan Whitehorn - * All rights reserved. - * Copyright (c) 2015 Eric McCorkle - * All rights reverved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in th= e - * documentation and/or other materials provided with the distributio= n. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN= D - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE= - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB= LE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE= NTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO= DS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)= - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S= TRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY= WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O= F - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include -#include -#include -#include -#include - -#include "boot_module.h" - -static dev_info_t *devinfo; -static dev_info_t *devices; - -static int -dskread(void *buf, u_int64_t lba, int nblk) -{ - int size; - EFI_STATUS status; - - lba =3D lba / (devinfo->dev->Media->BlockSize / DEV_BSIZE); - size =3D nblk * DEV_BSIZE; - - status =3D devinfo->dev->ReadBlocks(devinfo->dev, - devinfo->dev->Media->MediaId, lba, size, buf); - - if (status !=3D EFI_SUCCESS) { - DPRINTF("dskread: failed dev: %p, id: %u, lba: %ju, size: %d, " - "status: %lu\n", devinfo->dev, - devinfo->dev->Media->MediaId, (uintmax_t)lba, size, - EFI_ERROR_CODE(status)); - return (-1); - } - - return (0); -} - -#include "ufsread.c" - -static struct dmadat __dmadat; - -static int -init_dev(dev_info_t* dev) -{ - - devinfo =3D dev; - dmadat =3D &__dmadat; - - return fsread(0, NULL, 0); -} - -static EFI_STATUS -probe(dev_info_t* dev) -{ - - if (init_dev(dev) < 0) - return (EFI_UNSUPPORTED); - - add_device(&devices, dev); - - return (EFI_SUCCESS); -} - -static EFI_STATUS -load(const char *filepath, dev_info_t *dev, void **bufp, size_t *bufsize= ) -{ - ufs_ino_t ino; - EFI_STATUS status; - size_t size; - ssize_t read; - void *buf; - - DPRINTF("Loading '%s' from %s\n", filepath, devpath_str(dev->devpath));= - - if (init_dev(dev) < 0) { - DPRINTF("Failed to init device\n"); - return (EFI_UNSUPPORTED); - } - - if ((ino =3D lookup(filepath)) =3D=3D 0) { - DPRINTF("Failed to lookup '%s' (file not found?)\n", filepath); - return (EFI_NOT_FOUND); - } - - if (fsread_size(ino, NULL, 0, &size) < 0 || size <=3D 0) { - printf("Failed to read size of '%s' ino: %d\n", filepath, ino); - return (EFI_INVALID_PARAMETER); - } - - if ((status =3D bs->AllocatePool(EfiLoaderData, size, &buf)) !=3D - EFI_SUCCESS) { - printf("Failed to allocate read buffer %zu for '%s' (%lu)\n", - size, filepath, EFI_ERROR_CODE(status)); - return (status); - } - - read =3D fsread(ino, buf, size); - if ((size_t)read !=3D size) { - printf("Failed to read '%s' (%zd !=3D %zu)\n", filepath, read, - size); - (void)bs->FreePool(buf); - return (EFI_INVALID_PARAMETER); - } - - DPRINTF("Load complete\n"); - - *bufp =3D buf; - *bufsize =3D size; - - return (EFI_SUCCESS); -} - -static void -status(void) -{ - int i; - dev_info_t *dev; - - for (dev =3D devices, i =3D 0; dev !=3D NULL; dev =3D dev->next, i++) - ; - - printf("%s found ", ufs_module.name); - switch (i) { - case 0: - printf("no partitions\n"); - break; - case 1: - printf("%d partition\n", i); - break; - default: - printf("%d partitions\n", i); - } -} - -static dev_info_t * -_devices(void) -{ - - return (devices); -} - -const boot_module_t ufs_module =3D -{ - .name =3D "UFS", - .probe =3D probe, - .load =3D load, - .status =3D status, - .devices =3D _devices -}; diff --git a/sys/boot/efi/boot1/zfs_module.c b/sys/boot/efi/boot1/zfs_mod= ule.c deleted file mode 100644 index 1926a33..0000000 --- a/sys/boot/efi/boot1/zfs_module.c +++ /dev/null @@ -1,196 +0,0 @@ -/*- - * Copyright (c) 2015 Eric McCorkle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in th= e - * documentation and/or other materials provided with the distributio= n. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN= D - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE= - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB= LE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE= NTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO= DS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)= - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S= TRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY= WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O= F - * SUCH DAMAGE. - * - * $FreeBSD$ - */ -#include -#include -#include -#include -#include -#include -#include - -#include "boot_module.h" - -#include "libzfs.h" -#include "zfsimpl.c" - -static dev_info_t *devices; - -static int -vdev_read(vdev_t *vdev, void *priv, off_t off, void *buf, size_t bytes) -{ - dev_info_t *devinfo; - off_t lba; - EFI_STATUS status; - - devinfo =3D (dev_info_t *)priv; - lba =3D off / devinfo->dev->Media->BlockSize; - - status =3D devinfo->dev->ReadBlocks(devinfo->dev, - devinfo->dev->Media->MediaId, lba, bytes, buf); - if (status !=3D EFI_SUCCESS) { - DPRINTF("vdev_read: failed dev: %p, id: %u, lba: %jd, size: %zu," - " status: %lu\n", devinfo->dev, - devinfo->dev->Media->MediaId, (intmax_t)lba, bytes, - EFI_ERROR_CODE(status)); - return (-1); - } - - return (0); -} - -static EFI_STATUS -probe(dev_info_t *dev) -{ - spa_t *spa; - dev_info_t *tdev; - EFI_STATUS status; - - /* ZFS consumes the dev on success so we need a copy. */ - if ((status =3D bs->AllocatePool(EfiLoaderData, sizeof(*dev), - (void**)&tdev)) !=3D EFI_SUCCESS) { - DPRINTF("Failed to allocate tdev (%lu)\n", - EFI_ERROR_CODE(status)); - return (status); - } - memcpy(tdev, dev, sizeof(*dev)); - - if (vdev_probe(vdev_read, tdev, &spa) !=3D 0) { - (void)bs->FreePool(tdev); - return (EFI_UNSUPPORTED); - } - - dev->devdata =3D spa; - add_device(&devices, dev); - - return (EFI_SUCCESS); -} - -static EFI_STATUS -load(const char *filepath, dev_info_t *devinfo, void **bufp, size_t *buf= size) -{ - spa_t *spa; - struct zfsmount zfsmount; - dnode_phys_t dn; - struct stat st; - int err; - void *buf; - EFI_STATUS status; - - spa =3D devinfo->devdata; - - DPRINTF("load: '%s' spa: '%s', devpath: %s\n", filepath, spa->spa_name,= - devpath_str(devinfo->devpath)); - - if ((err =3D zfs_spa_init(spa)) !=3D 0) { - DPRINTF("Failed to load pool '%s' (%d)\n", spa->spa_name, err); - return (EFI_NOT_FOUND); - } - - if ((err =3D zfs_mount(spa, 0, &zfsmount)) !=3D 0) { - DPRINTF("Failed to mount pool '%s' (%d)\n", spa->spa_name, err); - return (EFI_NOT_FOUND); - } - - if ((err =3D zfs_lookup(&zfsmount, filepath, &dn)) !=3D 0) { - if (err =3D=3D ENOENT) { - DPRINTF("Failed to find '%s' on pool '%s' (%d)\n", - filepath, spa->spa_name, err); - return (EFI_NOT_FOUND); - } - printf("Failed to lookup '%s' on pool '%s' (%d)\n", filepath, - spa->spa_name, err); - return (EFI_INVALID_PARAMETER); - } - - if ((err =3D zfs_dnode_stat(spa, &dn, &st)) !=3D 0) { - printf("Failed to stat '%s' on pool '%s' (%d)\n", filepath, - spa->spa_name, err); - return (EFI_INVALID_PARAMETER); - } - - if ((status =3D bs->AllocatePool(EfiLoaderData, (UINTN)st.st_size, &buf= )) - !=3D EFI_SUCCESS) { - printf("Failed to allocate load buffer %zd for pool '%s' for '%s' " - "(%lu)\n", st.st_size, spa->spa_name, filepath, EFI_ERROR_CODE(sta= tus)); - return (EFI_INVALID_PARAMETER); - } - - if ((err =3D dnode_read(spa, &dn, 0, buf, st.st_size)) !=3D 0) { - printf("Failed to read node from %s (%d)\n", spa->spa_name, - err); - (void)bs->FreePool(buf); - return (EFI_INVALID_PARAMETER); - } - - *bufsize =3D st.st_size; - *bufp =3D buf; - - return (EFI_SUCCESS); -} - -static void -status(void) -{ - spa_t *spa; - - spa =3D STAILQ_FIRST(&zfs_pools); - if (spa =3D=3D NULL) { - printf("%s found no pools\n", zfs_module.name); - return; - } - - printf("%s found the following pools:", zfs_module.name); - STAILQ_FOREACH(spa, &zfs_pools, spa_link) - printf(" %s", spa->spa_name); - - printf("\n"); -} - -static void -init(void) -{ - - zfs_init(); -} - -static dev_info_t * -_devices(void) -{ - - return (devices); -} - -const boot_module_t zfs_module =3D -{ - .name =3D "ZFS", - .init =3D init, - .probe =3D probe, - .load =3D load, - .status =3D status, - .devices =3D _devices -}; diff --git a/sys/boot/efi/drivers/Makefile b/sys/boot/efi/drivers/Makefil= e new file mode 100644 index 0000000..5e1f18b --- /dev/null +++ b/sys/boot/efi/drivers/Makefile @@ -0,0 +1,34 @@ +# $FreeBSD$ + +.include + +LIB=3D efi_drivers +INTERNALLIB=3D +WARNS?=3D 2 + +SRCS=3D efipart.c fs_driver.c + +.if ${MACHINE_CPUARCH} =3D=3D "aarch64" +CFLAGS+=3D -msoft-float -mgeneral-regs-only +.endif +.if ${MACHINE_ARCH} =3D=3D "amd64" +CFLAGS+=3D -fPIC -mno-red-zone +.endif +.if ${MK_ZFS} !=3D "no" +CFLAGS+=3D -I${.CURDIR}/../../zfs +CFLAGS+=3D -I${.CURDIR}/../../../cddl/boot/zfs +CFLAGS+=3D -DEFI_ZFS_BOOT +.endif + +CFLAGS+=3D -I${.CURDIR}/../include +CFLAGS+=3D -I${.CURDIR}/../include/${MACHINE} +CFLAGS+=3D -I${.CURDIR}/../../../../lib/libstand + +# Pick up the bootstrap header for some interface items +CFLAGS+=3D -I${.CURDIR}/../../common + +# Handle FreeBSD specific %b and %D printf format specifiers +CFLAGS+=3D ${FORMAT_EXTENSIONS} +CFLAGS+=3D -DTERM_EMU + +.include diff --git a/sys/boot/efi/drivers/efi_drivers.h b/sys/boot/efi/drivers/ef= i_drivers.h new file mode 100644 index 0000000..0c599d1 --- /dev/null +++ b/sys/boot/efi/drivers/efi_drivers.h @@ -0,0 +1,42 @@ +/*- + * Copyright (c) 2016 Eric McCorkle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in th= e + * documentation and/or other materials provided with the distributio= n. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN= D + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE= + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB= LE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE= NTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO= DS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)= + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S= TRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY= WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O= F + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _EFI_DRIVERS_H_ +#define _EFI_DRIVERS_H_ + +typedef struct efi_driver_t { + const char *name; + void (*init)(void); +} efi_driver_t; + +extern struct devsw efipart_dev; + +/* EFI drivers. */ +extern const efi_driver_t fs_driver; + +#endif diff --git a/sys/boot/efi/libefi/efipart.c b/sys/boot/efi/drivers/efipart= =2Ec similarity index 75% rename from sys/boot/efi/libefi/efipart.c rename to sys/boot/efi/drivers/efipart.c index 5a99381..3e3a9c0 100644 --- a/sys/boot/efi/libefi/efipart.c +++ b/sys/boot/efi/drivers/efipart.c @@ -74,90 +74,109 @@ static int npdinfo =3D 0; =20 #define PD(dev) (pdinfo[(dev)->d_unit]) =20 +static EFI_STATUS +efipart_supported(EFI_DRIVER_BINDING *This, EFI_HANDLE handle, + EFI_DEVICE_PATH *RemainingDevicePath __unused) +{ + return BS->OpenProtocol(handle, &blkio_guid, + NULL, IH, handle, + EFI_OPEN_PROTOCOL_TEST_PROTOCOL); +} + +static EFI_STATUS +efipart_start(EFI_DRIVER_BINDING *This, EFI_HANDLE handle, + EFI_DEVICE_PATH *RemainingDevicePath __unused, + u_int* ndisk, uint* nrdisk) +{ + EFI_BLOCK_IO *blkio; + EFI_DEVICE_PATH *devpath, *devpathcpy, *tmpdevpath, *node; + EFI_STATUS status; + EFI_HANDLE alias; + + devpath =3D efi_lookup_devpath(handle); + + if (devpath =3D=3D NULL) { + return (EFI_DEVICE_ERROR); + } + + status =3D BS->HandleProtocol(handle, &blkio_guid, + (void**)&blkio); + if (EFI_ERROR(status)) + return (status); + + if (!blkio->Media->LogicalPartition) { + *nrdisk++; + return (EFI_UNSUPPORTED); + } + + /* + * If we come across a logical partition of subtype CDROM + * it doesn't refer to the CD filesystem itself, but rather + * to any usable El Torito boot image on it. In this case + * we try to find the parent device and add that instead as + * that will be the CD filesystem. + */ + node =3D efi_devpath_last_node(devpath); + if (DevicePathType(node) =3D=3D MEDIA_DEVICE_PATH && + DevicePathSubType(node) =3D=3D MEDIA_CDROM_DP) { + devpathcpy =3D efi_devpath_trim(devpath); + tmpdevpath =3D devpathcpy; + status =3D BS->LocateDevicePath(&blkio_guid, &tmpdevpath= , + &alias); + free(devpathcpy); + + if (EFI_ERROR(status)) + return (status); + + efi_register_handle(&efipart_dev, handle, alias); + } else + efi_register_handle(&efipart_dev, handle, NULL); + + pdinfo[npdinfo].pd_open =3D 0; + pdinfo[npdinfo].pd_bcache =3D NULL; + pdinfo[npdinfo].pd_unit =3D npdinfo; + npdinfo++; + *ndisk++; + + return (EFI_SUCCESS); +} + static int -efipart_init(void)=20 +efipart_init(void) { - EFI_BLOCK_IO *blkio; - EFI_DEVICE_PATH *devpath, *devpathcpy, *tmpdevpath, *node; - EFI_HANDLE *hin, *hout, *aliases, handle; + EFI_HANDLE *handles; EFI_STATUS status; UINTN sz; - u_int n, nin, nout, nrdisk; + u_int n, nin, ndisk, nrdisk; int err; =20 sz =3D 0; - hin =3D NULL; + handles =3D NULL; status =3D BS->LocateHandle(ByProtocol, &blkio_guid, 0, &sz, 0); if (status =3D=3D EFI_BUFFER_TOO_SMALL) { - hin =3D (EFI_HANDLE *)malloc(sz * 3); + handles =3D (EFI_HANDLE *)malloc(sz); status =3D BS->LocateHandle(ByProtocol, &blkio_guid, 0, &sz, - hin); + handles); if (EFI_ERROR(status)) - free(hin); + free(handles); } if (EFI_ERROR(status)) return (efi_status_to_errno(status)); =20 /* Filter handles to only include FreeBSD partitions. */ nin =3D sz / sizeof(EFI_HANDLE); - hout =3D hin + nin; - aliases =3D hout + nin; - nout =3D 0; - nrdisk =3D 0; - - bzero(aliases, nin * sizeof(EFI_HANDLE)); pdinfo =3D malloc(nin * sizeof(*pdinfo)); - if (pdinfo =3D=3D NULL) - return (ENOMEM); + ndisk =3D 0; + nrdisk =3D 0; =20 for (n =3D 0; n < nin; n++) { - devpath =3D efi_lookup_devpath(hin[n]); - if (devpath =3D=3D NULL) { - continue; - } - - status =3D BS->HandleProtocol(hin[n], &blkio_guid, - (void**)&blkio); - if (EFI_ERROR(status)) - continue; - if (!blkio->Media->LogicalPartition) { - nrdisk++; - continue; - } - - /* - * If we come across a logical partition of subtype CDROM - * it doesn't refer to the CD filesystem itself, but rather - * to any usable El Torito boot image on it. In this case - * we try to find the parent device and add that instead as - * that will be the CD filesystem. - */ - node =3D efi_devpath_last_node(devpath); - if (DevicePathType(node) =3D=3D MEDIA_DEVICE_PATH && - DevicePathSubType(node) =3D=3D MEDIA_CDROM_DP) { - devpathcpy =3D efi_devpath_trim(devpath); - tmpdevpath =3D devpathcpy; - status =3D BS->LocateDevicePath(&blkio_guid, &tmpdevpath, - &handle); - free(devpathcpy); - if (EFI_ERROR(status)) - continue; - hout[nout] =3D handle; - aliases[nout] =3D hin[n]; - } else - hout[nout] =3D hin[n]; - nout++; - pdinfo[npdinfo].pd_open =3D 0; - pdinfo[npdinfo].pd_bcache =3D NULL; - pdinfo[npdinfo].pd_unit =3D npdinfo; - npdinfo++; + efipart_start(NULL, handles[n], NULL, &ndisk, &nrdisk); } =20 bcache_add_dev(npdinfo); - err =3D efi_register_handles(&efipart_dev, hout, aliases, nout); - free(hin); + free(handles); =20 - if (nout =3D=3D 0 && nrdisk > 0) + if (ndisk =3D=3D 0 && nrdisk > 0) printf("Found %d disk(s) but no logical partition\n", nrdisk); return (err); } diff --git a/sys/boot/efi/drivers/fs_driver.c b/sys/boot/efi/drivers/fs_d= river.c new file mode 100644 index 0000000..b9c8536 --- /dev/null +++ b/sys/boot/efi/drivers/fs_driver.c @@ -0,0 +1,853 @@ +/*- + * Copyright (c) 2016 Eric McCorkle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in th= e + * documentation and/or other materials provided with the distributio= n. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN= D + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE= + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB= LE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE= NTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO= DS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)= + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S= TRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY= WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O= F + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef EFI_ZFS_BOOT +#include +#endif +#include + +#include "efi_drivers.h" + +static EFI_GUID SimpleFileSystemProtocolGUID =3D SIMPLE_FILE_SYSTEM_PROT= OCOL; + +static struct fs_ops *backend_file_system[] =3D { + &dosfs_fsops, + &ufs_fsops, + &cd9660_fsops, + &tftp_fsops, + &nfs_fsops, + &gzipfs_fsops, + &bzipfs_fsops, + NULL +}; + +static struct devsw *backend_devsw[] =3D { + &efipart_dev, +#ifdef EFI_ZFS_BOOT + &zfs_dev, +#endif + NULL +}; + +typedef struct volinfo_t { + struct fs_ops *fsops; + struct devdesc *dev; +} volinfo_t; + +typedef struct fileinfo_t { + const volinfo_t* vinfo; + struct open_file fdata; + char path[]; +} fileinfo_t; + +static EFI_GUID FileInfoGUID =3D EFI_FILE_INFO_ID;; + +static EFIAPI EFI_STATUS +file_open_impl(EFI_FILE_HANDLE File, EFI_FILE_HANDLE *NewHandle, + CHAR16 *FileName, UINT64 OpenMode, UINT64 Attributes); + +static EFIAPI EFI_STATUS +file_close_impl(EFI_FILE_HANDLE File); + +static EFIAPI EFI_STATUS +file_delete_impl(EFI_FILE_HANDLE File); + +static EFIAPI EFI_STATUS +dir_read_impl(EFI_FILE_HANDLE File, UINTN *BufferSize, VOID *Buffer); + +static EFIAPI EFI_STATUS +dir_write_impl(EFI_FILE_HANDLE File, UINTN *BufferSize, + VOID *Buffer); + +static EFIAPI EFI_STATUS +file_read_impl(EFI_FILE_HANDLE File, UINTN *BufferSize, VOID *Buffer); + +static EFIAPI EFI_STATUS +file_write_impl(EFI_FILE_HANDLE File, UINTN *BufferSize, + VOID *Buffer); + +static EFIAPI EFI_STATUS +file_set_position_impl(EFI_FILE_HANDLE File, UINT64 Position); + +static EFIAPI EFI_STATUS +file_get_position_impl(EFI_FILE_HANDLE File, UINT64 *Position); + +static EFIAPI EFI_STATUS +file_get_info_impl(EFI_FILE_HANDLE File, EFI_GUID *InformationType, + UINTN *BufferSize, VOID *Buffer); + +static EFIAPI EFI_STATUS +file_set_info_impl(EFI_FILE_HANDLE File, EFI_GUID *InformationType, + UINTN BufferSize, VOID *Buffer); + +static EFIAPI EFI_STATUS +file_flush_impl(EFI_FILE_HANDLE File); + +static struct devdesc* +clone_devdesc(struct devdesc *dev) +{ + struct devdesc *out; + + switch(dev->d_dev->dv_type) { + case DEVT_ZFS: + out =3D malloc(sizeof(struct zfs_devdesc)); + + if (out =3D=3D NULL) { + return NULL; + } + + memcpy(out, dev, sizeof(struct zfs_devdesc)); + + return out; + + default: + out =3D malloc(sizeof(struct devdesc)); + + if (out =3D=3D NULL) { + return NULL; + } + + memcpy(out, dev, sizeof(struct devdesc)); + + return out; + } +} + +static EFI_STATUS +do_file_open(const volinfo_t *vinfo, const char filepath[], + int mode, EFI_FILE_HANDLE *out) +{ + EFI_FILE_HANDLE fhandle; + fileinfo_t *finfo; + struct stat st; + struct devdesc *tmpdev; + int err; + + memset(&st, 0, sizeof(struct stat)); + fhandle =3D malloc(sizeof(EFI_FILE) + sizeof(fileinfo_t) + + strlen(filepath) + 1); + + if (fhandle =3D=3D NULL) { + return (EFI_OUT_OF_RESOURCES); + } + + tmpdev =3D clone_devdesc(vinfo->dev); + + if (tmpdev =3D=3D NULL) { + free(fhandle); + return (EFI_OUT_OF_RESOURCES); + } + + finfo =3D (fileinfo_t*)(fhandle + 1); + finfo->fdata.f_flags =3D mode + 1; + finfo->fdata.f_dev =3D NULL; + finfo->fdata.f_ops =3D NULL; + finfo->fdata.f_offset =3D 0; + finfo->fdata.f_devdata =3D NULL; + + if ((err =3D vinfo->dev->d_dev->dv_open(&(finfo->fdata), tmpdev)= ) !=3D 0) { + free(fhandle); + return (errno_to_efi_status(err)); + } + + finfo->fdata.f_dev =3D vinfo->dev->d_dev; + + if ((err =3D vinfo->fsops->fo_open(filepath, &(finfo->fdata))) != =3D 0) { + free(fhandle); + return (errno_to_efi_status(err)); + } + + finfo->fdata.f_ops =3D vinfo->fsops; + + if ((err =3D vinfo->fsops->fo_stat(&(finfo->fdata), &st)) !=3D 0= ) { + free(fhandle); + return (errno_to_efi_status(err)); + } + + strcpy(finfo->path, filepath); + finfo->vinfo =3D vinfo; + fhandle->Revision =3D EFI_FILE_HANDLE_REVISION; + fhandle->Open =3D file_open_impl; + fhandle->Close =3D file_close_impl; + fhandle->Delete =3D file_delete_impl; + fhandle->SetPosition =3D file_set_position_impl; + fhandle->GetPosition =3D file_get_position_impl; + fhandle->GetInfo =3D file_get_info_impl; + fhandle->SetInfo =3D file_set_info_impl; + fhandle->Flush =3D file_flush_impl; + + if (S_ISDIR(st.st_mode)) { + fhandle->Read =3D dir_read_impl; + fhandle->Write =3D dir_write_impl; + } else { + fhandle->Read =3D file_read_impl; + fhandle->Write =3D file_write_impl; + } + + *out =3D fhandle; + + return (EFI_SUCCESS); +} + +static int +mode_from_efi(UINT64 efi_mode) +{ + int mode =3D 0; + + if (efi_mode & EFI_FILE_MODE_WRITE) { + mode |=3D O_WRONLY; + } else if (efi_mode & EFI_FILE_MODE_READ) { + mode |=3D O_RDONLY; + } else if (efi_mode & EFI_FILE_MODE_READ && + efi_mode & EFI_FILE_MODE_WRITE) { + mode |=3D O_RDWR; + } + + return mode; +} + +static UINT64 +mode_to_efi(int mode) +{ + UINT64 efi_mode =3D 0; + + if (mode & O_WRONLY) { + efi_mode |=3D EFI_FILE_MODE_WRITE; + } else if (mode & O_RDONLY) { + efi_mode |=3D EFI_FILE_MODE_READ; + } else if (mode & O_RDWR) { + efi_mode |=3D EFI_FILE_MODE_READ; + efi_mode |=3D EFI_FILE_MODE_WRITE; + } + + return (efi_mode); +} + +static EFIAPI EFI_STATUS +file_open_impl(EFI_FILE_HANDLE File, EFI_FILE_HANDLE *NewHandle, + CHAR16 *FileName, UINT64 OpenMode, UINT64 Attributes) +{ + fileinfo_t *finfo =3D (fileinfo_t*)(File + 1); + char buf[strlen(finfo->path) + strlen16(FileName) + 1]; + + strcpy_from_16(stpcpy(buf, finfo->path), FileName); + + return do_file_open(finfo->vinfo, buf, + mode_from_efi(OpenMode), NewHandle); +} + +static EFIAPI EFI_STATUS +file_close_impl(EFI_FILE_HANDLE File) +{ + fileinfo_t *finfo =3D (fileinfo_t*)(File + 1); + int res; + + if ((res =3D finfo->fdata.f_ops->fo_close(&(finfo->fdata))) !=3D= 0) { + return (errno_to_efi_status(res)); + } + + if ((res =3D finfo->vinfo->dev->d_dev->dv_close(&(finfo->fdata))= ) !=3D 0) { + return (errno_to_efi_status(res)); + } + + free(File); + return (EFI_SUCCESS); +} + +static EFIAPI EFI_STATUS +file_delete_impl(EFI_FILE_HANDLE File) +{ + file_close_impl(File); + + return (EFI_WARN_DELETE_FAILURE); +} + +static EFIAPI EFI_STATUS +dir_read_impl(EFI_FILE_HANDLE File, UINTN *BufferSize, VOID *Buffer) +{ + fileinfo_t *finfo =3D (fileinfo_t*)(File + 1); + fileinfo_t *entinfo; + struct dirent d; + struct stat st; + int err; + UINTN currsize =3D *BufferSize; + UINTN reqsize; + EFI_FILE_INFO *out =3D (EFI_FILE_INFO*)Buffer; + EFI_FILE_HANDLE enthandle; + EFI_STATUS status; + off_t currpos; + + /* Record teh current position so we can rewind if we have to */= + if ((currpos =3D finfo->fdata.f_ops->fo_seek(&(finfo->fdata), + 0, SEEK_CUR)) < 0) { + return (errno_to_efi_status(errno)); + } + + if ((err =3D finfo->fdata.f_ops->fo_readdir(&(finfo->fdata), &d)) !=3D = 0) { + return (errno_to_efi_status(errno)); + } + + reqsize =3D sizeof(EFI_FILE_INFO) + + ((strlen(d.d_name) + 1) * sizeof(CHAR16)); + + if (Buffer =3D=3D NULL || currsize < reqsize) { + finfo->fdata.f_ops->fo_seek(&(finfo->fdata), currpos, SE= EK_SET); + *BufferSize =3D reqsize; + + return (EFI_BUFFER_TOO_SMALL); + } + + // We have to actually open the file, since EFI directory + // reads are supposed to return stat information. + CHAR16 buf[d.d_namlen]; + strcpy_to_16(buf, d.d_name); + status =3D file_open_impl(File, &enthandle, buf, EFI_FILE_READ_O= NLY, 0); + + if (EFI_ERROR(status)) { + finfo->fdata.f_ops->fo_seek(&(finfo->fdata), currpos, SE= EK_SET); + return (status); + } + + entinfo =3D (fileinfo_t*)(enthandle + 1); + + if ((err =3D finfo->fdata.f_ops->fo_stat(&(entinfo->fdata), &st)= ) !=3D 0) { + finfo->fdata.f_ops->fo_seek(&(finfo->fdata), currpos, SE= EK_SET); + return (errno_to_efi_status(errno)); + } + + status =3D file_close_impl(enthandle); + + if (EFI_ERROR(status)) { + finfo->fdata.f_ops->fo_seek(&(finfo->fdata), currpos, SE= EK_SET); + return (status); + } + + // We're good at this point, copy everything into place. + out->Size =3D reqsize; + out->FileSize =3D st.st_size; + out->PhysicalSize =3D st.st_blocks * st.st_blksize; + out->Attribute =3D mode_to_efi(st.st_mode); + to_efi_time(&(out->LastAccessTime), st.st_atime); + to_efi_time(&(out->ModificationTime), st.st_mtime); + to_efi_time(&(out->CreateTime), st.st_ctime); + + if (S_ISDIR(st.st_mode)) { + out->Attribute |=3D EFI_FILE_DIRECTORY; + } + + strcpy_to_16(out->FileName, d.d_name); + *BufferSize =3D reqsize; + + return (EFI_SUCCESS); +} + +static EFIAPI EFI_STATUS +dir_write_impl(EFI_FILE_HANDLE File __unused, UINTN *BufferSize __unused= , + VOID *Buffer __unused) +{ + // EFI API doesn't allow writing to directories + return (EFI_UNSUPPORTED); +} + +static EFIAPI EFI_STATUS +file_read_impl(EFI_FILE_HANDLE File, UINTN *BufferSize, VOID *Buffer) +{ + fileinfo_t *finfo =3D (fileinfo_t*)(File + 1); + size_t readsize =3D *BufferSize; + size_t resid; + int err; + + if ((err =3D finfo->fdata.f_ops->fo_read(&(finfo->fdata), Buffer, + readsize, &resid)) !=3D 0= ) { + return (errno_to_efi_status(errno)); + } + + *BufferSize =3D readsize - resid; + + return (EFI_SUCCESS); +} + +static EFIAPI EFI_STATUS +file_write_impl(EFI_FILE_HANDLE File, UINTN *BufferSize, VOID *Buffer) +{ + fileinfo_t *finfo =3D (fileinfo_t*)(File + 1); + size_t writesize =3D *BufferSize; + size_t resid; + int err; + + if ((err =3D finfo->fdata.f_ops->fo_write(&(finfo->fdata), Buffer, + writesize, &resid)) !=3D= 0) { + return (errno_to_efi_status(errno)); + } + + *BufferSize =3D writesize - resid; + + return (EFI_SUCCESS); +} + +static EFIAPI EFI_STATUS +file_set_position_impl(EFI_FILE_HANDLE File, UINT64 Position) +{ + fileinfo_t *finfo =3D (fileinfo_t*)(File + 1); + int res; + + if (Position !=3D 0xffffffffffffffffLL) { + res =3D finfo->fdata.f_ops->fo_seek(&(finfo->fdata), + Position, SEEK_SET); + } else { + res =3D finfo->fdata.f_ops->fo_seek(&(finfo->fdata), + 0, SEEK_END); + } + + if (res > 0) { + return (EFI_SUCCESS); + } else { + return (errno_to_efi_status(res)); + } +} + + +static EFIAPI EFI_STATUS +file_get_position_impl(EFI_FILE_HANDLE File, UINT64 *Position) +{ + fileinfo_t *finfo =3D (fileinfo_t*)(File + 1); + off_t res; + + res =3D finfo->fdata.f_ops->fo_seek(&(finfo->fdata), 0, SEEK_CUR= ); + + if (res > 0) { + *Position =3D res; + + return (EFI_SUCCESS); + } else { + return (errno_to_efi_status(errno)); + } +} + +static EFIAPI EFI_STATUS +file_get_info_impl(EFI_FILE_HANDLE File, EFI_GUID *InformationType, + UINTN *BufferSize, VOID *Buffer) +{ + fileinfo_t *finfo =3D (fileinfo_t*)(File + 1); + + if (!memcmp(InformationType, &FileInfoGUID, sizeof(EFI_GUID))) {= + EFI_FILE_INFO *out =3D (EFI_FILE_INFO*)Buffer; + UINTN str16len =3D(strlen(finfo->path) + 1) * sizeof(CHA= R16); + UINTN currsize =3D *BufferSize; + UINTN reqsize =3D sizeof(EFI_FILE_INFO) + str16len; + struct stat st; + int err; + + memset(&st, 0, sizeof(struct stat)); + *BufferSize =3D reqsize; + + if (Buffer =3D=3D NULL || + currsize < sizeof(EFI_FILE_INFO) + str16len) { + *BufferSize =3D sizeof(EFI_FILE_INFO) + str16len= ; + return (EFI_BUFFER_TOO_SMALL); + } + + if ((err =3D finfo->fdata.f_ops->fo_stat(&(finfo->fdata)= , + &st)) !=3D 0) { + return (errno_to_efi_status(errno)); + } + + out->Size =3D sizeof(EFI_FILE_INFO) + str16len; + out->FileSize =3D st.st_size; + out->PhysicalSize =3D st.st_blocks * st.st_blksize; + to_efi_time(&(out->LastAccessTime), st.st_atime); + to_efi_time(&(out->ModificationTime), st.st_mtime); + to_efi_time(&(out->CreateTime), st.st_ctime); + out->Attribute =3D mode_to_efi(st.st_mode); + + if (S_ISDIR(st.st_mode)) { + out->Attribute |=3D EFI_FILE_DIRECTORY; + } + + strcpy_to_16(out->FileName, finfo->path); + } else { + return (EFI_UNSUPPORTED); + } + + return (EFI_SUCCESS); +} + +static EFIAPI EFI_STATUS +file_set_info_impl(EFI_FILE_HANDLE File __unused, + EFI_GUID *InformationType __unused, + UINTN BufferSize __unused, VOID *Buffer __unused) +{ + return (EFI_WRITE_PROTECTED); +} + +static EFIAPI EFI_STATUS +file_flush_impl(EFI_FILE_HANDLE File __unused) +{ + return (EFI_SUCCESS); +} + +static EFIAPI EFI_STATUS +open_volume_impl(EFI_FILE_IO_INTERFACE *This, EFI_FILE_HANDLE *Root) +{ + volinfo_t *vinfo =3D (volinfo_t*)(This + 1); + + return do_file_open(vinfo, "", O_RDONLY, Root); +} + +static struct fs_ops* +fs_probe(struct devdesc *dev) +{ + struct open_file f; + int err, i; + + f.f_flags =3D O_RDONLY + 1; + f.f_dev =3D (struct devsw *)0; + f.f_ops =3D (struct fs_ops *)0; + f.f_offset =3D 0; + f.f_devdata =3D dev; + + if ((err =3D dev->d_dev->dv_open(&f, dev)) !=3D 0) { + return NULL; + } + + for (i =3D 0; backend_file_system[i] !=3D NULL; i++) { + f.f_ops =3D backend_file_system[i]; + + if ((err =3D f.f_ops->fo_open("/", &f)) =3D=3D 0) { + return backend_file_system[i]; + } + } + + return NULL; +} + +static EFI_STATUS +make_fs_file_io_iface(struct devdesc *dev, EFI_FILE_IO_INTERFACE **out) +{ + static struct fs_ops* fsops; + EFI_FILE_IO_INTERFACE* fiface; + volinfo_t *vinfo; + + switch (dev->d_type) { +#ifdef EFI_ZFS_BOOT + case DEVT_ZFS: + fsops =3D &zfs_fsops; + break; +#endif + default: + fsops =3D fs_probe(dev); + break; + } + + if (fsops =3D=3D NULL) { + return (EFI_UNSUPPORTED); + } + + fiface =3D malloc(sizeof(EFI_FILE_IO_INTERFACE) + sizeof(volinfo= _t)); + + if (fiface =3D=3D NULL) { + return (EFI_OUT_OF_RESOURCES); + } + + vinfo =3D (volinfo_t*)(fiface + 1); + + fiface->Revision =3D EFI_FILE_IO_INTERFACE_REVISION; + fiface->OpenVolume =3D open_volume_impl; + vinfo->dev =3D dev; + vinfo->fsops =3D fsops; + + *out =3D fiface; + + return (EFI_SUCCESS); +} + +static EFIAPI EFI_STATUS +bind_iface(EFI_HANDLE handle, struct devdesc *dev) +{ + EFI_STATUS status; + EFI_FILE_IO_INTERFACE *iface; + + // Check if there is already a filesystem interface + status =3D BS->OpenProtocol(handle, &SimpleFileSystemProtocolGUI= D, + NULL, IH, handle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL); + + if (!EFI_ERROR(status)) { + return (EFI_ACCESS_DENIED); + } else if (status !=3D EFI_UNSUPPORTED) { + return (status); + } + + status =3D make_fs_file_io_iface(dev, &iface); + + if (EFI_ERROR(status)) { + return (status); + } + + status =3D BS->InstallMultipleProtocolInterfaces(&handle, + &SimpleFileSystemProtocolGUID, iface, NULL); + + if (EFI_ERROR(status)) { + free(iface); + + return (status); + } + + return (status); +} + +static EFIAPI EFI_STATUS +stop_impl(EFI_DRIVER_BINDING *This __unused, EFI_HANDLE ControllerHandle= __unused, + UINTN NumberOfChildren __unused, EFI_HANDLE *ChildHandleBuffer= __unused) +{ + // Get the protocol inteface, uninstall it, and free it + return (EFI_SUCCESS); +} + +#ifdef EFI_ZFS_BOOT +static void +efi_zfs_probe(void) +{ + EFI_HANDLE h; + u_int unit; + int i; + char dname[SPECNAMELEN + 1]; + uint64_t guid; + + unit =3D 0; + h =3D efi_find_handle(&efipart_dev, 0); + for (i =3D 0; h !=3D NULL; h =3D efi_find_handle(&efipart_dev, ++i)) { + snprintf(dname, sizeof(dname), "%s%d:", efipart_dev.dv_name, i); + if (zfs_probe_dev(dname, &guid) =3D=3D 0) { + (void)efi_handle_update_dev(h, &zfs_dev, unit++, guid); + } + } +} +#endif + +static int +backend_parsedev(struct devdesc **dev, const char *devspec, const char *= *path) +{ + struct devdesc *idev; + struct devsw *dv; + char *cp; + const char *np; + int i; + + /* minimum length check */ + if (strlen(devspec) < 2) + return (EINVAL); + + /* look for a device that matches */ + for (i =3D 0; backend_devsw[i] !=3D NULL; i++) { + dv =3D backend_devsw[i]; + if (!strncmp(devspec, dv->dv_name, strlen(dv->dv_name))) + break; + } + if (backend_devsw[i] =3D=3D NULL) { + return (ENOENT); + } + + np =3D devspec + strlen(dv->dv_name); + +#ifdef EFI_ZFS_BOOT + if (dv->dv_type =3D=3D DEVT_ZFS) { + int err; + + idev =3D malloc(sizeof(struct zfs_devdesc)); + if (idev =3D=3D NULL) + return (ENOMEM); + + err =3D zfs_parsedev((struct zfs_devdesc*)idev, np, path); + if (err !=3D 0) { + free(idev); + return (err); + } + *dev =3D idev; + cp =3D strchr(np + 1, ':'); + } else +#endif + { + idev =3D malloc(sizeof(struct devdesc)); + if (idev =3D=3D NULL) + return (ENOMEM); + + idev->d_dev =3D dv; + idev->d_type =3D dv->dv_type; + idev->d_unit =3D -1; + if (*np !=3D '\0' && *np !=3D ':') { + idev->d_unit =3D strtol(np, &cp, 0); + if (cp =3D=3D np) { + idev->d_unit =3D -1; + free(idev); + return (EUNIT); + } + } + } + + if (*cp !=3D '\0' && *cp !=3D ':') { + free(idev); + return (EINVAL); + } + + if (path !=3D NULL) + *path =3D (*cp =3D=3D 0) ? cp : cp + 1; + if (dev !=3D NULL) + *dev =3D idev; + else + free(idev); + return (0); +} + +static int +backend_getdev(void **vdev, const char *devspec, const char **path) +{ + struct devdesc **dev =3D (struct devdesc **)vdev; + int rv; + + /* + * If it looks like this is just a path and no device, then + * use the current device instead. + */ + if (devspec =3D=3D NULL || *devspec =3D=3D '/' || !strchr(devspec, ':')= ) { + rv =3D backend_parsedev(dev, getenv("currdev"), NULL); + if (rv =3D=3D 0 && path !=3D NULL) + *path =3D devspec; + return (rv); + } + + /* Parse the device name off the beginning of the devspec. */ + return (backend_parsedev(dev, devspec, path)); +} + +static void +init(void) +{ + EFI_HANDLE h; + EFI_STATUS status; + u_int unit; + int i; + struct devsw *dev; + uint64_t pool_guid; + int (*old_getdev)(void **, const char *, const char **) =3D + archsw.arch_getdev; + + archsw.arch_getdev =3D backend_getdev; +#ifdef EFI_ZFS_BOOT + /* Note this needs to be set before ZFS init. */ + archsw.arch_zfs_probe =3D efi_zfs_probe; +#endif + + /* Initialize all the backend drivers */ + for (i =3D 0; backend_devsw[i] !=3D NULL; i++) { + if (backend_devsw[i]->dv_init !=3D NULL) + (backend_devsw[i]->dv_init)(); + } + + /* Attach SIMPLE_FILE_SYSTEM interfaces to all efipart devices *= / + unit =3D 0; + h =3D efi_find_handle(&efipart_dev, 0); + for (i =3D 0; h !=3D NULL; h =3D efi_find_handle(&efipart_dev, ++i)) { + struct devdesc *currdev; + + currdev =3D malloc(sizeof(struct devdesc)); + + if (currdev =3D=3D NULL) { + continue; + } + + if (efi_handle_lookup(h, &dev, &unit, &pool_guid) !=3D 0= ) { + free(currdev); + continue; + } + + currdev->d_dev =3D dev; + currdev->d_unit =3D unit; + currdev->d_opendata =3D NULL; + currdev->d_type =3D currdev->d_dev->dv_type; + + status =3D bind_iface(h, currdev); + + if (EFI_ERROR(status) && status !=3D EFI_UNSUPPORTED && + status !=3D EFI_ACCESS_DENIED) { + printf("Failed to attach filesystem interface t= o efipart%u (%ld)\n", + unit, EFI_ERROR_CODE(status)); + free(currdev); + } + } + + /* Attach SIMPLE_FILE_SYSTEM interface to all ZFS devices */ +#ifdef EFI_ZFS_BOOT + unit =3D 0; + h =3D efi_find_handle(&zfs_dev, 0); + for (i =3D 0; h !=3D NULL; h =3D efi_find_handle(&zfs_dev, ++i)) { + struct zfs_devdesc *currdev; + + currdev =3D malloc(sizeof(struct zfs_devdesc)); + + if (currdev =3D=3D NULL) { + continue; + } + + if (efi_handle_lookup(h, &dev, &unit, &pool_guid) !=3D 0= ) { + free(currdev); + continue; + } + + currdev->d_dev =3D dev; + currdev->d_unit =3D unit; + currdev->d_opendata =3D NULL; + currdev->d_type =3D currdev->d_dev->dv_type; + currdev->pool_guid =3D pool_guid; + currdev->root_guid =3D 0; + + status =3D bind_iface(h, (struct devdesc*)currdev); + + if (EFI_ERROR(status)) { + printf("Failed to attach filesystem interface to zfs%u= (%ld)\n", + unit, EFI_ERROR_CODE(status)); + } + } +#endif + archsw.arch_getdev =3D old_getdev; +} + +const efi_driver_t fs_driver =3D +{ + .name =3D "FS Backend", + .init =3D init, +}; diff --git a/sys/boot/efi/include/efilib.h b/sys/boot/efi/include/efilib.= h index 09ccc2f..15d4b48 100644 --- a/sys/boot/efi/include/efilib.h +++ b/sys/boot/efi/include/efilib.h @@ -31,22 +31,26 @@ #define _LOADER_EFILIB_H =20 #include +#include =20 extern EFI_HANDLE IH; -extern EFI_SYSTEM_TABLE *ST; +extern EFI_SYSTEM_TABLE *ST; extern EFI_BOOT_SERVICES *BS; extern EFI_RUNTIME_SERVICES *RS; =20 -extern struct devsw efipart_dev; +extern struct devsw efifs_dev; extern struct devsw efinet_dev; +extern struct fs_ops efifs_fsops; extern struct netif_driver efinetif; =20 void *efi_get_table(EFI_GUID *tbl); =20 int efi_register_handles(struct devsw *, EFI_HANDLE *, EFI_HANDLE *, int= ); +int efi_register_handle(struct devsw *, EFI_HANDLE, EFI_HANDLE); EFI_HANDLE efi_find_handle(struct devsw *, int); int efi_handle_lookup(EFI_HANDLE, struct devsw **, int *, uint64_t *); int efi_handle_update_dev(EFI_HANDLE, struct devsw *, int, uint64_t); +int efi_handle_remove_dev(EFI_HANDLE); =20 EFI_DEVICE_PATH *efi_lookup_image_devpath(EFI_HANDLE); EFI_DEVICE_PATH *efi_lookup_devpath(EFI_HANDLE); @@ -57,6 +61,7 @@ CHAR16 *efi_devpath_name(EFI_DEVICE_PATH *); void efi_free_devpath_name(CHAR16 *); =20 int efi_status_to_errno(EFI_STATUS); +EFI_STATUS errno_to_efi_status(int errno); =20 void efi_time_init(void); void efi_time_fini(void); @@ -65,4 +70,7 @@ EFI_STATUS main(int argc, CHAR16 *argv[]); void exit(EFI_STATUS status); void delay(int usecs); =20 +time_t from_efi_time(EFI_TIME *efi_time); +void to_efi_time(EFI_TIME *efi_time, time_t time); + #endif /* _LOADER_EFILIB_H */ diff --git a/sys/boot/efi/include/efiprot.h b/sys/boot/efi/include/efipro= t.h index 28cec59..2221577 100644 --- a/sys/boot/efi/include/efiprot.h +++ b/sys/boot/efi/include/efiprot.h @@ -27,6 +27,8 @@ Revision History =20 --*/ =20 +#include + // // Device Path protocol // @@ -307,9 +309,9 @@ typedef struct { // // The FileName field of the EFI_FILE_INFO data structure is variable le= ngth. // Whenever code needs to know the size of the EFI_FILE_INFO data struct= ure, it needs to -// be the size of the data structure without the FileName field. The fo= llowing macro=20 +// be the size of the data structure without the FileName field. The fo= llowing macro // computes this size correctly no matter how big the FileName array is = declared. -// This is required to make the EFI_FILE_INFO data structure ANSI compil= ant.=20 +// This is required to make the EFI_FILE_INFO data structure ANSI compil= ant. // =20 #define SIZE_OF_EFI_FILE_INFO EFI_FIELD_OFFSET(EFI_FILE_INFO,FileName) @@ -329,9 +331,9 @@ typedef struct { // // The VolumeLabel field of the EFI_FILE_SYSTEM_INFO data structure is v= ariable length. // Whenever code needs to know the size of the EFI_FILE_SYSTEM_INFO data= structure, it needs -// to be the size of the data structure without the VolumeLable field. = The following macro=20 +// to be the size of the data structure without the VolumeLable field. = The following macro // computes this size correctly no matter how big the VolumeLable array = is declared. -// This is required to make the EFI_FILE_SYSTEM_INFO data structure ANSI= compilant.=20 +// This is required to make the EFI_FILE_SYSTEM_INFO data structure ANSI= compilant. // =20 #define SIZE_OF_EFI_FILE_SYSTEM_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_IN= FO,VolumeLabel) @@ -411,7 +413,7 @@ typedef struct { EFI_DEVICE_IO Write; } EFI_IO_ACCESS; =20 -typedef=20 +typedef EFI_STATUS (EFIAPI *EFI_PCI_DEVICE_PATH) ( IN struct _EFI_DEVICE_IO_INTERFACE *This, @@ -555,4 +557,47 @@ typedef struct _EFI_UNICODE_COLLATION_INTERFACE { CHAR8 *SupportedLanguages; } EFI_UNICODE_COLLATION_INTERFACE; =20 +// +// Driver Binding protocol +// + +#define DRIVER_BINDING_PROTOCOL \ + { 0x18a031ab, 0xb443, 0x4d1a, {0xa5, 0xc0, 0x0c, 0x09, 0x26, 0x1e, 0x9= f, 0x71} } + +INTERFACE_DECL(_EFI_DRIVER_BINDING); + +typedef +EFI_STATUS +(EFIAPI *EFI_DRIVER_BINDING_SUPPORTED) ( + IN struct _EFI_DRIVER_BINDING *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH *RemainingPath + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_DRIVER_BINDING_START) ( + IN struct _EFI_DRIVER_BINDING *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH *RemainingPath + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_DRIVER_BINDING_STOP) ( + IN struct _EFI_DRIVER_BINDING *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ); + +typedef struct _EFI_DRIVER_BINDING { + EFI_DRIVER_BINDING_SUPPORTED Supported; + EFI_DRIVER_BINDING_START Start; + EFI_DRIVER_BINDING_STOP Stop; + UINT32 Version; + EFI_HANDLE ImageHandle; + EFI_HANDLE DriverBindingHandle; +} EFI_DRIVER_BINDING; + #endif diff --git a/sys/boot/efi/include/string16.h b/sys/boot/efi/include/strin= g16.h new file mode 100644 index 0000000..5e4f9c1 --- /dev/null +++ b/sys/boot/efi/include/string16.h @@ -0,0 +1,45 @@ +/*- + * Copyright (c) 2016 Eric McCorkle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in th= e + * documentation and/or other materials provided with the distributio= n. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN= D + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE= + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB= LE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE= NTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO= DS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)= + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S= TRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY= WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O= F + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _STRING16_H_ +#define _STRING16_H_ + +#include +#include + +/* + * These are 16-bit variants of string,h functions for use with EFI code= =2E + */ + +extern size_t strlen16(const CHAR16 *str); +extern CHAR16* strcpy16(CHAR16 *dst, const CHAR16 *src); +extern CHAR16* stpcpy16(CHAR16 *dst, const CHAR16 *src); +extern CHAR16* strcpy_to_16(CHAR16 *dst, const char *src); +extern char* strcpy_from_16(char *dst, const CHAR16 *src); + +#endif diff --git a/sys/boot/efi/libefi/Makefile b/sys/boot/efi/libefi/Makefile index d9619be..8684403 100644 --- a/sys/boot/efi/libefi/Makefile +++ b/sys/boot/efi/libefi/Makefile @@ -10,8 +10,8 @@ LIB=3D efi INTERNALLIB=3D WARNS?=3D 2 =20 -SRCS=3D delay.c devpath.c efi_console.c efinet.c efipart.c errno.c \ - handles.c libefi.c +SRCS=3D delay.c devpath.c efi_console.c efifs.c efinet.c env.c errno.c \= + handles.c libefi.c string16.c =20 .if ${MACHINE_CPUARCH} =3D=3D "amd64" || ${MACHINE_CPUARCH} =3D=3D "i386= " SRCS+=3D time.c diff --git a/sys/boot/efi/libefi/efifs.c b/sys/boot/efi/libefi/efifs.c new file mode 100644 index 0000000..dd9fb0f --- /dev/null +++ b/sys/boot/efi/libefi/efifs.c @@ -0,0 +1,464 @@ +/*- + * Copyright (c) 2016 Eric McCorkle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in th= e + * documentation and/or other materials provided with the distributio= n. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN= D + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE= + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB= LE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE= NTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO= DS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)= + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S= TRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY= WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O= F + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include +#include +#include +#include +#include + +static EFI_GUID FileInfoGUID =3D EFI_FILE_INFO_ID;; +static EFI_GUID SimpleFileSystemProtocolGUID =3D SIMPLE_FILE_SYSTEM_PROT= OCOL; +static EFI_GUID BlockIoProtocolGUID =3D BLOCK_IO_PROTOCOL; +static EFI_GUID DevicePathGUID =3D DEVICE_PATH_PROTOCOL; + +static int efifs_open(const char *path, struct open_file *f); +static int efifs_write(struct open_file *f, void *buf, size_t size, size= _t *resid); +static int efifs_close(struct open_file *f); +static int efifs_read(struct open_file *f, void *buf, size_t size, size_= t *resid); +static off_t efifs_seek(struct open_file *f, off_t offset, int where); +static int efifs_stat(struct open_file *f, struct stat *sb); +static int efifs_readdir(struct open_file *f, struct dirent *d); + +static int efifs_dev_init(void); +static int efifs_dev_strategy(void *, int, daddr_t, size_t, size_t, char= *, size_t *); +static int efifs_dev_open(struct open_file *, ...); +static int efifs_dev_close(struct open_file *); +static int efifs_dev_print(int); + +struct devsw efifs_dev =3D { + .dv_name =3D "EFI", + .dv_type =3D DEVT_EFI, + .dv_init =3D efifs_dev_init, + .dv_strategy =3D efifs_dev_strategy, + .dv_open =3D efifs_dev_open, + .dv_close =3D efifs_dev_close, + .dv_ioctl =3D noioctl, + .dv_print =3D efifs_dev_print, + .dv_cleanup =3D NULL +}; + +struct fs_ops efifs_fsops =3D { + "EFI", + efifs_open, + efifs_close, + efifs_read, + efifs_write, + efifs_seek, + efifs_stat, + efifs_readdir +}; + +static int +efifs_dev_init(void) +{ + EFI_HANDLE *hin; + EFI_STATUS status; + UINTN sz; + u_int n, nin, unit; + int err; + + sz =3D 0; + hin =3D NULL; + status =3D BS->LocateHandle(ByProtocol, &SimpleFileSystemProtocolGUID, + 0, &sz, 0); + if (status =3D=3D EFI_BUFFER_TOO_SMALL) { + hin =3D (EFI_HANDLE *)malloc(sz); + status =3D BS->LocateHandle(ByProtocol, + &SimpleFileSystemProtocolGUID, 0, &sz, hin); + if (EFI_ERROR(status)) + free(hin); + } + if (EFI_ERROR(status)) + return (efi_status_to_errno(status)); + + /* Filter handles to only include FreeBSD partitions. */ + nin =3D sz / sizeof(EFI_HANDLE); + unit =3D 0; + + for (n =3D 0; n < nin; n++) { + status =3D BS->OpenProtocol(hin[n], &SimpleFileSystemProtocolGUID, + NULL, IH, NULL, + EFI_OPEN_PROTOCOL_TEST_PROTOCO= L); + if (EFI_ERROR(status)) + continue; + + efi_handle_update_dev(hin[n], &efifs_dev, unit++, 0); + } + + free(hin); + return (err); +} + + +static int +efifs_dev_print(int verbose) +{ + char line[80]; + EFI_DEVICE_PATH *devpath; + EFI_BLOCK_IO *blkio; + EFI_HANDLE h, *hin; + EFI_STATUS status; + u_int unit, n; + + for (unit =3D 0, h =3D efi_find_handle(&efifs_dev, 0); + h !=3D NULL; h =3D efi_find_handle(&efifs_dev, ++unit)) { + sprintf(line, " %s%d:", efifs_dev.dv_name, unit); + pager_output(line); + pager_output(" EFI(SIMPLE_FILE_SYSTEM"); + + status =3D BS->HandleProtocol(hin[n], &DevicePathGUID, + (void **)&devpath); + if (!EFI_ERROR(status)) { + pager_output(", DEVICE_PATH"); + } + + status =3D BS->HandleProtocol(hin[n], &BlockIoProtocolGUID, + (void **)&blkio); + if (!EFI_ERROR(status)) { + pager_output(", BLOCK_IO"); + } + pager_output(")\n"); + } + return (0); +} + +static int +efifs_dev_open(struct open_file *f, ...) +{ + va_list args; + struct devdesc *dev; + EFI_FILE_IO_INTERFACE *fsiface; + EFI_HANDLE h; + EFI_STATUS status; + + va_start(args, f); + dev =3D va_arg(args, struct devdesc*); + va_end(args); + + h =3D efi_find_handle(&efifs_dev, dev->d_unit); + + if (h =3D=3D NULL) + return (EINVAL); + + status =3D BS->OpenProtocol(h, &SimpleFileSystemProtocolGUID, + (void**)&fsiface, IH, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);= + + if (EFI_ERROR(status)) { + return (efi_status_to_errno(status)); + } + + dev->d_opendata =3D fsiface; + return (0); +} + +static int +efifs_dev_close(struct open_file *f) +{ + struct devdesc *dev; + EFI_HANDLE h; + EFI_STATUS status; + + dev =3D (struct devdesc *)(f->f_devdata); + h =3D efi_find_handle(&efifs_dev, dev->d_unit); + + if (h =3D=3D NULL) + return (EINVAL); + + if (dev->d_opendata =3D=3D NULL) + return (EINVAL); + + status =3D BS->CloseProtocol(h, &SimpleFileSystemProtocolGUID, I= H, NULL); + + if (EFI_ERROR(status)) + return (efi_status_to_errno(status)); + + dev->d_opendata =3D NULL; + return (0); +} + + +/* Raw I/O isn't supported on EFI FS devices, as they talk through + * SIMPLE_FILE_SYSTEM_INTERFACE. + */ +static int +efifs_dev_strategy(void *devdata __unused, int rw __unused, daddr_t blk = __unused, + size_t offset, size_t size __unused, char *buf __unus= ed, + size_t *rsize __unused) +{ + printf("Raw I/O not supported on EFI FS interface\n"); + return ENOTSUP; +} + +/* + * Open a file. + */ +static int +efifs_open(const char *upath, struct open_file *f) +{ + struct devdesc *dev; + EFI_FILE_IO_INTERFACE *fsiface; + EFI_FILE_HANDLE root; + EFI_STATUS status; + CHAR16 path[strlen(upath) + 1]; + + dev =3D (struct devdesc *)(f->f_devdata); + fsiface =3D dev->d_opendata; + + if (!strcmp(upath, "") || !strcmp(upath, "/")) { + return (fsiface->OpenVolume(fsiface, + (EFI_FILE_HANDLE*)&(f->f_fsd= ata))); + } else { + status =3D fsiface->OpenVolume(fsiface, &root); + + if (EFI_ERROR(status)) { + return (efi_status_to_errno(status)); + } + + strcpy_to_16(path, upath); + status =3D root->Open(root, (EFI_FILE_HANDLE*)&(f->f_fsd= ata), path, + EFI_FILE_MODE_READ, 0); + + root->Close(root); + + if (EFI_ERROR(status)) { + return (efi_status_to_errno(status)); + } + + return 0; + } +} + +static int +efifs_close(struct open_file *f) +{ + EFI_FILE_HANDLE file =3D (EFI_FILE_HANDLE)f->f_fsdata; + EFI_STATUS status; + + status =3D file->Close(file); + + if (EFI_ERROR(status)) + return (efi_status_to_errno(status)); + + return (0); +} + +static int +efifs_read(struct open_file *f, void *start, size_t size, size_t *resid = /* out */) +{ + EFI_FILE_HANDLE file =3D (EFI_FILE_HANDLE)f->f_fsdata; + UINTN readsize =3D size; + EFI_STATUS status; + + status =3D file->Read(file, &readsize, start); + + if (EFI_ERROR(status)) + return (efi_status_to_errno(status)); + + if (resid) + *resid =3D size - readsize; + + return (0); +} + +static int +efifs_write(struct open_file *f, void *start, size_t size, + size_t *resid /* out */) +{ + EFI_FILE_HANDLE file =3D (EFI_FILE_HANDLE)f->f_fsdata; + UINTN writesize =3D size; + EFI_STATUS status; + + status =3D file->Write(file, &writesize, start); + + if (EFI_ERROR(status)) + return (efi_status_to_errno(status)); + + if (resid) + *resid =3D size - writesize; + + return (0); +} + +static off_t +efifs_seek(struct open_file *f, off_t offset, int where) +{ + EFI_FILE_HANDLE file =3D (EFI_FILE_HANDLE)f->f_fsdata; + UINT64 pos; + EFI_STATUS status; + + switch (where) { + case SEEK_SET: + status =3D file->SetPosition(file, offset); + + if (status !=3D EFI_SUCCESS) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + + break; + case SEEK_CUR: + status =3D file->GetPosition(file, &pos); + + if (status !=3D EFI_SUCCESS) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + + status =3D file->SetPosition(file, pos + offset); + + if (status !=3D EFI_SUCCESS) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + + break; + case SEEK_END: + status =3D file->SetPosition(file, 0xffffffffffffffff); + + if (status !=3D EFI_SUCCESS) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + default: + errno =3D EINVAL; + return (-1); + } + + status =3D file->GetPosition(file, &pos); + + if (status !=3D EFI_SUCCESS) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + + return (pos); +} + +/* SIMPLE_FILE_SYSTEM_PROTOCOL is geared towards FAT, so we can't + * reproduce stat with absolute fidelity. + */ +static int +efifs_stat(struct open_file *f, struct stat *sb) +{ + EFI_FILE_HANDLE file; + UINTN size =3D 0; + EFI_FILE_INFO *finfo;; + EFI_STATUS status; + + file =3D (EFI_FILE_HANDLE)f->f_fsdata; + status =3D file->GetInfo(file, &FileInfoGUID, &size, NULL); + + if (status !=3D EFI_BUFFER_TOO_SMALL) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + + finfo =3D malloc(size); + status =3D file->GetInfo(file, &FileInfoGUID, &size, finfo); + + if (status !=3D EFI_SUCCESS) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + + /* We can't properly fill these in... */ + sb->st_ino =3D 0; + sb->st_nlink =3D 0; + sb->st_uid =3D 0; + sb->st_gid =3D 0; + sb->st_blksize =3D 512; + /* Build the mode field */ + if (finfo->Attribute & EFI_FILE_DIRECTORY) { + sb->st_mode =3D S_IFDIR; + } else { + sb->st_mode =3D S_IFREG; + } + + if (finfo->Attribute & EFI_FILE_MODE_READ) { + sb->st_mode =3D S_IRUSR | S_IXUSR | S_IRGRP | + S_IXGRP | S_IROTH | S_IXOTH; + } + + if (finfo->Attribute & EFI_FILE_MODE_READ) { + sb->st_mode =3D S_IWUSR | S_IWGRP | S_IWOTH; + } + /* This may or may not be supported, depending on the FS driver = */ + sb->st_blocks =3D finfo->PhysicalSize / 512; + /* These fields we can get right */ + sb->st_size =3D finfo->FileSize; + sb->st_atime =3D from_efi_time(&(finfo->LastAccessTime)); + sb->st_mtime =3D from_efi_time(&(finfo->ModificationTime)); + sb->st_ctime =3D from_efi_time(&(finfo->CreateTime)); + + free(finfo); + + return (0); +} + +static int +efifs_readdir(struct open_file *f, struct dirent *d) +{ + EFI_FILE_HANDLE file; + UINTN size =3D 0; + EFI_FILE_INFO *finfo;; + EFI_STATUS status; + + file =3D (EFI_FILE_HANDLE)f->f_fsdata; + status =3D file->Read(file, &size, NULL); + + if (status !=3D EFI_BUFFER_TOO_SMALL) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + + if (size =3D=3D 0) { + return (ENOENT); + } + + finfo =3D malloc(size); + status =3D file->Read(file, &size, finfo); + + if (status !=3D EFI_SUCCESS) { + errno =3D (efi_status_to_errno(status)); + return -1; + } + + strcpy_from_16(d->d_name, finfo->FileName); + d->d_namlen =3D strlen(d->d_name); + d->d_reclen =3D sizeof(struct dirent); + /* We can't faithfully reproduce this due to the limitations + * of the SIMPLE_FILE_SYSTEM interface */ + d->d_fileno =3D 0; + + free(finfo); + + return (0); +} diff --git a/sys/boot/efi/libefi/errno.c b/sys/boot/efi/libefi/errno.c index fac903f..0f354c3 100644 --- a/sys/boot/efi/libefi/errno.c +++ b/sys/boot/efi/libefi/errno.c @@ -30,6 +30,69 @@ __FBSDID("$FreeBSD$"); #include #include =20 +EFI_STATUS +errno_to_efi_status(int errno) +{ + EFI_STATUS status; + + switch (errno) { + case EPERM: + status =3D EFI_ACCESS_DENIED; + break; + + case EOVERFLOW: + status =3D EFI_BUFFER_TOO_SMALL; + break; + + case EIO: + status =3D EFI_DEVICE_ERROR; + break; + + case EINVAL: + status =3D EFI_INVALID_PARAMETER; + break; + + case ESTALE: + status =3D EFI_MEDIA_CHANGED; + break; + + case ENXIO: + status =3D EFI_NO_MEDIA; + break; + + case ENOENT: + status =3D EFI_NOT_FOUND; + break; + + case ENOMEM: + status =3D EFI_OUT_OF_RESOURCES; + break; + + case ENOTSUP: + case ENODEV: + status =3D EFI_UNSUPPORTED; + break; + + case ENOSPC: + status =3D EFI_VOLUME_FULL; + break; + + case EACCES: + status =3D EFI_WRITE_PROTECTED; + break; + + case 0: + status =3D EFI_SUCCESS; + break; + + default: + status =3D EFI_DEVICE_ERROR; + break; + } + + return (status); +} + int efi_status_to_errno(EFI_STATUS status) { diff --git a/sys/boot/efi/libefi/handles.c b/sys/boot/efi/libefi/handles.= c index 1e4ef6f..c118085 100644 --- a/sys/boot/efi/libefi/handles.c +++ b/sys/boot/efi/libefi/handles.c @@ -41,21 +41,36 @@ struct entry { struct entry *entry; int nentries; =20 +static int +get_next_unit(struct devsw *sw) +{ + int i, idx; + + for (i =3D 0, idx =3D 0; i < nentries; i++) { + if (entry[i].dev =3D=3D sw) { + idx++; + } + } + + return (idx); +} + int efi_register_handles(struct devsw *sw, EFI_HANDLE *handles, EFI_HANDLE *aliases, int count) { size_t sz; - int idx, unit; + int idx, unit, i; =20 idx =3D nentries; nentries +=3D count; sz =3D nentries * sizeof(struct entry); + unit =3D get_next_unit(sw); entry =3D (entry =3D=3D NULL) ? malloc(sz) : realloc(entry, sz); - for (unit =3D 0; idx < nentries; idx++, unit++) { - entry[idx].handle =3D handles[unit]; + for (i =3D 0; idx < nentries; idx++, unit++, i++) { + entry[idx].handle =3D handles[i]; if (aliases !=3D NULL) - entry[idx].alias =3D aliases[unit]; + entry[idx].alias =3D aliases[i]; else entry[idx].alias =3D NULL; entry[idx].dev =3D sw; @@ -64,6 +79,16 @@ efi_register_handles(struct devsw *sw, EFI_HANDLE *han= dles, return (0); } =20 +int +efi_register_handle(struct devsw *sw, EFI_HANDLE handle, EFI_HANDLE alia= s) +{ + if (alias =3D=3D NULL) { + return efi_register_handles(sw, &handle, NULL, 1); + } else { + return efi_register_handles(sw, &handle, &alias, 1); + } +} + EFI_HANDLE efi_find_handle(struct devsw *dev, int unit) { @@ -116,3 +141,29 @@ efi_handle_update_dev(EFI_HANDLE h, struct devsw *de= v, int unit, =20 return (ENOENT); } + +int +efi_handle_remove_dev(EFI_HANDLE h) +{ + int idx; + + /* Find the entry */ + for (idx =3D 0; idx < nentries; idx++) { + if (entry[idx].handle !=3D h) + continue; + } + + if (idx >=3D nentries) + return (ENOENT); + else if (idx =3D=3D nentries - 1) { + nentries--; + entry =3D realloc(entry, nentries * sizeof(struct entry)= ); + } else { + memcpy(entry + idx, entry + idx + 1, + sizeof(struct entry) * (nentries - (idx + 1))); + nentries--; + entry =3D realloc(entry, nentries * sizeof(struct entry)= ); + } + + return (0); +} diff --git a/sys/boot/efi/libefi/string16.c b/sys/boot/efi/libefi/string1= 6.c new file mode 100644 index 0000000..299d72d --- /dev/null +++ b/sys/boot/efi/libefi/string16.c @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 2016 Eric McCorkle + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in th= e + * documentation and/or other materials provided with the distributio= n. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN= D + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE= + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIAB= LE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE= NTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO= DS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)= + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S= TRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY= WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O= F + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include "string16.h" +#include + +size_t +strlen16(const CHAR16 *str) +{ + size_t i; + + for (i =3D 0; str[i] !=3D 0; i++); + + return i; +} + +CHAR16 * +strcpy16(CHAR16 *dst, const CHAR16 *src) +{ + stpcpy16(dst, src); + + return (dst); +} + +CHAR16 * +stpcpy16(CHAR16 *dst, const CHAR16 *src) +{ + for (; *src !=3D 0; src++, dst++) { + *dst =3D *src; + } + + *dst =3D *src; + + return dst; +} + +char * +strcpy_from_16(char *dst, const CHAR16 *src) +{ + int i; + + for (i =3D 0; src[i] !=3D 0; i++) { + dst[i] =3D src[i]; + } + + dst[i] =3D 0; + + return (dst); +} + +CHAR16 * +strcpy_to_16(CHAR16 *dst, const char *src) +{ + int i; + + for (i =3D 0; src[i] !=3D 0; i++) { + dst[i] =3D src[i]; + } + + dst[i] =3D 0; + + return (dst); +} diff --git a/sys/boot/efi/libefi/time.c b/sys/boot/efi/libefi/time.c index 99831e1..2df466e 100644 --- a/sys/boot/efi/libefi/time.c +++ b/sys/boot/efi/libefi/time.c @@ -2,28 +2,28 @@ * Copyright (c) 1999, 2000 * Intel Corporation. * All rights reserved. - *=20 + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: - *=20 + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - *=20 + * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in th= e * documentation and/or other materials provided with the distributio= n. - *=20 + * * 3. All advertising materials mentioning features or use of this softw= are * must display the following acknowledgement: - *=20 + * * This product includes software developed by Intel Corporation and * its contributors. - *=20 + * * 4. Neither the name of Intel Corporation or its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. - *=20 + * * THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS = IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,= THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU= RPOSE @@ -35,7 +35,7 @@ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWIS= E) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED O= F * THE POSSIBILITY OF SUCH DAMAGE. - *=20 + * */ =20 #include @@ -58,6 +58,41 @@ __FBSDID("$FreeBSD$"); #define SECSPERHOUR ( 60*60 ) #define SECSPERDAY (24 * SECSPERHOUR) =20 +/* +// These arrays give the cumulative number of days up to the first of t= he +// month number used as the index (1 -> 12) for regular and leap years.= +// The value at index 13 is for the whole year. +*/ +static const time_t CumulativeDays[2][14] =3D { + {0, + 0, + 31, + 31 + 28, + 31 + 28 + 31, + 31 + 28 + 31 + 30, + 31 + 28 + 31 + 30 + 31, + 31 + 28 + 31 + 30 + 31 + 30, + 31 + 28 + 31 + 30 + 31 + 30 + 31, + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31, + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30, + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30, + 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 }, + {0, + 0, + 31, + 31 + 29, + 31 + 29 + 31, + 31 + 29 + 31 + 30, + 31 + 29 + 31 + 30 + 31, + 31 + 29 + 31 + 30 + 31 + 30, + 31 + 29 + 31 + 30 + 31 + 30 + 31, + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31, + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30, + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30, + 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 }}; + void efi_time_init(void) { @@ -68,45 +103,46 @@ efi_time_fini(void) { } =20 -static time_t -efi_time(EFI_TIME *ETime) +void +to_efi_time(EFI_TIME *efi_time, time_t time) { - /* - // These arrays give the cumulative number of days up to the first = of the - // month number used as the index (1 -> 12) for regular and leap ye= ars. - // The value at index 13 is for the whole year. - */ - static time_t CumulativeDays[2][14] =3D { - {0, - 0, - 31, - 31 + 28, - 31 + 28 + 31, - 31 + 28 + 31 + 30, - 31 + 28 + 31 + 30 + 31, - 31 + 28 + 31 + 30 + 31 + 30, - 31 + 28 + 31 + 30 + 31 + 30 + 31, - 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31, - 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30, - 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, - 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30, - 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 }, - {0, - 0, - 31, - 31 + 29, - 31 + 29 + 31, - 31 + 29 + 31 + 30, - 31 + 29 + 31 + 30 + 31, - 31 + 29 + 31 + 30 + 31 + 30, - 31 + 29 + 31 + 30 + 31 + 30 + 31, - 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31, - 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30, - 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31, - 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30, - 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 }}; - - time_t UTime;=20 + if (time >=3D 0) { + for (efi_time->Year =3D 1970; + time > CumulativeDays[isleap(efi_time->Year)][13] * = SECSPERDAY; + time -=3D CumulativeDays[isleap(efi_time->Year)][13]= * SECSPERDAY, + efi_time->Year++); + + for (efi_time->Month =3D 0; + time > CumulativeDays[isleap(efi_time->Year)][efi_ti= me->Month] * + SECSPERDAY; + efi_time->Month++); + + time -=3D CumulativeDays[isleap(efi_time->Year)][efi_tim= e->Month - 1] * + SECSPERDAY; + + for (efi_time->Day =3D 0; time > SECSPERDAY; + time -=3D SECSPERDAY, efi_time->Day++); + + for (efi_time->Hour =3D 0; time > SECSPERHOUR; + time -=3D SECSPERHOUR, efi_time->Hour++); + + for (efi_time->Minute =3D 0; time > 60; + time -=3D 60, efi_time->Minute++); + + efi_time->Second =3D time; + efi_time->Nanosecond =3D 0; + efi_time->TimeZone =3D 0; + efi_time->Daylight =3D 0; + } else { + memset(efi_time, 0, sizeof(EFI_TIME)); + } +} + +time_t +from_efi_time(EFI_TIME *ETime) +{ + + time_t UTime; int Year; =20 /* @@ -134,7 +170,7 @@ efi_time(EFI_TIME *ETime) /* // UTime should now be set to 00:00:00 on Jan 1 of the file's year. // - // Months =20 + // Months */ UTime +=3D (CumulativeDays[isleap(ETime->Year)][ETime->Month] * SECS= PERDAY); =20 @@ -170,7 +206,7 @@ efi_time(EFI_TIME *ETime) */ UTime +=3D (ETime->TimeZone * 60); } - =20 + return UTime; } =20 @@ -196,7 +232,7 @@ EFI_GetTimeOfDay( // Convert to UNIX time (ie seconds since the epoch */ =20 - tp->tv_sec =3D efi_time( &EfiTime ); + tp->tv_sec =3D from_efi_time( &EfiTime ); tp->tv_usec =3D 0; /* EfiTime.Nanosecond * 1000; */ =20 /* @@ -221,7 +257,7 @@ time(time_t *tloc) { struct timeval tv; EFI_GetTimeOfDay(&tv, 0); -=09 + if (tloc) *tloc =3D tv.tv_sec; return tv.tv_sec; diff --git a/sys/boot/efi/loader/Makefile b/sys/boot/efi/loader/Makefile index d9d3532..300c65b 100644 --- a/sys/boot/efi/loader/Makefile +++ b/sys/boot/efi/loader/Makefile @@ -50,6 +50,7 @@ CWARNFLAGS.main.c+=3D -Wno-format CFLAGS+=3D -I${.CURDIR} CFLAGS+=3D -I${.CURDIR}/arch/${MACHINE} CFLAGS+=3D -I${.CURDIR}/../include +CFLAGS+=3D -I${.CURDIR}/../drivers CFLAGS+=3D -I${.CURDIR}/../include/${MACHINE} CFLAGS+=3D -I${.CURDIR}/../../../contrib/dev/acpica/include CFLAGS+=3D -I${.CURDIR}/../../.. @@ -68,6 +69,8 @@ CFLAGS+=3D -DNO_PCI -DEFI LIBSTAND=3D ${.OBJDIR}/../../../../lib/libstand/libstand.a .endif =20 +LIBEFI_DRIVERS=3D ${.OBJDIR}/../drivers/libefi_drivers.a + .if !defined(BOOT_HIDE_SERIAL_NUMBERS) # Export serial numbers, UUID, and asset tag from loader. CFLAGS+=3D -DSMBIOS_SERIAL_NUMBERS @@ -150,9 +153,10 @@ loader.efi: ${PROG} =20 LIBEFI=3D ${.OBJDIR}/../libefi/libefi.a =20 -DPADD=3D ${LIBFICL} ${LIBEFI} ${LIBFDT} ${LIBEFI_FDT} ${LIBSTAND} \ - ${LDSCRIPT} -LDADD=3D ${LIBFICL} ${LIBEFI} ${LIBFDT} ${LIBEFI_FDT} ${LIBSTAND} +DPADD=3D ${LIBFICL} ${LIBEFI} ${LIBEFI_DRIVERS} ${LIBFDT} ${LIBEFI_FDT}= \ + ${LIBSTAND} ${LDSCRIPT} +LDADD=3D ${LIBFICL} ${LIBEFI} ${LIBEFI_DRIVERS} ${LIBFDT} ${LIBEFI_FDT}= \ + ${LIBSTAND} =20 .include =20 diff --git a/sys/boot/efi/loader/conf.c b/sys/boot/efi/loader/conf.c index 3596a63..56733ff 100644 --- a/sys/boot/efi/loader/conf.c +++ b/sys/boot/efi/loader/conf.c @@ -31,30 +31,22 @@ __FBSDID("$FreeBSD$"); #include #include #include -#ifdef EFI_ZFS_BOOT -#include -#endif + +#include "efi_drivers.h" + +const efi_driver_t *efi_drivers[] =3D { + &fs_driver, + NULL +}; =20 struct devsw *devsw[] =3D { - &efipart_dev, + &efifs_dev, &efinet_dev, -#ifdef EFI_ZFS_BOOT - &zfs_dev, -#endif NULL }; =20 struct fs_ops *file_system[] =3D { -#ifdef EFI_ZFS_BOOT - &zfs_fsops, -#endif - &dosfs_fsops, - &ufs_fsops, - &cd9660_fsops, - &tftp_fsops, - &nfs_fsops, - &gzipfs_fsops, - &bzipfs_fsops, + &efifs_fsops, NULL }; =20 diff --git a/sys/boot/efi/loader/loader_efi.h b/sys/boot/efi/loader/loade= r_efi.h index ee7c4bb..dbd36bf 100644 --- a/sys/boot/efi/loader/loader_efi.h +++ b/sys/boot/efi/loader/loader_efi.h @@ -33,6 +33,10 @@ =20 #include =20 +#include "efi_drivers.h" + +extern const efi_driver_t *efi_drivers[]; + int efi_autoload(void); =20 int efi_getdev(void **vdev, const char *devspec, const char **path); diff --git a/sys/boot/efi/loader/main.c b/sys/boot/efi/loader/main.c index b97f2af..42e3ebe1 100644 --- a/sys/boot/efi/loader/main.c +++ b/sys/boot/efi/loader/main.c @@ -87,10 +87,6 @@ EFI_GUID debugimg =3D DEBUG_IMAGE_INFO_TABLE_GUID; EFI_GUID fdtdtb =3D FDT_TABLE_GUID; EFI_GUID inputid =3D SIMPLE_TEXT_INPUT_PROTOCOL; =20 -#ifdef EFI_ZFS_BOOT -static void efi_zfs_probe(void); -#endif - /* * cpy8to16 copies a traditional C string into a CHAR16 string and * 0 terminates it. len is the size of *dst in bytes. @@ -125,7 +121,7 @@ has_keyboard(void) EFI_HANDLE *hin, *hin_end, *walker; UINTN sz; int retval =3D 0; -=09 + /* * Find all the handles that support the SIMPLE_TEXT_INPUT_PROTOCOL and= * do the typical dance to get the right sized buffer. @@ -182,7 +178,7 @@ has_keyboard(void) } else if (DevicePathType(path) =3D=3D MESSAGING_DEVICE_PATH && DevicePathSubType(path) =3D=3D MSG_USB_CLASS_DP) { USB_CLASS_DEVICE_PATH *usb; - =20 + usb =3D (USB_CLASS_DEVICE_PATH *)(void *)path; if (usb->DeviceClass =3D=3D 3 && /* HID */ usb->DeviceSubClass =3D=3D 1 && /* Boot devices */ @@ -263,10 +259,6 @@ main(int argc, CHAR16 *argv[]) archsw.arch_copyin =3D efi_copyin; archsw.arch_copyout =3D efi_copyout; archsw.arch_readin =3D efi_readin; -#ifdef EFI_ZFS_BOOT - /* Note this needs to be set before ZFS init. */ - archsw.arch_zfs_probe =3D efi_zfs_probe; -#endif =20 /* Init the time source */ efi_time_init(); @@ -391,6 +383,10 @@ main(int argc, CHAR16 *argv[]) /* * March through the device switch probing for things. */ + for (i =3D 0; efi_drivers[i] !=3D NULL; i++) + if (efi_drivers[i]->init !=3D NULL) + (efi_drivers[i]->init)(); + for (i =3D 0; devsw[i] !=3D NULL; i++) if (devsw[i]->dv_init !=3D NULL) (devsw[i]->dv_init)(); @@ -427,6 +423,7 @@ main(int argc, CHAR16 *argv[]) if (find_currdev(img, &dev, &unit, &pool_guid) !=3D 0) return (EFI_NOT_FOUND); =20 + printf("Found efi device under %s\n", dev->dv_name); switch (dev->dv_type) { #ifdef EFI_ZFS_BOOT case DEVT_ZFS: { @@ -1093,23 +1090,3 @@ command_fdt(int argc, char *argv[]) =20 COMMAND_SET(fdt, "fdt", "flattened device tree handling", command_fdt); #endif - -#ifdef EFI_ZFS_BOOT -static void -efi_zfs_probe(void) -{ - EFI_HANDLE h; - u_int unit; - int i; - char dname[SPECNAMELEN + 1]; - uint64_t guid; - - unit =3D 0; - h =3D efi_find_handle(&efipart_dev, 0); - for (i =3D 0; h !=3D NULL; h =3D efi_find_handle(&efipart_dev, ++i)) { - snprintf(dname, sizeof(dname), "%s%d:", efipart_dev.dv_name, i); - if (zfs_probe_dev(dname, &guid) =3D=3D 0) - (void)efi_handle_update_dev(h, &zfs_dev, unit++, guid); - } -} -#endif --------------689B5840033FA59B553C984F-- --7wWD2JXas7wNKFk1Kr7Jd8JHbiuG3wULI-- --2nIKx7PRAmhO47MXFmT0MDKUV6UMsh1v9 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- iF4EARYIAAYFAlhBqUEACgkQVsKIQKqABI0NwwD+O1MDmogaR5FqsK+h8rSwmZNi dwlYfTF2UPTht+5a2o4A/jhsOjEJ94T0YMrmbe2ly2cq708HCkidkkRtMjE/CbwM =gnu+ -----END PGP SIGNATURE----- --2nIKx7PRAmhO47MXFmT0MDKUV6UMsh1v9-- From owner-freebsd-amd64@freebsd.org Fri Dec 2 21:35:47 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id BA840C63707 for ; Fri, 2 Dec 2016 21:35:47 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A93511E87 for ; Fri, 2 Dec 2016 21:35:47 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB2LZlHv001091 for ; Fri, 2 Dec 2016 21:35:47 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 212020] Add powerd(8) support for newer AMD CPUs Date: Fri, 02 Dec 2016 21:35:47 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: CURRENT X-Bugzilla-Keywords: patch X-Bugzilla-Severity: Affects Many People X-Bugzilla-Who: commit-hook@freebsd.org X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2016 21:35:47 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D212020 --- Comment #2 from commit-hook@freebsd.org --- A commit references this bug: Author: jhb Date: Fri Dec 2 21:35:15 UTC 2016 New revision: 309443 URL: https://svnweb.freebsd.org/changeset/base/309443 Log: MFC 308005: Add powerd(8) support for several families of AMD CPUs. Use the same logic to calculate the nominal CPU frequency from the P-state MSRs on family 0x12, 0x15, and 0x16 CPUs as is used for family 0x10. Family 0x14 was included in the original patch in the PR but I left that out as the BIOS writer's guide for family 0x14 CPUs show a different layo= ut for the relevant MSR and include a different formulate for calculating the frequency. While here, simplify a few expressions and print out the family of unsupported CPUs in hex rather than decimal. PR: 212020 Changes: _U stable/10/ stable/10/sys/x86/cpufreq/hwpstate.c _U stable/11/ stable/11/sys/x86/cpufreq/hwpstate.c --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Fri Dec 2 22:03:19 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C3006C62355 for ; Fri, 2 Dec 2016 22:03:19 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B2C7414AA for ; Fri, 2 Dec 2016 22:03:19 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB2M3JuM003505 for ; Fri, 2 Dec 2016 22:03:19 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 212020] Add powerd(8) support for newer AMD CPUs Date: Fri, 02 Dec 2016 22:03:19 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: CURRENT X-Bugzilla-Keywords: patch X-Bugzilla-Severity: Affects Many People X-Bugzilla-Who: jhb@FreeBSD.org X-Bugzilla-Status: Closed X-Bugzilla-Resolution: FIXED X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: cc resolution bug_status Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Dec 2016 22:03:19 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D212020 John Baldwin changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jhb@FreeBSD.org Resolution|--- |FIXED Status|New |Closed --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Sat Dec 3 02:56:06 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 14864C63A12 for ; Sat, 3 Dec 2016 02:56:06 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id DE93511D9 for ; Sat, 3 Dec 2016 02:56:05 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB32u5JQ010033 for ; Sat, 3 Dec 2016 02:56:05 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 215021] Single core AMD Turion ML-37 laptop does not respond until keys are pressed Date: Sat, 03 Dec 2016 02:56:05 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: kern X-Bugzilla-Version: 11.0-STABLE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: xxjack12xx@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-bugs@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Dec 2016 02:56:06 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D215021 Bug ID: 215021 Summary: Single core AMD Turion ML-37 laptop does not respond until keys are pressed Product: Base System Version: 11.0-STABLE Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: freebsd-bugs@FreeBSD.org Reporter: xxjack12xx@gmail.com CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org I have a single core AMD Turion ML-37 laptop running 11.0-RELEASE,11.0-STABLE,12.0-CURRENT that does not respond unless keys are pressed. The system will boot and mount disks but hangs after that. When a key is pressed, it will boot further and further until it reaches the login prompt= . If no keys are pressed before the login prompt, the system will hang until a k= ey is pressed. When shutting down the system, nothing will happen when issued a halt -p un= til keys are pressed. When pressing keys, it will move further along the shutdo= wn process but hang if no keys are pressed. Both these behaviors happen on a stock install and even occurs during the installer process from cd. The installer dialog boxes will not move unless = keys are pressed after each action. I've also noticed that the system will move if you ping it instead of press= ing keys, but that only works if the laptop has an ip assigned to it. --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Sat Dec 3 06:40:19 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id DA271C629C3; Sat, 3 Dec 2016 06:40:19 +0000 (UTC) (envelope-from woodsb02@gmail.com) Received: from mail-io0-x233.google.com (mail-io0-x233.google.com [IPv6:2607:f8b0:4001:c06::233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 8CBF6184; Sat, 3 Dec 2016 06:40:19 +0000 (UTC) (envelope-from woodsb02@gmail.com) Received: by mail-io0-x233.google.com with SMTP id c21so474941161ioj.1; Fri, 02 Dec 2016 22:40:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=tK09wVe1HF9xICJ3AS7r1B3PbABBZSB4Ok8lnXl3r6w=; b=gxaqePDSlRcZcTXwZdrUtRvz3nVh3kkgR4S59Q3Ki2dR9QP1okzGbM5udvK9XEauGi ydoIOLMNzut223PCYjeq1455PnWH7d6S/Em8YvoBPZszo0fZkpg5sH7MEP8fa5Q5Gtv+ ZyaXU2rGm3JThhCiEXA1hfWyY8i+f3H9phzSEjx890MQwev2LKHpQ/79dCyn5qIVoN5f qCnqMXx9KV5/SM5fIIfnDLZL6iUhrn3cel6F8O2rZUQIykdzJQgiONxf6sAwLrTcnrxc ZuUik9wW3rfAViZsHvSqgYRYuQMBTDuZB8aINffGNDijUDgBDWzCNxbZmqAVREn/R2fp tQrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=tK09wVe1HF9xICJ3AS7r1B3PbABBZSB4Ok8lnXl3r6w=; b=aSQHnnigGnn6t6OanN9Ver+uq9mk1DIOJykdbwRLYmhAmCZQywkh500MUt7cVQRbIW KS3wy0XTjyrhREykBvT7V0Pw52jzONV+ta1W3R32hQx3vstQbYwUNBOFf8AkMg5HHPa+ RVHzuR6KziDMnT7zX3wC2qbA729VWw2QTPFQ1Iw+yyiFwXEXSjetAfAay/1vPJ7ve+W1 FFc4sydlbuOTm1eZ+6ufFapGdBbZNxT0t3C7g9OmbDC+iOsj0j7DJXy6FCCYpcp1qs2O nI2FhCIAOgDIhI9ltJCfXwhHvsY0qpPHiiPEoJHHdGag2Ng5U/lmtQ5gWKyvw0YAQ+1I TG/A== X-Gm-Message-State: AKaTC00wBlN0atB1csbrBspMvrF1KTA2Llw83V9DkDvaS01sLNMkraaYHmghuD0NEqyxzao+nGqqDh8EQlMi/g== X-Received: by 10.36.192.84 with SMTP id u81mr708837itf.51.1480747218893; Fri, 02 Dec 2016 22:40:18 -0800 (PST) MIME-Version: 1.0 Received: by 10.79.136.197 with HTTP; Fri, 2 Dec 2016 22:40:18 -0800 (PST) In-Reply-To: References: From: Ben Woods Date: Sat, 3 Dec 2016 14:40:18 +0800 Message-ID: Subject: Re: CFT EFI Boot Refactoring To: Eric McCorkle Cc: freebsd-hackers@freebsd.org, freebsd-amd64@freebsd.org, "current@freebsd.org" Content-Type: multipart/mixed; boundary=94eb2c058ce8fc2ff60542bb5373 X-Mailman-Approved-At: Sat, 03 Dec 2016 12:49:00 +0000 X-Content-Filtered-By: Mailman/MimeDel 2.1.23 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Dec 2016 06:40:20 -0000 --94eb2c058ce8fc2ff60542bb5373 Content-Type: text/plain; charset=UTF-8 Hi Eric, Thanks for your work on this. I just applied your diff to my subversion repository, and tried to buildworld, but the build failed with the following error: make[6]: make[6]: don't know how to make efipart.c. Stop make[6]: stopped in /usr/src/sys/boot/efi/drivers *** [all_subdir_sys/boot/efi/drivers] Error code 2 Does it build ok for you? Because I use subversion, and I wanted to build it from my main tree, I had to regenerate your patch using "git diff --no-prefix master..origin/efize_new > /tmp/efize_new.diff". I could then apply this cleanly with "svn patch /tmp/efize_new.diff". I checked the difference between your diff and the diff I generated, and the only differences were in the file headers. Therefore I don't think the patch change should make any difference. I have attached my version of the patch for reference. For example: diff --git a/lib/libstand/Makefile b/lib/libstand/Makefile index 0ebcaf1..3b608c5 100644 --- a/lib/libstand/Makefile +++ b/lib/libstand/Makefile Became: diff --git lib/libstand/Makefile lib/libstand/Makefile index 0ebcaf1ccfd..3b608c5bc92 100644 --- lib/libstand/Makefile +++ lib/libstand/Makefile To show the differences with your patch applied: $ svn status M lib/libstand/Makefile M lib/libstand/stand.h M sys/boot/efi/Makefile M sys/boot/efi/boot1/Makefile M sys/boot/efi/boot1/Makefile.fat M sys/boot/efi/boot1/boot1.c D sys/boot/efi/boot1/boot_module.h M sys/boot/efi/boot1/fat-amd64.tmpl.bz2.uu M sys/boot/efi/boot1/fat-arm.tmpl.bz2.uu M sys/boot/efi/boot1/fat-arm64.tmpl.bz2.uu M sys/boot/efi/boot1/fat-i386.tmpl.bz2.uu M sys/boot/efi/boot1/generate-fat.sh D sys/boot/efi/boot1/ufs_module.c D sys/boot/efi/boot1/zfs_module.c A sys/boot/efi/drivers A sys/boot/efi/drivers/Makefile A sys/boot/efi/drivers/efi_drivers.h A sys/boot/efi/drivers/fs_driver.c M sys/boot/efi/include/efilib.h M sys/boot/efi/include/efiprot.h A sys/boot/efi/include/string16.h M sys/boot/efi/libefi/Makefile A sys/boot/efi/libefi/efifs.c M sys/boot/efi/libefi/efipart.c M sys/boot/efi/libefi/errno.c M sys/boot/efi/libefi/handles.c A sys/boot/efi/libefi/string16.c M sys/boot/efi/libefi/time.c M sys/boot/efi/loader/Makefile M sys/boot/efi/loader/conf.c M sys/boot/efi/loader/loader_efi.h M sys/boot/efi/loader/main.c Regards, Ben -- From: Benjamin Woods woodsb02@gmail.com On 3 December 2016 at 01:02, Eric McCorkle wrote: > Hello everyone, > > My work to refactor the EFI boot loader has been in review for some time > now. This work is a behavior-neutral refactoring which eliminates > duplicated code in boot1, provides better integration of boot1 and > loader with the EFI API, and moves towards better compliance with the > recommendations of the UEFI driver writer's guide. This work also > serves as a precursor to more work, such as GELI, hot-plugging, and > other things. > > One of the reviewers was able to trigger a hang on his setup; however, > it's not clear whether this is a problem in the refactoring, or whether > it's due to a related bug: > > https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=214423 > > Therefore, I would like to issue a CFT for this changeset. We need > people using the boot1/loader EFI boot setup to test their setup using > boot1 and loader as built with this patch applied. > > You can also get the source tree directly from my github > (https://github.com/emc2/freebsd.git). Use the efize_new branch to get > this changeset. Note that I am maintaining the state of this branch in > a single change at this point using rebase -i, so there *will* be forced > pushes to this branch. > > > Here are some notes on testing the changeset: > > * To test it, just do a buildworld, then copy loader.efi in place and > copy boot1.efi to /efi/BOOT/BOOTX64.EFI on your ESP. If your system > boots, then the test was successful (there are no new features in this > changeset). > > * The output of boot1 is slightly different, so you'll be able to tell > if you installed it correctly. > > * I recommend keeping a copy of the basic boot1 around on your ESP, just > in case something goes wrong. On my setup, I have a backup at > /efi/BOOT/BOOTX64.BAK (with the main program at /efi/BOOT/BOOTX64.EFI, > of course) > > * I have been using this on a machine with two disks, a ZFS pool > spanning both disks, and a dummy UFS filesystem for months now, so it > can be considered relatively safe. > > * This has also been tested on basic setups without incident, so > priority is on complex or odd setups. > > * If something goes wrong, you will most likely get a boot-hang. If > this happens, please contact me directly with the details, and I'll > coordinate on diagnosis. > --94eb2c058ce8fc2ff60542bb5373 Content-Type: text/plain; charset=US-ASCII; name="efize_new.diff" Content-Disposition: attachment; filename="efize_new.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iw8unfrw2 ZGlmZiAtLWdpdCBsaWIvbGlic3RhbmQvTWFrZWZpbGUgbGliL2xpYnN0YW5kL01ha2VmaWxlCmlu ZGV4IDBlYmNhZjFjY2ZkLi4zYjYwOGM1YmM5MiAxMDA2NDQKLS0tIGxpYi9saWJzdGFuZC9NYWtl ZmlsZQorKysgbGliL2xpYnN0YW5kL01ha2VmaWxlCkBAIC00MSw3ICs0MSw3IEBAIFNSQ1MrPSBu dG9oLmMKIC5QQVRIOiAke0xJQkNfU1JDfS9zdHJpbmcKIFNSQ1MrPQliY21wLmMgYmNvcHkuYyBi emVyby5jIGZmcy5jIGZscy5jIFwKIAltZW1jY3B5LmMgbWVtY2hyLmMgbWVtY21wLmMgbWVtY3B5 LmMgbWVtbW92ZS5jIG1lbXNldC5jIFwKLQlxZGl2cmVtLmMgc3RyY2F0LmMgc3RyY2hyLmMgc3Ry Y21wLmMgc3RyY3B5LmMgXAorCXFkaXZyZW0uYyBzdHJjYXQuYyBzdHJjaHIuYyBzdHJjbXAuYyBz dHJjcHkuYyBzdHBjcHkuYyBzdHBuY3B5LmMgXAogCXN0cmNzcG4uYyBzdHJsY2F0LmMgc3RybGNw eS5jIHN0cmxlbi5jIHN0cm5jYXQuYyBzdHJuY21wLmMgc3RybmNweS5jIFwKIAlzdHJwYnJrLmMg c3RycmNoci5jIHN0cnNlcC5jIHN0cnNwbi5jIHN0cnN0ci5jIHN0cnRvay5jIHN3YWIuYwogLmlm ICR7TUFDSElORV9DUFVBUkNIfSA9PSAiYXJtIgpkaWZmIC0tZ2l0IGxpYi9saWJzdGFuZC9zdGFu ZC5oIGxpYi9saWJzdGFuZC9zdGFuZC5oCmluZGV4IGY3N2E1ODZmYjA2Li4wNjZhZmYwNWQ2NSAx MDA2NDQKLS0tIGxpYi9saWJzdGFuZC9zdGFuZC5oCisrKyBsaWIvbGlic3RhbmQvc3RhbmQuaApA QCAtMjQsNyArMjQsNyBAQAogICogU1VDSCBEQU1BR0UuCiAgKgogICogJEZyZWVCU0QkCi0gKiBG cm9tCSROZXRCU0Q6IHN0YW5kLmgsdiAxLjIyIDE5OTcvMDYvMjYgMTk6MTc6NDAgZHJvY2huZXIg RXhwICQJCisgKiBGcm9tCSROZXRCU0Q6IHN0YW5kLmgsdiAxLjIyIDE5OTcvMDYvMjYgMTk6MTc6 NDAgZHJvY2huZXIgRXhwICQKICAqLwogCiAvKi0KQEAgLTEzMSw3ICsxMzEsNyBAQCBleHRlcm4g c3RydWN0IGZzX29wcyBwa2dmc19mc29wczsKICNkZWZpbmUJU0VFS19DVVIJMQkvKiBzZXQgZmls ZSBvZmZzZXQgdG8gY3VycmVudCBwbHVzIG9mZnNldCAqLwogI2RlZmluZQlTRUVLX0VORAkyCS8q IHNldCBmaWxlIG9mZnNldCB0byBFT0YgcGx1cyBvZmZzZXQgKi8KIAotLyogCisvKgogICogRGV2 aWNlIHN3aXRjaAogICovCiBzdHJ1Y3QgZGV2c3cgewpAQCAtMTY2LDggKzE2Niw5IEBAIHN0cnVj dCBkZXZkZXNjCiAjZGVmaW5lIERFVlRfTk9ORQkwCiAjZGVmaW5lIERFVlRfRElTSwkxCiAjZGVm aW5lIERFVlRfTkVUCTIKLSNkZWZpbmUgREVWVF9DRAkJMworI2RlZmluZSBERVZUX0NECTMKICNk ZWZpbmUgREVWVF9aRlMJNAorI2RlZmluZSBERVZUX0VGSQk1CiAgICAgaW50CQkJZF91bml0Owog ICAgIHZvaWQJCSpkX29wZW5kYXRhOwogfTsKQEAgLTI3OSw3ICsyODAsNyBAQCBleHRlcm4gc3Ry dWN0CWRpcmVudCAqcmVhZGRpcmZkKGludCk7CiAKIGV4dGVybiB2b2lkCXNyYW5kb20odV9sb25n IHNlZWQpOwogZXh0ZXJuIHVfbG9uZwlyYW5kb20odm9pZCk7Ci0gICAgCisKIC8qIGltcG9ydHMg ZnJvbSBzdGRsaWIsIGxvY2FsbHkgbW9kaWZpZWQgKi8KIGV4dGVybiBsb25nCXN0cnRvbChjb25z dCBjaGFyICosIGNoYXIgKiosIGludCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZwlzdHJ0b3VsKGNv bnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKQEAgLTM2OCw5ICszNjksOSBAQCBleHRlcm4gaW50 CW51bGxfc3RhdChzdHJ1Y3Qgb3Blbl9maWxlICpmLCBzdHJ1Y3Qgc3RhdCAqc2IpOwogZXh0ZXJu IGludAludWxsX3JlYWRkaXIoc3RydWN0IG9wZW5fZmlsZSAqZiwgc3RydWN0IGRpcmVudCAqZCk7 CiAKIAotLyogCi0gKiBNYWNoaW5lIGRlcGVuZGVudCBmdW5jdGlvbnMgYW5kIGRhdGEsIG11c3Qg YmUgcHJvdmlkZWQgb3Igc3R1YmJlZCBieSAKLSAqIHRoZSBjb25zdW1lciAKKy8qCisgKiBNYWNo aW5lIGRlcGVuZGVudCBmdW5jdGlvbnMgYW5kIGRhdGEsIG11c3QgYmUgcHJvdmlkZWQgb3Igc3R1 YmJlZCBieQorICogdGhlIGNvbnN1bWVyCiAgKi8KIGV4dGVybiBpbnQJCWdldGNoYXIodm9pZCk7 CiBleHRlcm4gaW50CQlpc2NoYXIodm9pZCk7CmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL01ha2Vm aWxlIHN5cy9ib290L2VmaS9NYWtlZmlsZQppbmRleCA2NjQ4MWY4NTEzZi4uMDA0OTBkMGU5NDMg MTAwNjQ0Ci0tLSBzeXMvYm9vdC9lZmkvTWFrZWZpbGUKKysrIHN5cy9ib290L2VmaS9NYWtlZmls ZQpAQCAtMTUsNyArMTUsNyBAQCBTVUJESVIrPQlmZHQKIC5pZiAke01BQ0hJTkVfQ1BVQVJDSH0g PT0gImFhcmNoNjQiIHx8IFwKICAgICAke01BQ0hJTkVfQ1BVQVJDSH0gPT0gImFtZDY0IiB8fCBc CiAgICAgJHtNQUNISU5FX0NQVUFSQ0h9ID09ICJhcm0iCi1TVUJESVIrPQlsaWJlZmkgbG9hZGVy IGJvb3QxCitTVUJESVIrPQlsaWJlZmkgZHJpdmVycyBsb2FkZXIgYm9vdDEKIC5lbmRpZgogCiAu ZW5kaWYgIyAke0NPTVBJTEVSX1RZUEV9ICE9ICJnY2MiIHx8ICR7Q09NUElMRVJfVkVSU0lPTn0g Pj0gNDA1MDAKZGlmZiAtLWdpdCBzeXMvYm9vdC9lZmkvYm9vdDEvTWFrZWZpbGUgc3lzL2Jvb3Qv ZWZpL2Jvb3QxL01ha2VmaWxlCmluZGV4IDExMGE4NTc3NDkxLi43NDgwYzljM2VjYSAxMDA2NDQK LS0tIHN5cy9ib290L2VmaS9ib290MS9NYWtlZmlsZQorKysgc3lzL2Jvb3QvZWZpL2Jvb3QxL01h a2VmaWxlCkBAIC04LDM0ICs4LDUwIEBAIE1LX1NTUD0JCW5vCiAKIFBST0c9CQlib290MS5zeW0K IElOVEVSTkFMUFJPRz0KLVdBUk5TPz0JCTYKK1dBUk5TPz0JCTMKKworIyBJbmNsdWRlIGJjYWNo ZSBjb2RlLgorSEFWRV9CQ0FDSEU9ICAgIHllcwogCiAuaWYgJHtNS19aRlN9ICE9ICJubyIKICMg RGlzYWJsZSB3YXJuaW5ncyB0aGF0IGFyZSBjdXJyZW50bHkgaW5jb21wYXRpYmxlIHdpdGggdGhl IHpmcyBib290IGNvZGUKLUNXQVJORkxBR1MuemZzX21vZHVsZS5jICs9IC1Xbm8tYXJyYXktYm91 bmRzCi1DV0FSTkZMQUdTLnpmc19tb2R1bGUuYyArPSAtV25vLWNhc3QtYWxpZ24KLUNXQVJORkxB R1MuemZzX21vZHVsZS5jICs9IC1Xbm8tY2FzdC1xdWFsCi1DV0FSTkZMQUdTLnpmc19tb2R1bGUu YyArPSAtV25vLW1pc3NpbmctcHJvdG90eXBlcwotQ1dBUk5GTEFHUy56ZnNfbW9kdWxlLmMgKz0g LVduby1zaWduLWNvbXBhcmUKLUNXQVJORkxBR1MuemZzX21vZHVsZS5jICs9IC1Xbm8tdW51c2Vk LXBhcmFtZXRlcgotQ1dBUk5GTEFHUy56ZnNfbW9kdWxlLmMgKz0gLVduby11bnVzZWQtZnVuY3Rp b24KK0NXQVJORkxBR1MuYm9vdDEuYyArPSAtV25vLW1pc3NpbmctdmFyaWFibGUtZGVjbGFyYXRp b25zCitDV0FSTkZMQUdTLnpmcy5jICs9IC1Xbm8taW5jb21wYXRpYmxlLXBvaW50ZXItdHlwZXMt ZGlzY2FyZHMtcXVhbGlmaWVycworQ1dBUk5GTEFHUy56ZnMuYyArPSAtV25vLW1pc3NpbmctdmFy aWFibGUtZGVjbGFyYXRpb25zCitDV0FSTkZMQUdTLnpmcy5jICs9IC1Xbm8tYXJyYXktYm91bmRz CitDV0FSTkZMQUdTLnpmcy5jICs9IC1Xbm8tY2FzdC1hbGlnbgorQ1dBUk5GTEFHUy56ZnMuYyAr PSAtV25vLWNhc3QtcXVhbAorQ1dBUk5GTEFHUy56ZnMuYyArPSAtV25vLW1pc3NpbmctcHJvdG90 eXBlcworQ1dBUk5GTEFHUy56ZnMuYyArPSAtV25vLXNpZ24tY29tcGFyZQorQ1dBUk5GTEFHUy56 ZnMuYyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0NXQVJORkxBR1MuemZzLmMgKz0gLVduby11 bnVzZWQtZnVuY3Rpb24KIENXQVJORkxBR1Muc2tlaW4uYyArPSAtV25vLWNhc3QtYWxpZ24KIENX QVJORkxBR1Muc2tlaW4uYyArPSAtV25vLW1pc3NpbmctdmFyaWFibGUtZGVjbGFyYXRpb25zCiAu ZW5kaWYKIAorCiAjIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBsb2FkZXIgY29kZQotU1JDUz0JYm9v dDEuYyBzZWxmX3JlbG9jLmMgc3RhcnQuUyB1ZnNfbW9kdWxlLmMKK1NSQ1M9CWJvb3QxLmMgc2Vs Zl9yZWxvYy5jIHN0YXJ0LlMKIC5pZiAke01LX1pGU30gIT0gIm5vIgotU1JDUys9CQl6ZnNfbW9k dWxlLmMKKy5QQVRIOgkJJHsuQ1VSRElSfS8uLi8uLi8uLi9jcnlwdG8vc2tlaW4KIFNSQ1MrPQkJ c2tlaW4uYyBza2Vpbl9ibG9jay5jCiAjIERvIG5vdCB1bnJvbGwgc2tlaW4gbG9vcHMsIHJlZHVj ZSBjb2RlIHNpemUKIENGTEFHUys9CS1EU0tFSU5fTE9PUD0xMTEKLS5QQVRIOgkJJHsuQ1VSRElS fS8uLi8uLi8uLi9jcnlwdG8vc2tlaW4KKy5QQVRIOgkJJHsuQ1VSRElSfS8uLi8uLi96ZnMKK1NS Q1MrPQkJemZzLmMKIC5lbmRpZgogCisjIEFsd2F5cyBhZGQgTUkgc291cmNlcworLlBBVEg6CQkk ey5DVVJESVJ9Ly4uLy4uL2NvbW1vbgorLmluY2x1ZGUJIiR7LkNVUkRJUn0vLi4vLi4vY29tbW9u L01ha2VmaWxlLmluYyIKK0NGTEFHUys9CS1JJHsuQ1VSRElSfS8uLi8uLi9jb21tb24KKworLlBB VEg6ICR7LkNVUkRJUn0vYXJjaC8ke01BQ0hJTkV9CisKIENGTEFHUys9CS1JLgogQ0ZMQUdTKz0J LUkkey5DVVJESVJ9Ly4uL2luY2x1ZGUKIENGTEFHUys9CS1JJHsuQ1VSRElSfS8uLi9pbmNsdWRl LyR7TUFDSElORX0KK0NGTEFHUys9CS1JJHsuQ1VSRElSfS8uLi9kcml2ZXJzLwogQ0ZMQUdTKz0J LUkkey5DVVJESVJ9Ly4uLy4uLy4uL2NvbnRyaWIvZGV2L2FjcGljYS9pbmNsdWRlCiBDRkxBR1Mr PQktSSR7LkNVUkRJUn0vLi4vLi4vLi4KIENGTEFHUys9CS1ERUZJX1VGU19CT09UCkBAIC01Niw2 ICs3MiwyMCBAQCBDRkxBR1MrPQktREVGSV9aRlNfQk9PVAogLlBBVEg6CQkkey5DVVJESVJ9Ly4u Ly4uL2NvbW1vbgogQ0ZMQUdTKz0JLUkkey5DVVJESVJ9Ly4uLy4uL2NvbW1vbgogCisjIG1ha2Ug YnVpbGRlbnYgZG9lc24ndCBzZXQgREVTVERJUiwgdGhpcyBtZWFucyBMSUJTVEFORAorIyB3aWxs IGJlIHdyb25nIHdoZW4gY3Jvc3NidWlsZGluZy4KKy5pZiBleGlzdHMoJHsuT0JKRElSfS8uLi8u Li8uLi8uLi9saWIvbGlic3RhbmQvbGlic3RhbmQuYSkKK0xJQlNUQU5EPQkkey5PQkpESVJ9Ly4u Ly4uLy4uLy4uL2xpYi9saWJzdGFuZC9saWJzdGFuZC5hCisuZW5kaWYKKworIyBBZGQgbGliZWZp CisuUEFUSDoJCSR7LkNVUkRJUn0vLi4vbGliZWZpCitMSUJFRkk9CQkkey5PQkpESVJ9Ly4uL2xp YmVmaS9saWJlZmkuYQorCisuUEFUSDoJCSR7LkNVUkRJUn0vLi4vZHJpdmVycworTElCRUZJX0RS SVZFUlM9CSR7Lk9CSkRJUn0vLi4vZHJpdmVycy9saWJlZmlfZHJpdmVycy5hCisKKwogRklMRVM9 CWJvb3QxLmVmaSBib290MS5lZmlmYXQKIEZJTEVTTU9ERV9ib290MS5lZmk9CSR7QklOTU9ERX0K IApAQCAtNzUsOCArMTA1LDggQEAgTERGTEFHUys9CS1XbCwtem5vY29tYnJlbG9jCiAjIF9fYWVh YmlfKiAoYXJtKSBvciBfX2RpdmRpMyAoaTM4NikuCiAjIGFzIHdlbGwgYXMgcmVxdWlyZWQgc3Ry aW5nIGFuZCBtZW1vcnkgZnVuY3Rpb25zIGZvciBhbGwgcGxhdGZvcm1zLgogIwotRFBBREQrPQkJ JHtMSUJTVEFORH0KLUxEQUREKz0JCS1sc3RhbmQKK0RQQUREKz0JCSR7TElCRUZJX0RSSVZFUlN9 ICR7TElCRUZJfSAke0xJQlNUQU5EfQorTERBREQrPQkJJHtMSUJFRklfRFJJVkVSU30gJHtMSUJF Rkl9ICR7TElCU1RBTkR9CiAKIERQQUREKz0JCSR7TERTQ1JJUFR9CiAKQEAgLTEwMiw3ICsxMzIs NyBAQCBib290MS5lZmk6ICR7UFJPR30KIAlTT1VSQ0VfREFURV9FUE9DSD0ke1NPVVJDRV9EQVRF X0VQT0NIfSBcCiAJJHtPQkpDT1BZfSAtaiAucGVoZWFkZXIgLWogLnRleHQgLWogLnNkYXRhIC1q IC5kYXRhIFwKIAkJLWogLmR5bmFtaWMgLWogLmR5bnN5bSAtaiAucmVsLmR5biBcCi0JCS1qIC5y ZWxhLmR5biAtaiAucmVsb2MgLWogLmVoX2ZyYW1lIFwKKwkJLWogLnJlbGEuZHluIC1qIC5yZWxv YyAtaiAuZWhfZnJhbWUgLWogc2V0X1hjb21tYW5kX3NldCBcCiAJCS0tb3V0cHV0LXRhcmdldD0k e0VGSV9UQVJHRVR9ICR7LkFMTFNSQ30gJHsuVEFSR0VUfQogCiBib290MS5vOiAkey5DVVJESVJ9 Ly4uLy4uL2NvbW1vbi91ZnNyZWFkLmMKQEAgLTExMSw3ICsxNDEsNyBAQCBib290MS5vOiAkey5D VVJESVJ9Ly4uLy4uL2NvbW1vbi91ZnNyZWFkLmMKICMgY3JlYXRlZCBieSBnZW5lcmF0ZS1mYXQu c2gKIAogLmluY2x1ZGUgIiR7LkNVUkRJUn0vTWFrZWZpbGUuZmF0IgotQk9PVDFfTUFYU0laRT89 CTEzMTA3MgorQk9PVDFfTUFYU0laRT89CTUyNDI4OAogCiBib290MS5lZmlmYXQ6IGJvb3QxLmVm aQogCUBzZXQgLS0gYGxzIC1sIGJvb3QxLmVmaWA7IFwKZGlmZiAtLWdpdCBzeXMvYm9vdC9lZmkv Ym9vdDEvTWFrZWZpbGUuZmF0IHN5cy9ib290L2VmaS9ib290MS9NYWtlZmlsZS5mYXQKaW5kZXgg Yzg2YTdjM2Y1ODUuLmUyY2RhMWNlYjc5IDEwMDY0NAotLS0gc3lzL2Jvb3QvZWZpL2Jvb3QxL01h a2VmaWxlLmZhdAorKysgc3lzL2Jvb3QvZWZpL2Jvb3QxL01ha2VmaWxlLmZhdApAQCAtMSw0ICsx LDQgQEAKICMgVGhpcyBmaWxlIGF1dG9nZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtZmF0LnNoIC0gRE8g Tk9UIEVESVQKICMgJEZyZWVCU0QkCiBCT09UMV9PRkZTRVQ9MHgyZAotQk9PVDFfTUFYU0laRT0x MzEwNzIKK0JPT1QxX01BWFNJWkU9NTI0Mjg4CmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL2Jvb3Qx L2Jvb3QxLmMgc3lzL2Jvb3QvZWZpL2Jvb3QxL2Jvb3QxLmMKaW5kZXggODBiMTg5NWQ0YjIuLjll MDJiZmEzODQ5IDEwMDY0NAotLS0gc3lzL2Jvb3QvZWZpL2Jvb3QxL2Jvb3QxLmMKKysrIHN5cy9i b290L2VmaS9ib290MS9ib290MS5jCkBAIC0yNiw2MiArMjYsMTE4IEBAIF9fRkJTRElEKCIkRnJl ZUJTRCQiKTsKICNpbmNsdWRlIDxtYWNoaW5lL2VsZi5oPgogI2luY2x1ZGUgPG1hY2hpbmUvc3Rk YXJnLmg+CiAjaW5jbHVkZSA8c3RhbmQuaD4KKyNpbmNsdWRlIDxzdHJpbmcxNi5oPgogCiAjaW5j bHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8ZWZpbGliLmg+CisjaW5jbHVkZSA8ZWZpcHJvdC5oPgog I2luY2x1ZGUgPGVmaWNvbnNjdGwuaD4KKyNpZmRlZiBFRklfWkZTX0JPT1QKKyNpbmNsdWRlIDxs aWJ6ZnMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vdHN0cmFwLmg+CiAKLSNpbmNsdWRlICJi b290X21vZHVsZS5oIgorI2luY2x1ZGUgImVmaV9kcml2ZXJzLmgiCiAjaW5jbHVkZSAicGF0aHMu aCIKIAotc3RhdGljIGNvbnN0IGJvb3RfbW9kdWxlX3QgKmJvb3RfbW9kdWxlc1tdID0KLXsKLSNp ZmRlZiBFRklfWkZTX0JPT1QKLQkmemZzX21vZHVsZSwKLSNlbmRpZgotI2lmZGVmIEVGSV9VRlNf Qk9PVAotCSZ1ZnNfbW9kdWxlCisjaWZkZWYgRUZJX0RFQlVHCisjZGVmaW5lIERQUklOVEYoZm10 LCBhcmdzLi4uKSBwcmludGYoZm10LCAjI2FyZ3MpCisjZGVmaW5lIERTVEFMTChkKSBicy0+U3Rh bGwoZCkKKyNlbHNlCisjZGVmaW5lIERQUklOVEYoZm10LCAuLi4pIHt9CisjZGVmaW5lIERTVEFM TChkKSB7fQogI2VuZGlmCisKK3N0cnVjdCBhcmNoX3N3aXRjaCBhcmNoc3c7CS8qIE1JL01EIGlu dGVyZmFjZSBib3VuZGFyeSAqLworCitzdGF0aWMgY29uc3QgZWZpX2RyaXZlcl90ICplZmlfZHJp dmVyc1tdID0geworICAgICAgICAmZnNfZHJpdmVyLAorICAgICAgICBOVUxMCiB9OwogCi0jZGVm aW5lCU5VTV9CT09UX01PRFVMRVMJbml0ZW1zKGJvb3RfbW9kdWxlcykKLS8qIFRoZSBpbml0aWFs IG51bWJlciBvZiBoYW5kbGVzIHVzZWQgdG8gcXVlcnkgRUZJIGZvciBwYXJ0aXRpb25zLiAqLwot I2RlZmluZSBOVU1fSEFORExFU19JTklUCTI0CitleHRlcm4gc3RydWN0IGNvbnNvbGUgZWZpX2Nv bnNvbGU7CisjaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX19pMzg2X18pCitleHRl cm4gc3RydWN0IGNvbnNvbGUgY29tY29uc29sZTsKK2V4dGVybiBzdHJ1Y3QgY29uc29sZSBudWxs Y29uc29sZTsKKyNlbmRpZgogCi12b2lkIHB1dGNoYXIoaW50IGMpOwotRUZJX1NUQVRVUyBlZmlf bWFpbihFRklfSEFORExFIFhpbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSogWHN5c3RhYik7CitzdHJ1 Y3QgZnNfb3BzICpmaWxlX3N5c3RlbVtdID0geworCSZkb3Nmc19mc29wcywKKwkmdWZzX2Zzb3Bz LAorCSZjZDk2NjBfZnNvcHMsCisJJm5mc19mc29wcywKKwkmZ3ppcGZzX2Zzb3BzLAorCSZiemlw ZnNfZnNvcHMsCisJTlVMTAorfTsKIAotRUZJX1NZU1RFTV9UQUJMRSAqc3lzdGFiOwotRUZJX0JP T1RfU0VSVklDRVMgKmJzOwotc3RhdGljIEVGSV9IQU5ETEUgKmltYWdlOworc3RydWN0IGRldnN3 ICpkZXZzd1tdID0geworCSZlZmlwYXJ0X2RldiwKKyNpZmRlZiBFRklfWkZTX0JPT1QKKwkmemZz X2RldiwKKyNlbmRpZgorCU5VTEwKK307CiAKLXN0YXRpYyBFRklfR1VJRCBCbG9ja0lvUHJvdG9j b2xHVUlEID0gQkxPQ0tfSU9fUFJPVE9DT0w7Ci1zdGF0aWMgRUZJX0dVSUQgRGV2aWNlUGF0aEdV SUQgPSBERVZJQ0VfUEFUSF9QUk9UT0NPTDsKLXN0YXRpYyBFRklfR1VJRCBMb2FkZWRJbWFnZUdV SUQgPSBMT0FERURfSU1BR0VfUFJPVE9DT0w7Ci1zdGF0aWMgRUZJX0dVSUQgQ29uc29sZUNvbnRy b2xHVUlEID0gRUZJX0NPTlNPTEVfQ09OVFJPTF9QUk9UT0NPTF9HVUlEOworc3RydWN0IGNvbnNv bGUgKmNvbnNvbGVzW10gPSB7CisJJmVmaV9jb25zb2xlLAorCU5VTEwKK307CiAKLS8qCi0gKiBQ cm92aWRlIE1hbGxvYyAvIEZyZWUgYmFja2VkIGJ5IEVGSXMgQWxsb2NhdGVQb29sIC8gRnJlZVBv b2wgd2hpY2ggZW5zdXJlcwotICogbWVtb3J5IGlzIGNvcnJlY3RseSBhbGlnbmVkIGF2b2lkaW5n IEVGSV9JTlZBTElEX1BBUkFNRVRFUiByZXR1cm5zIGZyb20KLSAqIEVGSSBtZXRob2RzLgorLyog RGVmaW5pdGlvbnMgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCBmb3IgYm9vdCwgYnV0IHdlIG5lZWQg dG8gZGVmaW5lCisgKiB0byBtYWtlIHRoZSBsaW5rZXIgaGFwcHkuCiAgKi8KLXZvaWQgKgotTWFs bG9jKHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKmZpbGUgX191bnVzZWQsIGludCBsaW5lIF9fdW51 c2VkKQorc3RydWN0IGZpbGVfZm9ybWF0ICpmaWxlX2Zvcm1hdHNbXSA9IHsgTlVMTCB9OworCitz dHJ1Y3QgbmV0aWZfZHJpdmVyICpuZXRpZl9kcml2ZXJzW10gPSB7IE5VTEwgfTsKKworc3RhdGlj IGludAorZWZpX2F1dG9sb2FkKHZvaWQpCiB7Ci0Jdm9pZCAqb3V0OworICBwcmludGYoIioqKioq KioqIEJvb3QgYmxvY2sgc2hvdWxkIG5vdCBjYWxsIGF1dG9sb2FkXG4iKTsKKyAgcmV0dXJuICgt MSk7Cit9CiAKLQlpZiAoYnMtPkFsbG9jYXRlUG9vbChFZmlMb2FkZXJEYXRhLCBsZW4sICZvdXQp ID09IEVGSV9TVUNDRVNTKQotCQlyZXR1cm4gKG91dCk7CitzdGF0aWMgaW50IGVmaV9nZXRkZXYo dm9pZCAqKnZkZXYgX191bnVzZWQsIGNvbnN0IGNoYXIgKmRldnNwZWMgX191bnVzZWQsCisgICAg Y29uc3QgY2hhciAqKnBhdGggX191bnVzZWQpCit7CisgIHByaW50ZigiKioqKioqKiogQm9vdCBi bG9jayBzaG91bGQgbm90IGNhbGwgZ2V0ZGV2XG4iKTsKKyAgcmV0dXJuICgtMSk7Cit9CiAKLQly ZXR1cm4gKE5VTEwpOworc3RhdGljIHNzaXplX3QKK2VmaV9jb3B5aW4oY29uc3Qgdm9pZCAqc3Jj IF9fdW51c2VkLCB2bV9vZmZzZXRfdCBkZXN0IF9fdW51c2VkLAorICAgIGNvbnN0IHNpemVfdCBs ZW4gX191bnVzZWQpCit7CisgIHByaW50ZigiKioqKioqKiogQm9vdCBibG9jayBzaG91bGQgbm90 IGNhbGwgY29weWluXG4iKTsKKyAgcmV0dXJuICgtMSk7CiB9CiAKLXZvaWQKLUZyZWUodm9pZCAq YnVmLCBjb25zdCBjaGFyICpmaWxlIF9fdW51c2VkLCBpbnQgbGluZSBfX3VudXNlZCkKK3N0YXRp YyBzc2l6ZV90CitlZmlfY29weW91dCh2bV9vZmZzZXRfdCBzcmMgX191bnVzZWQsIHZvaWQgKmRl c3QgX191bnVzZWQsCisgICAgY29uc3Qgc2l6ZV90IGxlbiBfX3VudXNlZCkKIHsKLQlpZiAoYnVm ICE9IE5VTEwpCi0JCSh2b2lkKWJzLT5GcmVlUG9vbChidWYpOworICBwcmludGYoIioqKioqKioq IEJvb3QgYmxvY2sgc2hvdWxkIG5vdCBjYWxsIGNvcHlvdXRcbiIpOworICByZXR1cm4gKC0xKTsK K30KKworc3RhdGljIHNzaXplX3QKK2VmaV9yZWFkaW4oaW50IGZkIF9fdW51c2VkLCB2bV9vZmZz ZXRfdCBkZXN0IF9fdW51c2VkLAorICAgIGNvbnN0IHNpemVfdCBsZW4gX191bnVzZWQpCit7Cisg IHByaW50ZigiKioqKioqKiogQm9vdCBibG9jayBzaG91bGQgbm90IGNhbGwgcmVhZGluXG4iKTsK KyAgcmV0dXJuICgtMSk7CiB9CiAKKy8qIFRoZSBpbml0aWFsIG51bWJlciBvZiBoYW5kbGVzIHVz ZWQgdG8gcXVlcnkgRUZJIGZvciBwYXJ0aXRpb25zLiAqLworI2RlZmluZSBOVU1fSEFORExFU19J TklUCTI0CisKK3N0YXRpYyBFRklfR1VJRCBEZXZpY2VQYXRoR1VJRCA9IERFVklDRV9QQVRIX1BS T1RPQ09MOworc3RhdGljIEVGSV9HVUlEIExvYWRlZEltYWdlR1VJRCA9IExPQURFRF9JTUFHRV9Q Uk9UT0NPTDsKK3N0YXRpYyBFRklfR1VJRCBTaW1wbGVGaWxlU3lzdGVtUHJvdG9jb2xHVUlEID0g U0lNUExFX0ZJTEVfU1lTVEVNX1BST1RPQ09MOworc3RhdGljIEVGSV9HVUlEIEZpbGVJbmZvR1VJ RCA9IEVGSV9GSUxFX0lORk9fSUQ7OworCiAvKgogICogbm9kZXNfbWF0Y2ggcmV0dXJucyBUUlVF IGlmIHRoZSBpbWdwYXRoIGlzbid0IE5VTEwgYW5kIHRoZSBub2RlcyBtYXRjaCwKICAqIEZBTFNF IG90aGVyd2lzZS4KQEAgLTE0Miw2ICsxOTgsNyBAQCBkZXZwYXRoX2xhc3QoRUZJX0RFVklDRV9Q QVRIICpkZXZwYXRoKQogCXJldHVybiAoZGV2cGF0aCk7CiB9CiAKKyNpZmRlZiBFRklfREVCVUcK IC8qCiAgKiBkZXZwYXRoX25vZGVfc3RyIGlzIGEgYmFzaWMgb3V0cHV0IG1ldGhvZCBmb3IgYSBk ZXZwYXRoIG5vZGUgd2hpY2gKICAqIG9ubHkgdW5kZXJzdGFuZHMgYSBzdWJzZXQgb2YgdGhlIGF2 YWlsYWJsZSBzdWIgdHlwZXMuCkBAIC0yNzMsNyArMzMwLDcgQEAgZGV2cGF0aF9ub2RlX3N0cihj aGFyICpidWYsIHNpemVfdCBzaXplLCBFRklfREVWSUNFX1BBVEggKmRldnBhdGgpCiAgKiBkZXZw YXRoX3N0cmxjYXQgYXBwZW5kcyBhIHRleHQgZGVzY3JpcHRpb24gb2YgZGV2cGF0aCB0byBidWYg YnV0IG5vdCBtb3JlCiAgKiB0aGFuIHNpemUgLSAxIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgTlVM LXRlcm1pbmF0b3IuCiAgKi8KLWludAorc3RhdGljIGludAogZGV2cGF0aF9zdHJsY2F0KGNoYXIg KmJ1Ziwgc2l6ZV90IHNpemUsIEVGSV9ERVZJQ0VfUEFUSCAqZGV2cGF0aCkKIHsKIAlzaXplX3Qg bGVuLCB1c2VkOwpAQCAtMzA0LDQ4ICszNjEsMjA3IEBAIGRldnBhdGhfc3RybGNhdChjaGFyICpi dWYsIHNpemVfdCBzaXplLCBFRklfREVWSUNFX1BBVEggKmRldnBhdGgpCiAgKiBkZXZwYXRoX3N0 ciBpcyBjb252ZW5pZW5jZSBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgdGV4dCBkZXNjcmlwdGlv biBvZgogICogZGV2cGF0aCB1c2luZyBhIHN0YXRpYyBidWZmZXIsIHNvIGl0IGlzbid0IHRocmVh ZCBzYWZlIQogICovCi1jaGFyICoKK3N0YXRpYyBjaGFyICoKIGRldnBhdGhfc3RyKEVGSV9ERVZJ Q0VfUEFUSCAqZGV2cGF0aCkKIHsKIAlzdGF0aWMgY2hhciBidWZbMjU2XTsKIAogCWRldnBhdGhf c3RybGNhdChidWYsIHNpemVvZihidWYpLCBkZXZwYXRoKTsKIAotCXJldHVybiBidWY7CisJcmV0 dXJuIChidWYpOworfQorI2VuZGlmCisKK3N0YXRpYyBFRklfU1RBVFVTCitlZmlfbG9hZChFRklf SEFORExFIGRldiwgY29uc3QgY2hhciAqZmlsZXBhdGgsIHZvaWQgKipidWZwLCBzaXplX3QgKmJ1 ZnNpemUpCit7CisgICAgICAgIFVJTlROIGluZm9zaXplID0gc2l6ZW9mKEVGSV9GSUxFX0lORk8p ICsKKyAgICAgICAgICAoKHN0cmxlbihmaWxlcGF0aCkgKyAxKSAqIHNpemVvZihDSEFSMTYpKTsK KyAgICAgICAgRUZJX0ZJTEVfSU5GTyAqZmluZm87CisJRUZJX1NUQVRVUyBzdGF0dXM7CisgICAg ICAgIEVGSV9GSUxFX0lPX0lOVEVSRkFDRSAqaWZhY2U7CisgICAgICAgIEVGSV9GSUxFX0hBTkRM RSByb290OworICAgICAgICBFRklfRklMRV9IQU5ETEUgdGFyZ2V0OworICAgICAgICBDSEFSMTYg cGF0aDE2W3N0cmxlbihmaWxlcGF0aCkgKyAxXTsKKwl2b2lkICpidWY7CisKKyAgICAgICAgZmlu Zm8gPSBtYWxsb2MoaW5mb3NpemUpOworCisgICAgICAgIGlmIChmaW5mbyA9PSBOVUxMKSB7Cisg ICAgICAgICAgICAgICAgcmV0dXJuIChFRklfT1VUX09GX1JFU09VUkNFUyk7CisgICAgICAgIH0K KworCXN0YXR1cyA9IEJTLT5PcGVuUHJvdG9jb2woZGV2LCAmU2ltcGxlRmlsZVN5c3RlbVByb3Rv Y29sR1VJRCwKKyAgICAgICAgICAgICh2b2lkICoqKSZpZmFjZSwgSUgsIE5VTEwsIEVGSV9PUEVO X1BST1RPQ09MX0dFVF9QUk9UT0NPTCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBFRklfU1VD Q0VTUykgeworICAgICAgICAgICAgICAgIGZyZWUoZmluZm8pOworICAgICAgICAgICAgICAgIHBy aW50ZigiT3BlbiBwcm90b2NvbCBmYWlsZWQhICVsZFxuIiwgRUZJX0VSUk9SX0NPREUoc3RhdHVz KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGF0dXMpOworICAgICAgICB9CisKKyAgICAg ICAgc3RhdHVzID0gaWZhY2UtPk9wZW5Wb2x1bWUoaWZhY2UsICZyb290KTsKKworICAgICAgICBp ZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgQlMtPkNsb3NlUHJv dG9jb2woZGV2LCAmU2ltcGxlRmlsZVN5c3RlbVByb3RvY29sR1VJRCwgSUgsIE5VTEwpOworICAg ICAgICAgICAgICAgIGZyZWUoZmluZm8pOworICAgICAgICAgICAgICAgIHByaW50ZigiT3BlbiB2 b2x1bWUgZmFpbGVkISAlbGRcbiIsIEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOworICAgICAgICAg ICAgICAgIHJldHVybiAoc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmNweV90b18x NihwYXRoMTYsIGZpbGVwYXRoKTsKKyAgICAgICAgc3RhdHVzID0gcm9vdC0+T3Blbihyb290LCAm dGFyZ2V0LCBwYXRoMTYsIEVGSV9GSUxFX01PREVfUkVBRCwgMCk7CisKKyAgICAgICAgaWYgKHN0 YXR1cyAhPSBFRklfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIEJTLT5DbG9zZVByb3RvY29s KGRldiwgJlNpbXBsZUZpbGVTeXN0ZW1Qcm90b2NvbEdVSUQsIElILCBOVUxMKTsKKyAgICAgICAg ICAgICAgICBmcmVlKGZpbmZvKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAoc3RhdHVzKTsK KyAgICAgICAgfQorCisgICAgICAgICpidWZzaXplID0gaW5mb3NpemU7CisgICAgICAgIHN0YXR1 cyA9IHRhcmdldC0+R2V0SW5mbyh0YXJnZXQsICZGaWxlSW5mb0dVSUQsIGJ1ZnNpemUsIGZpbmZv KTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAg ICAgQlMtPkNsb3NlUHJvdG9jb2woZGV2LCAmU2ltcGxlRmlsZVN5c3RlbVByb3RvY29sR1VJRCwg SUgsIE5VTEwpOworICAgICAgICAgICAgICAgIGZyZWUoZmluZm8pOworICAgICAgICAgICAgICAg IHByaW50ZigiR2V0IGluZm8gZmFpbGVkISAlbGRcbiIsIEVGSV9FUlJPUl9DT0RFKHN0YXR1cykp OworICAgICAgICAgICAgICAgIHJldHVybiAoc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAg ICpidWZzaXplID0gZmluZm8tPkZpbGVTaXplOworCisgICAgICAgIGlmICgoYnVmID0gbWFsbG9j KGZpbmZvLT5GaWxlU2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBCUy0+Q2xvc2VQ cm90b2NvbChkZXYsICZTaW1wbGVGaWxlU3lzdGVtUHJvdG9jb2xHVUlELCBJSCwgTlVMTCk7Cisg ICAgICAgICAgICAgICAgZnJlZShmaW5mbyk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJGYWls ZWQgdG8gYWxsb2NhdGUgbG9hZCBidWZmZXIgJXpkIGZvciAnJXMnICIKKyAgICAgICAgICAgICAg ICAgICAgICAgIiglbHUpXG4iLCBmaW5mby0+RmlsZVNpemUsIGZpbGVwYXRoLCBFRklfRVJST1Jf Q09ERShzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVGSV9PVVRfT0ZfUkVTT1VS Q0VTKTsKKyAgICAgICAgfQorCisgICAgICAgICpidWZwID0gYnVmOworICAgICAgICBzdGF0dXMg PSB0YXJnZXQtPlJlYWQodGFyZ2V0LCBidWZzaXplLCBidWYpOworICAgICAgICBCUy0+Q2xvc2VQ cm90b2NvbChkZXYsICZTaW1wbGVGaWxlU3lzdGVtUHJvdG9jb2xHVUlELCBJSCwgTlVMTCk7Cisg ICAgICAgIGZyZWUoZmluZm8pOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1Mp IHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlJlYWQgZmFpbGVkISAlbGRcbiIsIEVGSV9FUlJP Ul9DT0RFKHN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RhdHVzKTsKKyAgICAg ICAgfQorCisgICAgICAgIHJldHVybiAoRUZJX1NVQ0NFU1MpOwogfQogCiAvKgogICogbG9hZF9s b2FkZXIgYXR0ZW1wdHMgdG8gbG9hZCB0aGUgbG9hZGVyIGltYWdlIGRhdGEuCiAgKgotICogSXQg dHJpZXMgZWFjaCBtb2R1bGUgYW5kIGl0cyByZXNwZWN0aXZlIGRldmljZXMsIGlkZW50aWZpZWQg YnkgbW9kLT5wcm9iZSwKLSAqIGluIG9yZGVyIHVudGlsIGEgc3VjY2Vzc2Z1bCBsb2FkIG9jY3Vy cyBhdCB3aGljaCBwb2ludCBpdCByZXR1cm5zIEVGSV9TVUNDRVNTCi0gKiBhbmQgRUZJX05PVF9G T1VORCBvdGhlcndpc2UuCisgKiBUaGlzIHRyaWVzIGFsbCBoYW5kbGVzIHdoaWNoIHN1cHBvcnQg dGhlIEVGSV9TSU1QTEVfRklMRV9TWVNURU0gaW50ZXJmYWNlLgorICogSXQgaXMgZXhwZWN0ZWQg dGhhdCB0aGUgZHJpdmVycyB3aWxsIGhhdmUgaW5zdGFsbGVkIHRoaXMgaW50ZXJmYWNlIG9uIGV2 ZXJ5CisgKiBoYW5kbGUgcmVwcmVzZW50aW5nIGEgZGV2aWNlIGNvbnRhaW5pbmcgYSBzdXBwb3J0 ZWQgZmlsZSBzeXN0ZW0uCisgKgorICogTm90ZTogSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYXkgYmUg YWx0ZXJlZCB0byB1c2UgdGhlIEVGSV9MT0FEX0ZJTEUgaW50ZXJmYWNlLAorICogd2hpY2ggc2hv dWxkIHdvcmsgdHJhbnNwYXJlbnRseSB3aXRoIG5ldHdvcmsgYm9vdGluZy4KICAqCiAgKiBPbmx5 IGRldmljZXMgd2hpY2ggaGF2ZSBwcmVmZXJyZWQgbWF0Y2hpbmcgdGhlIHByZWZlcnJlZCBwYXJh bWV0ZXIgYXJlIHRyaWVkLgogICovCiBzdGF0aWMgRUZJX1NUQVRVUwotbG9hZF9sb2FkZXIoY29u c3QgYm9vdF9tb2R1bGVfdCAqKm1vZHAsIGRldl9pbmZvX3QgKipkZXZpbmZvcCwgdm9pZCAqKmJ1 ZnAsCi0gICAgc2l6ZV90ICpidWZzaXplLCBCT09MRUFOIHByZWZlcnJlZCkKK2xvYWRfbG9hZGVy KEVGSV9IQU5ETEUgKmhhbmRsZXAsIHZvaWQgKipidWZwLCBzaXplX3QgKmJ1ZnNpemUpCiB7Ci0J VUlOVE4gaTsKLQlkZXZfaW5mb190ICpkZXY7Ci0JY29uc3QgYm9vdF9tb2R1bGVfdCAqbW9kOwot Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9CT09UX01PRFVMRVM7IGkrKykgewotCQltb2QgPSBib290 X21vZHVsZXNbaV07Ci0JCWZvciAoZGV2ID0gbW9kLT5kZXZpY2VzKCk7IGRldiAhPSBOVUxMOyBk ZXYgPSBkZXYtPm5leHQpIHsKLQkJCWlmIChkZXYtPnByZWZlcnJlZCAhPSBwcmVmZXJyZWQpCi0J CQkJY29udGludWU7Ci0KLQkJCWlmIChtb2QtPmxvYWQoUEFUSF9MT0FERVJfRUZJLCBkZXYsIGJ1 ZnAsIGJ1ZnNpemUpID09Ci0JCQkgICAgRUZJX1NVQ0NFU1MpIHsKLQkJCQkqZGV2aW5mb3AgPSBk ZXY7Ci0JCQkJKm1vZHAgPSBtb2Q7Ci0JCQkJcmV0dXJuIChFRklfU1VDQ0VTUyk7Ci0JCQl9CisJ RUZJX0RFVklDRV9QQVRIICppbWdwYXRoOworCUVGSV9ERVZJQ0VfUEFUSCAqZGV2cGF0aDsKKwlF RklfTE9BREVEX0lNQUdFICpib290X2ltYWdlOworICAgICAgICBFRklfSEFORExFICpib290X2hh bmRsZTsKKwlFRklfSEFORExFICpwcmVmZXJyZWQ7CisJRUZJX0hBTkRMRSAqaGFuZGxlczsKKyAg ICAgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisJVUlOVE4gaSwgaHNpemUsIG5oYW5kbGVzLCBucHJl ZmVycmVkOworCisJaWYgKChzdGF0dXMgPSBCUy0+T3BlblByb3RvY29sKElILCAmTG9hZGVkSW1h Z2VHVUlELAorICAgICAgICAgICAgKFZPSUQqKikmYm9vdF9pbWFnZSwgSUgsIE5VTEwsCisgICAg ICAgICAgICBFRklfT1BFTl9QUk9UT0NPTF9HRVRfUFJPVE9DT0wpKSAhPSBFRklfU1VDQ0VTUykg eworCQlwYW5pYygiRmFpbGVkIHRvIHF1ZXJ5IExvYWRlZEltYWdlICglbHUpXG4iLAorCQkgICAg RUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7CisJfQorCisgICAgICAgIGJvb3RfaGFuZGxlID0gYm9v dF9pbWFnZS0+RGV2aWNlSGFuZGxlOworCisJaWYgKChzdGF0dXMgPSBCUy0+T3BlblByb3RvY29s KGJvb3RfaGFuZGxlLCAmRGV2aWNlUGF0aEdVSUQsCisgICAgICAgICAgICAodm9pZCAqKikmaW1n cGF0aCwgSUgsIE5VTEwsIEVGSV9PUEVOX1BST1RPQ09MX0dFVF9QUk9UT0NPTCkpKSB7CisgICAg ICAgICAgICAgICAgcGFuaWMoIkZhaWxlZCB0byBnZXQgaW1hZ2UgRGV2aWNlUGF0aCAoJWx1KVxu IiwKKyAgICAgICAgICAgICAgICAgICAgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7CisgICAgICAg IH0KKyAgICAgICAgRFBSSU5URigiYm9vdDEgaW1hZ2VwYXRoOiAlc1xuIiwgZGV2cGF0aF9zdHIo aW1ncGF0aCkpOworCisgICAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgaGFuZGxlcyAq LworCWhzaXplID0gKFVJTlROKU5VTV9IQU5ETEVTX0lOSVQgKiBzaXplb2YoRUZJX0hBTkRMRSk7 CisJaWYgKChoYW5kbGVzID0gbWFsbG9jKGhzaXplKSkgPT0gTlVMTCkKKwkJcGFuaWMoIkZhaWxl ZCB0byBhbGxvY2F0ZSAlZCBoYW5kbGVzICglbHUpIiwgTlVNX0hBTkRMRVNfSU5JVCwKKwkJICAg IEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOworCisJc3RhdHVzID0gQlMtPkxvY2F0ZUhhbmRsZShC eVByb3RvY29sLCAmU2ltcGxlRmlsZVN5c3RlbVByb3RvY29sR1VJRCwgTlVMTCwKKwkgICAgJmhz aXplLCBoYW5kbGVzKTsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBFRklfU1VDQ0VTUzoK KwkJYnJlYWs7CisJY2FzZSBFRklfQlVGRkVSX1RPT19TTUFMTDoKKwkJKHZvaWQpQlMtPkZyZWVQ b29sKGhhbmRsZXMpOworCQlpZiAoKGhhbmRsZXMgPSBtYWxsb2MoaHNpemUpKSA9PSBOVUxMKSB7 CisJCQlwYW5pYygiRmFpbGVkIHRvIGFsbG9jYXRlICV6dSBoYW5kbGVzICglbHUpIiwgaHNpemUg LworCQkJICAgIHNpemVvZigqaGFuZGxlcyksIEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOwogCQl9 CisJCXN0YXR1cyA9IEJTLT5Mb2NhdGVIYW5kbGUoQnlQcm90b2NvbCwKKyAgICAgICAgICAgICAg ICAgICAgJlNpbXBsZUZpbGVTeXN0ZW1Qcm90b2NvbEdVSUQsIE5VTEwsICZoc2l6ZSwgaGFuZGxl cyk7CisJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCQlwYW5pYygiRmFpbGVkIHRvIGdl dCBkZXZpY2UgaGFuZGxlcyAoJWx1KVxuIiwKKwkJCSAgICBFRklfRVJST1JfQ09ERShzdGF0dXMp KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGFuaWMoIkZhaWxlZCB0byBnZXQgZGV2aWNlIGhh bmRsZXMgKCVsdSkiLAorCQkgICAgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7CiAJfQogCisJaWYg KChwcmVmZXJyZWQgPSBtYWxsb2MoaHNpemUpKSA9PSBOVUxMKQorCQlwYW5pYygiRmFpbGVkIHRv IGFsbG9jYXRlICVkIGhhbmRsZXMgKCVsdSkiLCBOVU1fSEFORExFU19JTklULAorCQkgICAgRUZJ X0VSUk9SX0NPREUoc3RhdHVzKSk7CisKKyAgICAgICAgbnByZWZlcnJlZCA9IDA7CisJbmhhbmRs ZXMgPSBoc2l6ZSAvIHNpemVvZigqaGFuZGxlcyk7CisKKyAgICAgICAgLyogRmlndXJlIG91dCB3 aGljaCBoYW5kbGVzIGFyZSBwcmVmZXJyZWQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5o YW5kbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoQlMtPk9wZW5Qcm90b2NvbChoYW5k bGVzW2ldLCAmRGV2aWNlUGF0aEdVSUQsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZk ZXZwYXRoLCBJSCwgTlVMTCwgRUZJX09QRU5fUFJPVE9DT0xfR0VUX1BST1RPQ09MKSA9PQorICAg ICAgICAgICAgICAgICAgICBFRklfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAg aWYgKGRldmljZV9wYXRoc19tYXRjaChpbWdwYXRoLCBkZXZwYXRoKSkgeworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRbbnByZWZlcnJlZF0gPSBoYW5kbGVzW2ldOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucHJlZmVycmVkKys7CisgICAgICAgICAg ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBCUy0+Q2xvc2VQcm90b2Nv bChoYW5kbGVzW2ldLCAmRGV2aWNlUGF0aEdVSUQsIElILCBOVUxMKTsKKyAgICAgICAgICAgICAg ICB9CisgICAgICAgIH0KKworICAgICAgICBCUy0+Q2xvc2VQcm90b2NvbChib290X2hhbmRsZSwg JkRldmljZVBhdGhHVUlELCBJSCwgTlVMTCk7CisKKyAgICAgICAgLyogVHJ5IHRoZSBwcmVmZXJy ZWQgaGFuZGxlcyBmaXJzdCwgdGhlbiBhbGwgdGhlIGhhbmRsZXMgKi8KKyAgICAgICAgZm9yIChp ID0gMDsgaSA8IG5wcmVmZXJyZWQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChlZmlfbG9h ZChwcmVmZXJyZWRbaV0sIFBBVEhfTE9BREVSX0VGSSwgYnVmcCwgYnVmc2l6ZSkgPT0KKyAgICAg ICAgICAgICAgICAgICBFRklfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmhh bmRsZXAgPSBwcmVmZXJyZWRbaV07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEVG SV9TVUNDRVNTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3Ig KGkgPSAwOyBpIDwgbmhhbmRsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChlZmlfbG9h ZChoYW5kbGVzW2ldLCBQQVRIX0xPQURFUl9FRkksIGJ1ZnAsIGJ1ZnNpemUpID09CisgICAgICAg ICAgICAgICAgICAgRUZJX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpoYW5k bGVwID0gaGFuZGxlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRUZJX1NV Q0NFU1MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaW50Zigi RmFpbGVkIHRvIGxvYWQgJXMgZnJvbSBhbnkgZGV2aWNlIVxuIiwgUEFUSF9MT0FERVJfRUZJKTsK KwogCXJldHVybiAoRUZJX05PVF9GT1VORCk7CiB9CiAKQEAgLTM1OSwyMCArNTc1LDI3IEBAIHRy eV9ib290KHZvaWQpCiAJc2l6ZV90IGJ1ZnNpemUsIGxvYWRlcnNpemUsIGNtZHNpemU7CiAJdm9p ZCAqYnVmLCAqbG9hZGVyYnVmOwogCWNoYXIgKmNtZDsKLQlkZXZfaW5mb190ICpkZXY7Ci0JY29u c3QgYm9vdF9tb2R1bGVfdCAqbW9kOworICAgICAgICBFRklfSEFORExFIGZzaGFuZGxlOwogCUVG SV9IQU5ETEUgbG9hZGVyaGFuZGxlOwogCUVGSV9MT0FERURfSU1BR0UgKmxvYWRlZF9pbWFnZTsK IAlFRklfU1RBVFVTIHN0YXR1czsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICpmc3BhdGg7CisK KwlzdGF0dXMgPSBsb2FkX2xvYWRlcigmZnNoYW5kbGUsICZsb2FkZXJidWYsICZsb2FkZXJzaXpl KTsKIAotCXN0YXR1cyA9IGxvYWRfbG9hZGVyKCZtb2QsICZkZXYsICZsb2FkZXJidWYsICZsb2Fk ZXJzaXplLCBUUlVFKTsKLQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCXN0YXR1cyA9 IGxvYWRfbG9hZGVyKCZtb2QsICZkZXYsICZsb2FkZXJidWYsICZsb2FkZXJzaXplLAotCQkgICAg RkFMU0UpOworICAgICAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisgICAgICAgICAg ICAgICAgcmV0dXJuIChzdGF0dXMpOworICAgICAgICB9CisKKwlmc3BhdGggPSBOVUxMOworCWlm IChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpIHsKKwkJc3RhdHVzID0gQlMtPk9wZW5Qcm90b2NvbChm c2hhbmRsZSwgJkRldmljZVBhdGhHVUlELAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikm ZnNwYXRoLCBJSCwgTlVMTCwgRUZJX09QRU5fUFJPVE9DT0xfR0VUX1BST1RPQ09MKTsKIAkJaWYg KHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewotCQkJcHJpbnRmKCJGYWlsZWQgdG8gbG9hZCAnJXMn XG4iLCBQQVRIX0xPQURFUl9FRkkpOwotCQkJcmV0dXJuIChzdGF0dXMpOwotCQl9CisJCQlEUFJJ TlRGKCJGYWlsZWQgdG8gZ2V0IGltYWdlIERldmljZVBhdGggKCVsdSlcbiIsCisJCQkgICAgRUZJ X0VSUk9SX0NPREUoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgfQorCQlEUFJJTlRGKCJmaWxl c3lzdGVtIGRldmljZSBwYXRoOiAlc1xuIiwgZGV2cGF0aF9zdHIoZnNwYXRoKSk7CiAJfQogCiAJ LyoKQEAgLTM4Nyw5ICs2MTAsOSBAQCB0cnlfYm9vdCh2b2lkKQogCSAqLwogCWNtZCA9IE5VTEw7 CiAJY21kc2l6ZSA9IDA7Ci0Jc3RhdHVzID0gbW9kLT5sb2FkKFBBVEhfRE9UQ09ORklHLCBkZXYs ICZidWYsICZidWZzaXplKTsKKwlzdGF0dXMgPSBlZmlfbG9hZChmc2hhbmRsZSwgUEFUSF9ET1RD T05GSUcsICZidWYsICZidWZzaXplKTsKIAlpZiAoc3RhdHVzID09IEVGSV9OT1RfRk9VTkQpCi0J CXN0YXR1cyA9IG1vZC0+bG9hZChQQVRIX0NPTkZJRywgZGV2LCAmYnVmLCAmYnVmc2l6ZSk7CisJ CXN0YXR1cyA9IGVmaV9sb2FkKGZzaGFuZGxlLCBQQVRIX0NPTkZJRywgJmJ1ZiwgJmJ1ZnNpemUp OwogCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpIHsKIAkJY21kc2l6ZSA9IGJ1ZnNpemUgKyAx OwogCQljbWQgPSBtYWxsb2MoY21kc2l6ZSk7CkBAIC00MDEsMjQgKzYyNCwyNSBAQCB0cnlfYm9v dCh2b2lkKQogCQlidWYgPSBOVUxMOwogCX0KIAotCWlmICgoc3RhdHVzID0gYnMtPkxvYWRJbWFn ZShUUlVFLCBpbWFnZSwgZGV2cGF0aF9sYXN0KGRldi0+ZGV2cGF0aCksCisJaWYgKChzdGF0dXMg PSBCUy0+TG9hZEltYWdlKFRSVUUsIElILCBkZXZwYXRoX2xhc3QoZnNwYXRoKSwKIAkgICAgbG9h ZGVyYnVmLCBsb2FkZXJzaXplLCAmbG9hZGVyaGFuZGxlKSkgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJ cHJpbnRmKCJGYWlsZWQgdG8gbG9hZCBpbWFnZSBwcm92aWRlZCBieSAlcywgc2l6ZTogJXp1LCAo JWx1KVxuIiwKLQkJICAgICBtb2QtPm5hbWUsIGxvYWRlcnNpemUsIEVGSV9FUlJPUl9DT0RFKHN0 YXR1cykpOworCQlwcmludGYoIkZhaWxlZCB0byBsb2FkIGltYWdlLCBzaXplOiAlenUsICglbHUp XG4iLAorCQkgICAgIGxvYWRlcnNpemUsIEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOwogCQlnb3Rv IGVycm91dDsKIAl9CiAKLQlpZiAoKHN0YXR1cyA9IGJzLT5IYW5kbGVQcm90b2NvbChsb2FkZXJo YW5kbGUsICZMb2FkZWRJbWFnZUdVSUQsCi0JICAgIChWT0lEKiopJmxvYWRlZF9pbWFnZSkpICE9 IEVGSV9TVUNDRVNTKSB7Ci0JCXByaW50ZigiRmFpbGVkIHRvIHF1ZXJ5IExvYWRlZEltYWdlIHBy b3ZpZGVkIGJ5ICVzICglbHUpXG4iLAotCQkgICAgbW9kLT5uYW1lLCBFRklfRVJST1JfQ09ERShz dGF0dXMpKTsKKwlpZiAoKHN0YXR1cyA9IEJTLT5PcGVuUHJvdG9jb2wobG9hZGVyaGFuZGxlLCAm TG9hZGVkSW1hZ2VHVUlELAorICAgICAgICAgICAgKFZPSUQqKikmbG9hZGVkX2ltYWdlLCBJSCwg TlVMTCwKKyAgICAgICAgICAgIEVGSV9PUEVOX1BST1RPQ09MX0dFVF9QUk9UT0NPTCkpICE9IEVG SV9TVUNDRVNTKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIHF1ZXJ5IExvYWRlZEltYWdlICglbHUp XG4iLAorCQkgICAgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7CiAJCWdvdG8gZXJyb3V0OwogCX0K IAogCWlmIChjbWQgIT0gTlVMTCkKIAkJcHJpbnRmKCIgICAgY29tbWFuZCBhcmdzOiAlc1xuIiwg Y21kKTsKIAotCWxvYWRlZF9pbWFnZS0+RGV2aWNlSGFuZGxlID0gZGV2LT5kZXZoYW5kbGU7CisJ bG9hZGVkX2ltYWdlLT5EZXZpY2VIYW5kbGUgPSBmc2hhbmRsZTsKIAlsb2FkZWRfaW1hZ2UtPkxv YWRPcHRpb25zU2l6ZSA9IGNtZHNpemU7CiAJbG9hZGVkX2ltYWdlLT5Mb2FkT3B0aW9ucyA9IGNt ZDsKIApAQCAtNDM0LDEwICs2NTgsMTAgQEAgdHJ5X2Jvb3Qodm9pZCkKIAlEU1RBTEwoMTAwMDAw MCk7CiAJRFBSSU5URigiLlxuIik7CiAKLQlpZiAoKHN0YXR1cyA9IGJzLT5TdGFydEltYWdlKGxv YWRlcmhhbmRsZSwgTlVMTCwgTlVMTCkpICE9CisJaWYgKChzdGF0dXMgPSBCUy0+U3RhcnRJbWFn ZShsb2FkZXJoYW5kbGUsIE5VTEwsIE5VTEwpKSAhPQogCSAgICBFRklfU1VDQ0VTUykgewotCQlw cmludGYoIkZhaWxlZCB0byBzdGFydCBpbWFnZSBwcm92aWRlZCBieSAlcyAoJWx1KVxuIiwKLQkJ ICAgIG1vZC0+bmFtZSwgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7CisJCXByaW50ZigiRmFpbGVk IHRvIHN0YXJ0IGltYWdlICglbHUpXG4iLAorCQkgICAgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7 CiAJCWxvYWRlZF9pbWFnZS0+TG9hZE9wdGlvbnNTaXplID0gMDsKIAkJbG9hZGVkX2ltYWdlLT5M b2FkT3B0aW9ucyA9IE5VTEw7CiAJfQpAQCAtNDUzLDEzNCArNjc3LDE5IEBAIGVycm91dDoKIAly ZXR1cm4gKHN0YXR1cyk7CiB9CiAKLS8qCi0gKiBwcm9iZV9oYW5kbGUgZGV0ZXJtaW5lcyBpZiB0 aGUgcGFzc2VkIGhhbmRsZSByZXByZXNlbnRzIGEgbG9naWNhbCBwYXJ0aXRpb24KLSAqIGlmIGl0 IGRvZXMgaXQgdXNlcyBlYWNoIG1vZHVsZSBpbiBvcmRlciB0byBwcm9iZSBpdCBhbmQgaWYgc3Vj Y2Vzc2Z1bCBpdAotICogcmV0dXJucyBFRklfU1VDQ0VTUy4KLSAqLwotc3RhdGljIEVGSV9TVEFU VVMKLXByb2JlX2hhbmRsZShFRklfSEFORExFIGgsIEVGSV9ERVZJQ0VfUEFUSCAqaW1ncGF0aCwg Qk9PTEVBTiAqcHJlZmVycmVkKQotewotCWRldl9pbmZvX3QgKmRldmluZm87Ci0JRUZJX0JMT0NL X0lPICpibGtpbzsKLQlFRklfREVWSUNFX1BBVEggKmRldnBhdGg7Ci0JRUZJX1NUQVRVUyBzdGF0 dXM7Ci0JVUlOVE4gaTsKLQotCS8qIEZpZ3VyZSBvdXQgaWYgd2UncmUgZGVhbGluZyB3aXRoIGFu IGFjdHVhbCBwYXJ0aXRpb24uICovCi0Jc3RhdHVzID0gYnMtPkhhbmRsZVByb3RvY29sKGgsICZE ZXZpY2VQYXRoR1VJRCwgKHZvaWQgKiopJmRldnBhdGgpOwotCWlmIChzdGF0dXMgPT0gRUZJX1VO U1VQUE9SVEVEKQotCQlyZXR1cm4gKHN0YXR1cyk7Ci0KLQlpZiAoc3RhdHVzICE9IEVGSV9TVUND RVNTKSB7Ci0JCURQUklOVEYoIlxuRmFpbGVkIHRvIHF1ZXJ5IERldmljZVBhdGggKCVsdSlcbiIs Ci0JCSAgICBFRklfRVJST1JfQ09ERShzdGF0dXMpKTsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0K LQotCURQUklOVEYoInByb2Jpbmc6ICVzXG4iLCBkZXZwYXRoX3N0cihkZXZwYXRoKSk7Ci0KLQlz dGF0dXMgPSBicy0+SGFuZGxlUHJvdG9jb2woaCwgJkJsb2NrSW9Qcm90b2NvbEdVSUQsICh2b2lk ICoqKSZibGtpbyk7Ci0JaWYgKHN0YXR1cyA9PSBFRklfVU5TVVBQT1JURUQpCi0JCXJldHVybiAo c3RhdHVzKTsKLQotCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKLQkJRFBSSU5URigiXG5G YWlsZWQgdG8gcXVlcnkgQmxvY2tJb1Byb3RvY29sICglbHUpXG4iLAotCQkgICAgRUZJX0VSUk9S X0NPREUoc3RhdHVzKSk7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQlpZiAoIWJsa2lvLT5N ZWRpYS0+TG9naWNhbFBhcnRpdGlvbikKLQkJcmV0dXJuIChFRklfVU5TVVBQT1JURUQpOwotCi0J KnByZWZlcnJlZCA9IGRldmljZV9wYXRoc19tYXRjaChpbWdwYXRoLCBkZXZwYXRoKTsKLQotCS8q IFJ1biB0aHJvdWdoIGVhY2ggbW9kdWxlLCBzZWUgaWYgaXQgY2FuIGxvYWQgdGhpcyBwYXJ0aXRp b24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0JPT1RfTU9EVUxFUzsgaSsrKSB7Ci0JCWlmICgo c3RhdHVzID0gYnMtPkFsbG9jYXRlUG9vbChFZmlMb2FkZXJEYXRhLAotCQkgICAgc2l6ZW9mKCpk ZXZpbmZvKSwgKHZvaWQgKiopJmRldmluZm8pKSAhPQotCQkgICAgRUZJX1NVQ0NFU1MpIHsKLQkJ CURQUklOVEYoIlxuRmFpbGVkIHRvIGFsbG9jYXRlIGRldmluZm8gKCVsdSlcbiIsCi0JCQkgICAg RUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlkZXZpbmZvLT5k ZXYgPSBibGtpbzsKLQkJZGV2aW5mby0+ZGV2cGF0aCA9IGRldnBhdGg7Ci0JCWRldmluZm8tPmRl dmhhbmRsZSA9IGg7Ci0JCWRldmluZm8tPmRldmRhdGEgPSBOVUxMOwotCQlkZXZpbmZvLT5wcmVm ZXJyZWQgPSAqcHJlZmVycmVkOwotCQlkZXZpbmZvLT5uZXh0ID0gTlVMTDsKLQotCQlzdGF0dXMg PSBib290X21vZHVsZXNbaV0tPnByb2JlKGRldmluZm8pOwotCQlpZiAoc3RhdHVzID09IEVGSV9T VUNDRVNTKQotCQkJcmV0dXJuIChFRklfU1VDQ0VTUyk7Ci0JCSh2b2lkKWJzLT5GcmVlUG9vbChk ZXZpbmZvKTsKLQl9Ci0KLQlyZXR1cm4gKEVGSV9VTlNVUFBPUlRFRCk7Ci19Ci0KLS8qCi0gKiBw cm9iZV9oYW5kbGVfc3RhdHVzIGNhbGxzIHByb2JlX2hhbmRsZSBhbmQgb3V0cHV0cyB0aGUgcmV0 dXJuZWQgc3RhdHVzCi0gKiBvZiB0aGUgY2FsbC4KLSAqLwotc3RhdGljIHZvaWQKLXByb2JlX2hh bmRsZV9zdGF0dXMoRUZJX0hBTkRMRSBoLCBFRklfREVWSUNFX1BBVEggKmltZ3BhdGgpCi17Ci0J RUZJX1NUQVRVUyBzdGF0dXM7Ci0JQk9PTEVBTiBwcmVmZXJyZWQ7Ci0KLQlzdGF0dXMgPSBwcm9i ZV9oYW5kbGUoaCwgaW1ncGF0aCwgJnByZWZlcnJlZCk7Ci0JCi0JRFBSSU5URigicHJvYmU6ICIp OwotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSBFRklfVU5TVVBQT1JURUQ6Ci0JCXByaW50Zigi LiIpOwotCQlEUFJJTlRGKCIgbm90IHN1cHBvcnRlZFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgRUZJ X1NVQ0NFU1M6Ci0JCWlmIChwcmVmZXJyZWQpIHsKLQkJCXByaW50ZigiJWMiLCAnKicpOwotCQkJ RFBSSU5URigiIHN1cHBvcnRlZCAocHJlZmVycmVkKVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlwcmlu dGYoIiVjIiwgJysnKTsKLQkJCURQUklOVEYoIiBzdXBwb3J0ZWRcbiIpOwotCQl9Ci0JCWJyZWFr OwotCWRlZmF1bHQ6Ci0JCXByaW50ZigieCIpOwotCQlEUFJJTlRGKCIgZXJyb3IgKCVsdSlcbiIs IEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOwotCQlicmVhazsKLQl9Ci0JRFNUQUxMKDUwMDAwMCk7 Ci19Ci0KIEVGSV9TVEFUVVMKLWVmaV9tYWluKEVGSV9IQU5ETEUgWGltYWdlLCBFRklfU1lTVEVN X1RBQkxFICpYc3lzdGFiKQorbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgQ0hBUjE2ICphcmd2W10g X191bnVzZWQpCiB7Ci0JRUZJX0hBTkRMRSAqaGFuZGxlczsKLQlFRklfTE9BREVEX0lNQUdFICpp bWc7Ci0JRUZJX0RFVklDRV9QQVRIICppbWdwYXRoOwogCUVGSV9TVEFUVVMgc3RhdHVzOwotCUVG SV9DT05TT0xFX0NPTlRST0xfUFJPVE9DT0wgKkNvbnNvbGVDb250cm9sID0gTlVMTDsKIAlTSU1Q TEVfVEVYVF9PVVRQVVRfSU5URVJGQUNFICpjb25vdXQgPSBOVUxMOwotCVVJTlROIGksIG1heF9k aW0sIGJlc3RfbW9kZSwgY29scywgcm93cywgaHNpemUsIG5oYW5kbGVzOwotCi0JLyogQmFzaWMg aW5pdGlhbGl6YXRpb24qLwotCXN5c3RhYiA9IFhzeXN0YWI7Ci0JaW1hZ2UgPSBYaW1hZ2U7Ci0J YnMgPSBYc3lzdGFiLT5Cb290U2VydmljZXM7Ci0KLQkvKiBTZXQgdXAgdGhlIGNvbnNvbGUsIHNv IHByaW50ZiB3b3Jrcy4gKi8KLQlzdGF0dXMgPSBicy0+TG9jYXRlUHJvdG9jb2woJkNvbnNvbGVD b250cm9sR1VJRCwgTlVMTCwKLQkgICAgKFZPSUQgKiopJkNvbnNvbGVDb250cm9sKTsKLQlpZiAo c3RhdHVzID09IEVGSV9TVUNDRVNTKQotCQkodm9pZClDb25zb2xlQ29udHJvbC0+U2V0TW9kZShD b25zb2xlQ29udHJvbCwKLQkJICAgIEVmaUNvbnNvbGVDb250cm9sU2NyZWVuVGV4dCk7CisJVUlO VE4gaSwgbWF4X2RpbSwgYmVzdF9tb2RlLCBjb2xzLCByb3dzOworCisJY29uc19wcm9iZSgpOwor CiAJLyoKIAkgKiBSZXNldCB0aGUgY29uc29sZSBhbmQgZmluZCB0aGUgYmVzdCB0ZXh0IG1vZGUu CiAJICovCi0JY29ub3V0ID0gc3lzdGFiLT5Db25PdXQ7CisJY29ub3V0ID0gU1QtPkNvbk91dDsK IAljb25vdXQtPlJlc2V0KGNvbm91dCwgVFJVRSk7CiAJbWF4X2RpbSA9IGJlc3RfbW9kZSA9IDA7 CiAJZm9yIChpID0gMDsgOyBpKyspIHsKQEAgLTU5NywxMjMgKzcwNiwzMSBAQCBlZmlfbWFpbihF RklfSEFORExFIFhpbWFnZSwgRUZJX1NZU1RFTV9UQUJMRSAqWHN5c3RhYikKIAljb25vdXQtPkVu YWJsZUN1cnNvcihjb25vdXQsIFRSVUUpOwogCWNvbm91dC0+Q2xlYXJTY3JlZW4oY29ub3V0KTsK IAotCXByaW50ZigiXG4+PiBGcmVlQlNEIEVGSSBib290IGJsb2NrXG4iKTsKLQlwcmludGYoIiAg IExvYWRlciBwYXRoOiAlc1xuXG4iLCBQQVRIX0xPQURFUl9FRkkpOwotCXByaW50ZigiICAgSW5p dGlhbGl6aW5nIG1vZHVsZXM6Iik7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9CT09UX01PRFVMRVM7 IGkrKykgewotCQlwcmludGYoIiAlcyIsIGJvb3RfbW9kdWxlc1tpXS0+bmFtZSk7Ci0JCWlmIChi b290X21vZHVsZXNbaV0tPmluaXQgIT0gTlVMTCkKLQkJCWJvb3RfbW9kdWxlc1tpXS0+aW5pdCgp OwotCX0KLQlwdXRjaGFyKCdcbicpOwotCi0JLyogR2V0IGFsbCB0aGUgZGV2aWNlIGhhbmRsZXMg Ki8KLQloc2l6ZSA9IChVSU5UTilOVU1fSEFORExFU19JTklUICogc2l6ZW9mKEVGSV9IQU5ETEUp OwotCWlmICgoc3RhdHVzID0gYnMtPkFsbG9jYXRlUG9vbChFZmlMb2FkZXJEYXRhLCBoc2l6ZSwg KHZvaWQgKiopJmhhbmRsZXMpKQotCSAgICAhPSBFRklfU1VDQ0VTUykKLQkJcGFuaWMoIkZhaWxl ZCB0byBhbGxvY2F0ZSAlZCBoYW5kbGVzICglbHUpIiwgTlVNX0hBTkRMRVNfSU5JVCwKLQkJICAg IEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOwotCi0Jc3RhdHVzID0gYnMtPkxvY2F0ZUhhbmRsZShC eVByb3RvY29sLCAmQmxvY2tJb1Byb3RvY29sR1VJRCwgTlVMTCwKLQkgICAgJmhzaXplLCBoYW5k bGVzKTsKLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgRUZJX1NVQ0NFU1M6Ci0JCWJyZWFrOwot CWNhc2UgRUZJX0JVRkZFUl9UT09fU01BTEw6Ci0JCSh2b2lkKWJzLT5GcmVlUG9vbChoYW5kbGVz KTsKLQkJaWYgKChzdGF0dXMgPSBicy0+QWxsb2NhdGVQb29sKEVmaUxvYWRlckRhdGEsIGhzaXpl LAotCQkgICAgKHZvaWQgKiopJmhhbmRsZXMpKSAhPSBFRklfU1VDQ0VTUykgewotCQkJcGFuaWMo IkZhaWxlZCB0byBhbGxvY2F0ZSAlenUgaGFuZGxlcyAoJWx1KSIsIGhzaXplIC8KLQkJCSAgICBz aXplb2YoKmhhbmRsZXMpLCBFRklfRVJST1JfQ09ERShzdGF0dXMpKTsKLQkJfQotCQlzdGF0dXMg PSBicy0+TG9jYXRlSGFuZGxlKEJ5UHJvdG9jb2wsICZCbG9ja0lvUHJvdG9jb2xHVUlELAotCQkg ICAgTlVMTCwgJmhzaXplLCBoYW5kbGVzKTsKLQkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykK LQkJCXBhbmljKCJGYWlsZWQgdG8gZ2V0IGRldmljZSBoYW5kbGVzICglbHUpXG4iLAotCQkJICAg IEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwYW5pYygi RmFpbGVkIHRvIGdldCBkZXZpY2UgaGFuZGxlcyAoJWx1KSIsCi0JCSAgICBFRklfRVJST1JfQ09E RShzdGF0dXMpKTsKLQl9CisJLyoKKwkgKiBJbml0aWFsaXNlIHRoZSBibG9jayBjYWNoZS4gU2V0 IHRoZSB1cHBlciBsaW1pdC4KKwkgKi8KKwliY2FjaGVfaW5pdCgzMjc2OCwgNTEyKTsKIAotCS8q IFNjYW4gYWxsIHBhcnRpdGlvbnMsIHByb2Jpbmcgd2l0aCBhbGwgbW9kdWxlcy4gKi8KLQluaGFu ZGxlcyA9IGhzaXplIC8gc2l6ZW9mKCpoYW5kbGVzKTsKLQlwcmludGYoIiAgIFByb2JpbmcgJXp1 IGJsb2NrIGRldmljZXMuLi4iLCBuaGFuZGxlcyk7Ci0JRFBSSU5URigiXG4iKTsKKwlwcmludGYo IlxuPj4gRnJlZUJTRCBFRkkgYm9vdCBibG9ja1xuIik7CiAKLQkvKiBEZXRlcm1pbmUgdGhlIGRl dnBhdGggb2Ygb3VyIGltYWdlIHNvIHdlIGNhbiBwcmVmZXIgaXQuICovCi0Jc3RhdHVzID0gYnMt PkhhbmRsZVByb3RvY29sKGltYWdlLCAmTG9hZGVkSW1hZ2VHVUlELCAoVk9JRCoqKSZpbWcpOwot CWltZ3BhdGggPSBOVUxMOwotCWlmIChzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpIHsKLQkJc3RhdHVz ID0gYnMtPkhhbmRsZVByb3RvY29sKGltZy0+RGV2aWNlSGFuZGxlLCAmRGV2aWNlUGF0aEdVSUQs Ci0JCSAgICAodm9pZCAqKikmaW1ncGF0aCk7Ci0JCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1Mp Ci0JCQlEUFJJTlRGKCJGYWlsZWQgdG8gZ2V0IGltYWdlIERldmljZVBhdGggKCVsdSlcbiIsCi0J CQkgICAgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7Ci0JCURQUklOVEYoImJvb3QxIGltYWdlcGF0 aDogJXNcbiIsIGRldnBhdGhfc3RyKGltZ3BhdGgpKTsKLQl9CisJYXJjaHN3LmFyY2hfYXV0b2xv YWQgPSBlZmlfYXV0b2xvYWQ7CisJYXJjaHN3LmFyY2hfZ2V0ZGV2ID0gZWZpX2dldGRldjsKKwlh cmNoc3cuYXJjaF9jb3B5aW4gPSBlZmlfY29weWluOworCWFyY2hzdy5hcmNoX2NvcHlvdXQgPSBl ZmlfY29weW91dDsKKwlhcmNoc3cuYXJjaF9yZWFkaW4gPSBlZmlfcmVhZGluOwogCi0JZm9yIChp ID0gMDsgaSA8IG5oYW5kbGVzOyBpKyspCi0JCXByb2JlX2hhbmRsZV9zdGF0dXMoaGFuZGxlc1tp XSwgaW1ncGF0aCk7Ci0JcHJpbnRmKCIgZG9uZVxuIik7CisJcHJpbnRmKCIgICBMb2FkZXIgcGF0 aDogJXNcblxuIiwgUEFUSF9MT0FERVJfRUZJKTsKKwlwcmludGYoIiAgIEluaXRpYWxpemluZyBt b2R1bGVzOiIpOwogCi0JLyogU3RhdHVzIHN1bW1hcnkuICovCi0JZm9yIChpID0gMDsgaSA8IE5V TV9CT09UX01PRFVMRVM7IGkrKykgewotCQlwcmludGYoIiAgICAiKTsKLQkJYm9vdF9tb2R1bGVz W2ldLT5zdGF0dXMoKTsKKwlmb3IgKGkgPSAwOyBlZmlfZHJpdmVyc1tpXSAhPSBOVUxMOyBpKysp IHsKKwkJcHJpbnRmKCIgJXMiLCBlZmlfZHJpdmVyc1tpXS0+bmFtZSk7CisJCWlmIChlZmlfZHJp dmVyc1tpXS0+aW5pdCAhPSBOVUxMKQorCQkJZWZpX2RyaXZlcnNbaV0tPmluaXQoKTsKIAl9CisJ cHV0Y2hhcignXG4nKTsKIAogCXRyeV9ib290KCk7CiAKIAkvKiBJZiB3ZSBnZXQgaGVyZSwgd2Un cmUgb3V0IG9mIGx1Y2suLi4gKi8KIAlwYW5pYygiTm8gYm9vdGFibGUgcGFydGl0aW9ucyBmb3Vu ZCEiKTsKIH0KLQotLyoKLSAqIGFkZF9kZXZpY2UgYWRkcyBhIGRldmljZSB0byB0aGUgcGFzc2Vk IGRldmluZm8gbGlzdC4KLSAqLwotdm9pZAotYWRkX2RldmljZShkZXZfaW5mb190ICoqZGV2aW5m b3AsIGRldl9pbmZvX3QgKmRldmluZm8pCi17Ci0JZGV2X2luZm9fdCAqZGV2OwotCi0JaWYgKCpk ZXZpbmZvcCA9PSBOVUxMKSB7Ci0JCSpkZXZpbmZvcCA9IGRldmluZm87Ci0JCXJldHVybjsKLQl9 Ci0KLQlmb3IgKGRldiA9ICpkZXZpbmZvcDsgZGV2LT5uZXh0ICE9IE5VTEw7IGRldiA9IGRldi0+ bmV4dCkKLQkJOwotCi0JZGV2LT5uZXh0ID0gZGV2aW5mbzsKLX0KLQotdm9pZAotcGFuaWMoY29u c3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQotCXByaW50ZigicGFuaWM6ICIp OwotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXZwcmludGYoZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsK LQlwcmludGYoIlxuIik7Ci0KLQl3aGlsZSAoMSkge30KLX0KLQotdm9pZAotcHV0Y2hhcihpbnQg YykKLXsKLQlDSEFSMTYgYnVmWzJdOwotCi0JaWYgKGMgPT0gJ1xuJykgewotCQlidWZbMF0gPSAn XHInOwotCQlidWZbMV0gPSAwOwotCQlzeXN0YWItPkNvbk91dC0+T3V0cHV0U3RyaW5nKHN5c3Rh Yi0+Q29uT3V0LCBidWYpOwotCX0KLQlidWZbMF0gPSBjOwotCWJ1ZlsxXSA9IDA7Ci0Jc3lzdGFi LT5Db25PdXQtPk91dHB1dFN0cmluZyhzeXN0YWItPkNvbk91dCwgYnVmKTsKLX0KZGlmZiAtLWdp dCBzeXMvYm9vdC9lZmkvYm9vdDEvYm9vdF9tb2R1bGUuaCBzeXMvYm9vdC9lZmkvYm9vdDEvYm9v dF9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2ZDVhNjdhMTAuLjAw MDAwMDAwMDAwCi0tLSBzeXMvYm9vdC9lZmkvYm9vdDEvYm9vdF9tb2R1bGUuaAorKysgL2Rldi9u dWxsCkBAIC0xLDExNyArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAxNSBFcmljIE1j Q29ya2xlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0 IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93 aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMn JyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC VVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVND TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUg TElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNF UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS VVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9V VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T U0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqICRGcmVlQlNEJAotICovCi0KLSNp Zm5kZWYgX0JPT1RfTU9EVUxFX0hfCi0jZGVmaW5lIF9CT09UX01PRFVMRV9IXwotCi0jaW5jbHVk ZSA8c3RkYm9vbC5oPgotCi0jaW5jbHVkZSA8ZWZpLmg+Ci0jaW5jbHVkZSA8ZWZpbGliLmg+Ci0j aW5jbHVkZSA8ZWZpY29uc2N0bC5oPgotCi0jaWZkZWYgRUZJX0RFQlVHCi0jZGVmaW5lIERQUklO VEYoZm10LCBhcmdzLi4uKSBwcmludGYoZm10LCAjI2FyZ3MpCi0jZGVmaW5lIERTVEFMTChkKSBi cy0+U3RhbGwoZCkKLSNlbHNlCi0jZGVmaW5lIERQUklOVEYoZm10LCAuLi4pIHt9Ci0jZGVmaW5l IERTVEFMTChkKSB7fQotI2VuZGlmCi0KLS8qIEVGSSBkZXZpY2UgaW5mbyAqLwotdHlwZWRlZiBz dHJ1Y3QgZGV2X2luZm8KLXsKLQlFRklfQkxPQ0tfSU8gKmRldjsKLQlFRklfREVWSUNFX1BBVEgg KmRldnBhdGg7Ci0JRUZJX0hBTkRMRSAqZGV2aGFuZGxlOwotCXZvaWQgKmRldmRhdGE7Ci0JQk9P TEVBTiBwcmVmZXJyZWQ7Ci0Jc3RydWN0IGRldl9pbmZvICpuZXh0OwotfSBkZXZfaW5mb190Owot Ci0vKgotICogQSBib290IGxvYWRlciBtb2R1bGUuCi0gKgotICogVGhpcyBpcyBhIHN0YW5kYXJk IGludGVyZmFjZSBmb3IgZmlsZXN5c3RlbSBtb2R1bGVzIGluIHRoZSBFRkkgc3lzdGVtLgotICov Ci10eXBlZGVmIHN0cnVjdCBib290X21vZHVsZV90Ci17Ci0JY29uc3QgY2hhciAqbmFtZTsKLQot CS8qIGluaXQgaXMgdGhlIG9wdGlvbmFsIGluaXRpYWxpc2VyIGZvciB0aGUgbW9kdWxlLiAqLwot CXZvaWQgKCppbml0KSgpOwotCi0JLyoKLQkgKiBwcm9iZSBjaGVja3MgdG8gc2VlIGlmIHRoZSBt b2R1bGUgY2FuIGhhbmRsZSBkZXYuCi0JICoKLQkgKiBSZXR1cm4gY29kZXM6Ci0JICogRUZJX1NV Q0NFU1MgPSBUaGUgbW9kdWxlIGNhbiBoYW5kbGUgdGhlIGRldmljZS4KLQkgKiBFRklfTk9UX0ZP VU5EID0gVGhlIG1vZHVsZSBjYW4gbm90IGhhbmRsZSB0aGUgZGV2aWNlLgotCSAqIE90aGVyID0g VGhlIG1vZHVsZSBlbmNvdW50ZXJlZCBhbiBlcnJvci4KLQkgKi8KLQlFRklfU1RBVFVTICgqcHJv YmUpKGRldl9pbmZvX3QqIGRldik7Ci0KLQkvKgotCSAqIGxvYWQgc2hvdWxkIHNlbGVjdCB0aGUg YmVzdCBvdXQgb2YgYSBzZXQgb2YgZGV2aWNlcyB0aGF0IHByb2JlCi0JICogaW5kaWNhdGVkIHdl cmUgbG9hZGFibGUgYW5kIGxvYWQgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqCi0JICogUmV0dXJu IGNvZGVzOgotCSAqIEVGSV9TVUNDRVNTID0gVGhlIG1vZHVsZSBjYW4gaGFuZGxlIHRoZSBkZXZp Y2UuCi0JICogRUZJX05PVF9GT1VORCA9IFRoZSBtb2R1bGUgY2FuIG5vdCBoYW5kbGUgdGhlIGRl dmljZS4KLQkgKiBPdGhlciA9IFRoZSBtb2R1bGUgZW5jb3VudGVyZWQgYW4gZXJyb3IuCi0JICov Ci0JRUZJX1NUQVRVUyAoKmxvYWQpKGNvbnN0IGNoYXIgKmZpbGVwYXRoLCBkZXZfaW5mb190ICpk ZXZpbmZvLAotCSAgICB2b2lkICoqYnVmLCBzaXplX3QgKmJ1ZnNpemUpOwotCi0JLyogc3RhdHVz IG91dHB1dHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2JlZCBkZXZpY2VzLiAqLwotCXZvaWQg KCpzdGF0dXMpKCk7Ci0KLQkvKiB2YWxpZCBkZXZpY2VzIGFzIGZvdW5kIGJ5IHByb2JlLiAqLwot CWRldl9pbmZvX3QgKigqZGV2aWNlcykoKTsKLX0gYm9vdF9tb2R1bGVfdDsKLQotLyogU3RhbmRh cmQgYm9vdCBtb2R1bGVzLiAqLwotI2lmZGVmIEVGSV9VRlNfQk9PVAotZXh0ZXJuIGNvbnN0IGJv b3RfbW9kdWxlX3QgdWZzX21vZHVsZTsKLSNlbmRpZgotI2lmZGVmIEVGSV9aRlNfQk9PVAotZXh0 ZXJuIGNvbnN0IGJvb3RfbW9kdWxlX3QgemZzX21vZHVsZTsKLSNlbmRpZgotCi0vKiBGdW5jdGlv bnMgYXZhaWxhYmxlIHRvIG1vZHVsZXMuICovCi1leHRlcm4gdm9pZCBhZGRfZGV2aWNlKGRldl9p bmZvX3QgKipkZXZpbmZvcCwgZGV2X2luZm9fdCAqZGV2aW5mbyk7Ci1leHRlcm4gdm9pZCBwYW5p Yyhjb25zdCBjaGFyICpmbXQsIC4uLikgX19kZWFkMjsKLWV4dGVybiBpbnQgcHJpbnRmKGNvbnN0 IGNoYXIgKmZtdCwgLi4uKTsKLWV4dGVybiBpbnQgdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90 IHN6LCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApOwotCi1leHRlcm4gRUZJX1NZU1RFTV9U QUJMRSAqc3lzdGFiOwotZXh0ZXJuIEVGSV9CT09UX1NFUlZJQ0VTICpiczsKLQotZXh0ZXJuIGlu dCBkZXZwYXRoX3N0cmxjYXQoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgRUZJX0RFVklDRV9QQVRI ICpkZXZwYXRoKTsKLWV4dGVybiBjaGFyICpkZXZwYXRoX3N0cihFRklfREVWSUNFX1BBVEggKmRl dnBhdGgpOwotI2VuZGlmCmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL2Jvb3QxL2ZhdC1hbWQ2NC50 bXBsLmJ6Mi51dSBzeXMvYm9vdC9lZmkvYm9vdDEvZmF0LWFtZDY0LnRtcGwuYnoyLnV1CmluZGV4 IGEzZWMzMmQxNDUxLi5jNzMwOGE0Nzk4NSAxMDA2NDQKLS0tIHN5cy9ib290L2VmaS9ib290MS9m YXQtYW1kNjQudG1wbC5iejIudXUKKysrIHN5cy9ib290L2VmaS9ib290MS9mYXQtYW1kNjQudG1w bC5iejIudXUKQEAgLTIsMjUgKzIsNTAgQEAgRkFUIHRlbXBsYXRlIGJvb3QgZmlsZXN5c3RlbSBj cmVhdGVkIGJ5IGdlbmVyYXRlLWZhdC5zaAogRE8gTk9UIEVESVQKICRGcmVlQlNEJAogYmVnaW4g NjQ0IGZhdC1hbWQ2NC50bXBsLmJ6MgotTTBFSUguMyUhNjI5MzY/JCkzJCxgJlU5X19fX19aXktK Wl9eTl9eT15aX15bT05fTkteSkpeS1pOS05OSgotTVpOS05aT0peUGArXCMkITAkIzFELSxAIylE VCMxQiZBSURRLEFEOiMxSFRSYC0jKUQ4MFEhRDosKURgYAotTSMxQEYzMGBgYCZAYCRKSjkhX0hV NDoiLDMhLEYwJkMoODNgRjMwVGBUIUImISxGYChQM2AiIzAsQGAvMgotTTo6YCMwIURgLEMxYFQ5 IzMoYFI5LWBUOEFIOjksMyg5JkBUOi0sQCMwUjkmJCwwOSZDIjlgYGBUOClEVAotTWBgYCFIYGBK QkRAXzJCOkZGOSlJSFEvMSM6QC1gOmBSIyhUYCZAOi1gIUg4RkFIOjo6J0o6Oi1gOSYxWgotTUZG ISdIQUI4VS8xLyo4LS0tM0VWKyo8WkxcUzlCWEVDWzZJIixCRSQwQkRBJDEkJUc2NlRINlBGJDAo MAotTVhEQSEiJjxISiw9LVc9Sz5QWjU6TF5cMTk+PlQySzNPQT5UVVM4TT5WSl87OVA3Ijg7Jjcm OFI1MU4+RgotTTFFJUEjNitGOSpIQCQoOUo8SzJWNz1ESFtZU0spTERONjE4XTBTJDMiTTZKSzVK VTpNOUoqNSk0NDQ0NAotTTQ1SlUlOjU6OlU6TTZLPDpUNDJISEhISEhZSTpKKTQ0NDQ0LCtCO1I1 PiUlJSUlJSUkPiEhISEhISEhIQotTSEhISEhISEjNzZDQDxDMUhUOi0mQzEhISEhISEhISFUWCYj IUBQOCwmI0o4WSpCQkJCQkJCQidAPCMhQAotTVA4LCYjIiQ0KioqKioqKi4/Wk8pVTU5Tlc5WV81 UkI5PVNHSyVBTzkxRC8sUlc6SlVFV0o3Q0lDVCRNLAotTV1dPk9NOy1OJV5XWyE8PUhbPC0xPFFZ KVc8YCVCUlQ8RGArMzM3NVtcRk9TXFlCRDBgUlNMOCxVVjUxPgotTVJSIlNWTEw+TEcqWjFHK0sl TjspOz5JSVlMLTdMKkQ8QjVVKzIvMjo1SjZLN0srT043UzwtWldbYDg7JAotTTlFU1M2WT5bUS1T SDs1RDtSVV8rWksuK1RFTVglSyhRUTgxM1Y6R1MxWlQ7IlJcIUgkSy9aOj0lMzg2TQotTVBKTC48 Sz9DKko2QERJKVwjNktVPSxAVjM6LUpXMz4uYFg7Qk4wU1MyLEk7VSpJOzsuXU81Wk1JOUNNVgot TVkoOzgqXENYWC1TUFcoXlo1V0lXUFcwVkA/N0RMR1pAUUpRSEM2IUotXFVbPkBUJDJGKTMiN1VN MlYrOgotTStZTUZXO01PNl48LUBMKVI3KzxXTFZKRU8sJkhOSSs+WFUwSkIoTCxLSTpGW09EJVpV Qz0tMFdCXDdDPwotTS4iUCclODNDTDFCTSRSTEhEKTomNyxET1NMWTE9MlksSF9FT0dgPCVZUzAs IVEmJFhTXScpOENYRVhQXwotTUZYMi03KiwjJVA7IVFdVilFI0JPIjgzIz9cVjNDLi5ZI0UsMT9M NVMmLE5DJURRST47K2BEUz5OUUw1PwotPys2SUY5MTVWJDAiJClAYE0rIlEpQChfOSshP14rTjIq PCokQVhBKjhBQGBgCitNMEVJSC4zJSE2MjkzNjMkIiUmXGAnWUFfX19fX19fX19fX19fX15PXlpf XltfTlteSl5OS15LWk9LT05KCitNWk5LXlpOW15YYENfJS1gYEhIYCU0MSIxKCopYEJKIUg6YGBg P001YGBgIzBgYGBgYGBgYC1gOi0jMGBgCitNYGBgYGBgYGBgYGBgYDU1NSRfMkAhT19VMkovX1RK QV9KSj40IUhgYGBgVGBgYGBgYCZAYGBgYGA6YGBgCitNIUhgYD5IYCZAIUhSYDAsRjMoIURSYGBU UDBUYDpgYCMwUSMzMCMoYGAtYC1gUiZAJkAhRCFIJkZDJCZDCitNMGBgJkBgIzBAOSxGMCMpRGAh SUBBSGBUYGAmQUImRkAmMGBgOmA6IUQtYC1gIygjMC0tJigtJkBgYC1gCitNYCZBYFI5LEAmMyhg IzMhIzAhSGBgLSMkLS1gLEBgYFRgVCMoOmA6YCYwJkA6OiwwOi1gYGA6YGAtYDU1CitNKF8yM10i MTMtM1RJWko/WypEOiRfXTUtM1RWQkZVLUo7MSYzKUEnSDBcRjIvNFEmR0ohWkZgM1UjVSdFCitN LzAzMUI4VSMkOSdKIVpBTShcKiNSIzAsNFM0XzUsVS8wVko+JFxCKjlPNy45SFEmS0BGIVJWODg4 ODVTCitNLCYjIyMjIyZQT0ZQUCFAPFctQFImOyNgUFBQJ0pKTFlFVC8wTEovUTRPN086Ki88Tk85 XlQ/Iz1KXjJfCitNUD9UTlo/MD1YXClYO1E3RU03Ry8uWVcxTC1LX0IsLCwsLCwsYCVAVzQkXEoh YC5AKCFgKkAwIiEjYCgiCitNYEAoImBAKCJgQCgiYEAoIlohXmBcUFhHSyZRUidGXCxTPFMtUzxF TjtFNlkuWU47RllOO0ZZTjtGWU47CitNRllOO0dgWScvPEInKFklJyhZJyhZJyhZJyhZJVVVVVVV VVVVVVVWLkxRVSw9Rkw5Q0xKUUY1TFUlQFJTCitNNFw7MEpTKkpKSkpKTkA6RTZJRjc5RVVVVVVV V1w3Sls/XFlMK0tLS0tLS0k6NTZFJiY9OTk5OTk5KjRJCitNMkUqNEsqSy5GWzMsUTQ5LEYzKURS MkUqNEkyRSspNURVVDBOTk5OTk5YLzI9Sz09PT09PT09KzRKVS5cCitNSEE9PT09PT1RSkxFRjIm PT09PT09PVMvMDlNPj9JTEdKR00nOS9DTlg9XFwxXTdTMkpKSkpKSko3SUU3CitNNyg5VUVFRUVF REkyRSo0STJMSkxBRzY2NjY2NjJFKjRJMkUqUkpSJj05OTk5OTk/SysrKysrKysrKTkqCitNTEQs WlJSUlJSUypKSkpKSkpKSjVVNVdAPTNCSFI5LEYzKURZNTU1NTU1NTU0TSpLMkFHNjY2NjY2MkUq CitNNEkyRSpSSlImPTk5OTk5OSpSSlImPTk5OTk5OU1dU1Q2RURSOFo3NUxbNFM4PUJTQzFEPVBa XUojUldBCitNKj5YU1MrT0k5KyxPUDohRyxgWyMoUkctJyE5Myo4YCQ0XUtGI2AhSF1bU19SP1lf RV0zRkdgUGA+PD9ACitNTko7VUZdTztWXU87Vl1PO1ZdTztWXU87Vl1PO1ZdU1NWM0I+Ozs2VUJW TUswVk1LOlZNSzpWTUs6Vk1LCitNOlZNSzpWTUs6Wl5aWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlsr TVNCO0ZVMSNCPE1QTjRUTERJMkUqNEkyCitNTkpOQUc2NjY2NjYzQSo0STJFKjVFNUdHWig3Nzc3 Nzc9OTU1NTU1NTU1Kyk1REFHNjY2NjY2MkUqNEkyCitNRSpSSlImPTk5OTk5OVxCSkpKSkpKSko1 VTVXMS41NyxaJSswVE0rMkVJOjRNKksyQUc2NjY2NjYyWyFWCitNQ1hbTVc+L0ovXzdDXkM1NTU1 NTU1MlpHXUU5VjNJXylZREw2SUo6RklKOkRJMkUqNEkyVEpNK0deU14jCitNRlQsNkVJOjZFSTo0 STJFKjRJMlRKTSteO15bJTFEUjksRjMpKjRJMkUqNExFNjImPTk5OTk5OSo0STJFCitNKjRLKkso OVVFRUVFRURJMkUqNEkyTEpMXlsxIlpaWlpaWjRJMkUqNEk3NTcwU0srKysrKy9SKktLK0g5CitN VVVVVVVVVUU1NUczTSw5VUlLPCZHLzc6Pl41RUdXSFQqLCYjISQxJDEkPCNAPCNAPShfPTxNVDtI TkA9CitNTVFOLVFOLVFOLVFOLVFOLVFOLVFOLVFMUFM2UF9XWz8iVjY2NjY2NjY2NjY2NjY2Njkj KDkjKDk7PT0yCitNXENUXTU1NTQ/VCY5MTExXSdgN1MjSCMwVC0jMEEiJCgwQSMrXVslQlE4TkdQ XVVBXFI/U1c6T1hXUTZNCitNMTExMTdZPypZRjdTK1smPicsVE0rMlRPXEoqKiosOioqKigwQSIk KDBPMUMsOUMsMyRRLDMsLCdHLzM+CitNUF1ZRE9KOV1eO142WihCKEIoQihCKEIoWT1XQ1A2Ozkl RUVFRUVFRUVFRUVFRUVFRkVRJDEkOjBCKEIoCitNQihMTExYRyUxMTFXRitVJ0pYWydFVTU1NT1V VzYrJUJRPF9VJkswVC0jME0xMTExXkteRUJROEw3KlonCitNSk5CTFUsLk0/TS5TPU5JUF1BR1k8 STJFVj5TTC5XXztVK1pMRjMpREEiJC5EXUdJSyo0STBBIicqSEhICitNSEEiJCgwQSNfLVcrTlc+ Tl4+YF5MXlJZS1E3Q09SRyNQTiVQTiVQTCYjIUBQOCwmIyFAUD4sXFVZMy8qCitNNEkyRSo0STJF KjRJMihCKEIoQihCKEIqNElMPV9YRislQlEwQSIkKDBBIiQoMEEiJ0Y+VVE4TDYrTz5YCitNPUxf RD1WQSIkKDBBI11CQkJCQiQoMEEiJCgwQSNGXiVcKDlcLCwtIzBULSIkKDBeJF4+WjVUS1pTUFY/ CitNP0RfMUgmQj9YQihCKEIoQihCKENDNj0/IlI1KjRJMkUqNEkyRSo7Lzk5QFA4LCYjIUBYNyJY NyJYNyJYCitNN2BYJyRYRyRYRCgwQSIkKDBBIic2VDQ0ND41MTExMSIkKD9dLl8/Mj8zMEEiJ0sq KioqLy0hMTExMSIkCitNKDtKKioqL080NDQ0MEEiJCgwQV09WDNKV1YnLT87PixbSV1ZU0dRJ0gn Ql1NSzpWTUs6Vk1LOlZNSzpWCitNTUs6Vk1LPiJcLV1FVFs4Vi1DOFYtQzhWLUM4Vi1DOFYqNEIo QihCKEIoQihCRSo0USwzJEFcJkJCQkIkCitNKDBBIiQvXl8oXzNULSMwVCgwQSNbRz9PJD5RPFUi JCgwQSIkKDBBMkJCQkIkKDBBIiQoMEEiJCgwXlReCitNVltVWFNbQ1tLUVcuPy8+MFxFWTtAPCNA MSQxJDEkMSQxRjZBPSpUMkUqNEkyRSo0STJFKjRCKEIoQihCCitNKEIoQkZRTDsnQFQ0NDQwQSIn RTQ0NDQ+QkhISEhcLkJCQkIkKDBaQ0tPKllTRy48WVIkKDBbRVQ+KyVCCitNUT07MTExMTNMO1lR WSsjUD9ANjY2NjZLQUA4ODgjLUFBQGA+NUg6JkFIOioqKiooPzo0NDQwPjZTL19HCisrV1E9UjEz QTBEIyQiJSZcYAogYAogZW5kCmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL2Jvb3QxL2ZhdC1hcm0u dG1wbC5iejIudXUgc3lzL2Jvb3QvZWZpL2Jvb3QxL2ZhdC1hcm0udG1wbC5iejIudXUKaW5kZXgg MjNlMDYzZWUyM2QuLmVlMmVlOTk1NGY1IDEwMDY0NAotLS0gc3lzL2Jvb3QvZWZpL2Jvb3QxL2Zh dC1hcm0udG1wbC5iejIudXUKKysrIHN5cy9ib290L2VmaS9ib290MS9mYXQtYXJtLnRtcGwuYnoy LnV1CkBAIC0yLDI1ICsyLDUwIEBAIEZBVCB0ZW1wbGF0ZSBib290IGZpbGVzeXN0ZW0gY3JlYXRl ZCBieSBnZW5lcmF0ZS1mYXQuc2gKIERPIE5PVCBFRElUCiAkRnJlZUJTRCQKIGJlZ2luIDY0NCBm YXQtYXJtLnRtcGwuYnoyCi1NMEVJSC4zJSE2MjkzNj4jNjcpSGAmVTlfX19fX1peS0paX1pOX15P XkpfXltPSltOS15KSl5LWk5LTk5KCi1NWk5LTlpPSl5QYCtcYGBgImBgOmBUOjotYDo4QFBAJjFE LSFIOjgwOClCOiMwYFRgYCwkVCMhLEBQQzA5Ci1NIzMzIjksMGBUKGAhSCMxSUhUIUlCIyJgOSYw VCZBSUEhQEYpSC1gIzBgYFAzMCwkUiMiLSFELS0sKURRCi1NYCMwQGAmQC0mRkMwJkYoLCghRDkj MDomRiQmIjhGQFRgLWBgIyEtYFAzKCwoVCYwVFRQRjMkYC1gNTIyCi1NJF8oSDItRFQwVDo4QyhU IUghWkMzMFItJkAtYCxAJkMxSDpgOiMxTTMoVCxAOjo6LzEjMzMxRklJQClACi1NKVo6KVJLNU42 PDcsTzwlWylTNFpEKE9ERDEiKjIiKEIoK0U5OSkiUDJBJCIkLiMoKCgwWl5CSE8pOTcqCi1NS05U UzI7Ly8hNl8sOik1SVZJPkxQR1VNOF8pTVYmX1FPJyQ8UT5ZO2BKL1RFVFIuPTUwOlwyQmAwQUY5 Ci1NPF8uTUU7OjswTjw5JUQlXFFbJyomNkI0KlU6Sk02SzVKVVExMkkpMTExMTExNks0NUkqVEpV Ok02Szw6Ci1NWjQyNDQ0NDQ0OFktMSkxMTExMTFbRjxfNlIrJUJROEw2KyRYMzMzMzMzMzMzMzMz MzMzMz03WlxFMk02Ci1NSzVKVTpNLS0tLS0tLS0tPlI0NDQ0NDQ0N04jWyVCUThMNislQlEtTSkq KioqKioqLCEwSEhISEhISFlbCi1NLVJSNTc1NzsuTVM/SEUpR0xbOk0tUSkmL1RHMDlRNk1aJSlY SjQ+PERdNVtTNU0+Xl1NNlc4Q0AuLlQ9Ci1NViZIT1hcQFQkYCVKV0hZJGAtL1pWIUE/KUs+WUVF WjFgIyosJiMsXUc0ODRGLzcvUkRSJVk8P11GRzhYCi1NJi0/VlVXSipBUikrWjMyLy86OVsjNE02 Ujs4LUZWSzwsMU9HJDhLKkxFJkpSPjRRP1VbSjpeUyRdRVBLCi1NRDgxKV5EIjxBPiVIXj4yT1U6 RkxDMzFLSz8/LF8kRVM3NFMlKylVN0pVNUQ6VlFEKVItMlUzIjdbRldXCi1NLURQVlY7QU5WXjkt UiYiVDtHLEE+NkVKMzo9RVZFNkVOS0MjUFpHLl09OTo3NSpHPT4tNE5cT0FdJz0tCi1NYExbUk5c TU0vPlonODo2US5SQVdVKz1IT0hEQ1o2SD84XyFeKzotSlZTXjZaO1VQJyM8RVJHLVskVydgCi1N SiteMTk+PlQqSEIrM0dNKzRWVlMoTlEpJks/YF85SVdcLFBTIyQ7UU9HIjwtUVYqUUZCOF4yKSEp SCkuCi1NNyhfQFA5KFIkRylEQzxMMU5WXDtVR1ZfPClRJyY/RlkrJT8kWjFRP0RXUi8/RENAOFci TScoXzxSVEJKCi1NMicjPV5YSzguLFVbQ04wUSdfLDVNVixZO0YsYFFJJyxEVzdFVS1fKFM+TVlG LF8tLklUPEQ1OCwwIiQpCi02MGA3NUk6RDtdJlYyPCVfWE5ZKElQSDInIUsrRFRgYGAKK00wRUlI LjMlITYyOTM2MydaSVFQYCdaI19fX19fX19fX19fX19fXk9eSl9eW09KW15KXkpLXktaTktPTloK K01aTkteWk5bXlhgQ19gYGA6KmAhKCkiMSgyKSEhSCZAJjA5IUgmQDosMyhUIzBgOEBgVCMiJkMw LWBgYGAKK00tYDkmQzBgYGBgIzFEOSxGKUghRFQ4JTU1MjohRDkvX100NTNfXTUzXzU0X101M100 YGAtYGBgYGBgYGAKK01gYCZAYGBgYCFIYGBgJkBgVDpgYFQhSDpgMDohSCFEJjA6IUgmQyRSLWBU YCYoYC1gUEFIVCMwYGBgIzAKK00mMUhUYGBgYGBUOSYzKUI6YDktJigtYFRgUiMoLWBUIzFCOSZA OmAjJGAmQDgwVDohSGBgYCFIIyhUOmAKK01gYGBgOixDKURRLWAsRkMkJkA6YDkhRCZAOiFIUSxD MC1gIUJgIzAsKDotYFRgYGBgVCFEOi1gYGBgYC0KK00mMURSOEZAJjMxQDU1KF8yLzBFLSZIVkUt WEo5WkozOkdfSkRDOTBdMyg6JkMwOi0vNF0wLzQ+SF0wOzQKK01gIzAtJkBWSVpGRkY6RkMwOj5J SFZIPkghSUhXSElIPjI6OiNVLzRdMyM0XSYzOkZEWyQ0VD1UWzsrJDoKK01OOjgnMzohQUFBNzBQ OCwsLCwsOyJeQUAjYE4tJ1EtYFBQUFAnSzpNKUdWTzpMWi9IRE5bMVdTMV42X2AKK006P1UnQE5f Plo+KFwpW1lYW18hX1RcRVlDWUM1QD5FWFo3QlouVjg7VkVBQFBQUCdJTSc1Wy5TSyouTFoKK01S S0suTFtVUDwnIVA8JyFQPCchUDwnIVA8JyFVJzlNQ043LlZHSTwtIz5ULVs+RU87VTZdLl1PO1Zd TzsKK01WXU87Vl1PO1ZdTztXLFZOQzpBTTs1JlVNOzZVTTs2VU07NlVNOzZVTTs2VU07NlVPOyZd U01bTSotWzAKK01IVDsnMzpXKlUvLVI1OiU1NTU1NTchSjU6RkE/IzBOTk5OTk5dS109WFVcK0tL S0tLS0k8QktEMUFJNjYKK002NjY2MkUqNEkyRSpSSlNOLl9ULDUmOy1GUzlMVEkyRSo0STJTNTlO RTEiWlpaWlpbRl03WCVVVVVVVVUKK01VVE0ySzRdXzEiWlpaWlpbTEU2OlMtIzJOTk5OTk5bO1Um Q0k6PlhTPk0/P09UR043XSNYI1JXUF8yKkoKK01KSkpKSkk+TDU9WkFJNjY2NjY2MkUqNEkyRSpS SlM1UiNQVic7X1I1Mlk3Klk3Klk3KkUqNEkyRSo3KkoKK01ZNC0qUlJSUlJTRkpKSkpKSkpKRT01 PVdFJCtLS0tLS0xaSkpKSkpKSkk5SkxXUDooNzc3Nzc3PVVUSysKK00rKysrKyspPEJLRDBUSysr KysrKTJFKjRJMkU5NTkjMkxMTExMTEU5NTkjMkxMTExMTFpPWVc7PEMtRlEKK01TI0I2NTlFSSY0 WkVHJjUxV0NNJitTJ0JKPlhdNTldIy9LT1A6KUcsYF1NVj4nTCNOXCwsYCIqP0U6YFAKK01gPlRd S1U/PV4lW1NOTSRYJmAjTSdTO1s9UTY8NyVRPDclUTw3JVE8NyVRPDclUTw3JVE8NzBbWUw/LS0K K01TPFE7RllEVy1TPFctUzxXLVM8Vy1TPFcsQyhSLEMoTk5OTk5OTk5OTk5OTk5OTk5OTk5aQ0ou SFpDSDsKK01GUU47RSQtQ0lNO0U8Qy0qNEkyRSo0S0pLSDo1RUVFRUVEWDJFKjRJMkU5NTlaQkIl VVVVVVVXPjU1NTUKK001NTU1MlM1OUg6NUVFRUVFREkyRSo0STJMSkxBSTY2NjY2Nj5bSkpKSkpK SkpFPTU9WjlSVVQvRz5USkUKK01KOkZJNUo6RE0ySzRBSTY2NjY2NjJdQF1IXz8/Uy8/T0EvQk8v Xkg1NTU1NTU1MltLXEE5V1tVL1JeV0UKK01CVS0zNFUtMzRFKjRJMkUqNyhKWSc1XVFCSFM5TFY7 LUZFKjRJMkUqNjpLLSMyTExMTExMRSo0STJFKjUKK01FNUQtKlJSUlJSUjRJMkUqNEk2NTYwVEsr KysrKykyRSo0STJFOTU5XEZCJVVVVVVVVEkyRSo0STJOSk4KK01BSTY2NjY2Nj8zVTc2NzBUS0tL S0tLSyxMUlMrTks6PFNLM1ZXTFBTUyxNYFUhXVovWTFAUDgoQihCKEIKK00oQixWWkFKKzg2Sjkz LlY2NjY2NjY2NjY2NjY9I0g9I0FaP0w9U1c+UUw7JlFMOyZRTDsmUUw7JlFMOyYKK01RTztWXU88 T0stVzhbWkpKSkovIi0iQkJDUiwhPzAuIURSOSxEKDBBW1JCQkJDRF8xUThMNitOLC9TLC8KK00j R1tJWCNQN1tDTjwqKioqKl4nUl1PR0tPSVlUOj5XWScoWScoX0xISEhIQSIkKDBBIiQoME8xMTEx IiQKK00oPURVT1pHTzc3P1kvQE9eN0UvQy8uPzROOVMuOSQxJDEkMSQxJy1OXj4oXEVKTVsrKysr KysrKysrKysKK00rKyssTyQxJDFJQihCKEIoQ0g9I0g9I0hISEhcNyVdNV07J0xORzU1NTVVXk9C UThMNzVdNUpSOSxGMlYKK00+KyVCUT9AXk9ROEw2K0VbN1svWVJTW0FYM101WEM3XitTPS40STJc I0dfJlwzVjZJPzVGUzlMVCgwQV0KK01dRy4zKURSMEEiJlZCQkJCJCgwQSIkLz5PPy8lPixfVD9a T11XRS9fN0YvLz5OOl07NlVNOyFAUDgsJiMKK00hQFA4LCYjUkc3Ly05WTJFKjRJMkUqNEkyRSox JDEkMSQxJDEkMTJHLllXRD43QlE4TDQoMEEiJCgwQSIKK00kKDBBVjMjSl4hRFI5LEYzWCddO1cz UDdDKDBBIiQoMEEiJC9QSioqKigwQSIkKDBZXkNWWFRYODg5LEYKK00zKSIkKD5XPi5TOy1PRz80 XlVIN1ktJFQ7XyQxJDEkMSQxJDEkPD5dWUdWQDRJMkUqNEkyRSo0SURTMy0KK00sJiMhQFVNOzZV TTs2VU07NlVOOVMtQzhWLUIkKDBBIiQoMEEjWzpCQkJDVDoqKiooMEEjXy1YW1gzWDoKK00kKDBd PTExMTEiJCg+RCJCQkJDP1xDJUJROE8uSEhISEEiJCgwQSNSN187WzVfWF4qXi5cVVslWVNZM1cK K00jVStfW1cvMj0pVEcyPSlCUThMNislQlE4TDYrWydXLSJWUTJFKjRJMkUqNEkyRSoxJDEkMSQx JDEkMTIKK01FLj0iJCg+VkhISEhBIiQuJSUlJSdFXUNVXjMpRFIwQSInN1xBXDFXS1hSJCgwQSIk KDBBIkUlJSUkKDAKK01BIiQoMEEiJCgwQVVXRi9aN0ZPRC9ETy8/Kj4uWyNZO19EMSQxJDEkMSQx JDc6LVRbXkUqNEkyRSo0STIKK01FKjRJJDEkMSQxJDEnLFlHLFlXLllXLlxGQkJCQiQoMF0mQkJC Q0s0NDQ0PjUxMTExIiQoPkpeW10nVCcKK01ILzA+QEEiJC9bR0lcNislQltSQkJCQkdMPDYrJUJJ Q0FAODg4IzFBQUBgPkNEUjksRjUlJSUkL0NKKioKKzEoL0YtI1M3X1hOWShJUEgyIUNdNFhYYGAK IGAKIGVuZApkaWZmIC0tZ2l0IHN5cy9ib290L2VmaS9ib290MS9mYXQtYXJtNjQudG1wbC5iejIu dXUgc3lzL2Jvb3QvZWZpL2Jvb3QxL2ZhdC1hcm02NC50bXBsLmJ6Mi51dQppbmRleCAxMTAxZGVi MDIyNy4uMWZhNDEzODA1NDIgMTAwNjQ0Ci0tLSBzeXMvYm9vdC9lZmkvYm9vdDEvZmF0LWFybTY0 LnRtcGwuYnoyLnV1CisrKyBzeXMvYm9vdC9lZmkvYm9vdDEvZmF0LWFybTY0LnRtcGwuYnoyLnV1 CkBAIC0yLDI1ICsyLDQ5IEBAIEZBVCB0ZW1wbGF0ZSBib290IGZpbGVzeXN0ZW0gY3JlYXRlZCBi eSBnZW5lcmF0ZS1mYXQuc2gKIERPIE5PVCBFRElUCiAkRnJlZUJTRCQKIGJlZ2luIDY0NCBmYXQt YXJtNjQudG1wbC5iejIKLU0wRUlILjMlITYyOTM2NEM2NSNUYCZVO19fX19fWl5LSlpfXk5fXk9e Sl9eW09KW05LXkpKXktaTktOTkoKLU1aTktOWk9KXlBgK1wjMGBgMGAjMCMpRCZAVFI4QURgLDAh RC0tJmBAOiFIJkBgIUIjKUlIUjotLSMoOSwKLU1BQWA4RkBRLDAsIzUyYF9VND9KQGAmQUhgYGA6 YDpgYGBgYGBULWBUJkBSJkBUYGBgYGBgYGBgYCRgYFQKLU1gUjkhSC0sRig5YCMkYDkjMzFAKCZA OiFIYGA4QFI6OixGQzMwUiYzKDgwJilILDMkI2A1MjEoXUkxSSkKLU1GKjo4QzFaYEYwOmBUUixA OiZDMzA6YFIhSFRULCQhRFRULUo6JkBSJkMpSUEsOkYzMyhTNF0tM2AtLSQKLU1aLS1CNj02RjFN ITwyOEZKQSIrRSkkMEI8QEIoQiJUSys6MiVMKTBCISInKEQkJCg5RjpATFJPK1E7VEwKLU1OSjlZ WTJRWksxKi0wVVM1K1VNNlI7RT8tVF9RUUcqPS08OSNKOiM+UlshJi00MDsoMkJgMEFFOT05NTYK LU1PKyJJSCYsOE09S0VCRigzLEEkSDVKVSU6TTZLNUsxLS5BKS0tLS0tLTZLMzVJKlRKVTpNNks8 UlUzMjMKLU0zMzMzMzhBNEZERkZGRkZGTVg7Oyw8LCNgUCwjYFAsIi5gQDAoJCIhYEAwKCQiIWBA MEo1LE9KWSolOk0KLU02SzVKVTpJNEo1KkUySTRKKkUySTRKNSpFUTw5T1c+W0xLKlJMSypSTEsq SU5ZKUlJSUlJSUw2RjMzMzMKLU0zMzM9N1ZMTDkxVkVOW1VQW00kSSw1WC0tK0BSMTpYS1RMP0cl TEw+LERcWSotKkRVKzZNQl5ZTUZcN1MKLU1CLCFTNkNNUFVFVSdIJ0IwYDRWLScoQCFKS05dXj9a PF0qVUJgJi85SiMqOU5ATzkuSDZGWURONUFULEwKLU1TLVVBVy1BOzpPM0o2MVI9Ii49KUVZLShU SzNNOFVTOE5NOzFOJlw8JVElXlkzIjklPThaLUFVTVlBO1cKLU1QWUtLKTU7P0A2RDskRFdMIkow TEUqLlFdUkE+UVssOy5RSCVWRE0vS0dFKVsuSkJYNFQ9NTZfLjBKRDoKLU1VTCZRNzMkT1I7PU5G Xj9QWEtDTCVTRj06MUZLTyZXJUExKU8sWVdVJkZNOzFOXVcwUVc9NlUqVURTXVEKLU0wTVxDTlxH OkxeS1QlTzJVJUcwOzMzNUpKWUZBRzhJLDUkRD86VUNcJ1ovVTtRTzdgPClfM0NMIVI3Lz0KLU0l Qj1MPCtgSCtKMTs2Pz8lJDElKkg4WzM0TV9OJCtWME82TztZSjchOTVFNyU8OT9MJVI3LTgzIzop QlkKLU0oRCRGP0RaNEJeLFcpJVcpU1koWDtCL1s8OT9MXFAnXy0qWUM8Tj5QR1JMTFk9Wz9IVVxE P1tBXEJET0wKLU1QKTIwUDZBPEVSRys7NVMnLTxZVCYkT0YmWjNJS0xQWSczRFBJLCIxRi1FVFwt XlNVWiYyREJDLTFgKDAKLTZFYCE6VEo5JmBDP0ksJV9YTlkoSVBIMiIxSypBWmBgYAorTTBFSUgu MyUhNjI5MzY2TSskVlBgJ1olX19fX19fX19fX19fX19eT15KX15bT0pbXkpeTkteS1pOS19OSgor TVpOS15aTlteWGBDXyVgYCZCQGApIjBEMiRCMCZKSjo4RmBGYGA+XTVgYGBgYGBgYGBgYGBgYGBg YGBgYAorTWBgYGBgYGBgYGAqSkpEVGAmR19eSjJJX15JNF9SSkdKYGAhSGBgLWBgYGBgYGBgJkAt YGBgYGBgYGBgJgorTUAjMGAmQUghYDohSCFIYDojMzBSYCZGQUBGQFQtIUlCIUgjKCMzJGBgOWBg YDpgIyIsYEBgLEA6YGBgYAorTTAmQDpgOmAmQFRULEAhSUg4KUgtIzA6OEA6YFJgVFFgYCYwYGAm QGBQQ2AoYCMoJkBgYGAkIUgmQCZAIQorTUgtLSMoYDo6JiI6IzBUJkYoJkAsQC0sMGAhRGBgIUhg LChQImBgUiFIYGBgYCpKRD9JJ0gxKjsyOTMvJQorTSpGVko7P0pKP0pGR00yJkYwVkJgLzQnSmA+ MiZAUjojMCMxSC0nSDMpSVkwJ0onSWBUOiZAVFRUXzEoVAorTVZJRkgnSS1JLzMzNF0mMylFLy1C RktbNVVcTDFMVlNgWis0LCwsKlpGIyFBQUFBQzg3VTg4YFArQ1FNOAorTVBQUFAnO1U6Uy9LPTlH MV0qRVcqLzZNN1lLVVM3XkpbVVstV1teSV8kXV5cKVYnQi9CTyg+PlY4JzpMLgorTUZbM0s0PiNK UFBQODg4YDUjMSwyU0gmYFYhQCwhWCNgOCgsJCIhYEAwKCQiIWBAMCgkIj1GWjtMVy5bQQorTVMt UVonIzRYLTNAWCk8JyE1UDNQPCchUDwnIVA8JyFQPCchUDwnIVItU0xNUiZZTjQ7RllOO0ZZTjtG WQorTU47RllOO0ZZTjtGWU47RyFTTiNGPCc6NDwmSTFKWVcxOzcwOydEWSpNMkpKSkpKS0xWUTVM OkVcLTJaWgorTVpaWltdP1sjWCVcK0tLS0tLS0k6Kk0kODpVRUVFRUVESTJFKjRJMkxKTFpfTF0z JTFGUzlMVjstKjRJMgorTUUqNExVNjomTTk5OTk5OVJcR1UnTTxWOy1GUzlMVjo2UTVMPUJCJVVV VVVVVzI1OUssVC06WlpaWlpbSworTV8yOk43N1ozLVZbXClbKV5aXVheIl4uX1haSkpKSkpKSko3 VTpLVTomTTk5OTk5OSo0STJFKjRLKksoOgorTVVFRUVFRURJMkUqNEkyTEpMQUs2NjY2NjY3SkpK SkpKSkpFPTU9VzUkK0tLS0tLTFpKSkpKSkpKSTlKTAorTVdRLUc8OSw2QzFIVDotJEkyRSo0STJU NTooOlVFRUVFRUZXMD5MUFBdO0ZTOUxWOy1GUzJWKk1CJk05OQorTTk5OTkqUkpSJk05OTk5OTlV Lzg9S0hTOUw9Jz0sTlMjMSxNRycuLE5DTUc3LENSN0AqPlZdLUY3VCxcTgorTV5dSCcvOCFWJzRQ XysuWVBQUGAoSV45SiNgIVs7Sj5ZX0FfRF5UVTk4JmAjVCtNJzxOKlNCWE4rQlhOKworTUJYTitC WE4rQlhOK0JYTitCWylaUVNOSldNWyVPO1YzPldNWz5XTVs+V01bPldNWz5XTVsqOTMqNzc3Nwor TTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nz0tVFc5LVtHO1ZdMSNHPSVNPSFIUzJFKjRJMkUqWkpaJk05OTk5 OTkuJAorTUkyRSo0STY1Nj5ESEE9PT09PT1aSkpKSkpKSkpKNjpLLSM2TExMTExMRSo0STJFKjVF NUQtOlJSUlJSUworTVctNTU1NTU1NTRLSktOTFolPTNUMjYzMUhUMlQ6KToqTSQtOlJSUlJSUjdZ M1ZDT0dcW0wvXVdSJ0VeSQorTTU1NTU1NTUyW0NcQTlXO1RPUz5PKyVMOyZRTDsmUSo0STJFKjRN JTZDSj1ZVlYzJUtUOi0mQzFIXTNBQQorTTk5NTU1NTU1KzhKViteQ15CUjhNJkMxSFQ6KTJFKjRJ MkVISlQwVUsrKysrKykyRSo0STJFOTU5IzZMTAorTUxMTExFKjRJMkUqNUU1R1JaKDc3Nzc3NzJF KjRJMkUqWkpaJk05OTk5OTlMSk5MTkFLNzc3Nzc3NjU1NgorTT5SNz9PTFc7LSdPVlFYO0gvQ04x WTtEOzZVTTxDRDxCKEIoQihDLSxYVSFMKlZKWTtOWysrKysrKysrKworTSsrKysrKy05UzddXlVQ RislQlE4TDYrJUJROEw2KyVCUTpGWkNKLkhaJks9WU9RSTJFRENPUzRISEheJworTUArOkFaYFI5 LEYyJCgwQSIkL0tfVFw2KyVCXStBWyMjVzRfPU86Tl09Ul5ANDQ0NDVfRlonN1NdVT83UworTShV XkNUOi0mQ15aQkJCQiQoMEEiJCgwQSJdJSUlJCgwQVRGVV84XVpbI1grWENRJ0JPJz40Xkw8QihC KAorTUIoQihCKENERz0vITlNRltaSTk5OTk5OTk5OTk5OTk5OTlJPDEkMSZEKEIoQi4xUi4xVEcy PSlURy8xMQorTTFYJitaV01YXUNUOkpKSk5RViw2KyVCXSFWVlMpRFI5KzQ0NDQ+TlpOKyVCUT0j Sz87XkJMW0lXW05XTgorTVcpWl9FUjksRjNOXkNaX1c/TD0lXSxWOy1GQSIkL1AsWVI5LEYyJCgw Wj0lJSUkKDBBIiQoP1dPPy9gPgorTSJfVT4mX1o+Klw5WSNSV1YzO007NiMhQFA4LCYjIUBQOCwm IyFYU0pHRC81NEkyRSo0STJFKjRJMkQxJAorTTEkMSQxJDEkPFNGPFNGPiVfW0JROEw0KDBBIiQo MEEiJCgwQVxZWzMlQlE4T0A+XD1cW1FYIiQoMEEiJAorTS8+VDQ0ND9YVDQ0NDBBIiQoMEFTPUVX SFVYODg5LEYzKSIkKD1aXiRaWzhHUyxeXlVeK1xWQDolX0IoQgorTShCKEIoQihCLi05RVwjLyo0 STJFKjRJMkUqNFY7JUJQOCwmIzpWTUs6Vk1LOlZNSzpZJyhZVy5ZVy5BIgorTSQoMEEiJCgwXlpI SEhIXFpCQkJCJCgwX1Q/Ij8jPiZBIiQvTDoqKiooMEEjSkExMTExUEhISEhcSkJCQgorTUNRWioq KigwQSNfTVw1XVBeLFw5XEVZK0wvKj8sP04vMy8oW1tFPEtFPEtFPEsoUixDKFIsQyhSLEMoUwor TVtbJ1ctSjRJMkUqNEkyRSo0STJEMSQxJDEkMSQxJDRJMkQoMEFXRSUlJSQoMEEiJCg+K1lPWC4z KURSMAorTUEiJ1JPIj01XVpeMEEiJCgwQSIkKDBJMTExMSIkKDBBIiQoMEEiJCg/KT4wXCVZK1kz WTtSV1MnQS8tPworTS0+PkIoQihCKEIoQihCWzBORD9USTJFKjRJMkUqNEkyRShCKEIoQihCKENE PENGPFNGPFNRKioqKigwQQorTSNTSioqKi8zNDQ0ND9eNDQ0NDBBIidUV0pfLlxRWUNTJ0YoMEEj V1NNPDYrJUJdNTExMTEzXF8lQlE4SgorRzhYOCYmJmBVODg4YCdHOSxGMylFMTExMSNRVSUlJCdH TTNfWV9eK04yKjwqJEBVSThGVmAKIGAKIGVuZApkaWZmIC0tZ2l0IHN5cy9ib290L2VmaS9ib290 MS9mYXQtaTM4Ni50bXBsLmJ6Mi51dSBzeXMvYm9vdC9lZmkvYm9vdDEvZmF0LWkzODYudG1wbC5i ejIudXUKaW5kZXggNzRjNzM0ZDJkMzcuLmMwNDQwY2FlNDIxIDEwMDY0NAotLS0gc3lzL2Jvb3Qv ZWZpL2Jvb3QxL2ZhdC1pMzg2LnRtcGwuYnoyLnV1CisrKyBzeXMvYm9vdC9lZmkvYm9vdDEvZmF0 LWkzODYudG1wbC5iejIudXUKQEAgLTIsMjUgKzIsNDkgQEAgRkFUIHRlbXBsYXRlIGJvb3QgZmls ZXN5c3RlbSBjcmVhdGVkIGJ5IGdlbmVyYXRlLWZhdC5zaAogRE8gTk9UIEVESVQKICRGcmVlQlNE JAogYmVnaW4gNjQ0IGZhdC1pMzg2LnRtcGwuYnoyCi1NMEVJSC4zJSE2MjkzNjEvIjEmJGAmVTtf X19fX1peS0paX1pOX15PXkpfXltPSltOS15KSl5LWk5LTk5KCi1NWk5LTlpPSl5QYCtcIzBgYDBg IzAmQzMxSCMzJCYkYFIsQUgtIzMiIyEsMzA6YCZAYCFARkA4KUQmJDojCi1NKDo6ODMpQmAmQDpK MDo/WkovVTMwYCxAYGBgLWAsRkBgYGBgYGBSLWBgYFJgYGBgYGBgYGBgJGBgVCFICi1NVFQ6YFRR IUFgLEMoOiMwVFBAUDMkVCZAIUhgYDgpSCYiOSFBJkBSJkZGJFI4QCFIIkpCKEdNKjooM1ZJCi1N Sjo7MjktREYpWkMxSCMpSUEmMCxDMUhgUmBWSCMzJCMoI1IoUiMoVDhGRlIkUChSOCZBSFEzVFRV Lk0vCi1NNENINTZYSkJTQlIlJFIiJUhCQSIiJEhBIiQoMCpNKThRMDYoQyEiYEBAT1hBYEBAW14y OExIWT8rSlRaCi1NWTQtKlxRNF09SkRXUC1EVVJcO0VNNl48MU9XKzxRQCw5OVZdSyw8IiojPig7 VUckLEhKMEAiIiMtUVJMCi1NSyU7VSVAVSMpTERNNT06Ky0oTigxQEk0SUo1KkUySTU0RElENERE RERERSpFKTJCSTFJNEo1KkVVOyEpCi1NJSkpKSkpKUNFIjIqMjIyMjIyVkFNTFFQUCwjYFAsI2BQ KFgiIWBAMCgkIiFgQDAoJCIhIkEwWz83UTMqCi1NNSpFMkk0SjUiQTBINColIkEwNColIkEwSDQr LlNUJlFLKlJMSypSTEsqUkE+UTIyMjIyMjI2SjEpKSkpCi1NKSkpRS5bQ0RJTFs2OjFfPT08MSlI TS1JKVlXJkJBMTo6Uys6KTY1LTBCXSUmJ00oTTxWMlw7QU5VXFhDCi1NRE5AUDZLSyFMKlwvNC8o QGAzVS03JEBgXisoWzJbXl9ROFYkKGAsSlwmIUZNISw7MisnSk5fQk0sPzU/Ci1NXTxMXTdROl1U TVxRMFFWT0YmJSU8UTpRWzpFTCZTN0MrLVJXU0BOLFkrRywhQitBPFZTWlxNO1hHIlw6Ci1NMk9G Ki1bWDU2JVYxPCJgSEIrKExaQiY8XV45PjBOSDs+SUlXOyhKTlZFRkk7PkMnKVlYVjUrXVhCQilc Ci1NW1pFVktMQFczPi1eX0lRVyo8VVQ2JFQzVTdOOS5SRzMxN1ZBXC46WkwqSl1NS1Y9OzleTS5I QlReRUY2Ci1NNjhPPFM4LS5JXE5NLktWN0U7QzZUSio5JklFNEcuUEElI1w2Tz9IVzteJVxYI0FO MFkzRk5AWjsjPTlECi1NL1YuL005Qk8kTDsrOEI6JCgzSzpaRjwrPiglVlY7QE8vPDVGNjk8RVMn Lz0lVFYiUSYqVTMqMTBCJDdDCi1NUTMoPT4qOFg5R1hIOSYrI0JBUideLjRZO0ZNLFlbSEwhQE9Z ODskPzhTO0o3Ry4wXkYqJy9RO148V1YlCi1NUFEmKiNJLTJQJzQ9NU5GIlBGJl9VQi4qUTc3OFJV LDYpQzE4RDVfJFNOVlFMNT8tOyxbNiokVj5BYCQkCi03JDhgJUEuR0I3WickMT0pX1hOWShJUEgy YEdBKEMiYGAKK00wRUlILjMlITYyOTM2PVNPI0NAYCdZQ19fX19fX19fX19fX19fXk9eSl9eW09K W15KXk5LXktaT0tPTkoKK01aTkteWk5bXlhgQ18qYGAmQkBgNCIwRDIoQjAmSSpgYGBgYGBgYCMw YGBgYGBgYCMoLWBgUmBgYGBgYGAKK01gYGBgYGBgIkpKRSdaSGA6P19aREpHX1pKPkpHX0pKYGBg YGBgYGBgYGBgYGBgYCMwYGBUYGBgYGBgYCMKK00wOiZBWkAkIUgmQCZAIUgtLSMoYDo6JiI6IzBU JkYoJkAsQC0sMGAhRGBgIUhgLChQImBgUiFIYGBgIWAKK006IUghSGA6IzMwUmAmRkFARkBULSFJ QiFIIygjMyRgYDlgYGA6YCMiLGBAYCxAOmBgYGAwJkA6YDpgJkAKK01UVCxAIUlIOClILSMwOjhA OmBSYFRRYGAmMGBgJkBgUENgKGAjKCZAYGBgYEpKMV5FJ1o6MjI+RS0vVTMKK01VKj9fSTJHTTIp X1pKRjNUVko+SD5JSDosQzAsVEA6OzQnSiZAOiNVLS1gOmA5YD5IIVpDMzA6YD5IYD4KK01VM1Um M1RDVS0tJkFaM1QzMyM0XUo6M00xOzVdLFtTO0wnLVNTYFpLNCxMTEtaRjMpRUVFRUxIOFU5OWAK K01SLytVIysrKyg5Q1ouWiMvVC9INj1HSSRPNk9MVUdXS1s1S0lBOCJIJVYsPDdIVEFOQzQnLi5A PjBfQEEKK01LWChGSyEyVj0jNyooMEEiJChgJVBLU1c2SVVVRzc9PUFVVzc+Ilo3Mlo3Mlo3Mlo3 Mlo3Mlo3Mlo3MloKK003PE5FUD5LPU5eMC8vWTpHJUo8NyUrQlhLTio+K0JYTitCWE4rQlhOK0JY TitCWE1bT10nMUhMVDorLSYKK01DMUhUOi0mQzFIVDotJkMxSFQ6LSc2PCc2PU5YTjVHJUo2Ok4j Sk49VScsXiVNNzpFVVVVVVVXPS45PVMKK00tMyM0UFBQUFBQXy1dMzdeJksrIyMjIyMjIjZZPU4x RUs0STJFKjJFKjRJMkUqRVUuUV4zSjslRjstRlMKK005TFRJMkUqNEkyUzc5SDpVKjRJMkc7O18z XlRTOUxWOy1GUzlJPFJbRj1GUiYmJiYmJicwTlM0UzBVTCwKK00sLCwsLlFXVktNTT9SXjtaMV1I XyU/Sk8lPlk+Xj9aXVROTk5OTk5ORVpBPVgqJk0yRSo0SSo0STJFKjQKK01KNzRBSzRJMkUqMkUq NEkyRSpFVSg6VSo0STJGL0paNEkyRSo0RUZOUzBVSjRJMkUsW0tLS0tLS0tJODcKK004PjNTPktW TUM8Vy1TPFctUjRJMkUqNEk7RVZZIzZJMkUqNEUqNEkyRSo1K0owVUo0STJFKTROSSM2STIKK01F KjRUXl5eM1csVjs5Tj5NOlcsVTk+Uj5QOiJDTVc4LCdETFhJWztUVitaN1FLT1A5XVNFQFM+SFk3 LUcKK00iOTY1RWAkNl1BSiMoIV43VU87PlVfPFtfNU1SLEAnSCdSK1pJUjRZLjNEWS4zRFkuM0RZ LjNEWS4zRFkKK00uM0RZLlg+TjwnPS0mQzhUOi1LMUhUOi0mQzFIVDotJkMxSFQ6LSZDTjc8S0tL S0tLS0tLS0tLS0tLS0sKK01LS0tLS0w2R0xNSFQ2MFguSllXNDtGOjRJMkUqNEk4NzgwVUo0STJF KVJFKjRJMkUqRVUuXUxBQUFBQUEKK01BWCVVVVVVVVVVVExVVjomTTJFKjRJKjRJMkUqNEo3NEFL NEkyRSo+T11NMkUqNEkyRExVVjtUMz8/NFsKK01OVE1LPFctUls8Vyk7RVUoOlUqNEkyRE9OV0xX Qi9XVzk+Wz5fPjlaNT09PT09PT0rT18iNF8mPyw/JlsKK00kTUNGPFNGPFNGOFlGSltUPzhQUFBQ UFBQSVUlVjtLXidMNjlMVjstRlMyRSo0STJFKy09RkFLNEkyRSoKK00yRSo0STJFKkVVKDpVKjRJ MkRJMkUqNEkyST0yJk0yRSo0SSo0STJFKjRKNzReKTkjIyMjIyMiNEkyRSoKK000STg3OD5GOTYw UFBQUFBQTk5QSUEjNlBQUEcjIyMiRS0oPS5URVdLMkZWTFRdOUZHUk0rOVUnXEhMTEwKK01CKEIo Qz5XTVs+V05QXURaS05XVCc3PilULkFULkFULkFULkFULkFULkFULkFULkFaI0w9S1FfNjwnIVAK K008JyFQPCchUDwnIVA8JyFQPCc2PTlVRzY9M089LlVKRSo0SF1KOkVFRUdeNjBLNC5OPSxJMkUi JCgwQSIKK00nVDdYPlFMOyZRV1Y3TDxPO1NYI1Y7XF1eRltVOTk5OT9dV0o9Qy9WXi4iKFU9NzxX LVM8X0ZMTExMQSIKK00kKDBBIiQoMFE5OTk5IiQoPSNHPipfSD4sXVBfUz9bTyo/YD8lPkg7Vl1P O1ZdJDEkMSQxJDxKW01HJ0IKK00uRVUrJUJROEw2KyVCUThMNislQlE4TSdCKEIoVDEkMSQxJDFC W0FXI04nIlJSU0xbJ1QvSjhfIlpNVVUKK01VV0M9P1FNSzpWTUtLXkVaRlVNOzZVQlJSUlNVXz9b JlFMOyZfVDdLLltJXThcKV4uX0A7XyJbOzpWTUsKK006W09KXz0/Sj9AO0YtVjstRlMwQSInVi48 WzZVTTs0KDBBVy1FRUVEKDBBIiQoP1NPWkc5P1cvPE8pPlwKK00+NFxNXCVZQ1UzR1lXLllXLllX LkxMTExMTExMTExcNVlDUidKKjRJMkUqNEkyRSo0STIoQihCKEIoQigKK01CKjRJM1IvPzsmUUw7 JCgwQSIkKDBBIiQoMEFZW1ZGUUw7JlFYX0JPJD4mWyokKDBBIiQqTExMTEEiJCgKK00wQSIkKDBc T1dPWmBVWTk5OzZVTTs0KDBBWyVbSVdDTydPJ18jUkdZLFxTWyw/WEIoQihCKEIoQihDQzYKK007 PyJeMTJFKjRJMkUqNEkyRlM5Oys2NjY2NjY2NjxbRzxbRzxbRztWXVA8JyFQMEEiJCgwQSIkKD4h OTkKK005OVlVRUVFRCgwQVtBWSNSN05UKDBBWkpSUlJTTkBMTExMQSIkLi1FRUVHUTsrKysoMEEi JCxDKF5JXUMKK01AV1cvUTlZXlNVV1wsUVcrIV5HPjgsJiMhQFA4LCYjIUBQOCwmIyFdO1s2PTsu STJFKjRJMkUqNEkyRSgKK01CKEIoQihCKEIoSTJFLEMoUixDUFsrKysoMEEiJCgwX1pbN0tNSzpW TUokKDBeJ1kjX01YK1daJCgwQSIKK00kKDBBIlVFRUVEKDBBIiQoMEEiJCgwQV9YXiJcPVwpXC1c MVlDX1lbSVZHUUdRVl1PO1ZdJDEkMSQxJDEKK009Ri5GP1RJMkUqNEkyRSo0STJFKEIoQihCKEIo QihJM01XO08+VjY2NjBBIidHNjY2Nj1dOTk5OV9TOTkKK005OSIkKD5EXk5cW1M3Rk8tPjpBIiQv WydIXUM4Vi1DUCsrKysrP0BbJlFMOyVNRjYxRUVELTY2NjAhWVYKK0E8I1NbK0ZWVEkyJlZSUlJS J1AlRUVEJ1FWSV9aX18lVyklLiUiMFcuXC4uYAogYAogZW5kCmRpZmYgLS1naXQgc3lzL2Jvb3Qv ZWZpL2Jvb3QxL2dlbmVyYXRlLWZhdC5zaCBzeXMvYm9vdC9lZmkvYm9vdDEvZ2VuZXJhdGUtZmF0 LnNoCmluZGV4IGQ5ZGZiMjdkZTI1Li43YzQ2ZTkyNmY2MCAxMDA3NTUKLS0tIHN5cy9ib290L2Vm aS9ib290MS9nZW5lcmF0ZS1mYXQuc2gKKysrIHN5cy9ib290L2VmaS9ib290MS9nZW5lcmF0ZS1m YXQuc2gKQEAgLTEzLDcgKzEzLDcgQEAKIAogRkFUX1NJWkU9MTYwMCAJCQkjU2l6ZSBpbiA1MTIt Ynl0ZSBibG9ja3Mgb2YgdGhlIHByb2R1Y2VkIGltYWdlCiAKLUJPT1QxX1NJWkU9MTI4aworQk9P VDFfU0laRT01MTJrCiAKICMKICMgS25vd24gZmlsZW5hbWVzCmRpZmYgLS1naXQgc3lzL2Jvb3Qv ZWZpL2Jvb3QxL3Vmc19tb2R1bGUuYyBzeXMvYm9vdC9lZmkvYm9vdDEvdWZzX21vZHVsZS5jCmRl bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODYwYTg2MGZkZi4uMDAwMDAwMDAwMDAKLS0t IHN5cy9ib290L2VmaS9ib290MS91ZnNfbW9kdWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODAg KzAsMCBAQAotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTggUm9iZXJ0IE5vcmRpZXIKLSAqIEFs bCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgUm9iZXJ0IERyZWhtZWwK LSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQgTmF0aGFuIFdo aXRlaG9ybgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoYykgMjAxNSBF cmljIE1jQ29ya2xlCi0gKiBBbGwgcmlnaHRzIHJldmVydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0 aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBg QVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFS RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRP UlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5H LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAq IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg SU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9S VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkK LSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU SEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqICRGcmVlQlNEJAotICov Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8 c3lzL2NkZWZzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8ZWZpLmg+Ci0K LSNpbmNsdWRlICJib290X21vZHVsZS5oIgotCi1zdGF0aWMgZGV2X2luZm9fdCAqZGV2aW5mbzsK LXN0YXRpYyBkZXZfaW5mb190ICpkZXZpY2VzOwotCi1zdGF0aWMgaW50Ci1kc2tyZWFkKHZvaWQg KmJ1ZiwgdV9pbnQ2NF90IGxiYSwgaW50IG5ibGspCi17Ci0JaW50IHNpemU7Ci0JRUZJX1NUQVRV UyBzdGF0dXM7Ci0KLQlsYmEgPSBsYmEgLyAoZGV2aW5mby0+ZGV2LT5NZWRpYS0+QmxvY2tTaXpl IC8gREVWX0JTSVpFKTsKLQlzaXplID0gbmJsayAqIERFVl9CU0laRTsKLQotCXN0YXR1cyA9IGRl dmluZm8tPmRldi0+UmVhZEJsb2NrcyhkZXZpbmZvLT5kZXYsCi0JICAgIGRldmluZm8tPmRldi0+ TWVkaWEtPk1lZGlhSWQsIGxiYSwgc2l6ZSwgYnVmKTsKLQotCWlmIChzdGF0dXMgIT0gRUZJX1NV Q0NFU1MpIHsKLQkJRFBSSU5URigiZHNrcmVhZDogZmFpbGVkIGRldjogJXAsIGlkOiAldSwgbGJh OiAlanUsIHNpemU6ICVkLCAiCi0JCSAgICAic3RhdHVzOiAlbHVcbiIsIGRldmluZm8tPmRldiwK LQkJICAgIGRldmluZm8tPmRldi0+TWVkaWEtPk1lZGlhSWQsICh1aW50bWF4X3QpbGJhLCBzaXpl LAotCQkgICAgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7Ci0JCXJldHVybiAoLTEpOwotCX0KLQot CXJldHVybiAoMCk7Ci19Ci0KLSNpbmNsdWRlICJ1ZnNyZWFkLmMiCi0KLXN0YXRpYyBzdHJ1Y3Qg ZG1hZGF0IF9fZG1hZGF0OwotCi1zdGF0aWMgaW50Ci1pbml0X2RldihkZXZfaW5mb190KiBkZXYp Ci17Ci0KLQlkZXZpbmZvID0gZGV2OwotCWRtYWRhdCA9ICZfX2RtYWRhdDsKLQotCXJldHVybiBm c3JlYWQoMCwgTlVMTCwgMCk7Ci19Ci0KLXN0YXRpYyBFRklfU1RBVFVTCi1wcm9iZShkZXZfaW5m b190KiBkZXYpCi17Ci0KLQlpZiAoaW5pdF9kZXYoZGV2KSA8IDApCi0JCXJldHVybiAoRUZJX1VO U1VQUE9SVEVEKTsKLQotCWFkZF9kZXZpY2UoJmRldmljZXMsIGRldik7Ci0KLQlyZXR1cm4gKEVG SV9TVUNDRVNTKTsKLX0KLQotc3RhdGljIEVGSV9TVEFUVVMKLWxvYWQoY29uc3QgY2hhciAqZmls ZXBhdGgsIGRldl9pbmZvX3QgKmRldiwgdm9pZCAqKmJ1ZnAsIHNpemVfdCAqYnVmc2l6ZSkKLXsK LQl1ZnNfaW5vX3QgaW5vOwotCUVGSV9TVEFUVVMgc3RhdHVzOwotCXNpemVfdCBzaXplOwotCXNz aXplX3QgcmVhZDsKLQl2b2lkICpidWY7Ci0KLQlEUFJJTlRGKCJMb2FkaW5nICclcycgZnJvbSAl c1xuIiwgZmlsZXBhdGgsIGRldnBhdGhfc3RyKGRldi0+ZGV2cGF0aCkpOwotCi0JaWYgKGluaXRf ZGV2KGRldikgPCAwKSB7Ci0JCURQUklOVEYoIkZhaWxlZCB0byBpbml0IGRldmljZVxuIik7Ci0J CXJldHVybiAoRUZJX1VOU1VQUE9SVEVEKTsKLQl9Ci0KLQlpZiAoKGlubyA9IGxvb2t1cChmaWxl cGF0aCkpID09IDApIHsKLQkJRFBSSU5URigiRmFpbGVkIHRvIGxvb2t1cCAnJXMnIChmaWxlIG5v dCBmb3VuZD8pXG4iLCBmaWxlcGF0aCk7Ci0JCXJldHVybiAoRUZJX05PVF9GT1VORCk7Ci0JfQot Ci0JaWYgKGZzcmVhZF9zaXplKGlubywgTlVMTCwgMCwgJnNpemUpIDwgMCB8fCBzaXplIDw9IDAp IHsKLQkJcHJpbnRmKCJGYWlsZWQgdG8gcmVhZCBzaXplIG9mICclcycgaW5vOiAlZFxuIiwgZmls ZXBhdGgsIGlubyk7Ci0JCXJldHVybiAoRUZJX0lOVkFMSURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlp ZiAoKHN0YXR1cyA9IGJzLT5BbGxvY2F0ZVBvb2woRWZpTG9hZGVyRGF0YSwgc2l6ZSwgJmJ1Zikp ICE9Ci0JICAgIEVGSV9TVUNDRVNTKSB7Ci0JCXByaW50ZigiRmFpbGVkIHRvIGFsbG9jYXRlIHJl YWQgYnVmZmVyICV6dSBmb3IgJyVzJyAoJWx1KVxuIiwKLQkJICAgIHNpemUsIGZpbGVwYXRoLCBF RklfRVJST1JfQ09ERShzdGF0dXMpKTsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQotCXJlYWQg PSBmc3JlYWQoaW5vLCBidWYsIHNpemUpOwotCWlmICgoc2l6ZV90KXJlYWQgIT0gc2l6ZSkgewot CQlwcmludGYoIkZhaWxlZCB0byByZWFkICclcycgKCV6ZCAhPSAlenUpXG4iLCBmaWxlcGF0aCwg cmVhZCwKLQkJICAgIHNpemUpOwotCQkodm9pZClicy0+RnJlZVBvb2woYnVmKTsKLQkJcmV0dXJu IChFRklfSU5WQUxJRF9QQVJBTUVURVIpOwotCX0KLQotCURQUklOVEYoIkxvYWQgY29tcGxldGVc biIpOwotCi0JKmJ1ZnAgPSBidWY7Ci0JKmJ1ZnNpemUgPSBzaXplOwotCi0JcmV0dXJuIChFRklf U1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdGF0dXModm9pZCkKLXsKLQlpbnQgaTsKLQlk ZXZfaW5mb190ICpkZXY7Ci0KLQlmb3IgKGRldiA9IGRldmljZXMsIGkgPSAwOyBkZXYgIT0gTlVM TDsgZGV2ID0gZGV2LT5uZXh0LCBpKyspCi0JCTsKLQotCXByaW50ZigiJXMgZm91bmQgIiwgdWZz X21vZHVsZS5uYW1lKTsKLQlzd2l0Y2ggKGkpIHsKLQljYXNlIDA6Ci0JCXByaW50Zigibm8gcGFy dGl0aW9uc1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJcHJpbnRmKCIlZCBwYXJ0aXRpb25c biIsIGkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIiVkIHBhcnRpdGlvbnNcbiIs IGkpOwotCX0KLX0KLQotc3RhdGljIGRldl9pbmZvX3QgKgotX2RldmljZXModm9pZCkKLXsKLQot CXJldHVybiAoZGV2aWNlcyk7Ci19Ci0KLWNvbnN0IGJvb3RfbW9kdWxlX3QgdWZzX21vZHVsZSA9 Ci17Ci0JLm5hbWUgPSAiVUZTIiwKLQkucHJvYmUgPSBwcm9iZSwKLQkubG9hZCA9IGxvYWQsCi0J LnN0YXR1cyA9IHN0YXR1cywKLQkuZGV2aWNlcyA9IF9kZXZpY2VzCi19OwpkaWZmIC0tZ2l0IHN5 cy9ib290L2VmaS9ib290MS96ZnNfbW9kdWxlLmMgc3lzL2Jvb3QvZWZpL2Jvb3QxL3pmc19tb2R1 bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyNmEzMzAxMGQuLjAwMDAwMDAw MDAwCi0tLSBzeXMvYm9vdC9lZmkvYm9vdDEvemZzX21vZHVsZS5jCisrKyAvZGV2L251bGwKQEAg LTEsMTk2ICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDE1IEVyaWMgTWNDb3JrbGUK LSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ UyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAot ICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg TElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQu ICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUK LSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM QVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7 IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p Ci0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI RVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRI RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU WSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogJEZyZWVCU0QkCi0gKi8KLSNpbmNsdWRlIDxz dGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5j bHVkZSA8c3lzL2NkZWZzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lz L3F1ZXVlLmg+Ci0jaW5jbHVkZSA8ZWZpLmg+Ci0KLSNpbmNsdWRlICJib290X21vZHVsZS5oIgot Ci0jaW5jbHVkZSAibGliemZzLmgiCi0jaW5jbHVkZSAiemZzaW1wbC5jIgotCi1zdGF0aWMgZGV2 X2luZm9fdCAqZGV2aWNlczsKLQotc3RhdGljIGludAotdmRldl9yZWFkKHZkZXZfdCAqdmRldiwg dm9pZCAqcHJpdiwgb2ZmX3Qgb2ZmLCB2b2lkICpidWYsIHNpemVfdCBieXRlcykKLXsKLQlkZXZf aW5mb190ICpkZXZpbmZvOwotCW9mZl90IGxiYTsKLQlFRklfU1RBVFVTIHN0YXR1czsKLQotCWRl dmluZm8gPSAoZGV2X2luZm9fdCAqKXByaXY7Ci0JbGJhID0gb2ZmIC8gZGV2aW5mby0+ZGV2LT5N ZWRpYS0+QmxvY2tTaXplOwotCi0Jc3RhdHVzID0gZGV2aW5mby0+ZGV2LT5SZWFkQmxvY2tzKGRl dmluZm8tPmRldiwKLQkgICAgZGV2aW5mby0+ZGV2LT5NZWRpYS0+TWVkaWFJZCwgbGJhLCBieXRl cywgYnVmKTsKLQlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCURQUklOVEYoInZkZXZf cmVhZDogZmFpbGVkIGRldjogJXAsIGlkOiAldSwgbGJhOiAlamQsIHNpemU6ICV6dSwiCi0JCSAg ICAiIHN0YXR1czogJWx1XG4iLCBkZXZpbmZvLT5kZXYsCi0JCSAgICBkZXZpbmZvLT5kZXYtPk1l ZGlhLT5NZWRpYUlkLCAoaW50bWF4X3QpbGJhLCBieXRlcywKLQkJICAgIEVGSV9FUlJPUl9DT0RF KHN0YXR1cykpOwotCQlyZXR1cm4gKC0xKTsKLQl9Ci0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0 aWMgRUZJX1NUQVRVUwotcHJvYmUoZGV2X2luZm9fdCAqZGV2KQotewotCXNwYV90ICpzcGE7Ci0J ZGV2X2luZm9fdCAqdGRldjsKLQlFRklfU1RBVFVTIHN0YXR1czsKLQotCS8qIFpGUyBjb25zdW1l cyB0aGUgZGV2IG9uIHN1Y2Nlc3Mgc28gd2UgbmVlZCBhIGNvcHkuICovCi0JaWYgKChzdGF0dXMg PSBicy0+QWxsb2NhdGVQb29sKEVmaUxvYWRlckRhdGEsIHNpemVvZigqZGV2KSwKLQkgICAgKHZv aWQqKikmdGRldikpICE9IEVGSV9TVUNDRVNTKSB7Ci0JCURQUklOVEYoIkZhaWxlZCB0byBhbGxv Y2F0ZSB0ZGV2ICglbHUpXG4iLAotCQkgICAgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7Ci0JCXJl dHVybiAoc3RhdHVzKTsKLQl9Ci0JbWVtY3B5KHRkZXYsIGRldiwgc2l6ZW9mKCpkZXYpKTsKLQot CWlmICh2ZGV2X3Byb2JlKHZkZXZfcmVhZCwgdGRldiwgJnNwYSkgIT0gMCkgewotCQkodm9pZCli cy0+RnJlZVBvb2wodGRldik7Ci0JCXJldHVybiAoRUZJX1VOU1VQUE9SVEVEKTsKLQl9Ci0KLQlk ZXYtPmRldmRhdGEgPSBzcGE7Ci0JYWRkX2RldmljZSgmZGV2aWNlcywgZGV2KTsKLQotCXJldHVy biAoRUZJX1NVQ0NFU1MpOwotfQotCi1zdGF0aWMgRUZJX1NUQVRVUwotbG9hZChjb25zdCBjaGFy ICpmaWxlcGF0aCwgZGV2X2luZm9fdCAqZGV2aW5mbywgdm9pZCAqKmJ1ZnAsIHNpemVfdCAqYnVm c2l6ZSkKLXsKLQlzcGFfdCAqc3BhOwotCXN0cnVjdCB6ZnNtb3VudCB6ZnNtb3VudDsKLQlkbm9k ZV9waHlzX3QgZG47Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0JaW50IGVycjsKLQl2b2lkICpidWY7Ci0J RUZJX1NUQVRVUyBzdGF0dXM7Ci0KLQlzcGEgPSBkZXZpbmZvLT5kZXZkYXRhOwotCi0JRFBSSU5U RigibG9hZDogJyVzJyBzcGE6ICclcycsIGRldnBhdGg6ICVzXG4iLCBmaWxlcGF0aCwgc3BhLT5z cGFfbmFtZSwKLQkgICAgZGV2cGF0aF9zdHIoZGV2aW5mby0+ZGV2cGF0aCkpOwotCi0JaWYgKChl cnIgPSB6ZnNfc3BhX2luaXQoc3BhKSkgIT0gMCkgewotCQlEUFJJTlRGKCJGYWlsZWQgdG8gbG9h ZCBwb29sICclcycgKCVkKVxuIiwgc3BhLT5zcGFfbmFtZSwgZXJyKTsKLQkJcmV0dXJuIChFRklf Tk9UX0ZPVU5EKTsKLQl9Ci0KLQlpZiAoKGVyciA9IHpmc19tb3VudChzcGEsIDAsICZ6ZnNtb3Vu dCkpICE9IDApIHsKLQkJRFBSSU5URigiRmFpbGVkIHRvIG1vdW50IHBvb2wgJyVzJyAoJWQpXG4i LCBzcGEtPnNwYV9uYW1lLCBlcnIpOwotCQlyZXR1cm4gKEVGSV9OT1RfRk9VTkQpOwotCX0KLQot CWlmICgoZXJyID0gemZzX2xvb2t1cCgmemZzbW91bnQsIGZpbGVwYXRoLCAmZG4pKSAhPSAwKSB7 Ci0JCWlmIChlcnIgPT0gRU5PRU5UKSB7Ci0JCQlEUFJJTlRGKCJGYWlsZWQgdG8gZmluZCAnJXMn IG9uIHBvb2wgJyVzJyAoJWQpXG4iLAotCQkJICAgIGZpbGVwYXRoLCBzcGEtPnNwYV9uYW1lLCBl cnIpOwotCQkJcmV0dXJuIChFRklfTk9UX0ZPVU5EKTsKLQkJfQotCQlwcmludGYoIkZhaWxlZCB0 byBsb29rdXAgJyVzJyBvbiBwb29sICclcycgKCVkKVxuIiwgZmlsZXBhdGgsCi0JCSAgICBzcGEt PnNwYV9uYW1lLCBlcnIpOwotCQlyZXR1cm4gKEVGSV9JTlZBTElEX1BBUkFNRVRFUik7Ci0JfQot Ci0JaWYgKChlcnIgPSB6ZnNfZG5vZGVfc3RhdChzcGEsICZkbiwgJnN0KSkgIT0gMCkgewotCQlw cmludGYoIkZhaWxlZCB0byBzdGF0ICclcycgb24gcG9vbCAnJXMnICglZClcbiIsIGZpbGVwYXRo LAotCQkgICAgc3BhLT5zcGFfbmFtZSwgZXJyKTsKLQkJcmV0dXJuIChFRklfSU5WQUxJRF9QQVJB TUVURVIpOwotCX0KLQotCWlmICgoc3RhdHVzID0gYnMtPkFsbG9jYXRlUG9vbChFZmlMb2FkZXJE YXRhLCAoVUlOVE4pc3Quc3Rfc2l6ZSwgJmJ1ZikpCi0JICAgICE9IEVGSV9TVUNDRVNTKSB7Ci0J CXByaW50ZigiRmFpbGVkIHRvIGFsbG9jYXRlIGxvYWQgYnVmZmVyICV6ZCBmb3IgcG9vbCAnJXMn IGZvciAnJXMnICIKLQkJICAgICIoJWx1KVxuIiwgc3Quc3Rfc2l6ZSwgc3BhLT5zcGFfbmFtZSwg ZmlsZXBhdGgsIEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOwotCQlyZXR1cm4gKEVGSV9JTlZBTElE X1BBUkFNRVRFUik7Ci0JfQotCi0JaWYgKChlcnIgPSBkbm9kZV9yZWFkKHNwYSwgJmRuLCAwLCBi dWYsIHN0LnN0X3NpemUpKSAhPSAwKSB7Ci0JCXByaW50ZigiRmFpbGVkIHRvIHJlYWQgbm9kZSBm cm9tICVzICglZClcbiIsIHNwYS0+c3BhX25hbWUsCi0JCSAgICBlcnIpOwotCQkodm9pZClicy0+ RnJlZVBvb2woYnVmKTsKLQkJcmV0dXJuIChFRklfSU5WQUxJRF9QQVJBTUVURVIpOwotCX0KLQot CSpidWZzaXplID0gc3Quc3Rfc2l6ZTsKLQkqYnVmcCA9IGJ1ZjsKLQotCXJldHVybiAoRUZJX1NV Q0NFU1MpOwotfQotCi1zdGF0aWMgdm9pZAotc3RhdHVzKHZvaWQpCi17Ci0Jc3BhX3QgKnNwYTsK LQotCXNwYSA9IFNUQUlMUV9GSVJTVCgmemZzX3Bvb2xzKTsKLQlpZiAoc3BhID09IE5VTEwpIHsK LQkJcHJpbnRmKCIlcyBmb3VuZCBubyBwb29sc1xuIiwgemZzX21vZHVsZS5uYW1lKTsKLQkJcmV0 dXJuOwotCX0KLQotCXByaW50ZigiJXMgZm91bmQgdGhlIGZvbGxvd2luZyBwb29sczoiLCB6ZnNf bW9kdWxlLm5hbWUpOwotCVNUQUlMUV9GT1JFQUNIKHNwYSwgJnpmc19wb29scywgc3BhX2xpbmsp Ci0JCXByaW50ZigiICVzIiwgc3BhLT5zcGFfbmFtZSk7Ci0KLQlwcmludGYoIlxuIik7Ci19Ci0K LXN0YXRpYyB2b2lkCi1pbml0KHZvaWQpCi17Ci0KLQl6ZnNfaW5pdCgpOwotfQotCi1zdGF0aWMg ZGV2X2luZm9fdCAqCi1fZGV2aWNlcyh2b2lkKQotewotCi0JcmV0dXJuIChkZXZpY2VzKTsKLX0K LQotY29uc3QgYm9vdF9tb2R1bGVfdCB6ZnNfbW9kdWxlID0KLXsKLQkubmFtZSA9ICJaRlMiLAot CS5pbml0ID0gaW5pdCwKLQkucHJvYmUgPSBwcm9iZSwKLQkubG9hZCA9IGxvYWQsCi0JLnN0YXR1 cyA9IHN0YXR1cywKLQkuZGV2aWNlcyA9IF9kZXZpY2VzCi19OwpkaWZmIC0tZ2l0IHN5cy9ib290 L2VmaS9kcml2ZXJzL01ha2VmaWxlIHN5cy9ib290L2VmaS9kcml2ZXJzL01ha2VmaWxlCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41ZTFmMThiZTI1MgotLS0gL2Rldi9u dWxsCisrKyBzeXMvYm9vdC9lZmkvZHJpdmVycy9NYWtlZmlsZQpAQCAtMCwwICsxLDM0IEBACisj ICRGcmVlQlNEJAorCisuaW5jbHVkZSA8c3JjLm9wdHMubWs+CisKK0xJQj0JZWZpX2RyaXZlcnMK K0lOVEVSTkFMTElCPQorV0FSTlM/PQkyCisKK1NSQ1M9CWVmaXBhcnQuYyBmc19kcml2ZXIuYwor CisuaWYgJHtNQUNISU5FX0NQVUFSQ0h9ID09ICJhYXJjaDY0IgorQ0ZMQUdTKz0JLW1zb2Z0LWZs b2F0IC1tZ2VuZXJhbC1yZWdzLW9ubHkKKy5lbmRpZgorLmlmICR7TUFDSElORV9BUkNIfSA9PSAi YW1kNjQiCitDRkxBR1MrPSAtZlBJQyAtbW5vLXJlZC16b25lCisuZW5kaWYKKy5pZiAke01LX1pG U30gIT0gIm5vIgorQ0ZMQUdTKz0JLUkkey5DVVJESVJ9Ly4uLy4uL3pmcworQ0ZMQUdTKz0JLUkk ey5DVVJESVJ9Ly4uLy4uLy4uL2NkZGwvYm9vdC96ZnMKK0NGTEFHUys9CS1ERUZJX1pGU19CT09U CisuZW5kaWYKKworQ0ZMQUdTKz0gLUkkey5DVVJESVJ9Ly4uL2luY2x1ZGUKK0NGTEFHUys9IC1J JHsuQ1VSRElSfS8uLi9pbmNsdWRlLyR7TUFDSElORX0KK0NGTEFHUys9IC1JJHsuQ1VSRElSfS8u Li8uLi8uLi8uLi9saWIvbGlic3RhbmQKKworIyBQaWNrIHVwIHRoZSBib290c3RyYXAgaGVhZGVy IGZvciBzb21lIGludGVyZmFjZSBpdGVtcworQ0ZMQUdTKz0gLUkkey5DVVJESVJ9Ly4uLy4uL2Nv bW1vbgorCisjIEhhbmRsZSBGcmVlQlNEIHNwZWNpZmljICViIGFuZCAlRCBwcmludGYgZm9ybWF0 IHNwZWNpZmllcnMKK0NGTEFHUys9ICR7Rk9STUFUX0VYVEVOU0lPTlN9CitDRkxBR1MrPSAtRFRF Uk1fRU1VCisKKy5pbmNsdWRlIDxic2QubGliLm1rPgpkaWZmIC0tZ2l0IHN5cy9ib290L2VmaS9k cml2ZXJzL2VmaV9kcml2ZXJzLmggc3lzL2Jvb3QvZWZpL2RyaXZlcnMvZWZpX2RyaXZlcnMuaApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMGM1OTlkMTdhZjkKLS0tIC9k ZXYvbnVsbAorKysgc3lzL2Jvb3QvZWZpL2RyaXZlcnMvZWZpX2RyaXZlcnMuaApAQCAtMCwwICsx LDQyIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAxNiBFcmljIE1jQ29ya2xlCisgKiBBbGwg cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE RUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBF WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g RVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1Ig QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig Q09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9G IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9X RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP TlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9G IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAq IFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgX0VGSV9EUklW RVJTX0hfCisjZGVmaW5lIF9FRklfRFJJVkVSU19IXworCit0eXBlZGVmIHN0cnVjdCBlZmlfZHJp dmVyX3QgeworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICB2b2lkICgqaW5pdCko dm9pZCk7Cit9IGVmaV9kcml2ZXJfdDsKKworZXh0ZXJuIHN0cnVjdCBkZXZzdyBlZmlwYXJ0X2Rl djsKKworLyogRUZJIGRyaXZlcnMuICovCitleHRlcm4gY29uc3QgZWZpX2RyaXZlcl90IGZzX2Ry aXZlcjsKKworI2VuZGlmCmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL2xpYmVmaS9lZmlwYXJ0LmMg c3lzL2Jvb3QvZWZpL2RyaXZlcnMvZWZpcGFydC5jCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFt ZSBmcm9tIHN5cy9ib290L2VmaS9saWJlZmkvZWZpcGFydC5jCnJlbmFtZSB0byBzeXMvYm9vdC9l ZmkvZHJpdmVycy9lZmlwYXJ0LmMKaW5kZXggNWE5OTM4MTJiY2UuLjNlM2E5YzA0YTE3IDEwMDY0 NAotLS0gc3lzL2Jvb3QvZWZpL2xpYmVmaS9lZmlwYXJ0LmMKKysrIHN5cy9ib290L2VmaS9kcml2 ZXJzL2VmaXBhcnQuYwpAQCAtNzQsOTAgKzc0LDEwOSBAQCBzdGF0aWMgaW50IG5wZGluZm8gPSAw OwogCiAjZGVmaW5lIFBEKGRldikgICAgICAgICAocGRpbmZvWyhkZXYpLT5kX3VuaXRdKQogCitz dGF0aWMgRUZJX1NUQVRVUworZWZpcGFydF9zdXBwb3J0ZWQoRUZJX0RSSVZFUl9CSU5ESU5HICpU aGlzLCBFRklfSEFORExFIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgIEVGSV9ERVZJQ0VfUEFU SCAqUmVtYWluaW5nRGV2aWNlUGF0aCBfX3VudXNlZCkKK3sKKyAgICAgICAgcmV0dXJuIEJTLT5P cGVuUHJvdG9jb2woaGFuZGxlLCAmYmxraW9fZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgTlVMTCwgSUgsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgRUZJX09QRU5fUFJPVE9DT0xfVEVTVF9QUk9UT0NPTCk7Cit9CisKK3N0YXRpYyBFRklfU1RB VFVTCitlZmlwYXJ0X3N0YXJ0KEVGSV9EUklWRVJfQklORElORyAqVGhpcywgRUZJX0hBTkRMRSBo YW5kbGUsCisgICAgICAgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAqUmVtYWluaW5nRGV2aWNlUGF0 aCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgdV9pbnQqIG5kaXNrLCB1aW50KiBucmRpc2spCit7 CisgICAgICAgIEVGSV9CTE9DS19JTyAqYmxraW87CisgICAgICAgIEVGSV9ERVZJQ0VfUEFUSCAq ZGV2cGF0aCwgKmRldnBhdGhjcHksICp0bXBkZXZwYXRoLCAqbm9kZTsKKwlFRklfU1RBVFVTIHN0 YXR1czsKKyAgICAgICAgRUZJX0hBTkRMRSBhbGlhczsKKworICAgICAgICBkZXZwYXRoID0gZWZp X2xvb2t1cF9kZXZwYXRoKGhhbmRsZSk7CisKKyAgICAgICAgaWYgKGRldnBhdGggPT0gTlVMTCkg eworICAgICAgICAgICAgICAgIHJldHVybiAoRUZJX0RFVklDRV9FUlJPUik7CisgICAgICAgIH0K KworICAgICAgICBzdGF0dXMgPSBCUy0+SGFuZGxlUHJvdG9jb2woaGFuZGxlLCAmYmxraW9fZ3Vp ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiopJmJsa2lvKTsK KyAgICAgICAgaWYgKEVGSV9FUlJPUihzdGF0dXMpKQorICAgICAgICAgICAgICAgIHJldHVybiAo c3RhdHVzKTsKKworICAgICAgICBpZiAoIWJsa2lvLT5NZWRpYS0+TG9naWNhbFBhcnRpdGlvbikg eworICAgICAgICAgICAgICAgICpucmRpc2srKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVG SV9VTlNVUFBPUlRFRCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiB3 ZSBjb21lIGFjcm9zcyBhIGxvZ2ljYWwgcGFydGl0aW9uIG9mIHN1YnR5cGUgQ0RST00KKyAgICAg ICAgICogaXQgZG9lc24ndCByZWZlciB0byB0aGUgQ0QgZmlsZXN5c3RlbSBpdHNlbGYsIGJ1dCBy YXRoZXIKKyAgICAgICAgICogdG8gYW55IHVzYWJsZSBFbCBUb3JpdG8gYm9vdCBpbWFnZSBvbiBp dC4gSW4gdGhpcyBjYXNlCisgICAgICAgICAqIHdlIHRyeSB0byBmaW5kIHRoZSBwYXJlbnQgZGV2 aWNlIGFuZCBhZGQgdGhhdCBpbnN0ZWFkIGFzCisgICAgICAgICAqIHRoYXQgd2lsbCBiZSB0aGUg Q0QgZmlsZXN5c3RlbS4KKyAgICAgICAgICovCisgICAgICAgIG5vZGUgPSBlZmlfZGV2cGF0aF9s YXN0X25vZGUoZGV2cGF0aCk7CisgICAgICAgIGlmIChEZXZpY2VQYXRoVHlwZShub2RlKSA9PSBN RURJQV9ERVZJQ0VfUEFUSCAmJgorICAgICAgICAgICAgRGV2aWNlUGF0aFN1YlR5cGUobm9kZSkg PT0gTUVESUFfQ0RST01fRFApIHsKKyAgICAgICAgICAgICAgICBkZXZwYXRoY3B5ID0gZWZpX2Rl dnBhdGhfdHJpbShkZXZwYXRoKTsKKyAgICAgICAgICAgICAgICB0bXBkZXZwYXRoID0gZGV2cGF0 aGNweTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCUy0+TG9jYXRlRGV2aWNlUGF0aCgmYmxr aW9fZ3VpZCwgJnRtcGRldnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJmFsaWFzKTsKKyAgICAgICAgICAgICAgICBmcmVlKGRldnBhdGhjcHkpOwor CisgICAgICAgICAgICAgICAgaWYgKEVGSV9FUlJPUihzdGF0dXMpKQorICAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIChzdGF0dXMpOworCisgICAgICAgICAgICAgICAgZWZpX3JlZ2lzdGVy X2hhbmRsZSgmZWZpcGFydF9kZXYsIGhhbmRsZSwgYWxpYXMpOworICAgICAgICB9IGVsc2UKKyAg ICAgICAgICAgICAgICBlZmlfcmVnaXN0ZXJfaGFuZGxlKCZlZmlwYXJ0X2RldiwgaGFuZGxlLCBO VUxMKTsKKworICAgICAgICBwZGluZm9bbnBkaW5mb10ucGRfb3BlbiA9IDA7CisgICAgICAgIHBk aW5mb1tucGRpbmZvXS5wZF9iY2FjaGUgPSBOVUxMOworICAgICAgICBwZGluZm9bbnBkaW5mb10u cGRfdW5pdCA9IG5wZGluZm87CisgICAgICAgIG5wZGluZm8rKzsKKyAgICAgICAgKm5kaXNrKys7 CisKKyAgICAgICAgcmV0dXJuIChFRklfU1VDQ0VTUyk7Cit9CisKIHN0YXRpYyBpbnQKLWVmaXBh cnRfaW5pdCh2b2lkKSAKK2VmaXBhcnRfaW5pdCh2b2lkKQogewotCUVGSV9CTE9DS19JTyAqYmxr aW87Ci0JRUZJX0RFVklDRV9QQVRIICpkZXZwYXRoLCAqZGV2cGF0aGNweSwgKnRtcGRldnBhdGgs ICpub2RlOwotCUVGSV9IQU5ETEUgKmhpbiwgKmhvdXQsICphbGlhc2VzLCBoYW5kbGU7CisJRUZJ X0hBTkRMRSAqaGFuZGxlczsKIAlFRklfU1RBVFVTIHN0YXR1czsKIAlVSU5UTiBzejsKLQl1X2lu dCBuLCBuaW4sIG5vdXQsIG5yZGlzazsKKyAgICAgICAgdV9pbnQgbiwgbmluLCBuZGlzaywgbnJk aXNrOwogCWludCBlcnI7CiAKIAlzeiA9IDA7Ci0JaGluID0gTlVMTDsKKwloYW5kbGVzID0gTlVM TDsKIAlzdGF0dXMgPSBCUy0+TG9jYXRlSGFuZGxlKEJ5UHJvdG9jb2wsICZibGtpb19ndWlkLCAw LCAmc3osIDApOwogCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKLQkJaGlu ID0gKEVGSV9IQU5ETEUgKiltYWxsb2Moc3ogKiAzKTsKKwkJaGFuZGxlcyA9IChFRklfSEFORExF ICopbWFsbG9jKHN6KTsKIAkJc3RhdHVzID0gQlMtPkxvY2F0ZUhhbmRsZShCeVByb3RvY29sLCAm YmxraW9fZ3VpZCwgMCwgJnN6LAotCQkgICAgaGluKTsKKwkJICAgIGhhbmRsZXMpOwogCQlpZiAo RUZJX0VSUk9SKHN0YXR1cykpCi0JCQlmcmVlKGhpbik7CisJCQlmcmVlKGhhbmRsZXMpOwogCX0K IAlpZiAoRUZJX0VSUk9SKHN0YXR1cykpCiAJCXJldHVybiAoZWZpX3N0YXR1c190b19lcnJubyhz dGF0dXMpKTsKIAogCS8qIEZpbHRlciBoYW5kbGVzIHRvIG9ubHkgaW5jbHVkZSBGcmVlQlNEIHBh cnRpdGlvbnMuICovCiAJbmluID0gc3ogLyBzaXplb2YoRUZJX0hBTkRMRSk7Ci0JaG91dCA9IGhp biArIG5pbjsKLQlhbGlhc2VzID0gaG91dCArIG5pbjsKLQlub3V0ID0gMDsKLQlucmRpc2sgPSAw OwotCi0JYnplcm8oYWxpYXNlcywgbmluICogc2l6ZW9mKEVGSV9IQU5ETEUpKTsKIAlwZGluZm8g PSBtYWxsb2MobmluICogc2l6ZW9mKCpwZGluZm8pKTsKLQlpZiAocGRpbmZvID09IE5VTEwpCi0J CXJldHVybiAoRU5PTUVNKTsKKyAgICAgICAgbmRpc2sgPSAwOworICAgICAgICBucmRpc2sgPSAw OwogCiAJZm9yIChuID0gMDsgbiA8IG5pbjsgbisrKSB7Ci0JCWRldnBhdGggPSBlZmlfbG9va3Vw X2RldnBhdGgoaGluW25dKTsKLQkJaWYgKGRldnBhdGggPT0gTlVMTCkgewotCQkJY29udGludWU7 Ci0JCX0KLQotCQlzdGF0dXMgPSBCUy0+SGFuZGxlUHJvdG9jb2woaGluW25dLCAmYmxraW9fZ3Vp ZCwKLQkJICAgICh2b2lkKiopJmJsa2lvKTsKLQkJaWYgKEVGSV9FUlJPUihzdGF0dXMpKQotCQkJ Y29udGludWU7Ci0JCWlmICghYmxraW8tPk1lZGlhLT5Mb2dpY2FsUGFydGl0aW9uKSB7Ci0JCQlu cmRpc2srKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyoKLQkJICogSWYgd2UgY29tZSBhY3Jv c3MgYSBsb2dpY2FsIHBhcnRpdGlvbiBvZiBzdWJ0eXBlIENEUk9NCi0JCSAqIGl0IGRvZXNuJ3Qg cmVmZXIgdG8gdGhlIENEIGZpbGVzeXN0ZW0gaXRzZWxmLCBidXQgcmF0aGVyCi0JCSAqIHRvIGFu eSB1c2FibGUgRWwgVG9yaXRvIGJvb3QgaW1hZ2Ugb24gaXQuIEluIHRoaXMgY2FzZQotCQkgKiB3 ZSB0cnkgdG8gZmluZCB0aGUgcGFyZW50IGRldmljZSBhbmQgYWRkIHRoYXQgaW5zdGVhZCBhcwot CQkgKiB0aGF0IHdpbGwgYmUgdGhlIENEIGZpbGVzeXN0ZW0uCi0JCSAqLwotCQlub2RlID0gZWZp X2RldnBhdGhfbGFzdF9ub2RlKGRldnBhdGgpOwotCQlpZiAoRGV2aWNlUGF0aFR5cGUobm9kZSkg PT0gTUVESUFfREVWSUNFX1BBVEggJiYKLQkJICAgIERldmljZVBhdGhTdWJUeXBlKG5vZGUpID09 IE1FRElBX0NEUk9NX0RQKSB7Ci0JCQlkZXZwYXRoY3B5ID0gZWZpX2RldnBhdGhfdHJpbShkZXZw YXRoKTsKLQkJCXRtcGRldnBhdGggPSBkZXZwYXRoY3B5OwotCQkJc3RhdHVzID0gQlMtPkxvY2F0 ZURldmljZVBhdGgoJmJsa2lvX2d1aWQsICZ0bXBkZXZwYXRoLAotCQkJICAgICZoYW5kbGUpOwot CQkJZnJlZShkZXZwYXRoY3B5KTsKLQkJCWlmIChFRklfRVJST1Ioc3RhdHVzKSkKLQkJCQljb250 aW51ZTsKLQkJCWhvdXRbbm91dF0gPSBoYW5kbGU7Ci0JCQlhbGlhc2VzW25vdXRdID0gaGluW25d OwotCQl9IGVsc2UKLQkJCWhvdXRbbm91dF0gPSBoaW5bbl07Ci0JCW5vdXQrKzsKLQkJcGRpbmZv W25wZGluZm9dLnBkX29wZW4gPSAwOwotCQlwZGluZm9bbnBkaW5mb10ucGRfYmNhY2hlID0gTlVM TDsKLQkJcGRpbmZvW25wZGluZm9dLnBkX3VuaXQgPSBucGRpbmZvOwotCQlucGRpbmZvKys7Cisg ICAgICAgICAgICAgICAgZWZpcGFydF9zdGFydChOVUxMLCBoYW5kbGVzW25dLCBOVUxMLCAmbmRp c2ssICZucmRpc2spOwogCX0KIAogCWJjYWNoZV9hZGRfZGV2KG5wZGluZm8pOwotCWVyciA9IGVm aV9yZWdpc3Rlcl9oYW5kbGVzKCZlZmlwYXJ0X2RldiwgaG91dCwgYWxpYXNlcywgbm91dCk7Ci0J ZnJlZShoaW4pOworCWZyZWUoaGFuZGxlcyk7CiAKLQlpZiAobm91dCA9PSAwICYmIG5yZGlzayA+ IDApCisJaWYgKG5kaXNrID09IDAgJiYgbnJkaXNrID4gMCkKIAkJcHJpbnRmKCJGb3VuZCAlZCBk aXNrKHMpIGJ1dCBubyBsb2dpY2FsIHBhcnRpdGlvblxuIiwgbnJkaXNrKTsKIAlyZXR1cm4gKGVy cik7CiB9CmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL2RyaXZlcnMvZnNfZHJpdmVyLmMgc3lzL2Jv b3QvZWZpL2RyaXZlcnMvZnNfZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAuLmI5Yzg1MzYyYTcxCi0tLSAvZGV2L251bGwKKysrIHN5cy9ib290L2VmaS9kcml2 ZXJzL2ZzX2RyaXZlci5jCkBAIC0wLDAgKzEsODUzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykg MjAxNiBFcmljIE1jQ29ya2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0 aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVU T1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UK KyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05U UklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5D TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P RFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT SU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwg T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO WSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNE JAorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNs dWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaW5jbHVkZSA8c3lzL3Bh cmFtLmg+CisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVk ZSA8ZWZpbGliLmg+CisjaW5jbHVkZSA8ZWZpcHJvdC5oPgorI2luY2x1ZGUgPHN0cmluZzE2Lmg+ CisjaWZkZWYgRUZJX1pGU19CT09UCisjaW5jbHVkZSA8bGliemZzLmg+CisjZW5kaWYKKyNpbmNs dWRlIDxib290c3RyYXAuaD4KKworI2luY2x1ZGUgImVmaV9kcml2ZXJzLmgiCisKK3N0YXRpYyBF RklfR1VJRCBTaW1wbGVGaWxlU3lzdGVtUHJvdG9jb2xHVUlEID0gU0lNUExFX0ZJTEVfU1lTVEVN X1BST1RPQ09MOworCitzdGF0aWMgc3RydWN0IGZzX29wcyAqYmFja2VuZF9maWxlX3N5c3RlbVtd ID0geworCSZkb3Nmc19mc29wcywKKwkmdWZzX2Zzb3BzLAorCSZjZDk2NjBfZnNvcHMsCisJJnRm dHBfZnNvcHMsCisJJm5mc19mc29wcywKKwkmZ3ppcGZzX2Zzb3BzLAorCSZiemlwZnNfZnNvcHMs CisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBkZXZzdyAqYmFja2VuZF9kZXZzd1tdID0gewor CSZlZmlwYXJ0X2RldiwKKyNpZmRlZiBFRklfWkZTX0JPT1QKKwkmemZzX2RldiwKKyNlbmRpZgor CU5VTEwKK307CisKK3R5cGVkZWYgc3RydWN0IHZvbGluZm9fdCB7CisgICAgICAgIHN0cnVjdCBm c19vcHMgKmZzb3BzOworICAgICAgICBzdHJ1Y3QgZGV2ZGVzYyAqZGV2OworfSB2b2xpbmZvX3Q7 CisKK3R5cGVkZWYgc3RydWN0IGZpbGVpbmZvX3QgeworICAgICAgICBjb25zdCB2b2xpbmZvX3Qq IHZpbmZvOworICAgICAgICBzdHJ1Y3Qgb3Blbl9maWxlIGZkYXRhOworICAgICAgICBjaGFyIHBh dGhbXTsKK30gZmlsZWluZm9fdDsKKworc3RhdGljIEVGSV9HVUlEIEZpbGVJbmZvR1VJRCA9IEVG SV9GSUxFX0lORk9fSUQ7OworCitzdGF0aWMgRUZJQVBJIEVGSV9TVEFUVVMKK2ZpbGVfb3Blbl9p bXBsKEVGSV9GSUxFX0hBTkRMRSBGaWxlLCBFRklfRklMRV9IQU5ETEUgKk5ld0hhbmRsZSwKKyAg ICAgICAgICAgICAgIENIQVIxNiAqRmlsZU5hbWUsIFVJTlQ2NCBPcGVuTW9kZSwgVUlOVDY0IEF0 dHJpYnV0ZXMpOworCitzdGF0aWMgRUZJQVBJIEVGSV9TVEFUVVMKK2ZpbGVfY2xvc2VfaW1wbChF RklfRklMRV9IQU5ETEUgRmlsZSk7CisKK3N0YXRpYyBFRklBUEkgRUZJX1NUQVRVUworZmlsZV9k ZWxldGVfaW1wbChFRklfRklMRV9IQU5ETEUgRmlsZSk7CisKK3N0YXRpYyBFRklBUEkgRUZJX1NU QVRVUworZGlyX3JlYWRfaW1wbChFRklfRklMRV9IQU5ETEUgRmlsZSwgVUlOVE4gKkJ1ZmZlclNp emUsIFZPSUQgKkJ1ZmZlcik7CisKK3N0YXRpYyBFRklBUEkgRUZJX1NUQVRVUworZGlyX3dyaXRl X2ltcGwoRUZJX0ZJTEVfSEFORExFIEZpbGUsIFVJTlROICpCdWZmZXJTaXplLAorICAgICAgICAg ICAgICAgVk9JRCAqQnVmZmVyKTsKKworc3RhdGljIEVGSUFQSSBFRklfU1RBVFVTCitmaWxlX3Jl YWRfaW1wbChFRklfRklMRV9IQU5ETEUgRmlsZSwgVUlOVE4gKkJ1ZmZlclNpemUsIFZPSUQgKkJ1 ZmZlcik7CisKK3N0YXRpYyBFRklBUEkgRUZJX1NUQVRVUworZmlsZV93cml0ZV9pbXBsKEVGSV9G SUxFX0hBTkRMRSBGaWxlLCBVSU5UTiAqQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICBWT0lE ICpCdWZmZXIpOworCitzdGF0aWMgRUZJQVBJIEVGSV9TVEFUVVMKK2ZpbGVfc2V0X3Bvc2l0aW9u X2ltcGwoRUZJX0ZJTEVfSEFORExFIEZpbGUsIFVJTlQ2NCBQb3NpdGlvbik7CisKK3N0YXRpYyBF RklBUEkgRUZJX1NUQVRVUworZmlsZV9nZXRfcG9zaXRpb25faW1wbChFRklfRklMRV9IQU5ETEUg RmlsZSwgVUlOVDY0ICpQb3NpdGlvbik7CisKK3N0YXRpYyBFRklBUEkgRUZJX1NUQVRVUworZmls ZV9nZXRfaW5mb19pbXBsKEVGSV9GSUxFX0hBTkRMRSBGaWxlLCBFRklfR1VJRCAqSW5mb3JtYXRp b25UeXBlLAorICAgICAgICAgICAgICAgICAgIFVJTlROICpCdWZmZXJTaXplLCBWT0lEICpCdWZm ZXIpOworCitzdGF0aWMgRUZJQVBJIEVGSV9TVEFUVVMKK2ZpbGVfc2V0X2luZm9faW1wbChFRklf RklMRV9IQU5ETEUgRmlsZSwgRUZJX0dVSUQgKkluZm9ybWF0aW9uVHlwZSwKKyAgICAgICAgICAg ICAgICAgICBVSU5UTiBCdWZmZXJTaXplLCBWT0lEICpCdWZmZXIpOworCitzdGF0aWMgRUZJQVBJ IEVGSV9TVEFUVVMKK2ZpbGVfZmx1c2hfaW1wbChFRklfRklMRV9IQU5ETEUgRmlsZSk7CisKK3N0 YXRpYyBzdHJ1Y3QgZGV2ZGVzYyoKK2Nsb25lX2RldmRlc2Moc3RydWN0IGRldmRlc2MgKmRldikK K3sKKyAgICAgICAgc3RydWN0IGRldmRlc2MgKm91dDsKKworICAgICAgICBzd2l0Y2goZGV2LT5k X2Rldi0+ZHZfdHlwZSkgeworICAgICAgICBjYXNlIERFVlRfWkZTOgorICAgICAgICAgICAgICAg IG91dCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHpmc19kZXZkZXNjKSk7CisKKyAgICAgICAgICAg ICAgICBpZiAob3V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBO VUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1lbWNweShvdXQsIGRl diwgc2l6ZW9mKHN0cnVjdCB6ZnNfZGV2ZGVzYykpOworCisgICAgICAgICAgICAgICAgcmV0dXJu IG91dDsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG91dCA9IG1hbGxvYyhz aXplb2Yoc3RydWN0IGRldmRlc2MpKTsKKworICAgICAgICAgICAgICAgIGlmIChvdXQgPT0gTlVM TCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAg ICAgfQorCisgICAgICAgICAgICAgICAgbWVtY3B5KG91dCwgZGV2LCBzaXplb2Yoc3RydWN0IGRl dmRlc2MpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgIH0KK30KKwor c3RhdGljIEVGSV9TVEFUVVMKK2RvX2ZpbGVfb3Blbihjb25zdCB2b2xpbmZvX3QgKnZpbmZvLCBj b25zdCBjaGFyIGZpbGVwYXRoW10sCisgICAgICAgICAgICAgaW50IG1vZGUsIEVGSV9GSUxFX0hB TkRMRSAqb3V0KQoreworICAgICAgICBFRklfRklMRV9IQU5ETEUgZmhhbmRsZTsKKyAgICAgICAg ZmlsZWluZm9fdCAqZmluZm87CisgICAgICAgIHN0cnVjdCBzdGF0IHN0OworICAgICAgICBzdHJ1 Y3QgZGV2ZGVzYyAqdG1wZGV2OworCWludCBlcnI7CisKKyAgICAgICAgbWVtc2V0KCZzdCwgMCwg c2l6ZW9mKHN0cnVjdCBzdGF0KSk7CisgICAgICAgIGZoYW5kbGUgPSBtYWxsb2Moc2l6ZW9mKEVG SV9GSUxFKSArIHNpemVvZihmaWxlaW5mb190KSArCisgICAgICAgICAgICAgICAgICAgICAgICAg c3RybGVuKGZpbGVwYXRoKSArIDEpOworCisgICAgICAgIGlmIChmaGFuZGxlID09IE5VTEwpIHsK KyAgICAgICAgICAgICAgICByZXR1cm4gKEVGSV9PVVRfT0ZfUkVTT1VSQ0VTKTsKKyAgICAgICAg fQorCisgICAgICAgIHRtcGRldiA9IGNsb25lX2RldmRlc2ModmluZm8tPmRldik7CisKKyAgICAg ICAgaWYgKHRtcGRldiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnJlZShmaGFuZGxlKTsK KyAgICAgICAgICAgICAgICByZXR1cm4gKEVGSV9PVVRfT0ZfUkVTT1VSQ0VTKTsKKyAgICAgICAg fQorCisgICAgICAgIGZpbmZvID0gKGZpbGVpbmZvX3QqKShmaGFuZGxlICsgMSk7CisgICAgICAg IGZpbmZvLT5mZGF0YS5mX2ZsYWdzID0gbW9kZSArIDE7CisgICAgICAgIGZpbmZvLT5mZGF0YS5m X2RldiA9IE5VTEw7CisgICAgICAgIGZpbmZvLT5mZGF0YS5mX29wcyA9IE5VTEw7CisgICAgICAg IGZpbmZvLT5mZGF0YS5mX29mZnNldCA9IDA7CisgICAgICAgIGZpbmZvLT5mZGF0YS5mX2RldmRh dGEgPSBOVUxMOworCisgICAgICAgIGlmICgoZXJyID0gdmluZm8tPmRldi0+ZF9kZXYtPmR2X29w ZW4oJihmaW5mby0+ZmRhdGEpLCB0bXBkZXYpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZnJl ZShmaGFuZGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycm5vX3RvX2VmaV9zdGF0dXMo ZXJyKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5mby0+ZmRhdGEuZl9kZXYgPSB2aW5mby0+ ZGV2LT5kX2RldjsKKworICAgICAgICBpZiAoKGVyciA9IHZpbmZvLT5mc29wcy0+Zm9fb3Blbihm aWxlcGF0aCwgJihmaW5mby0+ZmRhdGEpKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZyZWUo ZmhhbmRsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnJub190b19lZmlfc3RhdHVzKGVy cikpOworICAgICAgICB9CisKKyAgICAgICAgZmluZm8tPmZkYXRhLmZfb3BzID0gdmluZm8tPmZz b3BzOworCisgICAgICAgIGlmICgoZXJyID0gdmluZm8tPmZzb3BzLT5mb19zdGF0KCYoZmluZm8t PmZkYXRhKSwgJnN0KSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZyZWUoZmhhbmRsZSk7Cisg ICAgICAgICAgICAgICAgcmV0dXJuIChlcnJub190b19lZmlfc3RhdHVzKGVycikpOworICAgICAg ICB9CisKKyAgICAgICAgc3RyY3B5KGZpbmZvLT5wYXRoLCBmaWxlcGF0aCk7CisgICAgICAgIGZp bmZvLT52aW5mbyA9IHZpbmZvOworICAgICAgICBmaGFuZGxlLT5SZXZpc2lvbiA9IEVGSV9GSUxF X0hBTkRMRV9SRVZJU0lPTjsKKyAgICAgICAgZmhhbmRsZS0+T3BlbiA9IGZpbGVfb3Blbl9pbXBs OworICAgICAgICBmaGFuZGxlLT5DbG9zZSA9IGZpbGVfY2xvc2VfaW1wbDsKKyAgICAgICAgZmhh bmRsZS0+RGVsZXRlID0gZmlsZV9kZWxldGVfaW1wbDsKKyAgICAgICAgZmhhbmRsZS0+U2V0UG9z aXRpb24gPSBmaWxlX3NldF9wb3NpdGlvbl9pbXBsOworICAgICAgICBmaGFuZGxlLT5HZXRQb3Np dGlvbiA9IGZpbGVfZ2V0X3Bvc2l0aW9uX2ltcGw7CisgICAgICAgIGZoYW5kbGUtPkdldEluZm8g PSBmaWxlX2dldF9pbmZvX2ltcGw7CisgICAgICAgIGZoYW5kbGUtPlNldEluZm8gPSBmaWxlX3Nl dF9pbmZvX2ltcGw7CisgICAgICAgIGZoYW5kbGUtPkZsdXNoID0gZmlsZV9mbHVzaF9pbXBsOwor CisgICAgICAgIGlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisgICAgICAgICAgICAgICAgZmhh bmRsZS0+UmVhZCA9IGRpcl9yZWFkX2ltcGw7CisgICAgICAgICAgICAgICAgZmhhbmRsZS0+V3Jp dGUgPSBkaXJfd3JpdGVfaW1wbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBm aGFuZGxlLT5SZWFkID0gZmlsZV9yZWFkX2ltcGw7CisgICAgICAgICAgICAgICAgZmhhbmRsZS0+ V3JpdGUgPSBmaWxlX3dyaXRlX2ltcGw7CisgICAgICAgIH0KKworICAgICAgICAqb3V0ID0gZmhh bmRsZTsKKworICAgICAgICByZXR1cm4gKEVGSV9TVUNDRVNTKTsKK30KKworc3RhdGljIGludAor bW9kZV9mcm9tX2VmaShVSU5UNjQgZWZpX21vZGUpCit7CisgICAgICAgIGludCBtb2RlID0gMDsK KworICAgICAgICBpZiAoZWZpX21vZGUgJiBFRklfRklMRV9NT0RFX1dSSVRFKSB7CisgICAgICAg ICAgICAgICAgbW9kZSB8PSBPX1dST05MWTsKKyAgICAgICAgfSBlbHNlIGlmIChlZmlfbW9kZSAm IEVGSV9GSUxFX01PREVfUkVBRCkgeworICAgICAgICAgICAgICAgIG1vZGUgfD0gT19SRE9OTFk7 CisgICAgICAgIH0gZWxzZSBpZiAoZWZpX21vZGUgJiBFRklfRklMRV9NT0RFX1JFQUQgJiYKKyAg ICAgICAgICAgICAgICAgICBlZmlfbW9kZSAmIEVGSV9GSUxFX01PREVfV1JJVEUpIHsKKyAgICAg ICAgICAgICAgICBtb2RlIHw9IE9fUkRXUjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBt b2RlOworfQorCitzdGF0aWMgVUlOVDY0Cittb2RlX3RvX2VmaShpbnQgbW9kZSkKK3sKKyAgICAg ICAgVUlOVDY0IGVmaV9tb2RlID0gMDsKKworICAgICAgICBpZiAobW9kZSAmIE9fV1JPTkxZKSB7 CisgICAgICAgICAgICAgICAgZWZpX21vZGUgfD0gRUZJX0ZJTEVfTU9ERV9XUklURTsKKyAgICAg ICAgfSBlbHNlIGlmIChtb2RlICYgT19SRE9OTFkpIHsKKyAgICAgICAgICAgICAgICBlZmlfbW9k ZSB8PSBFRklfRklMRV9NT0RFX1JFQUQ7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSAmIE9fUkRX UikgeworICAgICAgICAgICAgICAgIGVmaV9tb2RlIHw9IEVGSV9GSUxFX01PREVfUkVBRDsKKyAg ICAgICAgICAgICAgICBlZmlfbW9kZSB8PSBFRklfRklMRV9NT0RFX1dSSVRFOworICAgICAgICB9 CisKKyAgICAgICAgcmV0dXJuIChlZmlfbW9kZSk7Cit9CisKK3N0YXRpYyBFRklBUEkgRUZJX1NU QVRVUworZmlsZV9vcGVuX2ltcGwoRUZJX0ZJTEVfSEFORExFIEZpbGUsIEVGSV9GSUxFX0hBTkRM RSAqTmV3SGFuZGxlLAorICAgICAgICAgICAgICAgQ0hBUjE2ICpGaWxlTmFtZSwgVUlOVDY0IE9w ZW5Nb2RlLCBVSU5UNjQgQXR0cmlidXRlcykKK3sKKyAgICAgICAgZmlsZWluZm9fdCAqZmluZm8g PSAoZmlsZWluZm9fdCopKEZpbGUgKyAxKTsKKyAgICAgICAgY2hhciBidWZbc3RybGVuKGZpbmZv LT5wYXRoKSArIHN0cmxlbjE2KEZpbGVOYW1lKSArIDFdOworCisgICAgICAgIHN0cmNweV9mcm9t XzE2KHN0cGNweShidWYsIGZpbmZvLT5wYXRoKSwgRmlsZU5hbWUpOworCisgICAgICAgIHJldHVy biBkb19maWxlX29wZW4oZmluZm8tPnZpbmZvLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbW9kZV9mcm9tX2VmaShPcGVuTW9kZSksIE5ld0hhbmRsZSk7Cit9CisKK3N0YXRpYyBF RklBUEkgRUZJX1NUQVRVUworZmlsZV9jbG9zZV9pbXBsKEVGSV9GSUxFX0hBTkRMRSBGaWxlKQor eworICAgICAgICBmaWxlaW5mb190ICpmaW5mbyA9IChmaWxlaW5mb190KikoRmlsZSArIDEpOwor ICAgICAgICBpbnQgcmVzOworCisgICAgICAgIGlmICgocmVzID0gZmluZm8tPmZkYXRhLmZfb3Bz LT5mb19jbG9zZSgmKGZpbmZvLT5mZGF0YSkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0 dXJuIChlcnJub190b19lZmlfc3RhdHVzKHJlcykpOworICAgICAgICB9CisKKyAgICAgICAgaWYg KChyZXMgPSBmaW5mby0+dmluZm8tPmRldi0+ZF9kZXYtPmR2X2Nsb3NlKCYoZmluZm8tPmZkYXRh KSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVycm5vX3RvX2VmaV9zdGF0dXMo cmVzKSk7CisgICAgICAgIH0KKworICAgICAgICBmcmVlKEZpbGUpOworICAgICAgICByZXR1cm4g KEVGSV9TVUNDRVNTKTsKK30KKworc3RhdGljIEVGSUFQSSBFRklfU1RBVFVTCitmaWxlX2RlbGV0 ZV9pbXBsKEVGSV9GSUxFX0hBTkRMRSBGaWxlKQoreworICAgICAgICBmaWxlX2Nsb3NlX2ltcGwo RmlsZSk7CisKKyAgICAgICAgcmV0dXJuIChFRklfV0FSTl9ERUxFVEVfRkFJTFVSRSk7Cit9CisK K3N0YXRpYyBFRklBUEkgRUZJX1NUQVRVUworZGlyX3JlYWRfaW1wbChFRklfRklMRV9IQU5ETEUg RmlsZSwgVUlOVE4gKkJ1ZmZlclNpemUsIFZPSUQgKkJ1ZmZlcikKK3sKKyAgICAgICAgZmlsZWlu Zm9fdCAqZmluZm8gPSAoZmlsZWluZm9fdCopKEZpbGUgKyAxKTsKKyAgICAgICAgZmlsZWluZm9f dCAqZW50aW5mbzsKKyAgICAgICAgc3RydWN0IGRpcmVudCBkOworICAgICAgICBzdHJ1Y3Qgc3Rh dCBzdDsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgVUlOVE4gY3VycnNpemUgPSAqQnVmZmVy U2l6ZTsKKyAgICAgICAgVUlOVE4gcmVxc2l6ZTsKKyAgICAgICAgRUZJX0ZJTEVfSU5GTyAqb3V0 ID0gKEVGSV9GSUxFX0lORk8qKUJ1ZmZlcjsKKyAgICAgICAgRUZJX0ZJTEVfSEFORExFIGVudGhh bmRsZTsKKyAgICAgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisgICAgICAgIG9mZl90IGN1cnJwb3M7 CisKKyAgICAgICAgLyogUmVjb3JkIHRlaCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiByZXdp bmQgaWYgd2UgaGF2ZSB0byAqLworICAgICAgICBpZiAoKGN1cnJwb3MgPSBmaW5mby0+ZmRhdGEu Zl9vcHMtPmZvX3NlZWsoJihmaW5mby0+ZmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBTRUVLX0NVUikpIDwgMCkgeworICAgICAgICAg ICAgICAgIHJldHVybiAoZXJybm9fdG9fZWZpX3N0YXR1cyhlcnJubykpOworICAgICAgICB9CisK KwlpZiAoKGVyciA9IGZpbmZvLT5mZGF0YS5mX29wcy0+Zm9fcmVhZGRpcigmKGZpbmZvLT5mZGF0 YSksICZkKSkgIT0gMCkgeworCQlyZXR1cm4gKGVycm5vX3RvX2VmaV9zdGF0dXMoZXJybm8pKTsK Kwl9CisKKyAgICAgICAgcmVxc2l6ZSA9IHNpemVvZihFRklfRklMRV9JTkZPKSArCisgICAgICAg ICAgKChzdHJsZW4oZC5kX25hbWUpICsgMSkgKiBzaXplb2YoQ0hBUjE2KSk7CisKKyAgICAgICAg aWYgKEJ1ZmZlciA9PSBOVUxMIHx8IGN1cnJzaXplIDwgcmVxc2l6ZSkgeworICAgICAgICAgICAg ICAgIGZpbmZvLT5mZGF0YS5mX29wcy0+Zm9fc2VlaygmKGZpbmZvLT5mZGF0YSksIGN1cnJwb3Ms IFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSA9IHJlcXNpemU7CisKKyAg ICAgICAgICAgICAgICByZXR1cm4gKEVGSV9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgfQor CisgICAgICAgIC8vIFdlIGhhdmUgdG8gYWN0dWFsbHkgb3BlbiB0aGUgZmlsZSwgc2luY2UgRUZJ IGRpcmVjdG9yeQorICAgICAgICAvLyByZWFkcyBhcmUgc3VwcG9zZWQgdG8gcmV0dXJuIHN0YXQg aW5mb3JtYXRpb24uCisgICAgICAgIENIQVIxNiBidWZbZC5kX25hbWxlbl07CisgICAgICAgIHN0 cmNweV90b18xNihidWYsIGQuZF9uYW1lKTsKKyAgICAgICAgc3RhdHVzID0gZmlsZV9vcGVuX2lt cGwoRmlsZSwgJmVudGhhbmRsZSwgYnVmLCBFRklfRklMRV9SRUFEX09OTFksIDApOworCisgICAg ICAgIGlmIChFRklfRVJST1Ioc3RhdHVzKSkgeworICAgICAgICAgICAgICAgIGZpbmZvLT5mZGF0 YS5mX29wcy0+Zm9fc2VlaygmKGZpbmZvLT5mZGF0YSksIGN1cnJwb3MsIFNFRUtfU0VUKTsKKyAg ICAgICAgICAgICAgICByZXR1cm4gKHN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICBlbnRp bmZvID0gKGZpbGVpbmZvX3QqKShlbnRoYW5kbGUgKyAxKTsKKworICAgICAgICBpZiAoKGVyciA9 IGZpbmZvLT5mZGF0YS5mX29wcy0+Zm9fc3RhdCgmKGVudGluZm8tPmZkYXRhKSwgJnN0KSkgIT0g MCkgeworICAgICAgICAgICAgICAgIGZpbmZvLT5mZGF0YS5mX29wcy0+Zm9fc2VlaygmKGZpbmZv LT5mZGF0YSksIGN1cnJwb3MsIFNFRUtfU0VUKTsKKwkJcmV0dXJuIChlcnJub190b19lZmlfc3Rh dHVzKGVycm5vKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBmaWxlX2Nsb3NlX2lt cGwoZW50aGFuZGxlKTsKKworICAgICAgICBpZiAoRUZJX0VSUk9SKHN0YXR1cykpIHsKKyAgICAg ICAgICAgICAgICBmaW5mby0+ZmRhdGEuZl9vcHMtPmZvX3NlZWsoJihmaW5mby0+ZmRhdGEpLCBj dXJycG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGF0dXMpOworICAg ICAgICB9CisKKyAgICAgICAgLy8gV2UncmUgZ29vZCBhdCB0aGlzIHBvaW50LCBjb3B5IGV2ZXJ5 dGhpbmcgaW50byBwbGFjZS4KKyAgICAgICAgb3V0LT5TaXplID0gcmVxc2l6ZTsKKyAgICAgICAg b3V0LT5GaWxlU2l6ZSA9IHN0LnN0X3NpemU7CisgICAgICAgIG91dC0+UGh5c2ljYWxTaXplID0g c3Quc3RfYmxvY2tzICogc3Quc3RfYmxrc2l6ZTsKKyAgICAgICAgb3V0LT5BdHRyaWJ1dGUgPSBt b2RlX3RvX2VmaShzdC5zdF9tb2RlKTsKKyAgICAgICAgdG9fZWZpX3RpbWUoJihvdXQtPkxhc3RB Y2Nlc3NUaW1lKSwgc3Quc3RfYXRpbWUpOworICAgICAgICB0b19lZmlfdGltZSgmKG91dC0+TW9k aWZpY2F0aW9uVGltZSksIHN0LnN0X210aW1lKTsKKyAgICAgICAgdG9fZWZpX3RpbWUoJihvdXQt PkNyZWF0ZVRpbWUpLCBzdC5zdF9jdGltZSk7CisKKyAgICAgICAgaWYgKFNfSVNESVIoc3Quc3Rf bW9kZSkpIHsKKyAgICAgICAgICAgICAgICBvdXQtPkF0dHJpYnV0ZSB8PSBFRklfRklMRV9ESVJF Q1RPUlk7CisgICAgICAgIH0KKworICAgICAgICBzdHJjcHlfdG9fMTYob3V0LT5GaWxlTmFtZSwg ZC5kX25hbWUpOworICAgICAgICAqQnVmZmVyU2l6ZSA9IHJlcXNpemU7CisKKyAgICAgICAgcmV0 dXJuIChFRklfU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyBFRklBUEkgRUZJX1NUQVRVUworZGlyX3dy aXRlX2ltcGwoRUZJX0ZJTEVfSEFORExFIEZpbGUgX191bnVzZWQsIFVJTlROICpCdWZmZXJTaXpl IF9fdW51c2VkLAorICAgICAgICAgICAgICAgVk9JRCAqQnVmZmVyIF9fdW51c2VkKQoreworICAg ICAgICAvLyBFRkkgQVBJIGRvZXNuJ3QgYWxsb3cgd3JpdGluZyB0byBkaXJlY3RvcmllcworICAg ICAgICByZXR1cm4gKEVGSV9VTlNVUFBPUlRFRCk7Cit9CisKK3N0YXRpYyBFRklBUEkgRUZJX1NU QVRVUworZmlsZV9yZWFkX2ltcGwoRUZJX0ZJTEVfSEFORExFIEZpbGUsIFVJTlROICpCdWZmZXJT aXplLCBWT0lEICpCdWZmZXIpCit7CisgICAgICAgIGZpbGVpbmZvX3QgKmZpbmZvID0gKGZpbGVp bmZvX3QqKShGaWxlICsgMSk7CisgICAgICAgIHNpemVfdCByZWFkc2l6ZSA9ICpCdWZmZXJTaXpl OworICAgICAgICBzaXplX3QgcmVzaWQ7CisgICAgICAgIGludCBlcnI7CisKKwlpZiAoKGVyciA9 IGZpbmZvLT5mZGF0YS5mX29wcy0+Zm9fcmVhZCgmKGZpbmZvLT5mZGF0YSksIEJ1ZmZlciwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHNpemUsICZy ZXNpZCkpICE9IDApIHsKKwkJcmV0dXJuIChlcnJub190b19lZmlfc3RhdHVzKGVycm5vKSk7CisJ fQorCisgICAgICAgICpCdWZmZXJTaXplID0gcmVhZHNpemUgLSByZXNpZDsKKworICAgICAgICBy ZXR1cm4gKEVGSV9TVUNDRVNTKTsKK30KKworc3RhdGljIEVGSUFQSSBFRklfU1RBVFVTCitmaWxl X3dyaXRlX2ltcGwoRUZJX0ZJTEVfSEFORExFIEZpbGUsIFVJTlROICpCdWZmZXJTaXplLCBWT0lE ICpCdWZmZXIpCit7CisgICAgICAgIGZpbGVpbmZvX3QgKmZpbmZvID0gKGZpbGVpbmZvX3QqKShG aWxlICsgMSk7CisgICAgICAgIHNpemVfdCB3cml0ZXNpemUgPSAqQnVmZmVyU2l6ZTsKKyAgICAg ICAgc2l6ZV90IHJlc2lkOworICAgICAgICBpbnQgZXJyOworCisJaWYgKChlcnIgPSBmaW5mby0+ ZmRhdGEuZl9vcHMtPmZvX3dyaXRlKCYoZmluZm8tPmZkYXRhKSwgQnVmZmVyLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVzaXplLCAmcmVzaWQp KSAhPSAwKSB7CisJCXJldHVybiAoZXJybm9fdG9fZWZpX3N0YXR1cyhlcnJubykpOworCX0KKwor ICAgICAgICAqQnVmZmVyU2l6ZSA9IHdyaXRlc2l6ZSAtIHJlc2lkOworCisgICAgICAgIHJldHVy biAoRUZJX1NVQ0NFU1MpOworfQorCitzdGF0aWMgRUZJQVBJIEVGSV9TVEFUVVMKK2ZpbGVfc2V0 X3Bvc2l0aW9uX2ltcGwoRUZJX0ZJTEVfSEFORExFIEZpbGUsIFVJTlQ2NCBQb3NpdGlvbikKK3sK KyAgICAgICAgZmlsZWluZm9fdCAqZmluZm8gPSAoZmlsZWluZm9fdCopKEZpbGUgKyAxKTsKKyAg ICAgICAgaW50IHJlczsKKworICAgICAgICBpZiAoUG9zaXRpb24gIT0gMHhmZmZmZmZmZmZmZmZm ZmZmTEwpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBmaW5mby0+ZmRhdGEuZl9vcHMtPmZvX3Nl ZWsoJihmaW5mby0+ZmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBQb3NpdGlvbiwgU0VFS19TRVQpOworICAgICAgICB9IGVsc2UgeworICAg ICAgICAgICAgICAgIHJlcyA9IGZpbmZvLT5mZGF0YS5mX29wcy0+Zm9fc2VlaygmKGZpbmZvLT5m ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDAsIFNFRUtfRU5EKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgPiAwKSB7CisgICAg ICAgICAgICAgICAgcmV0dXJuIChFRklfU1VDQ0VTUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgICAgICAgcmV0dXJuIChlcnJub190b19lZmlfc3RhdHVzKHJlcykpOworICAgICAgICB9 Cit9CisKKworc3RhdGljIEVGSUFQSSBFRklfU1RBVFVTCitmaWxlX2dldF9wb3NpdGlvbl9pbXBs KEVGSV9GSUxFX0hBTkRMRSBGaWxlLCBVSU5UNjQgKlBvc2l0aW9uKQoreworICAgICAgICBmaWxl aW5mb190ICpmaW5mbyA9IChmaWxlaW5mb190KikoRmlsZSArIDEpOworICAgICAgICBvZmZfdCBy ZXM7CisKKyAgICAgICAgcmVzID0gZmluZm8tPmZkYXRhLmZfb3BzLT5mb19zZWVrKCYoZmluZm8t PmZkYXRhKSwgMCwgU0VFS19DVVIpOworCisgICAgICAgIGlmIChyZXMgPiAwKSB7CisgICAgICAg ICAgICAgICAgKlBvc2l0aW9uID0gcmVzOworCisgICAgICAgICAgICAgICAgcmV0dXJuIChFRklf U1VDQ0VTUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChlcnJu b190b19lZmlfc3RhdHVzKGVycm5vKSk7CisgICAgICAgIH0KK30KKworc3RhdGljIEVGSUFQSSBF RklfU1RBVFVTCitmaWxlX2dldF9pbmZvX2ltcGwoRUZJX0ZJTEVfSEFORExFIEZpbGUsIEVGSV9H VUlEICpJbmZvcm1hdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgVUlOVE4gKkJ1ZmZlclNp emUsIFZPSUQgKkJ1ZmZlcikKK3sKKyAgICAgICAgZmlsZWluZm9fdCAqZmluZm8gPSAoZmlsZWlu Zm9fdCopKEZpbGUgKyAxKTsKKworICAgICAgICBpZiAoIW1lbWNtcChJbmZvcm1hdGlvblR5cGUs ICZGaWxlSW5mb0dVSUQsIHNpemVvZihFRklfR1VJRCkpKSB7CisgICAgICAgICAgICAgICAgRUZJ X0ZJTEVfSU5GTyAqb3V0ID0gKEVGSV9GSUxFX0lORk8qKUJ1ZmZlcjsKKyAgICAgICAgICAgICAg ICBVSU5UTiBzdHIxNmxlbiA9KHN0cmxlbihmaW5mby0+cGF0aCkgKyAxKSAqIHNpemVvZihDSEFS MTYpOworICAgICAgICAgICAgICAgIFVJTlROIGN1cnJzaXplID0gKkJ1ZmZlclNpemU7CisgICAg ICAgICAgICAgICAgVUlOVE4gcmVxc2l6ZSA9IHNpemVvZihFRklfRklMRV9JTkZPKSArIHN0cjE2 bGVuOworICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHN0OworICAgICAgICAgICAgICAgIGlu dCBlcnI7CisKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnN0LCAwLCBzaXplb2Yoc3RydWN0IHN0 YXQpKTsKKyAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSA9IHJlcXNpemU7CisKKyAgICAgICAg ICAgICAgICBpZiAoQnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgY3Vy cnNpemUgPCBzaXplb2YoRUZJX0ZJTEVfSU5GTykgKyBzdHIxNmxlbikgeworICAgICAgICAgICAg ICAgICAgICAgICAgKkJ1ZmZlclNpemUgPSBzaXplb2YoRUZJX0ZJTEVfSU5GTykgKyBzdHIxNmxl bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoRUZJX0JVRkZFUl9UT09fU01BTEwp OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoZXJyID0gZmluZm8t PmZkYXRhLmZfb3BzLT5mb19zdGF0KCYoZmluZm8tPmZkYXRhKSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdCkpICE9IDApIHsKKyAgICAg ICAJCXJldHVybiAoZXJybm9fdG9fZWZpX3N0YXR1cyhlcnJubykpOworICAgICAgICAgICAgICAg IH0KKworICAgICAgICAgICAgICAgIG91dC0+U2l6ZSA9IHNpemVvZihFRklfRklMRV9JTkZPKSAr IHN0cjE2bGVuOworICAgICAgICAgICAgICAgIG91dC0+RmlsZVNpemUgPSBzdC5zdF9zaXplOwor ICAgICAgICAgICAgICAgIG91dC0+UGh5c2ljYWxTaXplID0gc3Quc3RfYmxvY2tzICogc3Quc3Rf Ymxrc2l6ZTsKKyAgICAgICAgICAgICAgICB0b19lZmlfdGltZSgmKG91dC0+TGFzdEFjY2Vzc1Rp bWUpLCBzdC5zdF9hdGltZSk7CisgICAgICAgICAgICAgICAgdG9fZWZpX3RpbWUoJihvdXQtPk1v ZGlmaWNhdGlvblRpbWUpLCBzdC5zdF9tdGltZSk7CisgICAgICAgICAgICAgICAgdG9fZWZpX3Rp bWUoJihvdXQtPkNyZWF0ZVRpbWUpLCBzdC5zdF9jdGltZSk7CisgICAgICAgICAgICAgICAgb3V0 LT5BdHRyaWJ1dGUgPSBtb2RlX3RvX2VmaShzdC5zdF9tb2RlKTsKKworICAgICAgICAgICAgICAg IGlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQt PkF0dHJpYnV0ZSB8PSBFRklfRklMRV9ESVJFQ1RPUlk7CisgICAgICAgICAgICAgICAgfQorCisg ICAgICAgICAgICAgICAgc3RyY3B5X3RvXzE2KG91dC0+RmlsZU5hbWUsIGZpbmZvLT5wYXRoKTsK KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEVGSV9VTlNVUFBPUlRF RCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKEVGSV9TVUNDRVNTKTsKK30KKworc3Rh dGljIEVGSUFQSSBFRklfU1RBVFVTCitmaWxlX3NldF9pbmZvX2ltcGwoRUZJX0ZJTEVfSEFORExF IEZpbGUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgRUZJX0dVSUQgKkluZm9ybWF0aW9u VHlwZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICBVSU5UTiBCdWZmZXJTaXplIF9fdW51 c2VkLCBWT0lEICpCdWZmZXIgX191bnVzZWQpCit7CisgICAgICAgIHJldHVybiAoRUZJX1dSSVRF X1BST1RFQ1RFRCk7Cit9CisKK3N0YXRpYyBFRklBUEkgRUZJX1NUQVRVUworZmlsZV9mbHVzaF9p bXBsKEVGSV9GSUxFX0hBTkRMRSBGaWxlIF9fdW51c2VkKQoreworICAgICAgICByZXR1cm4gKEVG SV9TVUNDRVNTKTsKK30KKworc3RhdGljIEVGSUFQSSBFRklfU1RBVFVTCitvcGVuX3ZvbHVtZV9p bXBsKEVGSV9GSUxFX0lPX0lOVEVSRkFDRSAqVGhpcywgRUZJX0ZJTEVfSEFORExFICpSb290KQor eworICAgICAgICB2b2xpbmZvX3QgKnZpbmZvID0gKHZvbGluZm9fdCopKFRoaXMgKyAxKTsKKwor ICAgICAgICByZXR1cm4gZG9fZmlsZV9vcGVuKHZpbmZvLCAiIiwgT19SRE9OTFksIFJvb3QpOwor fQorCitzdGF0aWMgc3RydWN0IGZzX29wcyoKK2ZzX3Byb2JlKHN0cnVjdCBkZXZkZXNjICpkZXYp Cit7CisgICAgICAgIHN0cnVjdCBvcGVuX2ZpbGUgZjsKKwlpbnQgZXJyLCBpOworCisgICAgICAg IGYuZl9mbGFncyA9IE9fUkRPTkxZICsgMTsKKyAgICAgICAgZi5mX2RldiA9IChzdHJ1Y3QgZGV2 c3cgKikwOworICAgICAgICBmLmZfb3BzID0gKHN0cnVjdCBmc19vcHMgKikwOworICAgICAgICBm LmZfb2Zmc2V0ID0gMDsKKyAgICAgICAgZi5mX2RldmRhdGEgPSBkZXY7CisKKyAgICAgICAgaWYg KChlcnIgPSBkZXYtPmRfZGV2LT5kdl9vcGVuKCZmLCBkZXYpKSAhPSAwKSB7CisgICAgICAgICAg ICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBiYWNr ZW5kX2ZpbGVfc3lzdGVtW2ldICE9IE5VTEw7IGkrKykgeworICAgICAgICAgICAgICAgIGYuZl9v cHMgPSBiYWNrZW5kX2ZpbGVfc3lzdGVtW2ldOworCisgICAgICAgICAgICAgICAgaWYgKChlcnIg PSBmLmZfb3BzLT5mb19vcGVuKCIvIiwgJmYpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gYmFja2VuZF9maWxlX3N5c3RlbVtpXTsKKyAgICAgICAgICAgICAgICB9Cisg ICAgICAgIH0KKworICAgICAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEVGSV9TVEFUVVMK K21ha2VfZnNfZmlsZV9pb19pZmFjZShzdHJ1Y3QgZGV2ZGVzYyAqZGV2LCBFRklfRklMRV9JT19J TlRFUkZBQ0UgKipvdXQpCit7CisgICAgICAgIHN0YXRpYyBzdHJ1Y3QgZnNfb3BzKiBmc29wczsK KyAgICAgICAgRUZJX0ZJTEVfSU9fSU5URVJGQUNFKiBmaWZhY2U7CisgICAgICAgIHZvbGluZm9f dCAqdmluZm87CisKKyAgICAgICAgc3dpdGNoIChkZXYtPmRfdHlwZSkgeworI2lmZGVmIEVGSV9a RlNfQk9PVAorCWNhc2UgREVWVF9aRlM6CisgICAgICAgICAgICAgICAgZnNvcHMgPSAmemZzX2Zz b3BzOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6Cisg ICAgICAgICAgICAgICAgZnNvcHMgPSBmc19wcm9iZShkZXYpOworICAgICAgICAgICAgICAgIGJy ZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZzb3BzID09IE5VTEwpIHsKKyAgICAgICAg ICAgICAgICByZXR1cm4gKEVGSV9VTlNVUFBPUlRFRCk7CisgICAgICAgIH0KKworICAgICAgICBm aWZhY2UgPSBtYWxsb2Moc2l6ZW9mKEVGSV9GSUxFX0lPX0lOVEVSRkFDRSkgKyBzaXplb2Yodm9s aW5mb190KSk7CisKKyAgICAgICAgaWYgKGZpZmFjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAg ICAgcmV0dXJuIChFRklfT1VUX09GX1JFU09VUkNFUyk7CisgICAgICAgIH0KKworICAgICAgICB2 aW5mbyA9ICh2b2xpbmZvX3QqKShmaWZhY2UgKyAxKTsKKworICAgICAgICBmaWZhY2UtPlJldmlz aW9uID0gRUZJX0ZJTEVfSU9fSU5URVJGQUNFX1JFVklTSU9OOworICAgICAgICBmaWZhY2UtPk9w ZW5Wb2x1bWUgPSBvcGVuX3ZvbHVtZV9pbXBsOworICAgICAgICB2aW5mby0+ZGV2ID0gZGV2Owor ICAgICAgICB2aW5mby0+ZnNvcHMgPSBmc29wczsKKworICAgICAgICAqb3V0ID0gZmlmYWNlOwor CisgICAgICAgIHJldHVybiAoRUZJX1NVQ0NFU1MpOworfQorCitzdGF0aWMgRUZJQVBJIEVGSV9T VEFUVVMKK2JpbmRfaWZhY2UoRUZJX0hBTkRMRSBoYW5kbGUsIHN0cnVjdCBkZXZkZXNjICpkZXYp Cit7CisgICAgICAgIEVGSV9TVEFUVVMgc3RhdHVzOworICAgICAgICBFRklfRklMRV9JT19JTlRF UkZBQ0UgKmlmYWNlOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBm aWxlc3lzdGVtIGludGVyZmFjZQorICAgICAgICBzdGF0dXMgPSBCUy0+T3BlblByb3RvY29sKGhh bmRsZSwgJlNpbXBsZUZpbGVTeXN0ZW1Qcm90b2NvbEdVSUQsCisgICAgICAgICAgICBOVUxMLCBJ SCwgaGFuZGxlLCBFRklfT1BFTl9QUk9UT0NPTF9URVNUX1BST1RPQ09MKTsKKworICAgICAgICBp ZiAoIUVGSV9FUlJPUihzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChFRklfQUND RVNTX0RFTklFRCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEVGSV9VTlNVUFBPUlRF RCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAg ICAgIHN0YXR1cyA9IG1ha2VfZnNfZmlsZV9pb19pZmFjZShkZXYsICZpZmFjZSk7CisKKyAgICAg ICAgaWYgKEVGSV9FUlJPUihzdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGF0 dXMpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gQlMtPkluc3RhbGxNdWx0aXBsZVBy b3RvY29sSW50ZXJmYWNlcygmaGFuZGxlLAorICAgICAgICAgICAgJlNpbXBsZUZpbGVTeXN0ZW1Q cm90b2NvbEdVSUQsIGlmYWNlLCBOVUxMKTsKKworICAgICAgICBpZiAoRUZJX0VSUk9SKHN0YXR1 cykpIHsKKyAgICAgICAgICAgICAgICBmcmVlKGlmYWNlKTsKKworICAgICAgICAgICAgICAgIHJl dHVybiAoc3RhdHVzKTsKKyAgICAgICAgfQorCisJcmV0dXJuIChzdGF0dXMpOworfQorCitzdGF0 aWMgRUZJQVBJIEVGSV9TVEFUVVMKK3N0b3BfaW1wbChFRklfRFJJVkVSX0JJTkRJTkcgKlRoaXMg X191bnVzZWQsIEVGSV9IQU5ETEUgQ29udHJvbGxlckhhbmRsZSBfX3VudXNlZCwKKyAgICAgICAg ICBVSU5UTiBOdW1iZXJPZkNoaWxkcmVuIF9fdW51c2VkLCBFRklfSEFORExFICpDaGlsZEhhbmRs ZUJ1ZmZlciBfX3VudXNlZCkKK3sKKyAgICAgICAgLy8gR2V0IHRoZSBwcm90b2NvbCBpbnRlZmFj ZSwgdW5pbnN0YWxsIGl0LCBhbmQgZnJlZSBpdAorICAgICAgICByZXR1cm4gKEVGSV9TVUNDRVNT KTsKK30KKworI2lmZGVmIEVGSV9aRlNfQk9PVAorc3RhdGljIHZvaWQKK2VmaV96ZnNfcHJvYmUo dm9pZCkKK3sKKwlFRklfSEFORExFIGg7CisJdV9pbnQgdW5pdDsKKwlpbnQgaTsKKwljaGFyIGRu YW1lW1NQRUNOQU1FTEVOICsgMV07CisJdWludDY0X3QgZ3VpZDsKKworCXVuaXQgPSAwOworCWgg PSBlZmlfZmluZF9oYW5kbGUoJmVmaXBhcnRfZGV2LCAwKTsKKwlmb3IgKGkgPSAwOyBoICE9IE5V TEw7IGggPSBlZmlfZmluZF9oYW5kbGUoJmVmaXBhcnRfZGV2LCArK2kpKSB7CisJCXNucHJpbnRm KGRuYW1lLCBzaXplb2YoZG5hbWUpLCAiJXMlZDoiLCBlZmlwYXJ0X2Rldi5kdl9uYW1lLCBpKTsK KwkJaWYgKHpmc19wcm9iZV9kZXYoZG5hbWUsICZndWlkKSA9PSAwKSB7CisJCQkodm9pZCllZmlf aGFuZGxlX3VwZGF0ZV9kZXYoaCwgJnpmc19kZXYsIHVuaXQrKywgZ3VpZCk7CisgICAgICAgICAg ICAgICAgfQorCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitiYWNrZW5kX3BhcnNlZGV2KHN0 cnVjdCBkZXZkZXNjICoqZGV2LCBjb25zdCBjaGFyICpkZXZzcGVjLCBjb25zdCBjaGFyICoqcGF0 aCkKK3sKKwlzdHJ1Y3QgZGV2ZGVzYyAqaWRldjsKKwlzdHJ1Y3QgZGV2c3cgKmR2OworCWNoYXIg KmNwOworCWNvbnN0IGNoYXIgKm5wOworCWludCBpOworCisJLyogbWluaW11bSBsZW5ndGggY2hl Y2sgKi8KKwlpZiAoc3RybGVuKGRldnNwZWMpIDwgMikKKwkJcmV0dXJuIChFSU5WQUwpOworCisJ LyogbG9vayBmb3IgYSBkZXZpY2UgdGhhdCBtYXRjaGVzICovCisJZm9yIChpID0gMDsgYmFja2Vu ZF9kZXZzd1tpXSAhPSBOVUxMOyBpKyspIHsKKwkJZHYgPSBiYWNrZW5kX2RldnN3W2ldOworCQlp ZiAoIXN0cm5jbXAoZGV2c3BlYywgZHYtPmR2X25hbWUsIHN0cmxlbihkdi0+ZHZfbmFtZSkpKQor CQkJYnJlYWs7CisJfQorCWlmIChiYWNrZW5kX2RldnN3W2ldID09IE5VTEwpIHsKKwkJcmV0dXJu IChFTk9FTlQpOworICAgICAgICB9CisKKwlucCA9IGRldnNwZWMgKyBzdHJsZW4oZHYtPmR2X25h bWUpOworCisjaWZkZWYgRUZJX1pGU19CT09UCisJaWYgKGR2LT5kdl90eXBlID09IERFVlRfWkZT KSB7CisJCWludCBlcnI7CisKKwkJaWRldiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHpmc19kZXZk ZXNjKSk7CisJCWlmIChpZGV2ID09IE5VTEwpCisJCQlyZXR1cm4gKEVOT01FTSk7CisKKwkJZXJy ID0gemZzX3BhcnNlZGV2KChzdHJ1Y3QgemZzX2RldmRlc2MqKWlkZXYsIG5wLCBwYXRoKTsKKwkJ aWYgKGVyciAhPSAwKSB7CisJCQlmcmVlKGlkZXYpOworCQkJcmV0dXJuIChlcnIpOworCQl9CisJ CSpkZXYgPSBpZGV2OworCQljcCA9IHN0cmNocihucCArIDEsICc6Jyk7CisJfSBlbHNlCisjZW5k aWYKKwl7CisJCWlkZXYgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZkZXNjKSk7CisJCWlmIChp ZGV2ID09IE5VTEwpCisJCQlyZXR1cm4gKEVOT01FTSk7CisKKwkJaWRldi0+ZF9kZXYgPSBkdjsK KwkJaWRldi0+ZF90eXBlID0gZHYtPmR2X3R5cGU7CisJCWlkZXYtPmRfdW5pdCA9IC0xOworCQlp ZiAoKm5wICE9ICdcMCcgJiYgKm5wICE9ICc6JykgeworCQkJaWRldi0+ZF91bml0ID0gc3RydG9s KG5wLCAmY3AsIDApOworCQkJaWYgKGNwID09IG5wKSB7CisJCQkJaWRldi0+ZF91bml0ID0gLTE7 CisJCQkJZnJlZShpZGV2KTsKKwkJCQlyZXR1cm4gKEVVTklUKTsKKwkJCX0KKwkJfQorCX0KKwor CWlmICgqY3AgIT0gJ1wwJyAmJiAqY3AgIT0gJzonKSB7CisJCWZyZWUoaWRldik7CisJCXJldHVy biAoRUlOVkFMKTsKKwl9CisKKwlpZiAocGF0aCAhPSBOVUxMKQorCQkqcGF0aCA9ICgqY3AgPT0g MCkgPyBjcCA6IGNwICsgMTsKKwlpZiAoZGV2ICE9IE5VTEwpCisJCSpkZXYgPSBpZGV2OworCWVs c2UKKwkJZnJlZShpZGV2KTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitiYWNrZW5k X2dldGRldih2b2lkICoqdmRldiwgY29uc3QgY2hhciAqZGV2c3BlYywgY29uc3QgY2hhciAqKnBh dGgpCit7CisJc3RydWN0IGRldmRlc2MgKipkZXYgPSAoc3RydWN0IGRldmRlc2MgKiopdmRldjsK KwlpbnQgcnY7CisKKwkvKgorCSAqIElmIGl0IGxvb2tzIGxpa2UgdGhpcyBpcyBqdXN0IGEgcGF0 aCBhbmQgbm8gZGV2aWNlLCB0aGVuCisJICogdXNlIHRoZSBjdXJyZW50IGRldmljZSBpbnN0ZWFk LgorCSAqLworCWlmIChkZXZzcGVjID09IE5VTEwgfHwgKmRldnNwZWMgPT0gJy8nIHx8ICFzdHJj aHIoZGV2c3BlYywgJzonKSkgeworCQlydiA9IGJhY2tlbmRfcGFyc2VkZXYoZGV2LCBnZXRlbnYo ImN1cnJkZXYiKSwgTlVMTCk7CisJCWlmIChydiA9PSAwICYmIHBhdGggIT0gTlVMTCkKKwkJCSpw YXRoID0gZGV2c3BlYzsKKwkJcmV0dXJuIChydik7CisJfQorCisJLyogUGFyc2UgdGhlIGRldmlj ZSBuYW1lIG9mZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZXZzcGVjLiAqLworCXJldHVybiAoYmFj a2VuZF9wYXJzZWRldihkZXYsIGRldnNwZWMsIHBhdGgpKTsKK30KKworc3RhdGljIHZvaWQKK2lu aXQodm9pZCkKK3sKKwlFRklfSEFORExFIGg7CisgICAgICAgIEVGSV9TVEFUVVMgc3RhdHVzOwor CXVfaW50IHVuaXQ7CisgICAgICAgIGludCBpOworCXN0cnVjdCBkZXZzdyAqZGV2OworCXVpbnQ2 NF90IHBvb2xfZ3VpZDsKKyAgICAgICAgaW50ICgqb2xkX2dldGRldikodm9pZCAqKiwgY29uc3Qg Y2hhciAqLCBjb25zdCBjaGFyICoqKSA9CisgICAgICAgICAgYXJjaHN3LmFyY2hfZ2V0ZGV2Owor CisJYXJjaHN3LmFyY2hfZ2V0ZGV2ID0gYmFja2VuZF9nZXRkZXY7CisjaWZkZWYgRUZJX1pGU19C T09UCisJLyogTm90ZSB0aGlzIG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgWkZTIGluaXQuICovCisJ YXJjaHN3LmFyY2hfemZzX3Byb2JlID0gZWZpX3pmc19wcm9iZTsKKyNlbmRpZgorCisgICAgICAg IC8qIEluaXRpYWxpemUgYWxsIHRoZSBiYWNrZW5kIGRyaXZlcnMgKi8KKwlmb3IgKGkgPSAwOyBi YWNrZW5kX2RldnN3W2ldICE9IE5VTEw7IGkrKykgeworCQlpZiAoYmFja2VuZF9kZXZzd1tpXS0+ ZHZfaW5pdCAhPSBOVUxMKQorCQkJKGJhY2tlbmRfZGV2c3dbaV0tPmR2X2luaXQpKCk7CisgICAg ICAgIH0KKworICAgICAgICAvKiBBdHRhY2ggU0lNUExFX0ZJTEVfU1lTVEVNIGludGVyZmFjZXMg dG8gYWxsIGVmaXBhcnQgZGV2aWNlcyAqLworCXVuaXQgPSAwOworCWggPSBlZmlfZmluZF9oYW5k bGUoJmVmaXBhcnRfZGV2LCAwKTsKKwlmb3IgKGkgPSAwOyBoICE9IE5VTEw7IGggPSBlZmlfZmlu ZF9oYW5kbGUoJmVmaXBhcnRfZGV2LCArK2kpKSB7CisJCXN0cnVjdCBkZXZkZXNjICpjdXJyZGV2 OworCisgICAgICAgICAgICAgICAgY3VycmRldiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGRldmRl c2MpKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZGV2ID09IE5VTEwpIHsKKyAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg ICAgICAgIGlmIChlZmlfaGFuZGxlX2xvb2t1cChoLCAmZGV2LCAmdW5pdCwgJnBvb2xfZ3VpZCkg IT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShjdXJyZGV2KTsKKyAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworCQljdXJyZGV2 LT5kX2RldiA9IGRldjsKKwkJY3VycmRldi0+ZF91bml0ID0gdW5pdDsKKwkJY3VycmRldi0+ZF9v cGVuZGF0YSA9IE5VTEw7CisJCWN1cnJkZXYtPmRfdHlwZSA9IGN1cnJkZXYtPmRfZGV2LT5kdl90 eXBlOworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gYmluZF9pZmFjZShoLCBjdXJyZGV2KTsK KworICAgICAgICAgICAgICAgIGlmIChFRklfRVJST1Ioc3RhdHVzKSAmJiBzdGF0dXMgIT0gRUZJ X1VOU1VQUE9SVEVEICYmCisgICAgICAgICAgICAgICAgICAgc3RhdHVzICE9IEVGSV9BQ0NFU1Nf REVOSUVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gYXR0 YWNoIGZpbGVzeXN0ZW0gaW50ZXJmYWNlIHRvIGVmaXBhcnQldSAoJWxkKVxuIiwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdW5pdCwgRUZJX0VSUk9SX0NPREUoc3RhdHVzKSk7Cisg ICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShjdXJyZGV2KTsKKyAgICAgICAgICAgICAgICB9 CisgICAgICAgIH0KKworICAgICAgICAvKiBBdHRhY2ggU0lNUExFX0ZJTEVfU1lTVEVNIGludGVy ZmFjZSB0byBhbGwgWkZTIGRldmljZXMgKi8KKyNpZmRlZiBFRklfWkZTX0JPT1QKKwl1bml0ID0g MDsKKwloID0gZWZpX2ZpbmRfaGFuZGxlKCZ6ZnNfZGV2LCAwKTsKKwlmb3IgKGkgPSAwOyBoICE9 IE5VTEw7IGggPSBlZmlfZmluZF9oYW5kbGUoJnpmc19kZXYsICsraSkpIHsKKwkJc3RydWN0IHpm c19kZXZkZXNjICpjdXJyZGV2OworCisgICAgICAgICAgICAgICAgY3VycmRldiA9IG1hbGxvYyhz aXplb2Yoc3RydWN0IHpmc19kZXZkZXNjKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3VycmRl diA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZWZpX2hhbmRsZV9sb29rdXAoaCwgJmRl diwgJnVuaXQsICZwb29sX2d1aWQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZy ZWUoY3VycmRldik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg ICAgICAgICB9CisKKwkJY3VycmRldi0+ZF9kZXYgPSBkZXY7CisJCWN1cnJkZXYtPmRfdW5pdCA9 IHVuaXQ7CisJCWN1cnJkZXYtPmRfb3BlbmRhdGEgPSBOVUxMOworCQljdXJyZGV2LT5kX3R5cGUg PSBjdXJyZGV2LT5kX2Rldi0+ZHZfdHlwZTsKKyAgICAgICAgICAgICAgICBjdXJyZGV2LT5wb29s X2d1aWQgPSBwb29sX2d1aWQ7CisgICAgICAgICAgICAgICAgY3VycmRldi0+cm9vdF9ndWlkID0g MDsKKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGJpbmRfaWZhY2UoaCwgKHN0cnVjdCBkZXZk ZXNjKiljdXJyZGV2KTsKKworICAgICAgICAgICAgICAgIGlmIChFRklfRVJST1Ioc3RhdHVzKSkg eworICAgICAgICAgICAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gYXR0YWNoIGZpbGVzeXN0ZW0g aW50ZXJmYWNlIHRvIHpmcyV1ICglbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVu aXQsIEVGSV9FUlJPUl9DT0RFKHN0YXR1cykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg fQorI2VuZGlmCisgICAgICAgIGFyY2hzdy5hcmNoX2dldGRldiA9IG9sZF9nZXRkZXY7Cit9CisK K2NvbnN0IGVmaV9kcml2ZXJfdCBmc19kcml2ZXIgPQoreworCS5uYW1lID0gIkZTIEJhY2tlbmQi LAorCS5pbml0ID0gaW5pdCwKK307CmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL2luY2x1ZGUvZWZp bGliLmggc3lzL2Jvb3QvZWZpL2luY2x1ZGUvZWZpbGliLmgKaW5kZXggMDljY2MyZjM2NDcuLjE1 ZDRiNDg3ZDQwIDEwMDY0NAotLS0gc3lzL2Jvb3QvZWZpL2luY2x1ZGUvZWZpbGliLmgKKysrIHN5 cy9ib290L2VmaS9pbmNsdWRlL2VmaWxpYi5oCkBAIC0zMSwyMiArMzEsMjYgQEAKICNkZWZpbmUJ X0xPQURFUl9FRklMSUJfSAogCiAjaW5jbHVkZSA8c3RhbmQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+ CiAKIGV4dGVybiBFRklfSEFORExFCQlJSDsKLWV4dGVybiBFRklfU1lTVEVNX1RBQkxFCQkqU1Q7 CitleHRlcm4gRUZJX1NZU1RFTV9UQUJMRQkqU1Q7CiBleHRlcm4gRUZJX0JPT1RfU0VSVklDRVMJ KkJTOwogZXh0ZXJuIEVGSV9SVU5USU1FX1NFUlZJQ0VTCSpSUzsKIAotZXh0ZXJuIHN0cnVjdCBk ZXZzdyBlZmlwYXJ0X2RldjsKK2V4dGVybiBzdHJ1Y3QgZGV2c3cgZWZpZnNfZGV2OwogZXh0ZXJu IHN0cnVjdCBkZXZzdyBlZmluZXRfZGV2OworZXh0ZXJuIHN0cnVjdCBmc19vcHMgZWZpZnNfZnNv cHM7CiBleHRlcm4gc3RydWN0IG5ldGlmX2RyaXZlciBlZmluZXRpZjsKIAogdm9pZCAqZWZpX2dl dF90YWJsZShFRklfR1VJRCAqdGJsKTsKIAogaW50IGVmaV9yZWdpc3Rlcl9oYW5kbGVzKHN0cnVj dCBkZXZzdyAqLCBFRklfSEFORExFICosIEVGSV9IQU5ETEUgKiwgaW50KTsKK2ludCBlZmlfcmVn aXN0ZXJfaGFuZGxlKHN0cnVjdCBkZXZzdyAqLCBFRklfSEFORExFLCBFRklfSEFORExFKTsKIEVG SV9IQU5ETEUgZWZpX2ZpbmRfaGFuZGxlKHN0cnVjdCBkZXZzdyAqLCBpbnQpOwogaW50IGVmaV9o YW5kbGVfbG9va3VwKEVGSV9IQU5ETEUsIHN0cnVjdCBkZXZzdyAqKiwgaW50ICosICB1aW50NjRf dCAqKTsKIGludCBlZmlfaGFuZGxlX3VwZGF0ZV9kZXYoRUZJX0hBTkRMRSwgc3RydWN0IGRldnN3 ICosIGludCwgdWludDY0X3QpOworaW50IGVmaV9oYW5kbGVfcmVtb3ZlX2RldihFRklfSEFORExF KTsKIAogRUZJX0RFVklDRV9QQVRIICplZmlfbG9va3VwX2ltYWdlX2RldnBhdGgoRUZJX0hBTkRM RSk7CiBFRklfREVWSUNFX1BBVEggKmVmaV9sb29rdXBfZGV2cGF0aChFRklfSEFORExFKTsKQEAg LTU3LDYgKzYxLDcgQEAgQ0hBUjE2ICplZmlfZGV2cGF0aF9uYW1lKEVGSV9ERVZJQ0VfUEFUSCAq KTsKIHZvaWQgZWZpX2ZyZWVfZGV2cGF0aF9uYW1lKENIQVIxNiAqKTsKIAogaW50IGVmaV9zdGF0 dXNfdG9fZXJybm8oRUZJX1NUQVRVUyk7CitFRklfU1RBVFVTIGVycm5vX3RvX2VmaV9zdGF0dXMo aW50IGVycm5vKTsKIAogdm9pZCBlZmlfdGltZV9pbml0KHZvaWQpOwogdm9pZCBlZmlfdGltZV9m aW5pKHZvaWQpOwpAQCAtNjUsNCArNzAsNyBAQCBFRklfU1RBVFVTIG1haW4oaW50IGFyZ2MsIENI QVIxNiAqYXJndltdKTsKIHZvaWQgZXhpdChFRklfU1RBVFVTIHN0YXR1cyk7CiB2b2lkIGRlbGF5 KGludCB1c2Vjcyk7CiAKK3RpbWVfdCBmcm9tX2VmaV90aW1lKEVGSV9USU1FICplZmlfdGltZSk7 Cit2b2lkIHRvX2VmaV90aW1lKEVGSV9USU1FICplZmlfdGltZSwgdGltZV90IHRpbWUpOworCiAj ZW5kaWYJLyogX0xPQURFUl9FRklMSUJfSCAqLwpkaWZmIC0tZ2l0IHN5cy9ib290L2VmaS9pbmNs dWRlL2VmaXByb3QuaCBzeXMvYm9vdC9lZmkvaW5jbHVkZS9lZmlwcm90LmgKaW5kZXggMjhjZWM1 OTkxZTMuLjIyMjE1Nzc3Y2FiIDEwMDY0NAotLS0gc3lzL2Jvb3QvZWZpL2luY2x1ZGUvZWZpcHJv dC5oCisrKyBzeXMvYm9vdC9lZmkvaW5jbHVkZS9lZmlwcm90LmgKQEAgLTI3LDYgKzI3LDggQEAg UmV2aXNpb24gSGlzdG9yeQogCiAtLSovCiAKKyNpbmNsdWRlIDxlZmlkZWYuaD4KKwogLy8KIC8v IERldmljZSBQYXRoIHByb3RvY29sCiAvLwpAQCAtMzA3LDkgKzMwOSw5IEBAIHR5cGVkZWYgc3Ry dWN0IHsKIC8vCiAvLyBUaGUgRmlsZU5hbWUgZmllbGQgb2YgdGhlIEVGSV9GSUxFX0lORk8gZGF0 YSBzdHJ1Y3R1cmUgaXMgdmFyaWFibGUgbGVuZ3RoLgogLy8gV2hlbmV2ZXIgY29kZSBuZWVkcyB0 byBrbm93IHRoZSBzaXplIG9mIHRoZSBFRklfRklMRV9JTkZPIGRhdGEgc3RydWN0dXJlLCBpdCBu ZWVkcyB0bwotLy8gYmUgdGhlIHNpemUgb2YgdGhlIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgdGhl IEZpbGVOYW1lIGZpZWxkLiAgVGhlIGZvbGxvd2luZyBtYWNybyAKKy8vIGJlIHRoZSBzaXplIG9m IHRoZSBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IHRoZSBGaWxlTmFtZSBmaWVsZC4gIFRoZSBmb2xs b3dpbmcgbWFjcm8KIC8vIGNvbXB1dGVzIHRoaXMgc2l6ZSBjb3JyZWN0bHkgbm8gbWF0dGVyIGhv dyBiaWcgdGhlIEZpbGVOYW1lIGFycmF5IGlzIGRlY2xhcmVkLgotLy8gVGhpcyBpcyByZXF1aXJl ZCB0byBtYWtlIHRoZSBFRklfRklMRV9JTkZPIGRhdGEgc3RydWN0dXJlIEFOU0kgY29tcGlsYW50 LiAKKy8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSB0aGUgRUZJX0ZJTEVfSU5GTyBkYXRhIHN0 cnVjdHVyZSBBTlNJIGNvbXBpbGFudC4KIC8vCiAKICNkZWZpbmUgU0laRV9PRl9FRklfRklMRV9J TkZPIEVGSV9GSUVMRF9PRkZTRVQoRUZJX0ZJTEVfSU5GTyxGaWxlTmFtZSkKQEAgLTMyOSw5ICsz MzEsOSBAQCB0eXBlZGVmIHN0cnVjdCB7CiAvLwogLy8gVGhlIFZvbHVtZUxhYmVsIGZpZWxkIG9m IHRoZSBFRklfRklMRV9TWVNURU1fSU5GTyBkYXRhIHN0cnVjdHVyZSBpcyB2YXJpYWJsZSBsZW5n dGguCiAvLyBXaGVuZXZlciBjb2RlIG5lZWRzIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIEVGSV9G SUxFX1NZU1RFTV9JTkZPIGRhdGEgc3RydWN0dXJlLCBpdCBuZWVkcwotLy8gdG8gYmUgdGhlIHNp emUgb2YgdGhlIGRhdGEgc3RydWN0dXJlIHdpdGhvdXQgdGhlIFZvbHVtZUxhYmxlIGZpZWxkLiAg VGhlIGZvbGxvd2luZyBtYWNybyAKKy8vIHRvIGJlIHRoZSBzaXplIG9mIHRoZSBkYXRhIHN0cnVj dHVyZSB3aXRob3V0IHRoZSBWb2x1bWVMYWJsZSBmaWVsZC4gIFRoZSBmb2xsb3dpbmcgbWFjcm8K IC8vIGNvbXB1dGVzIHRoaXMgc2l6ZSBjb3JyZWN0bHkgbm8gbWF0dGVyIGhvdyBiaWcgdGhlIFZv bHVtZUxhYmxlIGFycmF5IGlzIGRlY2xhcmVkLgotLy8gVGhpcyBpcyByZXF1aXJlZCB0byBtYWtl IHRoZSBFRklfRklMRV9TWVNURU1fSU5GTyBkYXRhIHN0cnVjdHVyZSBBTlNJIGNvbXBpbGFudC4g CisvLyBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgdGhlIEVGSV9GSUxFX1NZU1RFTV9JTkZPIGRh dGEgc3RydWN0dXJlIEFOU0kgY29tcGlsYW50LgogLy8KIAogI2RlZmluZSBTSVpFX09GX0VGSV9G SUxFX1NZU1RFTV9JTkZPIEVGSV9GSUVMRF9PRkZTRVQoRUZJX0ZJTEVfU1lTVEVNX0lORk8sVm9s dW1lTGFiZWwpCkBAIC00MTEsNyArNDEzLDcgQEAgdHlwZWRlZiBzdHJ1Y3QgewogICAgIEVGSV9E RVZJQ0VfSU8gICAgICAgICAgICAgICAgICAgV3JpdGU7CiB9IEVGSV9JT19BQ0NFU1M7CiAKLXR5 cGVkZWYgCit0eXBlZGVmCiBFRklfU1RBVFVTCiAoRUZJQVBJICpFRklfUENJX0RFVklDRV9QQVRI KSAoCiAgICAgSU4gc3RydWN0IF9FRklfREVWSUNFX0lPX0lOVEVSRkFDRSAgKlRoaXMsCkBAIC01 NTUsNCArNTU3LDQ3IEBAIHR5cGVkZWYgc3RydWN0IF9FRklfVU5JQ09ERV9DT0xMQVRJT05fSU5U RVJGQUNFIHsKICAgICBDSEFSOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU3VwcG9y dGVkTGFuZ3VhZ2VzOwogfSBFRklfVU5JQ09ERV9DT0xMQVRJT05fSU5URVJGQUNFOwogCisvLwor Ly8gRHJpdmVyIEJpbmRpbmcgcHJvdG9jb2wKKy8vCisKKyNkZWZpbmUgRFJJVkVSX0JJTkRJTkdf UFJPVE9DT0wgXAorICB7IDB4MThhMDMxYWIsIDB4YjQ0MywgMHg0ZDFhLCB7MHhhNSwgMHhjMCwg MHgwYywgMHgwOSwgMHgyNiwgMHgxZSwgMHg5ZiwgMHg3MX0gfQorCitJTlRFUkZBQ0VfREVDTChf RUZJX0RSSVZFUl9CSU5ESU5HKTsKKwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJ X0RSSVZFUl9CSU5ESU5HX1NVUFBPUlRFRCkgKAorICAgIElOIHN0cnVjdCBfRUZJX0RSSVZFUl9C SU5ESU5HICpUaGlzLAorICAgIElOIEVGSV9IQU5ETEUgQ29udHJvbGxlckhhbmRsZSwKKyAgICBJ TiBFRklfREVWSUNFX1BBVEggKlJlbWFpbmluZ1BhdGgKKyAgICApOworCit0eXBlZGVmCitFRklf U1RBVFVTCisoRUZJQVBJICpFRklfRFJJVkVSX0JJTkRJTkdfU1RBUlQpICgKKyAgICBJTiBzdHJ1 Y3QgX0VGSV9EUklWRVJfQklORElORyAqVGhpcywKKyAgICBJTiBFRklfSEFORExFIENvbnRyb2xs ZXJIYW5kbGUsCisgICAgSU4gRUZJX0RFVklDRV9QQVRIICpSZW1haW5pbmdQYXRoCisgICAgKTsK KwordHlwZWRlZgorRUZJX1NUQVRVUworKEVGSUFQSSAqRUZJX0RSSVZFUl9CSU5ESU5HX1NUT1Ap ICgKKyAgICBJTiBzdHJ1Y3QgX0VGSV9EUklWRVJfQklORElORyAqVGhpcywKKyAgICBJTiBFRklf SEFORExFIENvbnRyb2xsZXJIYW5kbGUsCisgICAgSU4gVUlOVE4gTnVtYmVyT2ZDaGlsZHJlbiwK KyAgICBJTiBFRklfSEFORExFICpDaGlsZEhhbmRsZUJ1ZmZlcgorICAgICk7CisKK3R5cGVkZWYg c3RydWN0IF9FRklfRFJJVkVSX0JJTkRJTkcgeworICBFRklfRFJJVkVSX0JJTkRJTkdfU1VQUE9S VEVEIFN1cHBvcnRlZDsKKyAgRUZJX0RSSVZFUl9CSU5ESU5HX1NUQVJUIFN0YXJ0OworICBFRklf RFJJVkVSX0JJTkRJTkdfU1RPUCBTdG9wOworICBVSU5UMzIgVmVyc2lvbjsKKyAgRUZJX0hBTkRM RSBJbWFnZUhhbmRsZTsKKyAgRUZJX0hBTkRMRSBEcml2ZXJCaW5kaW5nSGFuZGxlOworfSBFRklf RFJJVkVSX0JJTkRJTkc7CisKICNlbmRpZgpkaWZmIC0tZ2l0IHN5cy9ib290L2VmaS9pbmNsdWRl L3N0cmluZzE2Lmggc3lzL2Jvb3QvZWZpL2luY2x1ZGUvc3RyaW5nMTYuaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNWU0ZjljMWVmMWEKLS0tIC9kZXYvbnVsbAorKysg c3lzL2Jvb3QvZWZpL2luY2x1ZGUvc3RyaW5nMTYuaApAQCAtMCwwICsxLDQ1IEBACisvKi0KKyAq IENvcHlyaWdodCAoYykgMjAxNiBFcmljIE1jQ29ya2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0 IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhP UiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJ RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhF IEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5E SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAor ICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G IFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5E IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QK KyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF KSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgor ICoKKyAqICRGcmVlQlNEJAorICovCisKKyNpZm5kZWYgX1NUUklORzE2X0hfCisjZGVmaW5lIF9T VFJJTkcxNl9IXworCisjaW5jbHVkZSA8ZWZpLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8q CisgKiBUaGVzZSBhcmUgMTYtYml0IHZhcmlhbnRzIG9mIHN0cmluZyxoIGZ1bmN0aW9ucyBmb3Ig dXNlIHdpdGggRUZJIGNvZGUuCisgKi8KKworZXh0ZXJuIHNpemVfdCBzdHJsZW4xNihjb25zdCBD SEFSMTYgKnN0cik7CitleHRlcm4gQ0hBUjE2KiBzdHJjcHkxNihDSEFSMTYgKmRzdCwgY29uc3Qg Q0hBUjE2ICpzcmMpOworZXh0ZXJuIENIQVIxNiogc3RwY3B5MTYoQ0hBUjE2ICpkc3QsIGNvbnN0 IENIQVIxNiAqc3JjKTsKK2V4dGVybiBDSEFSMTYqIHN0cmNweV90b18xNihDSEFSMTYgKmRzdCwg Y29uc3QgY2hhciAqc3JjKTsKK2V4dGVybiBjaGFyKiBzdHJjcHlfZnJvbV8xNihjaGFyICpkc3Qs IGNvbnN0IENIQVIxNiAqc3JjKTsKKworI2VuZGlmCmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL2xp YmVmaS9NYWtlZmlsZSBzeXMvYm9vdC9lZmkvbGliZWZpL01ha2VmaWxlCmluZGV4IGQ5NjE5YmVm ODlkLi44Njg0NDAzY2QxMSAxMDA2NDQKLS0tIHN5cy9ib290L2VmaS9saWJlZmkvTWFrZWZpbGUK KysrIHN5cy9ib290L2VmaS9saWJlZmkvTWFrZWZpbGUKQEAgLTEwLDggKzEwLDggQEAgTElCPQll ZmkKIElOVEVSTkFMTElCPQogV0FSTlM/PQkyCiAKLVNSQ1M9CWRlbGF5LmMgZGV2cGF0aC5jIGVm aV9jb25zb2xlLmMgZWZpbmV0LmMgZWZpcGFydC5jIGVycm5vLmMgXAotCWhhbmRsZXMuYyBsaWJl ZmkuYworU1JDUz0JZGVsYXkuYyBkZXZwYXRoLmMgZWZpX2NvbnNvbGUuYyBlZmlmcy5jIGVmaW5l dC5jIGVudi5jIGVycm5vLmMgXAorCWhhbmRsZXMuYyBsaWJlZmkuYyBzdHJpbmcxNi5jCiAKIC5p ZiAke01BQ0hJTkVfQ1BVQVJDSH0gPT0gImFtZDY0IiB8fCAke01BQ0hJTkVfQ1BVQVJDSH0gPT0g ImkzODYiCiBTUkNTKz0JdGltZS5jCmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZpL2xpYmVmaS9lZmlm cy5jIHN5cy9ib290L2VmaS9saWJlZmkvZWZpZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uZGQ5ZmIwZjBiNDEKLS0tIC9kZXYvbnVsbAorKysgc3lzL2Jvb3QvZWZp L2xpYmVmaS9lZmlmcy5jCkBAIC0wLDAgKzEsNDY0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykg MjAxNiBFcmljIE1jQ29ya2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0 aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVU T1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UK KyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05U UklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5D TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P RFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT SU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwg T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO WSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNE JAorICovCisKKyNpbmNsdWRlIDxlZmkuaD4KKyNpbmNsdWRlIDxlZmlsaWIuaD4KKyNpbmNsdWRl IDxlZmlwcm90Lmg+CisjaW5jbHVkZSA8c3RhbmQuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNp bmNsdWRlIDxib290c3RyYXAuaD4KKyNpbmNsdWRlIDxzdHJpbmcxNi5oPgorCitzdGF0aWMgRUZJ X0dVSUQgRmlsZUluZm9HVUlEID0gRUZJX0ZJTEVfSU5GT19JRDs7CitzdGF0aWMgRUZJX0dVSUQg U2ltcGxlRmlsZVN5c3RlbVByb3RvY29sR1VJRCA9IFNJTVBMRV9GSUxFX1NZU1RFTV9QUk9UT0NP TDsKK3N0YXRpYyBFRklfR1VJRCBCbG9ja0lvUHJvdG9jb2xHVUlEID0gQkxPQ0tfSU9fUFJPVE9D T0w7CitzdGF0aWMgRUZJX0dVSUQgRGV2aWNlUGF0aEdVSUQgPSBERVZJQ0VfUEFUSF9QUk9UT0NP TDsKKworc3RhdGljIGludCBlZmlmc19vcGVuKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBvcGVu X2ZpbGUgKmYpOworc3RhdGljIGludCBlZmlmc193cml0ZShzdHJ1Y3Qgb3Blbl9maWxlICpmLCB2 b2lkICpidWYsIHNpemVfdCBzaXplLCBzaXplX3QgKnJlc2lkKTsKK3N0YXRpYyBpbnQgZWZpZnNf Y2xvc2Uoc3RydWN0IG9wZW5fZmlsZSAqZik7CitzdGF0aWMgaW50IGVmaWZzX3JlYWQoc3RydWN0 IG9wZW5fZmlsZSAqZiwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgc2l6ZV90ICpyZXNpZCk7Citz dGF0aWMgb2ZmX3QgZWZpZnNfc2VlayhzdHJ1Y3Qgb3Blbl9maWxlICpmLCBvZmZfdCBvZmZzZXQs IGludCB3aGVyZSk7CitzdGF0aWMgaW50IGVmaWZzX3N0YXQoc3RydWN0IG9wZW5fZmlsZSAqZiwg c3RydWN0IHN0YXQgKnNiKTsKK3N0YXRpYyBpbnQgZWZpZnNfcmVhZGRpcihzdHJ1Y3Qgb3Blbl9m aWxlICpmLCBzdHJ1Y3QgZGlyZW50ICpkKTsKKworc3RhdGljIGludCBlZmlmc19kZXZfaW5pdCh2 b2lkKTsKK3N0YXRpYyBpbnQgZWZpZnNfZGV2X3N0cmF0ZWd5KHZvaWQgKiwgaW50LCBkYWRkcl90 LCBzaXplX3QsIHNpemVfdCwgY2hhciAqLCBzaXplX3QgKik7CitzdGF0aWMgaW50IGVmaWZzX2Rl dl9vcGVuKHN0cnVjdCBvcGVuX2ZpbGUgKiwgLi4uKTsKK3N0YXRpYyBpbnQgZWZpZnNfZGV2X2Ns b3NlKHN0cnVjdCBvcGVuX2ZpbGUgKik7CitzdGF0aWMgaW50IGVmaWZzX2Rldl9wcmludChpbnQp OworCitzdHJ1Y3QgZGV2c3cgZWZpZnNfZGV2ID0geworCS5kdl9uYW1lID0gIkVGSSIsCisJLmR2 X3R5cGUgPSBERVZUX0VGSSwKKwkuZHZfaW5pdCA9IGVmaWZzX2Rldl9pbml0LAorCS5kdl9zdHJh dGVneSA9IGVmaWZzX2Rldl9zdHJhdGVneSwKKwkuZHZfb3BlbiA9IGVmaWZzX2Rldl9vcGVuLAor CS5kdl9jbG9zZSA9IGVmaWZzX2Rldl9jbG9zZSwKKwkuZHZfaW9jdGwgPSBub2lvY3RsLAorCS5k dl9wcmludCA9IGVmaWZzX2Rldl9wcmludCwKKwkuZHZfY2xlYW51cCA9IE5VTEwKK307CisKK3N0 cnVjdCBmc19vcHMgZWZpZnNfZnNvcHMgPSB7CisJIkVGSSIsCisJZWZpZnNfb3BlbiwKKwllZmlm c19jbG9zZSwKKwllZmlmc19yZWFkLAorCWVmaWZzX3dyaXRlLAorCWVmaWZzX3NlZWssCisJZWZp ZnNfc3RhdCwKKwllZmlmc19yZWFkZGlyCit9OworCitzdGF0aWMgaW50CitlZmlmc19kZXZfaW5p dCh2b2lkKQoreworCUVGSV9IQU5ETEUgKmhpbjsKKwlFRklfU1RBVFVTIHN0YXR1czsKKwlVSU5U TiBzejsKKwl1X2ludCBuLCBuaW4sIHVuaXQ7CisJaW50IGVycjsKKworCXN6ID0gMDsKKwloaW4g PSBOVUxMOworCXN0YXR1cyA9IEJTLT5Mb2NhdGVIYW5kbGUoQnlQcm90b2NvbCwgJlNpbXBsZUZp bGVTeXN0ZW1Qcm90b2NvbEdVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg MCwgJnN6LCAwKTsKKwlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7CisJCWhp biA9IChFRklfSEFORExFICopbWFsbG9jKHN6KTsKKwkJc3RhdHVzID0gQlMtPkxvY2F0ZUhhbmRs ZShCeVByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAmU2ltcGxlRmlsZVN5c3RlbVByb3Rv Y29sR1VJRCwgMCwgJnN6LCBoaW4pOworCQlpZiAoRUZJX0VSUk9SKHN0YXR1cykpCisJCQlmcmVl KGhpbik7CisJfQorCWlmIChFRklfRVJST1Ioc3RhdHVzKSkKKwkJcmV0dXJuIChlZmlfc3RhdHVz X3RvX2Vycm5vKHN0YXR1cykpOworCisJLyogRmlsdGVyIGhhbmRsZXMgdG8gb25seSBpbmNsdWRl IEZyZWVCU0QgcGFydGl0aW9ucy4gKi8KKwluaW4gPSBzeiAvIHNpemVvZihFRklfSEFORExFKTsK Kwl1bml0ID0gMDsKKworCWZvciAobiA9IDA7IG4gPCBuaW47IG4rKykgeworCQlzdGF0dXMgPSBC Uy0+T3BlblByb3RvY29sKGhpbltuXSwgJlNpbXBsZUZpbGVTeXN0ZW1Qcm90b2NvbEdVSUQsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBJSCwgTlVMTCwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9PUEVOX1BST1RP Q09MX1RFU1RfUFJPVE9DT0wpOworCQlpZiAoRUZJX0VSUk9SKHN0YXR1cykpCisJCQljb250aW51 ZTsKKworICAgICAgICAgICAgICAgIGVmaV9oYW5kbGVfdXBkYXRlX2RldihoaW5bbl0sICZlZmlm c19kZXYsIHVuaXQrKywgMCk7CisJfQorCisJZnJlZShoaW4pOworCXJldHVybiAoZXJyKTsKK30K KworCitzdGF0aWMgaW50CitlZmlmc19kZXZfcHJpbnQoaW50IHZlcmJvc2UpCit7CisJY2hhciBs aW5lWzgwXTsKKyAgICAgICAgRUZJX0RFVklDRV9QQVRIICpkZXZwYXRoOworICAgICAgICBFRklf QkxPQ0tfSU8gKmJsa2lvOworCUVGSV9IQU5ETEUgaCwgKmhpbjsKKwlFRklfU1RBVFVTIHN0YXR1 czsKKwl1X2ludCB1bml0LCBuOworCisJZm9yICh1bml0ID0gMCwgaCA9IGVmaV9maW5kX2hhbmRs ZSgmZWZpZnNfZGV2LCAwKTsKKwkgICAgaCAhPSBOVUxMOyBoID0gZWZpX2ZpbmRfaGFuZGxlKCZl Zmlmc19kZXYsICsrdW5pdCkpIHsKKwkJc3ByaW50ZihsaW5lLCAiICAgICVzJWQ6IiwgZWZpZnNf ZGV2LmR2X25hbWUsIHVuaXQpOworCQlwYWdlcl9vdXRwdXQobGluZSk7CisgICAgICAgICAgICAg ICAgcGFnZXJfb3V0cHV0KCIgICAgRUZJKFNJTVBMRV9GSUxFX1NZU1RFTSIpOworCisJCXN0YXR1 cyA9IEJTLT5IYW5kbGVQcm90b2NvbChoaW5bbl0sICZEZXZpY2VQYXRoR1VJRCwKKwkJICAgICh2 b2lkICoqKSZkZXZwYXRoKTsKKwkJaWYgKCFFRklfRVJST1Ioc3RhdHVzKSkgeworICAgICAgICAg ICAgICAgICAgICAgICAgcGFnZXJfb3V0cHV0KCIsIERFVklDRV9QQVRIIik7CisJCX0KKworCQlz dGF0dXMgPSBCUy0+SGFuZGxlUHJvdG9jb2woaGluW25dLCAmQmxvY2tJb1Byb3RvY29sR1VJRCwK KwkJICAgICh2b2lkICoqKSZibGtpbyk7CisJCWlmICghRUZJX0VSUk9SKHN0YXR1cykpIHsKKyAg ICAgICAgICAgICAgICAgICAgICAgIHBhZ2VyX291dHB1dCgiLCBCTE9DS19JTyIpOworCQl9CisJ CXBhZ2VyX291dHB1dCgiKVxuIik7CisJfQorICAgICAgICByZXR1cm4gKDApOworfQorCitzdGF0 aWMgaW50CitlZmlmc19kZXZfb3BlbihzdHJ1Y3Qgb3Blbl9maWxlICpmLCAuLi4pCit7CisJdmFf bGlzdCBhcmdzOworCXN0cnVjdCBkZXZkZXNjICpkZXY7CisJRUZJX0ZJTEVfSU9fSU5URVJGQUNF ICpmc2lmYWNlOworCUVGSV9IQU5ETEUgaDsKKwlFRklfU1RBVFVTIHN0YXR1czsKKworCXZhX3N0 YXJ0KGFyZ3MsIGYpOworCWRldiA9IHZhX2FyZyhhcmdzLCBzdHJ1Y3QgZGV2ZGVzYyopOworCXZh X2VuZChhcmdzKTsKKworCWggPSBlZmlfZmluZF9oYW5kbGUoJmVmaWZzX2RldiwgZGV2LT5kX3Vu aXQpOworCisJaWYgKGggPT0gTlVMTCkKKwkJcmV0dXJuIChFSU5WQUwpOworCisgICAgICAgIHN0 YXR1cyA9IEJTLT5PcGVuUHJvdG9jb2woaCwgJlNpbXBsZUZpbGVTeXN0ZW1Qcm90b2NvbEdVSUQs CisgICAgICAgICAgICAodm9pZCoqKSZmc2lmYWNlLCBJSCwgTlVMTCwgRUZJX09QRU5fUFJPVE9D T0xfR0VUX1BST1RPQ09MKTsKKworICAgICAgICBpZiAoRUZJX0VSUk9SKHN0YXR1cykpIHsKKwkJ cmV0dXJuIChlZmlfc3RhdHVzX3RvX2Vycm5vKHN0YXR1cykpOworICAgICAgICB9CisKKyAgICAg ICAgZGV2LT5kX29wZW5kYXRhID0gZnNpZmFjZTsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMg aW50CitlZmlmc19kZXZfY2xvc2Uoc3RydWN0IG9wZW5fZmlsZSAqZikKK3sKKwlzdHJ1Y3QgZGV2 ZGVzYyAqZGV2OworCUVGSV9IQU5ETEUgaDsKKyAgICAgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisK KwlkZXYgPSAoc3RydWN0IGRldmRlc2MgKikoZi0+Zl9kZXZkYXRhKTsKKwloID0gZWZpX2ZpbmRf aGFuZGxlKCZlZmlmc19kZXYsIGRldi0+ZF91bml0KTsKKworCWlmIChoID09IE5VTEwpCisJCXJl dHVybiAoRUlOVkFMKTsKKworCWlmIChkZXYtPmRfb3BlbmRhdGEgPT0gTlVMTCkKKwkJcmV0dXJu IChFSU5WQUwpOworCisgICAgICAgIHN0YXR1cyA9IEJTLT5DbG9zZVByb3RvY29sKGgsICZTaW1w bGVGaWxlU3lzdGVtUHJvdG9jb2xHVUlELCBJSCwgTlVMTCk7CisKKyAgICAgICAgaWYgKEVGSV9F UlJPUihzdGF0dXMpKQorCQlyZXR1cm4gKGVmaV9zdGF0dXNfdG9fZXJybm8oc3RhdHVzKSk7CisK KwlkZXYtPmRfb3BlbmRhdGEgPSBOVUxMOworCXJldHVybiAoMCk7Cit9CisKKworLyogUmF3IEkv TyBpc24ndCBzdXBwb3J0ZWQgb24gRUZJIEZTIGRldmljZXMsIGFzIHRoZXkgdGFsayB0aHJvdWdo CisgKiBTSU1QTEVfRklMRV9TWVNURU1fSU5URVJGQUNFLgorICovCitzdGF0aWMgaW50CitlZmlm c19kZXZfc3RyYXRlZ3kodm9pZCAqZGV2ZGF0YSBfX3VudXNlZCwgaW50IHJ3IF9fdW51c2VkLCBk YWRkcl90IGJsayBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBz aXplX3Qgc2l6ZSBfX3VudXNlZCwgY2hhciAqYnVmIF9fdW51c2VkLAorICAgICAgICAgICAgICAg ICAgIHNpemVfdCAqcnNpemUgX191bnVzZWQpCit7CisgICAgICAgIHByaW50ZigiUmF3IEkvTyBu b3Qgc3VwcG9ydGVkIG9uIEVGSSBGUyBpbnRlcmZhY2VcbiIpOworCXJldHVybiBFTk9UU1VQOwor fQorCisvKgorICogT3BlbiBhIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQKK2VmaWZzX29wZW4oY29u c3QgY2hhciAqdXBhdGgsIHN0cnVjdCBvcGVuX2ZpbGUgKmYpCit7CisJc3RydWN0IGRldmRlc2Mg KmRldjsKKwlFRklfRklMRV9JT19JTlRFUkZBQ0UgKmZzaWZhY2U7CisJRUZJX0ZJTEVfSEFORExF IHJvb3Q7CisgICAgICAgIEVGSV9TVEFUVVMgc3RhdHVzOworICAgICAgICBDSEFSMTYgcGF0aFtz dHJsZW4odXBhdGgpICsgMV07CisKKwlkZXYgPSAoc3RydWN0IGRldmRlc2MgKikoZi0+Zl9kZXZk YXRhKTsKKyAgICAgICAgZnNpZmFjZSA9IGRldi0+ZF9vcGVuZGF0YTsKKworICAgICAgICBpZiAo IXN0cmNtcCh1cGF0aCwgIiIpIHx8ICFzdHJjbXAodXBhdGgsICIvIikpIHsKKyAgICAgICAgICAg ICAgICByZXR1cm4gKGZzaWZhY2UtPk9wZW5Wb2x1bWUoZnNpZmFjZSwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVGSV9GSUxFX0hBTkRMRSopJihmLT5mX2Zz ZGF0YSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmc2lm YWNlLT5PcGVuVm9sdW1lKGZzaWZhY2UsICZyb290KTsKKworICAgICAgICAgICAgICAgIGlmIChF RklfRVJST1Ioc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlZmlf c3RhdHVzX3RvX2Vycm5vKHN0YXR1cykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg ICAgICAgIHN0cmNweV90b18xNihwYXRoLCB1cGF0aCk7CisgICAgICAgICAgICAgICAgc3RhdHVz ID0gcm9vdC0+T3Blbihyb290LCAoRUZJX0ZJTEVfSEFORExFKikmKGYtPmZfZnNkYXRhKSwgcGF0 aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9GSUxFX01PREVfUkVB RCwgMCk7CisKKyAgICAgICAgICAgICAgICByb290LT5DbG9zZShyb290KTsKKworICAgICAgICAg ICAgICAgIGlmIChFRklfRVJST1Ioc3RhdHVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAg cmV0dXJuIChlZmlfc3RhdHVzX3RvX2Vycm5vKHN0YXR1cykpOworICAgICAgICAgICAgICAgIH0K KworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQK K2VmaWZzX2Nsb3NlKHN0cnVjdCBvcGVuX2ZpbGUgKmYpCit7CisgICAgICAgIEVGSV9GSUxFX0hB TkRMRSBmaWxlID0gKEVGSV9GSUxFX0hBTkRMRSlmLT5mX2ZzZGF0YTsKKyAgICAgICAgRUZJX1NU QVRVUyBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gZmlsZS0+Q2xvc2UoZmlsZSk7CisKKyAg ICAgICAgaWYgKEVGSV9FUlJPUihzdGF0dXMpKQorCQlyZXR1cm4gKGVmaV9zdGF0dXNfdG9fZXJy bm8oc3RhdHVzKSk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorZWZp ZnNfcmVhZChzdHJ1Y3Qgb3Blbl9maWxlICpmLCB2b2lkICpzdGFydCwgc2l6ZV90IHNpemUsIHNp emVfdCAqcmVzaWQgLyogb3V0ICovKQoreworICAgICAgICBFRklfRklMRV9IQU5ETEUgZmlsZSA9 IChFRklfRklMRV9IQU5ETEUpZi0+Zl9mc2RhdGE7CisgICAgICAgIFVJTlROIHJlYWRzaXplID0g c2l6ZTsKKyAgICAgICAgRUZJX1NUQVRVUyBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gZmls ZS0+UmVhZChmaWxlLCAmcmVhZHNpemUsIHN0YXJ0KTsKKworICAgICAgICBpZiAoRUZJX0VSUk9S KHN0YXR1cykpCisJCXJldHVybiAoZWZpX3N0YXR1c190b19lcnJubyhzdGF0dXMpKTsKKworCWlm IChyZXNpZCkKKwkJKnJlc2lkID0gc2l6ZSAtIHJlYWRzaXplOworCisJcmV0dXJuICgwKTsKK30K Kworc3RhdGljIGludAorZWZpZnNfd3JpdGUoc3RydWN0IG9wZW5fZmlsZSAqZiwgdm9pZCAqc3Rh cnQsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgc2l6ZV90ICpyZXNpZCAvKiBvdXQgKi8pCit7 CisgICAgICAgIEVGSV9GSUxFX0hBTkRMRSBmaWxlID0gKEVGSV9GSUxFX0hBTkRMRSlmLT5mX2Zz ZGF0YTsKKyAgICAgICAgVUlOVE4gd3JpdGVzaXplID0gc2l6ZTsKKyAgICAgICAgRUZJX1NUQVRV UyBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gZmlsZS0+V3JpdGUoZmlsZSwgJndyaXRlc2l6 ZSwgc3RhcnQpOworCisgICAgICAgIGlmIChFRklfRVJST1Ioc3RhdHVzKSkKKwkJcmV0dXJuIChl Zmlfc3RhdHVzX3RvX2Vycm5vKHN0YXR1cykpOworCisJaWYgKHJlc2lkKQorCQkqcmVzaWQgPSBz aXplIC0gd3JpdGVzaXplOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIG9mZl90CitlZmlm c19zZWVrKHN0cnVjdCBvcGVuX2ZpbGUgKmYsIG9mZl90IG9mZnNldCwgaW50IHdoZXJlKQorewor ICAgICAgICBFRklfRklMRV9IQU5ETEUgZmlsZSA9IChFRklfRklMRV9IQU5ETEUpZi0+Zl9mc2Rh dGE7CisgICAgICAgIFVJTlQ2NCBwb3M7CisgICAgICAgIEVGSV9TVEFUVVMgc3RhdHVzOworCisJ c3dpdGNoICh3aGVyZSkgeworCWNhc2UgU0VFS19TRVQ6CisgICAgICAgICAgICAgICAgc3RhdHVz ID0gZmlsZS0+U2V0UG9zaXRpb24oZmlsZSwgb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGlm IChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm5v ID0gKGVmaV9zdGF0dXNfdG9fZXJybm8oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgICAgICAg ICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisJCWJyZWFrOworCWNhc2UgU0VFS19D VVI6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmlsZS0+R2V0UG9zaXRpb24oZmlsZSwgJnBv cyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisgICAg ICAgICAgICAgICAgICAgICAgICBlcnJubyA9IChlZmlfc3RhdHVzX3RvX2Vycm5vKHN0YXR1cykp OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0K KworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGZpbGUtPlNldFBvc2l0aW9uKGZpbGUsIHBvcyAr IG9mZnNldCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7 CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IChlZmlfc3RhdHVzX3RvX2Vycm5vKHN0 YXR1cykpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAg ICAgIH0KKworCQlicmVhazsKKwljYXNlIFNFRUtfRU5EOgorICAgICAgICAgICAgICAgIHN0YXR1 cyA9IGZpbGUtPlNldFBvc2l0aW9uKGZpbGUsIDB4ZmZmZmZmZmZmZmZmZmZmZik7CisKKyAgICAg ICAgICAgICAgICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAg ICAgICAgICBlcnJubyA9IChlZmlfc3RhdHVzX3RvX2Vycm5vKHN0YXR1cykpOworICAgICAgICAg ICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKwlkZWZhdWx0Ogor CQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuICgtMSk7CisJfQorCisgICAgICAgIHN0YXR1cyA9 IGZpbGUtPkdldFBvc2l0aW9uKGZpbGUsICZwb3MpOworCisgICAgICAgIGlmIChzdGF0dXMgIT0g RUZJX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IChlZmlfc3RhdHVzX3RvX2Vy cm5vKHN0YXR1cykpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisJ cmV0dXJuIChwb3MpOworfQorCisvKiBTSU1QTEVfRklMRV9TWVNURU1fUFJPVE9DT0wgaXMgZ2Vh cmVkIHRvd2FyZHMgRkFULCBzbyB3ZSBjYW4ndAorICogcmVwcm9kdWNlIHN0YXQgd2l0aCBhYnNv bHV0ZSBmaWRlbGl0eS4KKyAqLworc3RhdGljIGludAorZWZpZnNfc3RhdChzdHJ1Y3Qgb3Blbl9m aWxlICpmLCBzdHJ1Y3Qgc3RhdCAqc2IpCit7CisgICAgICAgIEVGSV9GSUxFX0hBTkRMRSBmaWxl OworICAgICAgICBVSU5UTiBzaXplID0gMDsKKyAgICAgICAgRUZJX0ZJTEVfSU5GTyAqZmluZm87 OworICAgICAgICBFRklfU1RBVFVTIHN0YXR1czsKKworICAgICAgICBmaWxlID0gKEVGSV9GSUxF X0hBTkRMRSlmLT5mX2ZzZGF0YTsKKyAgICAgICAgc3RhdHVzID0gZmlsZS0+R2V0SW5mbyhmaWxl LCAmRmlsZUluZm9HVUlELCAmc2l6ZSwgTlVMTCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBF RklfQlVGRkVSX1RPT19TTUFMTCkgeworICAgICAgICAgICAgICAgIGVycm5vID0gKGVmaV9zdGF0 dXNfdG9fZXJybm8oc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAg ICB9CisKKyAgICAgICAgZmluZm8gPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgIHN0YXR1cyA9IGZp bGUtPkdldEluZm8oZmlsZSwgJkZpbGVJbmZvR1VJRCwgJnNpemUsIGZpbmZvKTsKKworICAgICAg ICBpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSAo ZWZpX3N0YXR1c190b19lcnJubyhzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7 CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBjYW4ndCBwcm9wZXJseSBmaWxsIHRoZXNlIGlu Li4uICovCisgICAgICAgIHNiLT5zdF9pbm8gPSAwOworICAgICAgICBzYi0+c3RfbmxpbmsgPSAw OworICAgICAgICBzYi0+c3RfdWlkID0gMDsKKyAgICAgICAgc2ItPnN0X2dpZCA9IDA7CisgICAg ICAgIHNiLT5zdF9ibGtzaXplID0gNTEyOworICAgICAgICAvKiBCdWlsZCB0aGUgbW9kZSBmaWVs ZCAqLworICAgICAgICBpZiAoZmluZm8tPkF0dHJpYnV0ZSAmIEVGSV9GSUxFX0RJUkVDVE9SWSkg eworICAgICAgICAgICAgICAgIHNiLT5zdF9tb2RlID0gU19JRkRJUjsKKyAgICAgICAgfSBlbHNl IHsKKyAgICAgICAgICAgICAgICBzYi0+c3RfbW9kZSA9IFNfSUZSRUc7CisgICAgICAgIH0KKwor ICAgICAgICBpZiAoZmluZm8tPkF0dHJpYnV0ZSAmIEVGSV9GSUxFX01PREVfUkVBRCkgeworICAg ICAgICAgIHNiLT5zdF9tb2RlID0gU19JUlVTUiB8IFNfSVhVU1IgfCBTX0lSR1JQIHwKKyAgICAg ICAgICAgIFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USDsKKyAgICAgICAgfQorCisgICAgICAg IGlmIChmaW5mby0+QXR0cmlidXRlICYgRUZJX0ZJTEVfTU9ERV9SRUFEKSB7CisgICAgICAgICAg c2ItPnN0X21vZGUgPSBTX0lXVVNSIHwgU19JV0dSUCB8IFNfSVdPVEg7CisgICAgICAgIH0KKyAg ICAgICAgLyogVGhpcyBtYXkgb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQsIGRlcGVuZGluZyBvbiB0 aGUgRlMgZHJpdmVyICovCisgICAgICAgIHNiLT5zdF9ibG9ja3MgPSBmaW5mby0+UGh5c2ljYWxT aXplIC8gNTEyOworICAgICAgICAvKiBUaGVzZSBmaWVsZHMgd2UgY2FuIGdldCByaWdodCAqLwor ICAgICAgICBzYi0+c3Rfc2l6ZSA9IGZpbmZvLT5GaWxlU2l6ZTsKKyAgICAgICAgc2ItPnN0X2F0 aW1lID0gZnJvbV9lZmlfdGltZSgmKGZpbmZvLT5MYXN0QWNjZXNzVGltZSkpOworICAgICAgICBz Yi0+c3RfbXRpbWUgPSBmcm9tX2VmaV90aW1lKCYoZmluZm8tPk1vZGlmaWNhdGlvblRpbWUpKTsK KyAgICAgICAgc2ItPnN0X2N0aW1lID0gZnJvbV9lZmlfdGltZSgmKGZpbmZvLT5DcmVhdGVUaW1l KSk7CisKKyAgICAgICAgZnJlZShmaW5mbyk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KKwor c3RhdGljIGludAorZWZpZnNfcmVhZGRpcihzdHJ1Y3Qgb3Blbl9maWxlICpmLCBzdHJ1Y3QgZGly ZW50ICpkKQoreworICAgICAgICBFRklfRklMRV9IQU5ETEUgZmlsZTsKKyAgICAgICAgVUlOVE4g c2l6ZSA9IDA7CisgICAgICAgIEVGSV9GSUxFX0lORk8gKmZpbmZvOzsKKyAgICAgICAgRUZJX1NU QVRVUyBzdGF0dXM7CisKKyAgICAgICAgZmlsZSA9IChFRklfRklMRV9IQU5ETEUpZi0+Zl9mc2Rh dGE7CisgICAgICAgIHN0YXR1cyA9IGZpbGUtPlJlYWQoZmlsZSwgJnNpemUsIE5VTEwpOworCisg ICAgICAgIGlmIChzdGF0dXMgIT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKyAgICAgICAgICAg ICAgICBlcnJubyA9IChlZmlfc3RhdHVzX3RvX2Vycm5vKHN0YXR1cykpOworICAgICAgICAgICAg ICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplID09IDApIHsKKyAg ICAgICAgICAgICAgICByZXR1cm4gKEVOT0VOVCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5m byA9IG1hbGxvYyhzaXplKTsKKyAgICAgICAgc3RhdHVzID0gZmlsZS0+UmVhZChmaWxlLCAmc2l6 ZSwgZmluZm8pOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKyAgICAg ICAgICAgICAgICBlcnJubyA9IChlZmlfc3RhdHVzX3RvX2Vycm5vKHN0YXR1cykpOworICAgICAg ICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmNweV9mcm9tXzE2 KGQtPmRfbmFtZSwgZmluZm8tPkZpbGVOYW1lKTsKKyAgICAgICAgZC0+ZF9uYW1sZW4gPSBzdHJs ZW4oZC0+ZF9uYW1lKTsKKyAgICAgICAgZC0+ZF9yZWNsZW4gPSBzaXplb2Yoc3RydWN0IGRpcmVu dCk7CisgICAgICAgIC8qIFdlIGNhbid0IGZhaXRoZnVsbHkgcmVwcm9kdWNlIHRoaXMgZHVlIHRv IHRoZSBsaW1pdGF0aW9ucworICAgICAgICAgKiBvZiB0aGUgU0lNUExFX0ZJTEVfU1lTVEVNIGlu dGVyZmFjZSAqLworICAgICAgICBkLT5kX2ZpbGVubyA9IDA7CisKKyAgICAgICAgZnJlZShmaW5m byk7CisKKyAgICAgICAgcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBzeXMvYm9vdC9lZmkvbGli ZWZpL2Vycm5vLmMgc3lzL2Jvb3QvZWZpL2xpYmVmaS9lcnJuby5jCmluZGV4IGZhYzkwM2ZhZjI3 Li4wZjM1NGMzZjNjOCAxMDA2NDQKLS0tIHN5cy9ib290L2VmaS9saWJlZmkvZXJybm8uYworKysg c3lzL2Jvb3QvZWZpL2xpYmVmaS9lcnJuby5jCkBAIC0zMCw2ICszMCw2OSBAQCBfX0ZCU0RJRCgi JEZyZWVCU0QkIik7CiAjaW5jbHVkZSA8ZWZpLmg+CiAjaW5jbHVkZSA8ZWZpbGliLmg+CiAKK0VG SV9TVEFUVVMKK2Vycm5vX3RvX2VmaV9zdGF0dXMoaW50IGVycm5vKQoreworICAgICAgICBFRklf U1RBVFVTIHN0YXR1czsKKworICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgIGNhc2Ug RVBFUk06CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRUZJX0FDQ0VTU19ERU5JRUQ7CisgICAg ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFT1ZFUkZMT1c6CisgICAgICAgICAg ICAgICAgc3RhdHVzID0gRUZJX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgICAgICAgYnJl YWs7CisKKyAgICAgICAgY2FzZSBFSU86CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRUZJX0RF VklDRV9FUlJPUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVJTlZB TDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFRklfSU5WQUxJRF9QQVJBTUVURVI7CisgICAg ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFU1RBTEU6CisgICAgICAgICAgICAg ICAgc3RhdHVzID0gRUZJX01FRElBX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisK KyAgICAgICAgY2FzZSBFTlhJTzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFRklfTk9fTUVE SUE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFTk9FTlQ6CisgICAg ICAgICAgICAgICAgc3RhdHVzID0gRUZJX05PVF9GT1VORDsKKyAgICAgICAgICAgICAgICBicmVh azsKKworICAgICAgICBjYXNlIEVOT01FTToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFRklf T1VUX09GX1JFU09VUkNFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNl IEVOT1RTVVA6CisgICAgICAgIGNhc2UgRU5PREVWOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9 IEVGSV9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNl IEVOT1NQQzoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFRklfVk9MVU1FX0ZVTEw7CisgICAg ICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFQUNDRVM6CisgICAgICAgICAgICAg ICAgc3RhdHVzID0gRUZJX1dSSVRFX1BST1RFQ1RFRDsKKyAgICAgICAgICAgICAgICBicmVhazsK KworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRUZJX1NVQ0NFU1M7 CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg ICAgICBzdGF0dXMgPSBFRklfREVWSUNFX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChzdGF0dXMpOworfQorCiBpbnQKIGVmaV9zdGF0 dXNfdG9fZXJybm8oRUZJX1NUQVRVUyBzdGF0dXMpCiB7CmRpZmYgLS1naXQgc3lzL2Jvb3QvZWZp L2xpYmVmaS9oYW5kbGVzLmMgc3lzL2Jvb3QvZWZpL2xpYmVmaS9oYW5kbGVzLmMKaW5kZXggMWU0 ZWY2ZmZiZDUuLmMxMTgwODVjMWM5IDEwMDY0NAotLS0gc3lzL2Jvb3QvZWZpL2xpYmVmaS9oYW5k bGVzLmMKKysrIHN5cy9ib290L2VmaS9saWJlZmkvaGFuZGxlcy5jCkBAIC00MSwyMSArNDEsMzYg QEAgc3RydWN0IGVudHJ5IHsKIHN0cnVjdCBlbnRyeSAqZW50cnk7CiBpbnQgbmVudHJpZXM7CiAK K3N0YXRpYyBpbnQKK2dldF9uZXh0X3VuaXQoc3RydWN0IGRldnN3ICpzdykKK3sKKyAgICAgICAg aW50IGksIGlkeDsKKworICAgICAgICBmb3IgKGkgPSAwLCBpZHggPSAwOyBpIDwgbmVudHJpZXM7 IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeVtpXS5kZXYgPT0gc3cpIHsKKyAgICAg ICAgICAgICAgICAgICAgICAgIGlkeCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQor CisgICAgICAgIHJldHVybiAoaWR4KTsKK30KKwogaW50CiBlZmlfcmVnaXN0ZXJfaGFuZGxlcyhz dHJ1Y3QgZGV2c3cgKnN3LCBFRklfSEFORExFICpoYW5kbGVzLAogICAgIEVGSV9IQU5ETEUgKmFs aWFzZXMsIGludCBjb3VudCkKIHsKIAlzaXplX3Qgc3o7Ci0JaW50IGlkeCwgdW5pdDsKKwlpbnQg aWR4LCB1bml0LCBpOwogCiAJaWR4ID0gbmVudHJpZXM7CiAJbmVudHJpZXMgKz0gY291bnQ7CiAJ c3ogPSBuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZW50cnkpOworICAgICAgICB1bml0ID0gZ2V0 X25leHRfdW5pdChzdyk7CiAJZW50cnkgPSAoZW50cnkgPT0gTlVMTCkgPyBtYWxsb2Moc3opIDog cmVhbGxvYyhlbnRyeSwgc3opOwotCWZvciAodW5pdCA9IDA7IGlkeCA8IG5lbnRyaWVzOyBpZHgr KywgdW5pdCsrKSB7Ci0JCWVudHJ5W2lkeF0uaGFuZGxlID0gaGFuZGxlc1t1bml0XTsKKwlmb3Ig KGkgPSAwOyBpZHggPCBuZW50cmllczsgaWR4KyssIHVuaXQrKywgaSsrKSB7CisJCWVudHJ5W2lk eF0uaGFuZGxlID0gaGFuZGxlc1tpXTsKIAkJaWYgKGFsaWFzZXMgIT0gTlVMTCkKLQkJCWVudHJ5 W2lkeF0uYWxpYXMgPSBhbGlhc2VzW3VuaXRdOworCQkJZW50cnlbaWR4XS5hbGlhcyA9IGFsaWFz ZXNbaV07CiAJCWVsc2UKIAkJCWVudHJ5W2lkeF0uYWxpYXMgPSBOVUxMOwogCQllbnRyeVtpZHhd LmRldiA9IHN3OwpAQCAtNjQsNiArNzksMTYgQEAgZWZpX3JlZ2lzdGVyX2hhbmRsZXMoc3RydWN0 IGRldnN3ICpzdywgRUZJX0hBTkRMRSAqaGFuZGxlcywKIAlyZXR1cm4gKDApOwogfQogCitpbnQK K2VmaV9yZWdpc3Rlcl9oYW5kbGUoc3RydWN0IGRldnN3ICpzdywgRUZJX0hBTkRMRSBoYW5kbGUs IEVGSV9IQU5ETEUgYWxpYXMpCit7CisgICAgICAgIGlmIChhbGlhcyA9PSBOVUxMKSB7CisgICAg ICAgICAgICAgICAgcmV0dXJuIGVmaV9yZWdpc3Rlcl9oYW5kbGVzKHN3LCAmaGFuZGxlLCBOVUxM LCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWZpX3JlZ2lz dGVyX2hhbmRsZXMoc3csICZoYW5kbGUsICZhbGlhcywgMSk7CisgICAgICAgIH0KK30KKwogRUZJ X0hBTkRMRQogZWZpX2ZpbmRfaGFuZGxlKHN0cnVjdCBkZXZzdyAqZGV2LCBpbnQgdW5pdCkKIHsK QEAgLTExNiwzICsxNDEsMjkgQEAgZWZpX2hhbmRsZV91cGRhdGVfZGV2KEVGSV9IQU5ETEUgaCwg c3RydWN0IGRldnN3ICpkZXYsIGludCB1bml0LAogCiAJcmV0dXJuIChFTk9FTlQpOwogfQorCitp bnQKK2VmaV9oYW5kbGVfcmVtb3ZlX2RldihFRklfSEFORExFIGgpCit7CisJaW50IGlkeDsKKwor ICAgICAgICAvKiBGaW5kIHRoZSBlbnRyeSAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgbmVudHJp ZXM7IGlkeCsrKSB7CisJCWlmIChlbnRyeVtpZHhdLmhhbmRsZSAhPSBoKQorCQkJY29udGludWU7 CisJfQorCisgICAgICAgIGlmIChpZHggPj0gbmVudHJpZXMpCisgICAgICAgICAgICAgICAgcmV0 dXJuIChFTk9FTlQpOworICAgICAgICBlbHNlIGlmIChpZHggPT0gbmVudHJpZXMgLSAxKSB7Cisg ICAgICAgICAgICAgICAgbmVudHJpZXMtLTsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IHJlYWxs b2MoZW50cnksIG5lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBlbnRyeSkpOworICAgICAgICB9IGVs c2UgeworICAgICAgICAgICAgICAgIG1lbWNweShlbnRyeSArIGlkeCwgZW50cnkgKyBpZHggKyAx LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGVudHJ5KSAqIChuZW50cmll cyAtIChpZHggKyAxKSkpOworICAgICAgICAgICAgICAgIG5lbnRyaWVzLS07CisgICAgICAgICAg ICAgICAgZW50cnkgPSByZWFsbG9jKGVudHJ5LCBuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZW50 cnkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgc3lz L2Jvb3QvZWZpL2xpYmVmaS9zdHJpbmcxNi5jIHN5cy9ib290L2VmaS9saWJlZmkvc3RyaW5nMTYu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMjk5ZDcyZGQwZjAKLS0t IC9kZXYvbnVsbAorKysgc3lzL2Jvb3QvZWZpL2xpYmVmaS9zdHJpbmcxNi5jCkBAIC0wLDAgKzEs ODggQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE2IEVyaWMgTWNDb3JrbGUKKyAqIEFsbCBy aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF RCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVY UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF VkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBB TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD T05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0Yg VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dF VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O VFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0Yg VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICog U1VDSCBEQU1BR0UuCisgKgorICogJEZyZWVCU0QkCisgKi8KKworI2luY2x1ZGUgInN0cmluZzE2 LmgiCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK3NpemVfdAorc3RybGVuMTYoY29uc3QgQ0hBUjE2 ICpzdHIpCit7CisgICAgICAgIHNpemVfdCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IHN0cltp XSAhPSAwOyBpKyspOworCisgICAgICAgIHJldHVybiBpOworfQorCitDSEFSMTYgKgorc3RyY3B5 MTYoQ0hBUjE2ICpkc3QsIGNvbnN0IENIQVIxNiAqc3JjKQoreworICAgICAgICBzdHBjcHkxNihk c3QsIHNyYyk7CisKKyAgICAgICAgcmV0dXJuIChkc3QpOworfQorCitDSEFSMTYgKgorc3RwY3B5 MTYoQ0hBUjE2ICpkc3QsIGNvbnN0IENIQVIxNiAqc3JjKQoreworICAgICAgICBmb3IgKDsgKnNy YyAhPSAwOyBzcmMrKywgZHN0KyspIHsKKyAgICAgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAg ICAgICAgfQorCisgICAgICAgICpkc3QgPSAqc3JjOworCisgICAgICAgIHJldHVybiBkc3Q7Cit9 CisKK2NoYXIgKgorc3RyY3B5X2Zyb21fMTYoY2hhciAqZHN0LCBjb25zdCBDSEFSMTYgKnNyYykK K3sKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgc3JjW2ldICE9IDA7IGkr KykgeworICAgICAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgICAgICAgfQorCisgICAg ICAgIGRzdFtpXSA9IDA7CisKKyAgICAgICAgcmV0dXJuIChkc3QpOworfQorCitDSEFSMTYgKgor c3RyY3B5X3RvXzE2KENIQVIxNiAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisgICAgICAgIGlu dCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IHNyY1tpXSAhPSAwOyBpKyspIHsKKyAgICAgICAg ICAgICAgICBkc3RbaV0gPSBzcmNbaV07CisgICAgICAgIH0KKworICAgICAgICBkc3RbaV0gPSAw OworCisgICAgICAgIHJldHVybiAoZHN0KTsKK30KZGlmZiAtLWdpdCBzeXMvYm9vdC9lZmkvbGli ZWZpL3RpbWUuYyBzeXMvYm9vdC9lZmkvbGliZWZpL3RpbWUuYwppbmRleCA5OTgzMWUxY2YxYS4u MmRmNDY2ZTU3YjcgMTAwNjQ0Ci0tLSBzeXMvYm9vdC9lZmkvbGliZWZpL3RpbWUuYworKysgc3lz L2Jvb3QvZWZpL2xpYmVmaS90aW1lLmMKQEAgLTIsMjggKzIsMjggQEAKICAqIENvcHlyaWdodCAo YykgMTk5OSwgMjAwMAogICogSW50ZWwgQ29ycG9yYXRpb24uCiAgKiBBbGwgcmlnaHRzIHJlc2Vy dmVkLgotICogCisgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0 ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICAqIGFyZSBtZXQ6Ci0g KiAKKyAqCiAgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g dGhlIGFib3ZlIGNvcHlyaWdodAogICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogCisgKgogICogMi4gUmVkaXN0cmli dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK ICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg ZGlzY2xhaW1lciBpbiB0aGUKICAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAKKyAqCiAgKiAzLiBBbGwg YWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMg c29mdHdhcmUKICAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVu dDoKLSAqIAorICoKICAqICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9w ZWQgYnkgSW50ZWwgQ29ycG9yYXRpb24gYW5kCiAgKiAgICBpdHMgY29udHJpYnV0b3JzLgotICog CisgKgogICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBvciBpdHMg Y29udHJpYnV0b3JzIG1heSBiZQogICogICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv ZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICAqICAgIHdpdGhvdXQgc3BlY2lmaWMg cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCisgKgogICogVEhJUyBTT0ZUV0FSRSBJUyBQ Uk9WSURFRCBCWSBJTlRFTCBDT1JQT1JBVElPTiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwog ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg Tk9UIExJTUlURUQgVE8sIFRIRQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKQEAgLTM1LDcgKzM1LDcg QEAKICAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH TElHRU5DRSBPUiBPVEhFUldJU0UpCiAgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCiAgKiBUSEUgUE9TU0lCSUxJ VFkgT0YgU1VDSCBEQU1BR0UuCi0gKiAKKyAqCiAgKi8KIAogI2luY2x1ZGUgPHN5cy9jZGVmcy5o PgpAQCAtNTgsNiArNTgsNDEgQEAgX19GQlNESUQoIiRGcmVlQlNEJCIpOwogI2RlZmluZSBTRUNT UEVSSE9VUiAoIDYwKjYwICkKICNkZWZpbmUgU0VDU1BFUkRBWQkoMjQgKiBTRUNTUEVSSE9VUikK IAorLyoKKy8vICBUaGVzZSBhcnJheXMgZ2l2ZSB0aGUgY3VtdWxhdGl2ZSBudW1iZXIgb2YgZGF5 cyB1cCB0byB0aGUgZmlyc3Qgb2YgdGhlCisvLyAgbW9udGggbnVtYmVyIHVzZWQgYXMgdGhlIGlu ZGV4ICgxIC0+IDEyKSBmb3IgcmVndWxhciBhbmQgbGVhcCB5ZWFycy4KKy8vICBUaGUgdmFsdWUg YXQgaW5kZXggMTMgaXMgZm9yIHRoZSB3aG9sZSB5ZWFyLgorKi8KK3N0YXRpYyBjb25zdCB0aW1l X3QgQ3VtdWxhdGl2ZURheXNbMl1bMTRdID0geworICB7MCwKKyAgIDAsCisgICAzMSwKKyAgIDMx ICsgMjgsCisgICAzMSArIDI4ICsgMzEsCisgICAzMSArIDI4ICsgMzEgKyAzMCwKKyAgIDMxICsg MjggKyAzMSArIDMwICsgMzEsCisgICAzMSArIDI4ICsgMzEgKyAzMCArIDMxICsgMzAsCisgICAz MSArIDI4ICsgMzEgKyAzMCArIDMxICsgMzAgKyAzMSwKKyAgIDMxICsgMjggKyAzMSArIDMwICsg MzEgKyAzMCArIDMxICsgMzEsCisgICAzMSArIDI4ICsgMzEgKyAzMCArIDMxICsgMzAgKyAzMSAr IDMxICsgMzAsCisgICAzMSArIDI4ICsgMzEgKyAzMCArIDMxICsgMzAgKyAzMSArIDMxICsgMzAg KyAzMSwKKyAgIDMxICsgMjggKyAzMSArIDMwICsgMzEgKyAzMCArIDMxICsgMzEgKyAzMCArIDMx ICsgMzAsCisgICAzMSArIDI4ICsgMzEgKyAzMCArIDMxICsgMzAgKyAzMSArIDMxICsgMzAgKyAz MSArIDMwICsgMzEgfSwKKyAgezAsCisgICAwLAorICAgMzEsCisgICAzMSArIDI5LAorICAgMzEg KyAyOSArIDMxLAorICAgMzEgKyAyOSArIDMxICsgMzAsCisgICAzMSArIDI5ICsgMzEgKyAzMCAr IDMxLAorICAgMzEgKyAyOSArIDMxICsgMzAgKyAzMSArIDMwLAorICAgMzEgKyAyOSArIDMxICsg MzAgKyAzMSArIDMwICsgMzEsCisgICAzMSArIDI5ICsgMzEgKyAzMCArIDMxICsgMzAgKyAzMSAr IDMxLAorICAgMzEgKyAyOSArIDMxICsgMzAgKyAzMSArIDMwICsgMzEgKyAzMSArIDMwLAorICAg MzEgKyAyOSArIDMxICsgMzAgKyAzMSArIDMwICsgMzEgKyAzMSArIDMwICsgMzEsCisgICAzMSAr IDI5ICsgMzEgKyAzMCArIDMxICsgMzAgKyAzMSArIDMxICsgMzAgKyAzMSArIDMwLAorICAgMzEg KyAyOSArIDMxICsgMzAgKyAzMSArIDMwICsgMzEgKyAzMSArIDMwICsgMzEgKyAzMCArIDMxIH19 OworCiB2b2lkCiBlZmlfdGltZV9pbml0KHZvaWQpCiB7CkBAIC02OCw0NSArMTAzLDQ2IEBAIGVm aV90aW1lX2Zpbmkodm9pZCkKIHsKIH0KIAotc3RhdGljIHRpbWVfdAotZWZpX3RpbWUoRUZJX1RJ TUUgKkVUaW1lKQordm9pZAordG9fZWZpX3RpbWUoRUZJX1RJTUUgKmVmaV90aW1lLCB0aW1lX3Qg dGltZSkKIHsKLSAgICAvKgotICAgIC8vICBUaGVzZSBhcnJheXMgZ2l2ZSB0aGUgY3VtdWxhdGl2 ZSBudW1iZXIgb2YgZGF5cyB1cCB0byB0aGUgZmlyc3Qgb2YgdGhlCi0gICAgLy8gIG1vbnRoIG51 bWJlciB1c2VkIGFzIHRoZSBpbmRleCAoMSAtPiAxMikgZm9yIHJlZ3VsYXIgYW5kIGxlYXAgeWVh cnMuCi0gICAgLy8gIFRoZSB2YWx1ZSBhdCBpbmRleCAxMyBpcyBmb3IgdGhlIHdob2xlIHllYXIu Ci0gICAgKi8KLSAgICBzdGF0aWMgdGltZV90IEN1bXVsYXRpdmVEYXlzWzJdWzE0XSA9IHsKLSAg ICB7MCwKLSAgICAgMCwKLSAgICAgMzEsCi0gICAgIDMxICsgMjgsCi0gICAgIDMxICsgMjggKyAz MSwKLSAgICAgMzEgKyAyOCArIDMxICsgMzAsCi0gICAgIDMxICsgMjggKyAzMSArIDMwICsgMzEs Ci0gICAgIDMxICsgMjggKyAzMSArIDMwICsgMzEgKyAzMCwKLSAgICAgMzEgKyAyOCArIDMxICsg MzAgKyAzMSArIDMwICsgMzEsCi0gICAgIDMxICsgMjggKyAzMSArIDMwICsgMzEgKyAzMCArIDMx ICsgMzEsCi0gICAgIDMxICsgMjggKyAzMSArIDMwICsgMzEgKyAzMCArIDMxICsgMzEgKyAzMCwK LSAgICAgMzEgKyAyOCArIDMxICsgMzAgKyAzMSArIDMwICsgMzEgKyAzMSArIDMwICsgMzEsCi0g ICAgIDMxICsgMjggKyAzMSArIDMwICsgMzEgKyAzMCArIDMxICsgMzEgKyAzMCArIDMxICsgMzAs Ci0gICAgIDMxICsgMjggKyAzMSArIDMwICsgMzEgKyAzMCArIDMxICsgMzEgKyAzMCArIDMxICsg MzAgKyAzMSB9LAotICAgIHswLAotICAgICAwLAotICAgICAzMSwKLSAgICAgMzEgKyAyOSwKLSAg ICAgMzEgKyAyOSArIDMxLAotICAgICAzMSArIDI5ICsgMzEgKyAzMCwKLSAgICAgMzEgKyAyOSAr IDMxICsgMzAgKyAzMSwKLSAgICAgMzEgKyAyOSArIDMxICsgMzAgKyAzMSArIDMwLAotICAgICAz MSArIDI5ICsgMzEgKyAzMCArIDMxICsgMzAgKyAzMSwKLSAgICAgMzEgKyAyOSArIDMxICsgMzAg KyAzMSArIDMwICsgMzEgKyAzMSwKLSAgICAgMzEgKyAyOSArIDMxICsgMzAgKyAzMSArIDMwICsg MzEgKyAzMSArIDMwLAotICAgICAzMSArIDI5ICsgMzEgKyAzMCArIDMxICsgMzAgKyAzMSArIDMx ICsgMzAgKyAzMSwKLSAgICAgMzEgKyAyOSArIDMxICsgMzAgKyAzMSArIDMwICsgMzEgKyAzMSAr IDMwICsgMzEgKyAzMCwKLSAgICAgMzEgKyAyOSArIDMxICsgMzAgKyAzMSArIDMwICsgMzEgKyAz MSArIDMwICsgMzEgKyAzMCArIDMxIH19OwotCi0gICAgdGltZV90ICBVVGltZTsgCisgICAgICAg IGlmICh0aW1lID49IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGVmaV90aW1lLT5ZZWFyID0g MTk3MDsKKyAgICAgICAgICAgICAgICAgICAgdGltZSA+IEN1bXVsYXRpdmVEYXlzW2lzbGVhcChl ZmlfdGltZS0+WWVhcildWzEzXSAqIFNFQ1NQRVJEQVk7CisgICAgICAgICAgICAgICAgICAgIHRp bWUgLT0gQ3VtdWxhdGl2ZURheXNbaXNsZWFwKGVmaV90aW1lLT5ZZWFyKV1bMTNdICogU0VDU1BF UkRBWSwKKyAgICAgICAgICAgICAgICAgICAgZWZpX3RpbWUtPlllYXIrKyk7CisKKyAgICAgICAg ICAgICAgICBmb3IgKGVmaV90aW1lLT5Nb250aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRp bWUgPiBDdW11bGF0aXZlRGF5c1tpc2xlYXAoZWZpX3RpbWUtPlllYXIpXVtlZmlfdGltZS0+TW9u dGhdICoKKyAgICAgICAgICAgICAgICAgICAgICBTRUNTUEVSREFZOworICAgICAgICAgICAgICAg ICAgICBlZmlfdGltZS0+TW9udGgrKyk7CisKKyAgICAgICAgICAgICAgICB0aW1lIC09IEN1bXVs YXRpdmVEYXlzW2lzbGVhcChlZmlfdGltZS0+WWVhcildW2VmaV90aW1lLT5Nb250aCAtIDFdICoK KyAgICAgICAgICAgICAgICAgICAgU0VDU1BFUkRBWTsKKworICAgICAgICAgICAgICAgIGZvciAo ZWZpX3RpbWUtPkRheSA9IDA7IHRpbWUgPiBTRUNTUEVSREFZOworICAgICAgICAgICAgICAgICAg ICB0aW1lIC09IFNFQ1NQRVJEQVksIGVmaV90aW1lLT5EYXkrKyk7CisKKyAgICAgICAgICAgICAg ICBmb3IgKGVmaV90aW1lLT5Ib3VyID0gMDsgdGltZSA+IFNFQ1NQRVJIT1VSOworICAgICAgICAg ICAgICAgICAgICB0aW1lIC09IFNFQ1NQRVJIT1VSLCBlZmlfdGltZS0+SG91cisrKTsKKworICAg ICAgICAgICAgICAgIGZvciAoZWZpX3RpbWUtPk1pbnV0ZSA9IDA7IHRpbWUgPiA2MDsKKyAgICAg ICAgICAgICAgICAgICAgdGltZSAtPSA2MCwgZWZpX3RpbWUtPk1pbnV0ZSsrKTsKKworICAgICAg ICAgICAgICAgIGVmaV90aW1lLT5TZWNvbmQgPSB0aW1lOworICAgICAgICAgICAgICAgIGVmaV90 aW1lLT5OYW5vc2Vjb25kID0gMDsKKyAgICAgICAgICAgICAgICBlZmlfdGltZS0+VGltZVpvbmUg PSAwOworICAgICAgICAgICAgICAgIGVmaV90aW1lLT5EYXlsaWdodCA9IDA7CisgICAgICAgIH0g ZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KGVmaV90aW1lLCAwLCBzaXplb2YoRUZJX1RJ TUUpKTsKKyAgICAgICAgfQorfQorCit0aW1lX3QKK2Zyb21fZWZpX3RpbWUoRUZJX1RJTUUgKkVU aW1lKQoreworCisgICAgdGltZV90ICBVVGltZTsKICAgICBpbnQgICAgIFllYXI7CiAKICAgICAv KgpAQCAtMTM0LDcgKzE3MCw3IEBAIGVmaV90aW1lKEVGSV9USU1FICpFVGltZSkKICAgICAvKgog ICAgIC8vIFVUaW1lIHNob3VsZCBub3cgYmUgc2V0IHRvIDAwOjAwOjAwIG9uIEphbiAxIG9mIHRo ZSBmaWxlJ3MgeWVhci4KICAgICAvLwotICAgIC8vIE1vbnRocyAgCisgICAgLy8gTW9udGhzCiAg ICAgKi8KICAgICBVVGltZSArPSAoQ3VtdWxhdGl2ZURheXNbaXNsZWFwKEVUaW1lLT5ZZWFyKV1b RVRpbWUtPk1vbnRoXSAqIFNFQ1NQRVJEQVkpOwogCkBAIC0xNzAsNyArMjA2LDcgQEAgZWZpX3Rp bWUoRUZJX1RJTUUgKkVUaW1lKQogICAgIAkqLwogICAgIAlVVGltZSArPSAoRVRpbWUtPlRpbWVa b25lICogNjApOwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBVVGltZTsKIH0KIApAQCAtMTk2 LDcgKzIzMiw3IEBAIEVGSV9HZXRUaW1lT2ZEYXkoCiAJLy8gIENvbnZlcnQgdG8gVU5JWCB0aW1l IChpZSBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAogCSovCiAKLQl0cC0+dHZfc2VjICA9IGVmaV90 aW1lKCAmRWZpVGltZSApOworCXRwLT50dl9zZWMgID0gZnJvbV9lZmlfdGltZSggJkVmaVRpbWUg KTsKIAl0cC0+dHZfdXNlYyA9IDA7IC8qIEVmaVRpbWUuTmFub3NlY29uZCAqIDEwMDA7ICovCiAK IAkvKgpAQCAtMjIxLDcgKzI1Nyw3IEBAIHRpbWUodGltZV90ICp0bG9jKQogewogCXN0cnVjdCB0 aW1ldmFsIHR2OwogCUVGSV9HZXRUaW1lT2ZEYXkoJnR2LCAwKTsKLQkKKwogCWlmICh0bG9jKQog CQkqdGxvYyA9IHR2LnR2X3NlYzsKIAlyZXR1cm4gdHYudHZfc2VjOwpkaWZmIC0tZ2l0IHN5cy9i b290L2VmaS9sb2FkZXIvTWFrZWZpbGUgc3lzL2Jvb3QvZWZpL2xvYWRlci9NYWtlZmlsZQppbmRl eCBkOWQzNTMyMDE0Zi4uMzAwYzY1YjEwZDkgMTAwNjQ0Ci0tLSBzeXMvYm9vdC9lZmkvbG9hZGVy L01ha2VmaWxlCisrKyBzeXMvYm9vdC9lZmkvbG9hZGVyL01ha2VmaWxlCkBAIC01MCw2ICs1MCw3 IEBAIENXQVJORkxBR1MubWFpbi5jKz0JLVduby1mb3JtYXQKIENGTEFHUys9CS1JJHsuQ1VSRElS fQogQ0ZMQUdTKz0JLUkkey5DVVJESVJ9L2FyY2gvJHtNQUNISU5FfQogQ0ZMQUdTKz0JLUkkey5D VVJESVJ9Ly4uL2luY2x1ZGUKK0NGTEFHUys9CS1JJHsuQ1VSRElSfS8uLi9kcml2ZXJzCiBDRkxB R1MrPQktSSR7LkNVUkRJUn0vLi4vaW5jbHVkZS8ke01BQ0hJTkV9CiBDRkxBR1MrPQktSSR7LkNV UkRJUn0vLi4vLi4vLi4vY29udHJpYi9kZXYvYWNwaWNhL2luY2x1ZGUKIENGTEFHUys9CS1JJHsu Q1VSRElSfS8uLi8uLi8uLgpAQCAtNjgsNiArNjksOCBAQCBDRkxBR1MrPQktRE5PX1BDSSAtREVG SQogTElCU1RBTkQ9CSR7Lk9CSkRJUn0vLi4vLi4vLi4vLi4vbGliL2xpYnN0YW5kL2xpYnN0YW5k LmEKIC5lbmRpZgogCitMSUJFRklfRFJJVkVSUz0JJHsuT0JKRElSfS8uLi9kcml2ZXJzL2xpYmVm aV9kcml2ZXJzLmEKKwogLmlmICFkZWZpbmVkKEJPT1RfSElERV9TRVJJQUxfTlVNQkVSUykKICMg RXhwb3J0IHNlcmlhbCBudW1iZXJzLCBVVUlELCBhbmQgYXNzZXQgdGFnIGZyb20gbG9hZGVyLgog Q0ZMQUdTKz0gLURTTUJJT1NfU0VSSUFMX05VTUJFUlMKQEAgLTE1MCw5ICsxNTMsMTAgQEAgbG9h ZGVyLmVmaTogJHtQUk9HfQogCiBMSUJFRkk9CQkkey5PQkpESVJ9Ly4uL2xpYmVmaS9saWJlZmku YQogCi1EUEFERD0JCSR7TElCRklDTH0gJHtMSUJFRkl9ICR7TElCRkRUfSAke0xJQkVGSV9GRFR9 ICR7TElCU1RBTkR9IFwKLQkJJHtMRFNDUklQVH0KLUxEQUREPQkJJHtMSUJGSUNMfSAke0xJQkVG SX0gJHtMSUJGRFR9ICR7TElCRUZJX0ZEVH0gJHtMSUJTVEFORH0KK0RQQUREPQkJJHtMSUJGSUNM fSAke0xJQkVGSX0gJHtMSUJFRklfRFJJVkVSU30gJHtMSUJGRFR9ICR7TElCRUZJX0ZEVH0gXAor CQkke0xJQlNUQU5EfSAke0xEU0NSSVBUfQorTERBREQ9CQkke0xJQkZJQ0x9ICR7TElCRUZJfSAk e0xJQkVGSV9EUklWRVJTfSAke0xJQkZEVH0gJHtMSUJFRklfRkRUfSBcCisJCSR7TElCU1RBTkR9 CiAKIC5pbmNsdWRlIDxic2QucHJvZy5taz4KIApkaWZmIC0tZ2l0IHN5cy9ib290L2VmaS9sb2Fk ZXIvY29uZi5jIHN5cy9ib290L2VmaS9sb2FkZXIvY29uZi5jCmluZGV4IDM1OTZhNjM2MGMzLi41 NjczM2ZmYTg5OSAxMDA2NDQKLS0tIHN5cy9ib290L2VmaS9sb2FkZXIvY29uZi5jCisrKyBzeXMv Ym9vdC9lZmkvbG9hZGVyL2NvbmYuYwpAQCAtMzEsMzAgKzMxLDIyIEBAIF9fRkJTRElEKCIkRnJl ZUJTRCQiKTsKICNpbmNsdWRlIDxib290c3RyYXAuaD4KICNpbmNsdWRlIDxlZmkuaD4KICNpbmNs dWRlIDxlZmlsaWIuaD4KLSNpZmRlZiBFRklfWkZTX0JPT1QKLSNpbmNsdWRlIDxsaWJ6ZnMuaD4K LSNlbmRpZgorCisjaW5jbHVkZSAiZWZpX2RyaXZlcnMuaCIKKworY29uc3QgZWZpX2RyaXZlcl90 ICplZmlfZHJpdmVyc1tdID0geworICAgICAgICAmZnNfZHJpdmVyLAorICAgICAgICBOVUxMCit9 OwogCiBzdHJ1Y3QgZGV2c3cgKmRldnN3W10gPSB7Ci0JJmVmaXBhcnRfZGV2LAorICAgICAgICAm ZWZpZnNfZGV2LAogCSZlZmluZXRfZGV2LAotI2lmZGVmIEVGSV9aRlNfQk9PVAotCSZ6ZnNfZGV2 LAotI2VuZGlmCiAJTlVMTAogfTsKIAogc3RydWN0IGZzX29wcyAqZmlsZV9zeXN0ZW1bXSA9IHsK LSNpZmRlZiBFRklfWkZTX0JPT1QKLQkmemZzX2Zzb3BzLAotI2VuZGlmCi0JJmRvc2ZzX2Zzb3Bz LAotCSZ1ZnNfZnNvcHMsCi0JJmNkOTY2MF9mc29wcywKLQkmdGZ0cF9mc29wcywKLQkmbmZzX2Zz b3BzLAotCSZnemlwZnNfZnNvcHMsCi0JJmJ6aXBmc19mc29wcywKKyAgICAgICAgJmVmaWZzX2Zz b3BzLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBzeXMvYm9vdC9lZmkvbG9hZGVyL2xvYWRlcl9l ZmkuaCBzeXMvYm9vdC9lZmkvbG9hZGVyL2xvYWRlcl9lZmkuaAppbmRleCBlZTdjNGJiNzJlYi4u ZGJkMzZiZmI0Y2EgMTAwNjQ0Ci0tLSBzeXMvYm9vdC9lZmkvbG9hZGVyL2xvYWRlcl9lZmkuaAor Kysgc3lzL2Jvb3QvZWZpL2xvYWRlci9sb2FkZXJfZWZpLmgKQEAgLTMzLDYgKzMzLDEwIEBACiAK ICNpbmNsdWRlIDxzdGFuZC5oPgogCisjaW5jbHVkZSAiZWZpX2RyaXZlcnMuaCIKKworZXh0ZXJu IGNvbnN0IGVmaV9kcml2ZXJfdCAqZWZpX2RyaXZlcnNbXTsKKwogaW50CWVmaV9hdXRvbG9hZCh2 b2lkKTsKIAogaW50CWVmaV9nZXRkZXYodm9pZCAqKnZkZXYsIGNvbnN0IGNoYXIgKmRldnNwZWMs IGNvbnN0IGNoYXIgKipwYXRoKTsKZGlmZiAtLWdpdCBzeXMvYm9vdC9lZmkvbG9hZGVyL21haW4u YyBzeXMvYm9vdC9lZmkvbG9hZGVyL21haW4uYwppbmRleCBiOTdmMmFmYjg1MS4uNDJlM2ViZTE4 MzAgMTAwNjQ0Ci0tLSBzeXMvYm9vdC9lZmkvbG9hZGVyL21haW4uYworKysgc3lzL2Jvb3QvZWZp L2xvYWRlci9tYWluLmMKQEAgLTg3LDEwICs4Nyw2IEBAIEVGSV9HVUlEIGRlYnVnaW1nID0gREVC VUdfSU1BR0VfSU5GT19UQUJMRV9HVUlEOwogRUZJX0dVSUQgZmR0ZHRiID0gRkRUX1RBQkxFX0dV SUQ7CiBFRklfR1VJRCBpbnB1dGlkID0gU0lNUExFX1RFWFRfSU5QVVRfUFJPVE9DT0w7CiAKLSNp ZmRlZiBFRklfWkZTX0JPT1QKLXN0YXRpYyB2b2lkIGVmaV96ZnNfcHJvYmUodm9pZCk7Ci0jZW5k aWYKLQogLyoKICAqIGNweTh0bzE2IGNvcGllcyBhIHRyYWRpdGlvbmFsIEMgc3RyaW5nIGludG8g YSBDSEFSMTYgc3RyaW5nIGFuZAogICogMCB0ZXJtaW5hdGVzIGl0LiBsZW4gaXMgdGhlIHNpemUg b2YgKmRzdCBpbiBieXRlcy4KQEAgLTEyNSw3ICsxMjEsNyBAQCBoYXNfa2V5Ym9hcmQodm9pZCkK IAlFRklfSEFORExFICpoaW4sICpoaW5fZW5kLCAqd2Fsa2VyOwogCVVJTlROIHN6OwogCWludCBy ZXR2YWwgPSAwOwotCQorCiAJLyoKIAkgKiBGaW5kIGFsbCB0aGUgaGFuZGxlcyB0aGF0IHN1cHBv cnQgdGhlIFNJTVBMRV9URVhUX0lOUFVUX1BST1RPQ09MIGFuZAogCSAqIGRvIHRoZSB0eXBpY2Fs IGRhbmNlIHRvIGdldCB0aGUgcmlnaHQgc2l6ZWQgYnVmZmVyLgpAQCAtMTgyLDcgKzE3OCw3IEBA IGhhc19rZXlib2FyZCh2b2lkKQogCQkJfSBlbHNlIGlmIChEZXZpY2VQYXRoVHlwZShwYXRoKSA9 PSBNRVNTQUdJTkdfREVWSUNFX1BBVEggJiYKIAkJCSAgICBEZXZpY2VQYXRoU3ViVHlwZShwYXRo KSA9PSBNU0dfVVNCX0NMQVNTX0RQKSB7CiAJCQkJVVNCX0NMQVNTX0RFVklDRV9QQVRIICp1c2I7 Ci0JCQkgICAgICAgCisKIAkJCQl1c2IgPSAoVVNCX0NMQVNTX0RFVklDRV9QQVRIICopKHZvaWQg KilwYXRoOwogCQkJCWlmICh1c2ItPkRldmljZUNsYXNzID09IDMgJiYgLyogSElEICovCiAJCQkJ ICAgIHVzYi0+RGV2aWNlU3ViQ2xhc3MgPT0gMSAmJiAvKiBCb290IGRldmljZXMgKi8KQEAgLTI2 MywxMCArMjU5LDYgQEAgbWFpbihpbnQgYXJnYywgQ0hBUjE2ICphcmd2W10pCiAJYXJjaHN3LmFy Y2hfY29weWluID0gZWZpX2NvcHlpbjsKIAlhcmNoc3cuYXJjaF9jb3B5b3V0ID0gZWZpX2NvcHlv dXQ7CiAJYXJjaHN3LmFyY2hfcmVhZGluID0gZWZpX3JlYWRpbjsKLSNpZmRlZiBFRklfWkZTX0JP T1QKLQkvKiBOb3RlIHRoaXMgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBaRlMgaW5pdC4gKi8KLQlh cmNoc3cuYXJjaF96ZnNfcHJvYmUgPSBlZmlfemZzX3Byb2JlOwotI2VuZGlmCiAKIAkvKiBJbml0 IHRoZSB0aW1lIHNvdXJjZSAqLwogCWVmaV90aW1lX2luaXQoKTsKQEAgLTM5MSw2ICszODMsMTAg QEAgbWFpbihpbnQgYXJnYywgQ0hBUjE2ICphcmd2W10pCiAJLyoKIAkgKiBNYXJjaCB0aHJvdWdo IHRoZSBkZXZpY2Ugc3dpdGNoIHByb2JpbmcgZm9yIHRoaW5ncy4KIAkgKi8KKwlmb3IgKGkgPSAw OyBlZmlfZHJpdmVyc1tpXSAhPSBOVUxMOyBpKyspCisJCWlmIChlZmlfZHJpdmVyc1tpXS0+aW5p dCAhPSBOVUxMKQorCQkJKGVmaV9kcml2ZXJzW2ldLT5pbml0KSgpOworCiAJZm9yIChpID0gMDsg ZGV2c3dbaV0gIT0gTlVMTDsgaSsrKQogCQlpZiAoZGV2c3dbaV0tPmR2X2luaXQgIT0gTlVMTCkK IAkJCShkZXZzd1tpXS0+ZHZfaW5pdCkoKTsKQEAgLTQyNyw2ICs0MjMsNyBAQCBtYWluKGludCBh cmdjLCBDSEFSMTYgKmFyZ3ZbXSkKIAlpZiAoZmluZF9jdXJyZGV2KGltZywgJmRldiwgJnVuaXQs ICZwb29sX2d1aWQpICE9IDApCiAJCXJldHVybiAoRUZJX05PVF9GT1VORCk7CiAKKyAgICAgICAg cHJpbnRmKCJGb3VuZCBlZmkgZGV2aWNlIHVuZGVyICVzXG4iLCBkZXYtPmR2X25hbWUpOwogCXN3 aXRjaCAoZGV2LT5kdl90eXBlKSB7CiAjaWZkZWYgRUZJX1pGU19CT09UCiAJY2FzZSBERVZUX1pG UzogewpAQCAtMTA5MywyMyArMTA5MCwzIEBAIGNvbW1hbmRfZmR0KGludCBhcmdjLCBjaGFyICph cmd2W10pCiAKIENPTU1BTkRfU0VUKGZkdCwgImZkdCIsICJmbGF0dGVuZWQgZGV2aWNlIHRyZWUg aGFuZGxpbmciLCBjb21tYW5kX2ZkdCk7CiAjZW5kaWYKLQotI2lmZGVmIEVGSV9aRlNfQk9PVAot c3RhdGljIHZvaWQKLWVmaV96ZnNfcHJvYmUodm9pZCkKLXsKLQlFRklfSEFORExFIGg7Ci0JdV9p bnQgdW5pdDsKLQlpbnQgaTsKLQljaGFyIGRuYW1lW1NQRUNOQU1FTEVOICsgMV07Ci0JdWludDY0 X3QgZ3VpZDsKLQotCXVuaXQgPSAwOwotCWggPSBlZmlfZmluZF9oYW5kbGUoJmVmaXBhcnRfZGV2 LCAwKTsKLQlmb3IgKGkgPSAwOyBoICE9IE5VTEw7IGggPSBlZmlfZmluZF9oYW5kbGUoJmVmaXBh cnRfZGV2LCArK2kpKSB7Ci0JCXNucHJpbnRmKGRuYW1lLCBzaXplb2YoZG5hbWUpLCAiJXMlZDoi LCBlZmlwYXJ0X2Rldi5kdl9uYW1lLCBpKTsKLQkJaWYgKHpmc19wcm9iZV9kZXYoZG5hbWUsICZn dWlkKSA9PSAwKQotCQkJKHZvaWQpZWZpX2hhbmRsZV91cGRhdGVfZGV2KGgsICZ6ZnNfZGV2LCB1 bml0KyssIGd1aWQpOwotCX0KLX0KLSNlbmRpZgo= --94eb2c058ce8fc2ff60542bb5373-- From owner-freebsd-amd64@freebsd.org Sat Dec 3 06:57:25 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 494FDC64121; Sat, 3 Dec 2016 06:57:25 +0000 (UTC) (envelope-from woodsb02@gmail.com) Received: from mail-io0-x22d.google.com (mail-io0-x22d.google.com [IPv6:2607:f8b0:4001:c06::22d]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 0FFD4BD0; Sat, 3 Dec 2016 06:57:25 +0000 (UTC) (envelope-from woodsb02@gmail.com) Received: by mail-io0-x22d.google.com with SMTP id m5so381506783ioe.3; Fri, 02 Dec 2016 22:57:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=9QzwDbl5calEjqEEMAErKeGN1StJQ2YCBxcA/wkjhIM=; b=Jg+2k/ALQxpqJAAkplNaat7C03yV8zY7nqOo09NTDFXDyRcmEPo4fWqCjt25W4/8Ex n9dlDfsKjCCXZ+FfQf6u3g6DrotPamAGrrzfMAU7O5shsR9pJFyPJo44g5uz5OL32qFv baV3pruYn54b2vxeynIEtke7CBtoq5c+oUUvZ2Reg9AzFZ/Cn+9PJz9CDg2yPsGH/q6o pDgtMNXx3qM/F0Ty3Xs6NOo/EGQ0S2CWoKvENGZzKg5N8WcdllMKM3ZN59cvqS1zI74c 6MI5ioYbt/JShCXrSg/FHiVp4uaWcmaudGjOkN+m2DYMEm2QIxVG3kejlxKXLudCLZ3q ig/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=9QzwDbl5calEjqEEMAErKeGN1StJQ2YCBxcA/wkjhIM=; b=LP+Xpx+BVtfUyGe7G15XD6mC/iZODju5Ad50vbWhM/DH3JzcdvmnwvEhgEAcSHBZZy 5zhK5EsiHIAkhcq6zDza6d+u8VeWomwskfWNiThS0sqn05C8ZWJkuoz1IUKdl7iPIW4M vXOxmnFd0dDgw6LJgbTbHFQ/9JVA8WZBCSaencYqvtt/+PPjYm+ajwcqtSJhknd1pacV fsK/+c+qeWsRNzO+P/rLW54hN387Pdvhwb926DcmEIrecFxJhs6mnMyqMZtEX3OE5uNi e3muLSfOunMcwi7S7rzkFqUqY4sfdlHKm3dBb75lbYp5eoCogfVbpEczWq3JIxAVoQr+ If+g== X-Gm-Message-State: AKaTC02rJIKJu5Jklwkhio/CBko2O3QVnS4lqnSagtfkOAdz7BF63l7NLMuabrS10FZbNoaMyF34pV2zY81i2w== X-Received: by 10.36.58.85 with SMTP id m82mr754844itm.29.1480748244476; Fri, 02 Dec 2016 22:57:24 -0800 (PST) MIME-Version: 1.0 Received: by 10.79.136.197 with HTTP; Fri, 2 Dec 2016 22:57:24 -0800 (PST) In-Reply-To: References: From: Ben Woods Date: Sat, 3 Dec 2016 14:57:24 +0800 Message-ID: Subject: Re: CFT EFI Boot Refactoring To: Eric McCorkle Cc: freebsd-hackers@freebsd.org, freebsd-amd64@freebsd.org, "current@freebsd.org" X-Mailman-Approved-At: Sat, 03 Dec 2016 12:59:30 +0000 Content-Type: text/plain; charset=UTF-8 X-Content-Filtered-By: Mailman/MimeDel 2.1.23 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Dec 2016 06:57:25 -0000 On 3 December 2016 at 14:40, Ben Woods wrote: > I just applied your diff to my subversion repository, and tried to > buildworld, but the build failed with the following error: > > make[6]: make[6]: don't know how to make efipart.c. Stop > > make[6]: stopped in /usr/src/sys/boot/efi/drivers > *** [all_subdir_sys/boot/efi/drivers] Error code 2 > > > Does it build ok for you? > > Because I use subversion, and I wanted to build it from my main tree, I > had to regenerate your patch using "git diff --no-prefix > master..origin/efize_new > /tmp/efize_new.diff". > I could then apply this cleanly with "svn patch /tmp/efize_new.diff". > > Never mind, I have realised that efipart.c was moved from boot/efi/libefi/ to boot/efi/drivers/ in your git patch, but subversion did not interpret this change and simply patched the file in place. I have fixed this with: $ svn mv boot/efi/libefi/efipart.c boot/efi/drivers/efipart.c Sorry for the noise (and the previous top post). Regards, Ben -- From: Benjamin Woods woodsb02@gmail.com From owner-freebsd-amd64@freebsd.org Sat Dec 3 10:10:41 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8B88BC62BB0; Sat, 3 Dec 2016 10:10:41 +0000 (UTC) (envelope-from woodsb02@gmail.com) Received: from mail-io0-x234.google.com (mail-io0-x234.google.com [IPv6:2607:f8b0:4001:c06::234]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 55AF1108D; Sat, 3 Dec 2016 10:10:41 +0000 (UTC) (envelope-from woodsb02@gmail.com) Received: by mail-io0-x234.google.com with SMTP id c21so479273463ioj.1; Sat, 03 Dec 2016 02:10:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=tWbfHRFQVRNY2LVfb8yomegI84LMbuo8S184Y7nGdQs=; b=LSD5HbZIQMZFglefnW6cOrZZQDXp723wfiqgYPHTSbT5BUV2fvJ+mQbyAlGFo/PFY/ +fDvjVBe4nZKpuV9Q4gEPNNSD3m/N2hsxfYAqTv2HYzzgZCO2Xtjm4ecMLMIzg7N8B+t dzQQtdhRecqdyXNGtToqCDx9W4L3uGeYaUsln7icvFrpGU98h6Al4Qo5dwBfadUp8Rsg 0y4oYO1BCgBGrC9P6UP435ppq8aDR4GbCggNz/KS64aIlgxbpTI0NkCFMkKI4ug10hRa Dru1fa7VmU2diviHwwSsFI1Mf5erWUAyK0hvBH0iLo+cu85OLObZmr+ma/Cc7W3knB38 NRhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=tWbfHRFQVRNY2LVfb8yomegI84LMbuo8S184Y7nGdQs=; b=FBqNrEVuBJlXqEByyHhjejliOVfFsqdnGCkPuYPCMTr52lBZPWhLZIdP+eiCbg17OT zlnRq86a9mK+x38t/EafQGKF70rMA+tkH5vTBuY4ZXQztt4gJ8zwQ5zh4T02GGbCROAs Rjzr/oWx/TGyQUXGQli/vX3vPB7QDFfIrosjWGfUoFYMykqf4wEF+eX9wnurnln2zo9c i8hLAjwJqIlpHmNeaN3GelbFFhCJYHGjnMLQ+z907Z0dawEZgaQFYUIDhhREy8U72KRc v0tYix85cCi2awhtLnoavNFImCn6839cPACDRFqRuCX+re4JsucQB8VWQXAMOLw2odDR +t1Q== X-Gm-Message-State: AKaTC02YA/ivyXeyXK2l6/aFPiHV2oT0z0g55H3CFqWRB5gP0fqiIoq1+I4SUkSdRMX6vhq3EBPHoehqJo8olg== X-Received: by 10.36.43.193 with SMTP id h184mr1154910ita.29.1480759840445; Sat, 03 Dec 2016 02:10:40 -0800 (PST) MIME-Version: 1.0 Received: by 10.79.136.197 with HTTP; Sat, 3 Dec 2016 02:10:39 -0800 (PST) In-Reply-To: References: From: Ben Woods Date: Sat, 3 Dec 2016 18:10:39 +0800 Message-ID: Subject: Re: CFT EFI Boot Refactoring To: Eric McCorkle Cc: freebsd-hackers@freebsd.org, freebsd-amd64@freebsd.org, "current@freebsd.org" X-Mailman-Approved-At: Sat, 03 Dec 2016 12:59:46 +0000 Content-Type: text/plain; charset=UTF-8 X-Content-Filtered-By: Mailman/MimeDel 2.1.23 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Dec 2016 10:10:41 -0000 On 3 December 2016 at 01:02, Eric McCorkle wrote: > Therefore, I would like to issue a CFT for this changeset. We need > people using the boot1/loader EFI boot setup to test their setup using > boot1 and loader as built with this patch applied. > After I got this to build, I managed to install the new world, and copy the new boot1.efi to /EFI/BOOT/BOOTX64.EFI. Upon reboot, my machine hung at the loader, with the following text on the screen: >> FreeBSD EFI boot block Loader path: /boot/loader.efi Initializing modules: FS Backend| Unfortunately it stopped there and didn't continue. I was able to recover my system by moving my BOOTX64.BAK to BOOTX64.EFI, and changing back to my old loader.efi. Any thoughts of how we can debug this? Regards, Ben -- From: Benjamin Woods woodsb02@gmail.com From owner-freebsd-amd64@freebsd.org Sat Dec 3 13:12:59 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 20811C641BE for ; Sat, 3 Dec 2016 13:12:59 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from kenobi.freebsd.org (kenobi.freebsd.org [IPv6:2001:1900:2254:206a::16:76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0FFDB14C0 for ; Sat, 3 Dec 2016 13:12:59 +0000 (UTC) (envelope-from bugzilla-noreply@freebsd.org) Received: from bugs.freebsd.org ([127.0.1.118]) by kenobi.freebsd.org (8.15.2/8.15.2) with ESMTP id uB3DCwba044289 for ; Sat, 3 Dec 2016 13:12:58 GMT (envelope-from bugzilla-noreply@freebsd.org) From: bugzilla-noreply@freebsd.org To: freebsd-amd64@FreeBSD.org Subject: [Bug 215025] Panic in arptimer Date: Sat, 03 Dec 2016 13:12:58 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: new X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: Base System X-Bugzilla-Component: wireless X-Bugzilla-Version: 11.0-STABLE X-Bugzilla-Keywords: X-Bugzilla-Severity: Affects Only Me X-Bugzilla-Who: boris.astardzhiev@gmail.com X-Bugzilla-Status: New X-Bugzilla-Resolution: X-Bugzilla-Priority: --- X-Bugzilla-Assigned-To: freebsd-wireless@FreeBSD.org X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: bug_id short_desc product version rep_platform op_sys bug_status bug_severity priority component assigned_to reporter cc Message-ID: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: https://bugs.freebsd.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Dec 2016 13:12:59 -0000 https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D215025 Bug ID: 215025 Summary: Panic in arptimer Product: Base System Version: 11.0-STABLE Hardware: amd64 OS: Any Status: New Severity: Affects Only Me Priority: --- Component: wireless Assignee: freebsd-wireless@FreeBSD.org Reporter: boris.astardzhiev@gmail.com CC: freebsd-amd64@FreeBSD.org CC: freebsd-amd64@FreeBSD.org Hello, Ever since after upgrading to releng/11 I've been experiencing issues with = my ThinkPad R500's Intel wireless card which in fact used to work flawlessly in 10.x. Basically I'm unable to associate or rather it happens to associate pretty slowly - 10+ minutes. Here's the card as reported by pciconf: iwn0@pci0:3:0:0: class=3D0x028000 card=3D0x12118086 chip=3D0x4237808= 6 rev=3D0x00 hdr=3D0x00 vendor =3D 'Intel Corporation' device =3D 'PRO/Wireless 5100 AGN [Shiloh] Network Connection' class =3D network After upgrading to stable/11 due to unrelated reasons - commit 763ff62bcd42458bcc338e1ee34bd76e46f1a393 I experienced the following panic which I think is related to my wireless card: GNU gdb 6.1.1 [FreeBSD] Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain condition= s. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "amd64-marcel-freebsd"... Unread portion of the kernel message buffer: Fatal trap 9: general protection fault while in kernel mode cpuid =3D 0; apic id =3D 00 instruction pointer =3D 0x20:0xffffffff80c4d014 stack pointer =3D 0x28:0xfffffe01165ed9b0 frame pointer =3D 0x28:0xfffffe01165eda20 code segment =3D base 0x0, limit 0xfffff, type 0x1b =3D DPL 0, pres 1, long 1, def32 0, gran 1 processor eflags =3D interrupt enabled, resume, IOPL =3D 0 current process =3D 12 (swi4: clock (0)) trap number =3D 9 panic: general protection fault cpuid =3D 0 KDB: stack backtrace: #0 0xffffffff80b26b57 at kdb_backtrace+0x67 #1 0xffffffff80adbaa2 at vpanic+0x182 #2 0xffffffff80adb913 at panic+0x43 #3 0xffffffff80fa6f71 at trap_fatal+0x331 #4 0xffffffff80fa6c11 at trap+0x721 #5 0xffffffff80f896c1 at calltrap+0x8 #6 0xffffffff80af5b4a at softclock_call_cc+0x18a #7 0xffffffff80af60c4 at softclock+0x94 #8 0xffffffff80a95a4f at intr_event_execute_handlers+0x20f #9 0xffffffff80a95cb6 at ithread_loop+0xc6 #10 0xffffffff80a92695 at fork_exit+0x85 #11 0xffffffff80f89bfe at fork_trampoline+0xe Uptime: 3m38s Dumping 343 out of 3993 MB:..5%..14%..24%..33%..42%..52%..61%..75%..84%..94% Reading symbols from /boot/kernel/linux.ko...Reading symbols from /usr/lib/debug//boot/kernel/linux.ko.debug...done. done. Loaded symbols for /boot/kernel/linux.ko Reading symbols from /boot/kernel/linux_common.ko...Reading symbols from /usr/lib/debug//boot/kernel/linux_common.ko.debug...done. done. Loaded symbols for /boot/kernel/linux_common.ko Reading symbols from /boot/kernel/fuse.ko...Reading symbols from /usr/lib/debug//boot/kernel/fuse.ko.debug...done. done. Loaded symbols for /boot/kernel/fuse.ko Reading symbols from /boot/kernel/linprocfs.ko...Reading symbols from /usr/lib/debug//boot/kernel/linprocfs.ko.debug...done. done. Loaded symbols for /boot/kernel/linprocfs.ko Reading symbols from /boot/kernel/ums.ko...Reading symbols from /usr/lib/debug//boot/kernel/ums.ko.debug...done. done. Loaded symbols for /boot/kernel/ums.ko Reading symbols from /boot/kernel/linux64.ko...Reading symbols from /usr/lib/debug//boot/kernel/linux64.ko.debug...done. done. Loaded symbols for /boot/kernel/linux64.ko Reading symbols from /boot/kernel/radeonkms.ko...Reading symbols from /usr/lib/debug//boot/kernel/radeonkms.ko.debug...done. done. Loaded symbols for /boot/kernel/radeonkms.ko Reading symbols from /boot/kernel/drm2.ko...Reading symbols from /usr/lib/debug//boot/kernel/drm2.ko.debug...done. done. Loaded symbols for /boot/kernel/drm2.ko Reading symbols from /boot/kernel/iicbus.ko...Reading symbols from /usr/lib/debug//boot/kernel/iicbus.ko.debug...done. done. Loaded symbols for /boot/kernel/iicbus.ko Reading symbols from /boot/kernel/iic.ko...Reading symbols from /usr/lib/debug//boot/kernel/iic.ko.debug...done. done. Loaded symbols for /boot/kernel/iic.ko Reading symbols from /boot/kernel/iicbb.ko...Reading symbols from /usr/lib/debug//boot/kernel/iicbb.ko.debug...done. done. Loaded symbols for /boot/kernel/iicbb.ko Reading symbols from /boot/kernel/radeonkmsfw_RV620_pfp.ko...Reading symbols from /usr/lib/debug//boot/kernel/radeonkmsfw_RV620_pfp.ko.debug...done. done. Loaded symbols for /boot/kernel/radeonkmsfw_RV620_pfp.ko Reading symbols from /boot/kernel/radeonkmsfw_RV620_me.ko...Reading symbols from /usr/lib/debug//boot/kernel/radeonkmsfw_RV620_me.ko.debug...done. done. Loaded symbols for /boot/kernel/radeonkmsfw_RV620_me.ko Reading symbols from /boot/kernel/radeonkmsfw_R600_rlc.ko...Reading symbols from /usr/lib/debug//boot/kernel/radeonkmsfw_R600_rlc.ko.debug...done. done. Loaded symbols for /boot/kernel/radeonkmsfw_R600_rlc.ko #0 doadump (textdump=3D) at pcpu.h:222 222 __asm("movq %%gs:%1,%0" : "=3Dr" (td) (kgdb) bt #0 doadump (textdump=3D) at pcpu.h:222 #1 0xffffffff80adb529 in kern_reboot (howto=3D260) at /usr/src/sys/kern/kern_shutdown.c:366 #2 0xffffffff80adbadb in vpanic (fmt=3D, ap=3D) at /usr/src/sys/kern/kern_shutdown.c:759 #3 0xffffffff80adb913 in panic (fmt=3D0x0) at /usr/src/sys/kern/kern_shutdown.c:690 #4 0xffffffff80fa6f71 in trap_fatal (frame=3D0xfffffe01165ed8f0, eva=3D0) = at /usr/src/sys/amd64/amd64/trap.c:801 #5 0xffffffff80fa6c11 in trap (frame=3D0xfffffe01165ed8f0) at /usr/src/sys/amd64/amd64/trap.c:198 #6 0xffffffff80f896c1 in calltrap () at /usr/src/sys/amd64/amd64/exception.S:236 #7 0xffffffff80c4d014 in arptimer (arg=3D) at /usr/src/sys/netinet/if_ether.c:287 #8 0xffffffff80af5b4a in softclock_call_cc (c=3D, cc= =3D, direct=3D) at /usr/src/sys/kern/kern_timeout.c:729 #9 0xffffffff80af60c4 in softclock (arg=3D) at /usr/src/sys/kern/kern_timeout.c:867 #10 0xffffffff80a95a4f in intr_event_execute_handlers (p=3D, ie=3D) at /usr/src/sys/kern/kern_intr.c:1262 #11 0xffffffff80a95cb6 in ithread_loop (arg=3D) at /usr/src/sys/kern/kern_intr.c:1275 #12 0xffffffff80a92695 in fork_exit (callout=3D0xffffffff80a95bf0 , arg=3D0xfffff80003948b80, frame=3D0xfffffe01165edc00) at /usr/src/sys/kern/kern_fork.c:1040 #13 0xffffffff80f89bfe in fork_trampoline () at /usr/src/sys/amd64/amd64/exception.S:611 #14 0x0000000000000000 in ?? () Current language: auto; currently minimal (kgdb) frame 7 #7 0xffffffff80c4d014 in arptimer (arg=3D) at /usr/src/sys/netinet/if_ether.c:287 287 IF_AFDATA_LOCK(ifp); (kgdb) print ifp $1 =3D (struct ifnet *) 0x7fffffffffffffff kldstat: 1 54 0xffffffff80200000 1fbbf10 kernel 2 1 0xffffffff821bd000 9b220 linux.ko 3 4 0xffffffff82259000 dc90 linux_common.ko 4 1 0xffffffff82267000 1a5a0 fuse.ko 5 1 0xffffffff82421000 aa40 linprocfs.ko 6 1 0xffffffff8242c000 3799 ums.ko 7 1 0xffffffff82430000 384db linux64.ko 8 1 0xffffffff82469000 e85ec radeonkms.ko 9 1 0xffffffff82552000 495af drm2.ko 10 4 0xffffffff8259c000 265a iicbus.ko 11 1 0xffffffff8259f000 1c78 iic.ko 12 1 0xffffffff825a1000 1e25 iicbb.ko 13 1 0xffffffff825a3000 103b radeonkmsfw_RV620_pfp.ko 14 1 0xffffffff825a5000 5b3b radeonkmsfw_RV620_me.ko 15 1 0xffffffff825ab000 1337 radeonkmsfw_R600_rlc.ko And some dmesg on boot: Dec 3 14:29:42 boris-fbsd kernel: wlan0: Ethernet address: 00:21:6b:59:b0:= fa Dec 3 14:29:42 boris-fbsd kernel: bge0: link state changed to DOWN Dec 3 14:29:42 boris-fbsd kernel: iwn0: iwn_read_firmware: ucode rev=3D0x08530501 Dec 3 14:29:42 boris-fbsd kernel: wlan0: link state changed to UP Dec 3 14:29:42 boris-fbsd kernel: wlan0: link state changed to DOWN Dec 3 14:29:42 boris-fbsd kernel: iwn0: device timeout Dec 3 14:29:42 boris-fbsd kernel: iwn0: iwn_read_firmware: ucode rev=3D0x08530501 Dec 3 14:29:42 boris-fbsd kernel: wlan0: link state changed to UP Dec 3 14:29:42 boris-fbsd kernel: wlan0: link state changed to DOWN Dec 3 14:29:42 boris-fbsd kernel: iwn0: scan timeout Dec 3 14:29:42 boris-fbsd kernel: iwn0: iwn_read_firmware: ucode rev=3D0x08530501 Dec 3 14:29:42 boris-fbsd kernel: wlan0: link state changed to UP Dec 3 14:29:42 boris-fbsd kernel: iwn0: iwn_intr: fatal firmware error Dec 3 14:29:42 boris-fbsd kernel: firmware error log: Dec 3 14:29:42 boris-fbsd kernel: error type =3D "BAD_COMMAND" (0x000= 00007) Dec 3 14:29:42 boris-fbsd kernel: program counter =3D 0x0000275C Dec 3 14:29:42 boris-fbsd kernel: source line =3D 0x00000428 Dec 3 14:29:42 boris-fbsd kernel: error data =3D 0x0000000000000000 Dec 3 14:29:42 boris-fbsd kernel: branch link =3D 0x0000275A0000275A Dec 3 14:29:42 boris-fbsd kernel: interrupt link =3D 0x0000091600000000 Dec 3 14:29:42 boris-fbsd kernel: time =3D 15468 Dec 3 14:29:42 boris-fbsd kernel: driver status: Dec 3 14:29:42 boris-fbsd kernel: tx ring 0: qid=3D0 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 1: qid=3D1 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 2: qid=3D2 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 3: qid=3D3 cur=3D2 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 4: qid=3D4 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 5: qid=3D5 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 6: qid=3D6 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 7: qid=3D7 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 8: qid=3D8 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 9: qid=3D9 cur=3D64 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 10: qid=3D10 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 11: qid=3D11 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 12: qid=3D12 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 13: qid=3D13 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 14: qid=3D14 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 15: qid=3D15 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 16: qid=3D16 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 17: qid=3D17 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 18: qid=3D18 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: tx ring 19: qid=3D19 cur=3D0 queued=3D= 0=20=20 Dec 3 14:29:42 boris-fbsd kernel: rx ring: cur=3D5 Dec 3 14:29:42 boris-fbsd kernel: iwn0: iwn_panicked: controller panicked, iv_state =3D 5; restarting Dec 3 14:29:42 boris-fbsd kernel: wlan0: link state changed to DOWN Dec 3 14:29:42 boris-fbsd kernel: iwn0: iwn_read_firmware: ucode rev=3D0x08530501 Dec 3 14:29:42 boris-fbsd kernel: wlan0: link state changed to UP Dec 3 14:29:42 boris-fbsd kernel: wlan0: link state changed to DOWN I triggered the panic by issuing several times /etc/rc.d/netif restart Regards, Boris --=20 You are receiving this mail because: You are on the CC list for the bug.= From owner-freebsd-amd64@freebsd.org Sat Dec 3 21:11:02 2016 Return-Path: Delivered-To: freebsd-amd64@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 07379C6562D for ; Sat, 3 Dec 2016 21:11:02 +0000 (UTC) (envelope-from oliver.pinter@hardenedbsd.org) Received: from mail-wm0-x22c.google.com (mail-wm0-x22c.google.com [IPv6:2a00:1450:400c:c09::22c]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 2DDC02AE for ; Sat, 3 Dec 2016 21:11:01 +0000 (UTC) (envelope-from oliver.pinter@hardenedbsd.org) Received: by mail-wm0-x22c.google.com with SMTP id t79so44047595wmt.0 for ; Sat, 03 Dec 2016 13:11:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hardenedbsd-org.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=AaOTFQckYAOmD5bk7bwQKwZHjCUrzbzGYwID/wajYVM=; b=jcZodRi4d95q72y7R5Y5x9LFXrbvGO7iXwPfKtD3P8urj1ob4EzwwU6ll1Qx/8fnV4 WN81NXSNLQkiC3AJ/ATN44qZ8EJZrc6/9RnKl58i4Bqiu+JeDZ+7viO2Mnh5IoqTNbHK XOA33G5tHmclWFZLjD6KxKSFpX3i8YfK2xYTqvjoWudAjwyPjY1G+LD9C/1lp4qHx6D3 aFHEYjGObTCp4Bkm6g4Duvo/CB9wElkUiaRznTZHEHVWL3gxaG2G8N99SJ2uAJkGYcb6 AKmOHClb2ypgKZG1UBioZT3xjr6/WrYku8SZawiIgWU8AL+MhcVWAWmGyYXcy8YgXxd/ eRQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=AaOTFQckYAOmD5bk7bwQKwZHjCUrzbzGYwID/wajYVM=; b=Un7mDqhQQURQzR2xvDratamVuUacJoqPsDMEcUMQi2wBrYYFSpZpXBbKM3SalfrQNP SGSKbgODeW0kxMIx7K0uX4NAsT2AL8gMgKfN7k2rCS0jfme7eNMFN+tNY7Xj0SO8AepB MHOLY3LhW1THkXqaausrhOR4MD9kaRBuD/oYyVvUcF/KGzk3WhGuPU9dl9u1kKfOmEBe mVE29gx2EAF7aGoduepd2QOHcR2p3mavijNW4Ezxkk3X8m1e28PtT4V5NFpT+efI7apT ozwHrK9HfXLV6SbsmEQCYke96csbOqDiZWVvMqhj+vGmoxyhZp0DgDWhSIKnvTPU0SOU lxeA== X-Gm-Message-State: AKaTC03GCCd+vLb/e0Oselzzz6AQidlZT+4c7ZM14A2pG6LhlJPL6Rwmf/3GZXbjPP87/RbtOHhBiqG3s0/UkTTK X-Received: by 10.28.18.129 with SMTP id 123mr2945459wms.2.1480799459427; Sat, 03 Dec 2016 13:10:59 -0800 (PST) MIME-Version: 1.0 Received: by 10.194.253.65 with HTTP; Sat, 3 Dec 2016 13:10:58 -0800 (PST) In-Reply-To: References: <201612020821.uB28L8s2000195@repo.freebsd.org> From: Oliver Pinter Date: Sat, 3 Dec 2016 22:10:58 +0100 Message-ID: Subject: Re: svn commit: r309400 - head/sys/dev/acpica To: Hans Petter Selasky , jkim@freebsd.org Cc: freebsd-acpi@freebsd.org, freebsd-amd64@freebsd.org Content-Type: multipart/mixed; boundary=001a11469e40c3f56d0542c77dcf X-BeenThere: freebsd-amd64@freebsd.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Porting FreeBSD to the AMD64 platform List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Dec 2016 21:11:02 -0000 --001a11469e40c3f56d0542c77dcf Content-Type: text/plain; charset=UTF-8 On Sat, Dec 3, 2016 at 9:58 PM, Oliver Pinter wrote: > On 12/3/16, Oliver Pinter wrote: >> On 12/3/16, Oliver Pinter wrote: >>> On Fri, Dec 2, 2016 at 9:21 AM, Hans Petter Selasky >>> wrote: >>>> Author: hselasky >>>> Date: Fri Dec 2 08:21:08 2016 >>>> New Revision: 309400 >>>> URL: https://svnweb.freebsd.org/changeset/base/309400 >>>> >>>> Log: >>>> Fix for endless recursion in the ACPI GPE handler during boot. >>>> >>>> When handling a GPE ACPI interrupt object the EcSpaceHandler() >>>> function can be called which checks the EC_EVENT_SCI bit and then >>>> recurse on the EcGpeQueryHandler() function. If there are multiple GPE >>>> events pending the EC_EVENT_SCI bit will be set at the next call to >>>> EcSpaceHandler() causing it to recurse again via the >>>> EcGpeQueryHandler() function. This leads to a slow never ending >>>> recursion during boot which prevents proper system startup, because >>>> the EC_EVENT_SCI bit never gets cleared in this scenario. >>>> >>>> The behaviour is reproducible with the ALASKA AMI in combination with >>>> a newer Skylake based mainboard in the following way: >>>> >>>> Enter BIOS and adjust the clock one hour forward. Save and exit the >>>> BIOS. System fails to boot due to the above mentioned bug in >>>> EcGpeQueryHandler() which was observed recursing multiple times. >>>> >>>> This patch adds a simple recursion guard to the EcGpeQueryHandler() >>>> function and also also adds logic to detect if new GPE events occurred >>>> during the execution of EcGpeQueryHandler() and then loop on this >>>> function instead of recursing. >>>> >>>> Reviewed by: jhb >>>> MFC after: 2 weeks >>>> >>>> Modified: >>>> head/sys/dev/acpica/acpi_ec.c >>> >>> >>> I have similar error since the latest BIOS update on my gigabyte >>> H170N-Wifi board. The curiosity of the BIOS update was after upgrading >>> to this version, there are no possibility to rollback to older >>> version. >>> >>> The other weird thing, is that MFCing back this patch does not help. I >>> get stucked lock in acmtx mutex, as you >>> could see from the attached log. The other interesting is the ACPI >>> error at boot time: >>> >>> [1] ACPI Error: Mutex [0x0] is not acquired, cannot release >>> (20160527/utmutex-386) >>> [1] ACPI Error: Could not release AML Interpreter mutex >>> (20160527/exutils-147) >>> [1] ACPI Error: Mutex [0x0] is not acquired, cannot release >>> (20160527/utmutex-386) >>> [1] ACPI Error: Could not release AML Interpreter mutex >>> (20160527/exutils-147) >>> [1] cpu1: on acpi0 >>> [1] ACPI Error: Mutex [0x0] is not acquired, cannot release >>> (20160527/utmutex-386) >>> [1] ACPI Error: Could not release AML Interpreter mutex >>> (20160527/exutils-147) >>> [1] ACPI Error: Mutex [0x0] is not acquired, cannot release >>> (20160527/utmutex-386) >>> [1] ACPI Error: Could not release AML Interpreter mutex >>> (20160527/exutils-147) >>> >>> (This error is on 10-STABLE.) >>> >> >> After backported the last to ACPICA update to 10-STABLE with this >> patch, the issue reducated to this warning message: > > Attached the two backport. > >> >> [1] acpi0: Power Button (fixed) >> [1] ACPI Error: Method parse/execution failed [\134_SB.PCI0.IOTR._CRS] >> (Node 0xfffff80006592f00), AE_AML_NO_RESOURCE_END_TAG >> (20161117/psparse-560) >> [1] ACPI Error: Method execution failed [\134_SB.PCI0.IOTR._CRS] (Node >> 0xfffff80006592f00), AE_AML_NO_RESOURCE_END_TAG (20161117/uteval-111) >> [1] can't fetch resources for \134_SB_.PCI0.IOTR - >> AE_AML_NO_RESOURCE_END_TAG >> >> but the lockup has gone. ;) >> CC: ACPI and AMD64 >> >> [trim] >> --001a11469e40c3f56d0542c77dcf Content-Type: application/octet-stream; name="0001-HBSD-MFC-pull-in-ACPICA-20160930-from-FreeBSD-12-CUR.patch.xz" Content-Disposition: attachment; filename="0001-HBSD-MFC-pull-in-ACPICA-20160930-from-FreeBSD-12-CUR.patch.xz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iw9premr2 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 --001a11469e40c3f56d0542c77dcf Content-Type: application/octet-stream; name="0002-HBSD-MFC-Merge-ACPICA-20161117.patch.xz" Content-Disposition: attachment; filename="0002-HBSD-MFC-Merge-ACPICA-20161117.patch.xz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_iw9preqq3 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 --001a11469e40c3f56d0542c77dcf--